@getsoda/core 0.2.1 → 0.2.2
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 +23 -0
- package/dist/config/config.d.ts +57 -0
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/config.js +72 -0
- package/dist/config/config.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/module.d.ts +29 -0
- package/dist/config/module.d.ts.map +1 -0
- package/dist/config/module.js +28 -0
- package/dist/config/module.js.map +1 -0
- package/dist/http/decorators.d.ts +6 -1
- package/dist/http/decorators.d.ts.map +1 -1
- package/dist/http/decorators.js.map +1 -1
- package/dist/http/index.d.ts +1 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js.map +1 -1
- package/dist/http/schema.d.ts +2 -0
- package/dist/http/schema.d.ts.map +1 -1
- package/dist/http/schema.js +2 -1
- package/dist/http/schema.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/config/config.ts +88 -0
- package/src/config/index.ts +9 -0
- package/src/config/module.ts +40 -0
- package/src/http/decorators.ts +9 -2
- package/src/http/index.ts +1 -0
- package/src/http/schema.ts +2 -1
- package/src/index.ts +1 -0
package/README.md
CHANGED
|
@@ -72,6 +72,29 @@ app.enableShutdownSignals()
|
|
|
72
72
|
await app.listen(3000)
|
|
73
73
|
```
|
|
74
74
|
|
|
75
|
+
## Configuration
|
|
76
|
+
|
|
77
|
+
A configuration is a schema over the environment (Bun loads `.env` files into it), validated when the application starts and injected with its type:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
import { ConfigModule, defineConfig } from '@getsoda/core'
|
|
81
|
+
import { z } from 'zod'
|
|
82
|
+
|
|
83
|
+
export const AppConfig = defineConfig('app', z.object({
|
|
84
|
+
PORT: z.coerce.number().default(3000),
|
|
85
|
+
JWT_SECRET: z.string().min(32),
|
|
86
|
+
}))
|
|
87
|
+
|
|
88
|
+
@Module({ imports: [ConfigModule.forRoot({ load: [AppConfig], global: true })] })
|
|
89
|
+
class AppModule {}
|
|
90
|
+
|
|
91
|
+
class AuthService {
|
|
92
|
+
readonly #config = inject(AppConfig) // { PORT: number; JWT_SECRET: string }
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
An invalid environment stops the startup with every issue listed. `defineConfig(name, schema, (env) => ({ ... }))` builds nested configurations; tests replace one with `overrides: [provide(AppConfig, { useValue })]`.
|
|
97
|
+
|
|
75
98
|
## Cookies
|
|
76
99
|
|
|
77
100
|
`ctx.cookies` is Bun's `CookieMap` for the request: what you set or delete is sent with the response, whatever the response is. Signed cookies can be read by the client but not forged:
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*
|
|
5
|
+
* What `@nestjs/config` does with `registerAs()` and a `validationSchema`,
|
|
6
|
+
* typed by the schema instead of read with string keys. Bun already loads
|
|
7
|
+
* `.env`, `.env.local` and `.env.<NODE_ENV>` into `process.env`.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* export const AppConfig = defineConfig('app', z.object({
|
|
11
|
+
* PORT: z.coerce.number().default(3000),
|
|
12
|
+
* JWT_SECRET: z.string().min(32),
|
|
13
|
+
* }))
|
|
14
|
+
*
|
|
15
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig], global: true })] })
|
|
16
|
+
* class AppModule {}
|
|
17
|
+
*
|
|
18
|
+
* class AuthService {
|
|
19
|
+
* readonly #config = inject(AppConfig) // { PORT: number; JWT_SECRET: string }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { InjectionToken } from '../di/token.ts';
|
|
24
|
+
import type { InferOutput, StandardSchemaV1 } from '../http/schema.ts';
|
|
25
|
+
/** Environment variables, as in `process.env`. */
|
|
26
|
+
export type Environment = Readonly<Record<string, string | undefined>>;
|
|
27
|
+
/** A configuration that does not match its schema; `issues` lists every problem. */
|
|
28
|
+
export declare class ConfigError extends Error {
|
|
29
|
+
readonly config: string;
|
|
30
|
+
readonly issues: readonly string[];
|
|
31
|
+
readonly name = "ConfigError";
|
|
32
|
+
constructor(config: string, issues: readonly string[]);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A configuration, and the DI token of its value: `inject(AppConfig)`.
|
|
36
|
+
* `ConfigModule.forRoot()` loads it at startup; `load()` works without DI.
|
|
37
|
+
*/
|
|
38
|
+
export declare class Config<T> extends InjectionToken<T> {
|
|
39
|
+
#private;
|
|
40
|
+
constructor(name: string, schema: StandardSchemaV1<unknown, T>, source: (env: Environment) => unknown);
|
|
41
|
+
/** The value read from `env` and validated; throws a {@link ConfigError} listing every issue. */
|
|
42
|
+
load(env?: Environment): Promise<T>;
|
|
43
|
+
toString(): string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Defines a configuration validated by `schema`. Its input is the environment,
|
|
47
|
+
* or what `source` builds from it, for a nested configuration:
|
|
48
|
+
*
|
|
49
|
+
* ```ts
|
|
50
|
+
* const DatabaseConfig = defineConfig('database', DatabaseSchema, (env) => ({
|
|
51
|
+
* url: env.DATABASE_URL,
|
|
52
|
+
* pool: { max: env.DATABASE_POOL_MAX },
|
|
53
|
+
* }))
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare const defineConfig: <S extends StandardSchemaV1>(name: string, schema: S, source?: (env: Environment) => unknown) => Config<InferOutput<S>>;
|
|
57
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEtE,kDAAkD;AAClD,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;AAEtE,oFAAoF;AACpF,qBAAa,WAAY,SAAQ,KAAK;IAIlC,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE;IAJpC,SAAkB,IAAI,iBAAgB;IAEtC,YACW,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,MAAM,EAAE,EAGnC;CACF;AAED;;;GAGG;AACH,qBAAa,MAAM,CAAC,CAAC,CAAE,SAAQ,cAAc,CAAC,CAAC,CAAC;;IAI9C,YAAY,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,EAIpG;IAED,iGAAiG;IAC3F,IAAI,CAAC,GAAG,GAAE,WAAyB,GAAG,OAAO,CAAC,CAAC,CAAC,CAQrD;IAEQ,QAAQ,IAAI,MAAM,CAE1B;CACF;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,gBAAgB,QAC/C,MAAM,UACJ,CAAC,WACD,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,KACpC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAkF,CAAA"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*
|
|
5
|
+
* What `@nestjs/config` does with `registerAs()` and a `validationSchema`,
|
|
6
|
+
* typed by the schema instead of read with string keys. Bun already loads
|
|
7
|
+
* `.env`, `.env.local` and `.env.<NODE_ENV>` into `process.env`.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* export const AppConfig = defineConfig('app', z.object({
|
|
11
|
+
* PORT: z.coerce.number().default(3000),
|
|
12
|
+
* JWT_SECRET: z.string().min(32),
|
|
13
|
+
* }))
|
|
14
|
+
*
|
|
15
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig], global: true })] })
|
|
16
|
+
* class AppModule {}
|
|
17
|
+
*
|
|
18
|
+
* class AuthService {
|
|
19
|
+
* readonly #config = inject(AppConfig) // { PORT: number; JWT_SECRET: string }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
import { InjectionToken } from '../di/token.js';
|
|
24
|
+
import { formatIssues } from '../http/schema.js';
|
|
25
|
+
/** A configuration that does not match its schema; `issues` lists every problem. */
|
|
26
|
+
export class ConfigError extends Error {
|
|
27
|
+
config;
|
|
28
|
+
issues;
|
|
29
|
+
name = 'ConfigError';
|
|
30
|
+
constructor(config, issues) {
|
|
31
|
+
super(`Invalid configuration "${config}":\n ${issues.join('\n ')}`);
|
|
32
|
+
this.config = config;
|
|
33
|
+
this.issues = issues;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A configuration, and the DI token of its value: `inject(AppConfig)`.
|
|
38
|
+
* `ConfigModule.forRoot()` loads it at startup; `load()` works without DI.
|
|
39
|
+
*/
|
|
40
|
+
export class Config extends InjectionToken {
|
|
41
|
+
#schema;
|
|
42
|
+
#source;
|
|
43
|
+
constructor(name, schema, source) {
|
|
44
|
+
super(name);
|
|
45
|
+
this.#schema = schema;
|
|
46
|
+
this.#source = source;
|
|
47
|
+
}
|
|
48
|
+
/** The value read from `env` and validated; throws a {@link ConfigError} listing every issue. */
|
|
49
|
+
async load(env = process.env) {
|
|
50
|
+
const result = await this.#schema['~standard'].validate(this.#source(env));
|
|
51
|
+
if (result.issues !== undefined) {
|
|
52
|
+
throw new ConfigError(this.description, formatIssues(result.issues, ''));
|
|
53
|
+
}
|
|
54
|
+
return result.value;
|
|
55
|
+
}
|
|
56
|
+
toString() {
|
|
57
|
+
return `Config(${this.description})`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Defines a configuration validated by `schema`. Its input is the environment,
|
|
62
|
+
* or what `source` builds from it, for a nested configuration:
|
|
63
|
+
*
|
|
64
|
+
* ```ts
|
|
65
|
+
* const DatabaseConfig = defineConfig('database', DatabaseSchema, (env) => ({
|
|
66
|
+
* url: env.DATABASE_URL,
|
|
67
|
+
* pool: { max: env.DATABASE_POOL_MAX },
|
|
68
|
+
* }))
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export const defineConfig = (name, schema, source = (env) => env) => new Config(name, schema, source);
|
|
72
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMhD,oFAAoF;AACpF,MAAM,OAAO,WAAY,SAAQ,KAAK;IAIzB,MAAM;IACN,MAAM;IAJC,IAAI,GAAG,aAAa,CAAA;IAEtC,YACW,MAAc,EACd,MAAyB;QAElC,KAAK,CAAC,0BAA0B,MAAM,SAAS,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;sBAH5D,MAAM;sBACN,MAAM;IAGjB,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,MAAU,SAAQ,cAAiB;IACrC,OAAO,CAA8B;IACrC,OAAO,CAA+B;IAE/C,YAAY,IAAY,EAAE,MAAoC,EAAE,MAAqC;QACnG,KAAK,CAAC,IAAI,CAAC,CAAA;QACX,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;QACrB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,iGAAiG;IACjG,KAAK,CAAC,IAAI,CAAC,GAAG,GAAgB,OAAO,CAAC,GAAG;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;QAE1E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO,MAAM,CAAC,KAAK,CAAA;IACrB,CAAC;IAEQ,QAAQ;QACf,OAAO,UAAU,IAAI,CAAC,WAAW,GAAG,CAAA;IACtC,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAY,EACZ,MAAS,EACT,MAAM,GAAkC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,EAC5B,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,MAAmD,EAAE,MAAM,CAAC,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*/
|
|
5
|
+
export { Config, ConfigError, defineConfig } from './config.ts';
|
|
6
|
+
export type { Environment } from './config.ts';
|
|
7
|
+
export { ConfigModule } from './module.ts';
|
|
8
|
+
export type { ConfigModuleOptions } from './module.ts';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* `ConfigModule`: loads configurations at startup, like `ConfigModule.forRoot()` of `@nestjs/config`.
|
|
4
|
+
*/
|
|
5
|
+
import type { DynamicModule } from '../di/index.ts';
|
|
6
|
+
import type { Config, Environment } from './config.ts';
|
|
7
|
+
export interface ConfigModuleOptions {
|
|
8
|
+
/** Configurations to load and provide. */
|
|
9
|
+
readonly load: readonly Config<unknown>[];
|
|
10
|
+
/** Makes them injectable in every module. Defaults to `false`, as in Nest. */
|
|
11
|
+
readonly global?: boolean;
|
|
12
|
+
/** Where variables come from, read when the container starts. Defaults to `process.env`. */
|
|
13
|
+
readonly env?: Environment;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* ```ts
|
|
17
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig, DatabaseConfig], global: true })] })
|
|
18
|
+
* class AppModule {}
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Each configuration is loaded when the container starts; an invalid one
|
|
22
|
+
* fails the startup with a `ConfigError` listing all its issues. Tests
|
|
23
|
+
* replace a value with `overrides: [provide(AppConfig, { useValue })]`, and
|
|
24
|
+
* the replaced configuration is not loaded.
|
|
25
|
+
*/
|
|
26
|
+
export declare class ConfigModule {
|
|
27
|
+
static forRoot(options: ConfigModuleOptions): DynamicModule;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/config/module.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AACnD,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEtD,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,SAAS,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;IACzC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAA;CAC3B;AAED;;;;;;;;;;GAUG;AACH,qBACa,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,GAAG,aAAa,CAO1D;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* `ConfigModule`: loads configurations at startup, like `ConfigModule.forRoot()` of `@nestjs/config`.
|
|
4
|
+
*/
|
|
5
|
+
import { Module, provide } from '../di/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* ```ts
|
|
8
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig, DatabaseConfig], global: true })] })
|
|
9
|
+
* class AppModule {}
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* Each configuration is loaded when the container starts; an invalid one
|
|
13
|
+
* fails the startup with a `ConfigError` listing all its issues. Tests
|
|
14
|
+
* replace a value with `overrides: [provide(AppConfig, { useValue })]`, and
|
|
15
|
+
* the replaced configuration is not loaded.
|
|
16
|
+
*/
|
|
17
|
+
@Module({})
|
|
18
|
+
export class ConfigModule {
|
|
19
|
+
static forRoot(options) {
|
|
20
|
+
return {
|
|
21
|
+
module: ConfigModule,
|
|
22
|
+
global: options.global ?? false,
|
|
23
|
+
providers: options.load.map((config) => provide(config, { useFactory: () => config.load(options.env) })),
|
|
24
|
+
exports: options.load,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/config/module.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAA;AAahD;;;;;;;;;;GAUG;AACH,CAAC,MAAM,CAAC,EAAE,CAAC;AACX,MAAM,OAAO,YAAY;IACvB,MAAM,CAAC,OAAO,CAAC,OAA4B;QACzC,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;YAC/B,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACxG,OAAO,EAAE,OAAO,CAAC,IAAI;SACtB,CAAA;IACH,CAAC;CACF"}
|
|
@@ -57,7 +57,12 @@ export type RouteHandlerMethod<This, P extends string> = ((this: This, ctx: Cont
|
|
|
57
57
|
/**
|
|
58
58
|
* Decorator of a route without argument list: `@Get(':id')`.
|
|
59
59
|
*/
|
|
60
|
-
export type RouteDecorator<P extends string> = <This, M extends
|
|
60
|
+
export type RouteDecorator<P extends string> = <This, M extends (this: This, ...args: any[]) => unknown>(method: M extends RouteHandlerMethod<This, P> ? M : RouteHandlerHint<P>, context: ClassMethodDecoratorContext<This, M>) => void;
|
|
61
|
+
/**
|
|
62
|
+
* What the compiler shows for a method that does not fit a route without
|
|
63
|
+
* argument list, such as `findOne(id: string)` under `@Get(':id')`.
|
|
64
|
+
*/
|
|
65
|
+
export type RouteHandlerHint<P extends string> = `Without an argument list, the method receives the context: (ctx: Context<'${P}'>). To receive values, list them: @Get('${P}', [param('name')]).`;
|
|
61
66
|
/**
|
|
62
67
|
* Decorator of a route with an argument list: `@Get(':id', [param('id', int())])`.
|
|
63
68
|
* The method must accept the values of the arguments, in order.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/http/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAG3C;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,CAAC,OAAO,CAAC,EAAE,GAAG,SAAS,CAAA;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,CAAA;IAChC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAA;CACrC;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,CAAC,IAAI,EAAE,CAAC,SAAS,MAAM,IACjD,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,GAC1C,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,OAAO,CAAC,CAAA;AAE3C;;GAEG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../../src/http/decorators.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/http/decorators.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../../src/http/decorators.ts"],"names":[],"mappings":"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"}
|
package/dist/http/index.d.ts
CHANGED
|
@@ -9,7 +9,7 @@ export { CookieSigner, signed } from './cookies.ts';
|
|
|
9
9
|
export { ContextKey } from './context-key.ts';
|
|
10
10
|
export type { ContextParams, ParamNameOf } from './context.ts';
|
|
11
11
|
export { All, Controller, Delete, Get, Head, Header, HttpCode, Options, Patch, Post, Put, Route } from './decorators.ts';
|
|
12
|
-
export type { ArgumentsRouteDecorator, MethodMetadataDecorator, MethodRouteDecoratorFactory, RouteDecorator, RouteDecoratorFactory, RouteHandlerMethod, } from './decorators.ts';
|
|
12
|
+
export type { ArgumentsRouteDecorator, MethodMetadataDecorator, MethodRouteDecoratorFactory, RouteDecorator, RouteDecoratorFactory, RouteHandlerHint, RouteHandlerMethod, } from './decorators.ts';
|
|
13
13
|
export { ControllerError } from './errors.ts';
|
|
14
14
|
export type { ControllerErrorCode } from './errors.ts';
|
|
15
15
|
export { BadRequestException, ConflictException, ForbiddenException, HttpException, InternalServerErrorException, NotFoundException, PayloadTooLargeException, ServiceUnavailableException, TooManyRequestsException, UnauthorizedException, UnprocessableEntityException, UnsupportedMediaTypeException, } from './exceptions.ts';
|
package/dist/http/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACzF,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACxH,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EACd,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC3D,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACzF,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC/F,YAAY,EACV,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3F,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACzF,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AACxH,YAAY,EACV,uBAAuB,EACvB,uBAAuB,EACvB,2BAA2B,EAC3B,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AACxB,YAAY,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAC9E,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACzD,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC3D,YAAY,EAAE,WAAW,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACzF,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAChE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AACvD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAC/F,YAAY,EACV,WAAW,EACX,WAAW,EACX,sBAAsB,EACtB,SAAS,EACT,eAAe,EACf,cAAc,EACd,UAAU,EACV,KAAK,EACL,aAAa,EACb,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,YAAY,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA;AAC5C,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAA;AAC3F,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/http/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAEzF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAUxH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,4BAA4B,EAC5B,iBAAiB,EACjB,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,GAC9B,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAEzD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAI3D,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAiB/F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA"}
|
package/dist/http/schema.d.ts
CHANGED
|
@@ -47,6 +47,8 @@ export declare namespace StandardSchemaV1 {
|
|
|
47
47
|
export type InferOutput<S extends StandardSchemaV1> = NonNullable<S['~standard']['types']>['output'];
|
|
48
48
|
/** `true` for a Standard Schema. */
|
|
49
49
|
export declare const isStandardSchema: (value: unknown) => value is StandardSchemaV1;
|
|
50
|
+
/** Messages of `issues`, each with the path of its value under `prefix`. */
|
|
51
|
+
export declare const formatIssues: (issues: readonly StandardSchemaV1.Issue[], prefix: string) => string[];
|
|
50
52
|
/**
|
|
51
53
|
* Validates `value`; returns the schema's output (schemas may transform) or
|
|
52
54
|
* throws `BadRequestException` with the issues. `prefix` names the value in
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,gDAAgD;AAChD,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,CAAC,OAAO,WAAW,gBAAgB,CAAC;IACxC,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAClD;IAED,UAAU,OAAO;QACf,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;KAC9D;IAED,KAAK,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAA;IAE3D,UAAU,aAAa,CAAC,MAAM;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAC5B;IAED,UAAU,aAAa;QACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;KAClC;IAED,UAAU,KAAK;QACb,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,GAAG,SAAS,CAAA;KACnE;IAED,UAAU,WAAW;QACnB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;KAC1B;IAED,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KACxB;CACF;AAED,8BAA8B;AAC9B,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAMpG,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,KAAK,IAAI,gBACU,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,gDAAgD;AAChD,MAAM,WAAW,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;IAC/D,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;CAC5D;AAED,MAAM,CAAC,OAAO,WAAW,gBAAgB,CAAC;IACxC,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;QACnB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;QACvB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;QAClG,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,SAAS,CAAA;KAClD;IAED,UAAU,OAAO;QACf,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAA;KAC9D;IAED,KAAK,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,MAAM,CAAC,GAAG,aAAa,CAAA;IAE3D,UAAU,aAAa,CAAC,MAAM;QAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAA;KAC5B;IAED,UAAU,aAAa;QACrB,QAAQ,CAAC,MAAM,EAAE,SAAS,KAAK,EAAE,CAAA;KAClC;IAED,UAAU,KAAK;QACb,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,GAAG,SAAS,CAAA;KACnE;IAED,UAAU,WAAW;QACnB,QAAQ,CAAC,GAAG,EAAE,WAAW,CAAA;KAC1B;IAED,UAAU,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK;QAC7C,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAA;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KACxB;CACF;AAED,8BAA8B;AAC9B,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;AAMpG,oCAAoC;AACpC,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,KAAK,IAAI,gBACU,CAAA;AAErE,4EAA4E;AAC5E,eAAO,MAAM,YAAY,WAAY,SAAS,gBAAgB,CAAC,KAAK,EAAE,UAAU,MAAM,KAAG,MAAM,EAyB9F,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,SAAS,gBAAgB,UACzC,CAAC,SACF,OAAO,UACN,MAAM,KACb,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAYzC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,gBAAgB,UAAU,CAAC,SAAS,OAAO,UAAU,MAAM,KAAG,WAAW,CAAC,CAAC,CAQjH,CAAA"}
|
package/dist/http/schema.js
CHANGED
|
@@ -16,7 +16,8 @@ const MAX_MESSAGES_LENGTH = 1_000_000;
|
|
|
16
16
|
const OMITTED = 'Further validation errors were omitted';
|
|
17
17
|
/** `true` for a Standard Schema. */
|
|
18
18
|
export const isStandardSchema = (value) => typeof value === 'object' && value !== null && '~standard' in value;
|
|
19
|
-
|
|
19
|
+
/** Messages of `issues`, each with the path of its value under `prefix`. */
|
|
20
|
+
export const formatIssues = (issues, prefix) => {
|
|
20
21
|
const messages = [];
|
|
21
22
|
let remaining = MAX_MESSAGES_LENGTH;
|
|
22
23
|
for (const issue of issues) {
|
package/dist/http/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAgDrD,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,SAAS,CAAA;AACrC,MAAM,OAAO,GAAG,wCAAwC,CAAA;AAExD,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC5E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK,CAAA;AAErE,MAAM,YAAY,GAAG,CAAC,MAAyC,EAAE,MAAc,EAAY,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/http/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAgDrD,qEAAqE;AACrE,MAAM,mBAAmB,GAAG,SAAS,CAAA;AACrC,MAAM,OAAO,GAAG,wCAAwC,CAAA;AAExD,oCAAoC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC5E,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,WAAW,IAAI,KAAK,CAAA;AAErE,4EAA4E;AAC5E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,MAAyC,EAAE,MAAc,EAAY,EAAE;IAClG,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,SAAS,GAAG,mBAAmB,CAAA;IAEnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACtB,MAAK;QACP,CAAC;QAED,IAAI,IAAI,GAAG,MAAM,CAAA;QAEjB,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAA;YAE/D,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAA;QAEzE,SAAS,IAAI,OAAO,CAAC,MAAM,CAAA;QAC3B,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACxB,CAAC;IAED,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,MAAS,EACT,KAAc,EACd,MAAc,EAC4B,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAElD,MAAM,MAAM,GAAG,CAAC,OAAyC,EAAkB,EAAE;QAC3E,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,mBAAmB,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QACrE,CAAC;QAED,OAAO,OAAO,CAAC,KAAuB,CAAA;IACxC,CAAC,CAAA;IAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;AACnF,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAA6B,MAAS,EAAE,KAAc,EAAE,MAAc,EAAkB,EAAE;IACpH,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAE9C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,SAAS,CAAC,mBAAmB,MAAM,mEAAmE,CAAC,CAAA;IACnH,CAAC;IAED,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,mBAAmB,CAAA;AACjC,cAAc,oBAAoB,CAAA"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*
|
|
5
|
+
* What `@nestjs/config` does with `registerAs()` and a `validationSchema`,
|
|
6
|
+
* typed by the schema instead of read with string keys. Bun already loads
|
|
7
|
+
* `.env`, `.env.local` and `.env.<NODE_ENV>` into `process.env`.
|
|
8
|
+
*
|
|
9
|
+
* ```ts
|
|
10
|
+
* export const AppConfig = defineConfig('app', z.object({
|
|
11
|
+
* PORT: z.coerce.number().default(3000),
|
|
12
|
+
* JWT_SECRET: z.string().min(32),
|
|
13
|
+
* }))
|
|
14
|
+
*
|
|
15
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig], global: true })] })
|
|
16
|
+
* class AppModule {}
|
|
17
|
+
*
|
|
18
|
+
* class AuthService {
|
|
19
|
+
* readonly #config = inject(AppConfig) // { PORT: number; JWT_SECRET: string }
|
|
20
|
+
* }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { InjectionToken } from '../di/token.ts'
|
|
25
|
+
import { formatIssues } from '../http/schema.ts'
|
|
26
|
+
import type { InferOutput, StandardSchemaV1 } from '../http/schema.ts'
|
|
27
|
+
|
|
28
|
+
/** Environment variables, as in `process.env`. */
|
|
29
|
+
export type Environment = Readonly<Record<string, string | undefined>>
|
|
30
|
+
|
|
31
|
+
/** A configuration that does not match its schema; `issues` lists every problem. */
|
|
32
|
+
export class ConfigError extends Error {
|
|
33
|
+
override readonly name = 'ConfigError'
|
|
34
|
+
|
|
35
|
+
constructor(
|
|
36
|
+
readonly config: string,
|
|
37
|
+
readonly issues: readonly string[]
|
|
38
|
+
) {
|
|
39
|
+
super(`Invalid configuration "${config}":\n ${issues.join('\n ')}`)
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* A configuration, and the DI token of its value: `inject(AppConfig)`.
|
|
45
|
+
* `ConfigModule.forRoot()` loads it at startup; `load()` works without DI.
|
|
46
|
+
*/
|
|
47
|
+
export class Config<T> extends InjectionToken<T> {
|
|
48
|
+
readonly #schema: StandardSchemaV1<unknown, T>
|
|
49
|
+
readonly #source: (env: Environment) => unknown
|
|
50
|
+
|
|
51
|
+
constructor(name: string, schema: StandardSchemaV1<unknown, T>, source: (env: Environment) => unknown) {
|
|
52
|
+
super(name)
|
|
53
|
+
this.#schema = schema
|
|
54
|
+
this.#source = source
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** The value read from `env` and validated; throws a {@link ConfigError} listing every issue. */
|
|
58
|
+
async load(env: Environment = process.env): Promise<T> {
|
|
59
|
+
const result = await this.#schema['~standard'].validate(this.#source(env))
|
|
60
|
+
|
|
61
|
+
if (result.issues !== undefined) {
|
|
62
|
+
throw new ConfigError(this.description, formatIssues(result.issues, ''))
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return result.value
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
override toString(): string {
|
|
69
|
+
return `Config(${this.description})`
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Defines a configuration validated by `schema`. Its input is the environment,
|
|
75
|
+
* or what `source` builds from it, for a nested configuration:
|
|
76
|
+
*
|
|
77
|
+
* ```ts
|
|
78
|
+
* const DatabaseConfig = defineConfig('database', DatabaseSchema, (env) => ({
|
|
79
|
+
* url: env.DATABASE_URL,
|
|
80
|
+
* pool: { max: env.DATABASE_POOL_MAX },
|
|
81
|
+
* }))
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
export const defineConfig = <S extends StandardSchemaV1>(
|
|
85
|
+
name: string,
|
|
86
|
+
schema: S,
|
|
87
|
+
source: (env: Environment) => unknown = (env) => env
|
|
88
|
+
): Config<InferOutput<S>> => new Config(name, schema as StandardSchemaV1<unknown, InferOutput<S>>, source)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* Configuration typed by a schema and validated at startup.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export { Config, ConfigError, defineConfig } from './config.ts'
|
|
7
|
+
export type { Environment } from './config.ts'
|
|
8
|
+
export { ConfigModule } from './module.ts'
|
|
9
|
+
export type { ConfigModuleOptions } from './module.ts'
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module
|
|
3
|
+
* `ConfigModule`: loads configurations at startup, like `ConfigModule.forRoot()` of `@nestjs/config`.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { Module, provide } from '../di/index.ts'
|
|
7
|
+
import type { DynamicModule } from '../di/index.ts'
|
|
8
|
+
import type { Config, Environment } from './config.ts'
|
|
9
|
+
|
|
10
|
+
export interface ConfigModuleOptions {
|
|
11
|
+
/** Configurations to load and provide. */
|
|
12
|
+
readonly load: readonly Config<unknown>[]
|
|
13
|
+
/** Makes them injectable in every module. Defaults to `false`, as in Nest. */
|
|
14
|
+
readonly global?: boolean
|
|
15
|
+
/** Where variables come from, read when the container starts. Defaults to `process.env`. */
|
|
16
|
+
readonly env?: Environment
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* ```ts
|
|
21
|
+
* @Module({ imports: [ConfigModule.forRoot({ load: [AppConfig, DatabaseConfig], global: true })] })
|
|
22
|
+
* class AppModule {}
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* Each configuration is loaded when the container starts; an invalid one
|
|
26
|
+
* fails the startup with a `ConfigError` listing all its issues. Tests
|
|
27
|
+
* replace a value with `overrides: [provide(AppConfig, { useValue })]`, and
|
|
28
|
+
* the replaced configuration is not loaded.
|
|
29
|
+
*/
|
|
30
|
+
@Module({})
|
|
31
|
+
export class ConfigModule {
|
|
32
|
+
static forRoot(options: ConfigModuleOptions): DynamicModule {
|
|
33
|
+
return {
|
|
34
|
+
module: ConfigModule,
|
|
35
|
+
global: options.global ?? false,
|
|
36
|
+
providers: options.load.map((config) => provide(config, { useFactory: () => config.load(options.env) })),
|
|
37
|
+
exports: options.load,
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
package/src/http/decorators.ts
CHANGED
|
@@ -65,11 +65,18 @@ export type RouteHandlerMethod<This, P extends string> =
|
|
|
65
65
|
/**
|
|
66
66
|
* Decorator of a route without argument list: `@Get(':id')`.
|
|
67
67
|
*/
|
|
68
|
-
export type RouteDecorator<P extends string> = <This, M extends
|
|
69
|
-
method: M,
|
|
68
|
+
export type RouteDecorator<P extends string> = <This, M extends (this: This, ...args: any[]) => unknown>(
|
|
69
|
+
method: M extends RouteHandlerMethod<This, P> ? M : RouteHandlerHint<P>,
|
|
70
70
|
context: ClassMethodDecoratorContext<This, M>
|
|
71
71
|
) => void
|
|
72
72
|
|
|
73
|
+
/**
|
|
74
|
+
* What the compiler shows for a method that does not fit a route without
|
|
75
|
+
* argument list, such as `findOne(id: string)` under `@Get(':id')`.
|
|
76
|
+
*/
|
|
77
|
+
export type RouteHandlerHint<P extends string> =
|
|
78
|
+
`Without an argument list, the method receives the context: (ctx: Context<'${P}'>). To receive values, list them: @Get('${P}', [param('name')]).`
|
|
79
|
+
|
|
73
80
|
/**
|
|
74
81
|
* Decorator of a route with an argument list: `@Get(':id', [param('id', int())])`.
|
|
75
82
|
* The method must accept the values of the arguments, in order.
|
package/src/http/index.ts
CHANGED
package/src/http/schema.ts
CHANGED
|
@@ -67,7 +67,8 @@ const OMITTED = 'Further validation errors were omitted'
|
|
|
67
67
|
export const isStandardSchema = (value: unknown): value is StandardSchemaV1 =>
|
|
68
68
|
typeof value === 'object' && value !== null && '~standard' in value
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
/** Messages of `issues`, each with the path of its value under `prefix`. */
|
|
71
|
+
export const formatIssues = (issues: readonly StandardSchemaV1.Issue[], prefix: string): string[] => {
|
|
71
72
|
const messages: string[] = []
|
|
72
73
|
let remaining = MAX_MESSAGES_LENGTH
|
|
73
74
|
|