@ankhorage/infra 0.2.1 → 0.3.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/CHANGELOG.md +6 -0
- package/README.md +43 -2
- package/dist/ankh.provider.d.ts +10 -0
- package/dist/ankh.provider.d.ts.map +1 -0
- package/dist/ankh.provider.js +27 -0
- package/dist/ankh.provider.js.map +1 -0
- package/dist/cli.d.ts +10 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +39 -0
- package/dist/cli.js.map +1 -0
- package/dist/commandContext.d.ts +12 -0
- package/dist/commandContext.d.ts.map +1 -0
- package/dist/commandContext.js +15 -0
- package/dist/commandContext.js.map +1 -0
- package/dist/commands.d.ts +95 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +256 -0
- package/dist/commands.js.map +1 -0
- package/dist/infraValidation.d.ts +3 -0
- package/dist/infraValidation.d.ts.map +1 -0
- package/dist/infraValidation.js +58 -0
- package/dist/infraValidation.js.map +1 -0
- package/dist/metadata/index.d.ts +2 -0
- package/dist/metadata/index.d.ts.map +1 -0
- package/dist/metadata/index.js +2 -0
- package/dist/metadata/index.js.map +1 -0
- package/dist/packageMetadata.d.ts +10 -0
- package/dist/packageMetadata.d.ts.map +1 -0
- package/dist/packageMetadata.js +17 -0
- package/dist/packageMetadata.js.map +1 -0
- package/dist/project.d.ts +14 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +202 -0
- package/dist/project.js.map +1 -0
- package/dist/projectInfrastructure.d.ts +22 -0
- package/dist/projectInfrastructure.d.ts.map +1 -0
- package/dist/projectInfrastructure.js +120 -0
- package/dist/projectInfrastructure.js.map +1 -0
- package/dist/readme-usage.d.ts +2 -0
- package/dist/readme-usage.d.ts.map +1 -0
- package/dist/readme-usage.js +30 -0
- package/dist/readme-usage.js.map +1 -0
- package/dist/runtime.d.ts +26 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +87 -0
- package/dist/runtime.js.map +1 -0
- package/dist/testSupport.d.ts +24 -0
- package/dist/testSupport.d.ts.map +1 -0
- package/dist/testSupport.js +73 -0
- package/dist/testSupport.js.map +1 -0
- package/package.json +18 -3
- package/src/ankh.provider.test.ts +32 -0
- package/src/ankh.provider.ts +53 -0
- package/src/cli.test.ts +137 -0
- package/src/cli.ts +67 -0
- package/src/commandContext.ts +27 -0
- package/src/commands.test.ts +219 -0
- package/src/commands.ts +404 -0
- package/src/infraValidation.ts +90 -0
- package/src/metadata/index.ts +7 -0
- package/src/package.test.ts +27 -0
- package/src/packageMetadata.ts +24 -0
- package/src/project.test.ts +218 -0
- package/src/project.ts +270 -0
- package/src/projectInfrastructure.test.ts +207 -0
- package/src/projectInfrastructure.ts +177 -0
- package/src/readme-usage.ts +30 -0
- package/src/runtime.test.ts +124 -0
- package/src/runtime.ts +127 -0
- package/src/testSupport.ts +112 -0
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -3,9 +3,49 @@
|
|
|
3
3
|
|
|
4
4
|
# INFRA
|
|
5
5
|
|
|
6
|
-
         
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
Executable infra provider and standalone CLI for Ankhorage project workflows.
|
|
9
|
+
|
|
10
|
+
## Usage
|
|
11
|
+
|
|
12
|
+
### Provider and CLI surface
|
|
13
|
+
|
|
14
|
+
`@ankhorage/infra` owns infra command behavior.
|
|
15
|
+
|
|
16
|
+
The same shared command implementation backs both:
|
|
17
|
+
|
|
18
|
+
- `ankh infra ...`
|
|
19
|
+
- `bunx @ankhorage/infra ...`
|
|
20
|
+
|
|
21
|
+
Current command surface:
|
|
22
|
+
|
|
23
|
+
- `validate`
|
|
24
|
+
- `generate`
|
|
25
|
+
- `status`
|
|
26
|
+
- `up`
|
|
27
|
+
- `down`
|
|
28
|
+
|
|
29
|
+
`status` runs the generated live runtime status script for a project.
|
|
30
|
+
|
|
31
|
+
Project resolution is project-aware:
|
|
32
|
+
|
|
33
|
+
- pass `[project]`, or
|
|
34
|
+
- omit it when cwd is already inside `apps/<project>`
|
|
35
|
+
|
|
36
|
+
Source: `src/readme-usage.ts`
|
|
37
|
+
|
|
38
|
+
```ts
|
|
39
|
+
import { runCli } from './cli.js';
|
|
40
|
+
|
|
41
|
+
await runCli(['--help']);
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Installation
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
bunx @ankhorage/infra
|
|
48
|
+
```
|
|
9
49
|
|
|
10
50
|
## Generated documentation
|
|
11
51
|
|
|
@@ -15,3 +55,4 @@ Provider-neutral infrastructure generation: turns app manifests, datasets, auth,
|
|
|
15
55
|
- [Architecture overview](././paradox/diagrams/architecture-overview.mmd)
|
|
16
56
|
- [Module relationships](././paradox/diagrams/module-relationships.mmd)
|
|
17
57
|
- [Export graph](././paradox/diagrams/export-graph.mmd)
|
|
58
|
+
- [ankhorage-infra sequence](././paradox/diagrams/sequences/ankhorage-infra.mmd)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';
|
|
2
|
+
import { type InfraCommandServices, type RunInfraCommandImpl } from './commands.js';
|
|
3
|
+
export interface CreateInfraRuntimeProviderOptions {
|
|
4
|
+
readonly runCommandImpl?: RunInfraCommandImpl;
|
|
5
|
+
readonly services?: Partial<InfraCommandServices>;
|
|
6
|
+
}
|
|
7
|
+
export declare function createInfraRuntimeProvider(options?: CreateInfraRuntimeProviderOptions): AnkhRuntimeCommandProvider;
|
|
8
|
+
declare const provider: AnkhRuntimeCommandProvider;
|
|
9
|
+
export default provider;
|
|
10
|
+
//# sourceMappingURL=ankh.provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ankh.provider.d.ts","sourceRoot":"","sources":["../src/ankh.provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAGL,KAAK,oBAAoB,EAEzB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AAQvB,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnD;AAED,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,iCAAsC,GAC9C,0BAA0B,CAyB5B;AAED,QAAA,MAAM,QAAQ,4BAA+B,CAAC;AAE9C,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createProviderCommandDescriptors, INFRA_COMMANDS, runInfraCommand, } from './commands.js';
|
|
2
|
+
import { INFRA_CAPABILITIES, INFRA_COMMAND_CATEGORY, INFRA_PACKAGE_NAME, INFRA_PACKAGE_VERSION, } from './packageMetadata.js';
|
|
3
|
+
export function createInfraRuntimeProvider(options = {}) {
|
|
4
|
+
const runCommandImpl = options.runCommandImpl ?? runInfraCommand;
|
|
5
|
+
return {
|
|
6
|
+
id: INFRA_PACKAGE_NAME,
|
|
7
|
+
category: INFRA_COMMAND_CATEGORY,
|
|
8
|
+
version: INFRA_PACKAGE_VERSION,
|
|
9
|
+
capabilities: [...INFRA_CAPABILITIES],
|
|
10
|
+
commands: createProviderCommandDescriptors(),
|
|
11
|
+
handlers: INFRA_COMMANDS.map((command) => ({
|
|
12
|
+
path: command.path,
|
|
13
|
+
handler(request) {
|
|
14
|
+
return runCommandImpl({
|
|
15
|
+
argv: request.argv,
|
|
16
|
+
command,
|
|
17
|
+
context: request.context,
|
|
18
|
+
}, {
|
|
19
|
+
services: options.services,
|
|
20
|
+
});
|
|
21
|
+
},
|
|
22
|
+
})),
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const provider = createInfraRuntimeProvider();
|
|
26
|
+
export default provider;
|
|
27
|
+
//# sourceMappingURL=ankh.provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ankh.provider.js","sourceRoot":"","sources":["../src/ankh.provider.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gCAAgC,EAChC,cAAc,EAEd,eAAe,GAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAO9B,MAAM,UAAU,0BAA0B,CACxC,UAA6C,EAAE;IAE/C,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc,IAAI,eAAe,CAAC;IAEjE,OAAO;QACL,EAAE,EAAE,kBAAkB;QACtB,QAAQ,EAAE,sBAAsB;QAChC,OAAO,EAAE,qBAAqB;QAC9B,YAAY,EAAE,CAAC,GAAG,kBAAkB,CAAC;QACrC,QAAQ,EAAE,gCAAgC,EAAE;QAC5C,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,OAAO,CAAC,OAAO;gBACb,OAAO,cAAc,CACnB;oBACE,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,OAAO;oBACP,OAAO,EAAE,OAAO,CAAC,OAAO;iBACzB,EACD;oBACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;iBAC3B,CACF,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;KACiC,CAAC;AACzC,CAAC;AAED,MAAM,QAAQ,GAAG,0BAA0B,EAAE,CAAC;AAE9C,eAAe,QAAQ,CAAC","sourcesContent":["import type { AnkhRuntimeCommandProvider } from '@ankhorage/ankh';\n\nimport {\n createProviderCommandDescriptors,\n INFRA_COMMANDS,\n type InfraCommandServices,\n runInfraCommand,\n type RunInfraCommandImpl,\n} from './commands.js';\nimport {\n INFRA_CAPABILITIES,\n INFRA_COMMAND_CATEGORY,\n INFRA_PACKAGE_NAME,\n INFRA_PACKAGE_VERSION,\n} from './packageMetadata.js';\n\nexport interface CreateInfraRuntimeProviderOptions {\n readonly runCommandImpl?: RunInfraCommandImpl;\n readonly services?: Partial<InfraCommandServices>;\n}\n\nexport function createInfraRuntimeProvider(\n options: CreateInfraRuntimeProviderOptions = {},\n): AnkhRuntimeCommandProvider {\n const runCommandImpl = options.runCommandImpl ?? runInfraCommand;\n\n return {\n id: INFRA_PACKAGE_NAME,\n category: INFRA_COMMAND_CATEGORY,\n version: INFRA_PACKAGE_VERSION,\n capabilities: [...INFRA_CAPABILITIES],\n commands: createProviderCommandDescriptors(),\n handlers: INFRA_COMMANDS.map((command) => ({\n path: command.path,\n handler(request) {\n return runCommandImpl(\n {\n argv: request.argv,\n command,\n context: request.context,\n },\n {\n services: options.services,\n },\n );\n },\n })),\n } satisfies AnkhRuntimeCommandProvider;\n}\n\nconst provider = createInfraRuntimeProvider();\n\nexport default provider;\n"]}
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import type { InfraCommandContext, InfraCommandRunResult } from './commandContext.js';
|
|
3
|
+
import { type InfraCommandServices, type RunInfraCommandImpl } from './commands.js';
|
|
4
|
+
export interface InfraCliOptions {
|
|
5
|
+
readonly context?: InfraCommandContext;
|
|
6
|
+
readonly runCommandImpl?: RunInfraCommandImpl;
|
|
7
|
+
readonly services?: Partial<InfraCommandServices>;
|
|
8
|
+
}
|
|
9
|
+
export declare function runCli(argv: readonly string[], options?: InfraCliOptions): Promise<InfraCommandRunResult>;
|
|
10
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAEtF,OAAO,EAEL,KAAK,oBAAoB,EAIzB,KAAK,mBAAmB,EACzB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnD;AAED,wBAAsB,MAAM,CAC1B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CA+BhC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { createDefaultCommandContext } from './commandContext.js';
|
|
3
|
+
import { findInfraCommandByStandaloneName, renderRootHelp, renderUnknownCommand, runInfraCommand, } from './commands.js';
|
|
4
|
+
export async function runCli(argv, options = {}) {
|
|
5
|
+
const context = options.context ?? createDefaultCommandContext();
|
|
6
|
+
const runCommand = options.runCommandImpl ?? runInfraCommand;
|
|
7
|
+
const [firstToken, ...restTokens] = argv;
|
|
8
|
+
if (firstToken === undefined || isHelpToken(firstToken)) {
|
|
9
|
+
context.writeStdout(renderRootHelp(context.version));
|
|
10
|
+
return { exitCode: 0 };
|
|
11
|
+
}
|
|
12
|
+
if (isVersionToken(firstToken)) {
|
|
13
|
+
context.writeStdout(`${context.version}\n`);
|
|
14
|
+
return { exitCode: 0 };
|
|
15
|
+
}
|
|
16
|
+
const command = findInfraCommandByStandaloneName(firstToken);
|
|
17
|
+
if (command === null) {
|
|
18
|
+
context.writeStderr(renderUnknownCommand(firstToken));
|
|
19
|
+
return { exitCode: 1 };
|
|
20
|
+
}
|
|
21
|
+
return runCommand({
|
|
22
|
+
argv: restTokens,
|
|
23
|
+
command,
|
|
24
|
+
context,
|
|
25
|
+
}, {
|
|
26
|
+
services: options.services,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function isHelpToken(value) {
|
|
30
|
+
return value === '--help' || value === '-h' || value === 'help';
|
|
31
|
+
}
|
|
32
|
+
function isVersionToken(value) {
|
|
33
|
+
return value === '--version' || value === '-v' || value === 'version';
|
|
34
|
+
}
|
|
35
|
+
if (import.meta.main) {
|
|
36
|
+
const result = await runCli(process.argv.slice(2));
|
|
37
|
+
process.exit(result.exitCode);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EACL,gCAAgC,EAEhC,cAAc,EACd,oBAAoB,EACpB,eAAe,GAEhB,MAAM,eAAe,CAAC;AAQvB,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAuB,EACvB,UAA2B,EAAE;IAE7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,2BAA2B,EAAE,CAAC;IACjE,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,IAAI,eAAe,CAAC;IAC7D,MAAM,CAAC,UAAU,EAAE,GAAG,UAAU,CAAC,GAAG,IAAI,CAAC;IAEzC,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC;QACxD,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,gCAAgC,CAAC,UAAU,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,CAAC;QACtD,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACzB,CAAC;IAED,OAAO,UAAU,CACf;QACE,IAAI,EAAE,UAAU;QAChB,OAAO;QACP,OAAO;KACR,EACD;QACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CACF,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,CAAC;AAClE,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAC;AACxE,CAAC;AAED,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChC,CAAC","sourcesContent":["#!/usr/bin/env bun\n\nimport type { InfraCommandContext, InfraCommandRunResult } from './commandContext.js';\nimport { createDefaultCommandContext } from './commandContext.js';\nimport {\n findInfraCommandByStandaloneName,\n type InfraCommandServices,\n renderRootHelp,\n renderUnknownCommand,\n runInfraCommand,\n type RunInfraCommandImpl,\n} from './commands.js';\n\nexport interface InfraCliOptions {\n readonly context?: InfraCommandContext;\n readonly runCommandImpl?: RunInfraCommandImpl;\n readonly services?: Partial<InfraCommandServices>;\n}\n\nexport async function runCli(\n argv: readonly string[],\n options: InfraCliOptions = {},\n): Promise<InfraCommandRunResult> {\n const context = options.context ?? createDefaultCommandContext();\n const runCommand = options.runCommandImpl ?? runInfraCommand;\n const [firstToken, ...restTokens] = argv;\n\n if (firstToken === undefined || isHelpToken(firstToken)) {\n context.writeStdout(renderRootHelp(context.version));\n return { exitCode: 0 };\n }\n\n if (isVersionToken(firstToken)) {\n context.writeStdout(`${context.version}\\n`);\n return { exitCode: 0 };\n }\n\n const command = findInfraCommandByStandaloneName(firstToken);\n if (command === null) {\n context.writeStderr(renderUnknownCommand(firstToken));\n return { exitCode: 1 };\n }\n\n return runCommand(\n {\n argv: restTokens,\n command,\n context,\n },\n {\n services: options.services,\n },\n );\n}\n\nfunction isHelpToken(value: string): boolean {\n return value === '--help' || value === '-h' || value === 'help';\n}\n\nfunction isVersionToken(value: string): boolean {\n return value === '--version' || value === '-v' || value === 'version';\n}\n\nif (import.meta.main) {\n const result = await runCli(process.argv.slice(2));\n process.exit(result.exitCode);\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface InfraCommandContext {
|
|
2
|
+
readonly cwd: string;
|
|
3
|
+
readonly env: Readonly<Record<string, string | undefined>>;
|
|
4
|
+
readonly version: string;
|
|
5
|
+
writeStdout(text: string): void;
|
|
6
|
+
writeStderr(text: string): void;
|
|
7
|
+
}
|
|
8
|
+
export interface InfraCommandRunResult {
|
|
9
|
+
readonly exitCode: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function createDefaultCommandContext(): InfraCommandContext;
|
|
12
|
+
//# sourceMappingURL=commandContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandContext.d.ts","sourceRoot":"","sources":["../src/commandContext.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,wBAAgB,2BAA2B,IAAI,mBAAmB,CAYjE"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { INFRA_PACKAGE_VERSION } from './packageMetadata.js';
|
|
2
|
+
export function createDefaultCommandContext() {
|
|
3
|
+
return {
|
|
4
|
+
cwd: process.cwd(),
|
|
5
|
+
env: process.env,
|
|
6
|
+
version: INFRA_PACKAGE_VERSION,
|
|
7
|
+
writeStdout(text) {
|
|
8
|
+
process.stdout.write(text);
|
|
9
|
+
},
|
|
10
|
+
writeStderr(text) {
|
|
11
|
+
process.stderr.write(text);
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=commandContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commandContext.js","sourceRoot":"","sources":["../src/commandContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAc7D,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,qBAAqB;QAC9B,WAAW,CAAC,IAAY;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,WAAW,CAAC,IAAY;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { INFRA_PACKAGE_VERSION } from './packageMetadata.js';\n\nexport interface InfraCommandContext {\n readonly cwd: string;\n readonly env: Readonly<Record<string, string | undefined>>;\n readonly version: string;\n writeStdout(text: string): void;\n writeStderr(text: string): void;\n}\n\nexport interface InfraCommandRunResult {\n readonly exitCode: number;\n}\n\nexport function createDefaultCommandContext(): InfraCommandContext {\n return {\n cwd: process.cwd(),\n env: process.env,\n version: INFRA_PACKAGE_VERSION,\n writeStdout(text: string) {\n process.stdout.write(text);\n },\n writeStderr(text: string) {\n process.stderr.write(text);\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import type { AnkhCapabilityId, AnkhCommandDescriptor } from '@ankhorage/contracts/cli';
|
|
2
|
+
import type { InfraCommandContext, InfraCommandRunResult } from './commandContext.js';
|
|
3
|
+
import { validateInfraSupport } from './infraValidation.js';
|
|
4
|
+
import type { ResolvedInfraProject } from './project.js';
|
|
5
|
+
import type { InfraSyncResult } from './projectInfrastructure.js';
|
|
6
|
+
import type { InfraLifecycleScript } from './runtime.js';
|
|
7
|
+
type InfraCommandName = 'down' | 'generate' | 'status' | 'up' | 'validate';
|
|
8
|
+
interface InfraCommandRunRequest {
|
|
9
|
+
readonly context: InfraCommandContext;
|
|
10
|
+
readonly projectId?: string;
|
|
11
|
+
}
|
|
12
|
+
type InfraCommandImplementation = (request: InfraCommandRunRequest, services: InfraCommandServices) => Promise<InfraCommandRunResult>;
|
|
13
|
+
export interface InfraCommandDefinition {
|
|
14
|
+
readonly capability: AnkhCapabilityId;
|
|
15
|
+
readonly path: readonly [InfraCommandName];
|
|
16
|
+
readonly standaloneName: InfraCommandName;
|
|
17
|
+
readonly summary: string;
|
|
18
|
+
readonly run: InfraCommandImplementation;
|
|
19
|
+
}
|
|
20
|
+
export interface InfraCommandInvocation {
|
|
21
|
+
readonly argv: readonly string[];
|
|
22
|
+
readonly command: InfraCommandDefinition;
|
|
23
|
+
readonly context: InfraCommandContext;
|
|
24
|
+
}
|
|
25
|
+
export interface InfraCommandServices {
|
|
26
|
+
readonly resolveProject: (options: {
|
|
27
|
+
readonly cwd: string;
|
|
28
|
+
readonly projectId?: string;
|
|
29
|
+
}) => Promise<ResolvedInfraProject>;
|
|
30
|
+
readonly resolveProjectInfrastructureTarget: (args: {
|
|
31
|
+
readonly manifest: ResolvedInfraProject['manifest'];
|
|
32
|
+
readonly projectPath: string;
|
|
33
|
+
}) => Promise<string | null>;
|
|
34
|
+
readonly runProjectInfraScript: (args: {
|
|
35
|
+
readonly context: InfraCommandContext;
|
|
36
|
+
readonly projectId: string;
|
|
37
|
+
readonly projectPath: string;
|
|
38
|
+
readonly script: InfraLifecycleScript;
|
|
39
|
+
readonly target: string;
|
|
40
|
+
}) => Promise<void>;
|
|
41
|
+
readonly syncProjectInfrastructure: (args: {
|
|
42
|
+
readonly manifest: ResolvedInfraProject['manifest'];
|
|
43
|
+
readonly projectId: string;
|
|
44
|
+
readonly projectPath: string;
|
|
45
|
+
}) => Promise<InfraSyncResult>;
|
|
46
|
+
readonly validateInfraSupport: typeof validateInfraSupport;
|
|
47
|
+
}
|
|
48
|
+
export interface RunInfraCommandOptions {
|
|
49
|
+
readonly runCommandImpl?: RunInfraCommandImpl;
|
|
50
|
+
readonly services?: Partial<InfraCommandServices>;
|
|
51
|
+
}
|
|
52
|
+
export type RunInfraCommandImpl = (request: InfraCommandInvocation, options?: RunInfraCommandOptions) => Promise<InfraCommandRunResult>;
|
|
53
|
+
export declare const INFRA_COMMANDS: readonly [{
|
|
54
|
+
readonly standaloneName: "validate";
|
|
55
|
+
readonly path: readonly ["validate"];
|
|
56
|
+
readonly capability: "infra.validate";
|
|
57
|
+
readonly summary: "Validate infra support for a project manifest.";
|
|
58
|
+
readonly run: typeof runValidateCommand;
|
|
59
|
+
}, {
|
|
60
|
+
readonly standaloneName: "generate";
|
|
61
|
+
readonly path: readonly ["generate"];
|
|
62
|
+
readonly capability: "infra.generate";
|
|
63
|
+
readonly summary: "Generate infra artifacts and update the infra ledger for a project.";
|
|
64
|
+
readonly run: typeof runGenerateCommand;
|
|
65
|
+
}, {
|
|
66
|
+
readonly standaloneName: "status";
|
|
67
|
+
readonly path: readonly ["status"];
|
|
68
|
+
readonly capability: "infra.status";
|
|
69
|
+
readonly summary: "Run the generated runtime status script for a project.";
|
|
70
|
+
readonly run: typeof runStatusCommand;
|
|
71
|
+
}, {
|
|
72
|
+
readonly standaloneName: "up";
|
|
73
|
+
readonly path: readonly ["up"];
|
|
74
|
+
readonly capability: "infra.up";
|
|
75
|
+
readonly summary: "Generate infra artifacts, then run the generated up script.";
|
|
76
|
+
readonly run: typeof runUpCommand;
|
|
77
|
+
}, {
|
|
78
|
+
readonly standaloneName: "down";
|
|
79
|
+
readonly path: readonly ["down"];
|
|
80
|
+
readonly capability: "infra.down";
|
|
81
|
+
readonly summary: "Run the generated down script for a project.";
|
|
82
|
+
readonly run: typeof runDownCommand;
|
|
83
|
+
}];
|
|
84
|
+
export declare function runInfraCommand(request: InfraCommandInvocation, options?: RunInfraCommandOptions): Promise<InfraCommandRunResult>;
|
|
85
|
+
export declare function createProviderCommandDescriptors(): readonly AnkhCommandDescriptor[];
|
|
86
|
+
export declare function findInfraCommandByStandaloneName(value: string): InfraCommandDefinition | null;
|
|
87
|
+
export declare function renderRootHelp(version: string): string;
|
|
88
|
+
export declare function renderUnknownCommand(value: string): string;
|
|
89
|
+
declare function runValidateCommand(request: InfraCommandRunRequest, services: InfraCommandServices): Promise<InfraCommandRunResult>;
|
|
90
|
+
declare function runGenerateCommand(request: InfraCommandRunRequest, services: InfraCommandServices): Promise<InfraCommandRunResult>;
|
|
91
|
+
declare function runStatusCommand(request: InfraCommandRunRequest, services: InfraCommandServices): Promise<InfraCommandRunResult>;
|
|
92
|
+
declare function runUpCommand(request: InfraCommandRunRequest, services: InfraCommandServices): Promise<InfraCommandRunResult>;
|
|
93
|
+
declare function runDownCommand(request: InfraCommandRunRequest, services: InfraCommandServices): Promise<InfraCommandRunResult>;
|
|
94
|
+
export {};
|
|
95
|
+
//# sourceMappingURL=commands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
|
package/dist/commands.js
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { validateInfraSupport } from './infraValidation.js';
|
|
2
|
+
import { INFRA_CAPABILITIES, INFRA_COMMAND_CATEGORY } from './packageMetadata.js';
|
|
3
|
+
import { resolveInfraProject } from './project.js';
|
|
4
|
+
import { resolveProjectInfrastructureTarget, syncProjectInfrastructure, } from './projectInfrastructure.js';
|
|
5
|
+
import { runProjectInfraScript } from './runtime.js';
|
|
6
|
+
const COMMAND_CAPABILITIES = {
|
|
7
|
+
validate: INFRA_CAPABILITIES[0],
|
|
8
|
+
generate: INFRA_CAPABILITIES[1],
|
|
9
|
+
status: INFRA_CAPABILITIES[2],
|
|
10
|
+
up: INFRA_CAPABILITIES[3],
|
|
11
|
+
down: INFRA_CAPABILITIES[4],
|
|
12
|
+
};
|
|
13
|
+
export const INFRA_COMMANDS = [
|
|
14
|
+
{
|
|
15
|
+
standaloneName: 'validate',
|
|
16
|
+
path: ['validate'],
|
|
17
|
+
capability: COMMAND_CAPABILITIES.validate,
|
|
18
|
+
summary: 'Validate infra support for a project manifest.',
|
|
19
|
+
run: runValidateCommand,
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
standaloneName: 'generate',
|
|
23
|
+
path: ['generate'],
|
|
24
|
+
capability: COMMAND_CAPABILITIES.generate,
|
|
25
|
+
summary: 'Generate infra artifacts and update the infra ledger for a project.',
|
|
26
|
+
run: runGenerateCommand,
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
standaloneName: 'status',
|
|
30
|
+
path: ['status'],
|
|
31
|
+
capability: COMMAND_CAPABILITIES.status,
|
|
32
|
+
summary: 'Run the generated runtime status script for a project.',
|
|
33
|
+
run: runStatusCommand,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
standaloneName: 'up',
|
|
37
|
+
path: ['up'],
|
|
38
|
+
capability: COMMAND_CAPABILITIES.up,
|
|
39
|
+
summary: 'Generate infra artifacts, then run the generated up script.',
|
|
40
|
+
run: runUpCommand,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
standaloneName: 'down',
|
|
44
|
+
path: ['down'],
|
|
45
|
+
capability: COMMAND_CAPABILITIES.down,
|
|
46
|
+
summary: 'Run the generated down script for a project.',
|
|
47
|
+
run: runDownCommand,
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
export async function runInfraCommand(request, options = {}) {
|
|
51
|
+
const services = createInfraCommandServices(options.services);
|
|
52
|
+
try {
|
|
53
|
+
const parsedArgs = parseCommandArguments(request.command, request.argv);
|
|
54
|
+
if (parsedArgs.kind === 'help') {
|
|
55
|
+
request.context.writeStdout(renderCommandHelp(request.command));
|
|
56
|
+
return { exitCode: 0 };
|
|
57
|
+
}
|
|
58
|
+
return await request.command.run({
|
|
59
|
+
context: request.context,
|
|
60
|
+
projectId: parsedArgs.projectId,
|
|
61
|
+
}, services);
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
request.context.writeStderr(renderCommandFailure(request.command.standaloneName, error));
|
|
65
|
+
return { exitCode: 1 };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function createProviderCommandDescriptors() {
|
|
69
|
+
return INFRA_COMMANDS.map((command) => ({
|
|
70
|
+
capability: command.capability,
|
|
71
|
+
path: command.path,
|
|
72
|
+
summary: command.summary,
|
|
73
|
+
}));
|
|
74
|
+
}
|
|
75
|
+
export function findInfraCommandByStandaloneName(value) {
|
|
76
|
+
return INFRA_COMMANDS.find((command) => command.standaloneName === value) ?? null;
|
|
77
|
+
}
|
|
78
|
+
export function renderRootHelp(version) {
|
|
79
|
+
const commandLines = INFRA_COMMANDS.map((command) => ` ${command.standaloneName.padEnd(8, ' ')} ${command.summary}`).join('\n');
|
|
80
|
+
return [
|
|
81
|
+
`@ankhorage/infra v${version}`,
|
|
82
|
+
'',
|
|
83
|
+
'Usage:',
|
|
84
|
+
` ankhorage-infra <command> [project]`,
|
|
85
|
+
` ankh ${INFRA_COMMAND_CATEGORY} <command> [project]`,
|
|
86
|
+
'',
|
|
87
|
+
'Commands:',
|
|
88
|
+
commandLines,
|
|
89
|
+
'',
|
|
90
|
+
'Project resolution:',
|
|
91
|
+
' Pass [project], or omit it when cwd is inside apps/<project>.',
|
|
92
|
+
'',
|
|
93
|
+
].join('\n');
|
|
94
|
+
}
|
|
95
|
+
export function renderUnknownCommand(value) {
|
|
96
|
+
return [`Unknown infra command: ${value}`, '', 'Run ankhorage-infra --help', ''].join('\n');
|
|
97
|
+
}
|
|
98
|
+
function renderCommandHelp(command) {
|
|
99
|
+
return [
|
|
100
|
+
`${command.summary}`,
|
|
101
|
+
'',
|
|
102
|
+
'Usage:',
|
|
103
|
+
` ankhorage-infra ${command.standaloneName} [project]`,
|
|
104
|
+
` ankh ${INFRA_COMMAND_CATEGORY} ${command.path.join(' ')} [project]`,
|
|
105
|
+
'',
|
|
106
|
+
'Project resolution:',
|
|
107
|
+
' Pass [project], or omit it when cwd is inside apps/<project>.',
|
|
108
|
+
'',
|
|
109
|
+
].join('\n');
|
|
110
|
+
}
|
|
111
|
+
function createInfraCommandServices(overrides = {}) {
|
|
112
|
+
return {
|
|
113
|
+
resolveProject: overrides.resolveProject ?? resolveInfraProject,
|
|
114
|
+
resolveProjectInfrastructureTarget: overrides.resolveProjectInfrastructureTarget ?? resolveProjectInfrastructureTarget,
|
|
115
|
+
runProjectInfraScript: overrides.runProjectInfraScript ?? runProjectInfraScript,
|
|
116
|
+
syncProjectInfrastructure: overrides.syncProjectInfrastructure ?? syncProjectInfrastructure,
|
|
117
|
+
validateInfraSupport: overrides.validateInfraSupport ?? validateInfraSupport,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
function parseCommandArguments(command, argv) {
|
|
121
|
+
if (argv.length === 1 && isHelpToken(argv[0])) {
|
|
122
|
+
return { kind: 'help' };
|
|
123
|
+
}
|
|
124
|
+
if (argv.length > 1) {
|
|
125
|
+
throw new Error(`Infra ${command.standaloneName} accepts at most one project argument.`);
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
kind: 'run',
|
|
129
|
+
projectId: argv[0],
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
async function runValidateCommand(request, services) {
|
|
133
|
+
const project = await services.resolveProject({
|
|
134
|
+
cwd: request.context.cwd,
|
|
135
|
+
projectId: request.projectId,
|
|
136
|
+
});
|
|
137
|
+
const warnings = [...services.validateInfraSupport(project.manifest.infra)];
|
|
138
|
+
request.context.writeStdout(`projectId: ${project.projectId}\n`);
|
|
139
|
+
request.context.writeStdout(`infraConfigSupport: ${warnings.length === 0 ? 'ok' : 'warnings'}\n`);
|
|
140
|
+
writeWarnings(request.context, warnings);
|
|
141
|
+
return { exitCode: 0 };
|
|
142
|
+
}
|
|
143
|
+
async function runGenerateCommand(request, services) {
|
|
144
|
+
const project = await services.resolveProject({
|
|
145
|
+
cwd: request.context.cwd,
|
|
146
|
+
projectId: request.projectId,
|
|
147
|
+
});
|
|
148
|
+
request.context.writeStdout(`Regenerating infrastructure for project: ${project.projectId}...\n`);
|
|
149
|
+
const result = await services.syncProjectInfrastructure({
|
|
150
|
+
manifest: project.manifest,
|
|
151
|
+
projectId: project.projectId,
|
|
152
|
+
projectPath: project.projectPath,
|
|
153
|
+
});
|
|
154
|
+
if (result.skipped !== undefined) {
|
|
155
|
+
request.context.writeStdout(`Skipped: ${result.skipped.reason}\n`);
|
|
156
|
+
return { exitCode: 0 };
|
|
157
|
+
}
|
|
158
|
+
request.context.writeStdout(`Generated: ${result.generated}, removed stale: ${result.removed}\n`);
|
|
159
|
+
writeWarnings(request.context, result.warnings);
|
|
160
|
+
return { exitCode: 0 };
|
|
161
|
+
}
|
|
162
|
+
async function runStatusCommand(request, services) {
|
|
163
|
+
const project = await services.resolveProject({
|
|
164
|
+
cwd: request.context.cwd,
|
|
165
|
+
projectId: request.projectId,
|
|
166
|
+
});
|
|
167
|
+
const target = await services.resolveProjectInfrastructureTarget({
|
|
168
|
+
manifest: project.manifest,
|
|
169
|
+
projectPath: project.projectPath,
|
|
170
|
+
});
|
|
171
|
+
if (target === null) {
|
|
172
|
+
throw new Error(`Project '${project.projectId}' has no infrastructure target. Run infra generation first.`);
|
|
173
|
+
}
|
|
174
|
+
await services.runProjectInfraScript({
|
|
175
|
+
context: request.context,
|
|
176
|
+
projectId: project.projectId,
|
|
177
|
+
projectPath: project.projectPath,
|
|
178
|
+
script: 'status',
|
|
179
|
+
target,
|
|
180
|
+
});
|
|
181
|
+
return { exitCode: 0 };
|
|
182
|
+
}
|
|
183
|
+
async function runUpCommand(request, services) {
|
|
184
|
+
const project = await services.resolveProject({
|
|
185
|
+
cwd: request.context.cwd,
|
|
186
|
+
projectId: request.projectId,
|
|
187
|
+
});
|
|
188
|
+
request.context.writeStdout(`Preparing infrastructure for project: ${project.projectId}...\n`);
|
|
189
|
+
const generateResult = await services.syncProjectInfrastructure({
|
|
190
|
+
manifest: project.manifest,
|
|
191
|
+
projectId: project.projectId,
|
|
192
|
+
projectPath: project.projectPath,
|
|
193
|
+
});
|
|
194
|
+
if (generateResult.skipped !== undefined) {
|
|
195
|
+
request.context.writeStdout(`Skipped: ${generateResult.skipped.reason}\n`);
|
|
196
|
+
return { exitCode: 0 };
|
|
197
|
+
}
|
|
198
|
+
writeWarnings(request.context, generateResult.warnings);
|
|
199
|
+
const target = await services.resolveProjectInfrastructureTarget({
|
|
200
|
+
manifest: project.manifest,
|
|
201
|
+
projectPath: project.projectPath,
|
|
202
|
+
});
|
|
203
|
+
if (project.manifest.infra.deployment === undefined || target === null) {
|
|
204
|
+
throw new Error(`Project '${project.projectId}' has no infra.deployment target configured in ankh.config.json.`);
|
|
205
|
+
}
|
|
206
|
+
await services.runProjectInfraScript({
|
|
207
|
+
context: request.context,
|
|
208
|
+
projectId: project.projectId,
|
|
209
|
+
projectPath: project.projectPath,
|
|
210
|
+
script: 'up',
|
|
211
|
+
target,
|
|
212
|
+
});
|
|
213
|
+
request.context.writeStdout('Infrastructure is up.\n');
|
|
214
|
+
return { exitCode: 0 };
|
|
215
|
+
}
|
|
216
|
+
async function runDownCommand(request, services) {
|
|
217
|
+
const project = await services.resolveProject({
|
|
218
|
+
cwd: request.context.cwd,
|
|
219
|
+
projectId: request.projectId,
|
|
220
|
+
});
|
|
221
|
+
const target = await services.resolveProjectInfrastructureTarget({
|
|
222
|
+
manifest: project.manifest,
|
|
223
|
+
projectPath: project.projectPath,
|
|
224
|
+
});
|
|
225
|
+
if (target === null) {
|
|
226
|
+
throw new Error(`Project '${project.projectId}' has no infrastructure target. Run infra generation first.`);
|
|
227
|
+
}
|
|
228
|
+
await services.runProjectInfraScript({
|
|
229
|
+
context: request.context,
|
|
230
|
+
projectId: project.projectId,
|
|
231
|
+
projectPath: project.projectPath,
|
|
232
|
+
script: 'down',
|
|
233
|
+
target,
|
|
234
|
+
});
|
|
235
|
+
request.context.writeStdout('Infrastructure is down.\n');
|
|
236
|
+
return { exitCode: 0 };
|
|
237
|
+
}
|
|
238
|
+
function writeWarnings(context, warnings) {
|
|
239
|
+
if (warnings.length === 0) {
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
context.writeStderr('Warnings:\n');
|
|
243
|
+
for (const warning of warnings) {
|
|
244
|
+
context.writeStderr(`- ${warning}\n`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function renderCommandFailure(commandName, error) {
|
|
248
|
+
return `Infra ${commandName} failed: ${getErrorMessage(error)}\n`;
|
|
249
|
+
}
|
|
250
|
+
function getErrorMessage(error) {
|
|
251
|
+
return error instanceof Error ? error.message : String(error);
|
|
252
|
+
}
|
|
253
|
+
function isHelpToken(value) {
|
|
254
|
+
return value === '--help' || value === '-h' || value === 'help';
|
|
255
|
+
}
|
|
256
|
+
//# sourceMappingURL=commands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnkhCapabilityId, AnkhCommandDescriptor } from '@ankhorage/contracts/cli';\n\nimport type { InfraCommandContext, InfraCommandRunResult } from './commandContext.js';\nimport { validateInfraSupport } from './infraValidation.js';\nimport { INFRA_CAPABILITIES, INFRA_COMMAND_CATEGORY } from './packageMetadata.js';\nimport type { ResolvedInfraProject } from './project.js';\nimport { resolveInfraProject } from './project.js';\nimport type { InfraSyncResult } from './projectInfrastructure.js';\nimport {\n resolveProjectInfrastructureTarget,\n syncProjectInfrastructure,\n} from './projectInfrastructure.js';\nimport type { InfraLifecycleScript } from './runtime.js';\nimport { runProjectInfraScript } from './runtime.js';\n\ntype InfraCommandName = 'down' | 'generate' | 'status' | 'up' | 'validate';\n\ninterface InfraCommandRunRequest {\n readonly context: InfraCommandContext;\n readonly projectId?: string;\n}\n\ntype InfraCommandImplementation = (\n request: InfraCommandRunRequest,\n services: InfraCommandServices,\n) => Promise<InfraCommandRunResult>;\n\nexport interface InfraCommandDefinition {\n readonly capability: AnkhCapabilityId;\n readonly path: readonly [InfraCommandName];\n readonly standaloneName: InfraCommandName;\n readonly summary: string;\n readonly run: InfraCommandImplementation;\n}\n\nexport interface InfraCommandInvocation {\n readonly argv: readonly string[];\n readonly command: InfraCommandDefinition;\n readonly context: InfraCommandContext;\n}\n\nexport interface InfraCommandServices {\n readonly resolveProject: (options: {\n readonly cwd: string;\n readonly projectId?: string;\n }) => Promise<ResolvedInfraProject>;\n readonly resolveProjectInfrastructureTarget: (args: {\n readonly manifest: ResolvedInfraProject['manifest'];\n readonly projectPath: string;\n }) => Promise<string | null>;\n readonly runProjectInfraScript: (args: {\n readonly context: InfraCommandContext;\n readonly projectId: string;\n readonly projectPath: string;\n readonly script: InfraLifecycleScript;\n readonly target: string;\n }) => Promise<void>;\n readonly syncProjectInfrastructure: (args: {\n readonly manifest: ResolvedInfraProject['manifest'];\n readonly projectId: string;\n readonly projectPath: string;\n }) => Promise<InfraSyncResult>;\n readonly validateInfraSupport: typeof validateInfraSupport;\n}\n\nexport interface RunInfraCommandOptions {\n readonly runCommandImpl?: RunInfraCommandImpl;\n readonly services?: Partial<InfraCommandServices>;\n}\n\nexport type RunInfraCommandImpl = (\n request: InfraCommandInvocation,\n options?: RunInfraCommandOptions,\n) => Promise<InfraCommandRunResult>;\n\nconst COMMAND_CAPABILITIES = {\n validate: INFRA_CAPABILITIES[0],\n generate: INFRA_CAPABILITIES[1],\n status: INFRA_CAPABILITIES[2],\n up: INFRA_CAPABILITIES[3],\n down: INFRA_CAPABILITIES[4],\n} as const satisfies Record<InfraCommandName, AnkhCapabilityId>;\n\nexport const INFRA_COMMANDS = [\n {\n standaloneName: 'validate',\n path: ['validate'],\n capability: COMMAND_CAPABILITIES.validate,\n summary: 'Validate infra support for a project manifest.',\n run: runValidateCommand,\n },\n {\n standaloneName: 'generate',\n path: ['generate'],\n capability: COMMAND_CAPABILITIES.generate,\n summary: 'Generate infra artifacts and update the infra ledger for a project.',\n run: runGenerateCommand,\n },\n {\n standaloneName: 'status',\n path: ['status'],\n capability: COMMAND_CAPABILITIES.status,\n summary: 'Run the generated runtime status script for a project.',\n run: runStatusCommand,\n },\n {\n standaloneName: 'up',\n path: ['up'],\n capability: COMMAND_CAPABILITIES.up,\n summary: 'Generate infra artifacts, then run the generated up script.',\n run: runUpCommand,\n },\n {\n standaloneName: 'down',\n path: ['down'],\n capability: COMMAND_CAPABILITIES.down,\n summary: 'Run the generated down script for a project.',\n run: runDownCommand,\n },\n] as const satisfies readonly InfraCommandDefinition[];\n\nexport async function runInfraCommand(\n request: InfraCommandInvocation,\n options: RunInfraCommandOptions = {},\n): Promise<InfraCommandRunResult> {\n const services = createInfraCommandServices(options.services);\n\n try {\n const parsedArgs = parseCommandArguments(request.command, request.argv);\n if (parsedArgs.kind === 'help') {\n request.context.writeStdout(renderCommandHelp(request.command));\n return { exitCode: 0 };\n }\n\n return await request.command.run(\n {\n context: request.context,\n projectId: parsedArgs.projectId,\n },\n services,\n );\n } catch (error) {\n request.context.writeStderr(renderCommandFailure(request.command.standaloneName, error));\n return { exitCode: 1 };\n }\n}\n\nexport function createProviderCommandDescriptors(): readonly AnkhCommandDescriptor[] {\n return INFRA_COMMANDS.map((command) => ({\n capability: command.capability,\n path: command.path,\n summary: command.summary,\n }));\n}\n\nexport function findInfraCommandByStandaloneName(value: string): InfraCommandDefinition | null {\n return INFRA_COMMANDS.find((command) => command.standaloneName === value) ?? null;\n}\n\nexport function renderRootHelp(version: string): string {\n const commandLines = INFRA_COMMANDS.map(\n (command) => ` ${command.standaloneName.padEnd(8, ' ')} ${command.summary}`,\n ).join('\\n');\n\n return [\n `@ankhorage/infra v${version}`,\n '',\n 'Usage:',\n ` ankhorage-infra <command> [project]`,\n ` ankh ${INFRA_COMMAND_CATEGORY} <command> [project]`,\n '',\n 'Commands:',\n commandLines,\n '',\n 'Project resolution:',\n ' Pass [project], or omit it when cwd is inside apps/<project>.',\n '',\n ].join('\\n');\n}\n\nexport function renderUnknownCommand(value: string): string {\n return [`Unknown infra command: ${value}`, '', 'Run ankhorage-infra --help', ''].join('\\n');\n}\n\nfunction renderCommandHelp(command: InfraCommandDefinition): string {\n return [\n `${command.summary}`,\n '',\n 'Usage:',\n ` ankhorage-infra ${command.standaloneName} [project]`,\n ` ankh ${INFRA_COMMAND_CATEGORY} ${command.path.join(' ')} [project]`,\n '',\n 'Project resolution:',\n ' Pass [project], or omit it when cwd is inside apps/<project>.',\n '',\n ].join('\\n');\n}\n\nfunction createInfraCommandServices(\n overrides: Partial<InfraCommandServices> = {},\n): InfraCommandServices {\n return {\n resolveProject: overrides.resolveProject ?? resolveInfraProject,\n resolveProjectInfrastructureTarget:\n overrides.resolveProjectInfrastructureTarget ?? resolveProjectInfrastructureTarget,\n runProjectInfraScript: overrides.runProjectInfraScript ?? runProjectInfraScript,\n syncProjectInfrastructure: overrides.syncProjectInfrastructure ?? syncProjectInfrastructure,\n validateInfraSupport: overrides.validateInfraSupport ?? validateInfraSupport,\n };\n}\n\nfunction parseCommandArguments(\n command: InfraCommandDefinition,\n argv: readonly string[],\n): { readonly kind: 'help' } | { readonly kind: 'run'; readonly projectId?: string } {\n if (argv.length === 1 && isHelpToken(argv[0])) {\n return { kind: 'help' };\n }\n\n if (argv.length > 1) {\n throw new Error(`Infra ${command.standaloneName} accepts at most one project argument.`);\n }\n\n return {\n kind: 'run',\n projectId: argv[0],\n };\n}\n\nasync function runValidateCommand(\n request: InfraCommandRunRequest,\n services: InfraCommandServices,\n): Promise<InfraCommandRunResult> {\n const project = await services.resolveProject({\n cwd: request.context.cwd,\n projectId: request.projectId,\n });\n const warnings = [...services.validateInfraSupport(project.manifest.infra)];\n\n request.context.writeStdout(`projectId: ${project.projectId}\\n`);\n request.context.writeStdout(`infraConfigSupport: ${warnings.length === 0 ? 'ok' : 'warnings'}\\n`);\n writeWarnings(request.context, warnings);\n\n return { exitCode: 0 };\n}\n\nasync function runGenerateCommand(\n request: InfraCommandRunRequest,\n services: InfraCommandServices,\n): Promise<InfraCommandRunResult> {\n const project = await services.resolveProject({\n cwd: request.context.cwd,\n projectId: request.projectId,\n });\n\n request.context.writeStdout(`Regenerating infrastructure for project: ${project.projectId}...\\n`);\n\n const result = await services.syncProjectInfrastructure({\n manifest: project.manifest,\n projectId: project.projectId,\n projectPath: project.projectPath,\n });\n\n if (result.skipped !== undefined) {\n request.context.writeStdout(`Skipped: ${result.skipped.reason}\\n`);\n return { exitCode: 0 };\n }\n\n request.context.writeStdout(`Generated: ${result.generated}, removed stale: ${result.removed}\\n`);\n writeWarnings(request.context, result.warnings);\n\n return { exitCode: 0 };\n}\n\nasync function runStatusCommand(\n request: InfraCommandRunRequest,\n services: InfraCommandServices,\n): Promise<InfraCommandRunResult> {\n const project = await services.resolveProject({\n cwd: request.context.cwd,\n projectId: request.projectId,\n });\n const target = await services.resolveProjectInfrastructureTarget({\n manifest: project.manifest,\n projectPath: project.projectPath,\n });\n\n if (target === null) {\n throw new Error(\n `Project '${project.projectId}' has no infrastructure target. Run infra generation first.`,\n );\n }\n\n await services.runProjectInfraScript({\n context: request.context,\n projectId: project.projectId,\n projectPath: project.projectPath,\n script: 'status',\n target,\n });\n\n return { exitCode: 0 };\n}\n\nasync function runUpCommand(\n request: InfraCommandRunRequest,\n services: InfraCommandServices,\n): Promise<InfraCommandRunResult> {\n const project = await services.resolveProject({\n cwd: request.context.cwd,\n projectId: request.projectId,\n });\n\n request.context.writeStdout(`Preparing infrastructure for project: ${project.projectId}...\\n`);\n\n const generateResult = await services.syncProjectInfrastructure({\n manifest: project.manifest,\n projectId: project.projectId,\n projectPath: project.projectPath,\n });\n\n if (generateResult.skipped !== undefined) {\n request.context.writeStdout(`Skipped: ${generateResult.skipped.reason}\\n`);\n return { exitCode: 0 };\n }\n\n writeWarnings(request.context, generateResult.warnings);\n\n const target = await services.resolveProjectInfrastructureTarget({\n manifest: project.manifest,\n projectPath: project.projectPath,\n });\n\n if (project.manifest.infra.deployment === undefined || target === null) {\n throw new Error(\n `Project '${project.projectId}' has no infra.deployment target configured in ankh.config.json.`,\n );\n }\n\n await services.runProjectInfraScript({\n context: request.context,\n projectId: project.projectId,\n projectPath: project.projectPath,\n script: 'up',\n target,\n });\n request.context.writeStdout('Infrastructure is up.\\n');\n\n return { exitCode: 0 };\n}\n\nasync function runDownCommand(\n request: InfraCommandRunRequest,\n services: InfraCommandServices,\n): Promise<InfraCommandRunResult> {\n const project = await services.resolveProject({\n cwd: request.context.cwd,\n projectId: request.projectId,\n });\n const target = await services.resolveProjectInfrastructureTarget({\n manifest: project.manifest,\n projectPath: project.projectPath,\n });\n\n if (target === null) {\n throw new Error(\n `Project '${project.projectId}' has no infrastructure target. Run infra generation first.`,\n );\n }\n\n await services.runProjectInfraScript({\n context: request.context,\n projectId: project.projectId,\n projectPath: project.projectPath,\n script: 'down',\n target,\n });\n request.context.writeStdout('Infrastructure is down.\\n');\n\n return { exitCode: 0 };\n}\n\nfunction writeWarnings(context: InfraCommandContext, warnings: readonly string[]): void {\n if (warnings.length === 0) {\n return;\n }\n\n context.writeStderr('Warnings:\\n');\n for (const warning of warnings) {\n context.writeStderr(`- ${warning}\\n`);\n }\n}\n\nfunction renderCommandFailure(commandName: InfraCommandName, error: unknown): string {\n return `Infra ${commandName} failed: ${getErrorMessage(error)}\\n`;\n}\n\nfunction getErrorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction isHelpToken(value: string | undefined): boolean {\n return value === '--help' || value === '-h' || value === 'help';\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infraValidation.d.ts","sourceRoot":"","sources":["../src/infraValidation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,MAAM,EAAE,CA2DpF"}
|