rlz-engine 1.0.57 → 1.0.59
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 +15 -8
- package/dist/back/certificate/cli.d.ts +3 -0
- package/dist/back/certificate/cli.js +17 -0
- package/dist/back/certificate/cli.js.map +1 -0
- package/dist/back/certificate/module.d.ts +2 -0
- package/dist/back/certificate/module.js +2 -0
- package/dist/back/certificate/module.js.map +1 -1
- package/dist/back/cli/cli-engine.d.ts +14 -2
- package/dist/back/cli/cli-engine.js +4 -0
- package/dist/back/cli/cli-engine.js.map +1 -1
- package/dist/back/logger/cli.d.ts +1 -1
- package/dist/back/logger/cli.js +3 -2
- package/dist/back/logger/cli.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,14 +29,15 @@ import { syncItems } from 'rlz-engine/client/sync.js'
|
|
|
29
29
|
|
|
30
30
|
Each backend feature lives in a cohesive directory and exposes an uppercase `<FEATURE>_MODULE` object from `module.ts`. The object contains only the integration factories that feature supports. Applications invoke the factories for the integrations they want, then pass the returned facet values to `composeModules()`.
|
|
31
31
|
|
|
32
|
-
| Module
|
|
33
|
-
|
|
|
34
|
-
| `AUTH_MODULE`
|
|
35
|
-
| `
|
|
36
|
-
| `
|
|
37
|
-
| `
|
|
32
|
+
| Module | Facets | Purpose |
|
|
33
|
+
| -------------------- | ----------------------------------------- | ------------------------------------------------------------------- |
|
|
34
|
+
| `AUTH_MODULE` | `makeRpc(storage, options?)`, `makeCli()` | Signup/signin/session/logout RPC endpoints and admin secret command |
|
|
35
|
+
| `CERTIFICATE_MODULE` | `makeCli()`, `makeAdmRpc()`, `makeAdm()` | ACME account registration and certificate status |
|
|
36
|
+
| `HTTP_MODULE` | `makeCli(params, options?)` | `http start` server command |
|
|
37
|
+
| `LOGGER_MODULE` | `makeCli()`, `makeAdmRpc()` | Audit-log reader command and protected audit query endpoint |
|
|
38
|
+
| `RPC_MODULE` | `makeDevCli(options)` | Generate user and administrative RPC clients during development |
|
|
38
39
|
|
|
39
|
-
The composer groups selected operational CLI, development CLI, user RPC, and administrative RPC facets. It rejects duplicate names within each facet kind before startup. It deliberately leaves factory arguments with the application: server settings, route handlers, working directories, and generated-client paths are application-specific. The React administration UI and certificate-status module
|
|
40
|
+
The composer groups selected operational CLI, development CLI, user RPC, and administrative RPC facets. It rejects duplicate names within each facet kind before startup. It deliberately leaves factory arguments with the application: server settings, route handlers, working directories, and generated-client paths are application-specific. The React administration UI, audit-log viewer, and certificate-status module are available as opt-in modules.
|
|
40
41
|
|
|
41
42
|
### CLI composition
|
|
42
43
|
|
|
@@ -46,6 +47,7 @@ The composer groups selected operational CLI, development CLI, user RPC, and adm
|
|
|
46
47
|
import { CliEngine, DevCliEngine } from 'rlz-engine/back/cli/cli-engine.js'
|
|
47
48
|
import { composeModules } from 'rlz-engine/back/module/composer.js'
|
|
48
49
|
import { AUTH_MODULE } from 'rlz-engine/back/auth/module.js'
|
|
50
|
+
import { CERTIFICATE_MODULE } from 'rlz-engine/back/certificate/module.js'
|
|
49
51
|
import { HTTP_MODULE } from 'rlz-engine/back/http/module.js'
|
|
50
52
|
import { LOGGER_MODULE } from 'rlz-engine/back/logger/module.js'
|
|
51
53
|
import { RPC_MODULE } from 'rlz-engine/back/rpc/module.js'
|
|
@@ -55,7 +57,12 @@ const applicationPlugin = async (server) => {
|
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
const applicationModules = composeModules({
|
|
58
|
-
cli: [
|
|
60
|
+
cli: [
|
|
61
|
+
AUTH_MODULE.makeCli(),
|
|
62
|
+
CERTIFICATE_MODULE.makeCli(),
|
|
63
|
+
HTTP_MODULE.makeCli(serverParams, { plugins: [applicationPlugin] }),
|
|
64
|
+
LOGGER_MODULE.makeCli()
|
|
65
|
+
],
|
|
59
66
|
rpc: userRpcPlugins,
|
|
60
67
|
admRpc: [LOGGER_MODULE.makeAdmRpc()]
|
|
61
68
|
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { registerAcmeAccountCli } from 'fastify-acme';
|
|
2
|
+
/** Create the ACME account registration command. */
|
|
3
|
+
export function makeCertificateCli() {
|
|
4
|
+
return {
|
|
5
|
+
name: 'certificates',
|
|
6
|
+
description: 'Manage server certificate setup.',
|
|
7
|
+
commands: {
|
|
8
|
+
'register-acme': {
|
|
9
|
+
description: 'Register the ACME account used for TLS certificates.',
|
|
10
|
+
handler: async () => {
|
|
11
|
+
await registerAcmeAccountCli();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/back/certificate/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAA;AAIrD,oDAAoD;AACpD,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,kCAAkC;QAC/C,QAAQ,EAAE;YACN,eAAe,EAAE;gBACb,WAAW,EAAE,sDAAsD;gBACnE,OAAO,EAAE,KAAK,IAAI,EAAE;oBAChB,MAAM,sBAAsB,EAAE,CAAA;gBAClC,CAAC;aACJ;SACJ;KACJ,CAAA;AACL,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { AdmModule } from '../../client/adm/admin.js';
|
|
2
2
|
import { makeCertificateAdmRpc } from './adm-rpc.js';
|
|
3
|
+
import { makeCertificateCli } from './cli.js';
|
|
3
4
|
export interface CertificateModuleOptions {
|
|
4
5
|
certDir: string;
|
|
5
6
|
domain: string;
|
|
@@ -7,6 +8,7 @@ export interface CertificateModuleOptions {
|
|
|
7
8
|
declare function makeAdm(): AdmModule;
|
|
8
9
|
/** TLS certificate status integrations. */
|
|
9
10
|
export declare const CERTIFICATE_MODULE: {
|
|
11
|
+
makeCli: typeof makeCertificateCli;
|
|
10
12
|
makeAdmRpc: typeof makeCertificateAdmRpc;
|
|
11
13
|
makeAdm: typeof makeAdm;
|
|
12
14
|
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { admRpcCall } from '../../client/rpc.js';
|
|
2
2
|
import { CertificateStatus } from '../../client/adm/certificate.js';
|
|
3
3
|
import { makeCertificateAdmRpc } from './adm-rpc.js';
|
|
4
|
+
import { makeCertificateCli } from './cli.js';
|
|
4
5
|
function makeAdm() {
|
|
5
6
|
return {
|
|
6
7
|
name: 'certificate',
|
|
@@ -13,6 +14,7 @@ function makeAdm() {
|
|
|
13
14
|
}
|
|
14
15
|
/** TLS certificate status integrations. */
|
|
15
16
|
export const CERTIFICATE_MODULE = {
|
|
17
|
+
makeCli: makeCertificateCli,
|
|
16
18
|
makeAdmRpc: makeCertificateAdmRpc,
|
|
17
19
|
makeAdm
|
|
18
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/back/certificate/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../../src/back/certificate/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAA;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAA;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAA;AAO7C,SAAS,OAAO;IACZ,OAAO;QACH,IAAI,EAAE,aAAa;QACnB,KAAK,EAAE,aAAa;QACpB,SAAS,EAAE,iBAAiB;QAC5B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YACnB,MAAM,UAAU,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC1D,CAAC;KACJ,CAAA;AACL,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAC9B,OAAO,EAAE,kBAAkB;IAC3B,UAAU,EAAE,qBAAqB;IACjC,OAAO;CACV,CAAA"}
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
+
import type { ArgParser, ParsingInto } from 'cmd-ts/dist/esm/argparser.js';
|
|
2
|
+
type CliArgs = Record<string, ArgParser<any>>;
|
|
3
|
+
type ParsedCliArgs<Args extends CliArgs> = {
|
|
4
|
+
[Key in keyof Args]: ParsingInto<Args[Key]>;
|
|
5
|
+
};
|
|
1
6
|
/** One command leaf exposed under a CLI module namespace. */
|
|
2
7
|
export interface CliCommand {
|
|
3
8
|
readonly description: string;
|
|
4
|
-
readonly args?: Readonly<
|
|
5
|
-
readonly handler: (args:
|
|
9
|
+
readonly args?: Readonly<CliArgs>;
|
|
10
|
+
readonly handler: (args: any) => void | Promise<void>;
|
|
6
11
|
}
|
|
12
|
+
/** Define a CLI command while inferring its parsed handler arguments from cmd-ts parsers. */
|
|
13
|
+
export declare function cliCommand<Args extends CliArgs>(config: {
|
|
14
|
+
readonly description: string;
|
|
15
|
+
readonly args: Args;
|
|
16
|
+
readonly handler: (args: ParsedCliArgs<Args>) => void | Promise<void>;
|
|
17
|
+
}): CliCommand;
|
|
7
18
|
/** A namespaced group of related commands, such as `http start`. */
|
|
8
19
|
export interface CliModule {
|
|
9
20
|
readonly name: string;
|
|
@@ -23,3 +34,4 @@ export declare class CliEngine {
|
|
|
23
34
|
/** Development-only commands belong in a separate entry point from the application's operational CLI. */
|
|
24
35
|
export declare class DevCliEngine extends CliEngine {
|
|
25
36
|
}
|
|
37
|
+
export {};
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { command, run as runCommand, subcommands } from 'cmd-ts';
|
|
2
|
+
/** Define a CLI command while inferring its parsed handler arguments from cmd-ts parsers. */
|
|
3
|
+
export function cliCommand(config) {
|
|
4
|
+
return config;
|
|
5
|
+
}
|
|
2
6
|
/** Builds and runs an application's operational command tree. */
|
|
3
7
|
export class CliEngine {
|
|
4
8
|
binaryName;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli-engine.js","sourceRoot":"","sources":["../../../src/back/cli/cli-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,GAAG,IAAI,UAAU,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"cli-engine.js","sourceRoot":"","sources":["../../../src/back/cli/cli-engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CliModule } from '../cli/cli-engine.js';
|
|
2
2
|
export declare function makeAuditLogCliModule(workingDirectory?: string | (() => string)): CliModule;
|
package/dist/back/logger/cli.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { number, oneOf, option, optional, string } from 'cmd-ts';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
+
import { cliCommand } from '../cli/cli-engine.js';
|
|
3
4
|
import { formatAuditRecord } from './format.js';
|
|
4
5
|
import { readAuditLogFile } from './sqlite-storage.js';
|
|
5
6
|
const levels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];
|
|
@@ -8,7 +9,7 @@ export function makeAuditLogCliModule(workingDirectory = () => process.cwd()) {
|
|
|
8
9
|
name: 'logger',
|
|
9
10
|
description: 'Read and inspect persisted audit logs.',
|
|
10
11
|
commands: {
|
|
11
|
-
logs: {
|
|
12
|
+
logs: cliCommand({
|
|
12
13
|
description: 'Read audit records from a SQLite database with optional filters.',
|
|
13
14
|
args: {
|
|
14
15
|
database: option({
|
|
@@ -36,7 +37,7 @@ export function makeAuditLogCliModule(workingDirectory = () => process.cwd()) {
|
|
|
36
37
|
});
|
|
37
38
|
process.stdout.write(page.records.map((record) => formatAuditRecord(record)).join(''));
|
|
38
39
|
}
|
|
39
|
-
}
|
|
40
|
+
})
|
|
40
41
|
}
|
|
41
42
|
};
|
|
42
43
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/back/logger/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/back/logger/cli.ts"],"names":[],"mappings":"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"}
|