@c9up/ream 0.1.25 → 0.1.27
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 +65 -0
- package/dist/ConfigLoader.d.ts +46 -5
- package/dist/ConfigLoader.d.ts.map +1 -1
- package/dist/ConfigLoader.js +60 -9
- package/dist/ConfigLoader.js.map +1 -1
- package/dist/HttpKernel.d.ts.map +1 -1
- package/dist/HttpKernel.js +46 -6
- package/dist/HttpKernel.js.map +1 -1
- package/dist/Ignitor.d.ts +115 -7
- package/dist/Ignitor.d.ts.map +1 -1
- package/dist/Ignitor.js +254 -40
- package/dist/Ignitor.js.map +1 -1
- package/dist/console/BaseCommand.d.ts +217 -0
- package/dist/console/BaseCommand.d.ts.map +1 -0
- package/dist/console/BaseCommand.js +340 -0
- package/dist/console/BaseCommand.js.map +1 -0
- package/dist/console/Console.d.ts +86 -0
- package/dist/console/Console.d.ts.map +1 -0
- package/dist/console/Console.js +134 -0
- package/dist/console/Console.js.map +1 -0
- package/dist/console/ExceptionHandler.d.ts +28 -0
- package/dist/console/ExceptionHandler.d.ts.map +1 -0
- package/dist/console/ExceptionHandler.js +76 -0
- package/dist/console/ExceptionHandler.js.map +1 -0
- package/dist/console/HelpCommand.d.ts +16 -0
- package/dist/console/HelpCommand.d.ts.map +1 -0
- package/dist/console/HelpCommand.js +40 -0
- package/dist/console/HelpCommand.js.map +1 -0
- package/dist/console/IndexGenerator.d.ts +24 -0
- package/dist/console/IndexGenerator.d.ts.map +1 -0
- package/dist/console/IndexGenerator.js +65 -0
- package/dist/console/IndexGenerator.js.map +1 -0
- package/dist/console/Kernel.d.ts +298 -0
- package/dist/console/Kernel.d.ts.map +1 -0
- package/dist/console/Kernel.js +1120 -0
- package/dist/console/Kernel.js.map +1 -0
- package/dist/console/ListCommand.d.ts +18 -0
- package/dist/console/ListCommand.d.ts.map +1 -0
- package/dist/console/ListCommand.js +60 -0
- package/dist/console/ListCommand.js.map +1 -0
- package/dist/console/assertions.d.ts +20 -0
- package/dist/console/assertions.d.ts.map +1 -0
- package/dist/console/assertions.js +84 -0
- package/dist/console/assertions.js.map +1 -0
- package/dist/console/cliui.d.ts +248 -0
- package/dist/console/cliui.d.ts.map +1 -0
- package/dist/console/cliui.js +587 -0
- package/dist/console/cliui.js.map +1 -0
- package/dist/console/decorators.d.ts +90 -0
- package/dist/console/decorators.d.ts.map +1 -0
- package/dist/console/decorators.js +142 -0
- package/dist/console/decorators.js.map +1 -0
- package/dist/console/index.d.ts +32 -0
- package/dist/console/index.d.ts.map +1 -0
- package/dist/console/index.js +24 -0
- package/dist/console/index.js.map +1 -0
- package/dist/console/loaders.d.ts +52 -0
- package/dist/console/loaders.d.ts.map +1 -0
- package/dist/console/loaders.js +131 -0
- package/dist/console/loaders.js.map +1 -0
- package/dist/console/parser.d.ts +86 -0
- package/dist/console/parser.d.ts.map +1 -0
- package/dist/console/parser.js +440 -0
- package/dist/console/parser.js.map +1 -0
- package/dist/console/prompts.d.ts +124 -0
- package/dist/console/prompts.d.ts.map +1 -0
- package/dist/console/prompts.js +356 -0
- package/dist/console/prompts.js.map +1 -0
- package/dist/console/tracing.d.ts +17 -0
- package/dist/console/tracing.d.ts.map +1 -0
- package/dist/console/tracing.js +11 -0
- package/dist/console/tracing.js.map +1 -0
- package/dist/console/types.d.ts +255 -0
- package/dist/console/types.d.ts.map +1 -0
- package/dist/console/types.js +25 -0
- package/dist/console/types.js.map +1 -0
- package/dist/console/ui.d.ts +20 -0
- package/dist/console/ui.d.ts.map +1 -0
- package/dist/console/ui.js +31 -0
- package/dist/console/ui.js.map +1 -0
- package/dist/console/utils.d.ts +27 -0
- package/dist/console/utils.d.ts.map +1 -0
- package/dist/console/utils.js +56 -0
- package/dist/console/utils.js.map +1 -0
- package/dist/container/Container.d.ts +23 -3
- package/dist/container/Container.d.ts.map +1 -1
- package/dist/container/Container.js +177 -70
- package/dist/container/Container.js.map +1 -1
- package/dist/container/types.d.ts +14 -2
- package/dist/container/types.d.ts.map +1 -1
- package/dist/decorators/Service.d.ts +7 -0
- package/dist/decorators/Service.d.ts.map +1 -1
- package/dist/decorators/Service.js +23 -3
- package/dist/decorators/Service.js.map +1 -1
- package/dist/env/Env.d.ts +29 -4
- package/dist/env/Env.d.ts.map +1 -1
- package/dist/env/Env.js +27 -4
- package/dist/env/Env.js.map +1 -1
- package/dist/env/Secret.d.ts +11 -0
- package/dist/env/Secret.d.ts.map +1 -0
- package/dist/env/Secret.js +36 -0
- package/dist/env/Secret.js.map +1 -0
- package/dist/env/interpolate.d.ts +26 -0
- package/dist/env/interpolate.d.ts.map +1 -0
- package/dist/env/interpolate.js +48 -0
- package/dist/env/interpolate.js.map +1 -0
- package/dist/env/loadEnvFiles.d.ts.map +1 -1
- package/dist/env/loadEnvFiles.js +14 -4
- package/dist/env/loadEnvFiles.js.map +1 -1
- package/dist/env/schema.d.ts +23 -6
- package/dist/env/schema.d.ts.map +1 -1
- package/dist/env/schema.js +67 -33
- package/dist/env/schema.js.map +1 -1
- package/dist/errors/ReamError.d.ts +25 -0
- package/dist/errors/ReamError.d.ts.map +1 -1
- package/dist/errors/ReamError.js +5 -0
- package/dist/errors/ReamError.js.map +1 -1
- package/dist/errors/prettyPrintError.d.ts +9 -0
- package/dist/errors/prettyPrintError.d.ts.map +1 -0
- package/dist/errors/prettyPrintError.js +22 -0
- package/dist/errors/prettyPrintError.js.map +1 -0
- package/dist/events/Emitter.d.ts +1 -1
- package/dist/events/Emitter.d.ts.map +1 -1
- package/dist/events/Emitter.js +1 -1
- package/dist/events/Emitter.js.map +1 -1
- package/dist/events/EventsProvider.d.ts +2 -2
- package/dist/events/EventsProvider.d.ts.map +1 -1
- package/dist/events/EventsProvider.js +3 -3
- package/dist/events/EventsProvider.js.map +1 -1
- package/dist/graphql/GraphQLEngine.d.ts +1 -1
- package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
- package/dist/graphql/GraphQLEngine.js +2 -2
- package/dist/graphql/GraphQLEngine.js.map +1 -1
- package/dist/graphql/GraphQLProvider.d.ts.map +1 -1
- package/dist/graphql/GraphQLProvider.js +7 -3
- package/dist/graphql/GraphQLProvider.js.map +1 -1
- package/dist/http/Exception.d.ts +63 -1
- package/dist/http/Exception.d.ts.map +1 -1
- package/dist/http/Exception.js +185 -48
- package/dist/http/Exception.js.map +1 -1
- package/dist/http/HttpContext.d.ts +53 -7
- package/dist/http/HttpContext.d.ts.map +1 -1
- package/dist/http/HttpContext.js +56 -15
- package/dist/http/HttpContext.js.map +1 -1
- package/dist/http/RedirectBuilder.d.ts.map +1 -1
- package/dist/http/RedirectBuilder.js +4 -1
- package/dist/http/RedirectBuilder.js.map +1 -1
- package/dist/http/Request.d.ts +141 -10
- package/dist/http/Request.d.ts.map +1 -1
- package/dist/http/Request.js +244 -34
- package/dist/http/Request.js.map +1 -1
- package/dist/http/Response.d.ts +176 -9
- package/dist/http/Response.d.ts.map +1 -1
- package/dist/http/Response.js +404 -16
- package/dist/http/Response.js.map +1 -1
- package/dist/index.d.ts +19 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -5
- package/dist/index.js.map +1 -1
- package/dist/middleware/Pipeline.d.ts +29 -8
- package/dist/middleware/Pipeline.d.ts.map +1 -1
- package/dist/middleware/Pipeline.js +40 -2
- package/dist/middleware/Pipeline.js.map +1 -1
- package/dist/openapi/OpenApiProvider.js +4 -4
- package/dist/openapi/OpenApiProvider.js.map +1 -1
- package/dist/router/Router.d.ts +223 -31
- package/dist/router/Router.d.ts.map +1 -1
- package/dist/router/Router.js +520 -102
- package/dist/router/Router.js.map +1 -1
- package/dist/rpc/RpcProvider.d.ts +1 -0
- package/dist/rpc/RpcProvider.d.ts.map +1 -1
- package/dist/rpc/RpcProvider.js +7 -3
- package/dist/rpc/RpcProvider.js.map +1 -1
- package/dist/rpc/RpcRouter.d.ts +2 -2
- package/dist/rpc/RpcRouter.d.ts.map +1 -1
- package/dist/rpc/RpcRouter.js +17 -5
- package/dist/rpc/RpcRouter.js.map +1 -1
- package/dist/scheduler/ScheduleProvider.d.ts.map +1 -1
- package/dist/scheduler/ScheduleProvider.js +7 -15
- package/dist/scheduler/ScheduleProvider.js.map +1 -1
- package/dist/server/Server.d.ts +17 -4
- package/dist/server/Server.d.ts.map +1 -1
- package/dist/server/Server.js +41 -7
- package/dist/server/Server.js.map +1 -1
- package/dist/services/app.d.ts +1 -1
- package/dist/services/app.js +1 -1
- package/dist/services/console.d.ts +21 -0
- package/dist/services/console.d.ts.map +1 -0
- package/dist/services/console.js +35 -0
- package/dist/services/console.js.map +1 -0
- package/dist/session/SessionMiddleware.js +3 -3
- package/dist/session/SessionMiddleware.js.map +1 -1
- package/dist/storage/StaticProvider.js +1 -1
- package/dist/storage/StaticProvider.js.map +1 -1
- package/dist/testing/ApiResponse.d.ts +218 -0
- package/dist/testing/ApiResponse.d.ts.map +1 -0
- package/dist/testing/ApiResponse.js +576 -0
- package/dist/testing/ApiResponse.js.map +1 -0
- package/dist/testing/RequestBuilder.d.ts +155 -35
- package/dist/testing/RequestBuilder.d.ts.map +1 -1
- package/dist/testing/RequestBuilder.js +455 -109
- package/dist/testing/RequestBuilder.js.map +1 -1
- package/dist/testing/TestClient.d.ts +53 -37
- package/dist/testing/TestClient.d.ts.map +1 -1
- package/dist/testing/TestClient.js +84 -52
- package/dist/testing/TestClient.js.map +1 -1
- package/dist/utils/Macroable.d.ts +30 -0
- package/dist/utils/Macroable.d.ts.map +1 -0
- package/dist/utils/Macroable.js +43 -0
- package/dist/utils/Macroable.js.map +1 -0
- package/dist/utils/inflect.d.ts +17 -0
- package/dist/utils/inflect.d.ts.map +1 -0
- package/dist/utils/inflect.js +32 -0
- package/dist/utils/inflect.js.map +1 -0
- package/dist/utils/objectPath.d.ts +57 -0
- package/dist/utils/objectPath.d.ts.map +1 -0
- package/dist/utils/objectPath.js +141 -0
- package/dist/utils/objectPath.js.map +1 -0
- package/events.darwin-arm64.node +0 -0
- package/events.darwin-x64.node +0 -0
- package/events.linux-arm64-gnu.node +0 -0
- package/events.linux-x64-gnu.node +0 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +20 -2
- package/scheduler.darwin-arm64.node +0 -0
- package/scheduler.darwin-x64.node +0 -0
- package/scheduler.linux-arm64-gnu.node +0 -0
- package/scheduler.linux-x64-gnu.node +0 -0
- package/scheduler.win32-x64-msvc.node +0 -0
- package/src/ConfigLoader.ts +72 -9
- package/src/HttpKernel.ts +53 -15
- package/src/Ignitor.ts +364 -45
- package/src/console/BaseCommand.ts +467 -0
- package/src/console/Console.ts +174 -0
- package/src/console/ExceptionHandler.ts +91 -0
- package/src/console/HelpCommand.ts +37 -0
- package/src/console/IndexGenerator.ts +79 -0
- package/src/console/Kernel.ts +1382 -0
- package/src/console/ListCommand.ts +55 -0
- package/src/console/assertions.ts +114 -0
- package/src/console/cliui.ts +756 -0
- package/src/console/decorators.ts +199 -0
- package/src/console/index.ts +67 -0
- package/src/console/loaders.ts +145 -0
- package/src/console/parser.ts +598 -0
- package/src/console/prompts.ts +548 -0
- package/src/console/tracing.ts +22 -0
- package/src/console/types.ts +280 -0
- package/src/console/ui.ts +37 -0
- package/src/console/utils.ts +69 -0
- package/src/container/Container.ts +198 -72
- package/src/container/types.ts +15 -2
- package/src/decorators/Service.ts +28 -3
- package/src/env/Env.ts +49 -5
- package/src/env/Secret.ts +41 -0
- package/src/env/interpolate.ts +54 -0
- package/src/env/loadEnvFiles.ts +12 -4
- package/src/env/schema.ts +109 -35
- package/src/errors/ReamError.ts +31 -0
- package/src/errors/prettyPrintError.ts +20 -0
- package/src/events/Emitter.ts +2 -2
- package/src/events/EventsProvider.ts +5 -5
- package/src/graphql/GraphQLEngine.ts +4 -4
- package/src/graphql/GraphQLProvider.ts +7 -3
- package/src/http/Exception.ts +214 -37
- package/src/http/HttpContext.ts +87 -18
- package/src/http/RedirectBuilder.ts +4 -1
- package/src/http/Request.ts +264 -34
- package/src/http/Response.ts +478 -27
- package/src/index.ts +41 -6
- package/src/middleware/Pipeline.ts +77 -6
- package/src/openapi/OpenApiProvider.ts +4 -4
- package/src/router/Router.ts +631 -113
- package/src/rpc/RpcProvider.ts +6 -2
- package/src/rpc/RpcRouter.ts +22 -7
- package/src/scheduler/ScheduleProvider.ts +7 -15
- package/src/server/Server.ts +49 -10
- package/src/services/app.ts +1 -1
- package/src/services/console.ts +42 -0
- package/src/session/SessionMiddleware.ts +4 -4
- package/src/storage/StaticProvider.ts +1 -1
- package/src/testing/ApiResponse.ts +691 -0
- package/src/testing/RequestBuilder.ts +577 -137
- package/src/testing/TestClient.ts +110 -77
- package/src/utils/Macroable.ts +54 -0
- package/src/utils/inflect.ts +29 -0
- package/src/utils/objectPath.ts +142 -0
- package/dist/console/CommandRunner.d.ts +0 -18
- package/dist/console/CommandRunner.d.ts.map +0 -1
- package/dist/console/CommandRunner.js +0 -65
- package/dist/console/CommandRunner.js.map +0 -1
- package/dist/decorators/Lazy.d.ts +0 -19
- package/dist/decorators/Lazy.d.ts.map +0 -1
- package/dist/decorators/Lazy.js +0 -53
- package/dist/decorators/Lazy.js.map +0 -1
- package/src/console/CommandRunner.ts +0 -82
- package/src/decorators/Lazy.ts +0 -57
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `list` — the built-in command listing every other one (Console's `ListCommand`).
|
|
3
|
+
*
|
|
4
|
+
* A real registered command rather than a branch inside the kernel: that is
|
|
5
|
+
* what makes `consoleApp.hasCommand('list')` true, `consoleApp.exec('list')` work, and
|
|
6
|
+
* `list --bad` fail the same way any other unknown flag does. A hand-rolled
|
|
7
|
+
* `argv.includes('--json')` inside the dispatcher answers none of those.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { BaseCommand } from './BaseCommand.js'
|
|
11
|
+
import { args, flags } from './decorators.js'
|
|
12
|
+
|
|
13
|
+
export default class ListCommand extends BaseCommand {
|
|
14
|
+
static override commandName = 'list'
|
|
15
|
+
static override description = 'List all the available commands'
|
|
16
|
+
static override help = [
|
|
17
|
+
'The list command displays a list of all the commands:',
|
|
18
|
+
' {{ binaryName }} list',
|
|
19
|
+
'',
|
|
20
|
+
'You can also display the commands for a specific namespace:',
|
|
21
|
+
' {{ binaryName }} list make db',
|
|
22
|
+
'',
|
|
23
|
+
'The list of commands can also be exported as JSON:',
|
|
24
|
+
' {{ binaryName }} list --json',
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
@args.spread({
|
|
28
|
+
required: false,
|
|
29
|
+
description: 'Only list the commands of these namespaces',
|
|
30
|
+
})
|
|
31
|
+
declare namespaces: string[]
|
|
32
|
+
|
|
33
|
+
@flags.boolean({ description: 'Print the full command metadata as JSON' })
|
|
34
|
+
declare json: boolean
|
|
35
|
+
|
|
36
|
+
run(): void {
|
|
37
|
+
const namespaces = this.namespaces ?? []
|
|
38
|
+
|
|
39
|
+
// Checked per namespace, not on the merged result: with `list make nope`,
|
|
40
|
+
// a single match would otherwise hide the typo.
|
|
41
|
+
const missing = namespaces.filter(
|
|
42
|
+
(namespace) => this.kernel.getNamespaceCommands(namespace).length === 0,
|
|
43
|
+
)
|
|
44
|
+
if (missing.length > 0) {
|
|
45
|
+
this.logger.error(`No command in namespace "${missing.join('", "')}".`)
|
|
46
|
+
// Straight to stderr, like the kernel's unknown-command report: the hint
|
|
47
|
+
// is not part of the listing a caller may be piping.
|
|
48
|
+
process.stderr.write(` Run "${this.kernel.binaryName} list" to see every command.\n`)
|
|
49
|
+
this.exitCode = 1
|
|
50
|
+
return
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
this.kernel.printList(this.json === true, namespaces)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test assertions attached to every command the kernel runs.
|
|
3
|
+
*
|
|
4
|
+
* They live here rather than only on `BaseCommand` so that what `exec()`
|
|
5
|
+
* returns always carries them — including a command declared structurally by a
|
|
6
|
+
* framework-agnostic package. A type that promises them while the runtime
|
|
7
|
+
* sometimes lacks them is worse than no type at all.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { CapturedLog, Ui } from './cliui.js'
|
|
11
|
+
import type { CommandAssertions, CommandInstance, CommandSnapshot } from './types.js'
|
|
12
|
+
|
|
13
|
+
/** What the assertions need from the command they belong to. */
|
|
14
|
+
interface Subject extends CommandInstance {
|
|
15
|
+
exitCode?: number
|
|
16
|
+
error?: unknown
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function createAssertions(command: Subject, ui: Ui): CommandAssertions {
|
|
20
|
+
const logs = (): CapturedLog[] => ui.getCapturedLogs()
|
|
21
|
+
|
|
22
|
+
return {
|
|
23
|
+
assertSucceeded(): void {
|
|
24
|
+
if (command.exitCode === 0) return
|
|
25
|
+
throw new Error(
|
|
26
|
+
`Expected the command to succeed, but it exited with ${String(command.exitCode)}.` +
|
|
27
|
+
(command.error === undefined ? '' : `\n Cause: ${String(command.error)}`),
|
|
28
|
+
)
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
assertFailed(): void {
|
|
32
|
+
if (command.exitCode !== 0) return
|
|
33
|
+
throw new Error('Expected the command to fail, but it exited with 0.')
|
|
34
|
+
},
|
|
35
|
+
|
|
36
|
+
assertExitCode(expected: number): void {
|
|
37
|
+
if (command.exitCode === expected) return
|
|
38
|
+
throw new Error(`Expected exit code ${expected}, got ${String(command.exitCode)}.`)
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
assertNotExitCode(unexpected: number): void {
|
|
42
|
+
if (command.exitCode !== unexpected) return
|
|
43
|
+
throw new Error(`Expected the exit code NOT to be ${unexpected}.`)
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
assertLog(message: string, stream?: 'stdout' | 'stderr'): void {
|
|
47
|
+
const captured = logs()
|
|
48
|
+
const found = captured.some(
|
|
49
|
+
(entry) => entry.message === message && (stream === undefined || entry.stream === stream),
|
|
50
|
+
)
|
|
51
|
+
if (found) return
|
|
52
|
+
throw new Error(
|
|
53
|
+
`Expected a log ${stream === undefined ? '' : `on ${stream} `}equal to:\n ${message}\n` +
|
|
54
|
+
`Got:\n${formatLogs(captured)}`,
|
|
55
|
+
)
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
assertLogMatches(pattern: RegExp, stream?: 'stdout' | 'stderr'): void {
|
|
59
|
+
const captured = logs()
|
|
60
|
+
const found = captured.some(
|
|
61
|
+
(entry) => pattern.test(entry.message) && (stream === undefined || entry.stream === stream),
|
|
62
|
+
)
|
|
63
|
+
if (found) return
|
|
64
|
+
throw new Error(`Expected a log matching ${String(pattern)}.\nGot:\n${formatLogs(captured)}`)
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Console's semantics: every expected row must be PRESENT among the rendered
|
|
69
|
+
* ones — a subset check, not an equality. The header counts as a row, so
|
|
70
|
+
* `[['Name', 'Email'], ['Ada', '…']]` and `[['Ada', '…']]` are both valid
|
|
71
|
+
* assertions, exactly as in Console, where a table row is logged as its cells
|
|
72
|
+
* joined by `|` and the head goes through the same path.
|
|
73
|
+
*/
|
|
74
|
+
assertTableRows(expected: readonly (readonly string[])[]): void {
|
|
75
|
+
const head = ui.getTableHead()
|
|
76
|
+
const actual = head.length === 0 ? ui.getTableRows() : [head, ...ui.getTableRows()]
|
|
77
|
+
const missing = expected.filter(
|
|
78
|
+
(wanted) =>
|
|
79
|
+
!actual.some(
|
|
80
|
+
(row) =>
|
|
81
|
+
row.length === wanted.length && row.every((cell, column) => cell === wanted[column]),
|
|
82
|
+
),
|
|
83
|
+
)
|
|
84
|
+
if (missing.length === 0) return
|
|
85
|
+
throw new Error(
|
|
86
|
+
`Expected the table to include the rows:\n${JSON.stringify(missing, null, 2)}\n` +
|
|
87
|
+
`Got:\n${JSON.stringify(actual, null, 2)}`,
|
|
88
|
+
)
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** The execution snapshot (Console `toJSON`), for a command built structurally. */
|
|
94
|
+
export function createSnapshot(
|
|
95
|
+
command: Subject,
|
|
96
|
+
commandName: string,
|
|
97
|
+
options: CommandSnapshot['options'],
|
|
98
|
+
): () => CommandSnapshot {
|
|
99
|
+
return () => ({
|
|
100
|
+
commandName,
|
|
101
|
+
options,
|
|
102
|
+
// Console exposes the positional values as a list; flags stay keyed.
|
|
103
|
+
args: [...(Reflect.get(command, 'parsed')?.args ?? [])],
|
|
104
|
+
flags: Reflect.get(command, 'parsed')?.flags ?? {},
|
|
105
|
+
error: command.error,
|
|
106
|
+
result: Reflect.get(command, 'result'),
|
|
107
|
+
exitCode: command.exitCode,
|
|
108
|
+
})
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function formatLogs(captured: readonly CapturedLog[]): string {
|
|
112
|
+
if (captured.length === 0) return ' (nothing was logged — is the UI in raw mode?)'
|
|
113
|
+
return captured.map((entry) => ` [${entry.stream}] ${entry.message}`).join('\n')
|
|
114
|
+
}
|