quidproquo-cli 0.1.5
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/README.md +3 -0
- package/docker/cdk-deployer/Dockerfile +13 -0
- package/docker/dev-server/Dockerfile +48 -0
- package/lib/commonjs/bin/qpq.d.ts +2 -0
- package/lib/commonjs/bin/qpq.js +6 -0
- package/lib/commonjs/bin/qpq.js.map +1 -0
- package/lib/commonjs/bin/qpqCdkApp.d.ts +1 -0
- package/lib/commonjs/bin/qpqCdkApp.js +8 -0
- package/lib/commonjs/bin/qpqCdkApp.js.map +1 -0
- package/lib/commonjs/cli/index.d.ts +1 -0
- package/lib/commonjs/cli/index.js +18 -0
- package/lib/commonjs/cli/index.js.map +1 -0
- package/lib/commonjs/cli/runCli.d.ts +1 -0
- package/lib/commonjs/cli/runCli.js +80 -0
- package/lib/commonjs/cli/runCli.js.map +1 -0
- package/lib/commonjs/commands/go.d.ts +1 -0
- package/lib/commonjs/commands/go.js +28 -0
- package/lib/commonjs/commands/go.js.map +1 -0
- package/lib/commonjs/commands/goDev.d.ts +1 -0
- package/lib/commonjs/commands/goDev.js +143 -0
- package/lib/commonjs/commands/goDev.js.map +1 -0
- package/lib/commonjs/commands/goDevWeb.d.ts +1 -0
- package/lib/commonjs/commands/goDevWeb.js +122 -0
- package/lib/commonjs/commands/goDevWeb.js.map +1 -0
- package/lib/commonjs/commands/goDocker.d.ts +1 -0
- package/lib/commonjs/commands/goDocker.js +32 -0
- package/lib/commonjs/commands/goDocker.js.map +1 -0
- package/lib/commonjs/commands/hooks.d.ts +1 -0
- package/lib/commonjs/commands/hooks.js +26 -0
- package/lib/commonjs/commands/hooks.js.map +1 -0
- package/lib/commonjs/commands/prep.d.ts +1 -0
- package/lib/commonjs/commands/prep.js +28 -0
- package/lib/commonjs/commands/prep.js.map +1 -0
- package/lib/commonjs/commands/publish.d.ts +4 -0
- package/lib/commonjs/commands/publish.js +54 -0
- package/lib/commonjs/commands/publish.js.map +1 -0
- package/lib/commonjs/commands/synth.d.ts +1 -0
- package/lib/commonjs/commands/synth.js +79 -0
- package/lib/commonjs/commands/synth.js.map +1 -0
- package/lib/commonjs/commands/teardown.d.ts +1 -0
- package/lib/commonjs/commands/teardown.js +33 -0
- package/lib/commonjs/commands/teardown.js.map +1 -0
- package/lib/commonjs/index.d.ts +1 -0
- package/lib/commonjs/index.js +18 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/lib/args.d.ts +2 -0
- package/lib/commonjs/lib/args.js +21 -0
- package/lib/commonjs/lib/args.js.map +1 -0
- package/lib/commonjs/lib/deployEnv.d.ts +6 -0
- package/lib/commonjs/lib/deployEnv.js +76 -0
- package/lib/commonjs/lib/deployEnv.js.map +1 -0
- package/lib/commonjs/lib/deployPrompts.d.ts +25 -0
- package/lib/commonjs/lib/deployPrompts.js +83 -0
- package/lib/commonjs/lib/deployPrompts.js.map +1 -0
- package/lib/commonjs/lib/devServerEntry.d.ts +1 -0
- package/lib/commonjs/lib/devServerEntry.js +53 -0
- package/lib/commonjs/lib/devServerEntry.js.map +1 -0
- package/lib/commonjs/lib/discovery.d.ts +10 -0
- package/lib/commonjs/lib/discovery.js +56 -0
- package/lib/commonjs/lib/discovery.js.map +1 -0
- package/lib/commonjs/lib/hooks.d.ts +2 -0
- package/lib/commonjs/lib/hooks.js +45 -0
- package/lib/commonjs/lib/hooks.js.map +1 -0
- package/lib/commonjs/lib/packageRoot.d.ts +1 -0
- package/lib/commonjs/lib/packageRoot.js +21 -0
- package/lib/commonjs/lib/packageRoot.js.map +1 -0
- package/lib/commonjs/lib/prompts.d.ts +3 -0
- package/lib/commonjs/lib/prompts.js +64 -0
- package/lib/commonjs/lib/prompts.js.map +1 -0
- package/lib/commonjs/lib/qpqConfigs.d.ts +3 -0
- package/lib/commonjs/lib/qpqConfigs.js +19 -0
- package/lib/commonjs/lib/qpqConfigs.js.map +1 -0
- package/lib/commonjs/lib/resolveAppSelection.d.ts +6 -0
- package/lib/commonjs/lib/resolveAppSelection.js +58 -0
- package/lib/commonjs/lib/resolveAppSelection.js.map +1 -0
- package/lib/commonjs/lib/rspackRun.d.ts +2 -0
- package/lib/commonjs/lib/rspackRun.js +23 -0
- package/lib/commonjs/lib/rspackRun.js.map +1 -0
- package/lib/commonjs/lib/runCommand.d.ts +13 -0
- package/lib/commonjs/lib/runCommand.js +78 -0
- package/lib/commonjs/lib/runCommand.js.map +1 -0
- package/lib/commonjs/lib/runTasks.d.ts +10 -0
- package/lib/commonjs/lib/runTasks.js +42 -0
- package/lib/commonjs/lib/runTasks.js.map +1 -0
- package/lib/commonjs/lib/timing.d.ts +2 -0
- package/lib/commonjs/lib/timing.js +11 -0
- package/lib/commonjs/lib/timing.js.map +1 -0
- package/lib/commonjs/lib/views.d.ts +2 -0
- package/lib/commonjs/lib/views.js +32 -0
- package/lib/commonjs/lib/views.js.map +1 -0
- package/lib/commonjs/platforms/aws/awsCredentials.d.ts +1 -0
- package/lib/commonjs/platforms/aws/awsCredentials.js +28 -0
- package/lib/commonjs/platforms/aws/awsCredentials.js.map +1 -0
- package/lib/commonjs/platforms/aws/cdkApp.d.ts +2 -0
- package/lib/commonjs/platforms/aws/cdkApp.js +19 -0
- package/lib/commonjs/platforms/aws/cdkApp.js.map +1 -0
- package/lib/commonjs/platforms/aws/go.d.ts +2 -0
- package/lib/commonjs/platforms/aws/go.js +116 -0
- package/lib/commonjs/platforms/aws/go.js.map +1 -0
- package/lib/commonjs/platforms/aws/goDocker.d.ts +2 -0
- package/lib/commonjs/platforms/aws/goDocker.js +287 -0
- package/lib/commonjs/platforms/aws/goDocker.js.map +1 -0
- package/lib/commonjs/platforms/aws/identity.d.ts +2 -0
- package/lib/commonjs/platforms/aws/identity.js +26 -0
- package/lib/commonjs/platforms/aws/identity.js.map +1 -0
- package/lib/commonjs/platforms/aws/index.d.ts +2 -0
- package/lib/commonjs/platforms/aws/index.js +19 -0
- package/lib/commonjs/platforms/aws/index.js.map +1 -0
- package/lib/commonjs/platforms/aws/publish.d.ts +4 -0
- package/lib/commonjs/platforms/aws/publish.js +66 -0
- package/lib/commonjs/platforms/aws/publish.js.map +1 -0
- package/lib/commonjs/platforms/aws/remote.d.ts +11 -0
- package/lib/commonjs/platforms/aws/remote.js +106 -0
- package/lib/commonjs/platforms/aws/remote.js.map +1 -0
- package/lib/commonjs/platforms/aws/stacks.d.ts +7 -0
- package/lib/commonjs/platforms/aws/stacks.js +91 -0
- package/lib/commonjs/platforms/aws/stacks.js.map +1 -0
- package/lib/commonjs/platforms/aws/teardown.d.ts +2 -0
- package/lib/commonjs/platforms/aws/teardown.js +59 -0
- package/lib/commonjs/platforms/aws/teardown.js.map +1 -0
- package/lib/commonjs/platforms/aws/viewsSync.d.ts +2 -0
- package/lib/commonjs/platforms/aws/viewsSync.js +39 -0
- package/lib/commonjs/platforms/aws/viewsSync.js.map +1 -0
- package/lib/commonjs/platforms/docker/go.d.ts +2 -0
- package/lib/commonjs/platforms/docker/go.js +160 -0
- package/lib/commonjs/platforms/docker/go.js.map +1 -0
- package/lib/commonjs/platforms/docker/index.d.ts +2 -0
- package/lib/commonjs/platforms/docker/index.js +27 -0
- package/lib/commonjs/platforms/docker/index.js.map +1 -0
- package/lib/commonjs/platforms/index.d.ts +4 -0
- package/lib/commonjs/platforms/index.js +39 -0
- package/lib/commonjs/platforms/index.js.map +1 -0
- package/lib/commonjs/platforms/types.d.ts +16 -0
- package/lib/commonjs/platforms/types.js +9 -0
- package/lib/commonjs/platforms/types.js.map +1 -0
- package/lib/esm/bin/qpq.d.ts +2 -0
- package/lib/esm/bin/qpq.js +4 -0
- package/lib/esm/bin/qpq.js.map +1 -0
- package/lib/esm/bin/qpqCdkApp.d.ts +1 -0
- package/lib/esm/bin/qpqCdkApp.js +6 -0
- package/lib/esm/bin/qpqCdkApp.js.map +1 -0
- package/lib/esm/cli/index.d.ts +1 -0
- package/lib/esm/cli/index.js +2 -0
- package/lib/esm/cli/index.js.map +1 -0
- package/lib/esm/cli/runCli.d.ts +1 -0
- package/lib/esm/cli/runCli.js +67 -0
- package/lib/esm/cli/runCli.js.map +1 -0
- package/lib/esm/commands/go.d.ts +1 -0
- package/lib/esm/commands/go.js +15 -0
- package/lib/esm/commands/go.js.map +1 -0
- package/lib/esm/commands/goDev.d.ts +1 -0
- package/lib/esm/commands/goDev.js +127 -0
- package/lib/esm/commands/goDev.js.map +1 -0
- package/lib/esm/commands/goDevWeb.d.ts +1 -0
- package/lib/esm/commands/goDevWeb.js +107 -0
- package/lib/esm/commands/goDevWeb.js.map +1 -0
- package/lib/esm/commands/goDocker.d.ts +1 -0
- package/lib/esm/commands/goDocker.js +19 -0
- package/lib/esm/commands/goDocker.js.map +1 -0
- package/lib/esm/commands/hooks.d.ts +1 -0
- package/lib/esm/commands/hooks.js +13 -0
- package/lib/esm/commands/hooks.js.map +1 -0
- package/lib/esm/commands/prep.d.ts +1 -0
- package/lib/esm/commands/prep.js +15 -0
- package/lib/esm/commands/prep.js.map +1 -0
- package/lib/esm/commands/publish.d.ts +4 -0
- package/lib/esm/commands/publish.js +38 -0
- package/lib/esm/commands/publish.js.map +1 -0
- package/lib/esm/commands/synth.d.ts +1 -0
- package/lib/esm/commands/synth.js +63 -0
- package/lib/esm/commands/synth.js.map +1 -0
- package/lib/esm/commands/teardown.d.ts +1 -0
- package/lib/esm/commands/teardown.js +20 -0
- package/lib/esm/commands/teardown.js.map +1 -0
- package/lib/esm/index.d.ts +1 -0
- package/lib/esm/index.js +2 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/lib/args.d.ts +2 -0
- package/lib/esm/lib/args.js +16 -0
- package/lib/esm/lib/args.js.map +1 -0
- package/lib/esm/lib/deployEnv.d.ts +6 -0
- package/lib/esm/lib/deployEnv.js +60 -0
- package/lib/esm/lib/deployEnv.js.map +1 -0
- package/lib/esm/lib/deployPrompts.d.ts +25 -0
- package/lib/esm/lib/deployPrompts.js +69 -0
- package/lib/esm/lib/deployPrompts.js.map +1 -0
- package/lib/esm/lib/devServerEntry.d.ts +1 -0
- package/lib/esm/lib/devServerEntry.js +46 -0
- package/lib/esm/lib/devServerEntry.js.map +1 -0
- package/lib/esm/lib/discovery.d.ts +10 -0
- package/lib/esm/lib/discovery.js +40 -0
- package/lib/esm/lib/discovery.js.map +1 -0
- package/lib/esm/lib/hooks.d.ts +2 -0
- package/lib/esm/lib/hooks.js +27 -0
- package/lib/esm/lib/hooks.js.map +1 -0
- package/lib/esm/lib/packageRoot.d.ts +1 -0
- package/lib/esm/lib/packageRoot.js +14 -0
- package/lib/esm/lib/packageRoot.js.map +1 -0
- package/lib/esm/lib/prompts.d.ts +3 -0
- package/lib/esm/lib/prompts.js +16 -0
- package/lib/esm/lib/prompts.js.map +1 -0
- package/lib/esm/lib/qpqConfigs.d.ts +3 -0
- package/lib/esm/lib/qpqConfigs.js +14 -0
- package/lib/esm/lib/qpqConfigs.js.map +1 -0
- package/lib/esm/lib/resolveAppSelection.d.ts +6 -0
- package/lib/esm/lib/resolveAppSelection.js +45 -0
- package/lib/esm/lib/resolveAppSelection.js.map +1 -0
- package/lib/esm/lib/rspackRun.d.ts +2 -0
- package/lib/esm/lib/rspackRun.js +19 -0
- package/lib/esm/lib/rspackRun.js.map +1 -0
- package/lib/esm/lib/runCommand.d.ts +13 -0
- package/lib/esm/lib/runCommand.js +69 -0
- package/lib/esm/lib/runCommand.js.map +1 -0
- package/lib/esm/lib/runTasks.d.ts +10 -0
- package/lib/esm/lib/runTasks.js +28 -0
- package/lib/esm/lib/runTasks.js.map +1 -0
- package/lib/esm/lib/timing.d.ts +2 -0
- package/lib/esm/lib/timing.js +6 -0
- package/lib/esm/lib/timing.js.map +1 -0
- package/lib/esm/lib/views.d.ts +2 -0
- package/lib/esm/lib/views.js +15 -0
- package/lib/esm/lib/views.js.map +1 -0
- package/lib/esm/platforms/aws/awsCredentials.d.ts +1 -0
- package/lib/esm/platforms/aws/awsCredentials.js +15 -0
- package/lib/esm/platforms/aws/awsCredentials.js.map +1 -0
- package/lib/esm/platforms/aws/cdkApp.d.ts +2 -0
- package/lib/esm/platforms/aws/cdkApp.js +11 -0
- package/lib/esm/platforms/aws/cdkApp.js.map +1 -0
- package/lib/esm/platforms/aws/go.d.ts +2 -0
- package/lib/esm/platforms/aws/go.js +100 -0
- package/lib/esm/platforms/aws/go.js.map +1 -0
- package/lib/esm/platforms/aws/goDocker.d.ts +2 -0
- package/lib/esm/platforms/aws/goDocker.js +271 -0
- package/lib/esm/platforms/aws/goDocker.js.map +1 -0
- package/lib/esm/platforms/aws/identity.d.ts +2 -0
- package/lib/esm/platforms/aws/identity.js +22 -0
- package/lib/esm/platforms/aws/identity.js.map +1 -0
- package/lib/esm/platforms/aws/index.d.ts +2 -0
- package/lib/esm/platforms/aws/index.js +16 -0
- package/lib/esm/platforms/aws/index.js.map +1 -0
- package/lib/esm/platforms/aws/publish.d.ts +4 -0
- package/lib/esm/platforms/aws/publish.js +50 -0
- package/lib/esm/platforms/aws/publish.js.map +1 -0
- package/lib/esm/platforms/aws/remote.d.ts +11 -0
- package/lib/esm/platforms/aws/remote.js +90 -0
- package/lib/esm/platforms/aws/remote.js.map +1 -0
- package/lib/esm/platforms/aws/stacks.d.ts +7 -0
- package/lib/esm/platforms/aws/stacks.js +69 -0
- package/lib/esm/platforms/aws/stacks.js.map +1 -0
- package/lib/esm/platforms/aws/teardown.d.ts +2 -0
- package/lib/esm/platforms/aws/teardown.js +46 -0
- package/lib/esm/platforms/aws/teardown.js.map +1 -0
- package/lib/esm/platforms/aws/viewsSync.d.ts +2 -0
- package/lib/esm/platforms/aws/viewsSync.js +25 -0
- package/lib/esm/platforms/aws/viewsSync.js.map +1 -0
- package/lib/esm/platforms/docker/go.d.ts +2 -0
- package/lib/esm/platforms/docker/go.js +143 -0
- package/lib/esm/platforms/docker/go.js.map +1 -0
- package/lib/esm/platforms/docker/index.d.ts +2 -0
- package/lib/esm/platforms/docker/index.js +15 -0
- package/lib/esm/platforms/docker/index.js.map +1 -0
- package/lib/esm/platforms/index.d.ts +4 -0
- package/lib/esm/platforms/index.js +20 -0
- package/lib/esm/platforms/index.js.map +1 -0
- package/lib/esm/platforms/types.d.ts +16 -0
- package/lib/esm/platforms/types.js +6 -0
- package/lib/esm/platforms/types.js.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goDev.js","sourceRoot":"","sources":["../../../src/commands/goDev.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:dev` — boots the QPQ local dev server. Resolves the app, generates\n// the dev-server entry, builds the rspack config, then runs rspack in watch\n// mode, restarting the server process on every successful rebuild.\n//\n// The one thing NOT hot-reloaded is the qpq configs themselves: each service's\n// infrastructure.ts is evaluated once at launch and baked into the\n// `quidproquo-dynamic-loader` virtual module — config changes need a full\n// `go:dev` restart.\nimport { getAppServiceQpqConfigs, getDevServerRspackConfig } from 'quidproquo-deploy-rspack';\n\nimport { ChildProcess, execSync, spawn } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport { rspack } from '@rspack/core';\n\nimport { primeDeployEnvFromConfig } from '../lib/deployEnv';\nimport { writeDevServerEntry } from '../lib/devServerEntry';\nimport { getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\n// 8080/8888 are set in the generated entry; 3001 is the quidproquo-dev-server\n// file-storage (secure URL) default port.\nconst DEV_SERVER_PORTS = [8080, 8888, 3001];\nconst DEV_SERVER_BUNDLE_PATH = path.join('dist', 'qpq', 'dev-server', 'main.js');\n\n// Pre-start sweep: a previous `go:dev` whose wrapper died without killing its\n// child (closed terminal, SIGKILL) leaves an orphaned server process holding\n// the dev ports, and the next launch dies with EADDRINUSE. Before starting,\n// kill any listener on those ports that is running the dev-server bundle.\n// Anything else on the ports is left alone and reported — it's not ours.\nconst killStaleDevServers = (): void => {\n for (const port of DEV_SERVER_PORTS) {\n let pids: number[] = [];\n try {\n pids = execSync(`lsof -t -iTCP:${port} -sTCP:LISTEN`, {\n stdio: ['ignore', 'pipe', 'ignore'],\n })\n .toString()\n .split('\\n')\n .map((line) => Number(line.trim()))\n .filter(Boolean);\n } catch {\n continue; // lsof exits non-zero when nothing is listening\n }\n\n for (const pid of pids) {\n let command = '';\n try {\n command = execSync(`ps -p ${pid} -o command=`).toString().trim();\n } catch {\n continue; // already gone\n }\n if (command.includes(DEV_SERVER_BUNDLE_PATH)) {\n console.log(`Killing stale dev server on port ${port} (pid ${pid})`);\n process.kill(pid);\n } else {\n console.warn(`Port ${port} is in use by an unrelated process (pid ${pid}: ${command}) — not killing it.`);\n }\n }\n }\n};\n\nexport const goDevCommand = async (argv: string[]): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n process.env.QPQ_DEV_APP = appName;\n primeDeployEnvFromConfig(appName);\n console.log(`Dev server for app [${appName}]`);\n\n killStaleDevServers();\n\n const qpqConfigs = getAppServiceQpqConfigs(root, appName);\n const entry = writeDevServerEntry(root, appName);\n const rspackConfig = getDevServerRspackConfig({ root, entry, qpqConfigs });\n const bundlePath = path.join(root, DEV_SERVER_BUNDLE_PATH);\n const env = { ...process.env, QPQ_DEV_APP: appName };\n\n // The long-lived server process (HTTP 8080 / WS 8888), restarted per rebuild.\n let child: ChildProcess | null = null;\n let restartQueued = false;\n\n const startServer = (): void => {\n child = spawn('node', [bundlePath], { stdio: 'inherit', env });\n child.on('exit', (code) => {\n child = null;\n if (!restartQueued) {\n // Crashed (or exited) on its own — leave it down; the next successful\n // rebuild (i.e. the next file save) brings it back up.\n console.log(`Dev server exited with code ${code}. Save a file to restart it.`);\n }\n });\n };\n\n const restartServer = (): void => {\n if (restartQueued) return;\n if (!child) {\n startServer();\n return;\n }\n restartQueued = true;\n child.once('exit', () => {\n restartQueued = false;\n startServer();\n });\n child.kill();\n };\n\n console.log('Bundling dev server (watch mode)...');\n let lastHash: string | null | undefined;\n const compiler = rspack(rspackConfig);\n compiler.watch({ aggregateTimeout: 200 }, (err, stats) => {\n if (err) {\n console.error(err);\n return;\n }\n if (stats?.hasErrors()) {\n console.error(stats.toString({ colors: true, chunks: false, modules: false }));\n console.log('Build failed — dev server not restarted. Fix the error and save again.');\n return;\n }\n // Skip no-op rebuilds (e.g. the virtual-module-triggered second compile at\n // startup): only restart when the output actually changed.\n if (stats?.hash === lastHash && child) {\n return;\n }\n lastHash = stats?.hash;\n console.log(child ? 'Rebuilt. Restarting dev server...' : 'Dev server bundled. Starting...');\n restartServer();\n });\n\n process.on('SIGINT', () => {\n restartQueued = true; // suppress the crash log / rebuild-restart on our own kill\n child?.kill();\n compiler.close(() => process.exit(0));\n });\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const goDevWebCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// `qpq go:dev:web` — boots every views microfrontend's Rspack dev server
|
|
2
|
+
// in-process (shell is the MF host app, plus all remotes on their own ports).
|
|
3
|
+
// Everything is served dynamically; remotes resolve at runtime via
|
|
4
|
+
// mf-manifest.json on localhost ports. Programmatic — no per-views
|
|
5
|
+
// rspack.config.ts or npm serve script needed.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// qpq go:dev:web
|
|
9
|
+
// qpq go:dev:web --only shell,design
|
|
10
|
+
// qpq go:dev:web --app <name>
|
|
11
|
+
import { getAllViews, getViewsRspackConfig } from 'quidproquo-deploy-rspack';
|
|
12
|
+
import http from 'http';
|
|
13
|
+
import { rspack } from '@rspack/core';
|
|
14
|
+
import { RspackDevServer } from '@rspack/dev-server';
|
|
15
|
+
import { getArgValue } from '../lib/args';
|
|
16
|
+
import { primeDeployEnvFromConfig } from '../lib/deployEnv';
|
|
17
|
+
import { getRoot } from '../lib/discovery';
|
|
18
|
+
import { resolveAppSelection } from '../lib/resolveAppSelection';
|
|
19
|
+
export const goDevWebCommand = async (argv) => {
|
|
20
|
+
const root = getRoot();
|
|
21
|
+
const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });
|
|
22
|
+
process.env.LOCAL_DEV_SERVER = 'true';
|
|
23
|
+
process.env.NODE_ENV = 'development';
|
|
24
|
+
primeDeployEnvFromConfig(appName);
|
|
25
|
+
const only = getArgValue(argv, '--only')
|
|
26
|
+
?.split(',')
|
|
27
|
+
.map((s) => s.trim());
|
|
28
|
+
let views = getAllViews(root, appName);
|
|
29
|
+
if (only)
|
|
30
|
+
views = views.filter((v) => only.includes(v.service));
|
|
31
|
+
if (views.length === 0) {
|
|
32
|
+
console.error('No views projects found.');
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// Every RspackDevServer.start() registers its own SIGINT/SIGTERM handler on
|
|
36
|
+
// process — with a dozen views servers in one process that trips node's
|
|
37
|
+
// default 10-listener warning. Size the limit to the fleet.
|
|
38
|
+
process.setMaxListeners(Math.max(process.getMaxListeners(), views.length * 2 + 10));
|
|
39
|
+
// Service names are padded to a common width so the "(started)" chips align.
|
|
40
|
+
const serviceColumnWidth = Math.max(...views.map((v) => v.service.length));
|
|
41
|
+
console.log(`Starting ${views.length} views dev servers for [${appName}]:`);
|
|
42
|
+
for (const v of views)
|
|
43
|
+
console.log(` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)}`);
|
|
44
|
+
const servers = [];
|
|
45
|
+
let shuttingDown = false;
|
|
46
|
+
const shutdown = (code) => {
|
|
47
|
+
if (shuttingDown)
|
|
48
|
+
return;
|
|
49
|
+
shuttingDown = true;
|
|
50
|
+
Promise.allSettled(servers.map((server) => server.stop())).then(() => process.exit(code));
|
|
51
|
+
};
|
|
52
|
+
// The URL list above gets a yellow "(started)" chip appended in place as
|
|
53
|
+
// each dev server begins answering HTTP. The in-place rewrite moves the
|
|
54
|
+
// cursor up past everything printed since the list, so every line printed
|
|
55
|
+
// below it MUST go through logBelowList to keep the offset accurate.
|
|
56
|
+
let linesBelowList = 0;
|
|
57
|
+
const logBelowList = (line) => {
|
|
58
|
+
console.log(line);
|
|
59
|
+
linesBelowList += 1;
|
|
60
|
+
};
|
|
61
|
+
const markStarted = (index) => {
|
|
62
|
+
const v = views[index];
|
|
63
|
+
if (!process.stdout.isTTY) {
|
|
64
|
+
logBelowList(` ${v.service} started`);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const line = ` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)} \x1b[33m(started)\x1b[0m`;
|
|
68
|
+
const up = linesBelowList + (views.length - index);
|
|
69
|
+
process.stdout.write(`\x1b[${up}F\x1b[2K${line}\x1b[${up}E`);
|
|
70
|
+
};
|
|
71
|
+
const pollUntilStarted = (index) => {
|
|
72
|
+
const attempt = () => {
|
|
73
|
+
if (shuttingDown)
|
|
74
|
+
return;
|
|
75
|
+
const req = http.get({
|
|
76
|
+
host: 'localhost',
|
|
77
|
+
port: views[index].port,
|
|
78
|
+
path: '/',
|
|
79
|
+
timeout: 1000,
|
|
80
|
+
}, (res) => {
|
|
81
|
+
res.resume();
|
|
82
|
+
markStarted(index);
|
|
83
|
+
});
|
|
84
|
+
req.on('error', () => setTimeout(attempt, 500));
|
|
85
|
+
req.on('timeout', () => req.destroy());
|
|
86
|
+
};
|
|
87
|
+
attempt();
|
|
88
|
+
};
|
|
89
|
+
for (const [index, view] of views.entries()) {
|
|
90
|
+
const config = getViewsRspackConfig(view.viewsDir);
|
|
91
|
+
const compiler = rspack(config);
|
|
92
|
+
const server = new RspackDevServer(config.devServer || { port: view.port }, compiler);
|
|
93
|
+
servers.push(server);
|
|
94
|
+
try {
|
|
95
|
+
await server.start();
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
logBelowList(` [${view.service}] failed to start: ${e.message} — shutting down all views servers.`);
|
|
99
|
+
shutdown(1);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
pollUntilStarted(index);
|
|
103
|
+
}
|
|
104
|
+
process.on('SIGINT', () => shutdown(0));
|
|
105
|
+
process.on('SIGTERM', () => shutdown(0));
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=goDevWeb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goDevWeb.js","sourceRoot":"","sources":["../../../src/commands/goDevWeb.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq go:dev:web` — boots every views microfrontend's Rspack dev server\n// in-process (shell is the MF host app, plus all remotes on their own ports).\n// Everything is served dynamically; remotes resolve at runtime via\n// mf-manifest.json on localhost ports. Programmatic — no per-views\n// rspack.config.ts or npm serve script needed.\n//\n// Usage:\n// qpq go:dev:web\n// qpq go:dev:web --only shell,design\n// qpq go:dev:web --app <name>\nimport { getAllViews, getViewsRspackConfig } from 'quidproquo-deploy-rspack';\n\nimport http from 'http';\nimport { rspack } from '@rspack/core';\nimport { RspackDevServer } from '@rspack/dev-server';\n\nimport { getArgValue } from '../lib/args';\nimport { primeDeployEnvFromConfig } from '../lib/deployEnv';\nimport { getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nexport const goDevWebCommand = async (argv: string[]): Promise<void> => {\n const root = getRoot();\n const appName = await resolveAppSelection({ argv, envVar: 'QPQ_DEV_APP' });\n\n process.env.LOCAL_DEV_SERVER = 'true';\n process.env.NODE_ENV = 'development';\n primeDeployEnvFromConfig(appName);\n\n const only = getArgValue(argv, '--only')\n ?.split(',')\n .map((s) => s.trim());\n\n let views = getAllViews(root, appName);\n if (only) views = views.filter((v) => only.includes(v.service));\n if (views.length === 0) {\n console.error('No views projects found.');\n process.exit(1);\n }\n\n // Every RspackDevServer.start() registers its own SIGINT/SIGTERM handler on\n // process — with a dozen views servers in one process that trips node's\n // default 10-listener warning. Size the limit to the fleet.\n process.setMaxListeners(Math.max(process.getMaxListeners(), views.length * 2 + 10));\n\n // Service names are padded to a common width so the \"(started)\" chips align.\n const serviceColumnWidth = Math.max(...views.map((v) => v.service.length));\n\n console.log(`Starting ${views.length} views dev servers for [${appName}]:`);\n for (const v of views) console.log(` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)}`);\n\n const servers: RspackDevServer[] = [];\n let shuttingDown = false;\n\n const shutdown = (code: number): void => {\n if (shuttingDown) return;\n shuttingDown = true;\n Promise.allSettled(servers.map((server) => server.stop())).then(() => process.exit(code));\n };\n\n // The URL list above gets a yellow \"(started)\" chip appended in place as\n // each dev server begins answering HTTP. The in-place rewrite moves the\n // cursor up past everything printed since the list, so every line printed\n // below it MUST go through logBelowList to keep the offset accurate.\n let linesBelowList = 0;\n\n const logBelowList = (line: string): void => {\n console.log(line);\n linesBelowList += 1;\n };\n\n const markStarted = (index: number): void => {\n const v = views[index];\n if (!process.stdout.isTTY) {\n logBelowList(` ${v.service} started`);\n return;\n }\n const line = ` http://localhost:${v.port} ${v.service.padEnd(serviceColumnWidth)} \\x1b[33m(started)\\x1b[0m`;\n const up = linesBelowList + (views.length - index);\n process.stdout.write(`\\x1b[${up}F\\x1b[2K${line}\\x1b[${up}E`);\n };\n\n const pollUntilStarted = (index: number): void => {\n const attempt = (): void => {\n if (shuttingDown) return;\n const req = http.get(\n {\n host: 'localhost',\n port: views[index].port,\n path: '/',\n timeout: 1000,\n },\n (res) => {\n res.resume();\n markStarted(index);\n },\n );\n req.on('error', () => setTimeout(attempt, 500));\n req.on('timeout', () => req.destroy());\n };\n attempt();\n };\n\n for (const [index, view] of views.entries()) {\n const config = getViewsRspackConfig(view.viewsDir);\n const compiler = rspack(config);\n const server = new RspackDevServer(config.devServer || { port: view.port }, compiler);\n servers.push(server);\n\n try {\n await server.start();\n } catch (e) {\n logBelowList(` [${view.service}] failed to start: ${(e as Error).message} — shutting down all views servers.`);\n shutdown(1);\n return;\n }\n\n pollUntilStarted(index);\n }\n\n process.on('SIGINT', () => shutdown(0));\n process.on('SIGTERM', () => shutdown(0));\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const goDockerCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// `qpq go:docker` — asks the same questions as `qpq go`, then runs the
|
|
2
|
+
// platform driver's parallel containerized deploy (drivers without a docker
|
|
3
|
+
// strategy don't offer one).
|
|
4
|
+
import { resolveDeployEnvironment } from '../lib/deployEnv';
|
|
5
|
+
import { promptDeployPlan } from '../lib/deployPrompts';
|
|
6
|
+
import { resolveAppSelection } from '../lib/resolveAppSelection';
|
|
7
|
+
import { getPlatformDriver } from '../platforms';
|
|
8
|
+
export const goDockerCommand = async (argv) => {
|
|
9
|
+
const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });
|
|
10
|
+
const { platform } = await resolveDeployEnvironment(argv, appName);
|
|
11
|
+
const driver = getPlatformDriver(platform);
|
|
12
|
+
if (!driver.goDocker) {
|
|
13
|
+
console.error(`Platform '${platform}' has no dockerized deploy — use qpq go instead.`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
const plan = await promptDeployPlan(appName);
|
|
17
|
+
await driver.goDocker(appName, plan);
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=goDocker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"goDocker.js","sourceRoot":"","sources":["../../../src/commands/goDocker.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,4EAA4E;AAC5E,6BAA6B;AAC7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,aAAa,QAAQ,kDAAkD,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE7C,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC","sourcesContent":["// `qpq go:docker` — asks the same questions as `qpq go`, then runs the\n// platform driver's parallel containerized deploy (drivers without a docker\n// strategy don't offer one).\nimport { resolveDeployEnvironment } from '../lib/deployEnv';\nimport { promptDeployPlan } from '../lib/deployPrompts';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { getPlatformDriver } from '../platforms';\n\nexport const goDockerCommand = async (argv: string[]): Promise<void> => {\n const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });\n const { platform } = await resolveDeployEnvironment(argv, appName);\n const driver = getPlatformDriver(platform);\n\n if (!driver.goDocker) {\n console.error(`Platform '${platform}' has no dockerized deploy — use qpq go instead.`);\n process.exit(1);\n }\n\n const plan = await promptDeployPlan(appName);\n\n await driver.goDocker(appName, plan);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const hooksCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// `qpq hooks <name>` — run the `qpq:<name>` script of every app that defines
|
|
2
|
+
// one (apps/<app>/package.json). Wire the root package.json's lifecycle to it,
|
|
3
|
+
// e.g. "postinstall": "qpq hooks postinstall".
|
|
4
|
+
import { runAppHookForAllApps } from '../lib/hooks';
|
|
5
|
+
export const hooksCommand = async (argv) => {
|
|
6
|
+
const [hook] = argv.filter((a) => !a.startsWith('--'));
|
|
7
|
+
if (!hook) {
|
|
8
|
+
console.error('Usage: qpq hooks <name> (runs qpq:<name> in every app that defines it)');
|
|
9
|
+
process.exit(1);
|
|
10
|
+
}
|
|
11
|
+
await runAppHookForAllApps(hook);
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/commands/hooks.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,+EAA+E;AAC/E,+CAA+C;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAEpD,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IAClE,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IAEvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACnC,CAAC,CAAC","sourcesContent":["// `qpq hooks <name>` — run the `qpq:<name>` script of every app that defines\n// one (apps/<app>/package.json). Wire the root package.json's lifecycle to it,\n// e.g. \"postinstall\": \"qpq hooks postinstall\".\nimport { runAppHookForAllApps } from '../lib/hooks';\n\nexport const hooksCommand = async (argv: string[]): Promise<void> => {\n const [hook] = argv.filter((a) => !a.startsWith('--'));\n\n if (!hook) {\n console.error('Usage: qpq hooks <name> (runs qpq:<name> in every app that defines it)');\n process.exit(1);\n }\n\n await runAppHookForAllApps(hook);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const prepCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// `qpq prep` — regenerates apps/<app>/tsconfig.federated.json (the TypeScript
|
|
2
|
+
// path aliases for cross-view federated imports). Run after adding/removing a
|
|
3
|
+
// `// federated.export` marker.
|
|
4
|
+
import { writeFederatedTsconfigForApp } from 'quidproquo-deploy-rspack';
|
|
5
|
+
import { getAvailableApps, getRoot } from '../lib/discovery';
|
|
6
|
+
import { resolveAppSelection } from '../lib/resolveAppSelection';
|
|
7
|
+
export const prepCommand = async (argv) => {
|
|
8
|
+
const selection = await resolveAppSelection({ argv, allowAll: true });
|
|
9
|
+
const appNames = selection === 'all' ? getAvailableApps() : [selection];
|
|
10
|
+
for (const appName of appNames) {
|
|
11
|
+
const exposeCount = writeFederatedTsconfigForApp(getRoot(), appName);
|
|
12
|
+
console.log(`prep: wrote ${exposeCount} federated aliases to apps/${appName}/tsconfig.federated.json`);
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=prep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prep.js","sourceRoot":"","sources":["../../../src/commands/prep.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,8EAA8E;AAC9E,gCAAgC;AAChC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACjE,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAExE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,4BAA4B,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,8BAA8B,OAAO,0BAA0B,CAAC,CAAC;IACzG,CAAC;AACH,CAAC,CAAC","sourcesContent":["// `qpq prep` — regenerates apps/<app>/tsconfig.federated.json (the TypeScript\n// path aliases for cross-view federated imports). Run after adding/removing a\n// `// federated.export` marker.\nimport { writeFederatedTsconfigForApp } from 'quidproquo-deploy-rspack';\n\nimport { getAvailableApps, getRoot } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nexport const prepCommand = async (argv: string[]): Promise<void> => {\n const selection = await resolveAppSelection({ argv, allowAll: true });\n const appNames = selection === 'all' ? getAvailableApps() : [selection];\n\n for (const appName of appNames) {\n const exposeCount = writeFederatedTsconfigForApp(getRoot(), appName);\n console.log(`prep: wrote ${exposeCount} federated aliases to apps/${appName}/tsconfig.federated.json`);\n }\n};\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const publishCommand: (argv: string[]) => Promise<void>;
|
|
2
|
+
export declare const publishBuildCommand: (argv: string[]) => Promise<void>;
|
|
3
|
+
export declare const publishUploadCommand: (argv: string[]) => Promise<void>;
|
|
4
|
+
export declare const publishDeployCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// `qpq publish[:build|:upload|:deploy]` — build each backend service as a
|
|
2
|
+
// module-federation remote and publish it into the platform's federated code
|
|
3
|
+
// store, so the deployed backends federate their story code instead of running
|
|
4
|
+
// the bundled copy. The mechanics live in the platform driver (AWS: S3-backed,
|
|
5
|
+
// see platforms/aws/publish).
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// qpq publish --app docgen (all services)
|
|
9
|
+
// qpq publish --app docgen --service template
|
|
10
|
+
import { getArgValue } from '../lib/args';
|
|
11
|
+
import { resolveDeployEnvironment } from '../lib/deployEnv';
|
|
12
|
+
import { getServiceNames } from '../lib/discovery';
|
|
13
|
+
import { resolveAppSelection } from '../lib/resolveAppSelection';
|
|
14
|
+
import { getPlatformDriver } from '../platforms';
|
|
15
|
+
const resolvePublishSelection = async (argv) => {
|
|
16
|
+
const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });
|
|
17
|
+
const { platform } = await resolveDeployEnvironment(argv, appName);
|
|
18
|
+
const requestedService = getArgValue(argv, '--service');
|
|
19
|
+
const serviceNames = requestedService ? [requestedService] : getServiceNames(appName);
|
|
20
|
+
return { driver: getPlatformDriver(platform), appName, serviceNames };
|
|
21
|
+
};
|
|
22
|
+
export const publishCommand = async (argv) => {
|
|
23
|
+
const { driver, appName, serviceNames } = await resolvePublishSelection(argv);
|
|
24
|
+
await driver.publish(appName, serviceNames);
|
|
25
|
+
};
|
|
26
|
+
export const publishBuildCommand = async (argv) => {
|
|
27
|
+
const { driver, appName, serviceNames } = await resolvePublishSelection(argv);
|
|
28
|
+
await driver.publishBuild(appName, serviceNames);
|
|
29
|
+
};
|
|
30
|
+
export const publishUploadCommand = async (argv) => {
|
|
31
|
+
const { driver, appName, serviceNames } = await resolvePublishSelection(argv);
|
|
32
|
+
await driver.publishUpload(appName, serviceNames);
|
|
33
|
+
};
|
|
34
|
+
export const publishDeployCommand = async (argv) => {
|
|
35
|
+
const { driver, appName, serviceNames } = await resolvePublishSelection(argv);
|
|
36
|
+
await driver.publishDeploy(appName, serviceNames);
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=publish.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6EAA6E;AAC7E,+EAA+E;AAC/E,+EAA+E;AAC/E,8BAA8B;AAC9B,EAAE;AACF,SAAS;AACT,+DAA+D;AAC/D,gDAAgD;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAqB,MAAM,cAAc,CAAC;AAQpE,MAAM,uBAAuB,GAAG,KAAK,EAAE,IAAc,EAA6B,EAAE;IAClF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAEnE,MAAM,gBAAgB,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IAEtF,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACpE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACzE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IAC1E,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,uBAAuB,CAAC,IAAI,CAAC,CAAC;IAC9E,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;AACpD,CAAC,CAAC","sourcesContent":["// `qpq publish[:build|:upload|:deploy]` — build each backend service as a\n// module-federation remote and publish it into the platform's federated code\n// store, so the deployed backends federate their story code instead of running\n// the bundled copy. The mechanics live in the platform driver (AWS: S3-backed,\n// see platforms/aws/publish).\n//\n// Usage:\n// qpq publish --app docgen (all services)\n// qpq publish --app docgen --service template\nimport { getArgValue } from '../lib/args';\nimport { resolveDeployEnvironment } from '../lib/deployEnv';\nimport { getServiceNames } from '../lib/discovery';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { getPlatformDriver, QpqPlatformDriver } from '../platforms';\n\ntype PublishSelection = {\n driver: QpqPlatformDriver;\n appName: string;\n serviceNames: string[];\n};\n\nconst resolvePublishSelection = async (argv: string[]): Promise<PublishSelection> => {\n const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });\n const { platform } = await resolveDeployEnvironment(argv, appName);\n\n const requestedService = getArgValue(argv, '--service');\n const serviceNames = requestedService ? [requestedService] : getServiceNames(appName);\n\n return { driver: getPlatformDriver(platform), appName, serviceNames };\n};\n\nexport const publishCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publish(appName, serviceNames);\n};\n\nexport const publishBuildCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publishBuild(appName, serviceNames);\n};\n\nexport const publishUploadCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publishUpload(appName, serviceNames);\n};\n\nexport const publishDeployCommand = async (argv: string[]): Promise<void> => {\n const { driver, appName, serviceNames } = await resolvePublishSelection(argv);\n await driver.publishDeploy(appName, serviceNames);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const synthCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// `qpq synth [service]` — synthesizes each backend service's QPQ config to
|
|
2
|
+
// dist/apps/<app>/infrastructure/<module>-config.json.
|
|
3
|
+
//
|
|
4
|
+
// Runs with ts-node hooks registered (see runCli), which transpiles each
|
|
5
|
+
// service's infrastructure.ts on require. Cross-package `@scope/*` imports
|
|
6
|
+
// resolve through the workspace node_modules symlinks to already-built dist.
|
|
7
|
+
import { qpqCoreUtils } from 'quidproquo-core';
|
|
8
|
+
import fs from 'fs';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { getPositionalArgs } from '../lib/args';
|
|
11
|
+
import { primeDeployEnvFromConfig } from '../lib/deployEnv';
|
|
12
|
+
import { getAvailableApps, getRoot, getServiceNamesWithSubdir } from '../lib/discovery';
|
|
13
|
+
import { loadServiceQpqConfig } from '../lib/qpqConfigs';
|
|
14
|
+
import { resolveAppSelection } from '../lib/resolveAppSelection';
|
|
15
|
+
const processConfig = (folderName, appName) => {
|
|
16
|
+
console.log(`Processing infrastructure: [${folderName}] for app [${appName}]`);
|
|
17
|
+
const qpqConfig = loadServiceQpqConfig(appName, folderName);
|
|
18
|
+
const moduleName = qpqCoreUtils.getApplicationModuleName(qpqConfig);
|
|
19
|
+
const directoryPath = path.join(getRoot(), 'dist', 'apps', appName, 'infrastructure');
|
|
20
|
+
fs.mkdirSync(directoryPath, { recursive: true });
|
|
21
|
+
fs.writeFileSync(path.join(directoryPath, `${moduleName}-config.json`), JSON.stringify(qpqConfig, null, 2));
|
|
22
|
+
console.log(` -> ${appName}/infrastructure/${moduleName}-config.json`);
|
|
23
|
+
};
|
|
24
|
+
export const synthCommand = async (argv) => {
|
|
25
|
+
const [specifiedServiceName] = getPositionalArgs(argv, ['--app', '--env']);
|
|
26
|
+
const hasExplicitApp = argv.includes('--app') || argv.some((a) => a.startsWith('--app=')) || !!process.env.npm_config_app || !!process.env.DEPLOY_APP_NAME;
|
|
27
|
+
let appNames;
|
|
28
|
+
if (specifiedServiceName && !hasExplicitApp) {
|
|
29
|
+
// A bare service name is unambiguous — synth it in whichever app owns it.
|
|
30
|
+
const appWithService = getAvailableApps().find((appName) => getServiceNamesWithSubdir(appName, 'service').includes(specifiedServiceName));
|
|
31
|
+
if (!appWithService) {
|
|
32
|
+
console.error(`Service '${specifiedServiceName}' not found in any app`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
appNames = [appWithService];
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const selection = await resolveAppSelection({
|
|
39
|
+
argv,
|
|
40
|
+
envVar: 'DEPLOY_APP_NAME',
|
|
41
|
+
allowAll: true,
|
|
42
|
+
});
|
|
43
|
+
appNames = selection === 'all' ? getAvailableApps() : [selection];
|
|
44
|
+
}
|
|
45
|
+
console.log(`QPQ synthesizing apps: ${appNames.join(', ')}`);
|
|
46
|
+
for (const appName of appNames) {
|
|
47
|
+
// Service configs read ENVIRONMENT / AWS_DEFAULT_* at require time. When
|
|
48
|
+
// invoked inside a deploy they're already primed; standalone synth primes
|
|
49
|
+
// them from deploy.config.json (development default).
|
|
50
|
+
primeDeployEnvFromConfig(appName);
|
|
51
|
+
const serviceNames = specifiedServiceName ? [specifiedServiceName] : getServiceNamesWithSubdir(appName, 'service');
|
|
52
|
+
for (const folderName of serviceNames) {
|
|
53
|
+
try {
|
|
54
|
+
processConfig(folderName, appName);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error(`Failed to process ${folderName} in ${appName}:`, error);
|
|
58
|
+
process.exitCode = 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=synth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synth.js","sourceRoot":"","sources":["../../../src/commands/synth.ts"],"names":[],"mappings":"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","sourcesContent":["// `qpq synth [service]` — synthesizes each backend service's QPQ config to\n// dist/apps/<app>/infrastructure/<module>-config.json.\n//\n// Runs with ts-node hooks registered (see runCli), which transpiles each\n// service's infrastructure.ts on require. Cross-package `@scope/*` imports\n// resolve through the workspace node_modules symlinks to already-built dist.\nimport { qpqCoreUtils } from 'quidproquo-core';\n\nimport fs from 'fs';\nimport path from 'path';\n\nimport { getPositionalArgs } from '../lib/args';\nimport { primeDeployEnvFromConfig } from '../lib/deployEnv';\nimport { getAvailableApps, getRoot, getServiceNamesWithSubdir } from '../lib/discovery';\nimport { loadServiceQpqConfig } from '../lib/qpqConfigs';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\n\nconst processConfig = (folderName: string, appName: string): void => {\n console.log(`Processing infrastructure: [${folderName}] for app [${appName}]`);\n const qpqConfig = loadServiceQpqConfig(appName, folderName);\n const moduleName = qpqCoreUtils.getApplicationModuleName(qpqConfig);\n\n const directoryPath = path.join(getRoot(), 'dist', 'apps', appName, 'infrastructure');\n fs.mkdirSync(directoryPath, { recursive: true });\n fs.writeFileSync(path.join(directoryPath, `${moduleName}-config.json`), JSON.stringify(qpqConfig, null, 2));\n console.log(` -> ${appName}/infrastructure/${moduleName}-config.json`);\n};\n\nexport const synthCommand = async (argv: string[]): Promise<void> => {\n const [specifiedServiceName] = getPositionalArgs(argv, ['--app', '--env']);\n\n const hasExplicitApp =\n argv.includes('--app') || argv.some((a) => a.startsWith('--app=')) || !!process.env.npm_config_app || !!process.env.DEPLOY_APP_NAME;\n\n let appNames: string[];\n if (specifiedServiceName && !hasExplicitApp) {\n // A bare service name is unambiguous — synth it in whichever app owns it.\n const appWithService = getAvailableApps().find((appName) => getServiceNamesWithSubdir(appName, 'service').includes(specifiedServiceName));\n if (!appWithService) {\n console.error(`Service '${specifiedServiceName}' not found in any app`);\n process.exit(1);\n }\n appNames = [appWithService];\n } else {\n const selection = await resolveAppSelection({\n argv,\n envVar: 'DEPLOY_APP_NAME',\n allowAll: true,\n });\n appNames = selection === 'all' ? getAvailableApps() : [selection];\n }\n\n console.log(`QPQ synthesizing apps: ${appNames.join(', ')}`);\n\n for (const appName of appNames) {\n // Service configs read ENVIRONMENT / AWS_DEFAULT_* at require time. When\n // invoked inside a deploy they're already primed; standalone synth primes\n // them from deploy.config.json (development default).\n primeDeployEnvFromConfig(appName);\n\n const serviceNames = specifiedServiceName ? [specifiedServiceName] : getServiceNamesWithSubdir(appName, 'service');\n\n for (const folderName of serviceNames) {\n try {\n processConfig(folderName, appName);\n } catch (error) {\n console.error(`Failed to process ${folderName} in ${appName}:`, error);\n process.exitCode = 1;\n }\n }\n }\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const teardownCommand: (argv: string[]) => Promise<void>;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// `qpq teardown` — interactive destroy, the counterpart of `qpq go`. Resolves
|
|
2
|
+
// the app + environment the same way, asks which services to tear down (with
|
|
3
|
+
// a typed confirmation — this deletes stored data), then hands off to the
|
|
4
|
+
// platform driver to destroy the web, api and inf stacks in that order.
|
|
5
|
+
import { resolveDeployEnvironment } from '../lib/deployEnv';
|
|
6
|
+
import { promptTeardownPlan } from '../lib/deployPrompts';
|
|
7
|
+
import { resolveAppSelection } from '../lib/resolveAppSelection';
|
|
8
|
+
import { getPlatformDriver } from '../platforms';
|
|
9
|
+
export const teardownCommand = async (argv) => {
|
|
10
|
+
const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });
|
|
11
|
+
const { platform } = await resolveDeployEnvironment(argv, appName);
|
|
12
|
+
const driver = getPlatformDriver(platform);
|
|
13
|
+
if (!driver.teardown) {
|
|
14
|
+
console.error(`The '${platform}' platform has no teardown strategy.`);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
const plan = await promptTeardownPlan(appName);
|
|
18
|
+
await driver.teardown(appName, plan);
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=teardown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../../src/commands/teardown.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,wEAAwE;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,IAAc,EAAiB,EAAE;IACrE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;IAC/E,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,wBAAwB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAE3C,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,QAAQ,QAAQ,sCAAsC,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAE/C,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC","sourcesContent":["// `qpq teardown` — interactive destroy, the counterpart of `qpq go`. Resolves\n// the app + environment the same way, asks which services to tear down (with\n// a typed confirmation — this deletes stored data), then hands off to the\n// platform driver to destroy the web, api and inf stacks in that order.\nimport { resolveDeployEnvironment } from '../lib/deployEnv';\nimport { promptTeardownPlan } from '../lib/deployPrompts';\nimport { resolveAppSelection } from '../lib/resolveAppSelection';\nimport { getPlatformDriver } from '../platforms';\n\nexport const teardownCommand = async (argv: string[]): Promise<void> => {\n const appName = await resolveAppSelection({ argv, envVar: 'DEPLOY_APP_NAME' });\n const { platform } = await resolveDeployEnvironment(argv, appName);\n const driver = getPlatformDriver(platform);\n\n if (!driver.teardown) {\n console.error(`The '${platform}' platform has no teardown strategy.`);\n process.exit(1);\n }\n\n const plan = await promptTeardownPlan(appName);\n\n await driver.teardown(appName, plan);\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './cli';
|
package/lib/esm/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,OAAO,CAAC","sourcesContent":["export * from './cli';\n"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Flag parsing over the command's argv (everything after the command name).
|
|
2
|
+
export const getArgValue = (argv, flag) => {
|
|
3
|
+
const eq = argv.find((a) => a.startsWith(`${flag}=`));
|
|
4
|
+
if (eq)
|
|
5
|
+
return eq.slice(`${flag}=`.length);
|
|
6
|
+
const idx = argv.indexOf(flag);
|
|
7
|
+
return idx >= 0 ? argv[idx + 1] : undefined;
|
|
8
|
+
};
|
|
9
|
+
// Positional args = non-flag args, skipping values consumed by known flags.
|
|
10
|
+
export const getPositionalArgs = (argv, valueFlags) => argv.filter((arg, index) => {
|
|
11
|
+
if (arg.startsWith('--'))
|
|
12
|
+
return false;
|
|
13
|
+
const previous = argv[index - 1];
|
|
14
|
+
return !(previous && valueFlags.includes(previous));
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/lib/args.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAc,EAAE,IAAY,EAAsB,EAAE;IAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;IACtD,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAc,EAAE,UAAoB,EAAY,EAAE,CAClF,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;IACzB,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC","sourcesContent":["// Flag parsing over the command's argv (everything after the command name).\nexport const getArgValue = (argv: string[], flag: string): string | undefined => {\n const eq = argv.find((a) => a.startsWith(`${flag}=`));\n if (eq) return eq.slice(`${flag}=`.length);\n const idx = argv.indexOf(flag);\n return idx >= 0 ? argv[idx + 1] : undefined;\n};\n\n// Positional args = non-flag args, skipping values consumed by known flags.\nexport const getPositionalArgs = (argv: string[], valueFlags: string[]): string[] =>\n argv.filter((arg, index) => {\n if (arg.startsWith('--')) return false;\n const previous = argv[index - 1];\n return !(previous && valueFlags.includes(previous));\n });\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const primeDeployEnvFromConfig: (appName: string, defaultEnvironment?: string) => void;
|
|
2
|
+
export interface ResolvedDeployEnvironment {
|
|
3
|
+
environment: string;
|
|
4
|
+
platform: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const resolveDeployEnvironment: (argv: string[], appName: string) => Promise<ResolvedDeployEnvironment>;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getQpqAppDeployConfig } from 'quidproquo-deploy-awscdk';
|
|
2
|
+
import { findPlatformDriver, getPlatformDriver, QpqDeployPlatform } from '../platforms';
|
|
3
|
+
import { getArgValue } from './args';
|
|
4
|
+
import { getRoot } from './discovery';
|
|
5
|
+
import { promptSelect } from './prompts';
|
|
6
|
+
// Best-effort identity priming for local dev/build commands (go:dev, synth):
|
|
7
|
+
// fills ENVIRONMENT and the platform driver's identity env vars from the app's
|
|
8
|
+
// deploy.config.json when they're unset — never prompts, never exits. Service
|
|
9
|
+
// configs read those env vars at load time, so this must run before any
|
|
10
|
+
// infrastructure.ts is required.
|
|
11
|
+
export const primeDeployEnvFromConfig = (appName, defaultEnvironment = 'development') => {
|
|
12
|
+
process.env.ENVIRONMENT = process.env.ENVIRONMENT || defaultEnvironment;
|
|
13
|
+
try {
|
|
14
|
+
const deployConfig = getQpqAppDeployConfig(getRoot(), appName);
|
|
15
|
+
const target = deployConfig.environments?.[process.env.ENVIRONMENT];
|
|
16
|
+
findPlatformDriver(target?.platform || QpqDeployPlatform.aws)?.primeDeployIdentity(target);
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// no deploy.config.json — fine for local dev
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
// Resolves the deploy identity for an app and primes the process environment
|
|
23
|
+
// with it. The app's deploy.config.json owns environment -> platform +
|
|
24
|
+
// identity (config-owned identity); already-set env vars win, so CI overrides
|
|
25
|
+
// and older setups keep working.
|
|
26
|
+
//
|
|
27
|
+
// Environment resolution: --env flag, then the sole configured environment,
|
|
28
|
+
// then an interactive prompt over the configured environments (a shell
|
|
29
|
+
// ENVIRONMENT is only the prompt's default, never a silent pick), then — for
|
|
30
|
+
// headless runs and configs without an environments map — ENVIRONMENT itself.
|
|
31
|
+
export const resolveDeployEnvironment = async (argv, appName) => {
|
|
32
|
+
const deployConfig = getQpqAppDeployConfig(getRoot(), appName);
|
|
33
|
+
const configuredEnvironments = Object.keys(deployConfig.environments ?? {});
|
|
34
|
+
let environment = getArgValue(argv, '--env');
|
|
35
|
+
if (!environment && configuredEnvironments.length === 1) {
|
|
36
|
+
environment = configuredEnvironments[0];
|
|
37
|
+
console.log(`Using environment: ${environment}`);
|
|
38
|
+
}
|
|
39
|
+
if (!environment && configuredEnvironments.length > 1 && process.stdin.isTTY) {
|
|
40
|
+
const defaultEnvironment = process.env.ENVIRONMENT && configuredEnvironments.includes(process.env.ENVIRONMENT) ? process.env.ENVIRONMENT : undefined;
|
|
41
|
+
environment = await promptSelect('Select environment', configuredEnvironments, defaultEnvironment);
|
|
42
|
+
}
|
|
43
|
+
if (!environment) {
|
|
44
|
+
environment = process.env.ENVIRONMENT;
|
|
45
|
+
}
|
|
46
|
+
if (!environment) {
|
|
47
|
+
console.error(`No environment selected — pass --env <name> or add "environments" to apps/${appName}/deploy.config.json`);
|
|
48
|
+
process.exit(1);
|
|
49
|
+
}
|
|
50
|
+
process.env.ENVIRONMENT = environment;
|
|
51
|
+
const target = deployConfig.environments?.[environment];
|
|
52
|
+
const platform = getArgValue(argv, '--platform') || target?.platform || QpqDeployPlatform.aws;
|
|
53
|
+
const missingIdentity = getPlatformDriver(platform).primeDeployIdentity(target);
|
|
54
|
+
if (missingIdentity.length > 0) {
|
|
55
|
+
console.error(`Deploy identity for environment '${environment}' (platform '${platform}') is incomplete — missing ${missingIdentity.join(', ')}. Add it to apps/${appName}/deploy.config.json under "environments".`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
return { environment, platform };
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=deployEnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deployEnv.js","sourceRoot":"","sources":["../../../src/lib/deployEnv.ts"],"names":[],"mappings":"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","sourcesContent":["import { getQpqAppDeployConfig } from 'quidproquo-deploy-awscdk';\n\nimport { findPlatformDriver, getPlatformDriver, QpqDeployPlatform } from '../platforms';\nimport { getArgValue } from './args';\nimport { getRoot } from './discovery';\nimport { promptSelect } from './prompts';\n\n// Best-effort identity priming for local dev/build commands (go:dev, synth):\n// fills ENVIRONMENT and the platform driver's identity env vars from the app's\n// deploy.config.json when they're unset — never prompts, never exits. Service\n// configs read those env vars at load time, so this must run before any\n// infrastructure.ts is required.\nexport const primeDeployEnvFromConfig = (appName: string, defaultEnvironment = 'development'): void => {\n process.env.ENVIRONMENT = process.env.ENVIRONMENT || defaultEnvironment;\n\n try {\n const deployConfig = getQpqAppDeployConfig(getRoot(), appName);\n const target = deployConfig.environments?.[process.env.ENVIRONMENT];\n\n findPlatformDriver(target?.platform || QpqDeployPlatform.aws)?.primeDeployIdentity(target);\n } catch {\n // no deploy.config.json — fine for local dev\n }\n};\n\nexport interface ResolvedDeployEnvironment {\n environment: string;\n // The deploy platform driver for this environment: --platform flag, then\n // the environment's \"platform\" in deploy.config.json, then aws.\n platform: string;\n}\n\n// Resolves the deploy identity for an app and primes the process environment\n// with it. The app's deploy.config.json owns environment -> platform +\n// identity (config-owned identity); already-set env vars win, so CI overrides\n// and older setups keep working.\n//\n// Environment resolution: --env flag, then the sole configured environment,\n// then an interactive prompt over the configured environments (a shell\n// ENVIRONMENT is only the prompt's default, never a silent pick), then — for\n// headless runs and configs without an environments map — ENVIRONMENT itself.\nexport const resolveDeployEnvironment = async (argv: string[], appName: string): Promise<ResolvedDeployEnvironment> => {\n const deployConfig = getQpqAppDeployConfig(getRoot(), appName);\n const configuredEnvironments = Object.keys(deployConfig.environments ?? {});\n\n let environment = getArgValue(argv, '--env');\n\n if (!environment && configuredEnvironments.length === 1) {\n environment = configuredEnvironments[0];\n console.log(`Using environment: ${environment}`);\n }\n\n if (!environment && configuredEnvironments.length > 1 && process.stdin.isTTY) {\n const defaultEnvironment =\n process.env.ENVIRONMENT && configuredEnvironments.includes(process.env.ENVIRONMENT) ? process.env.ENVIRONMENT : undefined;\n environment = await promptSelect('Select environment', configuredEnvironments, defaultEnvironment);\n }\n\n if (!environment) {\n environment = process.env.ENVIRONMENT;\n }\n\n if (!environment) {\n console.error(`No environment selected — pass --env <name> or add \"environments\" to apps/${appName}/deploy.config.json`);\n process.exit(1);\n }\n\n process.env.ENVIRONMENT = environment;\n\n const target = deployConfig.environments?.[environment];\n const platform = getArgValue(argv, '--platform') || target?.platform || QpqDeployPlatform.aws;\n\n const missingIdentity = getPlatformDriver(platform).primeDeployIdentity(target);\n if (missingIdentity.length > 0) {\n console.error(\n `Deploy identity for environment '${environment}' (platform '${platform}') is incomplete — missing ${missingIdentity.join(', ')}. Add it to apps/${appName}/deploy.config.json under \"environments\".`,\n );\n process.exit(1);\n }\n\n return { environment, platform };\n};\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type StackType = 'all' | 'inf' | 'api' | 'web' | 'views';
|
|
2
|
+
export type DeployPlan = {
|
|
3
|
+
kind: 'cancelled';
|
|
4
|
+
} | {
|
|
5
|
+
kind: 'account';
|
|
6
|
+
appName: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'bootstrap';
|
|
9
|
+
appName: string;
|
|
10
|
+
includeDomain: boolean;
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'services';
|
|
13
|
+
appName: string;
|
|
14
|
+
services: string[];
|
|
15
|
+
stacks: StackType;
|
|
16
|
+
};
|
|
17
|
+
export declare const promptDeployPlan: (appName: string) => Promise<DeployPlan>;
|
|
18
|
+
export type TeardownPlan = {
|
|
19
|
+
kind: 'cancelled';
|
|
20
|
+
} | {
|
|
21
|
+
kind: 'services';
|
|
22
|
+
appName: string;
|
|
23
|
+
services: string[];
|
|
24
|
+
};
|
|
25
|
+
export declare const promptTeardownPlan: (appName: string) => Promise<TeardownPlan>;
|