diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43b0cc9..9975b6f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,9 +10,10 @@ permissions: actions: read contents: read + jobs: main: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: @@ -38,6 +39,15 @@ jobs: # Prepend any command with "nx-cloud record --" to record its logs to Nx Cloud # - run: pnpm exec nx-cloud record -- echo Hello World # Nx Affected runs only tasks affected by the changes in this PR/commit. Learn more: https://nx.dev/ci/features/affected - - run: pnpm exec nx affected -t lint build test + - run: make test env: NX_CLOUD_AUTH_TOKEN: ${{ secrets.NX_CLOUD_AUTH_TOKEN }} + - name: Upload test results to Codecov + if: ${{ !cancelled() }} + uses: codecov/test-results-action@v1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 11f1f5e..535b02e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,10 @@ node_modules .nx/workspace-data *.sqlite coverage +*.xml + +# tell Git to ignore/stop ignoring this file +#$ git update-index --assume-unchanged +#$ git update-index --no-assume-unchanged +# Credit: https://web.archive.org/web/20240726013834/https://practicalgit.com/blog/make-git-ignore-local-changes-to-tracked-files.html +nx.json diff --git a/.npmrc b/.npmrc index 38bc3fc..81bc4fe 100644 --- a/.npmrc +++ b/.npmrc @@ -1,6 +1 @@ use-node-version=22.5.1 -strict-peer-dependencies=false -ublish-branch=main -save-prefix="" -link-workspace-packages=false -save-workspace-protocol=rolling \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..30e6c75 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +test: + ./scripts/inject-token.sh + pnpm exec nx affected -t lint build test + +@PHONY: test \ No newline at end of file diff --git a/apps/server/eslint.config.js b/apps/server/eslint.config.js index e5208ce..ec3eb89 100644 --- a/apps/server/eslint.config.js +++ b/apps/server/eslint.config.js @@ -19,6 +19,6 @@ export default tseslint.config( ...tseslint.configs.disableTypeChecked, }, { - ignores: ["**/dist/*"], + ignores: ["**/coverage/*", "**/dist/*"], } ); diff --git a/apps/server/package.json b/apps/server/package.json index d249bb2..74d475f 100644 --- a/apps/server/package.json +++ b/apps/server/package.json @@ -5,23 +5,28 @@ "type": "module", "scripts": { "clean": "rm -rf dist", - "build": "tsc", + "build": "tsc --build --verbose", "check-types": "tsc --noEmit", - "start": "node dist/index.js", + "lint": "eslint src", + "start": "node dist/src/index.js", + "test": "vitest", "dev": "node --import 'data:text/javascript,import { register } from \"node:module\"; import { pathToFileURL } from \"node:url\"; register(\"ts-node/esm\", pathToFileURL(\"./\"));' --watch src/index.ts" }, "keywords": [], "author": "", "license": "GPL-3.0-only", "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "20.14.12", "@types/pino": "7.0.5", - "@vitest/coverage-v8": "^2.0.3", - "eslint": "8", + "@vitest/coverage-v8": "^2.0.4", + "@vitest/ui": "^2.0.4", + "eslint": "^8.57.0", + "nx": "19.5.1", "ts-node": "^10.9.2", "tslib": "^2.6.3", "typescript": "^5.5.4", - "vitest": "^1.3.1" + "vite": "2.0.4", + "vitest": "^2.0.4" }, "dependencies": { "@rusty/util": "workspace:*", diff --git a/apps/server/project.json b/apps/server/project.json index 429e7aa..10445a3 100644 --- a/apps/server/project.json +++ b/apps/server/project.json @@ -1,12 +1,3 @@ { - "targets": { - "test": { - "executor": "@nx/vite:test", - "options": { - "command": "vitest run", - "coverage": true, - "reporter": "verbose" - } - } - } + "projectType": "application" } diff --git a/apps/server/src/ServerController.ts b/apps/server/src/ServerController.ts index 609ffcf..d242c5c 100644 --- a/apps/server/src/ServerController.ts +++ b/apps/server/src/ServerController.ts @@ -5,22 +5,7 @@ import { WrappedServer } from "./WrappedServer.js"; import { exit } from "node:process"; import { log } from "@rusty/util"; import { handleWebRequests } from "@rusty/web"; - -function headerstoRecords( - headers: import("node:http").IncomingHttpHeaders -): Record { - const result: Record = {}; - for (const [key, value] of Object.entries(headers)) { - if (Array.isArray(value)) { - result[key] = value.join(", "); - } else { - if (typeof key === "string" && typeof value === "string") { - result[key] = value; - } - } - } - return result; -} +import { headersToRecords } from "./headersToRecords.js"; /** * @@ -32,7 +17,7 @@ async function handleIncomingRequest( res: import("node:http").ServerResponse ) { const response = await handleWebRequests({ - headers: headerstoRecords(req.headers), + headers: headersToRecords(req.headers), remoteAddress: req.socket.remoteAddress || "", method: req.method || "", url: req.url || "", diff --git a/apps/server/src/headersToRecords.ts b/apps/server/src/headersToRecords.ts new file mode 100644 index 0000000..b9e6285 --- /dev/null +++ b/apps/server/src/headersToRecords.ts @@ -0,0 +1,13 @@ +export function headersToRecords( + headers: import("node:http").IncomingHttpHeaders +): Record { + const result: Record = {}; + for (const [key, value] of Object.entries(headers)) { + if (Array.isArray(value)) { + result[key] = value.join(", "); + } else if (typeof key === "string" && typeof value === "string") { + result[key] = value; + } + } + return result; +} diff --git a/apps/server/test/headersToRecords.test.ts b/apps/server/test/headersToRecords.test.ts new file mode 100644 index 0000000..255e574 --- /dev/null +++ b/apps/server/test/headersToRecords.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, test } from "vitest"; +import { headersToRecords } from "../src/headersToRecords.js"; +import type { IncomingHttpHeaders } from "node:http"; + +describe("headersToRecords", () => { + test("should convert headers to records", () => { + const headers: IncomingHttpHeaders = { + "content-type": "application/json", + "x-auth-token": "abc123", + accept: "application/json, text/html", + }; + + const expected = { + "content-type": "application/json", + "x-auth-token": "abc123", + accept: "application/json, text/html", + }; + + const result = headersToRecords(headers); + + expect(result).toEqual(expected); + }); + + test("should handle empty headers", () => { + const headers = {}; + + const expected = {}; + + const result = headersToRecords(headers); + + expect(result).toEqual(expected); + }); +}); diff --git a/apps/server/tsconfig.json b/apps/server/tsconfig.json index c3d6772..13a8059 100644 --- a/apps/server/tsconfig.json +++ b/apps/server/tsconfig.json @@ -2,9 +2,9 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "./dist", - "declarationDir": "./dist" + "declarationDir": "./dist", + "composite": true }, "include": ["src/**/*.ts", "test/**/*.ts"], - "exclude": ["node_modules", "dist"], - "references": [{ "path": "../../libs/util" }, { "path": "../../libs/web" }] + "exclude": ["node_modules", "dist"] } diff --git a/apps/server/vitest.config.js b/apps/server/vitest.config.js index 33780b3..41a1bd3 100644 --- a/apps/server/vitest.config.js +++ b/apps/server/vitest.config.js @@ -3,7 +3,18 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { coverage: { - provider: "v8", + enabled: true, + all: true, + exclude: [ + "dist/**", + "eslint.config.js", + "vitest.config.js" + ], + reporter: ["lcov", "text", "cobertura"], }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + watch: false, }, }); diff --git a/libs/util/eslint.config.js b/libs/util/eslint.config.js index e5208ce..ec3eb89 100644 --- a/libs/util/eslint.config.js +++ b/libs/util/eslint.config.js @@ -19,6 +19,6 @@ export default tseslint.config( ...tseslint.configs.disableTypeChecked, }, { - ignores: ["**/dist/*"], + ignores: ["**/coverage/*", "**/dist/*"], } ); diff --git a/libs/util/package.json b/libs/util/package.json index 84bd1f8..c18b3f7 100644 --- a/libs/util/package.json +++ b/libs/util/package.json @@ -9,21 +9,26 @@ "types": "./dist/index.d.ts", "scripts": { "clean": "rm -rf dist", - "build": "tsc", - "check-types": "tsc --noEmit" + "build": "tsc --build --verbose", + "test": "vitest", + "check-types": "tsc --noEmit", + "lint": "eslint src" }, "keywords": [], "author": "", "license": "GPL-3.0-only", "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "20.14.12", "@types/pino": "7.0.5", - "@vitest/coverage-v8": "^2.0.3", - "eslint": "8", + "@vitest/coverage-v8": "^2.0.4", + "@vitest/ui": "^2.0.4", + "eslint": "^8.57.0", + "nx": "19.5.1", "ts-node": "^10.9.2", "tslib": "^2.6.3", "typescript": "^5.5.4", - "vitest": "^1.3.1" + "vite": "2.0.4", + "vitest": "^2.0.4" }, "dependencies": { "pino": "9.3.1" diff --git a/libs/util/project.json b/libs/util/project.json deleted file mode 100644 index 429e7aa..0000000 --- a/libs/util/project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "targets": { - "test": { - "executor": "@nx/vite:test", - "options": { - "command": "vitest run", - "coverage": true, - "reporter": "verbose" - } - } - } -} diff --git a/libs/util/test/index.test.ts b/libs/util/test/index.test.ts new file mode 100644 index 0000000..b5b8b27 --- /dev/null +++ b/libs/util/test/index.test.ts @@ -0,0 +1,7 @@ +import { describe, test, expect } from "vitest"; + +describe("example", () => { + test("example", () => { + expect(1).toBe(1); + }); +}); \ No newline at end of file diff --git a/libs/util/vitest.config.js b/libs/util/vitest.config.js index 33780b3..c1aed66 100644 --- a/libs/util/vitest.config.js +++ b/libs/util/vitest.config.js @@ -3,7 +3,18 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { coverage: { - provider: "v8", + enabled: true, + all: true, + exclude: [ + "dist/**", + "eslint.config.js", + "vitest.config.js" + ], + reporter: ["lcov", "text", "cobertura"], }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + watch: false, }, -}); +}); \ No newline at end of file diff --git a/libs/web/eslint.config.js b/libs/web/eslint.config.js index e5208ce..ec3eb89 100644 --- a/libs/web/eslint.config.js +++ b/libs/web/eslint.config.js @@ -19,6 +19,6 @@ export default tseslint.config( ...tseslint.configs.disableTypeChecked, }, { - ignores: ["**/dist/*"], + ignores: ["**/coverage/*", "**/dist/*"], } ); diff --git a/libs/web/package.json b/libs/web/package.json index 9de8146..157afe6 100644 --- a/libs/web/package.json +++ b/libs/web/package.json @@ -9,21 +9,26 @@ "types": "./dist/index.d.ts", "scripts": { "clean": "rm -rf dist", - "build": "tsc", - "check-types": "tsc --noEmit" + "build": "tsc --build --verbose", + "test": "vitest", + "check-types": "tsc --noEmit", + "lint": "eslint src" }, "keywords": [], "author": "", "license": "GPL-3.0-only", "devDependencies": { - "@types/node": "^20.14.11", + "@types/node": "20.14.12", "@types/pino": "7.0.5", - "@vitest/coverage-v8": "^2.0.3", - "eslint": "8", + "@vitest/coverage-v8": "^2.0.4", + "@vitest/ui": "^2.0.4", + "eslint": "^8.57.0", + "nx": "19.5.1", "ts-node": "^10.9.2", "tslib": "^2.6.3", "typescript": "^5.5.4", - "vitest": "^1.3.1" + "vite": "2.0.4", + "vitest": "^2.0.4" }, "dependencies": { "@rusty/util": "workspace:*", diff --git a/libs/web/project.json b/libs/web/project.json deleted file mode 100644 index 429e7aa..0000000 --- a/libs/web/project.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "targets": { - "test": { - "executor": "@nx/vite:test", - "options": { - "command": "vitest run", - "coverage": true, - "reporter": "verbose" - } - } - } -} diff --git a/libs/web/src/db.ts b/libs/web/src/db.ts index e97f523..12143ec 100644 --- a/libs/web/src/db.ts +++ b/libs/web/src/db.ts @@ -1,11 +1,13 @@ import { Sequelize } from "sequelize"; +const DATABASE_URL = process.env.DATABASE_URL || ":memory:"; + export const db = new Sequelize({ dialect: "sqlite", - storage: "db.sqlite", + storage: DATABASE_URL, logging: console.log, // Enable logging }); db.authenticate() - .then(() => console.log("Database connected...")) + .then(() => db.sync()) .catch((err) => console.error("Error connecting to the database:", err)); diff --git a/libs/web/src/errors.ts b/libs/web/src/errors.ts new file mode 100644 index 0000000..e984c25 --- /dev/null +++ b/libs/web/src/errors.ts @@ -0,0 +1,52 @@ +import { log } from "@rusty/util"; + +export class ErrorMissingCredentials extends Error { + name = "ErrorMissingCredentials"; + + constructor(message: string) { + super(message); + this.name = "ErrorMissingCredentials"; + } +} + +export class ErrorUserExists extends Error { + name = "ErrorUserExists"; + + constructor(message: string) { + super(message); + this.name = "ErrorUserExists"; + } +} + +export class ErrorUserNotFound extends Error { + name = "ErrorUserNotFound"; + + constructor(message: string) { + super(message); + this.name = "ErrorUserNotFound"; + } +} +/** + * Handles the error that occurs when creating a user. + * If the error message indicates that the username must be unique, + * it throws an ErrorUserExists with the original error as the cause. + * Otherwise, it throws a generic Error with the original error as the cause. + * + * @param error - The error that occurred during user creation. + * @throws {ErrorUserExists} - If the error message indicates that the username must be unique. + * @throws {Error} - If the error message does not indicate that the username must be unique. + * @returns {never} - This function never returns a value. + */ +export function handleCreateUserError(error: unknown): never { + if ((error as Error).message.includes("username must be unique")) { + const err = new Error("Error creating user"); + err.name = "ErrorUserExists"; + err.cause = error; + log.error(`Error creating user: ${(error as Error).message}`); + throw err; + } + const err = new ErrorUserExists("Error creating user"); + err.cause = error; + log.error(`Error creating user: ${(error as Error).message}`); + throw err; +} diff --git a/libs/web/src/models/User.ts b/libs/web/src/models/User.ts index 4731072..e33e390 100644 --- a/libs/web/src/models/User.ts +++ b/libs/web/src/models/User.ts @@ -14,9 +14,9 @@ export class User extends Model implements UserAttributes { - public id!: number; - public username!: string; - public password!: string; + declare id: number; + declare username: string; + declare password: string; } User.init( @@ -29,6 +29,7 @@ User.init( username: { type: DataTypes.STRING, allowNull: false, + unique: true, }, password: { type: DataTypes.STRING, diff --git a/libs/web/src/services/AuthLogin.ts b/libs/web/src/services/AuthLogin.ts index d7885f7..bc1a4e5 100644 --- a/libs/web/src/services/AuthLogin.ts +++ b/libs/web/src/services/AuthLogin.ts @@ -1,71 +1,158 @@ -import { Sequelize } from "sequelize"; - import { User, type UserAttributes } from "../models/User.js"; import type { parsedHttpRequestData, RequestResponse } from "../types.js"; -import { db } from "../db.js"; import { log } from "@rusty/util"; +import { + ErrorMissingCredentials, + ErrorUserNotFound, + handleCreateUserError, +} from "../errors.js"; -export class AuthLogin { - private sequelize: Sequelize; +function validateCredentials(username: string, password: string): void { + if (username === "") { + throw new ErrorMissingCredentials("Username is required"); + } - constructor(sequelize: Sequelize) { - this.sequelize = sequelize; + if (password === "") { + throw new ErrorMissingCredentials("Password is required"); } +} + +export async function createUser( + username: string, + password: string +): Promise> { + log.debug("AuthLogin.create"); - async login( - username: string, - password: string - ): Promise | null> { - log.debug("AuthLogin.login"); - log.debug(`Searching for user: ${username}`); - const user = await User.findOne({ - where: { - username, - password, - }, - }); - - if (!user) { - log.debug("User not found"); - return null; - } - - log.debug("User found"); - return { - username: user.username, - password: user.password, - }; + validateCredentials(username, password); + + log.debug(`Creating user: ${username}`); + try { + const user = await User.create({ username, password }); + log.debug(`User created: ${user ? user.username : "null"}`); + return { username: user.username, password: user.password }; + } catch (error: unknown) { + handleCreateUserError(error); } } +/** + * Authenticates a user by their username and password. + * @param {string} username - The username of the user. + * @param {string} password - The password of the user. + * @returns {Promise>} - A promise that resolves to the user attributes (excluding the "id" field). + * @throws {ErrorUserNotFound} - If the user is not found. + */ +export async function userLogin( + username: string, + password: string +): Promise> { + log.debug("AuthLogin.login"); + log.debug(`Searching for user: ${username}`); + const user = await User.findOne({ + where: { + username, + password, + }, + }); + + if (!user) { + throw new ErrorUserNotFound("User not found"); + } + + log.debug("User found"); + return { + username: user.username, + password: user.password, + }; +} +/** + * Handles the authentication login process. + * + * @param info - The parsed HTTP request data. + * @returns A promise that resolves to the request response. + */ export async function handleAuthLogin( info: parsedHttpRequestData ): Promise { - const username = (info.searchParams.get("username") as string) || ""; - const password = (info.searchParams.get("password") as string) || ""; + const { username, password } = extractCredentials(info); - if (username === "" || password === "") { - return Promise.resolve({ - statusCode: 400, - body: "Bad Request\n", - headers: { "Content-Type": "text/plain" }, - }); - } + try { + validateCredentials(username, password); - const authLogin = new AuthLogin(db); - const user = await authLogin.login(username, password); + await userLogin(username, password); - if (!user) { - return { - statusCode: 401, - body: "Unauthorized\n", - headers: { "Content-Type": "text/plain" }, - }; + const token = "abc123"; + + return constructLoginResponse(`Valid=TRUE\nTicket=${token}`); + } catch (error: unknown) { + log.error(`Error validating credentials: ${(error as Error).message}`); + return generateLoginError( + "INV-200", + "Unable to login", + "https://rusty-motors.com" + ); } +} + +/** + * Extracts the username and password from the parsed HTTP request data. + * @param info - The parsed HTTP request data. + * @returns An object containing the extracted username and password. + */ +function extractCredentials(info: parsedHttpRequestData): { + username: string; + password: string; +} { + const username = (info.searchParams.get("username") as string) || ""; + const password = (info.searchParams.get("password") as string) || ""; + return { username, password }; +} +/** + * Constructs a login response object. + * @param body - The response body. + * @returns The constructed login response object. + */ +function constructLoginResponse(body = ""): RequestResponse { return { statusCode: 200, - body: JSON.stringify(user), - headers: { "Content-Type": "application/json" }, + body, + headers: { "Content-Type": "text/plain" }, }; } + +/** + * Generates a login error response. + * + * @param errorCode - The error code. Default is "INV-200". + * @param errorText - The error text. Default is "Unable to login". + * @param errorUrl - The error URL. Default is "https://rusty-motors.com". + * @returns The login error response. + */ +function generateLoginError( + errorCode = "INV-200", + errorText = "Unable to login", + errorUrl = "https://rusty-motors.com" +): RequestResponse | PromiseLike { + return { + statusCode: 200, + body: `reasoncode=${errorCode}\nreasontext=${errorText}\nreasonurl=${errorUrl}`, + headers: { "Content-Type": "text/plain" }, + }; +} + +/** + * Deletes a user from the database. + * + * @param username - The username of the user to delete. + * @returns A Promise that resolves when the user is successfully deleted. + * @throws If there is an error deleting the user. + */ +export async function deleteUser(username: string): Promise { + log.debug("Deleting user"); + return await User.destroy({ + where: { + username, + }, + }); +} diff --git a/libs/web/test/AuthLogin.test.ts b/libs/web/test/AuthLogin.test.ts index 95b29dd..ab983be 100644 --- a/libs/web/test/AuthLogin.test.ts +++ b/libs/web/test/AuthLogin.test.ts @@ -1,42 +1,52 @@ -import { describe, expect, it } from "vitest"; -import { handleAuthLogin } from "../src/services/AuthLogin.js"; +import { describe, expect, it, test } from "vitest"; -describe("handleAuthLogin", () => { - it("should return 400 if username or password is empty", async () => { +import { + handleAuthLogin, + createUser, + deleteUser, +} from "../src/services/AuthLogin.js"; +import { ErrorMissingCredentials, ErrorUserExists } from "../src/errors.js"; + +describe("handleAuthLogin -> User Login", () => { + it("When either username or password is not supplied, expect a generic error", async () => { const searchParams = new URLSearchParams(); searchParams.set("username", "validuser"); searchParams.set("password", ""); const info = { - headers: {}, - remoteAddress: "", - method: "", - pathname: "", + headers: {}, + remoteAddress: "", + method: "", + pathname: "", searchParams, }; const response = await handleAuthLogin(info); - expect(response.statusCode).toBe(400); - expect(response.body).toBe("Bad Request\n"); + expect(response.statusCode).toBe(200); // Client expects all responses to be 200 + expect(response.body).toBe( + "reasoncode=INV-200\nreasontext=Unable to login\nreasonurl=https://rusty-motors.com" + ); expect(response.headers).toEqual({ "Content-Type": "text/plain" }); }); - it("should return 401 if user is not found", async () => { + it("When user is not found, expect a generic error", async () => { const searchParams = new URLSearchParams(); searchParams.set("username", "nonexistent"); searchParams.set("password", "password"); const info = { - headers: {}, - remoteAddress: "", - method: "", - pathname: "", + headers: {}, + remoteAddress: "", + method: "", + pathname: "", searchParams, }; const response = await handleAuthLogin(info); - expect(response.statusCode).toBe(401); - expect(response.body).toBe("Unauthorized\n"); + expect(response.statusCode).toBe(200); + expect(response.body).toBe( + "reasoncode=INV-200\nreasontext=Unable to login\nreasonurl=https://rusty-motors.com" + ); expect(response.headers).toEqual({ "Content-Type": "text/plain" }); }); @@ -45,22 +55,102 @@ describe("handleAuthLogin", () => { searchParams.set("username", "validuser"); searchParams.set("password", "password"); const info = { - headers: {}, - remoteAddress: "", - method: "", - pathname: "", + headers: {}, + remoteAddress: "", + method: "", + pathname: "", searchParams, }; + await createUser("validuser", "password"); + const response = await handleAuthLogin(info); expect(response.statusCode).toBe(200); - expect(response.body).toBe( - JSON.stringify({ - username: "validuser", - password: "password", - }) - ); - expect(response.headers).toEqual({ "Content-Type": "application/json" }); + expect(response.body).toContain(`Valid=TRUE\nTicket=`); + expect(response.headers).toEqual({ "Content-Type": "text/plain" }); + }); +}); + +describe("AuthLogin -> createUser", () => { + it("when username is blank, expect an ErrorMissingCredentials to be thrown", async () => { + // Arrange + const user = ""; + const password = "password"; + + // Assert + try { + await createUser(user, password); + } catch (error: unknown) { + expect(error).toBeInstanceOf(ErrorMissingCredentials); + expect((error as Error).message).toBe("Username is required"); + } + }); + + it("when password is blank, expect an ErrorMissingCredentials to be thrown", async () => { + // Arrange + const user = "validuser"; + const password = ""; + + // Assert + try { + await createUser(user, password); + } catch (error: unknown) { + expect(error).toBeInstanceOf(ErrorMissingCredentials); + expect((error as Error).message).toBe("Password is required"); + } + }); + + it("when user already exists, expect an ErrorUserExists to be thrown", async () => { + // Arrange + const user = "validuser"; + const password = "password"; + await deleteUser(user); + await createUser(user, password); + + // Assert + try { + await createUser(user, password); + } catch (error: unknown) { + expect(error).toBeInstanceOf(ErrorUserExists); + } + }); + + test("when user is created, expect a promise to be resolved with the user", async () => { + // Arrange + const user = "validuser"; + const password = "password"; + await deleteUser(user); + + // Act + const result = createUser(user, password); + + // Assert + await expect(result).resolves.toEqual({ username: user, password }); + }); +}); + +describe("AuthLogin -> deleteUser", () => { + it("when user is not found, expect a promise to be resolved with 0", async () => { + // Arrange + const user = "nonexistent"; + + // Assert + const result = await deleteUser(user); + expect(result).toEqual(0); + }); + + test("when user is deleted, expect a promise to be resolved with the number of rows affected (1)", async () => { + // Arrange + const user = "validuser"; + const password = "password"; + await deleteUser(user); + + // Act + await createUser(user, password); + const result = await deleteUser(user); + + // Assert + expect(result).toEqual(1); }); }); diff --git a/libs/web/test/errors.test.ts b/libs/web/test/errors.test.ts new file mode 100644 index 0000000..157d5c8 --- /dev/null +++ b/libs/web/test/errors.test.ts @@ -0,0 +1,129 @@ +import { describe, expect, it } from "vitest"; +import { handleAuthLogin, createUser } from "../src/services/AuthLogin.js"; +import { + ErrorMissingCredentials, + ErrorUserExists, +} from "../src/errors.js"; +import { deleteUser } from "../src/services/AuthLogin.js"; + +describe("handleAuthLogin -> User Login", () => { + it("When either username or password is not supplied, expect a generic error", async () => { + // Arrange + const searchParams = new URLSearchParams(); + searchParams.set("username", "validuser"); + searchParams.set("password", ""); + const info = { + headers: {}, + remoteAddress: "", + method: "", + pathname: "", + searchParams, + }; + + // Act + const response = await handleAuthLogin(info); + + // Assert + expect(response.statusCode).toBe(200); + expect(response.body).toBe( + "reasoncode=INV-200\nreasontext=Unable to login\nreasonurl=https://rusty-motors.com" + ); + expect(response.headers).toEqual({ "Content-Type": "text/plain" }); + }); + + it("When user is not found, expect a generic error", async () => { + // Arrange + const searchParams = new URLSearchParams(); + searchParams.set("username", "nonexistent"); + searchParams.set("password", "password"); + const info = { + headers: {}, + remoteAddress: "", + method: "", + pathname: "", + searchParams, + }; + + // Act + const response = await handleAuthLogin(info); + + // Assert + expect(response.statusCode).toBe(200); + expect(response.body).toBe( + "reasoncode=INV-200\nreasontext=Unable to login\nreasonurl=https://rusty-motors.com" + ); + expect(response.headers).toEqual({ "Content-Type": "text/plain" }); + }); + + it("should return 200 with user data if login is successful", async () => { + // Arrange + const searchParams = new URLSearchParams(); + searchParams.set("username", "validuser"); + searchParams.set("password", "password"); + const info = { + headers: {}, + remoteAddress: "", + method: "", + pathname: "", + searchParams, + }; + + await createUser("validuser", "password"); + + // Act + const response = await handleAuthLogin(info); + + // Assert + expect(response.statusCode).toBe(200); + expect(response.body).toContain(`Valid=TRUE\nTicket=`); + expect(response.headers).toEqual({ "Content-Type": "text/plain" }); + }); +}); + +describe("AuthLogin -> createUser", () => { + it("when username is blank, expect an ErrorMissingCredentials to be thrown", async () => { + // Arrange + const user = ""; + const password = "password"; + + // Act & Assert + await expect(createUser(user, password)).rejects.toThrow( + ErrorMissingCredentials + ); + }); + + it("when password is blank, expect an ErrorMissingCredentials to be thrown", async () => { + // Arrange + const user = "validuser"; + const password = ""; + + // Act & Assert + await expect(createUser(user, password)).rejects.toThrow( + ErrorMissingCredentials + ); + }); + + it("when user already exists, expect an ErrorUserExists to be thrown", async () => { + // Arrange + const user = "validuser"; + const password = "password"; + await deleteUser(user); + await createUser(user, password); + + // Act & Assert + await expect(createUser(user, password)).rejects.toThrow(ErrorUserExists); + }); + + it("when user is created, expect a promise to be resolved with the user", async () => { + // Arrange + const user = "validuser"; + const password = "password"; + await deleteUser(user); + + // Act + const result = createUser(user, password); + + // Assert + await expect(result).resolves.toEqual({ username: user, password }); + }); +}); diff --git a/libs/web/tsconfig.json b/libs/web/tsconfig.json index 41c8030..6572291 100644 --- a/libs/web/tsconfig.json +++ b/libs/web/tsconfig.json @@ -7,5 +7,5 @@ }, "include": ["index.ts", "src/**/*.ts", "test/**/*.ts"], "exclude": ["node_modules", "dist"], - "references": [{ "path": "../../libs/util" }] + "references": [{ "path": "../util" }] } diff --git a/libs/web/vitest.config.js b/libs/web/vitest.config.js index 33780b3..c1aed66 100644 --- a/libs/web/vitest.config.js +++ b/libs/web/vitest.config.js @@ -3,7 +3,18 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { coverage: { - provider: "v8", + enabled: true, + all: true, + exclude: [ + "dist/**", + "eslint.config.js", + "vitest.config.js" + ], + reporter: ["lcov", "text", "cobertura"], }, + reporters: ["junit", "default", "hanging-process"], + outputFile: "mcos.junit.xml", + pool: "forks", + watch: false, }, -}); +}); \ No newline at end of file diff --git a/nx.json b/nx.json index 095ddd3..4014854 100644 --- a/nx.json +++ b/nx.json @@ -5,29 +5,22 @@ "dependsOn": ["^clean"] }, "build": { - "dependsOn": ["clean", "^build"], + "dependsOn": ["^build"], "outputs": ["{projectRoot}/dist"], "cache": true }, "check-types": { - "dependsOn": ["^check-types"], + "dependsOn": ["check-types", "^check-types"], "cache": true + }, + "test": { + "dependsOn": ["build"], + "outputs": ["{projectRoot}/coverage"] + }, + "lint": { + "dependsOn": ["build", "^lint"] } }, "defaultBase": "main", - "nxCloudAccessToken": "MmE0NmEwNmEtMzYyNy00Yzk2LTkxYzYtYWY1ZTYwMzZlYmMzfHJlYWQ=", - "plugins": [ - { - "plugin": "@nx/vite/plugin", - "options": { - "testTargetName": "test" - } - }, - { - "plugin": "@nx/eslint/plugin", - "options": { - "targetName": "lint" - } - } - ] + "nxCloudAccessToken": "__NX_CLOUD_AUTH_TOKEN__" } diff --git a/package.json b/package.json index ec2c2b9..91d05e1 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,8 @@ "type": "module", "scripts": { "clean": "nx run-many -t clean", - "build": "nx run-many -t build", "check-types": "nx run-many -t check-types", - "prestart": "nx run-many -t build", + "test": "make test", "start": "pnpm --filter @rusty/server run start", "dev": "nx run-many -t dev" }, @@ -17,21 +16,17 @@ "license": "GPL-3.0-only", "devDependencies": { "@eslint/js": "^9.7.0", - "@nx/eslint": "19.5.1", - "@nx/eslint-plugin": "19.5.1", - "@nx/vite": "19.5.1", "@nx/web": "19.5.1", - "@types/eslint__js": "^8.42.3", - "@types/node": "^20.14.11", - "@vitest/ui": "^1.3.1", + "@vitest/coverage-v8": "^2.0.4", + "@vitest/ui": "^2.0.4", "eslint": "^8.57.0", "nx": "19.5.1", "ts-node": "^10.9.2", "tslib": "^2.6.3", "typescript": "^5.5.4", - "typescript-eslint": "^7.16.1", - "vite": "^5.0.0", - "vitest": "^1.3.1" + "typescript-eslint": "^7.17.0", + "vite": "^2.0.4", + "vitest": "^2.0.4" }, "packageManager": "pnpm@9.5.0+sha512.140036830124618d624a2187b50d04289d5a087f326c9edfc0ccd733d76c4f52c3a313d4fc148794a2a9d81553016004e6742e8cf850670268a7387fc220c903" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b45f5ef..7a4481b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,27 +11,15 @@ importers: '@eslint/js': specifier: ^9.7.0 version: 9.7.0 - '@nx/eslint': - specifier: 19.5.1 - version: 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@19.5.1) - '@nx/eslint-plugin': - specifier: 19.5.1 - version: 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(nx@19.5.1)(typescript@5.5.4) - '@nx/vite': - specifier: 19.5.1 - version: 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)(vite@5.3.4(@types/node@20.14.11))(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0)) '@nx/web': specifier: 19.5.1 - version: 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) - '@types/eslint__js': - specifier: ^8.42.3 - version: 8.42.3 - '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + version: 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4) + '@vitest/coverage-v8': + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4)) '@vitest/ui': - specifier: ^1.3.1 - version: 1.6.0(vitest@1.6.0) + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -40,7 +28,7 @@ importers: version: 19.5.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.11)(typescript@5.5.4) + version: 10.9.2(@types/node@20.14.12)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 @@ -48,14 +36,14 @@ importers: specifier: ^5.5.4 version: 5.5.4 typescript-eslint: - specifier: ^7.16.1 - version: 7.16.1(eslint@8.57.0)(typescript@5.5.4) + specifier: ^7.17.0 + version: 7.17.0(eslint@8.57.0)(typescript@5.5.4) vite: - specifier: ^5.0.0 - version: 5.3.4(@types/node@20.14.11) + specifier: ^2.0.4 + version: 2.0.4 vitest: - specifier: ^1.3.1 - version: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) + specifier: ^2.0.4 + version: 2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4) apps/server: dependencies: @@ -67,29 +55,38 @@ importers: version: link:../../libs/web devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: 20.14.12 + version: 20.14.12 '@types/pino': specifier: 7.0.5 version: 7.0.5 '@vitest/coverage-v8': - specifier: ^2.0.3 - version: 2.0.3(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0)) + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4)) + '@vitest/ui': + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4) eslint: - specifier: '8' + specifier: ^8.57.0 version: 8.57.0 + nx: + specifier: 19.5.1 + version: 19.5.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.11)(typescript@5.5.4) + version: 10.9.2(@types/node@20.14.12)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 + vite: + specifier: 2.0.4 + version: 2.0.4 vitest: - specifier: ^1.3.1 - version: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) + specifier: ^2.0.4 + version: 2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4) libs/util: dependencies: @@ -98,29 +95,38 @@ importers: version: 9.3.1 devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: 20.14.12 + version: 20.14.12 '@types/pino': specifier: 7.0.5 version: 7.0.5 '@vitest/coverage-v8': - specifier: ^2.0.3 - version: 2.0.3(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0)) + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4)) + '@vitest/ui': + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4) eslint: - specifier: '8' + specifier: ^8.57.0 version: 8.57.0 + nx: + specifier: 19.5.1 + version: 19.5.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.11)(typescript@5.5.4) + version: 10.9.2(@types/node@20.14.12)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 + vite: + specifier: 2.0.4 + version: 2.0.4 vitest: - specifier: ^1.3.1 - version: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) + specifier: ^2.0.4 + version: 2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4) libs/web: dependencies: @@ -138,29 +144,38 @@ importers: version: 5.1.7 devDependencies: '@types/node': - specifier: ^20.14.11 - version: 20.14.11 + specifier: 20.14.12 + version: 20.14.12 '@types/pino': specifier: 7.0.5 version: 7.0.5 '@vitest/coverage-v8': - specifier: ^2.0.3 - version: 2.0.3(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0)) + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4)) + '@vitest/ui': + specifier: ^2.0.4 + version: 2.0.4(vitest@2.0.4) eslint: - specifier: '8' + specifier: ^8.57.0 version: 8.57.0 + nx: + specifier: 19.5.1 + version: 19.5.1 ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.14.11)(typescript@5.5.4) + version: 10.9.2(@types/node@20.14.12)(typescript@5.5.4) tslib: specifier: ^2.6.3 version: 2.6.3 typescript: specifier: ^5.5.4 version: 5.5.4 + vite: + specifier: 2.0.4 + version: 2.0.4 vitest: - specifier: ^1.3.1 - version: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) + specifier: ^2.0.4 + version: 2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4) packages: @@ -1037,9 +1052,6 @@ packages: '@nrwl/devkit@19.5.1': resolution: {integrity: sha512-ZsckDZszLTv3oshNsY5fZ86g8a/VcGvgDpdiP/z/A/krtOHL8iUjdT/72Eo5DIult5WcSFjnifyWcyWIGe1PeA==} - '@nrwl/eslint-plugin-nx@19.5.1': - resolution: {integrity: sha512-zCLLe4sbnV5U9yIi7MMFKpyW+KtQ3tTRra+7Lhyz/yrpu//3a0PrRz3o3LPuKSXxbqQryL5kQJzpqjOthF582Q==} - '@nrwl/js@19.5.1': resolution: {integrity: sha512-t3EBizfpsT2n2x/oISqs2/JyCpwl1EqjvNDyXgMavLvIMnjLd1vsvmHwoblMJdRJFWropHlHBtp+6u2PRs/Gjw==} @@ -1047,9 +1059,6 @@ packages: resolution: {integrity: sha512-gAitJkexzI36jCNIHru1PAqNcFe17KlSwb3F4VoCArcZSJmSh5cTbxaAAWup8aavxHT6nF6G1Zm1+N0RmzRMRQ==} hasBin: true - '@nrwl/vite@19.5.1': - resolution: {integrity: sha512-NLQkBfQx73PklkX4uHZEEcqQNdgRRafUSYgmoHYBiuJg4AcQsSHJQz/kBQrYCZJHZxmD4Mc7BlIc+e/rkvWpuw==} - '@nrwl/web@19.5.1': resolution: {integrity: sha512-UIf3CN9mYUzsLCvKQlETyYMiMp1sL0GL4yGVQJIMz9RqoND2NLNSM5+vcp7rs/UyD8YuACgs3Ii3C2yyTPH6aQ==} @@ -1061,24 +1070,6 @@ packages: peerDependencies: nx: '>= 17 <= 20' - '@nx/eslint-plugin@19.5.1': - resolution: {integrity: sha512-wLroRSUC2/KJv2+VupBVKQ6A2zfub8CCsThJO4UFJvO+KM/Heuvb9kxpPdDie+tyCQQqJpkgTwpWC7uhpDLAMw==} - peerDependencies: - '@typescript-eslint/parser': ^6.13.2 || ^7.0.0 - eslint-config-prettier: ^9.0.0 - peerDependenciesMeta: - eslint-config-prettier: - optional: true - - '@nx/eslint@19.5.1': - resolution: {integrity: sha512-PlWi2hmado+rSkbHi1a+VM+h1IOxLe9dIhLKC5t6p7Z8cG5QKjsn28okkuytKAq0wiVAyHRO3i/V415QM2lc1g==} - peerDependencies: - '@zkochan/js-yaml': 0.0.7 - eslint: ^8.0.0 || ^9.0.0 - peerDependenciesMeta: - '@zkochan/js-yaml': - optional: true - '@nx/js@19.5.1': resolution: {integrity: sha512-Kp61s0cB3yk3RCyvSprakNL0VmXv7uqfsglqvxUDG6DXof9pj8jhTNn1Gms79DmUR5jxTeT+XNHcpl1y3QhTzg==} peerDependencies: @@ -1087,9 +1078,6 @@ packages: verdaccio: optional: true - '@nx/linter@19.5.1': - resolution: {integrity: sha512-UamWirRf0hmJCpJev1kCdeNPDmsyavuV8r0Ha8t9hPX3dJravjT4IzHL3bJy1ctu8AJrYhJqdTvNKCjqO7Uopw==} - '@nx/nx-darwin-arm64@19.5.1': resolution: {integrity: sha512-mdFSnwf+cEGZQ0HDJIzHBOWmho66VUN44qsDRPVSwpaEqlHSlcbiqKzM0+oVx9CRDLNQoYtYs1Y3hGlnag1sCQ==} engines: {node: '>= 10'} @@ -1150,23 +1138,12 @@ packages: cpu: [x64] os: [win32] - '@nx/vite@19.5.1': - resolution: {integrity: sha512-2Fl2vc81+d603qUSn8/RSDKb7AtyKQV5pODR1HeFmIEgowXSeaZrIIP4s23PDQpu5MbNYxBMniSoyxVJm/Nimw==} - peerDependencies: - vite: ^5.0.0 - vitest: ^1.3.1 - '@nx/web@19.5.1': resolution: {integrity: sha512-9R5KvFpmKlo6NHfswlxz2fBnnjj3Y/RX4o1RPwPDFUa9xPB+Ct1dbOESWSRSa6tJTa2UbyOfmiGdLnYdz0Gi+w==} '@nx/workspace@19.5.1': resolution: {integrity: sha512-I/O+kDxaLzVXITmddijffNzllioe84oGSQ3q8s3nW7RP2/T1LkmOS7Prnd80sEVteQowHe0kOnvAh+p82kAUjQ==} - '@phenomnomnominal/tsquery@5.0.1': - resolution: {integrity: sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==} - peerDependencies: - typescript: ^3 || ^4 || ^5 - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1257,9 +1234,6 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - '@tootallnate/once@1.1.2': resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} engines: {node: '>= 6'} @@ -1282,23 +1256,14 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/eslint@8.56.10': - resolution: {integrity: sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==} - - '@types/eslint__js@8.42.3': - resolution: {integrity: sha512-alfG737uhmPdnvkrLdZLcEKJ/B8s9Y4hrZ+YAdzUeoArBlSUERA2E87ROfOaS4jd/C45fzOoZzidLc1IPwLqOw==} - '@types/estree@1.0.5': resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - '@types/node@20.14.11': - resolution: {integrity: sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA==} + '@types/node@20.14.12': + resolution: {integrity: sha512-r7wNXakLeSsGT0H1AU863vS2wa5wBOK4bWMjZz2wj+8nBx+m5PeIn0k8AloSLpRuiwdRQZwarZqHE4FNArPuJQ==} '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -1310,8 +1275,8 @@ packages: '@types/validator@13.12.0': resolution: {integrity: sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==} - '@typescript-eslint/eslint-plugin@7.16.1': - resolution: {integrity: sha512-SxdPak/5bO0EnGktV05+Hq8oatjAYVY3Zh2bye9pGZy6+jwyR3LG3YKkV4YatlsgqXP28BTeVm9pqwJM96vf2A==} + '@typescript-eslint/eslint-plugin@7.17.0': + resolution: {integrity: sha512-pyiDhEuLM3PuANxH7uNYan1AaFs5XE0zw1hq69JBvGvE7gSuEoQl1ydtEe/XQeoC3GQxLXyOVa5kNOATgM638A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 @@ -1321,8 +1286,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@7.16.1': - resolution: {integrity: sha512-u+1Qx86jfGQ5i4JjK33/FnawZRpsLxRnKzGE6EABZ40KxVT/vWsiZFEBBHjFOljmmV3MBYOHEKi0Jm9hbAOClA==} + '@typescript-eslint/parser@7.17.0': + resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1331,12 +1296,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@7.16.1': - resolution: {integrity: sha512-nYpyv6ALte18gbMz323RM+vpFpTjfNdyakbf3nsLvF43uF9KeNC289SUEW3QLZ1xPtyINJ1dIsZOuWuSRIWygw==} + '@typescript-eslint/scope-manager@7.17.0': + resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@7.16.1': - resolution: {integrity: sha512-rbu/H2MWXN4SkjIIyWcmYBjlp55VT+1G3duFOIukTNFxr9PI35pLc2ydwAfejCEitCv4uztA07q0QWanOHC7dA==} + '@typescript-eslint/type-utils@7.17.0': + resolution: {integrity: sha512-XD3aaBt+orgkM/7Cei0XNEm1vwUxQ958AOLALzPlbPqb8C1G8PZK85tND7Jpe69Wualri81PLU+Zc48GVKIMMA==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -1345,12 +1310,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@7.16.1': - resolution: {integrity: sha512-AQn9XqCzUXd4bAVEsAXM/Izk11Wx2u4H3BAfQVhSfzfDOm/wAON9nP7J5rpkCxts7E5TELmN845xTUCQrD1xIQ==} + '@typescript-eslint/types@7.17.0': + resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@7.16.1': - resolution: {integrity: sha512-0vFPk8tMjj6apaAZ1HlwM8w7jbghC8jc1aRNJG5vN8Ym5miyhTQGMqU++kuBFDNKe9NcPeZ6x0zfSzV8xC1UlQ==} + '@typescript-eslint/typescript-estree@7.17.0': + resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' @@ -1358,43 +1323,46 @@ packages: typescript: optional: true - '@typescript-eslint/utils@7.16.1': - resolution: {integrity: sha512-WrFM8nzCowV0he0RlkotGDujx78xudsxnGMBHI88l5J8wEhED6yBwaSLP99ygfrzAjsQvcYQ94quDwI0d7E1fA==} + '@typescript-eslint/utils@7.17.0': + resolution: {integrity: sha512-r+JFlm5NdB+JXc7aWWZ3fKSm1gn0pkswEwIYsrGPdsT2GjsRATAKXiNtp3vgAAO1xZhX8alIOEQnNMl3kbTgJw==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@7.16.1': - resolution: {integrity: sha512-Qlzzx4sE4u3FsHTPQAAQFJFNOuqtuY0LFrZHwQ8IHK705XxBiWOFkfKRWu6niB7hwfgnwIpO4jTC75ozW1PHWg==} + '@typescript-eslint/visitor-keys@7.17.0': + resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} engines: {node: ^18.18.0 || >=20.0.0} '@ungap/structured-clone@1.2.0': resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - '@vitest/coverage-v8@2.0.3': - resolution: {integrity: sha512-53d+6jXFdYbasXBmsL6qaGIfcY5eBQq0sP57AjdasOcSiGNj4qxkkpDKIitUNfjxcfAfUfQ8BD0OR2fSey64+g==} + '@vitest/coverage-v8@2.0.4': + resolution: {integrity: sha512-i4lx/Wpg5zF1h2op7j0wdwuEQxaL/YTwwQaKuKMHYj7MMh8c7I4W7PNfOptZBCSBZI0z1qwn64o0pM/pA8Tz1g==} peerDependencies: - vitest: 2.0.3 + vitest: 2.0.4 - '@vitest/expect@1.6.0': - resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + '@vitest/expect@2.0.4': + resolution: {integrity: sha512-39jr5EguIoanChvBqe34I8m1hJFI4+jxvdOpD7gslZrVQBKhh8H9eD7J/LJX4zakrw23W+dITQTDqdt43xVcJw==} - '@vitest/runner@1.6.0': - resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + '@vitest/pretty-format@2.0.4': + resolution: {integrity: sha512-RYZl31STbNGqf4l2eQM1nvKPXE0NhC6Eq0suTTePc4mtMQ1Fn8qZmjV4emZdEdG2NOWGKSCrHZjmTqDCDoeFBw==} - '@vitest/snapshot@1.6.0': - resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + '@vitest/runner@2.0.4': + resolution: {integrity: sha512-Gk+9Su/2H2zNfNdeJR124gZckd5st4YoSuhF1Rebi37qTXKnqYyFCd9KP4vl2cQHbtuVKjfEKrNJxHHCW8thbQ==} - '@vitest/spy@1.6.0': - resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + '@vitest/snapshot@2.0.4': + resolution: {integrity: sha512-or6Mzoz/pD7xTvuJMFYEtso1vJo1S5u6zBTinfl+7smGUhqybn6VjzCDMhmTyVOFWwkCMuNjmNNxnyXPgKDoPw==} - '@vitest/ui@1.6.0': - resolution: {integrity: sha512-k3Lyo+ONLOgylctiGovRKy7V4+dIN2yxstX3eY5cWFXH6WP+ooVX79YSyi0GagdTQzLmT43BF27T0s6dOIPBXA==} + '@vitest/spy@2.0.4': + resolution: {integrity: sha512-uTXU56TNoYrTohb+6CseP8IqNwlNdtPwEO0AWl+5j7NelS6x0xZZtP0bDWaLvOfUbaYwhhWp1guzXUxkC7mW7Q==} + + '@vitest/ui@2.0.4': + resolution: {integrity: sha512-9SNE9ve3kgDkVTxJsY7BjqSwyqDVRJbq/AHVHZs+V0vmr/0cCX6yGT6nOahSXEsXFtKAsvRtBXKlTgr+5njzZQ==} peerDependencies: - vitest: 1.6.0 + vitest: 2.0.4 - '@vitest/utils@1.6.0': - resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + '@vitest/utils@2.0.4': + resolution: {integrity: sha512-Zc75QuuoJhOBnlo99ZVUkJIuq4Oj0zAkrQ2VzCqNCx6wAwViHEh5Fnp4fiJTE9rA+sAoXRf00Z9xGgfEzV6fzQ==} '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} @@ -1496,8 +1464,9 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} async@2.6.4: resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==} @@ -1606,9 +1575,9 @@ packages: caniuse-lite@1.0.30001643: resolution: {integrity: sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==} - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} + chai@5.1.1: + resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + engines: {node: '>=12'} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -1618,8 +1587,9 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + check-error@2.1.1: + resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} + engines: {node: '>= 16'} chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} @@ -1676,12 +1646,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} - - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} - console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} @@ -1727,8 +1691,8 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - deep-eql@4.1.4: - resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + deep-eql@5.0.2: + resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} deep-extend@0.6.0: @@ -1803,8 +1767,8 @@ packages: engines: {node: '>=0.10.0'} hasBin: true - electron-to-chromium@1.4.832: - resolution: {integrity: sha512-cTen3SB0H2SGU7x467NRe1eVcQgcuS6jckKfWJHia2eo0cHIGOqHoAxevIYZD4eRHcWjkvFzo93bi3vJ9W+1lA==} + electron-to-chromium@1.5.1: + resolution: {integrity: sha512-FKbOCOQ5QRB3VlIbl1LZQefWIYwszlBloaXcY2rbfpu9ioJnNh3TK03YtIDKDo3WKBi8u+YV4+Fn2CkEozgf4w==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1845,6 +1809,10 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.8.57: + resolution: {integrity: sha512-j02SFrUwFTRUqiY0Kjplwjm1psuzO1d6AjaXKuOR9hrY0HuPsT6sV42B6myW34h1q4CRy+Y3g4RU/cGJeI/nNA==} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -2284,9 +2252,6 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-tokens@9.0.0: - resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -2324,10 +2289,6 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-eslint-parser@2.4.0: - resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - jsonc-parser@3.2.0: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} @@ -2348,10 +2309,6 @@ packages: resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} - locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2369,8 +2326,8 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + loupe@3.1.1: + resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} @@ -2501,9 +2458,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} - moment-timezone@0.5.45: resolution: {integrity: sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==} @@ -2517,6 +2471,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2547,8 +2504,8 @@ packages: node-machine-id@1.1.12: resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} - node-releases@2.0.17: - resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==} + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} @@ -2623,10 +2580,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@5.0.0: - resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} - engines: {node: '>=18'} - p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -2676,8 +2629,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + pathval@2.0.0: + resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + engines: {node: '>= 14.16'} pg-connection-string@2.6.4: resolution: {integrity: sha512-v+Z7W/0EO707aNMaAEfiGnGL9sxxumwLl2fJvCQtMn9Fxsg+lPpPkdcyBSv/KFgpGdYkMfn+EI1Or2EHjpgLCA==} @@ -2699,15 +2653,12 @@ packages: resolution: {integrity: sha512-afSfrq/hUiW/MFmQcLEwV9Zh8Ry6MrMTOyBU53o/fc0gEl+1OZ/Fks/xQCM2nOC0C/OfDtQMnT2d8c3kpcfSzA==} hasBin: true - pkg-types@1.1.3: - resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} - portfinder@1.0.32: resolution: {integrity: sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg==} engines: {node: '>= 0.12.0'} - postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} + postcss@8.4.40: + resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.2: @@ -2841,6 +2792,11 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rollup@2.79.1: + resolution: {integrity: sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==} + engines: {node: '>=10.0.0'} + hasBin: true + rollup@4.19.0: resolution: {integrity: sha512-5r7EYSQIowHsK4eTZ0Y81qpZuJz+MUuYeqmmYmRMl1nwhdmbiYqt5jwzf6u7wyOzJgYqtCRMtVRKOtHANBz7rA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3038,9 +2994,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - strip-literal@2.1.0: - resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} - strong-log-transformer@2.1.0: resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} engines: {node: '>=4'} @@ -3085,16 +3038,16 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinypool@0.8.4: - resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} - engines: {node: '>=14.0.0'} + tinypool@1.0.0: + resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@1.2.0: resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} engines: {node: '>=14.0.0'} - tinyspy@2.2.1: - resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + tinyspy@3.0.0: + resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} engines: {node: '>=14.0.0'} tmp@0.2.3: @@ -3164,16 +3117,12 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typescript-eslint@7.16.1: - resolution: {integrity: sha512-889oE5qELj65q/tGeOSvlreNKhimitFwZqQ0o7PcWC7/lgRkAMknznsCsV8J8mZGTP/Z+cIbX8accf2DE33hrA==} + typescript-eslint@7.17.0: + resolution: {integrity: sha512-spQxsQvPguduCUfyUvLItvKqK3l8KJ/kqs5Pb/URtzQ5AC53Z6us32St37rpmlt2uESG23lOFpV4UErrmy4dZQ==} engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 @@ -3182,19 +3131,11 @@ packages: typescript: optional: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -3258,13 +3199,18 @@ packages: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} - vite-node@1.6.0: - resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + vite-node@2.0.4: + resolution: {integrity: sha512-ZpJVkxcakYtig5iakNeL7N3trufe3M6vGuzYAr4GsbCTwobDeyPJpE4cjDhhPluv8OvQCFzu2LWp6GkoKRITXA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true - vite@5.3.4: - resolution: {integrity: sha512-Cw+7zL3ZG9/NZBB8C+8QbQZmR54GwqIz+WMI4b3JgdYJvX+ny9AjJXqkGQlDXSXRP9rP0B4tbciRMOVEKulVOA==} + vite@2.0.4: + resolution: {integrity: sha512-+PP89D7AKXFE4gps8c5+4eP5yXTh5qCogjdYX7iSsIxbLZAa26JoGSq6OLk0qdb/fqDh7gtJqGiLbG2V6NvkKQ==} + engines: {node: '>=12.0.0'} + hasBin: true + + vite@5.3.5: + resolution: {integrity: sha512-MdjglKR6AQXQb9JGiS7Rc2wC6uMjcm7Go/NHNO63EwiJXfuk9PgqiP/n5IDJCziMkfw9n4Ubp7lttNwz+8ZVKA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -3291,15 +3237,15 @@ packages: terser: optional: true - vitest@1.6.0: - resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + vitest@2.0.4: + resolution: {integrity: sha512-luNLDpfsnxw5QSW4bISPe6tkxVvv5wn2BBs/PuDRkhXZ319doZyLOBr1sjfB5yCEpTiU7xCAdViM8TNVGPwoog==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.6.0 - '@vitest/ui': 1.6.0 + '@vitest/browser': 2.0.4 + '@vitest/ui': 2.0.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3384,10 +3330,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} - snapshots: '@ampproject/remapping@2.3.0': @@ -4421,42 +4363,9 @@ snapshots: transitivePeerDependencies: - nx - '@nrwl/eslint-plugin-nx@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(nx@19.5.1)(typescript@5.5.4)': + '@nrwl/js@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4)': dependencies: - '@nx/eslint-plugin': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(nx@19.5.1)(typescript@5.5.4) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - '@typescript-eslint/parser' - - debug - - eslint - - eslint-config-prettier - - nx - - supports-color - - typescript - - verdaccio - - '@nrwl/js@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.4.5)': - dependencies: - '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.4.5) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - nx - - supports-color - - typescript - - verdaccio - - '@nrwl/js@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)': - dependencies: - '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) + '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -4478,26 +4387,9 @@ snapshots: - '@swc/core' - debug - '@nrwl/vite@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)(vite@5.3.4(@types/node@20.14.11))(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0))': - dependencies: - '@nx/vite': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)(vite@5.3.4(@types/node@20.14.11))(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0)) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - nx - - supports-color - - typescript - - verdaccio - - vite - - vitest - - '@nrwl/web@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)': + '@nrwl/web@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4)': dependencies: - '@nx/web': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) + '@nx/web': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4) transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -4531,55 +4423,7 @@ snapshots: tslib: 2.6.3 yargs-parser: 21.1.1 - '@nx/eslint-plugin@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(nx@19.5.1)(typescript@5.5.4)': - dependencies: - '@nrwl/eslint-plugin-nx': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(nx@19.5.1)(typescript@5.5.4) - '@nx/devkit': 19.5.1(nx@19.5.1) - '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) - '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - chalk: 4.1.2 - confusing-browser-globals: 1.0.11 - jsonc-eslint-parser: 2.4.0 - semver: 7.6.3 - tslib: 2.6.3 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - eslint - - nx - - supports-color - - typescript - - verdaccio - - '@nx/eslint@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@19.5.1)': - dependencies: - '@nx/devkit': 19.5.1(nx@19.5.1) - '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.4.5) - '@nx/linter': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@19.5.1) - eslint: 8.57.0 - semver: 7.6.3 - tslib: 2.6.3 - typescript: 5.4.5 - optionalDependencies: - '@zkochan/js-yaml': 0.0.7 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - nx - - supports-color - - verdaccio - - '@nx/js@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.4.5)': + '@nx/js@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4)': dependencies: '@babel/core': 7.24.9 '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.24.9) @@ -4588,7 +4432,7 @@ snapshots: '@babel/preset-env': 7.24.8(@babel/core@7.24.9) '@babel/preset-typescript': 7.24.7(@babel/core@7.24.9) '@babel/runtime': 7.24.8 - '@nrwl/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.4.5) + '@nrwl/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4) '@nx/devkit': 19.5.1(nx@19.5.1) '@nx/workspace': 19.5.1 babel-plugin-const-enum: 1.2.0(@babel/core@7.24.9) @@ -4607,7 +4451,7 @@ snapshots: ora: 5.3.0 semver: 7.6.3 source-map-support: 0.5.19 - ts-node: 10.9.1(@types/node@20.14.11)(typescript@5.4.5) + ts-node: 10.9.1(@types/node@20.14.12)(typescript@5.5.4) tsconfig-paths: 4.2.0 tslib: 2.6.3 transitivePeerDependencies: @@ -4621,64 +4465,6 @@ snapshots: - supports-color - typescript - '@nx/js@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)': - dependencies: - '@babel/core': 7.24.9 - '@babel/plugin-proposal-decorators': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-runtime': 7.24.7(@babel/core@7.24.9) - '@babel/preset-env': 7.24.8(@babel/core@7.24.9) - '@babel/preset-typescript': 7.24.7(@babel/core@7.24.9) - '@babel/runtime': 7.24.8 - '@nrwl/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) - '@nx/devkit': 19.5.1(nx@19.5.1) - '@nx/workspace': 19.5.1 - babel-plugin-const-enum: 1.2.0(@babel/core@7.24.9) - babel-plugin-macros: 2.8.0 - babel-plugin-transform-typescript-metadata: 0.3.2(@babel/core@7.24.9)(@babel/traverse@7.24.8) - chalk: 4.1.2 - columnify: 1.6.0 - detect-port: 1.6.1 - fast-glob: 3.2.7 - fs-extra: 11.2.0 - ignore: 5.3.1 - js-tokens: 4.0.0 - minimatch: 9.0.3 - npm-package-arg: 11.0.1 - npm-run-path: 4.0.1 - ora: 5.3.0 - semver: 7.6.3 - source-map-support: 0.5.19 - ts-node: 10.9.1(@types/node@20.14.11)(typescript@5.5.4) - tsconfig-paths: 4.2.0 - tslib: 2.6.3 - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - nx - - supports-color - - typescript - - '@nx/linter@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@19.5.1)': - dependencies: - '@nx/eslint': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(@zkochan/js-yaml@0.0.7)(eslint@8.57.0)(nx@19.5.1) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - '@zkochan/js-yaml' - - debug - - eslint - - nx - - supports-color - - verdaccio - '@nx/nx-darwin-arm64@19.5.1': optional: true @@ -4709,34 +4495,11 @@ snapshots: '@nx/nx-win32-x64-msvc@19.5.1': optional: true - '@nx/vite@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)(vite@5.3.4(@types/node@20.14.11))(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0))': - dependencies: - '@nrwl/vite': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)(vite@5.3.4(@types/node@20.14.11))(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0)) - '@nx/devkit': 19.5.1(nx@19.5.1) - '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) - '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.4) - '@swc/helpers': 0.5.12 - enquirer: 2.3.6 - tsconfig-paths: 4.2.0 - vite: 5.3.4(@types/node@20.14.11) - vitest: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) - transitivePeerDependencies: - - '@babel/traverse' - - '@swc-node/register' - - '@swc/core' - - '@swc/wasm' - - '@types/node' - - debug - - nx - - supports-color - - typescript - - verdaccio - - '@nx/web@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4)': + '@nx/web@19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4)': dependencies: - '@nrwl/web': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) + '@nrwl/web': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4) '@nx/devkit': 19.5.1(nx@19.5.1) - '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.11)(nx@19.5.1)(typescript@5.5.4) + '@nx/js': 19.5.1(@babel/traverse@7.24.8)(@types/node@20.14.12)(nx@19.5.1)(typescript@5.5.4) chalk: 4.1.2 detect-port: 1.6.1 http-server: 14.1.1 @@ -4767,11 +4530,6 @@ snapshots: - '@swc/core' - debug - '@phenomnomnominal/tsquery@5.0.1(typescript@5.5.4)': - dependencies: - esquery: 1.6.0 - typescript: 5.5.4 - '@pkgjs/parseargs@0.11.0': optional: true @@ -4827,10 +4585,6 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.3 - '@tootallnate/once@1.1.2': optional: true @@ -4850,22 +4604,11 @@ snapshots: dependencies: '@types/ms': 0.7.34 - '@types/eslint@8.56.10': - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - - '@types/eslint__js@8.42.3': - dependencies: - '@types/eslint': 8.56.10 - '@types/estree@1.0.5': {} - '@types/json-schema@7.0.15': {} - '@types/ms@0.7.34': {} - '@types/node@20.14.11': + '@types/node@20.14.12': dependencies: undici-types: 5.26.5 @@ -4877,14 +4620,14 @@ snapshots: '@types/validator@13.12.0': {} - '@typescript-eslint/eslint-plugin@7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/eslint-plugin@7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/type-utils': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/parser': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.17.0 + '@typescript-eslint/type-utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.17.0 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.3.1 @@ -4895,12 +4638,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.4) - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/scope-manager': 7.17.0 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 7.17.0 debug: 4.3.5 eslint: 8.57.0 optionalDependencies: @@ -4908,15 +4651,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.16.1': + '@typescript-eslint/scope-manager@7.17.0': dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/visitor-keys': 7.17.0 - '@typescript-eslint/type-utils@7.16.1(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/type-utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.4) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) + '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) debug: 4.3.5 eslint: 8.57.0 ts-api-utils: 1.3.0(typescript@5.5.4) @@ -4925,12 +4668,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.16.1': {} + '@typescript-eslint/types@7.17.0': {} - '@typescript-eslint/typescript-estree@7.16.1(typescript@5.5.4)': + '@typescript-eslint/typescript-estree@7.17.0(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/visitor-keys': 7.16.1 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/visitor-keys': 7.17.0 debug: 4.3.5 globby: 11.1.0 is-glob: 4.0.3 @@ -4942,25 +4685,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.16.1(eslint@8.57.0)(typescript@5.5.4)': + '@typescript-eslint/utils@7.17.0(eslint@8.57.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@typescript-eslint/scope-manager': 7.16.1 - '@typescript-eslint/types': 7.16.1 - '@typescript-eslint/typescript-estree': 7.16.1(typescript@5.5.4) + '@typescript-eslint/scope-manager': 7.17.0 + '@typescript-eslint/types': 7.17.0 + '@typescript-eslint/typescript-estree': 7.17.0(typescript@5.5.4) eslint: 8.57.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@7.16.1': + '@typescript-eslint/visitor-keys@7.17.0': dependencies: - '@typescript-eslint/types': 7.16.1 + '@typescript-eslint/types': 7.17.0 eslint-visitor-keys: 3.4.3 '@ungap/structured-clone@1.2.0': {} - '@vitest/coverage-v8@2.0.3(vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0))': + '@vitest/coverage-v8@2.0.4(vitest@2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 @@ -4972,52 +4715,55 @@ snapshots: magic-string: 0.30.10 magicast: 0.3.4 std-env: 3.7.0 - strip-literal: 2.1.0 test-exclude: 7.0.1 tinyrainbow: 1.2.0 - vitest: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) + vitest: 2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4) transitivePeerDependencies: - supports-color - '@vitest/expect@1.6.0': + '@vitest/expect@2.0.4': + dependencies: + '@vitest/spy': 2.0.4 + '@vitest/utils': 2.0.4 + chai: 5.1.1 + tinyrainbow: 1.2.0 + + '@vitest/pretty-format@2.0.4': dependencies: - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - chai: 4.4.1 + tinyrainbow: 1.2.0 - '@vitest/runner@1.6.0': + '@vitest/runner@2.0.4': dependencies: - '@vitest/utils': 1.6.0 - p-limit: 5.0.0 + '@vitest/utils': 2.0.4 pathe: 1.1.2 - '@vitest/snapshot@1.6.0': + '@vitest/snapshot@2.0.4': dependencies: + '@vitest/pretty-format': 2.0.4 magic-string: 0.30.10 pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/spy@1.6.0': + '@vitest/spy@2.0.4': dependencies: - tinyspy: 2.2.1 + tinyspy: 3.0.0 - '@vitest/ui@1.6.0(vitest@1.6.0)': + '@vitest/ui@2.0.4(vitest@2.0.4)': dependencies: - '@vitest/utils': 1.6.0 + '@vitest/utils': 2.0.4 fast-glob: 3.3.2 fflate: 0.8.2 flatted: 3.3.1 pathe: 1.1.2 - picocolors: 1.0.1 sirv: 2.0.4 - vitest: 1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0) + tinyrainbow: 1.2.0 + vitest: 2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4) - '@vitest/utils@1.6.0': + '@vitest/utils@2.0.4': dependencies: - diff-sequences: 29.6.3 + '@vitest/pretty-format': 2.0.4 estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 + loupe: 3.1.1 + tinyrainbow: 1.2.0 '@yarnpkg/lockfile@1.1.0': {} @@ -5111,7 +4857,7 @@ snapshots: array-union@2.1.0: {} - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} async@2.6.4: dependencies: @@ -5211,8 +4957,8 @@ snapshots: browserslist@4.23.2: dependencies: caniuse-lite: 1.0.30001643 - electron-to-chromium: 1.4.832 - node-releases: 2.0.17 + electron-to-chromium: 1.5.1 + node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.2) buffer-from@1.1.2: {} @@ -5265,15 +5011,13 @@ snapshots: caniuse-lite@1.0.30001643: {} - chai@4.4.1: + chai@5.1.1: dependencies: - assertion-error: 1.1.0 - check-error: 1.0.3 - deep-eql: 4.1.4 - get-func-name: 2.0.2 - loupe: 2.3.7 - pathval: 1.1.1 - type-detect: 4.0.8 + assertion-error: 2.0.1 + check-error: 2.1.1 + deep-eql: 5.0.2 + loupe: 3.1.1 + pathval: 2.0.0 chalk@2.4.2: dependencies: @@ -5286,9 +5030,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 + check-error@2.1.1: {} chownr@1.1.4: {} @@ -5337,10 +5079,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.7: {} - - confusing-browser-globals@1.0.11: {} - console-control-strings@1.1.0: optional: true @@ -5370,7 +5108,7 @@ snapshots: debug@3.2.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 debug@4.3.5: dependencies: @@ -5380,9 +5118,7 @@ snapshots: dependencies: mimic-response: 3.1.0 - deep-eql@4.1.4: - dependencies: - type-detect: 4.0.8 + deep-eql@5.0.2: {} deep-extend@0.6.0: {} @@ -5442,7 +5178,7 @@ snapshots: dependencies: jake: 10.9.2 - electron-to-chromium@1.4.832: {} + electron-to-chromium@1.5.1: {} emoji-regex@8.0.0: {} @@ -5503,6 +5239,8 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 + esbuild@0.8.57: {} + escalade@3.1.2: {} escape-string-regexp@1.0.5: {} @@ -5863,7 +5601,7 @@ snapshots: humanize-ms@1.2.1: dependencies: - ms: 2.1.2 + ms: 2.1.3 optional: true iconv-lite@0.6.3: @@ -5984,8 +5722,6 @@ snapshots: js-tokens@4.0.0: {} - js-tokens@9.0.0: {} - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -6012,13 +5748,6 @@ snapshots: json5@2.2.3: {} - jsonc-eslint-parser@2.4.0: - dependencies: - acorn: 8.12.1 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - semver: 7.6.3 - jsonc-parser@3.2.0: {} jsonfile@6.1.0: @@ -6040,11 +5769,6 @@ snapshots: lines-and-columns@2.0.4: {} - local-pkg@0.5.0: - dependencies: - mlly: 1.7.1 - pkg-types: 1.1.3 - locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -6060,7 +5784,7 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loupe@2.3.7: + loupe@3.1.1: dependencies: get-func-name: 2.0.2 @@ -6205,13 +5929,6 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.7.1: - dependencies: - acorn: 8.12.1 - pathe: 1.1.2 - pkg-types: 1.1.3 - ufo: 1.5.4 - moment-timezone@0.5.45: dependencies: moment: 2.30.1 @@ -6222,6 +5939,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + nanoid@3.3.7: {} napi-build-utils@1.0.2: {} @@ -6256,7 +5975,7 @@ snapshots: node-machine-id@1.1.12: {} - node-releases@2.0.17: {} + node-releases@2.0.18: {} nopt@5.0.0: dependencies: @@ -6385,10 +6104,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@5.0.0: - dependencies: - yocto-queue: 1.1.1 - p-locate@5.0.0: dependencies: p-limit: 3.1.0 @@ -6430,7 +6145,7 @@ snapshots: pathe@1.1.2: {} - pathval@1.1.1: {} + pathval@2.0.0: {} pg-connection-string@2.6.4: {} @@ -6459,12 +6174,6 @@ snapshots: sonic-boom: 4.0.1 thread-stream: 3.1.0 - pkg-types@1.1.3: - dependencies: - confbox: 0.1.7 - mlly: 1.7.1 - pathe: 1.1.2 - portfinder@1.0.32: dependencies: async: 2.6.4 @@ -6473,7 +6182,7 @@ snapshots: transitivePeerDependencies: - supports-color - postcss@8.4.39: + postcss@8.4.40: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -6612,6 +6321,10 @@ snapshots: dependencies: glob: 7.2.3 + rollup@2.79.1: + optionalDependencies: + fsevents: 2.3.3 + rollup@4.19.0: dependencies: '@types/estree': 1.0.5 @@ -6815,10 +6528,6 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@2.1.0: - dependencies: - js-tokens: 9.0.0 - strong-log-transformer@2.1.0: dependencies: duplexer: 0.1.2 @@ -6875,11 +6584,11 @@ snapshots: tinybench@2.8.0: {} - tinypool@0.8.4: {} + tinypool@1.0.0: {} tinyrainbow@1.2.0: {} - tinyspy@2.2.1: {} + tinyspy@3.0.0: {} tmp@0.2.3: {} @@ -6897,32 +6606,14 @@ snapshots: dependencies: typescript: 5.5.4 - ts-node@10.9.1(@types/node@20.14.11)(typescript@5.4.5): + ts-node@10.9.1(@types/node@20.14.12)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.11 - acorn: 8.12.1 - acorn-walk: 8.3.3 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.4.5 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - - ts-node@10.9.1(@types/node@20.14.11)(typescript@5.5.4): - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.11 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.11 + '@types/node': 20.14.12 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -6933,14 +6624,14 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-node@10.9.2(@types/node@20.14.11)(typescript@5.5.4): + ts-node@10.9.2(@types/node@20.14.12)(typescript@5.5.4): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.14.11 + '@types/node': 20.14.12 acorn: 8.12.1 acorn-walk: 8.3.3 arg: 4.1.3 @@ -6967,27 +6658,21 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-detect@4.0.8: {} - type-fest@0.20.2: {} - typescript-eslint@7.16.1(eslint@8.57.0)(typescript@5.5.4): + typescript-eslint@7.17.0(eslint@8.57.0)(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 7.16.1(@typescript-eslint/parser@7.16.1(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/parser': 7.16.1(eslint@8.57.0)(typescript@5.5.4) - '@typescript-eslint/utils': 7.16.1(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/eslint-plugin': 7.17.0(@typescript-eslint/parser@7.17.0(eslint@8.57.0)(typescript@5.5.4))(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/parser': 7.17.0(eslint@8.57.0)(typescript@5.5.4) + '@typescript-eslint/utils': 7.17.0(eslint@8.57.0)(typescript@5.5.4) eslint: 8.57.0 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - supports-color - typescript@5.4.5: {} - typescript@5.5.4: {} - ufo@1.5.4: {} - undici-types@5.26.5: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -7039,13 +6724,13 @@ snapshots: validator@13.12.0: {} - vite-node@1.6.0(@types/node@20.14.11): + vite-node@2.0.4(@types/node@20.14.12): dependencies: cac: 6.7.14 debug: 4.3.5 pathe: 1.1.2 - picocolors: 1.0.1 - vite: 5.3.4(@types/node@20.14.11) + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@20.14.12) transitivePeerDependencies: - '@types/node' - less @@ -7056,40 +6741,48 @@ snapshots: - supports-color - terser - vite@5.3.4(@types/node@20.14.11): + vite@2.0.4: + dependencies: + esbuild: 0.8.57 + postcss: 8.4.40 + resolve: 1.22.8 + rollup: 2.79.1 + optionalDependencies: + fsevents: 2.3.3 + + vite@5.3.5(@types/node@20.14.12): dependencies: esbuild: 0.21.5 - postcss: 8.4.39 + postcss: 8.4.40 rollup: 4.19.0 optionalDependencies: - '@types/node': 20.14.11 + '@types/node': 20.14.12 fsevents: 2.3.3 - vitest@1.6.0(@types/node@20.14.11)(@vitest/ui@1.6.0): + vitest@2.0.4(@types/node@20.14.12)(@vitest/ui@2.0.4): dependencies: - '@vitest/expect': 1.6.0 - '@vitest/runner': 1.6.0 - '@vitest/snapshot': 1.6.0 - '@vitest/spy': 1.6.0 - '@vitest/utils': 1.6.0 - acorn-walk: 8.3.3 - chai: 4.4.1 + '@ampproject/remapping': 2.3.0 + '@vitest/expect': 2.0.4 + '@vitest/pretty-format': 2.0.4 + '@vitest/runner': 2.0.4 + '@vitest/snapshot': 2.0.4 + '@vitest/spy': 2.0.4 + '@vitest/utils': 2.0.4 + chai: 5.1.1 debug: 4.3.5 execa: 8.0.1 - local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 - picocolors: 1.0.1 std-env: 3.7.0 - strip-literal: 2.1.0 tinybench: 2.8.0 - tinypool: 0.8.4 - vite: 5.3.4(@types/node@20.14.11) - vite-node: 1.6.0(@types/node@20.14.11) + tinypool: 1.0.0 + tinyrainbow: 1.2.0 + vite: 5.3.5(@types/node@20.14.12) + vite-node: 2.0.4(@types/node@20.14.12) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 20.14.11 - '@vitest/ui': 1.6.0(vitest@1.6.0) + '@types/node': 20.14.12 + '@vitest/ui': 2.0.4(vitest@2.0.4) transitivePeerDependencies: - less - lightningcss @@ -7123,7 +6816,7 @@ snapshots: wkx@0.5.0: dependencies: - '@types/node': 20.14.11 + '@types/node': 20.14.12 word-wrap@1.2.5: {} @@ -7164,5 +6857,3 @@ snapshots: yn@3.1.1: {} yocto-queue@0.1.0: {} - - yocto-queue@1.1.1: {} diff --git a/scripts/inject-token.sh b/scripts/inject-token.sh new file mode 100755 index 0000000..702c1b4 --- /dev/null +++ b/scripts/inject-token.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +# Ensure the environment variable is set +if [ -z "$NX_CLOUD_AUTH_TOKEN" ]; then + echo "Error: NX_CLOUD_AUTH_TOKEN is not set." + exit 1 +fi + +# Replace the placeholder in nx.json with the environment variable value +sed -i 's/__NX_CLOUD_AUTH_TOKEN__/'"$NX_CLOUD_AUTH_TOKEN"'/g' nx.json + +echo "Token has been securely injected into nx.json." \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 5ba8969..05fa097 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,14 +9,19 @@ "strictNullChecks": true, "noImplicitThis": true, "module": "NodeNext", + "lib": ["ESNext"], "verbatimModuleSyntax": true, "declaration": true, - + "skipLibCheck": true, "sourceMap": true, "declarationMap": true, "strict": true, "moduleResolution": "NodeNext" }, "files": [], - "references": [{ "path": "./apps/server" }] + "references": [ + { "path": "./apps/server" }, + { "path": "./libs/util" }, + { "path": "./libs/web" } + ] }