@avijs/core 0.1.2 → 0.2.1
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/dist/app.js +3 -3
- package/dist/app.js.map +1 -1
- package/dist/config.d.ts +43 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +63 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/pipeline.d.ts +6 -0
- package/dist/pipeline.d.ts.map +1 -1
- package/dist/pipeline.js.map +1 -1
- package/package.json +4 -4
- package/src/app.ts +3 -2
- package/src/config.ts +99 -0
- package/src/index.ts +11 -1
- package/src/pipeline.ts +7 -0
package/dist/app.js
CHANGED
|
@@ -37,8 +37,8 @@ class Application {
|
|
|
37
37
|
this.#manifest = options.manifest;
|
|
38
38
|
this.#overrides = options.overrides ?? [];
|
|
39
39
|
this.#logger = options.logger ?? {
|
|
40
|
-
error(message, error) {
|
|
41
|
-
console.error(message, error);
|
|
40
|
+
error(message, error, fields) {
|
|
41
|
+
console.error(fields?.requestId ? `${message} [${fields.requestId}]` : message, error);
|
|
42
42
|
},
|
|
43
43
|
};
|
|
44
44
|
}
|
|
@@ -148,7 +148,7 @@ class Application {
|
|
|
148
148
|
}
|
|
149
149
|
finally {
|
|
150
150
|
await scope.dispose().catch((error) => {
|
|
151
|
-
this.#logger.error(`Failed to dispose request-scoped providers: ${ctx.method} ${ctx.path}`, error);
|
|
151
|
+
this.#logger.error(`Failed to dispose request-scoped providers: ${ctx.method} ${ctx.path}`, error, { requestId: ctx.id, method: ctx.method, path: ctx.path });
|
|
152
152
|
});
|
|
153
153
|
}
|
|
154
154
|
};
|
package/dist/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA6C,MAAM,WAAW,CAAC;AACjF,OAAO,EACL,UAAU,EACV,MAAM,EACN,OAAO,GAQR,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAoB,MAAM,mBAAmB,CAAC;AAErE,OAAO,EAAE,QAAQ,EAA6B,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,eAAe,EAAuB,MAAM,eAAe,CAAC;AACtF,OAAO,EACL,YAAY,EACZ,QAAQ,GAIT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,SAAS,EACT,OAAO,GAMR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA2CvD,MAAM,UAAU,SAAS,CAAC,UAAsB,EAAE;IAChD,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,qFAAqF;IACrF,KAAK,CAAC,MAAM,CAAC,MAAiC,EAAE,OAAoB;QAClE,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC;CACF,CAAC;AAIF,MAAM,WAAW;IACN,OAAO,GAAG,IAAI,MAAM,EAAE,CAAC;IACvB,OAAO,CAAa;IACpB,MAAM,GAAgB,EAAE,CAAC;IACzB,WAAW,CAA2B;IACtC,OAAO,CAAsB;IAC7B,SAAS,CAA6B;IACtC,UAAU,CAAsB;IAChC,OAAO,CAAS;IACzB,UAAU,CAAwB;IAClC,OAAO,CAAmC;IAC1C,KAAK,CAA4B;IAEjC,YAAY,OAAmB;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;QAC1E,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI;YAC/B,KAAK,CAAC,OAAO,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type FactoryProvider, type InjectionToken } from '@avijs/di';
|
|
2
|
+
import type { InferOutput, StandardSchemaV1 } from '@avijs/validation';
|
|
3
|
+
import { type AviModule } from './module.js';
|
|
4
|
+
export interface ConfigOptions {
|
|
5
|
+
/** Name of the token in errors and manifests. Default: `Config`. */
|
|
6
|
+
name?: string;
|
|
7
|
+
/**
|
|
8
|
+
* A `.env` file to read. Environment variables that are already set win over it. A missing file
|
|
9
|
+
* is skipped unless `required` is set.
|
|
10
|
+
*/
|
|
11
|
+
envFile?: string | {
|
|
12
|
+
path: string;
|
|
13
|
+
required?: boolean;
|
|
14
|
+
};
|
|
15
|
+
/** The variables to validate. Default: `process.env`. Mostly for tests. */
|
|
16
|
+
env?: Readonly<Record<string, string | undefined>>;
|
|
17
|
+
}
|
|
18
|
+
/** A config token: inject it like any other, register it with `.module` or `.provider`. */
|
|
19
|
+
export interface ConfigToken<T> extends InjectionToken<T> {
|
|
20
|
+
/** A module that provides and exports the config. Import it wherever the config is needed. */
|
|
21
|
+
readonly module: AviModule;
|
|
22
|
+
/** The provider alone, for registering the config yourself. */
|
|
23
|
+
readonly provider: FactoryProvider<T>;
|
|
24
|
+
/** Reads and validates the config now, outside dependency injection. */
|
|
25
|
+
load(): Promise<T>;
|
|
26
|
+
}
|
|
27
|
+
/** Thrown when the environment does not match the config schema. Never contains the values. */
|
|
28
|
+
export declare class ConfigError extends Error {
|
|
29
|
+
readonly issues: readonly {
|
|
30
|
+
readonly key: string;
|
|
31
|
+
readonly message: string;
|
|
32
|
+
}[];
|
|
33
|
+
constructor(issues: readonly {
|
|
34
|
+
readonly key: string;
|
|
35
|
+
readonly message: string;
|
|
36
|
+
}[], name: string);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Typed configuration from environment variables, validated with any Standard Schema library.
|
|
40
|
+
* The app does not start while a variable is missing or invalid.
|
|
41
|
+
*/
|
|
42
|
+
export declare function defineConfig<S extends StandardSchemaV1>(schema: S, options?: ConfigOptions): ConfigToken<InferOutput<S>>;
|
|
43
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGvE,OAAO,EAAgB,KAAK,SAAS,EAAE,MAAM,aAAa,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACxD,2EAA2E;IAC3E,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACpD;AAED,2FAA2F;AAC3F,MAAM,WAAW,WAAW,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;IACvD,8FAA8F;IAC9F,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IACtC,wEAAwE;IACxE,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;CACpB;AAED,+FAA+F;AAC/F,qBAAa,WAAY,SAAQ,KAAK;IAElC,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE;gBAArE,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,EAC9E,IAAI,EAAE,MAAM;CAOf;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,gBAAgB,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,aAAkB,GAC1B,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAkC7B"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createToken } from '@avijs/di';
|
|
2
|
+
import { readFile } from 'node:fs/promises';
|
|
3
|
+
import { parseEnv } from 'node:util';
|
|
4
|
+
import { defineModule } from './module.js';
|
|
5
|
+
/** Thrown when the environment does not match the config schema. Never contains the values. */
|
|
6
|
+
export class ConfigError extends Error {
|
|
7
|
+
issues;
|
|
8
|
+
constructor(issues, name) {
|
|
9
|
+
super(`Invalid ${name === 'Config' ? 'configuration' : name}: ${issues.map((i) => `${i.key}: ${i.message}`).join('; ')}`);
|
|
10
|
+
this.issues = issues;
|
|
11
|
+
this.name = 'ConfigError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Typed configuration from environment variables, validated with any Standard Schema library.
|
|
16
|
+
* The app does not start while a variable is missing or invalid.
|
|
17
|
+
*/
|
|
18
|
+
export function defineConfig(schema, options = {}) {
|
|
19
|
+
if (typeof schema?.['~standard']?.validate !== 'function') {
|
|
20
|
+
throw new TypeError('defineConfig needs a Standard Schema, such as v.object() or z.object()');
|
|
21
|
+
}
|
|
22
|
+
const name = options.name ?? 'Config';
|
|
23
|
+
const file = typeof options.envFile === 'string' ? { path: options.envFile } : options.envFile;
|
|
24
|
+
const token = createToken(name);
|
|
25
|
+
const load = async () => {
|
|
26
|
+
const fromFile = file ? await readEnvFile(file.path, file.required ?? false) : {};
|
|
27
|
+
const env = { ...fromFile };
|
|
28
|
+
for (const [key, value] of Object.entries(options.env ?? process.env)) {
|
|
29
|
+
if (value !== undefined)
|
|
30
|
+
env[key] = value;
|
|
31
|
+
}
|
|
32
|
+
const result = await schema['~standard'].validate(env);
|
|
33
|
+
if (!result.issues)
|
|
34
|
+
return result.value;
|
|
35
|
+
throw new ConfigError(result.issues.map((issue) => {
|
|
36
|
+
const segment = issue.path?.[0];
|
|
37
|
+
const key = String(typeof segment === 'object' ? segment.key : (segment ?? '(config)'));
|
|
38
|
+
return { key, message: redact(issue.message, env[key]) };
|
|
39
|
+
}), name);
|
|
40
|
+
};
|
|
41
|
+
// The returned object is the token itself, so injecting `Config` finds this provider.
|
|
42
|
+
const config = { description: token.description, load };
|
|
43
|
+
config.provider = { provide: config, useFactory: load };
|
|
44
|
+
config.module = defineModule({ name, providers: [config.provider], exports: [config] });
|
|
45
|
+
return Object.freeze(config);
|
|
46
|
+
}
|
|
47
|
+
async function readEnvFile(path, required) {
|
|
48
|
+
let text;
|
|
49
|
+
try {
|
|
50
|
+
text = await readFile(path, 'utf8');
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
if (!required && error.code === 'ENOENT')
|
|
54
|
+
return {};
|
|
55
|
+
throw new Error(`Cannot read the env file ${path}`, { cause: error });
|
|
56
|
+
}
|
|
57
|
+
return parseEnv(text);
|
|
58
|
+
}
|
|
59
|
+
// Some libraries quote the received value in their messages; config values can be secrets.
|
|
60
|
+
function redact(message, value) {
|
|
61
|
+
return value ? message.replaceAll(value, '[redacted]') : message;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import './decorators.js';
|
|
2
2
|
export { AviFactory, createAvi } from './app.js';
|
|
3
3
|
export type { AviApp, AviOptions, RouteInfo } from './app.js';
|
|
4
|
+
export { ConfigError, defineConfig } from './config.js';
|
|
5
|
+
export type { ConfigOptions, ConfigToken } from './config.js';
|
|
4
6
|
export { defineController } from './controller.js';
|
|
5
7
|
export { describeApp } from './describe.js';
|
|
6
8
|
export type { AppDescription, ControllerDescription, ModuleSummary, RouteSummary, } from './describe.js';
|
|
@@ -11,10 +13,10 @@ export { defineModule } from './module.js';
|
|
|
11
13
|
export type { AviModule, ModuleOptions, ModuleRef } from './module.js';
|
|
12
14
|
export { route } from './pipeline.js';
|
|
13
15
|
export { REQUEST } from './request.js';
|
|
14
|
-
export type { GuardClass, GuardRef, MiddlewareClass, MiddlewareRef, Route, RouteDocs, TypedRoute, } from './pipeline.js';
|
|
16
|
+
export type { GuardClass, GuardRef, MiddlewareClass, MiddlewareRef, Route, RouteContext, RouteDocs, TypedRoute, } from './pipeline.js';
|
|
15
17
|
export type { InferInput, InferOutput, InputOf, PathParams, RouteSchema, StandardSchemaV1, ValidationIssue, } from '@avijs/validation';
|
|
16
|
-
export { HTTP_METHODS, HttpError, reply } from '@avijs/http';
|
|
17
|
-
export type { AviState, Context, ErrorHandler, Guard, Handler, HttpErrorOptions, HttpMethod, Logger, Middleware, Next, NoInput, Params, Reply, ReplyInit, RequestHook, ResponseInfo, RouteDefinition, } from '@avijs/http';
|
|
18
|
+
export { HTTP_METHODS, HttpError, jsonLogger, logRequests, reply, sse } from '@avijs/http';
|
|
19
|
+
export type { AviState, Context, ErrorHandler, Guard, Handler, HttpErrorOptions, HttpMethod, JsonLoggerOptions, LogFields, LogRequestsOptions, Logger, Middleware, Next, NoInput, Params, Reply, ReplyInit, RequestHook, RequestIdOptions, ResponseInfo, RouteDefinition, ServerSentEvent, SseOptions, SseSource, } from '@avijs/http';
|
|
18
20
|
export { createToken } from '@avijs/di';
|
|
19
21
|
export type { Class, ClassProvider, Constructor, FactoryProvider, InjectionToken, Provider, ResolveTokens, Scope, Token, TokenType, ValueProvider, } from '@avijs/di';
|
|
20
22
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,KAAK,EACL,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACjD,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,aAAa,EACb,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EACV,UAAU,EACV,QAAQ,EACR,eAAe,EACf,aAAa,EACb,KAAK,EACL,YAAY,EACZ,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,UAAU,EACV,WAAW,EACX,OAAO,EACP,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAC3F,YAAY,EACV,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,KAAK,EACL,OAAO,EACP,gBAAgB,EAChB,UAAU,EACV,iBAAiB,EACjB,SAAS,EACT,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,IAAI,EACJ,OAAO,EACP,MAAM,EACN,KAAK,EACL,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,eAAe,EACf,UAAU,EACV,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,eAAe,EACf,cAAc,EACd,QAAQ,EACR,aAAa,EACb,KAAK,EACL,KAAK,EACL,SAAS,EACT,aAAa,GACd,MAAM,WAAW,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import './decorators.js';
|
|
2
2
|
export { AviFactory, createAvi } from './app.js';
|
|
3
|
+
export { ConfigError, defineConfig } from './config.js';
|
|
3
4
|
export { defineController } from './controller.js';
|
|
4
5
|
export { describeApp } from './describe.js';
|
|
5
6
|
export { Controller, Delete, Get, Head, Injectable, Module, Options, Patch, Post, Put, UseGuards, UseMiddleware, } from './decorators.js';
|
|
6
7
|
export { defineModule } from './module.js';
|
|
7
8
|
export { route } from './pipeline.js';
|
|
8
9
|
export { REQUEST } from './request.js';
|
|
9
|
-
export { HTTP_METHODS, HttpError, reply } from '@avijs/http';
|
|
10
|
+
export { HTTP_METHODS, HttpError, jsonLogger, logRequests, reply, sse } from '@avijs/http';
|
|
10
11
|
export { createToken } from '@avijs/di';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,CAAC;AAEzB,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEjD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAExD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAQ5C,OAAO,EACL,UAAU,EACV,MAAM,EACN,GAAG,EACH,IAAI,EACJ,UAAU,EACV,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,EACJ,GAAG,EACH,SAAS,EACT,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAqBvC,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AA2B3F,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/pipeline.d.ts
CHANGED
|
@@ -32,6 +32,12 @@ export interface RouteDocs {
|
|
|
32
32
|
readonly operationId?: string;
|
|
33
33
|
readonly deprecated?: boolean;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* The context of a handler for route schema `S`, with `ctx.input` typed from it. Declare the
|
|
37
|
+
* schema once and use it in both places: `@Post('/', { schema: create })` and
|
|
38
|
+
* `create(ctx: RouteContext<typeof create>)`.
|
|
39
|
+
*/
|
|
40
|
+
export type RouteContext<S extends RouteSchema> = Context<InputOf<S>>;
|
|
35
41
|
/** A route whose handler is typed from its path and schema. Created with `route()`. */
|
|
36
42
|
export interface TypedRoute<P extends string, S extends RouteSchema> {
|
|
37
43
|
readonly method: HttpMethod;
|
package/dist/pipeline.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"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"}
|
package/dist/pipeline.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AA8DA;;;GAGG;AACH,MAAM,UAAU,KAAK,CACnB,UAA4B;IAE5B,OAAO,UAA8B,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,UAAU,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,SAAS,CACvB,IAA8B,EAC9B,MAAc,EACd,KAAa;IAEb,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,IAAI,GAAY,IAAI,CAAC;IAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,GAAG,KAAK,mBAAmB,CAAC,CAAC;IAC1E,IAAkB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACrC,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,SAAS,CACjB,GAAG,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,kCAAkC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,EAAE,EAAE,CACnH,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,GAAG,GAA4D,CAAC;QACxE,IAAI,OAAO,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,KAAK,UAAU,EAAE,CAAC;YAChE,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,OAAO,KAAK,YAAY,MAAM,WAAW,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAClC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@avijs/core",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Avi.js public API: application factory, modules and controllers.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"avi",
|
|
@@ -43,9 +43,9 @@
|
|
|
43
43
|
"access": "public"
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@avijs/di": "0.1
|
|
47
|
-
"@avijs/http": "0.1
|
|
48
|
-
"@avijs/validation": "0.1
|
|
46
|
+
"@avijs/di": "0.2.1",
|
|
47
|
+
"@avijs/http": "0.2.1",
|
|
48
|
+
"@avijs/validation": "0.2.1"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"valibot": "1.5.0"
|
package/src/app.ts
CHANGED
|
@@ -110,8 +110,8 @@ class Application implements AviApp {
|
|
|
110
110
|
this.#manifest = options.manifest;
|
|
111
111
|
this.#overrides = options.overrides ?? [];
|
|
112
112
|
this.#logger = options.logger ?? {
|
|
113
|
-
error(message, error) {
|
|
114
|
-
console.error(message, error);
|
|
113
|
+
error(message, error, fields) {
|
|
114
|
+
console.error(fields?.requestId ? `${message} [${fields.requestId}]` : message, error);
|
|
115
115
|
},
|
|
116
116
|
};
|
|
117
117
|
}
|
|
@@ -246,6 +246,7 @@ class Application implements AviApp {
|
|
|
246
246
|
this.#logger.error(
|
|
247
247
|
`Failed to dispose request-scoped providers: ${ctx.method} ${ctx.path}`,
|
|
248
248
|
error,
|
|
249
|
+
{ requestId: ctx.id, method: ctx.method, path: ctx.path },
|
|
249
250
|
);
|
|
250
251
|
});
|
|
251
252
|
}
|
package/src/config.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { createToken, type FactoryProvider, type InjectionToken } from '@avijs/di';
|
|
2
|
+
import type { InferOutput, StandardSchemaV1 } from '@avijs/validation';
|
|
3
|
+
import { readFile } from 'node:fs/promises';
|
|
4
|
+
import { parseEnv } from 'node:util';
|
|
5
|
+
import { defineModule, type AviModule } from './module.js';
|
|
6
|
+
|
|
7
|
+
export interface ConfigOptions {
|
|
8
|
+
/** Name of the token in errors and manifests. Default: `Config`. */
|
|
9
|
+
name?: string;
|
|
10
|
+
/**
|
|
11
|
+
* A `.env` file to read. Environment variables that are already set win over it. A missing file
|
|
12
|
+
* is skipped unless `required` is set.
|
|
13
|
+
*/
|
|
14
|
+
envFile?: string | { path: string; required?: boolean };
|
|
15
|
+
/** The variables to validate. Default: `process.env`. Mostly for tests. */
|
|
16
|
+
env?: Readonly<Record<string, string | undefined>>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/** A config token: inject it like any other, register it with `.module` or `.provider`. */
|
|
20
|
+
export interface ConfigToken<T> extends InjectionToken<T> {
|
|
21
|
+
/** A module that provides and exports the config. Import it wherever the config is needed. */
|
|
22
|
+
readonly module: AviModule;
|
|
23
|
+
/** The provider alone, for registering the config yourself. */
|
|
24
|
+
readonly provider: FactoryProvider<T>;
|
|
25
|
+
/** Reads and validates the config now, outside dependency injection. */
|
|
26
|
+
load(): Promise<T>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Thrown when the environment does not match the config schema. Never contains the values. */
|
|
30
|
+
export class ConfigError extends Error {
|
|
31
|
+
constructor(
|
|
32
|
+
readonly issues: readonly { readonly key: string; readonly message: string }[],
|
|
33
|
+
name: string,
|
|
34
|
+
) {
|
|
35
|
+
super(
|
|
36
|
+
`Invalid ${name === 'Config' ? 'configuration' : name}: ${issues.map((i) => `${i.key}: ${i.message}`).join('; ')}`,
|
|
37
|
+
);
|
|
38
|
+
this.name = 'ConfigError';
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Typed configuration from environment variables, validated with any Standard Schema library.
|
|
44
|
+
* The app does not start while a variable is missing or invalid.
|
|
45
|
+
*/
|
|
46
|
+
export function defineConfig<S extends StandardSchemaV1>(
|
|
47
|
+
schema: S,
|
|
48
|
+
options: ConfigOptions = {},
|
|
49
|
+
): ConfigToken<InferOutput<S>> {
|
|
50
|
+
if (typeof (schema as Partial<StandardSchemaV1> | null)?.['~standard']?.validate !== 'function') {
|
|
51
|
+
throw new TypeError('defineConfig needs a Standard Schema, such as v.object() or z.object()');
|
|
52
|
+
}
|
|
53
|
+
const name = options.name ?? 'Config';
|
|
54
|
+
const file = typeof options.envFile === 'string' ? { path: options.envFile } : options.envFile;
|
|
55
|
+
const token = createToken<InferOutput<S>>(name);
|
|
56
|
+
|
|
57
|
+
const load = async (): Promise<InferOutput<S>> => {
|
|
58
|
+
const fromFile = file ? await readEnvFile(file.path, file.required ?? false) : {};
|
|
59
|
+
const env: Record<string, string> = { ...fromFile };
|
|
60
|
+
for (const [key, value] of Object.entries(options.env ?? process.env)) {
|
|
61
|
+
if (value !== undefined) env[key] = value;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const result = await schema['~standard'].validate(env);
|
|
65
|
+
if (!result.issues) return result.value;
|
|
66
|
+
throw new ConfigError(
|
|
67
|
+
result.issues.map((issue) => {
|
|
68
|
+
const segment = issue.path?.[0];
|
|
69
|
+
const key = String(typeof segment === 'object' ? segment.key : (segment ?? '(config)'));
|
|
70
|
+
return { key, message: redact(issue.message, env[key]) };
|
|
71
|
+
}),
|
|
72
|
+
name,
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// The returned object is the token itself, so injecting `Config` finds this provider.
|
|
77
|
+
const config = { description: token.description, load } as {
|
|
78
|
+
-readonly [K in keyof ConfigToken<InferOutput<S>>]: ConfigToken<InferOutput<S>>[K];
|
|
79
|
+
};
|
|
80
|
+
config.provider = { provide: config, useFactory: load };
|
|
81
|
+
config.module = defineModule({ name, providers: [config.provider], exports: [config] });
|
|
82
|
+
return Object.freeze(config);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async function readEnvFile(path: string, required: boolean): Promise<Record<string, string>> {
|
|
86
|
+
let text: string;
|
|
87
|
+
try {
|
|
88
|
+
text = await readFile(path, 'utf8');
|
|
89
|
+
} catch (error) {
|
|
90
|
+
if (!required && (error as NodeJS.ErrnoException).code === 'ENOENT') return {};
|
|
91
|
+
throw new Error(`Cannot read the env file ${path}`, { cause: error });
|
|
92
|
+
}
|
|
93
|
+
return parseEnv(text) as Record<string, string>;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Some libraries quote the received value in their messages; config values can be secrets.
|
|
97
|
+
function redact(message: string, value: string | undefined): string {
|
|
98
|
+
return value ? message.replaceAll(value, '[redacted]') : message;
|
|
99
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -2,6 +2,8 @@ import './decorators.js';
|
|
|
2
2
|
|
|
3
3
|
export { AviFactory, createAvi } from './app.js';
|
|
4
4
|
export type { AviApp, AviOptions, RouteInfo } from './app.js';
|
|
5
|
+
export { ConfigError, defineConfig } from './config.js';
|
|
6
|
+
export type { ConfigOptions, ConfigToken } from './config.js';
|
|
5
7
|
export { defineController } from './controller.js';
|
|
6
8
|
export { describeApp } from './describe.js';
|
|
7
9
|
export type {
|
|
@@ -36,6 +38,7 @@ export type {
|
|
|
36
38
|
MiddlewareClass,
|
|
37
39
|
MiddlewareRef,
|
|
38
40
|
Route,
|
|
41
|
+
RouteContext,
|
|
39
42
|
RouteDocs,
|
|
40
43
|
TypedRoute,
|
|
41
44
|
} from './pipeline.js';
|
|
@@ -49,7 +52,7 @@ export type {
|
|
|
49
52
|
ValidationIssue,
|
|
50
53
|
} from '@avijs/validation';
|
|
51
54
|
|
|
52
|
-
export { HTTP_METHODS, HttpError, reply } from '@avijs/http';
|
|
55
|
+
export { HTTP_METHODS, HttpError, jsonLogger, logRequests, reply, sse } from '@avijs/http';
|
|
53
56
|
export type {
|
|
54
57
|
AviState,
|
|
55
58
|
Context,
|
|
@@ -58,6 +61,9 @@ export type {
|
|
|
58
61
|
Handler,
|
|
59
62
|
HttpErrorOptions,
|
|
60
63
|
HttpMethod,
|
|
64
|
+
JsonLoggerOptions,
|
|
65
|
+
LogFields,
|
|
66
|
+
LogRequestsOptions,
|
|
61
67
|
Logger,
|
|
62
68
|
Middleware,
|
|
63
69
|
Next,
|
|
@@ -66,8 +72,12 @@ export type {
|
|
|
66
72
|
Reply,
|
|
67
73
|
ReplyInit,
|
|
68
74
|
RequestHook,
|
|
75
|
+
RequestIdOptions,
|
|
69
76
|
ResponseInfo,
|
|
70
77
|
RouteDefinition,
|
|
78
|
+
ServerSentEvent,
|
|
79
|
+
SseOptions,
|
|
80
|
+
SseSource,
|
|
71
81
|
} from '@avijs/http';
|
|
72
82
|
export { createToken } from '@avijs/di';
|
|
73
83
|
export type {
|
package/src/pipeline.ts
CHANGED
|
@@ -42,6 +42,13 @@ export interface RouteDocs {
|
|
|
42
42
|
readonly deprecated?: boolean;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
+
/**
|
|
46
|
+
* The context of a handler for route schema `S`, with `ctx.input` typed from it. Declare the
|
|
47
|
+
* schema once and use it in both places: `@Post('/', { schema: create })` and
|
|
48
|
+
* `create(ctx: RouteContext<typeof create>)`.
|
|
49
|
+
*/
|
|
50
|
+
export type RouteContext<S extends RouteSchema> = Context<InputOf<S>>;
|
|
51
|
+
|
|
45
52
|
/** A route whose handler is typed from its path and schema. Created with `route()`. */
|
|
46
53
|
export interface TypedRoute<P extends string, S extends RouteSchema> {
|
|
47
54
|
readonly method: HttpMethod;
|