transit-kit 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 (78) hide show
  1. package/.github/workflows/ci.yml +73 -0
  2. package/.github/workflows/release.yml +37 -0
  3. package/README.md +1 -0
  4. package/dist/cli/cli.d.ts +1 -0
  5. package/dist/cli/cli.js +20 -0
  6. package/dist/cli/generateOpenApi.d.ts +2 -0
  7. package/dist/cli/generateOpenApi.js +152 -0
  8. package/dist/server/constants/HttpMethods.d.ts +10 -0
  9. package/dist/server/constants/HttpMethods.js +9 -0
  10. package/dist/server/constants/HttpStatusCodes.d.ts +48 -0
  11. package/dist/server/constants/HttpStatusCodes.js +27 -0
  12. package/dist/server/handlers/api/EndpointDefinition.d.ts +16 -0
  13. package/dist/server/handlers/api/EndpointDefinition.js +1 -0
  14. package/dist/server/handlers/api/EndpointHandler.d.ts +6 -0
  15. package/dist/server/handlers/api/EndpointHandler.js +1 -0
  16. package/dist/server/handlers/api/HandlerFormDefinition.spec.d.ts +1 -0
  17. package/dist/server/handlers/api/HandlerFormDefinition.spec.js +19 -0
  18. package/dist/server/handlers/api/HandlerFromDefinition.d.ts +11 -0
  19. package/dist/server/handlers/api/HandlerFromDefinition.js +1 -0
  20. package/dist/server/handlers/api/PathParameters.d.ts +5 -0
  21. package/dist/server/handlers/api/PathParameters.js +1 -0
  22. package/dist/server/handlers/api/PathParameters.spec.d.ts +1 -0
  23. package/dist/server/handlers/api/PathParameters.spec.js +12 -0
  24. package/dist/server/handlers/api/createApiHandler.d.ts +12 -0
  25. package/dist/server/handlers/api/createApiHandler.js +20 -0
  26. package/dist/server/handlers/api/responses/emptyResponse.d.ts +7 -0
  27. package/dist/server/handlers/api/responses/emptyResponse.js +1 -0
  28. package/dist/server/handlers/api/responses/index.d.ts +7 -0
  29. package/dist/server/handlers/api/responses/index.js +1 -0
  30. package/dist/server/handlers/api/responses/jsonResponse.d.ts +14 -0
  31. package/dist/server/handlers/api/responses/jsonResponse.js +13 -0
  32. package/dist/server/index.d.ts +4 -0
  33. package/dist/server/index.js +3 -0
  34. package/dist/server/middleware/logging.d.ts +4 -0
  35. package/dist/server/middleware/logging.js +25 -0
  36. package/dist/server/middleware/validation.d.ts +4 -0
  37. package/dist/server/middleware/validation.js +27 -0
  38. package/dist/server/server.d.ts +21 -0
  39. package/dist/server/server.js +43 -0
  40. package/dist/server/utils/funcs.d.ts +1 -0
  41. package/dist/server/utils/funcs.js +3 -0
  42. package/dist/server/utils/logging.d.ts +3 -0
  43. package/dist/server/utils/logging.js +7 -0
  44. package/dist/server/utils/typeGuards.d.ts +2 -0
  45. package/dist/server/utils/typeGuards.js +6 -0
  46. package/dist/server/utils/types.d.ts +3 -0
  47. package/dist/server/utils/types.js +1 -0
  48. package/eslint-configs/eslint.base.config.js +30 -0
  49. package/eslint-configs/eslint.node.config.js +23 -0
  50. package/eslint-configs/eslint.test.config.js +15 -0
  51. package/eslint.config.ts +6 -0
  52. package/package.json +46 -0
  53. package/prettier.config.js +14 -0
  54. package/src/cli/cli.ts +37 -0
  55. package/src/cli/generateOpenApi.ts +217 -0
  56. package/src/server/constants/HttpMethods.ts +11 -0
  57. package/src/server/constants/HttpStatusCodes.ts +46 -0
  58. package/src/server/handlers/api/EndpointDefinition.ts +24 -0
  59. package/src/server/handlers/api/EndpointHandler.ts +24 -0
  60. package/src/server/handlers/api/HandlerFormDefinition.spec.ts +120 -0
  61. package/src/server/handlers/api/HandlerFromDefinition.ts +33 -0
  62. package/src/server/handlers/api/PathParameters.spec.ts +28 -0
  63. package/src/server/handlers/api/PathParameters.ts +10 -0
  64. package/src/server/handlers/api/createApiHandler.ts +44 -0
  65. package/src/server/handlers/api/responses/emptyResponse.ts +12 -0
  66. package/src/server/handlers/api/responses/index.ts +15 -0
  67. package/src/server/handlers/api/responses/jsonResponse.ts +44 -0
  68. package/src/server/index.ts +4 -0
  69. package/src/server/middleware/logging.ts +41 -0
  70. package/src/server/middleware/validation.ts +35 -0
  71. package/src/server/server.ts +90 -0
  72. package/src/server/utils/funcs.ts +3 -0
  73. package/src/server/utils/logging.ts +10 -0
  74. package/src/server/utils/typeGuards.ts +9 -0
  75. package/src/server/utils/types.ts +3 -0
  76. package/transitKit.code-workspace +36 -0
  77. package/tsconfig.json +15 -0
  78. package/vitest.config.ts +22 -0
@@ -0,0 +1,120 @@
1
+ import { Request } from "express";
2
+ import { describe, expectTypeOf, it } from "vitest";
3
+ import z from "zod";
4
+ import { HandlerForDefinition } from "./HandlerFromDefinition";
5
+
6
+ describe("HandlerFromDefinition", () => {
7
+ it("can infer handler responses correctly (Empty)", () => {
8
+ type Handler = HandlerForDefinition<
9
+ "/test",
10
+ undefined,
11
+ undefined,
12
+ {
13
+ 200: {};
14
+ }
15
+ >;
16
+
17
+ type Expected = (
18
+ request: Request<
19
+ undefined,
20
+ unknown,
21
+ undefined,
22
+ undefined,
23
+ Record<string, unknown>
24
+ >,
25
+ ) => Promise<
26
+ | {
27
+ code: 200;
28
+ }
29
+ | {
30
+ code: 500;
31
+ }
32
+ >;
33
+
34
+ expectTypeOf<Handler>().toEqualTypeOf<Expected>();
35
+ });
36
+
37
+ it("can infer handler responses correctly (Json)", () => {
38
+ const _data = z.object({
39
+ a: z.number(),
40
+ });
41
+
42
+ type Handler = HandlerForDefinition<
43
+ "/test",
44
+ undefined,
45
+ undefined,
46
+ {
47
+ 200: {
48
+ dataType: "application/json";
49
+ dataSchema: typeof _data;
50
+ };
51
+ }
52
+ >;
53
+
54
+ type Expected = (
55
+ request: Request<
56
+ undefined,
57
+ unknown,
58
+ undefined,
59
+ undefined,
60
+ Record<string, unknown>
61
+ >,
62
+ ) => Promise<
63
+ | {
64
+ code: 200;
65
+ dataType: "application/json";
66
+ json: {
67
+ a: number;
68
+ };
69
+ }
70
+ | {
71
+ code: 500;
72
+ }
73
+ >;
74
+
75
+ expectTypeOf<Handler>().toEqualTypeOf<Expected>();
76
+ });
77
+
78
+ it("can infer handler responses correctly (Multiple)", () => {
79
+ const _data = z.object({
80
+ a: z.number(),
81
+ });
82
+
83
+ type Handler = HandlerForDefinition<
84
+ "/test",
85
+ undefined,
86
+ undefined,
87
+ {
88
+ 200: {
89
+ dataType: "application/json";
90
+ dataSchema: typeof _data;
91
+ };
92
+ 400: {};
93
+ }
94
+ >;
95
+
96
+ type Expected = (
97
+ request: Request<
98
+ undefined,
99
+ unknown,
100
+ undefined,
101
+ undefined,
102
+ Record<string, unknown>
103
+ >,
104
+ ) => Promise<
105
+ | {
106
+ code: 200;
107
+ dataType: "application/json";
108
+ json: {
109
+ a: number;
110
+ };
111
+ }
112
+ | { code: 400 }
113
+ | {
114
+ code: 500;
115
+ }
116
+ >;
117
+
118
+ expectTypeOf<Handler>().toEqualTypeOf<Expected>();
119
+ });
120
+ });
@@ -0,0 +1,33 @@
1
+ import z from "zod";
2
+ import { HttpStatusCode } from "../../constants/HttpStatusCodes";
3
+ import { Prettify } from "../../utils/types";
4
+ import { ApiEndpointHandler } from "./EndpointHandler";
5
+ import { ExtractPathParams } from "./PathParameters";
6
+ import { EmptyResponse, EmptyResponseSchema } from "./responses/emptyResponse";
7
+ import { GenericResponseSchemaMap } from "./responses/index";
8
+ import {
9
+ JsonResponseSchema,
10
+ JsonResponseSchemaToResponseType,
11
+ } from "./responses/jsonResponse";
12
+
13
+ export type HandlerForDefinition<
14
+ Path extends string,
15
+ RequestBody extends z.ZodType | undefined,
16
+ Query extends z.ZodType | undefined,
17
+ ResponsesMap extends GenericResponseSchemaMap,
18
+ > = ApiEndpointHandler<
19
+ ExtractPathParams<Path>,
20
+ RequestBody extends undefined ? undefined : z.infer<RequestBody>,
21
+ Query extends undefined ? undefined : z.infer<Query>,
22
+ Prettify<
23
+ {
24
+ [K in keyof ResponsesMap]: K extends HttpStatusCode
25
+ ? ResponsesMap[K] extends JsonResponseSchema
26
+ ? JsonResponseSchemaToResponseType<K, ResponsesMap[K]>
27
+ : ResponsesMap[K] extends EmptyResponseSchema
28
+ ? EmptyResponse<K>
29
+ : never
30
+ : never;
31
+ }[keyof ResponsesMap]
32
+ >
33
+ >;
@@ -0,0 +1,28 @@
1
+ import { describe, expectTypeOf, it } from "vitest";
2
+ import { ExtractPathParams } from "./PathParameters";
3
+
4
+ describe("ExtractPathParameters", () => {
5
+ it("can infer the parameter types of a path", () => {
6
+ type Path = "/test/path/with/:testId";
7
+ type ParamObject = ExtractPathParams<Path>;
8
+
9
+ expectTypeOf<ParamObject>().toEqualTypeOf<{ testId: string }>();
10
+ });
11
+
12
+ it("can infer multiple params", () => {
13
+ type Path = "/test/path/with/:testId/and/:otherId";
14
+ type ParamObject = ExtractPathParams<Path>;
15
+
16
+ expectTypeOf<ParamObject>().toEqualTypeOf<{
17
+ testId: string;
18
+ otherId: string;
19
+ }>();
20
+ });
21
+
22
+ it("can infer correctly if no param is present", () => {
23
+ type Path = "/test/path/without";
24
+ type ParamObject = ExtractPathParams<Path>;
25
+
26
+ expectTypeOf<ParamObject>().toEqualTypeOf<undefined>();
27
+ });
28
+ });
@@ -0,0 +1,10 @@
1
+ export type ExtractPathParams<Path extends string> =
2
+ Path extends `${string}:${infer Param}/${infer Rest}`
3
+ ? {
4
+ [K in Param | keyof ExtractPathParams<Rest>]: string;
5
+ }
6
+ : Path extends `${string}:${infer Param}`
7
+ ? {
8
+ [K in Param]: string;
9
+ }
10
+ : undefined;
@@ -0,0 +1,44 @@
1
+ import { Request, Response } from "express";
2
+ import expressAsyncHandler from "express-async-handler";
3
+ import z from "zod";
4
+ import { HttpMethod } from "../../constants/HttpMethods";
5
+ import { ApiEndpointDefinition } from "./EndpointDefinition";
6
+ import { ApiEndpointHandler } from "./EndpointHandler";
7
+ import { HandlerForDefinition } from "./HandlerFromDefinition";
8
+ import { GenericResponseSchemaMap } from "./responses";
9
+ import { isJsonResponse } from "./responses/jsonResponse";
10
+
11
+ export function createApiEndpointHandler<
12
+ const ResponsesMap extends GenericResponseSchemaMap,
13
+ const Path extends string,
14
+ const Method extends HttpMethod,
15
+ const RequestBody extends z.ZodType | undefined = undefined,
16
+ const Query extends z.ZodType | undefined = undefined,
17
+ >(
18
+ definition: ApiEndpointDefinition<
19
+ Path,
20
+ Method,
21
+ RequestBody,
22
+ Query,
23
+ ResponsesMap
24
+ >,
25
+ handler: HandlerForDefinition<Path, RequestBody, Query, ResponsesMap>,
26
+ ) {
27
+ return {
28
+ __API_ENDPOINT_DEFINITION__: definition,
29
+ definition,
30
+ handler,
31
+ };
32
+ }
33
+
34
+ export function buildApiEndpointHandler(handler: ApiEndpointHandler) {
35
+ return expressAsyncHandler(async (request: Request, response: Response) => {
36
+ const result = await handler(request);
37
+
38
+ if (isJsonResponse(result)) {
39
+ response.status(result.code).json(result.json);
40
+ } else {
41
+ response.status(result.code).send();
42
+ }
43
+ });
44
+ }
@@ -0,0 +1,12 @@
1
+ import { HttpStatusCode } from "../../../constants/HttpStatusCodes";
2
+
3
+ export interface EmptyResponseSchema {}
4
+
5
+ export interface EmptyResponse<Code extends HttpStatusCode = HttpStatusCode> {
6
+ code: Code;
7
+ }
8
+
9
+ export type EmptyResponseSchemaToResponseType<
10
+ Code extends HttpStatusCode,
11
+ _ extends EmptyResponseSchema,
12
+ > = EmptyResponse<Code>;
@@ -0,0 +1,15 @@
1
+ import {
2
+ ClientErrorStatusCode,
3
+ SuccessStatusCode,
4
+ } from "../../../constants/HttpStatusCodes";
5
+ import { EmptyResponse, EmptyResponseSchema } from "./emptyResponse";
6
+ import { JsonResponse, JsonResponseSchema } from "./jsonResponse";
7
+
8
+ export type GenericResponseSchemaMap = {
9
+ [K in SuccessStatusCode | ClientErrorStatusCode]?:
10
+ | EmptyResponseSchema
11
+ | JsonResponseSchema
12
+ | undefined;
13
+ };
14
+
15
+ export type GenericResponse = EmptyResponse | JsonResponse;
@@ -0,0 +1,44 @@
1
+ import z from "zod";
2
+ import { HttpStatusCode } from "../../../constants/HttpStatusCodes";
3
+ import { hasValue } from "../../../utils/typeGuards";
4
+
5
+ export interface JsonResponseSchema<DataSchema extends z.ZodType = z.ZodType> {
6
+ dataType: "application/json";
7
+ dataSchema: DataSchema;
8
+ }
9
+
10
+ export interface JsonResponse<
11
+ Code extends HttpStatusCode = HttpStatusCode,
12
+ Data = unknown,
13
+ > {
14
+ code: Code;
15
+ dataType: "application/json";
16
+ json: Data;
17
+ }
18
+
19
+ export type JsonResponseSchemaToResponseType<
20
+ Code extends HttpStatusCode,
21
+ Schema extends JsonResponseSchema,
22
+ > =
23
+ Schema extends JsonResponseSchema<infer DataSchema>
24
+ ? JsonResponse<Code, z.infer<DataSchema>>
25
+ : never;
26
+
27
+ export function isJsonResponseSchema(
28
+ value: unknown,
29
+ ): value is JsonResponseSchema {
30
+ return (
31
+ typeof value === "object" &&
32
+ hasValue(value) &&
33
+ "dataType" in value &&
34
+ value.dataType === "application/json"
35
+ );
36
+ }
37
+ export function isJsonResponse(value: unknown): value is JsonResponse {
38
+ return (
39
+ typeof value === "object" &&
40
+ value !== null &&
41
+ "dataType" in value &&
42
+ value.dataType === "application/json"
43
+ );
44
+ }
@@ -0,0 +1,4 @@
1
+ export { createApiEndpointHandler } from "./handlers/api/createApiHandler";
2
+ export { createServer, type Server, type ServerOptions } from "./server";
3
+
4
+ export default {};
@@ -0,0 +1,41 @@
1
+ import colors from "colors/safe";
2
+ import { NextFunction, Request, Response } from "express";
3
+ import { Logger } from "../utils/logging";
4
+
5
+ export function buildRequestLogger(logger: Logger, isInDevMode: boolean) {
6
+ return (req: Request, res: Response, next: NextFunction) => {
7
+ logger.info(
8
+ `[Request] ${colors.cyan(req.method)} - ${colors.cyan(req.path)}`,
9
+ );
10
+
11
+ if (isInDevMode) {
12
+ logger.info(`[Request - Dev] Headers: ${JSON.stringify(req.headers)}`);
13
+ logger.info(`[Request - Dev] Query: ${JSON.stringify(req.query)}`);
14
+ logger.info(`[Request - Dev] Body: ${JSON.stringify(req.body)}`);
15
+ }
16
+
17
+ next();
18
+ };
19
+ }
20
+
21
+ export function buildResponseLogger(logger: Logger, isInDevMode: boolean) {
22
+ return (req: Request, res: Response, next: NextFunction) => {
23
+ const originalSend = res.send;
24
+
25
+ res.json = function (body: unknown): Response {
26
+ logger.info(
27
+ `[Response] ${colors.cyan(req.method)} - ${colors.cyan(
28
+ req.path,
29
+ )} - Status: ${res.statusCode > 299 && res.statusCode < 599 ? colors.red(res.statusCode.toString()) : colors.green(res.statusCode.toString())}`,
30
+ );
31
+
32
+ if (isInDevMode) {
33
+ logger.info(`[Response - Dev] Body: ${JSON.stringify(body)}`);
34
+ }
35
+
36
+ return originalSend.call(this, body);
37
+ };
38
+
39
+ next();
40
+ };
41
+ }
@@ -0,0 +1,35 @@
1
+ import { NextFunction, Request, Response } from "express";
2
+ import { ZodType } from "zod";
3
+ import { HttpStatusCodes } from "../constants/HttpStatusCodes";
4
+
5
+ export function buildBodyValidatorMiddleware<Schema extends ZodType>(
6
+ schema: Schema,
7
+ ) {
8
+ return (request: Request, response: Response, next: NextFunction) => {
9
+ const validationResult = schema.safeParse(request.body);
10
+ if (!validationResult.success) {
11
+ response.status(HttpStatusCodes.BadRequest_400).json({
12
+ message: `Body invalid`,
13
+ error: validationResult.error,
14
+ });
15
+ return;
16
+ }
17
+ next();
18
+ };
19
+ }
20
+
21
+ export function buildQueryValidatorMiddleware<Schema extends ZodType>(
22
+ schema: Schema,
23
+ ) {
24
+ return (request: Request, response: Response, next: NextFunction) => {
25
+ const validationResult = schema.safeParse(request.query);
26
+ if (!validationResult.success) {
27
+ response.status(HttpStatusCodes.BadRequest_400).json({
28
+ message: `Query parameters invalid`,
29
+ error: validationResult.error,
30
+ });
31
+ return;
32
+ }
33
+ next();
34
+ };
35
+ }
@@ -0,0 +1,90 @@
1
+ import cookieParser from "cookie-parser";
2
+ import express, { Application } from "express";
3
+ import z from "zod";
4
+ import { HttpMethod } from "./constants/HttpMethods";
5
+ import { buildApiEndpointHandler } from "./handlers/api/createApiHandler";
6
+ import { ApiEndpointDefinition } from "./handlers/api/EndpointDefinition";
7
+ import { ApiEndpointHandler } from "./handlers/api/EndpointHandler";
8
+ import { buildRequestLogger, buildResponseLogger } from "./middleware/logging";
9
+ import {
10
+ buildBodyValidatorMiddleware,
11
+ buildQueryValidatorMiddleware,
12
+ } from "./middleware/validation";
13
+ import { Logger, NoOpLogger } from "./utils/logging";
14
+ import { hasNoValue, hasValue } from "./utils/typeGuards";
15
+
16
+ export interface ServerOptions {
17
+ inDevMode?: boolean;
18
+ port?: number;
19
+ logger?: Logger | boolean;
20
+ }
21
+ export interface Server {
22
+ _expressApp: Application;
23
+ _logger: Logger | boolean;
24
+ start: () => void;
25
+ registerApiEndpoint: (endpoint: {
26
+ endpointHandler: ApiEndpointHandler;
27
+ endpointDefinition: ApiEndpointDefinition<
28
+ string,
29
+ HttpMethod,
30
+ z.ZodType,
31
+ z.ZodType,
32
+ {}
33
+ >;
34
+ }) => void;
35
+ }
36
+
37
+ export function createServer(options: ServerOptions): Server {
38
+ const { port = 3000, inDevMode = false } = options;
39
+
40
+ const logger: Logger =
41
+ options.logger === true
42
+ ? console
43
+ : options.logger === false || hasNoValue(options.logger)
44
+ ? NoOpLogger
45
+ : options.logger;
46
+
47
+ const app = express();
48
+
49
+ app.use(express.json());
50
+ app.use(express.urlencoded({ extended: true }));
51
+ app.use(cookieParser());
52
+
53
+ app.use(buildRequestLogger(logger, inDevMode));
54
+ app.use(buildResponseLogger(logger, inDevMode));
55
+
56
+ return {
57
+ _expressApp: app,
58
+ _logger: logger,
59
+ start: () => {
60
+ app.listen(port);
61
+ },
62
+ registerApiEndpoint: ({ endpointDefinition, endpointHandler }) => {
63
+ registerApiEndpoint(app, endpointDefinition, endpointHandler);
64
+ },
65
+ };
66
+ }
67
+
68
+ function registerApiEndpoint(
69
+ expressApp: Application,
70
+ endpointDefinition: ApiEndpointDefinition<
71
+ string,
72
+ HttpMethod,
73
+ z.ZodType,
74
+ z.ZodType,
75
+ {}
76
+ >,
77
+ endpointHandler: ApiEndpointHandler,
78
+ ) {
79
+ const handlerStack = [
80
+ hasValue(endpointDefinition.querySchema)
81
+ ? buildQueryValidatorMiddleware(endpointDefinition.querySchema)
82
+ : null,
83
+ hasValue(endpointDefinition.requestBodySchema)
84
+ ? buildBodyValidatorMiddleware(endpointDefinition.requestBodySchema)
85
+ : null,
86
+ buildApiEndpointHandler(endpointHandler),
87
+ ].filter(hasValue);
88
+
89
+ expressApp[endpointDefinition.method](endpointDefinition.path, handlerStack);
90
+ }
@@ -0,0 +1,3 @@
1
+ export function isEmpty<T>(array: Array<T>): boolean {
2
+ return array.length === 0;
3
+ }
@@ -0,0 +1,10 @@
1
+ export type Logger = Pick<Console, "log" | "info" | "error" | "warn">;
2
+
3
+ export const NoOpLogger: Logger = {
4
+ log: () => {},
5
+ info: () => {},
6
+ error: () => {},
7
+ warn: () => {},
8
+ };
9
+
10
+ export const DefaultLogger: Logger = console;
@@ -0,0 +1,9 @@
1
+ export function hasValue<T>(value: T | undefined | null): value is T {
2
+ return value !== undefined && value !== null;
3
+ }
4
+
5
+ export function hasNoValue<T>(
6
+ value: T | undefined | null,
7
+ ): value is undefined | null {
8
+ return value === undefined || value === null;
9
+ }
@@ -0,0 +1,3 @@
1
+ export type Prettify<T> = {
2
+ [K in keyof T]: T[K];
3
+ } & {};
@@ -0,0 +1,36 @@
1
+ {
2
+ "folders": [
3
+ {
4
+ "path": "."
5
+ },
6
+ ],
7
+ "settings": {
8
+ "editor.tokenColorCustomizations": {
9
+ "[*Dark*]": {
10
+ "textMateRules": [
11
+ {
12
+ "scope": "keyword.control",
13
+ "settings": {
14
+ "foreground": "#C586C0"
15
+ }
16
+ }
17
+ ]
18
+ }
19
+ },
20
+ "editor.codeActionsOnSave": {
21
+ "source.fixAll.eslint": "explicit",
22
+ "source.organizeImports": "explicit"
23
+ },
24
+ "eslint.validate": [
25
+ "javascript",
26
+ "typescript",
27
+ "vue",
28
+ "vue-html"
29
+ ],
30
+ "cSpell.words": [
31
+ "neverthrow",
32
+ "VITE"
33
+ ],
34
+ "typescript.tsdk": "node_modules/typescript/lib",
35
+ }
36
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "strict": true,
4
+ "module": "ESNext",
5
+ "target": "ESNext",
6
+ "moduleResolution": "bundler",
7
+ "esModuleInterop": true,
8
+ "allowSyntheticDefaultImports": true,
9
+ "declaration": true,
10
+ "outDir": "./dist"
11
+ },
12
+ "include": [
13
+ "./src/**/*",
14
+ ],
15
+ }
@@ -0,0 +1,22 @@
1
+ import { loadEnv } from "vite";
2
+ import tsconfigPaths from "vite-tsconfig-paths";
3
+ import { defineConfig } from "vitest/config";
4
+
5
+ export default defineConfig({
6
+ root: "./src",
7
+ test: {
8
+ env: loadEnv("", ".", ""),
9
+ globals: true,
10
+ environment: "node",
11
+ coverage: {
12
+ provider: "v8",
13
+ reporter: ["html-spa", "text"],
14
+ include: ["*"],
15
+ reportsDirectory: "../coverage",
16
+ enabled: true,
17
+ cleanOnRerun: true,
18
+ },
19
+ },
20
+ define: {},
21
+ plugins: [tsconfigPaths()],
22
+ });