@raiyyan/brisk 0.0.0-stage → 0.1.0
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/AGENTS.md +467 -0
- package/LICENSE +21 -0
- package/README.md +1417 -2
- package/dist/bin/brisk.d.ts +3 -0
- package/dist/bin/brisk.d.ts.map +1 -0
- package/dist/bin/brisk.js +13 -0
- package/dist/bin/brisk.js.map +1 -0
- package/dist/src/cli/agents.d.ts +7 -0
- package/dist/src/cli/agents.d.ts.map +1 -0
- package/dist/src/cli/agents.js +55 -0
- package/dist/src/cli/agents.js.map +1 -0
- package/dist/src/cli/cli.d.ts +5 -0
- package/dist/src/cli/cli.d.ts.map +1 -0
- package/dist/src/cli/cli.js +127 -0
- package/dist/src/cli/cli.js.map +1 -0
- package/dist/src/cli/client.d.ts +12 -0
- package/dist/src/cli/client.d.ts.map +1 -0
- package/dist/src/cli/client.js +76 -0
- package/dist/src/cli/client.js.map +1 -0
- package/dist/src/cli/generate.d.ts +9 -0
- package/dist/src/cli/generate.d.ts.map +1 -0
- package/dist/src/cli/generate.js +39 -0
- package/dist/src/cli/generate.js.map +1 -0
- package/dist/src/cli/init.d.ts +19 -0
- package/dist/src/cli/init.d.ts.map +1 -0
- package/dist/src/cli/init.js +125 -0
- package/dist/src/cli/init.js.map +1 -0
- package/dist/src/cli/names.d.ts +14 -0
- package/dist/src/cli/names.d.ts.map +1 -0
- package/dist/src/cli/names.js +25 -0
- package/dist/src/cli/names.js.map +1 -0
- package/dist/src/cli/system.d.ts +35 -0
- package/dist/src/cli/system.d.ts.map +1 -0
- package/dist/src/cli/system.js +83 -0
- package/dist/src/cli/system.js.map +1 -0
- package/dist/src/cli/templates/auth.d.ts +4 -0
- package/dist/src/cli/templates/auth.d.ts.map +1 -0
- package/dist/src/cli/templates/auth.js +90 -0
- package/dist/src/cli/templates/auth.js.map +1 -0
- package/dist/src/cli/templates/database.d.ts +4 -0
- package/dist/src/cli/templates/database.d.ts.map +1 -0
- package/dist/src/cli/templates/database.js +107 -0
- package/dist/src/cli/templates/database.js.map +1 -0
- package/dist/src/cli/templates/docker.d.ts +4 -0
- package/dist/src/cli/templates/docker.d.ts.map +1 -0
- package/dist/src/cli/templates/docker.js +102 -0
- package/dist/src/cli/templates/docker.js.map +1 -0
- package/dist/src/cli/templates/feature.d.ts +8 -0
- package/dist/src/cli/templates/feature.d.ts.map +1 -0
- package/dist/src/cli/templates/feature.js +145 -0
- package/dist/src/cli/templates/feature.js.map +1 -0
- package/dist/src/cli/templates/project.d.ts +24 -0
- package/dist/src/cli/templates/project.d.ts.map +1 -0
- package/dist/src/cli/templates/project.js +166 -0
- package/dist/src/cli/templates/project.js.map +1 -0
- package/dist/src/client/client.d.ts +64 -0
- package/dist/src/client/client.d.ts.map +1 -0
- package/dist/src/client/client.js +143 -0
- package/dist/src/client/client.js.map +1 -0
- package/dist/src/client/index.d.ts +8 -0
- package/dist/src/client/index.d.ts.map +1 -0
- package/dist/src/client/index.js +7 -0
- package/dist/src/client/index.js.map +1 -0
- package/dist/src/config/env.d.ts +28 -0
- package/dist/src/config/env.d.ts.map +1 -0
- package/dist/src/config/env.js +35 -0
- package/dist/src/config/env.js.map +1 -0
- package/dist/src/config/logger.d.ts +32 -0
- package/dist/src/config/logger.d.ts.map +1 -0
- package/dist/src/config/logger.js +31 -0
- package/dist/src/config/logger.js.map +1 -0
- package/dist/src/di/container.d.ts +186 -0
- package/dist/src/di/container.d.ts.map +1 -0
- package/dist/src/di/container.js +208 -0
- package/dist/src/di/container.js.map +1 -0
- package/dist/src/di/index.d.ts +8 -0
- package/dist/src/di/index.d.ts.map +1 -0
- package/dist/src/di/index.js +8 -0
- package/dist/src/di/index.js.map +1 -0
- package/dist/src/errors/http-errors.d.ts +295 -0
- package/dist/src/errors/http-errors.d.ts.map +1 -0
- package/dist/src/errors/http-errors.js +311 -0
- package/dist/src/errors/http-errors.js.map +1 -0
- package/dist/src/errors/index.d.ts +8 -0
- package/dist/src/errors/index.d.ts.map +1 -0
- package/dist/src/errors/index.js +8 -0
- package/dist/src/errors/index.js.map +1 -0
- package/dist/src/http/app.d.ts +200 -0
- package/dist/src/http/app.d.ts.map +1 -0
- package/dist/src/http/app.js +45 -0
- package/dist/src/http/app.js.map +1 -0
- package/dist/src/http/context.d.ts +66 -0
- package/dist/src/http/context.d.ts.map +1 -0
- package/dist/src/http/context.js +96 -0
- package/dist/src/http/context.js.map +1 -0
- package/dist/src/http/controller.d.ts +178 -0
- package/dist/src/http/controller.d.ts.map +1 -0
- package/dist/src/http/controller.js +317 -0
- package/dist/src/http/controller.js.map +1 -0
- package/dist/src/http/error-handler.d.ts +59 -0
- package/dist/src/http/error-handler.d.ts.map +1 -0
- package/dist/src/http/error-handler.js +124 -0
- package/dist/src/http/error-handler.js.map +1 -0
- package/dist/src/http/instance.d.ts +14 -0
- package/dist/src/http/instance.d.ts.map +1 -0
- package/dist/src/http/instance.js +309 -0
- package/dist/src/http/instance.js.map +1 -0
- package/dist/src/http/middleware.d.ts +54 -0
- package/dist/src/http/middleware.d.ts.map +1 -0
- package/dist/src/http/middleware.js +101 -0
- package/dist/src/http/middleware.js.map +1 -0
- package/dist/src/http/openapi.d.ts +34 -0
- package/dist/src/http/openapi.d.ts.map +1 -0
- package/dist/src/http/openapi.js +123 -0
- package/dist/src/http/openapi.js.map +1 -0
- package/dist/src/http/path-params.d.ts +24 -0
- package/dist/src/http/path-params.d.ts.map +1 -0
- package/dist/src/http/path-params.js +2 -0
- package/dist/src/http/path-params.js.map +1 -0
- package/dist/src/http/routes.d.ts +119 -0
- package/dist/src/http/routes.d.ts.map +1 -0
- package/dist/src/http/routes.js +2 -0
- package/dist/src/http/routes.js.map +1 -0
- package/dist/src/http/server.d.ts +23 -0
- package/dist/src/http/server.d.ts.map +1 -0
- package/dist/src/http/server.js +22 -0
- package/dist/src/http/server.js.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/testing/index.d.ts +7 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +7 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/test-client.d.ts +65 -0
- package/dist/src/testing/test-client.d.ts.map +1 -0
- package/dist/src/testing/test-client.js +77 -0
- package/dist/src/testing/test-client.js.map +1 -0
- package/package.json +88 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../../src/http/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/** The union of characters in `S`: `CharsOf<"ab">` is `"a" | "b"`. Tail-recursive, so long strings are fine. */
|
|
2
|
+
type CharsOf<S extends string, Found = never> = S extends `${infer C}${infer Rest}` ? CharsOf<Rest, Found | C> : Found;
|
|
3
|
+
/** Characters a path parameter name may contain, as Express 5 (path-to-regexp v8) reads them. */
|
|
4
|
+
type NameChar = CharsOf<"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_$">;
|
|
5
|
+
/** Splits `"id/rest"` into the parameter name and what follows it: `["id", "/rest"]`. */
|
|
6
|
+
type ReadName<S extends string, Name extends string = ""> = S extends `${infer C}${infer Rest}` ? C extends NameChar ? ReadName<Rest, `${Name}${C}`> : [Name, S] : [Name, S];
|
|
7
|
+
/** Rewrites `*name` as `:*name`, so every parameter starts with `:`. */
|
|
8
|
+
type MarkWildcards<S extends string> = S extends `${infer Before}*${infer After}` ? `${Before}:*${MarkWildcards<After>}` : S;
|
|
9
|
+
/** Parameters outside optional groups. A `*name` wildcard is an array of segments, as Express 5 gives it. */
|
|
10
|
+
type RequiredParams<S extends string> = S extends `${string}:${infer After}` ? After extends `*${infer Wildcard}` ? Named<Wildcard, string[]> : Named<After, string> : {};
|
|
11
|
+
type Named<S extends string, Value> = ReadName<S> extends [infer Name extends string, infer Rest extends string] ? {
|
|
12
|
+
[K in Name]: Value;
|
|
13
|
+
} & RequiredParams<Rest> : never;
|
|
14
|
+
type GroupedParams<S extends string> = S extends `${infer Before}{${infer Inside}}${infer After}` ? RequiredParams<Before> & Partial<RequiredParams<Inside>> & GroupedParams<After> : RequiredParams<S>;
|
|
15
|
+
/**
|
|
16
|
+
* The parameters of an Express 5 path, typed from the string.
|
|
17
|
+
*
|
|
18
|
+
* - `"/orgs/:orgId/users/:id"` gives `{ orgId: string; id: string }`
|
|
19
|
+
* - `"/files/*path"` gives `{ path: string[] }`
|
|
20
|
+
* - `"/posts{/:slug}"` gives `{ slug?: string }`
|
|
21
|
+
*/
|
|
22
|
+
export type PathParams<S extends string> = GroupedParams<MarkWildcards<S>>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=path-params.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-params.d.ts","sourceRoot":"","sources":["../../../src/http/path-params.ts"],"names":[],"mappings":"AAAA,gHAAgH;AAChH,KAAK,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,GAAG,KAAK,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,IAAI,EAAE,GAC/E,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,GACxB,KAAK,CAAC;AAEV,iGAAiG;AACjG,KAAK,QAAQ,GAAG,OAAO,CAAC,kEAAkE,CAAC,CAAC;AAE5F,yFAAyF;AACzF,KAAK,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,GAAG,MAAM,IAAI,EAAE,GAC3F,CAAC,SAAS,QAAQ,GAChB,QAAQ,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,GAC7B,CAAC,IAAI,EAAE,CAAC,CAAC,GACX,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AAEd,wEAAwE;AACxE,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,GAC7E,GAAG,MAAM,KAAK,aAAa,CAAC,KAAK,CAAC,EAAE,GACpC,CAAC,CAAC;AAEN,6GAA6G;AAC7G,KAAK,cAAc,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,MAAM,KAAK,EAAE,GACxE,KAAK,SAAS,IAAI,MAAM,QAAQ,EAAE,GAChC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,GACzB,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,GACtB,EAAE,CAAC;AAEP,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,IAChC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,SAAS,MAAM,EAAE,MAAM,IAAI,SAAS,MAAM,CAAC,GACtE;KAAG,CAAC,IAAI,IAAI,GAAG,KAAK;CAAE,GAAG,cAAc,CAAC,IAAI,CAAC,GAC7C,KAAK,CAAC;AAEZ,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,MAAM,IAAI,MAAM,MAAM,IAAI,MAAM,KAAK,EAAE,GAC7F,cAAc,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAC/E,cAAc,CAAC,CAAC,CAAC,CAAC;AAEtB;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,MAAM,IAAI,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-params.js","sourceRoot":"","sources":["../../../src/http/path-params.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { z } from "zod";
|
|
2
|
+
import type { PathParams } from "./path-params.ts";
|
|
3
|
+
/** An HTTP method a route can declare. */
|
|
4
|
+
export type HttpMethod = "get" | "post" | "put" | "patch" | "delete";
|
|
5
|
+
/**
|
|
6
|
+
* A declared route, as `route.get(...)` and the other route methods return it. At runtime it holds the method
|
|
7
|
+
* and full path; its `~types` field exists only for the compiler, carrying what a client sends and receives.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* type Ping = Route<{}, { pong: true }>; // no input, resolves to { pong: true }
|
|
12
|
+
* ```
|
|
13
|
+
*/
|
|
14
|
+
export interface Route<Input = unknown, Output = unknown> {
|
|
15
|
+
readonly method: HttpMethod;
|
|
16
|
+
readonly path: string;
|
|
17
|
+
readonly "~types"?: {
|
|
18
|
+
input: Input;
|
|
19
|
+
output: Output;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** What a controller's setup returns: named routes, nested for groups. */
|
|
23
|
+
export interface Routes {
|
|
24
|
+
readonly [name: string]: Route | Routes;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* An app's routes as data: the typed client's map from names to method and path.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```ts
|
|
31
|
+
* const manifest = { users: { get: ["GET", "/api/users/:id"] } } as const satisfies Manifest;
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export interface Manifest {
|
|
35
|
+
readonly [name: string]: readonly [method: string, path: string] | Manifest;
|
|
36
|
+
}
|
|
37
|
+
/** A field that is left out when its type has no keys, and optional when every key is optional. */
|
|
38
|
+
type Field<K extends string, T> = [keyof T] extends [never] ? {} : {} extends T ? {
|
|
39
|
+
[P in K]?: T;
|
|
40
|
+
} : {
|
|
41
|
+
[P in K]: T;
|
|
42
|
+
};
|
|
43
|
+
type SchemaInput<S, Fallback> = S extends z.ZodType ? z.input<S> : Fallback;
|
|
44
|
+
/** A value a URL can carry. */
|
|
45
|
+
type UrlValue = string | number | boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Path and query fields as a client writes them. A coercing schema (`z.coerce.number()`) accepts `unknown`;
|
|
48
|
+
* here it accepts what a URL can carry instead.
|
|
49
|
+
*/
|
|
50
|
+
type UrlFields<T> = {
|
|
51
|
+
[K in keyof T]: unknown extends T[K] ? UrlValue | UrlValue[] : T[K];
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Headers a client sends: the typed ones from the route's schema, plus any others, such as the
|
|
55
|
+
* `authorization` a middleware reads.
|
|
56
|
+
*/
|
|
57
|
+
type HeadersField<H> = H extends z.ZodType ? Field<"headers", z.input<H> & Record<string, string>> : {
|
|
58
|
+
headers?: Record<string, string>;
|
|
59
|
+
};
|
|
60
|
+
/** What a client sends: path params, query, body and headers, each typed by its schema. */
|
|
61
|
+
export type RouteInput<Path extends string, P, Q, B, H> = Field<"params", UrlFields<SchemaInput<P, PathParams<Path>>>> & Field<"query", UrlFields<SchemaInput<Q, {}>>> & Field<"body", SchemaInput<B, {}>> & HeadersField<H>;
|
|
62
|
+
/** A Node stream, recognized by shape so these types never need `@types/node`. */
|
|
63
|
+
interface StreamLike {
|
|
64
|
+
pipe(...args: never[]): unknown;
|
|
65
|
+
read(...args: never[]): unknown;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* What a value becomes after `JSON.stringify` and `JSON.parse`: dates become strings, and functions and
|
|
69
|
+
* `undefined` fields disappear.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* ```ts
|
|
73
|
+
* type Sent = Jsonify<{ at: Date; run(): void; note?: string }>; // { at: string; note?: string }
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export type Jsonify<T> = T extends {
|
|
77
|
+
toJSON(): infer J;
|
|
78
|
+
} ? Jsonify<J> : T extends string | number | boolean | null ? T : T extends readonly (infer E)[] ? Jsonify<E>[] : T extends object ? {
|
|
79
|
+
[K in keyof T as T[K] extends (...args: never[]) => unknown ? never : K]: Jsonify<T[K]>;
|
|
80
|
+
} : never;
|
|
81
|
+
/**
|
|
82
|
+
* What a client gets back: the response schema's output, or else the handler's JSON-serialized result. A
|
|
83
|
+
* stream or bytes come back as the raw `Response`, and nothing as `undefined` (204).
|
|
84
|
+
*/
|
|
85
|
+
export type RouteOutput<R, Returned> = R extends z.ZodType ? z.output<R> : [Returned] extends [undefined | void] ? undefined : Returned extends StreamLike | Uint8Array ? Response : Jsonify<Returned>;
|
|
86
|
+
/** What `defineController` returns: carries its routes' types, read by {@link ApiOf}. */
|
|
87
|
+
export interface ControllerTypes<R> {
|
|
88
|
+
readonly "~routes"?: R;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* An app, or a map of controllers, reduced to its named routes: the shape of the typed client.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* type Api = ApiOf<typeof app>; // { users: { get: Route<...>, create: Route<...> } }
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
export type ApiOf<T> = "~controllers" extends keyof T ? T extends {
|
|
99
|
+
readonly "~controllers"?: infer C;
|
|
100
|
+
} ? RoutesOf<NonNullable<C>> : never : RoutesOf<T>;
|
|
101
|
+
/** Controllers whose setup returned named routes; others have no place in the client. */
|
|
102
|
+
type RoutesOf<C> = {
|
|
103
|
+
[K in keyof C as C[K] extends ControllerTypes<Routes> ? K : never]: C[K] extends ControllerTypes<infer R> ? R : never;
|
|
104
|
+
};
|
|
105
|
+
/**
|
|
106
|
+
* A typed client for routes: every route becomes a function that takes its input and resolves to its output.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* const user = await api.users.get({ params: { id } }); // typed from the route's schemas
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
export type Client<T> = {
|
|
114
|
+
readonly [K in keyof T]: T[K] extends Route<infer I, infer O> ? Call<I, O> : Client<T[K]>;
|
|
115
|
+
};
|
|
116
|
+
/** One route as a function. `init` passes fetch options such as `signal` or extra headers. */
|
|
117
|
+
export type Call<I, O> = {} extends I ? (input?: I, init?: RequestInit) => Promise<O> : (input: I, init?: RequestInit) => Promise<O>;
|
|
118
|
+
export {};
|
|
119
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/http/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/http/routes.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Server as HttpServerType } from "node:http";
|
|
2
|
+
import type { Server as HttpsServerType } from "node:https";
|
|
3
|
+
/** The Node server an app listens on: plain HTTP, or HTTPS when you pass your own. */
|
|
4
|
+
export type NodeServer = HttpServerType | HttpsServerType;
|
|
5
|
+
/**
|
|
6
|
+
* The listening server, injectable once the app listens. Attach WebSockets (`ws`, Socket.IO) to it in a
|
|
7
|
+
* provider's `onReady`; it does not exist before then, so never inject it in a class field or `onInit`.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* export class ChatGateway implements OnReady, OnDrain {
|
|
12
|
+
* #wss?: WebSocketServer;
|
|
13
|
+
* onReady() {
|
|
14
|
+
* this.#wss = new WebSocketServer({ server: inject(HttpServer) });
|
|
15
|
+
* }
|
|
16
|
+
* onDrain() {
|
|
17
|
+
* for (const client of this.#wss?.clients ?? []) client.close(1001);
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare const HttpServer: import("../di/container.ts").InjectionToken<NodeServer>;
|
|
23
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,IAAI,eAAe,EAAE,MAAM,YAAY,CAAC;AAG5D,sFAAsF;AACtF,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,CAAC;AAE1D;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,UAAU,yDAIrB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { defineToken } from "../di/container.js";
|
|
2
|
+
/**
|
|
3
|
+
* The listening server, injectable once the app listens. Attach WebSockets (`ws`, Socket.IO) to it in a
|
|
4
|
+
* provider's `onReady`; it does not exist before then, so never inject it in a class field or `onInit`.
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```ts
|
|
8
|
+
* export class ChatGateway implements OnReady, OnDrain {
|
|
9
|
+
* #wss?: WebSocketServer;
|
|
10
|
+
* onReady() {
|
|
11
|
+
* this.#wss = new WebSocketServer({ server: inject(HttpServer) });
|
|
12
|
+
* }
|
|
13
|
+
* onDrain() {
|
|
14
|
+
* for (const client of this.#wss?.clients ?? []) client.close(1001);
|
|
15
|
+
* }
|
|
16
|
+
* }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export const HttpServer = /* @__PURE__ */ defineToken("HttpServer", () => {
|
|
20
|
+
throw new Error("HttpServer exists only once the app listens: inject it in onReady(), not in a field or onInit().");
|
|
21
|
+
});
|
|
22
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/http/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,CAAa,YAAY,EAAE,GAAG,EAAE;IACnF,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* brisk: a typed layer over Express 5 and Zod. This entry exports the whole server API. Narrower entries:
|
|
3
|
+
* `@raiyyan/brisk/di`, `@raiyyan/brisk/errors`, `@raiyyan/brisk/testing`, and the browser-safe
|
|
4
|
+
* `@raiyyan/brisk/client`.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
export { defineApp, type App, type AppHooks, type AppInstance, type AppOptions, type ControllerMap, type CreateOptions, type ErrorOptions, type HttpOptions, type ListenOptions, type StartOptions, } from "./http/app.ts";
|
|
9
|
+
export type { OpenApiOptions } from "./http/openapi.ts";
|
|
10
|
+
export { HttpServer, type NodeServer } from "./http/server.ts";
|
|
11
|
+
export { Container, defineToken, inject, injectLazy, provide, type InjectionToken, type Class, type OnDrain, type OnInit, type OnReady, type OnShutdown, type Provider, type ProviderEntry, type Token, } from "./di/index.ts";
|
|
12
|
+
export { getContext, type RequestContext } from "./http/context.ts";
|
|
13
|
+
export { defineController, type Controller, type ControllerOptions, type GroupOptions, type RouteBuilder, type RouteContext, type RouteOptions, } from "./http/controller.ts";
|
|
14
|
+
export type { PathParams } from "./http/path-params.ts";
|
|
15
|
+
export type { ApiOf, Client, HttpMethod, Jsonify, Manifest, Route, Routes } from "./http/routes.ts";
|
|
16
|
+
export { defineEnv, type DefineEnvOptions } from "./config/env.ts";
|
|
17
|
+
export { defaultErrorFormatter, type ErrorFormatter, type ErrorMapper } from "./http/error-handler.ts";
|
|
18
|
+
export * from "./errors/index.ts";
|
|
19
|
+
export { createLogger, Logger, type LoggerOptions } from "./config/logger.ts";
|
|
20
|
+
export { defineMiddleware, type Middleware, type MiddlewareContext } from "./http/middleware.ts";
|
|
21
|
+
export { z } from "zod";
|
|
22
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,SAAS,EACT,KAAK,GAAG,EACR,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,GAClB,MAAM,eAAe,CAAC;AACvB,YAAY,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,SAAS,EACT,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,EACP,KAAK,cAAc,EACnB,KAAK,KAAK,EACV,KAAK,OAAO,EACZ,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,KAAK,GACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,GAClB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvG,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,KAAK,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* brisk: a typed layer over Express 5 and Zod. This entry exports the whole server API. Narrower entries:
|
|
3
|
+
* `@raiyyan/brisk/di`, `@raiyyan/brisk/errors`, `@raiyyan/brisk/testing`, and the browser-safe
|
|
4
|
+
* `@raiyyan/brisk/client`.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
export { defineApp, } from "./http/app.js";
|
|
9
|
+
export { HttpServer } from "./http/server.js";
|
|
10
|
+
export { Container, defineToken, inject, injectLazy, provide, } from "./di/index.js";
|
|
11
|
+
export { getContext } from "./http/context.js";
|
|
12
|
+
export { defineController, } from "./http/controller.js";
|
|
13
|
+
export { defineEnv } from "./config/env.js";
|
|
14
|
+
export { defaultErrorFormatter } from "./http/error-handler.js";
|
|
15
|
+
export * from "./errors/index.js";
|
|
16
|
+
export { createLogger, Logger } from "./config/logger.js";
|
|
17
|
+
export { defineMiddleware } from "./http/middleware.js";
|
|
18
|
+
export { z } from "zod";
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,SAAS,GAWV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,UAAU,EAAmB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,SAAS,EACT,WAAW,EACX,MAAM,EACN,UAAU,EACV,OAAO,GAUR,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAuB,MAAM,mBAAmB,CAAC;AACpE,OAAO,EACL,gBAAgB,GAOjB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAyC,MAAM,yBAAyB,CAAC;AACvG,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAsB,MAAM,oBAAoB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAA2C,MAAM,sBAAsB,CAAC;AACjG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test helpers: boot an app on a random port with `createTestClient`, read error bodies with `readError`.
|
|
3
|
+
*
|
|
4
|
+
* @module
|
|
5
|
+
*/
|
|
6
|
+
export { createTestClient, readError, type TestClient, type TestRequest, type TestResponse, } from "./test-client.ts";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/testing/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,gBAAgB,EAChB,SAAS,GAIV,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { ErrorResponse } from "../errors/http-errors.ts";
|
|
2
|
+
import type { App, AppInstance, ControllerMap, CreateOptions } from "../http/app.ts";
|
|
3
|
+
import type { ApiOf, Client } from "../http/routes.ts";
|
|
4
|
+
/** A response from a {@link TestClient} raw request. */
|
|
5
|
+
export interface TestResponse {
|
|
6
|
+
status: number;
|
|
7
|
+
headers: Headers;
|
|
8
|
+
/** Parsed JSON for JSON responses (including `+json` types), text otherwise, `undefined` when empty. */
|
|
9
|
+
body: unknown;
|
|
10
|
+
}
|
|
11
|
+
/** Body and headers for a {@link TestClient} raw request. */
|
|
12
|
+
export interface TestRequest {
|
|
13
|
+
/**
|
|
14
|
+
* Sent as JSON, except a string or `Uint8Array`, which is sent as is (for raw webhook payloads or forms).
|
|
15
|
+
* `content-type` defaults to `application/json` whenever there is a body; set it in `headers` to override.
|
|
16
|
+
*/
|
|
17
|
+
body?: unknown;
|
|
18
|
+
headers?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
type Send = (path: string, request?: TestRequest) => Promise<TestResponse>;
|
|
21
|
+
/**
|
|
22
|
+
* A client for an instance started by {@link createTestClient}: the typed client as `call`, and raw requests
|
|
23
|
+
* by path for checking status codes, headers and malformed input.
|
|
24
|
+
*/
|
|
25
|
+
export interface TestClient<Api = {}> {
|
|
26
|
+
readonly baseUrl: string;
|
|
27
|
+
/** The running instance, for its `container` or `server`. */
|
|
28
|
+
readonly instance: AppInstance;
|
|
29
|
+
/** The typed client: `await api.call.users.get({ params: { id } })`. Rejects with `ApiError` on non-2xx. */
|
|
30
|
+
readonly call: Client<Api>;
|
|
31
|
+
get: Send;
|
|
32
|
+
post: Send;
|
|
33
|
+
put: Send;
|
|
34
|
+
patch: Send;
|
|
35
|
+
delete: Send;
|
|
36
|
+
/** Shuts the instance down gracefully. */
|
|
37
|
+
close(): Promise<void>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Starts a fresh instance of the app on a random local port, with its full lifecycle, and returns a client for
|
|
41
|
+
* it. `providers` replace the app's own, typically with fakes. `close()` shuts the instance down gracefully.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const api = await createTestClient(app, { providers: [provide(Clock, () => fixedDate)] });
|
|
46
|
+
*
|
|
47
|
+
* const user = await api.call.users.create({ body: { email: "a@b.co" }, headers: admin }); // typed
|
|
48
|
+
* const res = await api.post("/api/users", { body: { email: "nope" }, headers: admin }); // raw
|
|
49
|
+
* expect(res.status).toBe(400);
|
|
50
|
+
*
|
|
51
|
+
* await api.close();
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function createTestClient<C extends ControllerMap>(app: App<C>, options?: CreateOptions): Promise<TestClient<ApiOf<App<C>>>>;
|
|
55
|
+
/**
|
|
56
|
+
* Reads the error out of a response, failing the test when the body is not an error response.
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* ```ts
|
|
60
|
+
* expect(readError(await api.get("/api/users/nope"))).toMatchObject({ code: "NOT_FOUND" });
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export declare function readError(response: TestResponse): ErrorResponse["error"];
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=test-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-client.d.ts","sourceRoot":"","sources":["../../../src/testing/test-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACrF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEvD,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,wGAAwG;IACxG,IAAI,EAAE,OAAO,CAAC;CACf;AAED,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAKD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3E;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,GAAG,GAAG,EAAE;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,4GAA4G;IAC5G,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,GAAG,EAAE,IAAI,CAAC;IACV,IAAI,EAAE,IAAI,CAAC;IACX,GAAG,EAAE,IAAI,CAAC;IACV,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,IAAI,CAAC;IACb,0CAA0C;IAC1C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,SAAS,aAAa,EAC5D,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EACX,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CA0CpC;AAWD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,CAAC,OAAO,CAAC,CAExE"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { createClient } from "../client/client.js";
|
|
3
|
+
/** `application/json`, and structured suffixes such as `application/problem+json`. */
|
|
4
|
+
const JSON_TYPE = /^application\/(?:[\w.-]+\+)?json\b/i;
|
|
5
|
+
/**
|
|
6
|
+
* Starts a fresh instance of the app on a random local port, with its full lifecycle, and returns a client for
|
|
7
|
+
* it. `providers` replace the app's own, typically with fakes. `close()` shuts the instance down gracefully.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const api = await createTestClient(app, { providers: [provide(Clock, () => fixedDate)] });
|
|
12
|
+
*
|
|
13
|
+
* const user = await api.call.users.create({ body: { email: "a@b.co" }, headers: admin }); // typed
|
|
14
|
+
* const res = await api.post("/api/users", { body: { email: "nope" }, headers: admin }); // raw
|
|
15
|
+
* expect(res.status).toBe(400);
|
|
16
|
+
*
|
|
17
|
+
* await api.close();
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
export async function createTestClient(app, options = {}) {
|
|
21
|
+
const instance = await app.listen(0, { ...options, host: "127.0.0.1", manageProcess: false });
|
|
22
|
+
const address = instance.server?.address();
|
|
23
|
+
if (!address || typeof address === "string")
|
|
24
|
+
throw new Error("Expected a TCP server address");
|
|
25
|
+
const baseUrl = `http://127.0.0.1:${address.port}`;
|
|
26
|
+
const send = (method) => async (path, request = {}) => {
|
|
27
|
+
const payload = request.body;
|
|
28
|
+
const res = await fetch(baseUrl + path, {
|
|
29
|
+
method,
|
|
30
|
+
headers: payload === undefined
|
|
31
|
+
? { ...request.headers }
|
|
32
|
+
: { "content-type": "application/json", ...request.headers },
|
|
33
|
+
body: payload === undefined
|
|
34
|
+
? null
|
|
35
|
+
: typeof payload === "string"
|
|
36
|
+
? payload
|
|
37
|
+
: payload instanceof Uint8Array
|
|
38
|
+
? new Uint8Array(payload)
|
|
39
|
+
: JSON.stringify(payload),
|
|
40
|
+
});
|
|
41
|
+
const text = await res.text();
|
|
42
|
+
const isJson = JSON_TYPE.test(res.headers.get("content-type") ?? "");
|
|
43
|
+
const body = text === "" ? undefined : isJson ? JSON.parse(text) : text;
|
|
44
|
+
return { status: res.status, headers: res.headers, body };
|
|
45
|
+
};
|
|
46
|
+
return {
|
|
47
|
+
baseUrl,
|
|
48
|
+
instance,
|
|
49
|
+
call: createClient(instance, { baseUrl }),
|
|
50
|
+
get: send("GET"),
|
|
51
|
+
post: send("POST"),
|
|
52
|
+
put: send("PUT"),
|
|
53
|
+
patch: send("PATCH"),
|
|
54
|
+
delete: send("DELETE"),
|
|
55
|
+
close: () => instance.shutdown(),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const ErrorBody = z.object({
|
|
59
|
+
error: z.object({
|
|
60
|
+
code: z.string(),
|
|
61
|
+
message: z.string(),
|
|
62
|
+
details: z.unknown().optional(),
|
|
63
|
+
requestId: z.string(),
|
|
64
|
+
}),
|
|
65
|
+
});
|
|
66
|
+
/**
|
|
67
|
+
* Reads the error out of a response, failing the test when the body is not an error response.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* ```ts
|
|
71
|
+
* expect(readError(await api.get("/api/users/nope"))).toMatchObject({ code: "NOT_FOUND" });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
export function readError(response) {
|
|
75
|
+
return ErrorBody.parse(response.body).error;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=test-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-client.js","sourceRoot":"","sources":["../../../src/testing/test-client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,91 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@raiyyan/brisk",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "A small, typed, opinionated layer over Express 5 and Zod: validation, DI, lifecycle and errors without the boilerplate.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"api",
|
|
7
|
+
"dependency-injection",
|
|
8
|
+
"express",
|
|
9
|
+
"framework",
|
|
10
|
+
"typescript",
|
|
11
|
+
"validation",
|
|
12
|
+
"zod"
|
|
13
|
+
],
|
|
14
|
+
"homepage": "https://github.com/MohammadRaiyyan/brisk#readme",
|
|
15
|
+
"bugs": {
|
|
16
|
+
"url": "https://github.com/MohammadRaiyyan/brisk/issues"
|
|
17
|
+
},
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"author": "Mohammad Raiyyan <inforaiyyan@gmail.com>",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/MohammadRaiyyan/brisk.git",
|
|
23
|
+
"directory": "packages/brisk"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"brisk": "./dist/bin/brisk.js"
|
|
27
|
+
},
|
|
28
|
+
"files": [
|
|
29
|
+
"dist",
|
|
30
|
+
"AGENTS.md",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"type": "module",
|
|
35
|
+
"sideEffects": false,
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/src/index.d.ts",
|
|
39
|
+
"default": "./dist/src/index.js"
|
|
40
|
+
},
|
|
41
|
+
"./di": {
|
|
42
|
+
"types": "./dist/src/di/index.d.ts",
|
|
43
|
+
"default": "./dist/src/di/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./errors": {
|
|
46
|
+
"types": "./dist/src/errors/index.d.ts",
|
|
47
|
+
"default": "./dist/src/errors/index.js"
|
|
48
|
+
},
|
|
49
|
+
"./testing": {
|
|
50
|
+
"types": "./dist/src/testing/index.d.ts",
|
|
51
|
+
"default": "./dist/src/testing/index.js"
|
|
52
|
+
},
|
|
53
|
+
"./client": {
|
|
54
|
+
"types": "./dist/src/client/index.d.ts",
|
|
55
|
+
"default": "./dist/src/client/index.js"
|
|
56
|
+
},
|
|
57
|
+
"./package.json": "./package.json"
|
|
58
|
+
},
|
|
59
|
+
"publishConfig": {
|
|
60
|
+
"access": "public"
|
|
61
|
+
},
|
|
62
|
+
"dependencies": {
|
|
63
|
+
"@types/express": "^5.0.6",
|
|
64
|
+
"express": "^5.3.0",
|
|
65
|
+
"pino": "^10.4.0",
|
|
66
|
+
"zod": "^4.6.7"
|
|
67
|
+
},
|
|
68
|
+
"devDependencies": {
|
|
69
|
+
"@trpc/server": "^11.28.1",
|
|
70
|
+
"@types/ws": "^8.18.2",
|
|
71
|
+
"graphql": "^17.1.0",
|
|
72
|
+
"graphql-yoga": "^6.1.0",
|
|
73
|
+
"pino-pretty": "^13.2.0",
|
|
74
|
+
"ws": "^8.23.0"
|
|
75
|
+
},
|
|
76
|
+
"peerDependencies": {
|
|
77
|
+
"pino-pretty": "^13.2.0"
|
|
78
|
+
},
|
|
79
|
+
"peerDependenciesMeta": {
|
|
80
|
+
"pino-pretty": {
|
|
81
|
+
"optional": true
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
"engines": {
|
|
85
|
+
"node": ">=24"
|
|
86
|
+
},
|
|
87
|
+
"scripts": {
|
|
88
|
+
"typecheck": "tsc --noEmit",
|
|
89
|
+
"build": "rm -rf dist && tsc -p tsconfig.build.json"
|
|
90
|
+
}
|
|
6
91
|
}
|