@qpqjs/cli 0.3.0 → 0.4.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.
- package/lib/commonjs/cli/commandMenu.js +5 -4
- package/lib/commonjs/cli/commandMenu.js.map +1 -1
- package/lib/commonjs/cli/runCli.js +15 -7
- package/lib/commonjs/cli/runCli.js.map +1 -1
- package/lib/commonjs/commands/checkCircular.js +15 -7
- package/lib/commonjs/commands/checkCircular.js.map +1 -1
- package/lib/commonjs/commands/clearResources.js +8 -14
- package/lib/commonjs/commands/clearResources.js.map +1 -1
- package/lib/commonjs/commands/go.js +3 -7
- package/lib/commonjs/commands/go.js.map +1 -1
- package/lib/commonjs/commands/goDev.js +4 -2
- package/lib/commonjs/commands/goDev.js.map +1 -1
- package/lib/commonjs/commands/goDevApi.js +23 -20
- package/lib/commonjs/commands/goDevApi.js.map +1 -1
- package/lib/commonjs/commands/goDevWeb.js +13 -8
- package/lib/commonjs/commands/goDevWeb.js.map +1 -1
- package/lib/commonjs/commands/goDocker.js +10 -13
- package/lib/commonjs/commands/goDocker.js.map +1 -1
- package/lib/commonjs/commands/hooks.js +4 -2
- package/lib/commonjs/commands/hooks.js.map +1 -1
- package/lib/commonjs/commands/migrate.js +11 -9
- package/lib/commonjs/commands/migrate.js.map +1 -1
- package/lib/commonjs/commands/prep.js +4 -2
- package/lib/commonjs/commands/prep.js.map +1 -1
- package/lib/commonjs/commands/publish.js +4 -7
- package/lib/commonjs/commands/publish.js.map +1 -1
- package/lib/commonjs/commands/scriptBuild.js +7 -5
- package/lib/commonjs/commands/scriptBuild.js.map +1 -1
- package/lib/commonjs/commands/scriptBuilderLayer.js +6 -4
- package/lib/commonjs/commands/scriptBuilderLayer.js.map +1 -1
- package/lib/commonjs/commands/scriptNew.js +7 -5
- package/lib/commonjs/commands/scriptNew.js.map +1 -1
- package/lib/commonjs/commands/setup.js +14 -22
- package/lib/commonjs/commands/setup.js.map +1 -1
- package/lib/commonjs/commands/synth.js +16 -20
- package/lib/commonjs/commands/synth.js.map +1 -1
- package/lib/commonjs/commands/teardown.js +8 -14
- package/lib/commonjs/commands/teardown.js.map +1 -1
- package/lib/commonjs/lib/CliError.d.ts +4 -0
- package/lib/commonjs/lib/CliError.js +14 -0
- package/lib/commonjs/lib/CliError.js.map +1 -0
- package/lib/commonjs/lib/circularImports.d.ts +0 -1
- package/lib/commonjs/lib/circularImports.js +5 -6
- package/lib/commonjs/lib/circularImports.js.map +1 -1
- package/lib/commonjs/lib/clearResourcesPlan.d.ts +0 -1
- package/lib/commonjs/lib/clearResourcesPlan.js +12 -13
- package/lib/commonjs/lib/clearResourcesPlan.js.map +1 -1
- package/lib/commonjs/lib/deployPrompts.d.ts +2 -1
- package/lib/commonjs/lib/deployPrompts.js +16 -16
- package/lib/commonjs/lib/deployPrompts.js.map +1 -1
- package/lib/commonjs/lib/devServerEntry.js +5 -4
- package/lib/commonjs/lib/devServerEntry.js.map +1 -1
- package/lib/commonjs/lib/devServerPorts.js +2 -4
- package/lib/commonjs/lib/devServerPorts.js.map +1 -1
- package/lib/commonjs/lib/discovery.d.ts +0 -2
- package/lib/commonjs/lib/discovery.js +11 -44
- package/lib/commonjs/lib/discovery.js.map +1 -1
- package/lib/commonjs/lib/hooks.js +5 -3
- package/lib/commonjs/lib/hooks.js.map +1 -1
- package/lib/commonjs/lib/killChildWithEscalation.js +3 -1
- package/lib/commonjs/lib/killChildWithEscalation.js.map +1 -1
- package/lib/commonjs/lib/killStaleListeners.js +24 -37
- package/lib/commonjs/lib/killStaleListeners.js.map +1 -1
- package/lib/commonjs/lib/out.d.ts +11 -0
- package/lib/commonjs/lib/out.js +30 -0
- package/lib/commonjs/lib/out.js.map +1 -0
- package/lib/commonjs/lib/prompts.d.ts +1 -0
- package/lib/commonjs/lib/prompts.js +15 -2
- package/lib/commonjs/lib/prompts.js.map +1 -1
- package/lib/commonjs/lib/qpqConfigs.js +4 -4
- package/lib/commonjs/lib/qpqConfigs.js.map +1 -1
- package/lib/commonjs/lib/requireDriverCapability.d.ts +7 -0
- package/lib/commonjs/lib/requireDriverCapability.js +17 -0
- package/lib/commonjs/lib/requireDriverCapability.js.map +1 -0
- package/lib/commonjs/lib/resolveAppSelection.d.ts +1 -0
- package/lib/commonjs/lib/resolveAppSelection.js +19 -12
- package/lib/commonjs/lib/resolveAppSelection.js.map +1 -1
- package/lib/commonjs/lib/resolveCommandContext.d.ts +12 -0
- package/lib/commonjs/lib/resolveCommandContext.js +26 -0
- package/lib/commonjs/lib/resolveCommandContext.js.map +1 -0
- package/lib/commonjs/lib/resolveDeployment.d.ts +0 -1
- package/lib/commonjs/lib/resolveDeployment.js +15 -10
- package/lib/commonjs/lib/resolveDeployment.js.map +1 -1
- package/lib/commonjs/lib/runCommand.d.ts +20 -0
- package/lib/commonjs/lib/runCommand.js +64 -34
- package/lib/commonjs/lib/runCommand.js.map +1 -1
- package/lib/commonjs/lib/runTasks.js +8 -4
- package/lib/commonjs/lib/runTasks.js.map +1 -1
- package/lib/commonjs/lib/timing.js +5 -3
- package/lib/commonjs/lib/timing.js.map +1 -1
- package/lib/commonjs/lib/typeWatcher.d.ts +2 -1
- package/lib/commonjs/lib/typeWatcher.js +6 -13
- package/lib/commonjs/lib/typeWatcher.js.map +1 -1
- package/lib/commonjs/lib/userScriptBuilderLayer.d.ts +0 -2
- package/lib/commonjs/lib/userScriptBuilderLayer.js +7 -8
- package/lib/commonjs/lib/userScriptBuilderLayer.js.map +1 -1
- package/lib/commonjs/lib/views.js +3 -2
- package/lib/commonjs/lib/views.js.map +1 -1
- package/lib/commonjs/lib/webAddressingEnv.d.ts +0 -2
- package/lib/commonjs/lib/webAddressingEnv.js +4 -4
- package/lib/commonjs/lib/webAddressingEnv.js.map +1 -1
- package/lib/commonjs/platforms/aws/awsCredentials.js +3 -1
- package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -1
- package/lib/commonjs/platforms/aws/cdkApp.js +1 -1
- package/lib/commonjs/platforms/aws/cdkApp.js.map +1 -1
- package/lib/commonjs/platforms/aws/clearResources.js +16 -26
- package/lib/commonjs/platforms/aws/clearResources.js.map +1 -1
- package/lib/commonjs/platforms/aws/getDeployEnv.d.ts +1 -0
- package/lib/commonjs/platforms/aws/getDeployEnv.js +12 -0
- package/lib/commonjs/platforms/aws/getDeployEnv.js.map +1 -0
- package/lib/commonjs/platforms/aws/go.js +17 -15
- package/lib/commonjs/platforms/aws/go.js.map +1 -1
- package/lib/commonjs/platforms/aws/goDocker.js +29 -26
- package/lib/commonjs/platforms/aws/goDocker.js.map +1 -1
- package/lib/commonjs/platforms/aws/goDockerManifest.js +6 -1
- package/lib/commonjs/platforms/aws/goDockerManifest.js.map +1 -1
- package/lib/commonjs/platforms/aws/publish.js +13 -11
- package/lib/commonjs/platforms/aws/publish.js.map +1 -1
- package/lib/commonjs/platforms/aws/remote.js +8 -7
- package/lib/commonjs/platforms/aws/remote.js.map +1 -1
- package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.js +4 -4
- package/lib/commonjs/platforms/aws/setup/buildBucketNamesStep.js.map +1 -1
- package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js +4 -3
- package/lib/commonjs/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
- package/lib/commonjs/platforms/aws/stacks.d.ts +0 -1
- package/lib/commonjs/platforms/aws/stacks.js +21 -33
- package/lib/commonjs/platforms/aws/stacks.js.map +1 -1
- package/lib/commonjs/platforms/aws/teardown.js +9 -7
- package/lib/commonjs/platforms/aws/teardown.js.map +1 -1
- package/lib/commonjs/platforms/aws/viewsSync.js +23 -11
- package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -1
- package/lib/commonjs/platforms/docker/go.js +20 -18
- package/lib/commonjs/platforms/docker/go.js.map +1 -1
- package/lib/commonjs/platforms/docker/index.js +5 -4
- package/lib/commonjs/platforms/docker/index.js.map +1 -1
- package/lib/commonjs/platforms/docker/parseMounts.js +3 -2
- package/lib/commonjs/platforms/docker/parseMounts.js.map +1 -1
- package/lib/commonjs/platforms/index.js +4 -2
- package/lib/commonjs/platforms/index.js.map +1 -1
- package/lib/commonjs/platforms/types.d.ts +2 -2
- package/lib/commonjs/platforms/types.js.map +1 -1
- package/lib/esm/cli/commandMenu.js +5 -4
- package/lib/esm/cli/commandMenu.js.map +1 -1
- package/lib/esm/cli/runCli.js +15 -7
- package/lib/esm/cli/runCli.js.map +1 -1
- package/lib/esm/commands/checkCircular.js +15 -7
- package/lib/esm/commands/checkCircular.js.map +1 -1
- package/lib/esm/commands/clearResources.js +8 -14
- package/lib/esm/commands/clearResources.js.map +1 -1
- package/lib/esm/commands/go.js +3 -7
- package/lib/esm/commands/go.js.map +1 -1
- package/lib/esm/commands/goDev.js +4 -2
- package/lib/esm/commands/goDev.js.map +1 -1
- package/lib/esm/commands/goDevApi.js +21 -18
- package/lib/esm/commands/goDevApi.js.map +1 -1
- package/lib/esm/commands/goDevWeb.js +12 -8
- package/lib/esm/commands/goDevWeb.js.map +1 -1
- package/lib/esm/commands/goDocker.js +10 -13
- package/lib/esm/commands/goDocker.js.map +1 -1
- package/lib/esm/commands/hooks.js +4 -2
- package/lib/esm/commands/hooks.js.map +1 -1
- package/lib/esm/commands/migrate.js +9 -7
- package/lib/esm/commands/migrate.js.map +1 -1
- package/lib/esm/commands/prep.js +4 -2
- package/lib/esm/commands/prep.js.map +1 -1
- package/lib/esm/commands/publish.js +4 -7
- package/lib/esm/commands/publish.js.map +1 -1
- package/lib/esm/commands/scriptBuild.js +7 -5
- package/lib/esm/commands/scriptBuild.js.map +1 -1
- package/lib/esm/commands/scriptBuilderLayer.js +6 -4
- package/lib/esm/commands/scriptBuilderLayer.js.map +1 -1
- package/lib/esm/commands/scriptNew.js +7 -5
- package/lib/esm/commands/scriptNew.js.map +1 -1
- package/lib/esm/commands/setup.js +14 -22
- package/lib/esm/commands/setup.js.map +1 -1
- package/lib/esm/commands/synth.js +18 -22
- package/lib/esm/commands/synth.js.map +1 -1
- package/lib/esm/commands/teardown.js +8 -14
- package/lib/esm/commands/teardown.js.map +1 -1
- package/lib/esm/lib/CliError.d.ts +4 -0
- package/lib/esm/lib/CliError.js +11 -0
- package/lib/esm/lib/CliError.js.map +1 -0
- package/lib/esm/lib/circularImports.d.ts +0 -1
- package/lib/esm/lib/circularImports.js +4 -4
- package/lib/esm/lib/circularImports.js.map +1 -1
- package/lib/esm/lib/clearResourcesPlan.d.ts +0 -1
- package/lib/esm/lib/clearResourcesPlan.js +12 -12
- package/lib/esm/lib/clearResourcesPlan.js.map +1 -1
- package/lib/esm/lib/deployPrompts.d.ts +2 -1
- package/lib/esm/lib/deployPrompts.js +17 -17
- package/lib/esm/lib/deployPrompts.js.map +1 -1
- package/lib/esm/lib/devServerEntry.js +5 -4
- package/lib/esm/lib/devServerEntry.js.map +1 -1
- package/lib/esm/lib/devServerPorts.js +2 -3
- package/lib/esm/lib/devServerPorts.js.map +1 -1
- package/lib/esm/lib/discovery.d.ts +0 -2
- package/lib/esm/lib/discovery.js +10 -38
- package/lib/esm/lib/discovery.js.map +1 -1
- package/lib/esm/lib/hooks.js +5 -3
- package/lib/esm/lib/hooks.js.map +1 -1
- package/lib/esm/lib/killChildWithEscalation.js +3 -1
- package/lib/esm/lib/killChildWithEscalation.js.map +1 -1
- package/lib/esm/lib/killStaleListeners.js +24 -37
- package/lib/esm/lib/killStaleListeners.js.map +1 -1
- package/lib/esm/lib/out.d.ts +11 -0
- package/lib/esm/lib/out.js +26 -0
- package/lib/esm/lib/out.js.map +1 -0
- package/lib/esm/lib/prompts.d.ts +1 -0
- package/lib/esm/lib/prompts.js +13 -1
- package/lib/esm/lib/prompts.js.map +1 -1
- package/lib/esm/lib/qpqConfigs.js +4 -4
- package/lib/esm/lib/qpqConfigs.js.map +1 -1
- package/lib/esm/lib/requireDriverCapability.d.ts +7 -0
- package/lib/esm/lib/requireDriverCapability.js +13 -0
- package/lib/esm/lib/requireDriverCapability.js.map +1 -0
- package/lib/esm/lib/resolveAppSelection.d.ts +1 -0
- package/lib/esm/lib/resolveAppSelection.js +17 -11
- package/lib/esm/lib/resolveAppSelection.js.map +1 -1
- package/lib/esm/lib/resolveCommandContext.d.ts +12 -0
- package/lib/esm/lib/resolveCommandContext.js +12 -0
- package/lib/esm/lib/resolveCommandContext.js.map +1 -0
- package/lib/esm/lib/resolveDeployment.d.ts +0 -1
- package/lib/esm/lib/resolveDeployment.js +13 -8
- package/lib/esm/lib/resolveDeployment.js.map +1 -1
- package/lib/esm/lib/runCommand.d.ts +20 -0
- package/lib/esm/lib/runCommand.js +52 -31
- package/lib/esm/lib/runCommand.js.map +1 -1
- package/lib/esm/lib/runTasks.js +8 -4
- package/lib/esm/lib/runTasks.js.map +1 -1
- package/lib/esm/lib/timing.js +5 -3
- package/lib/esm/lib/timing.js.map +1 -1
- package/lib/esm/lib/typeWatcher.d.ts +2 -1
- package/lib/esm/lib/typeWatcher.js +6 -13
- package/lib/esm/lib/typeWatcher.js.map +1 -1
- package/lib/esm/lib/userScriptBuilderLayer.d.ts +0 -2
- package/lib/esm/lib/userScriptBuilderLayer.js +5 -5
- package/lib/esm/lib/userScriptBuilderLayer.js.map +1 -1
- package/lib/esm/lib/views.js +3 -2
- package/lib/esm/lib/views.js.map +1 -1
- package/lib/esm/lib/webAddressingEnv.d.ts +0 -2
- package/lib/esm/lib/webAddressingEnv.js +1 -1
- package/lib/esm/lib/webAddressingEnv.js.map +1 -1
- package/lib/esm/platforms/aws/awsCredentials.js +3 -1
- package/lib/esm/platforms/aws/awsCredentials.js.map +1 -1
- package/lib/esm/platforms/aws/cdkApp.js +1 -1
- package/lib/esm/platforms/aws/cdkApp.js.map +1 -1
- package/lib/esm/platforms/aws/clearResources.js +16 -25
- package/lib/esm/platforms/aws/clearResources.js.map +1 -1
- package/lib/esm/platforms/aws/getDeployEnv.d.ts +1 -0
- package/lib/esm/platforms/aws/getDeployEnv.js +8 -0
- package/lib/esm/platforms/aws/getDeployEnv.js.map +1 -0
- package/lib/esm/platforms/aws/go.js +17 -15
- package/lib/esm/platforms/aws/go.js.map +1 -1
- package/lib/esm/platforms/aws/goDocker.js +29 -26
- package/lib/esm/platforms/aws/goDocker.js.map +1 -1
- package/lib/esm/platforms/aws/goDockerManifest.js +6 -1
- package/lib/esm/platforms/aws/goDockerManifest.js.map +1 -1
- package/lib/esm/platforms/aws/publish.js +13 -11
- package/lib/esm/platforms/aws/publish.js.map +1 -1
- package/lib/esm/platforms/aws/remote.js +9 -7
- package/lib/esm/platforms/aws/remote.js.map +1 -1
- package/lib/esm/platforms/aws/setup/buildBucketNamesStep.js +2 -2
- package/lib/esm/platforms/aws/setup/buildBucketNamesStep.js.map +1 -1
- package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js +4 -3
- package/lib/esm/platforms/aws/setup/buildGithubDeployRoleStep.js.map +1 -1
- package/lib/esm/platforms/aws/stacks.d.ts +0 -1
- package/lib/esm/platforms/aws/stacks.js +22 -30
- package/lib/esm/platforms/aws/stacks.js.map +1 -1
- package/lib/esm/platforms/aws/teardown.js +9 -7
- package/lib/esm/platforms/aws/teardown.js.map +1 -1
- package/lib/esm/platforms/aws/viewsSync.js +22 -10
- package/lib/esm/platforms/aws/viewsSync.js.map +1 -1
- package/lib/esm/platforms/docker/go.js +21 -19
- package/lib/esm/platforms/docker/go.js.map +1 -1
- package/lib/esm/platforms/docker/index.js +5 -4
- package/lib/esm/platforms/docker/index.js.map +1 -1
- package/lib/esm/platforms/docker/parseMounts.js +3 -2
- package/lib/esm/platforms/docker/parseMounts.js.map +1 -1
- package/lib/esm/platforms/index.js +4 -2
- package/lib/esm/platforms/index.js.map +1 -1
- package/lib/esm/platforms/types.d.ts +2 -2
- package/lib/esm/platforms/types.js.map +1 -1
- package/package.json +28 -15
- package/templates/user-script/README.md +1 -1
|
@@ -13,7 +13,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.getViewsDistDir = exports.bundleViews = void 0;
|
|
16
|
-
|
|
16
|
+
const core_1 = require("@qpqjs/core");
|
|
17
|
+
// Views build, programmatic (getViewsRspackConfig), platform-neutral. Where
|
|
17
18
|
// the built views get hosted is a platform driver concern (see
|
|
18
19
|
// platforms/<platform>/viewsSync).
|
|
19
20
|
const deploy_rspack_1 = require("@qpqjs/deploy-rspack");
|
|
@@ -26,6 +27,6 @@ const bundleViews = (appName, serviceName) => __awaiter(void 0, void 0, void 0,
|
|
|
26
27
|
yield (0, deploy_rspack_1.runRspack)((0, deploy_rspack_1.getViewsRspackConfig)(viewsDir));
|
|
27
28
|
});
|
|
28
29
|
exports.bundleViews = bundleViews;
|
|
29
|
-
const getViewsDistDir = (appName, serviceName) =>
|
|
30
|
+
const getViewsDistDir = (appName, serviceName) => (0, core_1.getViewsDistPath)((0, discovery_1.getRoot)(), appName, serviceName);
|
|
30
31
|
exports.getViewsDistDir = getViewsDistDir;
|
|
31
32
|
//# sourceMappingURL=views.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../../src/lib/views.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../../src/lib/views.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAA+C;AAC/C,4EAA4E;AAC5E,+DAA+D;AAC/D,mCAAmC;AACnC,wDAAuE;AAEvE,gDAAwB;AAExB,2CAA2D;AAEpD,MAAM,WAAW,GAAG,CAAO,OAAe,EAAE,WAAmB,EAAiB,EAAE;IACvF,MAAM,QAAQ,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,+BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAE/E,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;IAEpC,MAAM,IAAA,yBAAS,EAAC,IAAA,oCAAoB,EAAC,QAAQ,CAAC,CAAC,CAAC;AAClD,CAAC,CAAA,CAAC;AAPW,QAAA,WAAW,eAOtB;AAEK,MAAM,eAAe,GAAG,CAAC,OAAe,EAAE,WAAmB,EAAU,EAAE,CAAC,IAAA,uBAAgB,EAAC,IAAA,mBAAO,GAAE,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AAAtH,QAAA,eAAe,mBAAuG","sourcesContent":["import { getViewsDistPath } from '@qpqjs/core';\n// Views build, programmatic (getViewsRspackConfig), platform-neutral. Where\n// the built views get hosted is a platform driver concern (see\n// platforms/<platform>/viewsSync).\nimport { getViewsRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport path from 'path';\n\nimport { getRoot, getServiceDirectory } from './discovery';\n\nexport const bundleViews = async (appName: string, serviceName: string): Promise<void> => {\n const viewsDir = path.join(getServiceDirectory(appName, serviceName), 'views');\n\n process.env.NODE_ENV = 'production';\n delete process.env.LOCAL_DEV_SERVER;\n\n await runRspack(getViewsRspackConfig(viewsDir));\n};\n\nexport const getViewsDistDir = (appName: string, serviceName: string): string => getViewsDistPath(getRoot(), appName, serviceName);\n"]}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { QPQConfig } from '@qpqjs/core';
|
|
2
2
|
import { WebAddressingPorts } from '@qpqjs/dev-server';
|
|
3
|
-
/** Env var the views build reads to bake `WebAddressing` into every bundle. */
|
|
4
|
-
export declare const QPQ_WEB_ADDRESSING_ENV = "QPQ_WEB_ADDRESSING";
|
|
5
3
|
/** Bakes port-mode addressing into the views builds that follow, until `clearWebAddressingEnv`. */
|
|
6
4
|
export declare const setWebAddressingEnv: (qpqConfigs: QPQConfig[], ports: WebAddressingPorts) => void;
|
|
7
5
|
export declare const clearWebAddressingEnv: () => void;
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.clearWebAddressingEnv = exports.setWebAddressingEnv =
|
|
3
|
+
exports.clearWebAddressingEnv = exports.setWebAddressingEnv = void 0;
|
|
4
4
|
const dev_server_1 = require("@qpqjs/dev-server");
|
|
5
5
|
/** Env var the views build reads to bake `WebAddressing` into every bundle. */
|
|
6
|
-
|
|
6
|
+
const QPQ_WEB_ADDRESSING_ENV = 'QPQ_WEB_ADDRESSING';
|
|
7
7
|
/** Bakes port-mode addressing into the views builds that follow, until `clearWebAddressingEnv`. */
|
|
8
8
|
const setWebAddressingEnv = (qpqConfigs, ports) => {
|
|
9
|
-
process.env[
|
|
9
|
+
process.env[QPQ_WEB_ADDRESSING_ENV] = JSON.stringify((0, dev_server_1.getWebAddressing)(qpqConfigs, ports));
|
|
10
10
|
};
|
|
11
11
|
exports.setWebAddressingEnv = setWebAddressingEnv;
|
|
12
12
|
const clearWebAddressingEnv = () => {
|
|
13
|
-
delete process.env[
|
|
13
|
+
delete process.env[QPQ_WEB_ADDRESSING_ENV];
|
|
14
14
|
};
|
|
15
15
|
exports.clearWebAddressingEnv = clearWebAddressingEnv;
|
|
16
16
|
//# sourceMappingURL=webAddressingEnv.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webAddressingEnv.js","sourceRoot":"","sources":["../../../src/lib/webAddressingEnv.ts"],"names":[],"mappings":";;;AACA,kDAAyE;AAEzE,+EAA+E;
|
|
1
|
+
{"version":3,"file":"webAddressingEnv.js","sourceRoot":"","sources":["../../../src/lib/webAddressingEnv.ts"],"names":[],"mappings":";;;AACA,kDAAyE;AAEzE,+EAA+E;AAC/E,MAAM,sBAAsB,GAAG,oBAAoB,CAAC;AAEpD,mGAAmG;AAC5F,MAAM,mBAAmB,GAAG,CAAC,UAAuB,EAAE,KAAyB,EAAQ,EAAE;IAC9F,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAA,6BAAgB,EAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;AAC5F,CAAC,CAAC;AAFW,QAAA,mBAAmB,uBAE9B;AAEK,MAAM,qBAAqB,GAAG,GAAS,EAAE;IAC9C,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAC7C,CAAC,CAAC;AAFW,QAAA,qBAAqB,yBAEhC","sourcesContent":["import { QPQConfig } from '@qpqjs/core';\nimport { getWebAddressing, WebAddressingPorts } from '@qpqjs/dev-server';\n\n/** Env var the views build reads to bake `WebAddressing` into every bundle. */\nconst QPQ_WEB_ADDRESSING_ENV = 'QPQ_WEB_ADDRESSING';\n\n/** Bakes port-mode addressing into the views builds that follow, until `clearWebAddressingEnv`. */\nexport const setWebAddressingEnv = (qpqConfigs: QPQConfig[], ports: WebAddressingPorts): void => {\n process.env[QPQ_WEB_ADDRESSING_ENV] = JSON.stringify(getWebAddressing(qpqConfigs, ports));\n};\n\nexport const clearWebAddressingEnv = (): void => {\n delete process.env[QPQ_WEB_ADDRESSING_ENV];\n};\n"]}
|
|
@@ -11,6 +11,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.isAwsCredentialsValid = void 0;
|
|
13
13
|
const client_sts_1 = require("@aws-sdk/client-sts");
|
|
14
|
+
const out_1 = require("../../lib/out");
|
|
15
|
+
const out = (0, out_1.createOutput)('aws:aws-credentials');
|
|
14
16
|
const isAwsCredentialsValid = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
15
17
|
try {
|
|
16
18
|
const client = new client_sts_1.STSClient({
|
|
@@ -20,7 +22,7 @@ const isAwsCredentialsValid = () => __awaiter(void 0, void 0, void 0, function*
|
|
|
20
22
|
return true;
|
|
21
23
|
}
|
|
22
24
|
catch (error) {
|
|
23
|
-
|
|
25
|
+
out.log('Error validating AWS credentials:', error);
|
|
24
26
|
return false;
|
|
25
27
|
}
|
|
26
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"awsCredentials.js","sourceRoot":"","sources":["../../../../src/platforms/aws/awsCredentials.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA0E;
|
|
1
|
+
{"version":3,"file":"awsCredentials.js","sourceRoot":"","sources":["../../../../src/platforms/aws/awsCredentials.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAA0E;AAE1E,uCAA6C;AAE7C,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,qBAAqB,CAAC,CAAC;AAEzC,MAAM,qBAAqB,GAAG,GAA2B,EAAE;IAChE,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,sBAAS,CAAC;YAC3B,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,WAAW;SAChF,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,qCAAwB,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC,CAAA,CAAC;AAXW,QAAA,qBAAqB,yBAWhC","sourcesContent":["import { GetCallerIdentityCommand, STSClient } from '@aws-sdk/client-sts';\n\nimport { createOutput } from '../../lib/out';\n\nconst out = createOutput('aws:aws-credentials');\n\nexport const isAwsCredentialsValid = async (): Promise<boolean> => {\n try {\n const client = new STSClient({\n region: process.env.AWS_REGION || process.env.AWS_DEFAULT_REGION || 'us-east-1',\n });\n await client.send(new GetCallerIdentityCommand({}));\n return true;\n } catch (error) {\n out.log('Error validating AWS credentials:', error);\n return false;\n }\n};\n"]}
|
|
@@ -9,7 +9,7 @@ const packageRoot_1 = require("../../lib/packageRoot");
|
|
|
9
9
|
// The CDK app command (`cdk ... --app "<this>"`): @qpqjs/deploy-aws's
|
|
10
10
|
// generic workspace app under ts-node hooks, with DEPLOY_* in the env.
|
|
11
11
|
const getCdkAppCommand = () => {
|
|
12
|
-
// Resolve ts-node from this package, not the workspace cwd
|
|
12
|
+
// Resolve ts-node from this package, not the workspace cwd, under npm link
|
|
13
13
|
// the CLI's dependencies are never hoisted into the workspace's node_modules,
|
|
14
14
|
// so a bare `-r ts-node/...` preload fails there.
|
|
15
15
|
const tsNodeRegister = require.resolve('ts-node/register/transpile-only');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdkApp.js","sourceRoot":"","sources":["../../../../src/platforms/aws/cdkApp.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAA0D;AAE1D,sEAAsE;AACtE,uEAAuE;AAChE,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,
|
|
1
|
+
{"version":3,"file":"cdkApp.js","sourceRoot":"","sources":["../../../../src/platforms/aws/cdkApp.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAExB,uDAA0D;AAE1D,sEAAsE;AACtE,uEAAuE;AAChE,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,2EAA2E;IAC3E,8EAA8E;IAC9E,kDAAkD;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAC1E,MAAM,YAAY,GAAG,cAAI,CAAC,IAAI,CAAC,IAAA,+BAAiB,GAAE,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;IAC9F,OAAO,YAAY,cAAc,MAAM,YAAY,GAAG,CAAC;AACzD,CAAC,CAAC;AAPW,QAAA,gBAAgB,oBAO3B;AAEF,6EAA6E;AAC7E,+EAA+E;AAC/E,0CAA0C;AACnC,MAAM,gBAAgB,GAAG,GAAW,EAAE;IAC3C,iEAAiE;IACjE,OAAO,OAAO,CAAC,sBAAsB,CAAC,CAAC,OAAiB,CAAC;AAC3D,CAAC,CAAC;AAHW,QAAA,gBAAgB,oBAG3B;AAEF,6DAA6D;AACtD,MAAM,YAAY,GAAG,GAAW,EAAE,CAAC,cAAI,CAAC,IAAI,CAAC,IAAA,+BAAiB,GAAE,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;AAAtF,QAAA,YAAY,gBAA0E","sourcesContent":["import path from 'path';\n\nimport { getOwnPackageRoot } from '../../lib/packageRoot';\n\n// The CDK app command (`cdk ... --app \"<this>\"`): @qpqjs/deploy-aws's\n// generic workspace app under ts-node hooks, with DEPLOY_* in the env.\nexport const getCdkAppCommand = (): string => {\n // Resolve ts-node from this package, not the workspace cwd, under npm link\n // the CLI's dependencies are never hoisted into the workspace's node_modules,\n // so a bare `-r ts-node/...` preload fails there.\n const tsNodeRegister = require.resolve('ts-node/register/transpile-only');\n const cdkAppScript = path.join(getOwnPackageRoot(), 'lib', 'commonjs', 'bin', 'qpqCdkApp.js');\n return `node -r \"${tsNodeRegister}\" \"${cdkAppScript}\"`;\n};\n\n// The CLI's own aws-cdk. The go:docker deployer image pins to it and a saved\n// build records it, so the CDK that deploys an assembly is always the one that\n// synthesized it and can read its schema.\nexport const getCdkCliVersion = (): string => {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require('aws-cdk/package.json').version as string;\n};\n\n// The docker build context for the go:docker deployer image.\nexport const getDockerDir = (): string => path.join(getOwnPackageRoot(), 'docker', 'cdk-deployer');\n"]}
|
|
@@ -10,6 +10,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.awsClearResources = void 0;
|
|
13
|
+
const actionprocessor_aws_1 = require("@qpqjs/actionprocessor-aws");
|
|
13
14
|
// AWS implementation of `qpq clear-resources`: empty (never delete) the
|
|
14
15
|
// selected data resources. Storage drives are S3 buckets - emptied including
|
|
15
16
|
// every object version and delete marker, so versioned buckets come out clean
|
|
@@ -20,24 +21,13 @@ exports.awsClearResources = void 0;
|
|
|
20
21
|
// Runtime names are resolved from each service's live qpq config with the
|
|
21
22
|
// same naming utils the deployed runtime uses, so what gets emptied is
|
|
22
23
|
// exactly what the app reads and writes.
|
|
23
|
-
const actionprocessor_aws_1 = require("@qpqjs/actionprocessor-aws");
|
|
24
24
|
const config_aws_1 = require("@qpqjs/config-aws");
|
|
25
|
-
const core_1 = require("@qpqjs/core");
|
|
26
25
|
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
27
26
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
27
|
+
const out_1 = require("../../lib/out");
|
|
28
28
|
const qpqConfigs_1 = require("../../lib/qpqConfigs");
|
|
29
29
|
const awsCredentials_1 = require("./awsCredentials");
|
|
30
|
-
|
|
31
|
-
// from the actionprocessor package root): honour the cross-module owner and
|
|
32
|
-
// its resourceNameOverride.
|
|
33
|
-
const resolveBucketName = (drive, qpqConfig) => {
|
|
34
|
-
var _a, _b;
|
|
35
|
-
const storageDriveConfig = core_1.qpqCoreUtils.getStorageDriveByName(drive, qpqConfig);
|
|
36
|
-
if (!storageDriveConfig) {
|
|
37
|
-
throw new Error(`Could not find storage drive config for [${drive}]`);
|
|
38
|
-
}
|
|
39
|
-
return actionprocessor_aws_1.awsNamingUtils.getConfigRuntimeResourceNameFromConfigWithServiceOverride(((_a = storageDriveConfig.owner) === null || _a === void 0 ? void 0 : _a.resourceNameOverride) || drive, qpqConfig, (_b = storageDriveConfig.owner) === null || _b === void 0 ? void 0 : _b.module);
|
|
40
|
-
};
|
|
30
|
+
const out = (0, out_1.createOutput)('aws:clear-resources');
|
|
41
31
|
// Log a progress heartbeat roughly every this-many removals, so a large
|
|
42
32
|
// resource visibly ticks along instead of looking hung.
|
|
43
33
|
const PROGRESS_EVERY = 2000;
|
|
@@ -61,7 +51,7 @@ const emptyBucket = (bucketName, region) => __awaiter(void 0, void 0, void 0, fu
|
|
|
61
51
|
removed += objects.length;
|
|
62
52
|
}
|
|
63
53
|
if (removed - lastReported >= PROGRESS_EVERY) {
|
|
64
|
-
|
|
54
|
+
out.log(` ... ${removed} objects/versions so far`);
|
|
65
55
|
lastReported = removed;
|
|
66
56
|
}
|
|
67
57
|
keyMarker = page.IsTruncated ? page.NextKeyMarker : undefined;
|
|
@@ -105,7 +95,7 @@ const truncateTable = (tableName, region) => __awaiter(void 0, void 0, void 0, f
|
|
|
105
95
|
}
|
|
106
96
|
}
|
|
107
97
|
if (removed - lastReported >= PROGRESS_EVERY) {
|
|
108
|
-
|
|
98
|
+
out.log(` ... ${removed} items so far`);
|
|
109
99
|
lastReported = removed;
|
|
110
100
|
}
|
|
111
101
|
exclusiveStartKey = page.LastEvaluatedKey;
|
|
@@ -116,15 +106,15 @@ const clearResource = (appName, resource) => __awaiter(void 0, void 0, void 0, f
|
|
|
116
106
|
const qpqConfig = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, resource.service);
|
|
117
107
|
const region = config_aws_1.qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);
|
|
118
108
|
if (resource.kind === 'storageDrive') {
|
|
119
|
-
const bucketName =
|
|
120
|
-
|
|
109
|
+
const bucketName = (0, actionprocessor_aws_1.resolveStorageDriveBucketName)(resource.resourceName, qpqConfig);
|
|
110
|
+
out.log(` emptying s3://${bucketName} ...`);
|
|
121
111
|
try {
|
|
122
112
|
const removed = yield emptyBucket(bucketName, region);
|
|
123
|
-
|
|
113
|
+
out.log(` emptied s3://${bucketName} (${removed} objects/versions)`);
|
|
124
114
|
}
|
|
125
115
|
catch (error) {
|
|
126
116
|
if (error instanceof client_s3_1.NoSuchBucket) {
|
|
127
|
-
|
|
117
|
+
out.log(` skipped s3://${bucketName} (bucket does not exist - not deployed?)`);
|
|
128
118
|
return;
|
|
129
119
|
}
|
|
130
120
|
throw error;
|
|
@@ -133,15 +123,15 @@ const clearResource = (appName, resource) => __awaiter(void 0, void 0, void 0, f
|
|
|
133
123
|
}
|
|
134
124
|
// 'kvs' matches the resourceType every runtime KVS action processor passes,
|
|
135
125
|
// giving the deployed '-qpqkvs' table name suffix.
|
|
136
|
-
const tableName =
|
|
137
|
-
|
|
126
|
+
const tableName = config_aws_1.awsNamingUtils.getKvsDynamoTableNameFromConfig(resource.resourceName, qpqConfig, 'kvs');
|
|
127
|
+
out.log(` truncating ${tableName} ...`);
|
|
138
128
|
try {
|
|
139
129
|
const removed = yield truncateTable(tableName, region);
|
|
140
|
-
|
|
130
|
+
out.log(` truncated ${tableName} (${removed} items)`);
|
|
141
131
|
}
|
|
142
132
|
catch (error) {
|
|
143
133
|
if (error instanceof client_dynamodb_1.ResourceNotFoundException) {
|
|
144
|
-
|
|
134
|
+
out.log(` skipped ${tableName} (table does not exist - not deployed?)`);
|
|
145
135
|
return;
|
|
146
136
|
}
|
|
147
137
|
throw error;
|
|
@@ -152,16 +142,16 @@ const awsClearResources = (appName, plan) => __awaiter(void 0, void 0, void 0, f
|
|
|
152
142
|
return;
|
|
153
143
|
}
|
|
154
144
|
if ((yield (0, awsCredentials_1.isAwsCredentialsValid)()) === false) {
|
|
155
|
-
|
|
145
|
+
out.log('Credentials are expired or invalid.');
|
|
156
146
|
return;
|
|
157
147
|
}
|
|
158
|
-
|
|
148
|
+
out.log('\nEmptying resources:');
|
|
159
149
|
// Sequential on purpose: predictable output, and no burst of parallel scans
|
|
160
150
|
// against provisioned-throughput tables.
|
|
161
151
|
for (const resource of plan.resources) {
|
|
162
152
|
yield clearResource(appName, resource);
|
|
163
153
|
}
|
|
164
|
-
|
|
154
|
+
out.log('Done.');
|
|
165
155
|
});
|
|
166
156
|
exports.awsClearResources = awsClearResources;
|
|
167
157
|
//# sourceMappingURL=clearResources.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clearResources.js","sourceRoot":"","sources":["../../../../src/platforms/aws/clearResources.ts"],"names":[],"mappings":"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","sourcesContent":["// AWS implementation of `qpq clear-resources`: empty (never delete) the\n// selected data resources. Storage drives are S3 buckets - emptied including\n// every object version and delete marker, so versioned buckets come out clean\n// too. Key value stores are DynamoDB tables - truncated by scanning keys only\n// and batch-deleting. The stacks and the resources themselves are untouched,\n// so this is the \"reset my data\" counterpart to `qpq teardown`.\n//\n// Runtime names are resolved from each service's live qpq config with the\n// same naming utils the deployed runtime uses, so what gets emptied is\n// exactly what the app reads and writes.\nimport { awsNamingUtils } from '@qpqjs/actionprocessor-aws';\nimport { qpqConfigAwsUtils } from '@qpqjs/config-aws';\nimport { QPQConfig, qpqCoreUtils } from '@qpqjs/core';\n\nimport {\n BatchWriteItemCommand,\n DescribeTableCommand,\n DynamoDBClient,\n ResourceNotFoundException,\n ScanCommand,\n WriteRequest,\n} from '@aws-sdk/client-dynamodb';\nimport { DeleteObjectsCommand, ListObjectVersionsCommand, NoSuchBucket, ObjectIdentifier, S3Client } from '@aws-sdk/client-s3';\n\nimport { ClearableResource, ClearResourcesPlan } from '../../lib/clearResourcesPlan';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { isAwsCredentialsValid } from './awsCredentials';\n\n// Same resolution as the runtime's resolveStorageDriveBucketName (not exported\n// from the actionprocessor package root): honour the cross-module owner and\n// its resourceNameOverride.\nconst resolveBucketName = (drive: string, qpqConfig: QPQConfig): string => {\n const storageDriveConfig = qpqCoreUtils.getStorageDriveByName(drive, qpqConfig);\n\n if (!storageDriveConfig) {\n throw new Error(`Could not find storage drive config for [${drive}]`);\n }\n\n return awsNamingUtils.getConfigRuntimeResourceNameFromConfigWithServiceOverride(\n storageDriveConfig.owner?.resourceNameOverride || drive,\n qpqConfig,\n storageDriveConfig.owner?.module,\n );\n};\n\n// Log a progress heartbeat roughly every this-many removals, so a large\n// resource visibly ticks along instead of looking hung.\nconst PROGRESS_EVERY = 2000;\n\n// Empty a bucket including all versions + delete markers. Returns the number\n// of objects/versions removed.\nconst emptyBucket = async (bucketName: string, region: string): Promise<number> => {\n const s3 = new S3Client({ region });\n let removed = 0;\n let lastReported = 0;\n let keyMarker: string | undefined;\n let versionIdMarker: string | undefined;\n\n do {\n const page = await s3.send(new ListObjectVersionsCommand({ Bucket: bucketName, KeyMarker: keyMarker, VersionIdMarker: versionIdMarker }));\n\n const objects: ObjectIdentifier[] = [...(page.Versions ?? []), ...(page.DeleteMarkers ?? [])].map((v) => ({\n Key: v.Key!,\n VersionId: v.VersionId,\n }));\n\n if (objects.length > 0) {\n await s3.send(new DeleteObjectsCommand({ Bucket: bucketName, Delete: { Objects: objects, Quiet: true } }));\n removed += objects.length;\n }\n\n if (removed - lastReported >= PROGRESS_EVERY) {\n console.log(` ... ${removed} objects/versions so far`);\n lastReported = removed;\n }\n\n keyMarker = page.IsTruncated ? page.NextKeyMarker : undefined;\n versionIdMarker = page.IsTruncated ? page.NextVersionIdMarker : undefined;\n } while (keyMarker || versionIdMarker);\n\n return removed;\n};\n\n// Truncate a table: scan key attributes only, batch-delete 25 at a time,\n// retrying unprocessed items. Returns the number of items removed.\nconst truncateTable = async (tableName: string, region: string): Promise<number> => {\n const dynamo = new DynamoDBClient({ region });\n\n const described = await dynamo.send(new DescribeTableCommand({ TableName: tableName }));\n const keyAttributes = (described.Table?.KeySchema ?? []).map((k) => k.AttributeName!);\n\n // Alias every key attribute - a raw name could collide with a reserved word.\n const projection = keyAttributes.map((_, i) => `#k${i}`).join(', ');\n const attributeNames = Object.fromEntries(keyAttributes.map((attribute, i) => [`#k${i}`, attribute]));\n\n let removed = 0;\n let lastReported = 0;\n let exclusiveStartKey: Record<string, any> | undefined;\n\n do {\n const page = await dynamo.send(\n new ScanCommand({\n TableName: tableName,\n ProjectionExpression: projection,\n ExpressionAttributeNames: attributeNames,\n ExclusiveStartKey: exclusiveStartKey,\n }),\n );\n\n const items = page.Items ?? [];\n\n for (let i = 0; i < items.length; i += 25) {\n let requests: WriteRequest[] = items.slice(i, i + 25).map((item) => ({ DeleteRequest: { Key: item } }));\n\n while (requests.length > 0) {\n const result = await dynamo.send(new BatchWriteItemCommand({ RequestItems: { [tableName]: requests } }));\n removed += requests.length;\n\n const unprocessed = result.UnprocessedItems?.[tableName] ?? [];\n removed -= unprocessed.length;\n requests = unprocessed;\n\n if (requests.length > 0) {\n // Throttled - back off briefly before retrying the leftovers.\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n }\n }\n\n if (removed - lastReported >= PROGRESS_EVERY) {\n console.log(` ... ${removed} items so far`);\n lastReported = removed;\n }\n\n exclusiveStartKey = page.LastEvaluatedKey;\n } while (exclusiveStartKey);\n\n return removed;\n};\n\nconst clearResource = async (appName: string, resource: ClearableResource): Promise<void> => {\n const qpqConfig = loadServiceQpqConfig(appName, resource.service);\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n if (resource.kind === 'storageDrive') {\n const bucketName = resolveBucketName(resource.resourceName, qpqConfig);\n console.log(` emptying s3://${bucketName} ...`);\n try {\n const removed = await emptyBucket(bucketName, region);\n console.log(` emptied s3://${bucketName} (${removed} objects/versions)`);\n } catch (error) {\n if (error instanceof NoSuchBucket) {\n console.log(` skipped s3://${bucketName} (bucket does not exist - not deployed?)`);\n return;\n }\n throw error;\n }\n return;\n }\n\n // 'kvs' matches the resourceType every runtime KVS action processor passes,\n // giving the deployed '-qpqkvs' table name suffix.\n const tableName = awsNamingUtils.getKvsDynamoTableNameFromConfig(resource.resourceName, qpqConfig, 'kvs');\n console.log(` truncating ${tableName} ...`);\n try {\n const removed = await truncateTable(tableName, region);\n console.log(` truncated ${tableName} (${removed} items)`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n console.log(` skipped ${tableName} (table does not exist - not deployed?)`);\n return;\n }\n throw error;\n }\n};\n\nexport const awsClearResources = async (appName: string, plan: ClearResourcesPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\n return;\n }\n\n if ((await isAwsCredentialsValid()) === false) {\n console.log('Credentials are expired or invalid.');\n return;\n }\n\n console.log('\\nEmptying resources:');\n\n // Sequential on purpose: predictable output, and no burst of parallel scans\n // against provisioned-throughput tables.\n for (const resource of plan.resources) {\n await clearResource(appName, resource);\n }\n\n console.log('Done.');\n};\n"]}
|
|
1
|
+
{"version":3,"file":"clearResources.js","sourceRoot":"","sources":["../../../../src/platforms/aws/clearResources.ts"],"names":[],"mappings":"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","sourcesContent":["import { resolveStorageDriveBucketName } from '@qpqjs/actionprocessor-aws';\n// AWS implementation of `qpq clear-resources`: empty (never delete) the\n// selected data resources. Storage drives are S3 buckets - emptied including\n// every object version and delete marker, so versioned buckets come out clean\n// too. Key value stores are DynamoDB tables - truncated by scanning keys only\n// and batch-deleting. The stacks and the resources themselves are untouched,\n// so this is the \"reset my data\" counterpart to `qpq teardown`.\n//\n// Runtime names are resolved from each service's live qpq config with the\n// same naming utils the deployed runtime uses, so what gets emptied is\n// exactly what the app reads and writes.\nimport { awsNamingUtils, qpqConfigAwsUtils } from '@qpqjs/config-aws';\nimport { QPQConfig, qpqCoreUtils } from '@qpqjs/core';\n\nimport {\n BatchWriteItemCommand,\n DescribeTableCommand,\n DynamoDBClient,\n ResourceNotFoundException,\n ScanCommand,\n WriteRequest,\n} from '@aws-sdk/client-dynamodb';\nimport { DeleteObjectsCommand, ListObjectVersionsCommand, NoSuchBucket, ObjectIdentifier, S3Client } from '@aws-sdk/client-s3';\n\nimport { ClearableResource, ClearResourcesPlan } from '../../lib/clearResourcesPlan';\nimport { createOutput } from '../../lib/out';\nimport { loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { isAwsCredentialsValid } from './awsCredentials';\n\nconst out = createOutput('aws:clear-resources');\n\n// Log a progress heartbeat roughly every this-many removals, so a large\n// resource visibly ticks along instead of looking hung.\nconst PROGRESS_EVERY = 2000;\n\n// Empty a bucket including all versions + delete markers. Returns the number\n// of objects/versions removed.\nconst emptyBucket = async (bucketName: string, region: string): Promise<number> => {\n const s3 = new S3Client({ region });\n let removed = 0;\n let lastReported = 0;\n let keyMarker: string | undefined;\n let versionIdMarker: string | undefined;\n\n do {\n const page = await s3.send(new ListObjectVersionsCommand({ Bucket: bucketName, KeyMarker: keyMarker, VersionIdMarker: versionIdMarker }));\n\n const objects: ObjectIdentifier[] = [...(page.Versions ?? []), ...(page.DeleteMarkers ?? [])].map((v) => ({\n Key: v.Key!,\n VersionId: v.VersionId,\n }));\n\n if (objects.length > 0) {\n await s3.send(new DeleteObjectsCommand({ Bucket: bucketName, Delete: { Objects: objects, Quiet: true } }));\n removed += objects.length;\n }\n\n if (removed - lastReported >= PROGRESS_EVERY) {\n out.log(` ... ${removed} objects/versions so far`);\n lastReported = removed;\n }\n\n keyMarker = page.IsTruncated ? page.NextKeyMarker : undefined;\n versionIdMarker = page.IsTruncated ? page.NextVersionIdMarker : undefined;\n } while (keyMarker || versionIdMarker);\n\n return removed;\n};\n\n// Truncate a table: scan key attributes only, batch-delete 25 at a time,\n// retrying unprocessed items. Returns the number of items removed.\nconst truncateTable = async (tableName: string, region: string): Promise<number> => {\n const dynamo = new DynamoDBClient({ region });\n\n const described = await dynamo.send(new DescribeTableCommand({ TableName: tableName }));\n const keyAttributes = (described.Table?.KeySchema ?? []).map((k) => k.AttributeName!);\n\n // Alias every key attribute - a raw name could collide with a reserved word.\n const projection = keyAttributes.map((_, i) => `#k${i}`).join(', ');\n const attributeNames = Object.fromEntries(keyAttributes.map((attribute, i) => [`#k${i}`, attribute]));\n\n let removed = 0;\n let lastReported = 0;\n let exclusiveStartKey: Record<string, any> | undefined;\n\n do {\n const page = await dynamo.send(\n new ScanCommand({\n TableName: tableName,\n ProjectionExpression: projection,\n ExpressionAttributeNames: attributeNames,\n ExclusiveStartKey: exclusiveStartKey,\n }),\n );\n\n const items = page.Items ?? [];\n\n for (let i = 0; i < items.length; i += 25) {\n let requests: WriteRequest[] = items.slice(i, i + 25).map((item) => ({ DeleteRequest: { Key: item } }));\n\n while (requests.length > 0) {\n const result = await dynamo.send(new BatchWriteItemCommand({ RequestItems: { [tableName]: requests } }));\n removed += requests.length;\n\n const unprocessed = result.UnprocessedItems?.[tableName] ?? [];\n removed -= unprocessed.length;\n requests = unprocessed;\n\n if (requests.length > 0) {\n // Throttled - back off briefly before retrying the leftovers.\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n }\n }\n\n if (removed - lastReported >= PROGRESS_EVERY) {\n out.log(` ... ${removed} items so far`);\n lastReported = removed;\n }\n\n exclusiveStartKey = page.LastEvaluatedKey;\n } while (exclusiveStartKey);\n\n return removed;\n};\n\nconst clearResource = async (appName: string, resource: ClearableResource): Promise<void> => {\n const qpqConfig = loadServiceQpqConfig(appName, resource.service);\n const region = qpqConfigAwsUtils.getApplicationModuleDeployRegion(qpqConfig);\n\n if (resource.kind === 'storageDrive') {\n const bucketName = resolveStorageDriveBucketName(resource.resourceName, qpqConfig);\n out.log(` emptying s3://${bucketName} ...`);\n try {\n const removed = await emptyBucket(bucketName, region);\n out.log(` emptied s3://${bucketName} (${removed} objects/versions)`);\n } catch (error) {\n if (error instanceof NoSuchBucket) {\n out.log(` skipped s3://${bucketName} (bucket does not exist - not deployed?)`);\n return;\n }\n throw error;\n }\n return;\n }\n\n // 'kvs' matches the resourceType every runtime KVS action processor passes,\n // giving the deployed '-qpqkvs' table name suffix.\n const tableName = awsNamingUtils.getKvsDynamoTableNameFromConfig(resource.resourceName, qpqConfig, 'kvs');\n out.log(` truncating ${tableName} ...`);\n try {\n const removed = await truncateTable(tableName, region);\n out.log(` truncated ${tableName} (${removed} items)`);\n } catch (error) {\n if (error instanceof ResourceNotFoundException) {\n out.log(` skipped ${tableName} (table does not exist - not deployed?)`);\n return;\n }\n throw error;\n }\n};\n\nexport const awsClearResources = async (appName: string, plan: ClearResourcesPlan): 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 out.log('\\nEmptying resources:');\n\n // Sequential on purpose: predictable output, and no burst of parallel scans\n // against provisioned-throughput tables.\n for (const resource of plan.resources) {\n await clearResource(appName, resource);\n }\n\n out.log('Done.');\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getDeployEnv: (appName: string, serviceName?: string) => Record<string, string>;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getDeployEnv = void 0;
|
|
4
|
+
const core_1 = require("@qpqjs/core");
|
|
5
|
+
// The env a cdk run reads its app and (optionally) service from; the deployment itself was
|
|
6
|
+
// primed into the environment by resolveDeployment and is inherited.
|
|
7
|
+
const getDeployEnv = (appName, serviceName = '') => ({
|
|
8
|
+
[core_1.QpqDeployEnvVar.deployServiceName]: serviceName,
|
|
9
|
+
[core_1.QpqDeployEnvVar.deployAppName]: appName,
|
|
10
|
+
});
|
|
11
|
+
exports.getDeployEnv = getDeployEnv;
|
|
12
|
+
//# sourceMappingURL=getDeployEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDeployEnv.js","sourceRoot":"","sources":["../../../../src/platforms/aws/getDeployEnv.ts"],"names":[],"mappings":";;;AAAA,sCAA8C;AAE9C,2FAA2F;AAC3F,qEAAqE;AAC9D,MAAM,YAAY,GAAG,CAAC,OAAe,EAAE,cAAsB,EAAE,EAA0B,EAAE,CAAC,CAAC;IAClG,CAAC,sBAAe,CAAC,iBAAiB,CAAC,EAAE,WAAW;IAChD,CAAC,sBAAe,CAAC,aAAa,CAAC,EAAE,OAAO;CACzC,CAAC,CAAC;AAHU,QAAA,YAAY,gBAGtB","sourcesContent":["import { QpqDeployEnvVar } from '@qpqjs/core';\n\n// The env a cdk run reads its app and (optionally) service from; the deployment itself was\n// primed into the environment by resolveDeployment and is inherited.\nexport const getDeployEnv = (appName: string, serviceName: string = ''): Record<string, string> => ({\n [QpqDeployEnvVar.deployServiceName]: serviceName,\n [QpqDeployEnvVar.deployAppName]: appName,\n});\n"]}
|
|
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
15
|
exports.awsGo = void 0;
|
|
16
16
|
// AWS sequential deploy (`qpq go`). Per service it: synths the QPQ config,
|
|
17
|
-
// rspack-bundles the backend (programmatic
|
|
17
|
+
// rspack-bundles the backend (programmatic, no per-service rspack.config.ts),
|
|
18
18
|
// deploys the inf/api/web CDK stacks (cdk runs the generic workspace app via
|
|
19
19
|
// --app), bundles views (rspack, production) and syncs them to S3. Finally, any
|
|
20
20
|
// service that opts into module federation has its federated remote published
|
|
@@ -28,6 +28,7 @@ const synth_1 = require("../../commands/synth");
|
|
|
28
28
|
const discovery_1 = require("../../lib/discovery");
|
|
29
29
|
const getDefaultHookJobs_1 = require("../../lib/getDefaultHookJobs");
|
|
30
30
|
const hooks_1 = require("../../lib/hooks");
|
|
31
|
+
const out_1 = require("../../lib/out");
|
|
31
32
|
const qpqConfigs_1 = require("../../lib/qpqConfigs");
|
|
32
33
|
const runTasks_1 = require("../../lib/runTasks");
|
|
33
34
|
const timing_1 = require("../../lib/timing");
|
|
@@ -36,30 +37,31 @@ const awsCredentials_1 = require("./awsCredentials");
|
|
|
36
37
|
const publish_1 = require("./publish");
|
|
37
38
|
const stacks_1 = require("./stacks");
|
|
38
39
|
const viewsSync_1 = require("./viewsSync");
|
|
40
|
+
const out = (0, out_1.createOutput)('aws:go');
|
|
39
41
|
const buildAndDeploy = (serviceName, needsSynth, needsBuildApi, needsInfStack, needsApiStack, needsWebStack, needsViewStack, appName) => __awaiter(void 0, void 0, void 0, function* () {
|
|
40
42
|
if (needsSynth) {
|
|
41
|
-
|
|
43
|
+
out.log('Synth QPQ Configs');
|
|
42
44
|
yield (0, synth_1.synthCommand)([serviceName, '--app', appName]);
|
|
43
45
|
}
|
|
44
46
|
const qpqConfigForService = (0, qpqConfigs_1.loadServiceQpqConfig)(appName, serviceName);
|
|
45
47
|
if (needsBuildApi) {
|
|
46
|
-
|
|
48
|
+
out.log('Building Api: ', serviceName);
|
|
47
49
|
yield (0, deploy_rspack_1.runRspack)((0, deploy_rspack_1.getServiceRspackConfig)(qpqConfigForService, path_1.default.join((0, discovery_1.getServiceDirectory)(appName, serviceName), 'service')));
|
|
48
50
|
}
|
|
49
51
|
if (needsInfStack) {
|
|
50
|
-
|
|
52
|
+
out.log('Deploy Inf: ', serviceName);
|
|
51
53
|
yield (0, stacks_1.deployServiceStack)(serviceName, deploy_aws_1.qpqDeployAwsUtils.getInfStackName(qpqConfigForService), appName);
|
|
52
54
|
}
|
|
53
55
|
if (needsApiStack) {
|
|
54
|
-
|
|
56
|
+
out.log('Deploy Api: ', serviceName);
|
|
55
57
|
yield (0, stacks_1.deployServiceStack)(serviceName, deploy_aws_1.qpqDeployAwsUtils.getApiStackName(qpqConfigForService), appName);
|
|
56
58
|
}
|
|
57
59
|
if (needsWebStack) {
|
|
58
|
-
|
|
60
|
+
out.log('Deploy Web: ', serviceName);
|
|
59
61
|
yield (0, stacks_1.deployServiceStack)(serviceName, deploy_aws_1.qpqDeployAwsUtils.getWebStackName(qpqConfigForService), appName);
|
|
60
62
|
}
|
|
61
63
|
if (needsViewStack && (0, discovery_1.getServiceNamesWithViews)(appName).includes(serviceName)) {
|
|
62
|
-
|
|
64
|
+
out.log('Building Views: ', serviceName);
|
|
63
65
|
yield (0, views_1.bundleViews)(appName, serviceName);
|
|
64
66
|
yield (0, viewsSync_1.syncViewsToS3)(appName, serviceName);
|
|
65
67
|
}
|
|
@@ -75,10 +77,10 @@ const awsGo = (appName, plan) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
75
77
|
return;
|
|
76
78
|
}
|
|
77
79
|
if (plan.kind === 'bootstrap') {
|
|
78
|
-
// Feature bootstraps deploy into a shared account
|
|
80
|
+
// Feature bootstraps deploy into a shared account, leave the account-level
|
|
79
81
|
// guardrails stack alone (deploy it explicitly via the 'account' option).
|
|
80
82
|
if (process.env[core_1.QpqDeployEnvVar.featureName]) {
|
|
81
|
-
|
|
83
|
+
out.log('Skipping account stack for feature deploy');
|
|
82
84
|
}
|
|
83
85
|
else {
|
|
84
86
|
yield (0, stacks_1.deployAccountStack)(plan.appName);
|
|
@@ -92,18 +94,18 @@ const awsGo = (appName, plan) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
92
94
|
}
|
|
93
95
|
const { services, stacks } = plan;
|
|
94
96
|
const shouldBuildApi = stacks !== 'views';
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
97
|
+
out.log('\n\nRunning automated deploy\n\n');
|
|
98
|
+
out.log('Executing for services');
|
|
99
|
+
out.log(services.join(', '));
|
|
98
100
|
if ((yield (0, awsCredentials_1.isAwsCredentialsValid)()) === false) {
|
|
99
|
-
|
|
101
|
+
out.log('Credentials are expired or invalid.');
|
|
100
102
|
return;
|
|
101
103
|
}
|
|
102
104
|
const allStacks = stacks === 'all';
|
|
103
105
|
yield (0, hooks_1.runAppHook)(appName, 'predeploy');
|
|
104
106
|
// Workspace packages resolve through their built dist/ (package.json main),
|
|
105
107
|
// so bundles would ship stale code unless every lib is tsc'd first.
|
|
106
|
-
|
|
108
|
+
out.log('Building workspace packages');
|
|
107
109
|
(0, runTasks_1.assertNoFailures)('Workspace build', yield (0, hooks_1.runHookForAppPackages)('build', appName, (0, getDefaultHookJobs_1.getDefaultHookJobs)()));
|
|
108
110
|
// Views uploads resolve bucket names from the shell service's config.
|
|
109
111
|
if (allStacks || stacks === 'views') {
|
|
@@ -121,7 +123,7 @@ const awsGo = (appName, plan) => __awaiter(void 0, void 0, void 0, function* ()
|
|
|
121
123
|
if (allStacks || stacks === 'api') {
|
|
122
124
|
const federatedServices = (0, qpqConfigs_1.getServiceNamesWithFederation)(appName, services);
|
|
123
125
|
if (federatedServices.length > 0) {
|
|
124
|
-
|
|
126
|
+
out.log('\n\nPublishing federated backends\n');
|
|
125
127
|
yield (0, publish_1.awsPublish)(appName, federatedServices);
|
|
126
128
|
}
|
|
127
129
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../../../src/platforms/aws/go.ts"],"names":[],"mappings":"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","sourcesContent":["// AWS sequential deploy (`qpq go`). Per service it: synths the QPQ config,\n// rspack-bundles the backend (programmatic — no per-service rspack.config.ts),\n// deploys the inf/api/web CDK stacks (cdk runs the generic workspace app via\n// --app), bundles views (rspack, production) and syncs them to S3. Finally, any\n// service that opts into module federation has its federated remote published\n// (built + uploaded + manifest flipped), so a deploy that ships new backend\n// code also republishes the code the lambdas federate.\nimport { QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\nimport { getServiceRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport path from 'path';\n\nimport { synthCommand } from '../../commands/synth';\nimport { DeployPlan } from '../../lib/deployPrompts';\nimport { getServiceDirectory, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { getServiceNamesWithFederation, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { assertNoFailures } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews } from '../../lib/views';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { awsPublish } from './publish';\nimport { deployAccountStack, deployBootstrapStack, deployDomainStack, deployServiceStack } from './stacks';\nimport { syncViewsToS3 } from './viewsSync';\n\nconst buildAndDeploy = async (\n serviceName: string,\n needsSynth: boolean,\n needsBuildApi: boolean,\n needsInfStack: boolean,\n needsApiStack: boolean,\n needsWebStack: boolean,\n needsViewStack: boolean,\n appName: string,\n): Promise<void> => {\n if (needsSynth) {\n console.log('Synth QPQ Configs');\n await synthCommand([serviceName, '--app', appName]);\n }\n\n const qpqConfigForService = loadServiceQpqConfig(appName, serviceName);\n\n if (needsBuildApi) {\n console.log('Building Api: ', serviceName);\n await runRspack(getServiceRspackConfig(qpqConfigForService, path.join(getServiceDirectory(appName, serviceName), 'service')));\n }\n\n if (needsInfStack) {\n console.log('Deploy Inf: ', serviceName);\n await deployServiceStack(serviceName, qpqDeployAwsUtils.getInfStackName(qpqConfigForService), appName);\n }\n\n if (needsApiStack) {\n console.log('Deploy Api: ', serviceName);\n await deployServiceStack(serviceName, qpqDeployAwsUtils.getApiStackName(qpqConfigForService), appName);\n }\n\n if (needsWebStack) {\n console.log('Deploy Web: ', serviceName);\n await deployServiceStack(serviceName, qpqDeployAwsUtils.getWebStackName(qpqConfigForService), appName);\n }\n\n if (needsViewStack && getServiceNamesWithViews(appName).includes(serviceName)) {\n console.log('Building Views: ', serviceName);\n await bundleViews(appName, serviceName);\n await syncViewsToS3(appName, serviceName);\n }\n};\n\nexport const awsGo = async (appName: string, plan: DeployPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\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 // Feature bootstraps deploy into a shared account — leave the account-level\n // guardrails stack alone (deploy it explicitly via the 'account' option).\n if (process.env[QpqDeployEnvVar.featureName]) {\n console.log('Skipping account stack for feature deploy');\n } else {\n await deployAccountStack(plan.appName);\n }\n if (plan.includeDomain) {\n await deployDomainStack(plan.appName);\n }\n await deployBootstrapStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n const { services, stacks } = plan;\n const shouldBuildApi = stacks !== 'views';\n\n console.log('\\n\\nRunning automated deploy\\n\\n');\n console.log('Executing for services');\n console.log(services.join(', '));\n\n if ((await isAwsCredentialsValid()) === false) {\n console.log('Credentials are expired or invalid.');\n return;\n }\n\n const allStacks = stacks === 'all';\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.\n console.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // Views uploads resolve bucket names from the shell service's config.\n if (allStacks || stacks === 'views') {\n await synthCommand(['shell', '--app', appName]);\n }\n\n for (let phase = 0; phase <= 5; phase += 1) {\n await services.reduce(async (cur, service) => {\n await cur;\n return buildAndDeploy(\n service,\n phase === 0,\n phase === 1 && shouldBuildApi,\n phase === 2 && (allStacks || stacks === 'inf'),\n phase === 3 && (allStacks || stacks === 'api'),\n phase === 4 && (allStacks || stacks === 'web'),\n phase === 5 && (allStacks || stacks === 'views'),\n appName,\n );\n }, Promise.resolve());\n }\n\n // Publishing federated remotes only matters once the new backend code is\n // live, so it's gated on the api stack having been (re)deployed. Services\n // without defineFederatedModuleStore(...) are skipped.\n if (allStacks || stacks === 'api') {\n const federatedServices = getServiceNamesWithFederation(appName, services);\n if (federatedServices.length > 0) {\n console.log('\\n\\nPublishing federated backends\\n');\n await awsPublish(appName, federatedServices);\n }\n }\n\n logTimeEnd('totalTime');\n};\n"]}
|
|
1
|
+
{"version":3,"file":"go.js","sourceRoot":"","sources":["../../../../src/platforms/aws/go.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2EAA2E;AAC3E,8EAA8E;AAC9E,6EAA6E;AAC7E,gFAAgF;AAChF,8EAA8E;AAC9E,4EAA4E;AAC5E,uDAAuD;AACvD,sCAA8C;AAC9C,kDAAsD;AACtD,wDAAyE;AAEzE,gDAAwB;AAExB,gDAAoD;AAEpD,mDAAoF;AACpF,qEAAkE;AAClE,2CAAoE;AACpE,uCAA6C;AAC7C,qDAA2F;AAC3F,iDAAsD;AACtD,6CAA4D;AAC5D,2CAA8C;AAC9C,qDAAyD;AACzD,uCAAuC;AACvC,qCAA2G;AAC3G,2CAA4C;AAE5C,MAAM,GAAG,GAAG,IAAA,kBAAY,EAAC,QAAQ,CAAC,CAAC;AAEnC,MAAM,cAAc,GAAG,CACrB,WAAmB,EACnB,UAAmB,EACnB,aAAsB,EACtB,aAAsB,EACtB,aAAsB,EACtB,aAAsB,EACtB,cAAuB,EACvB,OAAe,EACA,EAAE;IACjB,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAC7B,MAAM,IAAA,oBAAY,EAAC,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,mBAAmB,GAAG,IAAA,iCAAoB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEvE,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACvC,MAAM,IAAA,yBAAS,EAAC,IAAA,sCAAsB,EAAC,mBAAmB,EAAE,cAAI,CAAC,IAAI,CAAC,IAAA,+BAAmB,EAAC,OAAO,EAAE,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAChI,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,IAAA,2BAAkB,EAAC,WAAW,EAAE,8BAAiB,CAAC,eAAe,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,IAAA,2BAAkB,EAAC,WAAW,EAAE,8BAAiB,CAAC,eAAe,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,IAAA,2BAAkB,EAAC,WAAW,EAAE,8BAAiB,CAAC,eAAe,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;IACzG,CAAC;IAED,IAAI,cAAc,IAAI,IAAA,oCAAwB,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9E,GAAG,CAAC,GAAG,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,IAAA,mBAAW,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QACxC,MAAM,IAAA,yBAAa,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;AACH,CAAC,CAAA,CAAC;AAEK,MAAM,KAAK,GAAG,CAAO,OAAe,EAAE,IAAgB,EAAiB,EAAE;IAC9E,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAA,qBAAY,EAAC,WAAW,CAAC,CAAC;IAE1B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAA,2BAAkB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC9B,2EAA2E;QAC3E,0EAA0E;QAC1E,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAe,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,IAAA,2BAAkB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,IAAA,0BAAiB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACxC,CAAC;QACD,MAAM,IAAA,6BAAoB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;QACxB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,MAAM,cAAc,GAAG,MAAM,KAAK,OAAO,CAAC;IAE1C,GAAG,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAC5C,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,MAAM,SAAS,GAAG,MAAM,KAAK,KAAK,CAAC;IAEnC,MAAM,IAAA,kBAAU,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEvC,4EAA4E;IAC5E,oEAAoE;IACpE,GAAG,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;IACvC,IAAA,2BAAgB,EAAC,iBAAiB,EAAE,MAAM,IAAA,6BAAqB,EAAC,OAAO,EAAE,OAAO,EAAE,IAAA,uCAAkB,GAAE,CAAC,CAAC,CAAC;IAEzG,sEAAsE;IACtE,IAAI,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACpC,MAAM,IAAA,oBAAY,EAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAO,GAAG,EAAE,OAAO,EAAE,EAAE;YAC3C,MAAM,GAAG,CAAC;YACV,OAAO,cAAc,CACnB,OAAO,EACP,KAAK,KAAK,CAAC,EACX,KAAK,KAAK,CAAC,IAAI,cAAc,EAC7B,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,EAC9C,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,EAC9C,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,KAAK,KAAK,CAAC,EAC9C,KAAK,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,KAAK,OAAO,CAAC,EAChD,OAAO,CACR,CAAC;QACJ,CAAC,CAAA,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACxB,CAAC;IAED,yEAAyE;IACzE,0EAA0E;IAC1E,uDAAuD;IACvD,IAAI,SAAS,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;QAClC,MAAM,iBAAiB,GAAG,IAAA,0CAA6B,EAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3E,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;YAC/C,MAAM,IAAA,oBAAU,EAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,IAAA,mBAAU,EAAC,WAAW,CAAC,CAAC;AAC1B,CAAC,CAAA,CAAC;AAnFW,QAAA,KAAK,SAmFhB","sourcesContent":["// AWS sequential deploy (`qpq go`). Per service it: synths the QPQ config,\n// rspack-bundles the backend (programmatic, no per-service rspack.config.ts),\n// deploys the inf/api/web CDK stacks (cdk runs the generic workspace app via\n// --app), bundles views (rspack, production) and syncs them to S3. Finally, any\n// service that opts into module federation has its federated remote published\n// (built + uploaded + manifest flipped), so a deploy that ships new backend\n// code also republishes the code the lambdas federate.\nimport { QpqDeployEnvVar } from '@qpqjs/core';\nimport { qpqDeployAwsUtils } from '@qpqjs/deploy-aws';\nimport { getServiceRspackConfig, runRspack } from '@qpqjs/deploy-rspack';\n\nimport path from 'path';\n\nimport { synthCommand } from '../../commands/synth';\nimport { DeployPlan } from '../../lib/deployPrompts';\nimport { getServiceDirectory, getServiceNamesWithViews } from '../../lib/discovery';\nimport { getDefaultHookJobs } from '../../lib/getDefaultHookJobs';\nimport { runAppHook, runHookForAppPackages } from '../../lib/hooks';\nimport { createOutput } from '../../lib/out';\nimport { getServiceNamesWithFederation, loadServiceQpqConfig } from '../../lib/qpqConfigs';\nimport { assertNoFailures } from '../../lib/runTasks';\nimport { logTimeEnd, logTimeStart } from '../../lib/timing';\nimport { bundleViews } from '../../lib/views';\nimport { isAwsCredentialsValid } from './awsCredentials';\nimport { awsPublish } from './publish';\nimport { deployAccountStack, deployBootstrapStack, deployDomainStack, deployServiceStack } from './stacks';\nimport { syncViewsToS3 } from './viewsSync';\n\nconst out = createOutput('aws:go');\n\nconst buildAndDeploy = async (\n serviceName: string,\n needsSynth: boolean,\n needsBuildApi: boolean,\n needsInfStack: boolean,\n needsApiStack: boolean,\n needsWebStack: boolean,\n needsViewStack: boolean,\n appName: string,\n): Promise<void> => {\n if (needsSynth) {\n out.log('Synth QPQ Configs');\n await synthCommand([serviceName, '--app', appName]);\n }\n\n const qpqConfigForService = loadServiceQpqConfig(appName, serviceName);\n\n if (needsBuildApi) {\n out.log('Building Api: ', serviceName);\n await runRspack(getServiceRspackConfig(qpqConfigForService, path.join(getServiceDirectory(appName, serviceName), 'service')));\n }\n\n if (needsInfStack) {\n out.log('Deploy Inf: ', serviceName);\n await deployServiceStack(serviceName, qpqDeployAwsUtils.getInfStackName(qpqConfigForService), appName);\n }\n\n if (needsApiStack) {\n out.log('Deploy Api: ', serviceName);\n await deployServiceStack(serviceName, qpqDeployAwsUtils.getApiStackName(qpqConfigForService), appName);\n }\n\n if (needsWebStack) {\n out.log('Deploy Web: ', serviceName);\n await deployServiceStack(serviceName, qpqDeployAwsUtils.getWebStackName(qpqConfigForService), appName);\n }\n\n if (needsViewStack && getServiceNamesWithViews(appName).includes(serviceName)) {\n out.log('Building Views: ', serviceName);\n await bundleViews(appName, serviceName);\n await syncViewsToS3(appName, serviceName);\n }\n};\n\nexport const awsGo = async (appName: string, plan: DeployPlan): Promise<void> => {\n if (plan.kind === 'cancelled') {\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 // Feature bootstraps deploy into a shared account, leave the account-level\n // guardrails stack alone (deploy it explicitly via the 'account' option).\n if (process.env[QpqDeployEnvVar.featureName]) {\n out.log('Skipping account stack for feature deploy');\n } else {\n await deployAccountStack(plan.appName);\n }\n if (plan.includeDomain) {\n await deployDomainStack(plan.appName);\n }\n await deployBootstrapStack(plan.appName);\n logTimeEnd('totalTime');\n return;\n }\n\n const { services, stacks } = plan;\n const shouldBuildApi = stacks !== 'views';\n\n out.log('\\n\\nRunning automated deploy\\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 const allStacks = stacks === 'all';\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.\n out.log('Building workspace packages');\n assertNoFailures('Workspace build', await runHookForAppPackages('build', appName, getDefaultHookJobs()));\n\n // Views uploads resolve bucket names from the shell service's config.\n if (allStacks || stacks === 'views') {\n await synthCommand(['shell', '--app', appName]);\n }\n\n for (let phase = 0; phase <= 5; phase += 1) {\n await services.reduce(async (cur, service) => {\n await cur;\n return buildAndDeploy(\n service,\n phase === 0,\n phase === 1 && shouldBuildApi,\n phase === 2 && (allStacks || stacks === 'inf'),\n phase === 3 && (allStacks || stacks === 'api'),\n phase === 4 && (allStacks || stacks === 'web'),\n phase === 5 && (allStacks || stacks === 'views'),\n appName,\n );\n }, Promise.resolve());\n }\n\n // Publishing federated remotes only matters once the new backend code is\n // live, so it's gated on the api stack having been (re)deployed. Services\n // without defineFederatedModuleStore(...) are skipped.\n if (allStacks || stacks === 'api') {\n const federatedServices = getServiceNamesWithFederation(appName, services);\n if (federatedServices.length > 0) {\n out.log('\\n\\nPublishing federated backends\\n');\n await awsPublish(appName, federatedServices);\n }\n }\n\n logTimeEnd('totalTime');\n};\n"]}
|