diff --git a/.gitignore b/.gitignore index c4452981fd..a50f743e1b 100644 --- a/.gitignore +++ b/.gitignore @@ -107,4 +107,7 @@ docs/docs/reference/solidstart docs/docs/reference/adapter ## Drizzle migration folder -.drizzle \ No newline at end of file +.drizzle + +## Test files +!vitest.config.js \ No newline at end of file diff --git a/packages/core/package.json b/packages/core/package.json index daf39774cf..1a219a2d13 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -30,7 +30,8 @@ "*.d.ts*", "lib", "providers", - "src" + "src", + "!vitest.config.js" ], "exports": { ".": { @@ -81,6 +82,7 @@ "clean": "rm -rf *.js *.d.ts* lib providers", "css": "node scripts/generate-css", "dev": "pnpm css && pnpm providers && tsc -w", + "test": "vitest", "providers": "node scripts/generate-providers" }, "devDependencies": { @@ -90,6 +92,8 @@ "@types/react": "18.0.37", "autoprefixer": "10.4.13", "postcss": "8.4.19", - "postcss-nested": "6.0.0" + "postcss-nested": "6.0.0", + "vite": "^5.0.2", + "vitest": "^0.25.3" } -} \ No newline at end of file +} diff --git a/packages/core/test/constants.ts b/packages/core/test/constants.ts new file mode 100644 index 0000000000..9b38991fae --- /dev/null +++ b/packages/core/test/constants.ts @@ -0,0 +1,9 @@ +export const BASE_URL = "https://next-auth-example.com" +export const AUTH_URL = `${BASE_URL}/api/auth` +export const AUTH_SECRET = "secret" + +const makeAuthAction = (action: string) => `${AUTH_URL}/${action}` + +export const SESSION_ACTION = makeAuthAction("session") +export const SESSION_COOKIE_NAME = "__Secure-authjs.session-token" +export const CSRF_COOKIE_NAME = "__Host-authjs.csrf-token" diff --git a/packages/core/test/index.test.ts b/packages/core/test/index.test.ts new file mode 100644 index 0000000000..4ab96d070d --- /dev/null +++ b/packages/core/test/index.test.ts @@ -0,0 +1,194 @@ +import { describe, expect, it, vi } from "vitest" +import { Auth, AuthConfig } from "../src/index.js" +import GitHub from "../src/providers/github.js" +import { + AUTH_SECRET, + SESSION_ACTION, + SESSION_COOKIE_NAME, +} from "./constants.js" +import { decode, encode } from "../src/jwt.js" +import { parse } from "cookie" +import { defaultCallbacks } from "../src/lib/init.js" +import { Adapter, AdapterSession } from "../src/adapters.js" +import { randomString } from "../src/lib/utils/web.js" + +const authConfig: AuthConfig = { + providers: [GitHub], + trustHost: true, + secret: AUTH_SECRET, +} + +describe("JWT session", () => { + it("should return a valid JWT session response", async () => { + const authEvents: AuthConfig["events"] = { + session: () => {}, + } + vi.spyOn(authEvents, "session") + authConfig.events = authEvents + + vi.spyOn(defaultCallbacks, "jwt") + vi.spyOn(defaultCallbacks, "session") + + const expectedSession = { + name: "test", + email: "test@test.com", + picture: "https://test.com/test.png", + } + const expectedSessionInBody = { + name: "test", + email: "test@test.com", + image: "https://test.com/test.png", + } + const encoded = await encode({ + salt: SESSION_COOKIE_NAME, + secret: AUTH_SECRET, + token: expectedSession, + }) + const request = new Request(SESSION_ACTION, { + headers: { + cookie: `${SESSION_COOKIE_NAME}=${encoded}`, + }, + }) + const response = (await Auth(request, authConfig)) as Response + const bodySession = await response.json() + + let cookies = response.headers + .getSetCookie() + .reduce>((acc, cookie) => { + return { ...acc, ...parse(cookie) } + }, {}) + const sessionToken = cookies[SESSION_COOKIE_NAME] + const decoded = await decode<{ + // TODO: This shouldn't be necessary? + exp: number + iat: number + jti: string + }>({ + salt: SESSION_COOKIE_NAME, + secret: AUTH_SECRET, + token: sessionToken, + }) + + const { exp, iat, jti, ...actualSession } = decoded || {} + + expect(actualSession).toEqual(expectedSession) + expect(bodySession.user).toEqual(expectedSessionInBody) + expect(bodySession.expires).toBeDefined() + expect(authConfig.events?.session).toHaveBeenCalledOnce() + expect(defaultCallbacks.jwt).toHaveBeenCalledOnce() + expect(defaultCallbacks.session).toHaveBeenCalledOnce() + }) + it("should return null if no JWT session in the requests cookies", async () => { + const request = new Request(SESSION_ACTION) + const response = (await Auth(request, authConfig)) as Response + const actual = await response.json() + expect(actual).toEqual(null) + }) + it("should return null if JWT session is invalid", async () => { + const request = new Request(SESSION_ACTION, { + headers: { + cookie: `${SESSION_COOKIE_NAME}=invalid`, + }, + }) + const response = (await Auth(request, authConfig)) as Response + const actual = await response.json() + expect(actual).toEqual(null) + }) +}) + +describe("Database session", () => { + it("should return a valid database session response", async () => { + const authEvents: AuthConfig["events"] = { + session: () => {}, + } + vi.spyOn(authEvents, "session") + authConfig.events = authEvents + + vi.spyOn(defaultCallbacks, "jwt") + vi.spyOn(defaultCallbacks, "session") + + const expectedSessionUser = { + name: "test", + email: "test@test.com", + image: "https://test.com/test.png", + } + const expectedSessionUserInBody = { + name: "test", + email: "test@test.com", + image: "https://test.com/test.png", + } + // 1 day from now + const currentExpires = new Date(Date.now() + 24 * 60 * 60 * 1000) + const expectedToken = randomString(32) + const expectedSession: AdapterSession = { + sessionToken: expectedToken, + userId: "userId", + expires: currentExpires, + } + + const encoded = await encode({ + salt: SESSION_COOKIE_NAME, + secret: AUTH_SECRET, + token: expectedSession, + }) + const request = new Request(SESSION_ACTION, { + headers: { + cookie: `${SESSION_COOKIE_NAME}=${encoded}`, + }, + }) + const mockAdapter: Adapter = { + getSessionAndUser: vi.fn().mockResolvedValue({ + session: expectedSession, + user: expectedSessionUser, + }), + deleteSession: vi.fn().mockResolvedValue(null), + updateSession: vi.fn().mockResolvedValue(null), + + // not needed for this test but required for the assertion + createUser: vi.fn().mockResolvedValue(null), + getUser: vi.fn().mockResolvedValue(null), + getUserByAccount: vi.fn().mockResolvedValue(null), + getUserByEmail: vi.fn().mockResolvedValue(null), + updateUser: vi.fn().mockResolvedValue(null), + linkAccount: vi.fn().mockResolvedValue(null), + createSession: vi.fn().mockResolvedValue(null), + } + + authConfig.adapter = mockAdapter + const response = (await Auth(request, authConfig)) as Response + const bodySession = await response.json() + + let cookies = response.headers + .getSetCookie() + .reduce>((acc, cookie) => { + return { ...acc, ...parse(cookie) } + }, {}) + const sessionToken = cookies[SESSION_COOKIE_NAME] + const decoded = await decode<{ + // TODO: This shouldn't be necessary? + exp: number + iat: number + jti: string + }>({ + salt: SESSION_COOKIE_NAME, + secret: AUTH_SECRET, + token: sessionToken, + }) + + const { exp, iat, jti, ...actualSession } = decoded || {} + + expect(mockAdapter.getSessionAndUser).toHaveBeenCalledOnce() + expect(mockAdapter.deleteSession).not.toHaveBeenCalled() + expect(mockAdapter.updateSession).toHaveBeenCalled() + expect(defaultCallbacks.session).toHaveBeenCalledOnce() + expect(authConfig.events?.session).toHaveBeenCalledOnce() + expect(defaultCallbacks.jwt).not.toHaveBeenCalledOnce() + + expect({ + ...actualSession, + expires: new Date((actualSession as AdapterSession).expires), + }).toEqual(expectedSession) + expect(bodySession.user).toEqual(expectedSessionUserInBody) + expect(bodySession.expires).toEqual(currentExpires.toISOString()) + }) +}) diff --git a/packages/core/test/test-setup.ts b/packages/core/test/test-setup.ts new file mode 100644 index 0000000000..3583ff7892 --- /dev/null +++ b/packages/core/test/test-setup.ts @@ -0,0 +1,11 @@ +import { afterAll, afterEach, beforeAll } from "vitest" + +beforeAll(() => { + globalThis.crypto ??= require("node:crypto").webcrypto +}) + +afterAll(() => { +}) + +afterEach(() => { +}) diff --git a/packages/core/vitest.config.js b/packages/core/vitest.config.js new file mode 100644 index 0000000000..1ab083fe74 --- /dev/null +++ b/packages/core/vitest.config.js @@ -0,0 +1,11 @@ +/// + +import { defineConfig } from 'vite' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [], + test: { + setupFiles: ['./test/test-setup.ts'], + }, +}) \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c91c4564d7..06693a59aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -659,6 +659,12 @@ importers: postcss-nested: specifier: 6.0.0 version: 6.0.0(postcss@8.4.19) + vite: + specifier: ^5.0.2 + version: 5.0.2(@types/node@18.11.10) + vitest: + specifier: ^0.25.3 + version: 0.25.7 packages/frameworks-solid-start: dependencies: @@ -6391,6 +6397,15 @@ packages: dev: true optional: true + /@esbuild/android-arm64@0.19.7: + resolution: {integrity: sha512-YEDcw5IT7hW3sFKZBkCAQaOCJQLONVcD4bOyTXMZz5fr66pTHnAet46XAtbXAkJRfIn2YVhdC6R9g4xa27jQ1w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-arm@0.15.16: resolution: {integrity: sha512-nyB6CH++2mSgx3GbnrJsZSxzne5K0HMyNIWafDHqYy7IwxFc4fd/CgHVZXr8Eh+Q3KbIAcAe3vGyqIPhGblvMQ==} engines: {node: '>=12'} @@ -6427,6 +6442,15 @@ packages: dev: true optional: true + /@esbuild/android-arm@0.19.7: + resolution: {integrity: sha512-YGSPnndkcLo4PmVl2tKatEn+0mlVMr3yEpOOT0BeMria87PhvoJb5dg5f5Ft9fbCVgtAz4pWMzZVgSEGpDAlww==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/android-x64@0.16.4: resolution: {integrity: sha512-MW+B2O++BkcOfMWmuHXB15/l1i7wXhJFqbJhp82IBOais8RBEQv2vQz/jHrDEHaY2X0QY7Wfw86SBL2PbVOr0g==} engines: {node: '>=12'} @@ -6454,6 +6478,15 @@ packages: dev: true optional: true + /@esbuild/android-x64@0.19.7: + resolution: {integrity: sha512-jhINx8DEjz68cChFvM72YzrqfwJuFbfvSxZAk4bebpngGfNNRm+zRl4rtT9oAX6N9b6gBcFaJHFew5Blf6CvUw==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-arm64@0.16.4: resolution: {integrity: sha512-a28X1O//aOfxwJVZVs7ZfM8Tyih2Za4nKJrBwW5Wm4yKsnwBy9aiS/xwpxiiTRttw3EaTg4Srerhcm6z0bu9Wg==} engines: {node: '>=12'} @@ -6481,6 +6514,15 @@ packages: dev: true optional: true + /@esbuild/darwin-arm64@0.19.7: + resolution: {integrity: sha512-dr81gbmWN//3ZnBIm6YNCl4p3pjnabg1/ZVOgz2fJoUO1a3mq9WQ/1iuEluMs7mCL+Zwv7AY5e3g1hjXqQZ9Iw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/darwin-x64@0.16.4: resolution: {integrity: sha512-e3doCr6Ecfwd7VzlaQqEPrnbvvPjE9uoTpxG5pyLzr2rI2NMjDHmvY1E5EO81O/e9TUOLLkXA5m6T8lfjK9yAA==} engines: {node: '>=12'} @@ -6508,6 +6550,15 @@ packages: dev: true optional: true + /@esbuild/darwin-x64@0.19.7: + resolution: {integrity: sha512-Lc0q5HouGlzQEwLkgEKnWcSazqr9l9OdV2HhVasWJzLKeOt0PLhHaUHuzb8s/UIya38DJDoUm74GToZ6Wc7NGQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-arm64@0.16.4: resolution: {integrity: sha512-Oup3G/QxBgvvqnXWrBed7xxkFNwAwJVHZcklWyQt7YCAL5bfUkaa6FVWnR78rNQiM8MqqLiT6ZTZSdUFuVIg1w==} engines: {node: '>=12'} @@ -6535,6 +6586,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-arm64@0.19.7: + resolution: {integrity: sha512-+y2YsUr0CxDFF7GWiegWjGtTUF6gac2zFasfFkRJPkMAuMy9O7+2EH550VlqVdpEEchWMynkdhC9ZjtnMiHImQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/freebsd-x64@0.16.4: resolution: {integrity: sha512-vAP+eYOxlN/Bpo/TZmzEQapNS8W1njECrqkTpNgvXskkkJC2AwOXwZWai/Kc2vEFZUXQttx6UJbj9grqjD/+9Q==} engines: {node: '>=12'} @@ -6562,6 +6622,15 @@ packages: dev: true optional: true + /@esbuild/freebsd-x64@0.19.7: + resolution: {integrity: sha512-CdXOxIbIzPJmJhrpmJTLx+o35NoiKBIgOvmvT+jeSadYiWJn0vFKsl+0bSG/5lwjNHoIDEyMYc/GAPR9jxusTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm64@0.16.4: resolution: {integrity: sha512-2zXoBhv4r5pZiyjBKrOdFP4CXOChxXiYD50LRUU+65DkdS5niPFHbboKZd/c81l0ezpw7AQnHeoCy5hFrzzs4g==} engines: {node: '>=12'} @@ -6589,6 +6658,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm64@0.19.7: + resolution: {integrity: sha512-inHqdOVCkUhHNvuQPT1oCB7cWz9qQ/Cz46xmVe0b7UXcuIJU3166aqSunsqkgSGMtUCWOZw3+KMwI6otINuC9g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-arm@0.16.4: resolution: {integrity: sha512-A47ZmtpIPyERxkSvIv+zLd6kNIOtJH03XA0Hy7jaceRDdQaQVGSDt4mZqpWqJYgDk9rg96aglbF6kCRvPGDSUA==} engines: {node: '>=12'} @@ -6616,6 +6694,15 @@ packages: dev: true optional: true + /@esbuild/linux-arm@0.19.7: + resolution: {integrity: sha512-Y+SCmWxsJOdQtjcBxoacn/pGW9HDZpwsoof0ttL+2vGcHokFlfqV666JpfLCSP2xLxFpF1lj7T3Ox3sr95YXww==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ia32@0.16.4: resolution: {integrity: sha512-uxdSrpe9wFhz4yBwt2kl2TxS/NWEINYBUFIxQtaEVtglm1eECvsj1vEKI0KX2k2wCe17zDdQ3v+jVxfwVfvvjw==} engines: {node: '>=12'} @@ -6643,6 +6730,15 @@ packages: dev: true optional: true + /@esbuild/linux-ia32@0.19.7: + resolution: {integrity: sha512-2BbiL7nLS5ZO96bxTQkdO0euGZIUQEUXMTrqLxKUmk/Y5pmrWU84f+CMJpM8+EHaBPfFSPnomEaQiG/+Gmh61g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-loong64@0.14.54: resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} @@ -6688,6 +6784,15 @@ packages: dev: true optional: true + /@esbuild/linux-loong64@0.19.7: + resolution: {integrity: sha512-BVFQla72KXv3yyTFCQXF7MORvpTo4uTA8FVFgmwVrqbB/4DsBFWilUm1i2Oq6zN36DOZKSVUTb16jbjedhfSHw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-mips64el@0.16.4: resolution: {integrity: sha512-sD9EEUoGtVhFjjsauWjflZklTNr57KdQ6xfloO4yH1u7vNQlOfAlhEzbyBKfgbJlW7rwXYBdl5/NcZ+Mg2XhQA==} engines: {node: '>=12'} @@ -6715,6 +6820,15 @@ packages: dev: true optional: true + /@esbuild/linux-mips64el@0.19.7: + resolution: {integrity: sha512-DzAYckIaK+pS31Q/rGpvUKu7M+5/t+jI+cdleDgUwbU7KdG2eC3SUbZHlo6Q4P1CfVKZ1lUERRFP8+q0ob9i2w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-ppc64@0.16.4: resolution: {integrity: sha512-X1HSqHUX9D+d0l6/nIh4ZZJ94eQky8d8z6yxAptpZE3FxCWYWvTDd9X9ST84MGZEJx04VYUD/AGgciddwO0b8g==} engines: {node: '>=12'} @@ -6742,6 +6856,15 @@ packages: dev: true optional: true + /@esbuild/linux-ppc64@0.19.7: + resolution: {integrity: sha512-JQ1p0SmUteNdUaaiRtyS59GkkfTW0Edo+e0O2sihnY4FoZLz5glpWUQEKMSzMhA430ctkylkS7+vn8ziuhUugQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-riscv64@0.16.4: resolution: {integrity: sha512-97ANpzyNp0GTXCt6SRdIx1ngwncpkV/z453ZuxbnBROCJ5p/55UjhbaG23UdHj88fGWLKPFtMoU4CBacz4j9FA==} engines: {node: '>=12'} @@ -6769,6 +6892,15 @@ packages: dev: true optional: true + /@esbuild/linux-riscv64@0.19.7: + resolution: {integrity: sha512-xGwVJ7eGhkprY/nB7L7MXysHduqjpzUl40+XoYDGC4UPLbnG+gsyS1wQPJ9lFPcxYAaDXbdRXd1ACs9AE9lxuw==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-s390x@0.16.4: resolution: {integrity: sha512-pUvPQLPmbEeJRPjP0DYTC1vjHyhrnCklQmCGYbipkep+oyfTn7GTBJXoPodR7ZS5upmEyc8lzAkn2o29wD786A==} engines: {node: '>=12'} @@ -6796,6 +6928,15 @@ packages: dev: true optional: true + /@esbuild/linux-s390x@0.19.7: + resolution: {integrity: sha512-U8Rhki5PVU0L0nvk+E8FjkV8r4Lh4hVEb9duR6Zl21eIEYEwXz8RScj4LZWA2i3V70V4UHVgiqMpszXvG0Yqhg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/linux-x64@0.16.4: resolution: {integrity: sha512-N55Q0mJs3Sl8+utPRPBrL6NLYZKBCLLx0bme/+RbjvMforTGGzFvsRl4xLTZMUBFC1poDzBEPTEu5nxizQ9Nlw==} engines: {node: '>=12'} @@ -6823,6 +6964,15 @@ packages: dev: true optional: true + /@esbuild/linux-x64@0.19.7: + resolution: {integrity: sha512-ZYZopyLhm4mcoZXjFt25itRlocKlcazDVkB4AhioiL9hOWhDldU9n38g62fhOI4Pth6vp+Mrd5rFKxD0/S+7aQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + /@esbuild/netbsd-x64@0.16.4: resolution: {integrity: sha512-LHSJLit8jCObEQNYkgsDYBh2JrJT53oJO2HVdkSYLa6+zuLJh0lAr06brXIkljrlI+N7NNW1IAXGn/6IZPi3YQ==} engines: {node: '>=12'} @@ -6850,6 +7000,15 @@ packages: dev: true optional: true + /@esbuild/netbsd-x64@0.19.7: + resolution: {integrity: sha512-/yfjlsYmT1O3cum3J6cmGG16Fd5tqKMcg5D+sBYLaOQExheAJhqr8xOAEIuLo8JYkevmjM5zFD9rVs3VBcsjtQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/openbsd-x64@0.16.4: resolution: {integrity: sha512-nLgdc6tWEhcCFg/WVFaUxHcPK3AP/bh+KEwKtl69Ay5IBqUwKDaq/6Xk0E+fh/FGjnLwqFSsarsbPHeKM8t8Sw==} engines: {node: '>=12'} @@ -6877,6 +7036,15 @@ packages: dev: true optional: true + /@esbuild/openbsd-x64@0.19.7: + resolution: {integrity: sha512-MYDFyV0EW1cTP46IgUJ38OnEY5TaXxjoDmwiTXPjezahQgZd+j3T55Ht8/Q9YXBM0+T9HJygrSRGV5QNF/YVDQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + /@esbuild/sunos-x64@0.16.4: resolution: {integrity: sha512-08SluG24GjPO3tXKk95/85n9kpyZtXCVwURR2i4myhrOfi3jspClV0xQQ0W0PYWHioJj+LejFMt41q+PG3mlAQ==} engines: {node: '>=12'} @@ -6904,6 +7072,15 @@ packages: dev: true optional: true + /@esbuild/sunos-x64@0.19.7: + resolution: {integrity: sha512-JcPvgzf2NN/y6X3UUSqP6jSS06V0DZAV/8q0PjsZyGSXsIGcG110XsdmuWiHM+pno7/mJF6fjH5/vhUz/vA9fw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-arm64@0.16.4: resolution: {integrity: sha512-yYiRDQcqLYQSvNQcBKN7XogbrSvBE45FEQdH8fuXPl7cngzkCvpsG2H9Uey39IjQ6gqqc+Q4VXYHsQcKW0OMjQ==} engines: {node: '>=12'} @@ -6931,6 +7108,15 @@ packages: dev: true optional: true + /@esbuild/win32-arm64@0.19.7: + resolution: {integrity: sha512-ZA0KSYti5w5toax5FpmfcAgu3ZNJxYSRm0AW/Dao5up0YV1hDVof1NvwLomjEN+3/GMtaWDI+CIyJOMTRSTdMw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-ia32@0.16.4: resolution: {integrity: sha512-5rabnGIqexekYkh9zXG5waotq8mrdlRoBqAktjx2W3kb0zsI83mdCwrcAeKYirnUaTGztR5TxXcXmQrEzny83w==} engines: {node: '>=12'} @@ -6958,6 +7144,15 @@ packages: dev: true optional: true + /@esbuild/win32-ia32@0.19.7: + resolution: {integrity: sha512-CTOnijBKc5Jpk6/W9hQMMvJnsSYRYgveN6O75DTACCY18RA2nqka8dTZR+x/JqXCRiKk84+5+bRKXUSbbwsS0A==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@esbuild/win32-x64@0.16.4: resolution: {integrity: sha512-sN/I8FMPtmtT2Yw+Dly8Ur5vQ5a/RmC8hW7jO9PtPSQUPkowxWpcUZnqOggU7VwyT3Xkj6vcXWd3V/qTXwultQ==} engines: {node: '>=12'} @@ -6985,6 +7180,15 @@ packages: dev: true optional: true + /@esbuild/win32-x64@0.19.7: + resolution: {integrity: sha512-gRaP2sk6hc98N734luX4VpF318l3w+ofrtTu9j5L8EQXF+FzQKV6alCOHMVoJJHvVK/mGbwBXfOL1HETQu9IGQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.30.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -8800,6 +9004,102 @@ packages: rollup: 3.15.0 dev: true + /@rollup/rollup-android-arm-eabi@4.5.2: + resolution: {integrity: sha512-ee7BudTwwrglFYSc3UnqInDDjCLWHKrFmGNi4aK7jlEyg4CyPa1DCMrZfsN1O13YT76UFEqXz2CoN7BCGpUlJw==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.5.2: + resolution: {integrity: sha512-xOuhj9HHtn8128ir8veoQsBbAUBasDbHIBniYTEx02pAmu9EXL+ZjJqngnNEy6ZgZ4h1JwL33GMNu3yJL5Mzow==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.5.2: + resolution: {integrity: sha512-NTGJWoL8bKyqyWFn9/RzSv4hQ4wTbaAv0lHHRwf4OnpiiP4P8W0jiXbm8Nc5BCXKmWAwuvJY82mcIU2TayC20g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.5.2: + resolution: {integrity: sha512-hlKqj7bpPvU15sZo4za14u185lpMzdwWLMc9raMqPK4wywt0wR23y1CaVQ4oAFXat3b5/gmRntyfpwWTKl+vvA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.5.2: + resolution: {integrity: sha512-7ZIZx8c3u+pfI0ohQsft/GywrXez0uR6dUP0JhBuCK3sFO5TfdLn/YApnVkvPxuTv3+YKPIZend9Mt7Cz6sS3Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.5.2: + resolution: {integrity: sha512-7Pk/5mO11JW/cH+a8lL/i0ZxmRGrbpYqN0VwO2DHhU+SJWWOH2zE1RAcPaj8KqiwC8DCDIJOSxjV9+9lLb6aeA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.5.2: + resolution: {integrity: sha512-KrRnuG5phJx756e62wxvWH2e+TK84MP2IVuPwfge+GBvWqIUfVzFRn09TKruuQBXzZp52Vyma7FjMDkwlA9xpg==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.5.2: + resolution: {integrity: sha512-My+53GasPa2D2tU5dXiyHYwrELAUouSfkNlZ3bUKpI7btaztO5vpALEs3mvFjM7aKTvEbc7GQckuXeXIDKQ0fg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.5.2: + resolution: {integrity: sha512-/f0Q6Sc+Vw54Ws6N8fxaEe4R7at3b8pFyv+O/F2VaQ4hODUJcRUcCBJh6zuqtgQQt7w845VTkGLFgWZkP3tUoQ==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.5.2: + resolution: {integrity: sha512-NCKuuZWLht6zj7s6EIFef4BxCRX1GMr83S2W4HPCA0RnJ4iHE4FS1695q6Ewoa6A9nFjJe1//yUu0kgBU07Edw==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.5.2: + resolution: {integrity: sha512-J5zL3riR4AOyU/J3M/i4k/zZ8eP1yT+nTmAKztCXJtnI36jYH0eepvob22mAQ/kLwfsK2TB6dbyVY1F8c/0H5A==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.5.2: + resolution: {integrity: sha512-pL0RXRHuuGLhvs7ayX/SAHph1hrDPXOM5anyYUQXWJEENxw3nfHkzv8FfVlEVcLyKPAEgDRkd6RKZq2SMqS/yg==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@shelf/jest-dynamodb@2.2.4(@aws-sdk/client-dynamodb@3.113.0)(@aws-sdk/lib-dynamodb@3.113.0)(@aws-sdk/util-dynamodb@3.113.0): resolution: {integrity: sha512-OAnkP5sPcIoqL+q/tpp54psuK1gssm+nZLOHRy0S1eyAZGmuqiYAUzyAvmH5AhyqvDPSEHFkIkfbqlp1+KpHgw==} engines: {node: '>=14'} @@ -13856,6 +14156,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + /debug@4.3.4(supports-color@5.5.0): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -15266,6 +15578,36 @@ packages: '@esbuild/win32-x64': 0.18.20 dev: true + /esbuild@0.19.7: + resolution: {integrity: sha512-6brbTZVqxhqgbpqBR5MzErImcpA0SQdoKOkcWK/U30HtQxnokIpG3TX2r0IJqbFUzqLjhU/zC1S5ndgakObVCQ==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.7 + '@esbuild/android-arm64': 0.19.7 + '@esbuild/android-x64': 0.19.7 + '@esbuild/darwin-arm64': 0.19.7 + '@esbuild/darwin-x64': 0.19.7 + '@esbuild/freebsd-arm64': 0.19.7 + '@esbuild/freebsd-x64': 0.19.7 + '@esbuild/linux-arm': 0.19.7 + '@esbuild/linux-arm64': 0.19.7 + '@esbuild/linux-ia32': 0.19.7 + '@esbuild/linux-loong64': 0.19.7 + '@esbuild/linux-mips64el': 0.19.7 + '@esbuild/linux-ppc64': 0.19.7 + '@esbuild/linux-riscv64': 0.19.7 + '@esbuild/linux-s390x': 0.19.7 + '@esbuild/linux-x64': 0.19.7 + '@esbuild/netbsd-x64': 0.19.7 + '@esbuild/openbsd-x64': 0.19.7 + '@esbuild/sunos-x64': 0.19.7 + '@esbuild/win32-arm64': 0.19.7 + '@esbuild/win32-ia32': 0.19.7 + '@esbuild/win32-x64': 0.19.7 + dev: true + /esbuild@0.8.57: resolution: {integrity: sha512-j02SFrUwFTRUqiY0Kjplwjm1psuzO1d6AjaXKuOR9hrY0HuPsT6sV42B6myW34h1q4CRy+Y3g4RU/cGJeI/nNA==} hasBin: true @@ -16723,6 +17065,14 @@ packages: requiresBuild: true optional: true + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + /fstream@1.0.12: resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} engines: {node: '>=0.6'} @@ -24971,7 +25321,7 @@ packages: engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /rollup@3.7.4: @@ -24982,6 +25332,26 @@ packages: fsevents: 2.3.2 dev: true + /rollup@4.5.2: + resolution: {integrity: sha512-CRK1uoROBfkcqrZKyaFcqCcZWNsvJ6yVYZkqTlRocZhO2s5yER6Z3f/QaYtO8RGyloPnmhwgzuPQpNGeK210xQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.5.2 + '@rollup/rollup-android-arm64': 4.5.2 + '@rollup/rollup-darwin-arm64': 4.5.2 + '@rollup/rollup-darwin-x64': 4.5.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.5.2 + '@rollup/rollup-linux-arm64-gnu': 4.5.2 + '@rollup/rollup-linux-arm64-musl': 4.5.2 + '@rollup/rollup-linux-x64-gnu': 4.5.2 + '@rollup/rollup-linux-x64-musl': 4.5.2 + '@rollup/rollup-win32-arm64-msvc': 4.5.2 + '@rollup/rollup-win32-ia32-msvc': 4.5.2 + '@rollup/rollup-win32-x64-msvc': 4.5.2 + fsevents: 2.3.3 + dev: true + /route-sort@1.0.0: resolution: {integrity: sha512-SFgmvjoIhp5S4iBEDW3XnbT+7PRuZ55oRuNjY+CDB1SGZkyCG9bqQ3/dhaZTctTBYMAvDxd2Uy9dStuaUfgJqQ==} engines: {node: '>= 6'} @@ -26159,7 +26529,7 @@ packages: /strip-literal@1.0.0: resolution: {integrity: sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==} dependencies: - acorn: 8.8.1 + acorn: 8.8.2 dev: true /strnum@1.0.5: @@ -28087,7 +28457,7 @@ packages: fsevents: 2.3.2 dev: true - /vite@4.0.5(@types/node@18.16.3): + /vite@4.0.5(@types/node@18.11.10): resolution: {integrity: sha512-7m87RC+caiAxG+8j3jObveRLqaWA/neAdCat6JAZwMkSWqFHOvg8MYe5fAQxVBRAuKAQ1S6XDh3CBQuLNbY33w==} engines: {node: ^14.18.0 || >=16.0.0} hasBin: true @@ -28112,13 +28482,13 @@ packages: terser: optional: true dependencies: - '@types/node': 18.16.3 + '@types/node': 18.11.10 esbuild: 0.16.4 - postcss: 8.4.24 - resolve: 1.22.1 + postcss: 8.4.31 + resolve: 1.22.6 rollup: 3.15.0 optionalDependencies: - fsevents: 2.3.2 + fsevents: 2.3.3 dev: true /vite@4.0.5(@types/node@20.8.10): @@ -28155,6 +28525,42 @@ packages: fsevents: 2.3.2 dev: true + /vite@5.0.2(@types/node@18.11.10): + resolution: {integrity: sha512-6CCq1CAJCNM1ya2ZZA7+jS2KgnhbzvxakmlIjN24cF/PXhRMzpM/z8QgsVJA/Dm5fWUWnVEsmtBoMhmerPxT0g==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 18.11.10 + esbuild: 0.19.7 + postcss: 8.4.31 + rollup: 4.5.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /vitefu@0.2.4(vite@3.2.7): resolution: {integrity: sha512-fanAXjSaf9xXtOOeno8wZXIhgia+CZury481LsDaV++lSvcU2R9Ch2bPh3PYFyoHW+w9LqAeYRISVQjUIew14g==} peerDependencies: @@ -28201,18 +28607,18 @@ packages: dependencies: '@types/chai': 4.3.4 '@types/chai-subset': 1.3.3 - '@types/node': 18.16.3 - acorn: 8.8.1 + '@types/node': 18.11.10 + acorn: 8.8.2 acorn-walk: 8.2.0 chai: 4.3.7 - debug: 4.3.4(supports-color@5.5.0) + debug: 4.3.4 local-pkg: 0.4.2 source-map: 0.6.1 strip-literal: 1.0.0 tinybench: 2.3.1 tinypool: 0.3.0 tinyspy: 1.0.2 - vite: 4.0.5(@types/node@18.16.3) + vite: 4.0.5(@types/node@18.11.10) transitivePeerDependencies: - less - sass