@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.
Files changed (140) hide show
  1. package/AGENTS.md +467 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1417 -2
  4. package/dist/bin/brisk.d.ts +3 -0
  5. package/dist/bin/brisk.d.ts.map +1 -0
  6. package/dist/bin/brisk.js +13 -0
  7. package/dist/bin/brisk.js.map +1 -0
  8. package/dist/src/cli/agents.d.ts +7 -0
  9. package/dist/src/cli/agents.d.ts.map +1 -0
  10. package/dist/src/cli/agents.js +55 -0
  11. package/dist/src/cli/agents.js.map +1 -0
  12. package/dist/src/cli/cli.d.ts +5 -0
  13. package/dist/src/cli/cli.d.ts.map +1 -0
  14. package/dist/src/cli/cli.js +127 -0
  15. package/dist/src/cli/cli.js.map +1 -0
  16. package/dist/src/cli/client.d.ts +12 -0
  17. package/dist/src/cli/client.d.ts.map +1 -0
  18. package/dist/src/cli/client.js +76 -0
  19. package/dist/src/cli/client.js.map +1 -0
  20. package/dist/src/cli/generate.d.ts +9 -0
  21. package/dist/src/cli/generate.d.ts.map +1 -0
  22. package/dist/src/cli/generate.js +39 -0
  23. package/dist/src/cli/generate.js.map +1 -0
  24. package/dist/src/cli/init.d.ts +19 -0
  25. package/dist/src/cli/init.d.ts.map +1 -0
  26. package/dist/src/cli/init.js +125 -0
  27. package/dist/src/cli/init.js.map +1 -0
  28. package/dist/src/cli/names.d.ts +14 -0
  29. package/dist/src/cli/names.d.ts.map +1 -0
  30. package/dist/src/cli/names.js +25 -0
  31. package/dist/src/cli/names.js.map +1 -0
  32. package/dist/src/cli/system.d.ts +35 -0
  33. package/dist/src/cli/system.d.ts.map +1 -0
  34. package/dist/src/cli/system.js +83 -0
  35. package/dist/src/cli/system.js.map +1 -0
  36. package/dist/src/cli/templates/auth.d.ts +4 -0
  37. package/dist/src/cli/templates/auth.d.ts.map +1 -0
  38. package/dist/src/cli/templates/auth.js +90 -0
  39. package/dist/src/cli/templates/auth.js.map +1 -0
  40. package/dist/src/cli/templates/database.d.ts +4 -0
  41. package/dist/src/cli/templates/database.d.ts.map +1 -0
  42. package/dist/src/cli/templates/database.js +107 -0
  43. package/dist/src/cli/templates/database.js.map +1 -0
  44. package/dist/src/cli/templates/docker.d.ts +4 -0
  45. package/dist/src/cli/templates/docker.d.ts.map +1 -0
  46. package/dist/src/cli/templates/docker.js +102 -0
  47. package/dist/src/cli/templates/docker.js.map +1 -0
  48. package/dist/src/cli/templates/feature.d.ts +8 -0
  49. package/dist/src/cli/templates/feature.d.ts.map +1 -0
  50. package/dist/src/cli/templates/feature.js +145 -0
  51. package/dist/src/cli/templates/feature.js.map +1 -0
  52. package/dist/src/cli/templates/project.d.ts +24 -0
  53. package/dist/src/cli/templates/project.d.ts.map +1 -0
  54. package/dist/src/cli/templates/project.js +166 -0
  55. package/dist/src/cli/templates/project.js.map +1 -0
  56. package/dist/src/client/client.d.ts +64 -0
  57. package/dist/src/client/client.d.ts.map +1 -0
  58. package/dist/src/client/client.js +143 -0
  59. package/dist/src/client/client.js.map +1 -0
  60. package/dist/src/client/index.d.ts +8 -0
  61. package/dist/src/client/index.d.ts.map +1 -0
  62. package/dist/src/client/index.js +7 -0
  63. package/dist/src/client/index.js.map +1 -0
  64. package/dist/src/config/env.d.ts +28 -0
  65. package/dist/src/config/env.d.ts.map +1 -0
  66. package/dist/src/config/env.js +35 -0
  67. package/dist/src/config/env.js.map +1 -0
  68. package/dist/src/config/logger.d.ts +32 -0
  69. package/dist/src/config/logger.d.ts.map +1 -0
  70. package/dist/src/config/logger.js +31 -0
  71. package/dist/src/config/logger.js.map +1 -0
  72. package/dist/src/di/container.d.ts +186 -0
  73. package/dist/src/di/container.d.ts.map +1 -0
  74. package/dist/src/di/container.js +208 -0
  75. package/dist/src/di/container.js.map +1 -0
  76. package/dist/src/di/index.d.ts +8 -0
  77. package/dist/src/di/index.d.ts.map +1 -0
  78. package/dist/src/di/index.js +8 -0
  79. package/dist/src/di/index.js.map +1 -0
  80. package/dist/src/errors/http-errors.d.ts +295 -0
  81. package/dist/src/errors/http-errors.d.ts.map +1 -0
  82. package/dist/src/errors/http-errors.js +311 -0
  83. package/dist/src/errors/http-errors.js.map +1 -0
  84. package/dist/src/errors/index.d.ts +8 -0
  85. package/dist/src/errors/index.d.ts.map +1 -0
  86. package/dist/src/errors/index.js +8 -0
  87. package/dist/src/errors/index.js.map +1 -0
  88. package/dist/src/http/app.d.ts +200 -0
  89. package/dist/src/http/app.d.ts.map +1 -0
  90. package/dist/src/http/app.js +45 -0
  91. package/dist/src/http/app.js.map +1 -0
  92. package/dist/src/http/context.d.ts +66 -0
  93. package/dist/src/http/context.d.ts.map +1 -0
  94. package/dist/src/http/context.js +96 -0
  95. package/dist/src/http/context.js.map +1 -0
  96. package/dist/src/http/controller.d.ts +178 -0
  97. package/dist/src/http/controller.d.ts.map +1 -0
  98. package/dist/src/http/controller.js +317 -0
  99. package/dist/src/http/controller.js.map +1 -0
  100. package/dist/src/http/error-handler.d.ts +59 -0
  101. package/dist/src/http/error-handler.d.ts.map +1 -0
  102. package/dist/src/http/error-handler.js +124 -0
  103. package/dist/src/http/error-handler.js.map +1 -0
  104. package/dist/src/http/instance.d.ts +14 -0
  105. package/dist/src/http/instance.d.ts.map +1 -0
  106. package/dist/src/http/instance.js +309 -0
  107. package/dist/src/http/instance.js.map +1 -0
  108. package/dist/src/http/middleware.d.ts +54 -0
  109. package/dist/src/http/middleware.d.ts.map +1 -0
  110. package/dist/src/http/middleware.js +101 -0
  111. package/dist/src/http/middleware.js.map +1 -0
  112. package/dist/src/http/openapi.d.ts +34 -0
  113. package/dist/src/http/openapi.d.ts.map +1 -0
  114. package/dist/src/http/openapi.js +123 -0
  115. package/dist/src/http/openapi.js.map +1 -0
  116. package/dist/src/http/path-params.d.ts +24 -0
  117. package/dist/src/http/path-params.d.ts.map +1 -0
  118. package/dist/src/http/path-params.js +2 -0
  119. package/dist/src/http/path-params.js.map +1 -0
  120. package/dist/src/http/routes.d.ts +119 -0
  121. package/dist/src/http/routes.d.ts.map +1 -0
  122. package/dist/src/http/routes.js +2 -0
  123. package/dist/src/http/routes.js.map +1 -0
  124. package/dist/src/http/server.d.ts +23 -0
  125. package/dist/src/http/server.d.ts.map +1 -0
  126. package/dist/src/http/server.js +22 -0
  127. package/dist/src/http/server.js.map +1 -0
  128. package/dist/src/index.d.ts +22 -0
  129. package/dist/src/index.d.ts.map +1 -0
  130. package/dist/src/index.js +19 -0
  131. package/dist/src/index.js.map +1 -0
  132. package/dist/src/testing/index.d.ts +7 -0
  133. package/dist/src/testing/index.d.ts.map +1 -0
  134. package/dist/src/testing/index.js +7 -0
  135. package/dist/src/testing/index.js.map +1 -0
  136. package/dist/src/testing/test-client.d.ts +65 -0
  137. package/dist/src/testing/test-client.d.ts.map +1 -0
  138. package/dist/src/testing/test-client.js +77 -0
  139. package/dist/src/testing/test-client.js.map +1 -0
  140. 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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=path-params.js.map
@@ -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":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,0CAA0C;AAC1C,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;AAErE;;;;;;;;GAQG;AACH,MAAM,WAAW,KAAK,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,OAAO;IACtD,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,KAAK,EAAE,KAAK,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AAED,0EAA0E;AAC1E,MAAM,WAAW,MAAM;IACrB,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;CACzC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC;CAC7E;AAED,mGAAmG;AACnG,KAAK,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACvD,EAAE,GACF,EAAE,SAAS,CAAC,GACV;KAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;CAAE,GAChB;KAAG,CAAC,IAAI,CAAC,GAAG,CAAC;CAAE,CAAC;AAEtB,KAAK,WAAW,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;AAE5E,+BAA+B;AAC/B,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C;;;GAGG;AACH,KAAK,SAAS,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC;AAE5F;;;GAGG;AACH,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,GACtC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACrD;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,MAAM,UAAU,CAAC,IAAI,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,CAC7D,QAAQ,EACR,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAC5C,GACC,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAC7C,KAAK,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GACjC,YAAY,CAAC,CAAC,CAAC,CAAC;AAElB,kFAAkF;AAClF,UAAU,UAAU;IAClB,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;CACjC;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,MAAM,IAAI,MAAM,CAAC,CAAA;CAAE,GACpD,OAAO,CAAC,CAAC,CAAC,GACV,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GACxC,CAAC,GACD,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GAC5B,OAAO,CAAC,CAAC,CAAC,EAAE,GACZ,CAAC,SAAS,MAAM,GACd;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,GAC3F,KAAK,CAAC;AAEhB;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,EAAE,QAAQ,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,GACtD,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GACX,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC,GACnC,SAAS,GACT,QAAQ,SAAS,UAAU,GAAG,UAAU,GACtC,QAAQ,GACR,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE1B,yFAAyF;AACzF,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,cAAc,SAAS,MAAM,CAAC,GACjD,CAAC,SAAS;IAAE,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,CAAA;CAAE,GAC7C,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GACxB,KAAK,GACP,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEhB,yFAAyF;AACzF,KAAK,QAAQ,CAAC,CAAC,IAAI;KAChB,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GACrG,CAAC,GACD,KAAK;CACV,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI;IACtB,QAAQ,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC1F,CAAC;AAEF,8FAA8F;AAC9F,MAAM,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,GACjC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GAC7C,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=routes.js.map
@@ -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,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, } from "./test-client.js";
7
+ //# sourceMappingURL=index.js.map
@@ -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.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
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
  }