@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,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The default renderer for a failure of the command line (Console's
|
|
3
|
+
* `ExceptionHandler`).
|
|
4
|
+
*
|
|
5
|
+
* A class rather than a function so an application can extend it and override
|
|
6
|
+
* one step — the usual need is "report this error like the framework does, but
|
|
7
|
+
* ship it somewhere too".
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { prettyPrintError } from '../errors/prettyPrintError.js'
|
|
11
|
+
import { isReamError } from '../errors/ReamError.js'
|
|
12
|
+
import type { Kernel } from './Kernel.js'
|
|
13
|
+
|
|
14
|
+
/** Errors the console raises when a command is called wrongly. */
|
|
15
|
+
const CALL_ERROR_CODES = [
|
|
16
|
+
'E_CONSOLE_COMMAND_NOT_FOUND',
|
|
17
|
+
'E_CONSOLE_MISSING_ARGUMENT',
|
|
18
|
+
'E_CONSOLE_MISSING_ARGUMENT_VALUE',
|
|
19
|
+
'E_CONSOLE_MISSING_FLAG',
|
|
20
|
+
'E_CONSOLE_MISSING_FLAG_VALUE',
|
|
21
|
+
'E_CONSOLE_UNKNOWN_FLAG',
|
|
22
|
+
'E_CONSOLE_INVALID_FLAG_VALUE',
|
|
23
|
+
'E_CONSOLE_INVALID_FLAG_GROUP',
|
|
24
|
+
'E_CONSOLE_UNEXPECTED_ARGUMENT',
|
|
25
|
+
'E_CONSOLE_PROMPT_CANCELLED',
|
|
26
|
+
]
|
|
27
|
+
|
|
28
|
+
export class ExceptionHandler {
|
|
29
|
+
/** Print the whole error, stack included. */
|
|
30
|
+
debug = true
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Error codes to report as a single line, without a stack.
|
|
34
|
+
*
|
|
35
|
+
* The framework's own call errors are always in this set: a missing flag is
|
|
36
|
+
* something the user typed, and a stack trace of the parser tells them
|
|
37
|
+
* nothing about it.
|
|
38
|
+
*/
|
|
39
|
+
knownErrorCodes: string[] = []
|
|
40
|
+
|
|
41
|
+
protected get internalKnownErrorCodes(): readonly string[] {
|
|
42
|
+
return CALL_ERROR_CODES
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** One line on stderr, through the kernel's own UI. */
|
|
46
|
+
protected logError(message: string, kernel: Kernel): void {
|
|
47
|
+
kernel.logger.error(message)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** The full error, with its stack — what a developer needs. */
|
|
51
|
+
protected async prettyPrintError(error: unknown): Promise<void> {
|
|
52
|
+
prettyPrintError(error)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async render(error: unknown, kernel: Kernel): Promise<void> {
|
|
56
|
+
if (typeof error !== 'object' || error === null || !('message' in error)) {
|
|
57
|
+
this.logError(String(error), kernel)
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// An unknown command is a typo: the suggestion is the useful part, the
|
|
62
|
+
// stack is noise.
|
|
63
|
+
if (isReamError(error, 'E_CONSOLE_COMMAND_NOT_FOUND')) {
|
|
64
|
+
this.logError(String(error.message), kernel)
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const code = Reflect.get(error, 'code')
|
|
69
|
+
if (
|
|
70
|
+
typeof code === 'string' &&
|
|
71
|
+
(this.internalKnownErrorCodes.includes(code) || this.knownErrorCodes.includes(code))
|
|
72
|
+
) {
|
|
73
|
+
this.logError(String(Reflect.get(error, 'message')), kernel)
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// An error that knows how to report itself is left to do it.
|
|
78
|
+
const render = Reflect.get(error, 'render')
|
|
79
|
+
if (typeof render === 'function') {
|
|
80
|
+
await Reflect.apply(render, error, [error, kernel])
|
|
81
|
+
return
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
if (!this.debug) {
|
|
85
|
+
kernel.logger.fatal(error instanceof Error ? error : String(error))
|
|
86
|
+
return
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
await this.prettyPrintError(error)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `help <command>` — the built-in command explaining another one (Console's
|
|
3
|
+
* `HelpCommand`).
|
|
4
|
+
*
|
|
5
|
+
* A registered command, not a branch in the dispatcher: `hasCommand('help')` is
|
|
6
|
+
* true, `exec('help', ['make:controller'])` works, and it is replaceable like
|
|
7
|
+
* any other. It reads METADATA, so explaining a command does not import it.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { BaseCommand } from './BaseCommand.js'
|
|
11
|
+
import { args } from './decorators.js'
|
|
12
|
+
import { renderErrorWithSuggestions } from './utils.js'
|
|
13
|
+
|
|
14
|
+
export default class HelpCommand extends BaseCommand {
|
|
15
|
+
static override commandName = 'help'
|
|
16
|
+
static override description = 'View help for a given command'
|
|
17
|
+
|
|
18
|
+
@args.string({ argumentName: 'command', description: 'Command name' })
|
|
19
|
+
declare name: string
|
|
20
|
+
|
|
21
|
+
run(): void {
|
|
22
|
+
const command = this.kernel.getCommand(this.name)
|
|
23
|
+
if (command === null) {
|
|
24
|
+
// The same report the kernel gives for an unknown command — one dead end,
|
|
25
|
+
// one wording.
|
|
26
|
+
renderErrorWithSuggestions(
|
|
27
|
+
this.logger,
|
|
28
|
+
`Command "${this.name}" is not defined.`,
|
|
29
|
+
this.kernel.getCommandSuggestions(this.name),
|
|
30
|
+
)
|
|
31
|
+
this.exitCode = 1
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
this.kernel.printCommandHelp(command)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writes a commands manifest next to the built commands (Console's
|
|
3
|
+
* `IndexGenerator`).
|
|
4
|
+
*
|
|
5
|
+
* What it buys: listing the commands, or checking that one exists, without
|
|
6
|
+
* importing a single command module. Scanning a directory means importing every
|
|
7
|
+
* file in it — the manifest replaces that with one JSON read.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { mkdir, writeFile } from 'node:fs/promises'
|
|
11
|
+
import { pathToFileURL } from 'node:url'
|
|
12
|
+
import { FsLoader } from './loaders.js'
|
|
13
|
+
import type { SerializedCommand } from './types.js'
|
|
14
|
+
|
|
15
|
+
/** What `commands.json` holds. `version` is there to survive a format change. */
|
|
16
|
+
export interface CommandsManifest {
|
|
17
|
+
version: 1
|
|
18
|
+
commands: SerializedCommand[]
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class IndexGenerator {
|
|
22
|
+
readonly #directory: URL
|
|
23
|
+
|
|
24
|
+
constructor(commandsDirectory: string | URL) {
|
|
25
|
+
this.#directory =
|
|
26
|
+
typeof commandsDirectory === 'string'
|
|
27
|
+
? pathToFileURL(`${commandsDirectory}/`)
|
|
28
|
+
: commandsDirectory
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Write `commands.json` and the `main.js` / `main.d.ts` loader beside the
|
|
33
|
+
* commands. Returns the manifest, so a caller can report what it indexed.
|
|
34
|
+
*/
|
|
35
|
+
async generate(): Promise<CommandsManifest> {
|
|
36
|
+
const commands = await new FsLoader(this.#directory).getMetaData()
|
|
37
|
+
const manifest: CommandsManifest = { version: 1, commands }
|
|
38
|
+
|
|
39
|
+
await mkdir(this.#directory, { recursive: true })
|
|
40
|
+
await writeFile(new URL('commands.json', this.#directory), JSON.stringify(manifest, null, 2))
|
|
41
|
+
await writeFile(new URL('main.js', this.#directory), LOADER)
|
|
42
|
+
await writeFile(new URL('main.d.ts', this.#directory), LOADER_TYPES)
|
|
43
|
+
|
|
44
|
+
return manifest
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* The generated loader. It satisfies `CommandLoader` structurally, so the
|
|
50
|
+
* kernel takes it as-is: `kernel.addLoader(await import('./commands/main.js'))`.
|
|
51
|
+
*/
|
|
52
|
+
const LOADER = `import { readFile } from 'node:fs/promises'
|
|
53
|
+
|
|
54
|
+
/** Generated by Ream's IndexGenerator — do not edit. */
|
|
55
|
+
let manifest
|
|
56
|
+
|
|
57
|
+
export async function getMetaData() {
|
|
58
|
+
if (manifest === undefined) {
|
|
59
|
+
const contents = await readFile(new URL('./commands.json', import.meta.url), 'utf-8')
|
|
60
|
+
manifest = JSON.parse(contents).commands
|
|
61
|
+
}
|
|
62
|
+
return manifest
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export async function getCommand(metadata) {
|
|
66
|
+
const commands = await getMetaData()
|
|
67
|
+
const command = commands.find((entry) => entry.commandName === metadata.commandName)
|
|
68
|
+
if (command === undefined) return null
|
|
69
|
+
|
|
70
|
+
const imported = await import(new URL(command.filePath, import.meta.url).href)
|
|
71
|
+
return imported.default ?? null
|
|
72
|
+
}
|
|
73
|
+
`
|
|
74
|
+
|
|
75
|
+
const LOADER_TYPES = `import type { CommandClass, SerializedCommand } from '@c9up/ream'
|
|
76
|
+
|
|
77
|
+
export declare function getMetaData(): Promise<SerializedCommand[]>
|
|
78
|
+
export declare function getCommand(metadata: SerializedCommand): Promise<CommandClass | null>
|
|
79
|
+
`
|