diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index a97cb2d..0000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..39c9b1e --- /dev/null +++ b/.eslintignore @@ -0,0 +1,6 @@ +# The example apps carry their own eslint configs and their own node_modules. +# Linting them from the library root fails on configs that aren't installed here. +examples/ + +dist/ +node_modules/ diff --git a/.eslintrc.json b/.eslintrc.json index 1c0f0d2..85ca31a 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,4 +1,9 @@ { + "root": true, + "ignorePatterns": [ + "dist/", + "examples/" + ], "env": { "browser": true, "es2021": true, @@ -7,6 +12,7 @@ "extends": [ "eslint:recommended", "plugin:react/recommended", + "plugin:react-hooks/recommended", "plugin:@typescript-eslint/recommended" ], "parser": "@typescript-eslint/parser", @@ -19,6 +25,7 @@ }, "plugins": [ "react", + "react-hooks", "@typescript-eslint" ], "settings": { diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c804a08..08239e9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,35 +2,71 @@ name: CI on: push: branches: + # `main` must stay here: release.yml is gated on a successful CI run for + # main, so dropping it would leave releases unable to ever fire. - main + - dev pull_request: jobs: - lint: + verify: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - with: - version: 9 + # No `version:` — action-setup reads the `packageManager` field in + # package.json, so CI cannot drift from the lockfile's pnpm major. + - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm lint - # - run: pnpm tsc --noEmit # Uncomment when strict mode is fully clean - test: + - name: Lint + run: pnpm lint + + - name: Typecheck + run: pnpm typecheck + + # Coverage thresholds live in jest.config.js and fail the build when a + # change drops below them. + - name: Unit tests with coverage gate + run: pnpm test:coverage + + - name: Build + run: pnpm build + + # Separate job: it needs a browser and the example app, and it is the only + # place the HttpOnly claim is checked against a real browser. + e2e: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: pnpm/action-setup@v2 - with: - version: 9 + - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: pnpm test + + # The example depends on the library by path, so it must be built first. + - name: Build library + run: pnpm build + + - name: Install example dependencies + run: pnpm install --dir examples/next-js --no-frozen-lockfile + + - name: Install Playwright browser + run: pnpm exec playwright install chromium --with-deps + + - name: End-to-end tests + run: pnpm test:e2e + env: + AUTH_SECRET: e2e-test-secret-at-least-32-characters!! + + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: playwright-report + path: test-results/ + retention-days: 7 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b1cd66..c0bdd3a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,12 @@ name: Release + +# Gated on CI. `needs:` only works inside a single workflow, so this waits for +# the CI run on main to finish and refuses to publish unless it went green. on: - push: + workflow_run: + workflows: ['CI'] + types: + - completed branches: - main @@ -12,22 +18,55 @@ permissions: jobs: release: + if: github.event.workflow_run.conclusion == 'success' runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: + # Full history and tags: the guard below needs to see existing tags, + # and the changelog is generated from commit history. fetch-depth: 0 - - uses: pnpm/action-setup@v2 - with: - version: 9 + ref: main + + - uses: pnpm/action-setup@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 22 registry-url: 'https://registry.npmjs.org' + cache: 'pnpm' - run: pnpm install --frozen-lockfile - - run: git config --global user.name "github-actions[bot]" - - run: git config --global user.email "github-actions[bot]@users.noreply.github.com" - - run: pnpm release-it --ci + + # This workflow fires on every successful CI run on main, but the version + # only changes when someone bumps it. Without this guard every later merge + # would try to republish the same version and fail. + - name: Has this version already been released? + id: check + run: | + VERSION="$(node -p "require('./package.json').version")" + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + if git rev-parse "v$VERSION" >/dev/null 2>&1; then + echo "released=true" >> "$GITHUB_OUTPUT" + echo "v$VERSION is already tagged — nothing to release." + else + echo "released=false" >> "$GITHUB_OUTPUT" + echo "v$VERSION is not tagged yet — releasing." + fi + + - name: Configure git identity + if: steps.check.outputs.released == 'false' + run: | + git config --global user.name "github-actions[bot]" + git config --global user.email "github-actions[bot]@users.noreply.github.com" + + # `--no-increment` publishes exactly the version in package.json rather + # than deriving one from commit messages, so the released version is + # whatever the committed manifest says and nothing else. + # + # `prepublishOnly` re-runs lint, typecheck, tests and build before the + # tarball is uploaded, so a broken tree cannot reach npm. + - name: Release v${{ steps.check.outputs.version }} + if: steps.check.outputs.released == 'false' + run: pnpm release-it --ci --no-increment env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index 5a0ec8d..ffa7c7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,28 @@ -npm-debug.log +# dependencies node_modules + +# build output build/* dist + +# caches +.jest-cache +*.tsbuildinfo +coverage + +# playwright +test-results +playwright-report +.playwright + +# next.js (examples) +.next +.env.local + +# logs +npm-debug.log +yarn-error.log +*.log + +# os / editor +.DS_Store diff --git a/.jest-cache/haste-map-035ab3f27a3c3d5379cf62831f4255ef-aec48b8621456e906c9a7145f2b0c91c-f8c06d0b8d4415a2b0dac218c6552b15 b/.jest-cache/haste-map-035ab3f27a3c3d5379cf62831f4255ef-aec48b8621456e906c9a7145f2b0c91c-f8c06d0b8d4415a2b0dac218c6552b15 deleted file mode 100644 index 4979c02..0000000 Binary files a/.jest-cache/haste-map-035ab3f27a3c3d5379cf62831f4255ef-aec48b8621456e906c9a7145f2b0c91c-f8c06d0b8d4415a2b0dac218c6552b15 and /dev/null differ diff --git a/.jest-cache/haste-map-035ab3f27a3c3d5379cf62831f4255ef-aec48b8621456e906c9a7145f2b0c91c-fe44ae847448368e364dc1e7b0f0877a b/.jest-cache/haste-map-035ab3f27a3c3d5379cf62831f4255ef-aec48b8621456e906c9a7145f2b0c91c-fe44ae847448368e364dc1e7b0f0877a deleted file mode 100644 index f68b940..0000000 Binary files a/.jest-cache/haste-map-035ab3f27a3c3d5379cf62831f4255ef-aec48b8621456e906c9a7145f2b0c91c-fe44ae847448368e364dc1e7b0f0877a and /dev/null differ diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/09/AuthProvider_09ea2a3c9fd28d0898a28f3c958da2e4 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/09/AuthProvider_09ea2a3c9fd28d0898a28f3c958da2e4 deleted file mode 100644 index e7e862a..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/09/AuthProvider_09ea2a3c9fd28d0898a28f3c958da2e4 +++ /dev/null @@ -1,88 +0,0 @@ -222a77ac7540c9e19a2da449c3b07914 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const helpers_1 = require("./utils/helpers"); -const cookie_1 = require("./utils/cookie"); -const AuthProvider = ({ children }) => { - const [authUser, setAuthUser] = React.useState(null); - const [isLoading, setLoading] = React.useState(false); - React.useEffect(() => { - async function loadUserFromCookies() { - setLoading(true); - const token = (0, cookie_1.getAuthToken)(); - if (token) { - if ((0, helpers_1.isTokenValid)(token)) { // check if token expired - const user = (0, helpers_1.getStateUser)(); - setAuthUser(user); - } - else { - logOut(); - } - setLoading(false); - } - setLoading(false); - } - loadUserFromCookies(); - }, []); - const signIn = (state) => { - if (state === null || state === void 0 ? void 0 : state.token) { - let secure = false; - if (typeof window !== "undefined") { - secure = window.location.protocol === 'https:'; - } - (0, cookie_1.setAuthToken)(state === null || state === void 0 ? void 0 : state.token, secure); - if (state === null || state === void 0 ? void 0 : state.user) { - (0, helpers_1.setStateUser)(state === null || state === void 0 ? void 0 : state.user); - } - else { - (0, helpers_1.setStateUser)({ name: 'Anonymous' }); - } - } - }; - const logOut = (redirectPath) => { - (0, helpers_1.deleteStateUser)(); - setAuthUser(null); - window.location.href = redirectPath || '/'; - }; - return (React.createElement(AuthContext_1.default.Provider, { value: { isLoading: isLoading, isAuthenticated: !!authUser, user: authUser, signIn, logOut } }, children)); -}; -exports.default = AuthProvider; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoUHJvdmlkZXIudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQStCO0FBRS9CLGdFQUF3QztBQUN4Qyw2Q0FBNEY7QUFDNUYsMkNBQTREO0FBRzVELE1BQU0sWUFBWSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQWlDLEVBQUUsRUFBRTtJQUNuRSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQTZCLElBQUksQ0FBQyxDQUFDO0lBQ2pGLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNuQixLQUFLLFVBQVUsbUJBQW1CO1lBQ2hDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNoQixNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQTtZQUM1QixJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLElBQUksSUFBQSxzQkFBWSxFQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyx5QkFBeUI7b0JBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUEsc0JBQVksR0FBRSxDQUFDO29CQUM1QixXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BCLENBQUM7cUJBQU0sQ0FBQztvQkFDTixNQUFNLEVBQUUsQ0FBQTtnQkFDVixDQUFDO2dCQUNELFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNuQixDQUFDO1lBQ0QsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ25CLENBQUM7UUFDRCxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVQLE1BQU0sTUFBTSxHQUFHLENBQUMsS0FBeUIsRUFBRSxFQUFFO1FBQzNDLElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pCLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQTtZQUNsQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsRUFBRSxDQUFDO2dCQUNsQyxNQUFNLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFBO1lBQ2hELENBQUM7WUFDRCxJQUFBLHFCQUFZLEVBQUMsS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNuQyxJQUFJLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLEVBQUUsQ0FBQztnQkFDaEIsSUFBQSxzQkFBWSxFQUFDLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLENBQUMsQ0FBQTtZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBQSxzQkFBWSxFQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7WUFDckMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBRyxDQUFDLFlBQXFCLEVBQUUsRUFBRTtRQUN2QyxJQUFBLHlCQUFlLEdBQUUsQ0FBQztRQUNsQixXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsWUFBWSxJQUFJLEdBQUcsQ0FBQztJQUM3QyxDQUFDLENBQUM7SUFFRixPQUFPLENBQ0wsb0JBQUMscUJBQVcsQ0FBQyxRQUFRLElBQ25CLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBRTNGLFFBQVEsQ0FDWSxDQUN4QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsa0JBQWUsWUFBWSxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvQXV0aFByb3ZpZGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCBBdXRoQ29udGV4dCBmcm9tICcuL0F1dGhDb250ZXh0JztcbmltcG9ydCB7IGRlbGV0ZVN0YXRlVXNlciwgZ2V0U3RhdGVVc2VyLCBpc1Rva2VuVmFsaWQsIHNldFN0YXRlVXNlciB9IGZyb20gJy4vdXRpbHMvaGVscGVycyc7XG5pbXBvcnQgeyBzZXRBdXRoVG9rZW4sIGdldEF1dGhUb2tlbiB9IGZyb20gJy4vdXRpbHMvY29va2llJztcbmltcG9ydCB7IEF1dGhTdGF0ZUludGVyZmFjZSwgQXV0aFN0YXRlVXNlck9iamVjdCB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBBdXRoUHJvdmlkZXIgPSAoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkgPT4ge1xuICBjb25zdCBbYXV0aFVzZXIsIHNldEF1dGhVc2VyXSA9IFJlYWN0LnVzZVN0YXRlPEF1dGhTdGF0ZVVzZXJPYmplY3QgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0TG9hZGluZ10gPSBSZWFjdC51c2VTdGF0ZShmYWxzZSk7XG5cbiAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBsb2FkVXNlckZyb21Db29raWVzKCkge1xuICAgICAgc2V0TG9hZGluZyh0cnVlKVxuICAgICAgY29uc3QgdG9rZW4gPSBnZXRBdXRoVG9rZW4oKVxuICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgIGlmIChpc1Rva2VuVmFsaWQodG9rZW4pKSB7IC8vIGNoZWNrIGlmIHRva2VuIGV4cGlyZWRcbiAgICAgICAgICBjb25zdCB1c2VyID0gZ2V0U3RhdGVVc2VyKCk7XG4gICAgICAgICAgc2V0QXV0aFVzZXIodXNlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nT3V0KClcbiAgICAgICAgfVxuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKVxuICAgICAgfVxuICAgICAgc2V0TG9hZGluZyhmYWxzZSlcbiAgICB9XG4gICAgbG9hZFVzZXJGcm9tQ29va2llcygpO1xuICB9LCBbXSk7XG5cbiAgY29uc3Qgc2lnbkluID0gKHN0YXRlOiBBdXRoU3RhdGVJbnRlcmZhY2UpID0+IHtcbiAgICBpZiAoc3RhdGU/LnRva2VuKSB7XG4gICAgICBsZXQgc2VjdXJlID0gZmFsc2VcbiAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIHNlY3VyZSA9IHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOidcbiAgICAgIH1cbiAgICAgIHNldEF1dGhUb2tlbihzdGF0ZT8udG9rZW4sIHNlY3VyZSk7XG4gICAgICBpZiAoc3RhdGU/LnVzZXIpIHtcbiAgICAgICAgc2V0U3RhdGVVc2VyKHN0YXRlPy51c2VyKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U3RhdGVVc2VyKHsgbmFtZTogJ0Fub255bW91cycgfSlcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbG9nT3V0ID0gKHJlZGlyZWN0UGF0aD86IHN0cmluZykgPT4ge1xuICAgIGRlbGV0ZVN0YXRlVXNlcigpO1xuICAgIHNldEF1dGhVc2VyKG51bGwpO1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcmVkaXJlY3RQYXRoIHx8ICcvJztcbiAgfTtcblxuICByZXR1cm4gKFxuICAgIDxBdXRoQ29udGV4dC5Qcm92aWRlclxuICAgICAgdmFsdWU9e3sgaXNMb2FkaW5nOiBpc0xvYWRpbmcsIGlzQXV0aGVudGljYXRlZDogISFhdXRoVXNlciwgdXNlcjogYXV0aFVzZXIsIHNpZ25JbiwgbG9nT3V0IH19XG4gICAgPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvQXV0aENvbnRleHQuUHJvdmlkZXI+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBBdXRoUHJvdmlkZXI7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/09/AuthProvider_09ea2a3c9fd28d0898a28f3c958da2e4.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/09/AuthProvider_09ea2a3c9fd28d0898a28f3c958da2e4.map deleted file mode 100644 index 8799696..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/09/AuthProvider_09ea2a3c9fd28d0898a28f3c958da2e4.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAE/B,gEAAwC;AACxC,6CAA4F;AAC5F,2CAA4D;AAG5D,MAAM,YAAY,GAAG,CAAC,EAAE,QAAQ,EAAiC,EAAE,EAAE;IACnE,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAA6B,IAAI,CAAC,CAAC;IACjF,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,mBAAmB;YAChC,UAAU,CAAC,IAAI,CAAC,CAAA;YAChB,MAAM,KAAK,GAAG,IAAA,qBAAY,GAAE,CAAA;YAC5B,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,IAAA,sBAAY,EAAC,KAAK,CAAC,EAAE,CAAC,CAAC,yBAAyB;oBAClD,MAAM,IAAI,GAAG,IAAA,sBAAY,GAAE,CAAC;oBAC5B,WAAW,CAAC,IAAI,CAAC,CAAC;gBACpB,CAAC;qBAAM,CAAC;oBACN,MAAM,EAAE,CAAA;gBACV,CAAC;gBACD,UAAU,CAAC,KAAK,CAAC,CAAA;YACnB,CAAC;YACD,UAAU,CAAC,KAAK,CAAC,CAAA;QACnB,CAAC;QACD,mBAAmB,EAAE,CAAC;IACxB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,MAAM,GAAG,CAAC,KAAyB,EAAE,EAAE;QAC3C,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,CAAC;YACjB,IAAI,MAAM,GAAG,KAAK,CAAA;YAClB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;gBAClC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAA;YAChD,CAAC;YACD,IAAA,qBAAY,EAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACnC,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAC;gBAChB,IAAA,sBAAY,EAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,CAAC,CAAA;YAC3B,CAAC;iBAAM,CAAC;gBACN,IAAA,sBAAY,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;YACrC,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,MAAM,GAAG,CAAC,YAAqB,EAAE,EAAE;QACvC,IAAA,yBAAe,GAAE,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,IAAI,GAAG,CAAC;IAC7C,CAAC,CAAC;IAEF,OAAO,CACL,oBAAC,qBAAW,CAAC,QAAQ,IACnB,KAAK,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAE3F,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,YAAY,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport AuthContext from './AuthContext';\nimport { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers';\nimport { setAuthToken, getAuthToken } from './utils/cookie';\nimport { AuthStateInterface, AuthStateUserObject } from './types';\n\nconst AuthProvider = ({ children }: { children: React.ReactNode }) => {\n const [authUser, setAuthUser] = React.useState(null);\n const [isLoading, setLoading] = React.useState(false);\n\n React.useEffect(() => {\n async function loadUserFromCookies() {\n setLoading(true)\n const token = getAuthToken()\n if (token) {\n if (isTokenValid(token)) { // check if token expired\n const user = getStateUser();\n setAuthUser(user);\n } else {\n logOut()\n }\n setLoading(false)\n }\n setLoading(false)\n }\n loadUserFromCookies();\n }, []);\n\n const signIn = (state: AuthStateInterface) => {\n if (state?.token) {\n let secure = false\n if (typeof window !== \"undefined\") {\n secure = window.location.protocol === 'https:'\n }\n setAuthToken(state?.token, secure);\n if (state?.user) {\n setStateUser(state?.user)\n } else {\n setStateUser({ name: 'Anonymous' })\n }\n }\n };\n\n const logOut = (redirectPath?: string) => {\n deleteStateUser();\n setAuthUser(null);\n window.location.href = redirectPath || '/';\n };\n\n return (\n \n {children}\n \n );\n};\n\nexport default AuthProvider;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/1a/helperstest_1acf5c5d554d6a79afa34f49ead1e180 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/1a/helperstest_1acf5c5d554d6a79afa34f49ead1e180 deleted file mode 100644 index 97d92a4..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/1a/helperstest_1acf5c5d554d6a79afa34f49ead1e180 +++ /dev/null @@ -1,99 +0,0 @@ -77ef7775992cb2632435a0ae3ebf9363 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('../cookie', () => ({ - getAuthToken: jest.fn(), - clearAuthToken: jest.fn(), -})); -const helpers_1 = require("../helpers"); -const CookieUtils = __importStar(require("../cookie")); -describe('Helper Utils', () => { - const mockUser = { name: 'Test User', email: 'test@example.com' }; - beforeEach(() => { - jest.clearAllMocks(); - Object.defineProperty(window, 'localStorage', { - value: { - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), - }, - writable: true, - }); - }); - describe('User State Persistence', () => { - it('should set user state in localStorage', () => { - (0, helpers_1.setStateUser)(mockUser); - expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser)); - }); - it('should get user state from localStorage', () => { - window.localStorage.getItem.mockReturnValue(JSON.stringify(mockUser)); - const user = (0, helpers_1.getStateUser)(); - expect(user).toEqual(mockUser); - }); - it('should delete user state', () => { - (0, helpers_1.deleteStateUser)(); - expect(CookieUtils.clearAuthToken).toHaveBeenCalled(); - expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user'); - }); - }); - describe('isTokenValid', () => { - it('should return true for valid non-expired token', () => { - const futureTime = Math.floor(Date.now() / 1000) + 3600; - const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(validToken)).toBe(true); - }); - it('should return false for expired token', () => { - const pastTime = Math.floor(Date.now() / 1000) - 3600; - const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(expiredToken)).toBe(false); - }); - it('should return false for null/empty token', () => { - expect((0, helpers_1.isTokenValid)('')).toBe(false); - // @ts-ignore - expect((0, helpers_1.isTokenValid)(null)).toBe(false); - }); - it('should handle malformed token gracefully (currently crashes, needs fix)', () => { - // This test documents current behavior or expected fix - try { - expect((0, helpers_1.isTokenValid)('malformed.token')).toBe(false); - } - catch (e) { - // Expected to throw in current implementation - } - }); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUM1QixDQUFDLENBQUMsQ0FBQztBQU5KLHdDQUF1RjtBQUN2Rix1REFBeUM7QUFPekMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBRWxFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1lBQzFDLEtBQUssRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO2FBQ3hCO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDN0MsSUFBQSxzQkFBWSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG1C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Y3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzVG9rZW5WYWxpZCwgZ2V0U3RhdGVVc2VyLCBzZXRTdGF0ZVVzZXIsIGRlbGV0ZVN0YXRlVXNlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgQ29va2llVXRpbHMgZnJvbSAnLi4vY29va2llJztcblxuamVzdC5tb2NrKCcuLi9jb29raWUnLCAoKSA9PiAoe1xuICAgIGdldEF1dGhUb2tlbjogamVzdC5mbigpLFxuICAgIGNsZWFyQXV0aFRva2VuOiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdIZWxwZXIgVXRpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1VzZXIgPSB7IG5hbWU6ICdUZXN0IFVzZXInLCBlbWFpbDogJ3Rlc3RAZXhhbXBsZS5jb20nIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIGdldEl0ZW06IGplc3QuZm4oKSxcbiAgICAgICAgICAgICAgICBzZXRJdGVtOiBqZXN0LmZuKCksXG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbTogamVzdC5mbigpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVc2VyIFN0YXRlIFBlcnNpc3RlbmNlJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHNldCB1c2VyIHN0YXRlIGluIGxvY2FsU3RvcmFnZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlVXNlcihtb2NrVXNlcik7XG4gICAgICAgICAgICBleHBlY3Qod2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3VzZXInLCBKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGdldCB1c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlJywgKCkgPT4ge1xuICAgICAgICAgICAgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGdldFN0YXRlVXNlcigpO1xuICAgICAgICAgICAgZXhwZWN0KHVzZXIpLnRvRXF1YWwobW9ja1VzZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGRlbGV0ZSB1c2VyIHN0YXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgICAgICAgICBleHBlY3QoQ29va2llVXRpbHMuY2xlYXJBdXRoVG9rZW4pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICAgIGV4cGVjdCh3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdXNlcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpc1Rva2VuVmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIG5vbi1leHBpcmVkIHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnV0dXJlVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzYwMDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkVG9rZW4gPSBgaGVhZGVyLiR7YnRvYShKU09OLnN0cmluZ2lmeSh7IGV4cDogZnV0dXJlVGltZSB9KSl9LnNpZ25hdHVyZWA7XG4gICAgICAgICAgICBleHBlY3QoaXNUb2tlblZhbGlkKHZhbGlkVG9rZW4pKS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgZXhwaXJlZCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3RUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgLSAzNjAwO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlZFRva2VuID0gYGhlYWRlci4ke2J0b2EoSlNPTi5zdHJpbmdpZnkoeyBleHA6IHBhc3RUaW1lIH0pKX0uc2lnbmF0dXJlYDtcbiAgICAgICAgICAgIGV4cGVjdChpc1Rva2VuVmFsaWQoZXhwaXJlZFRva2VuKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBudWxsL2VtcHR5IHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZChudWxsKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG1hbGZvcm1lZCB0b2tlbiBncmFjZWZ1bGx5IChjdXJyZW50bHkgY3Jhc2hlcywgbmVlZHMgZml4KScsICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBkb2N1bWVudHMgY3VycmVudCBiZWhhdmlvciBvciBleHBlY3RlZCBmaXhcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnbWFsZm9ybWVkLnRva2VuJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIHRvIHRocm93IGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/1a/helperstest_1acf5c5d554d6a79afa34f49ead1e180.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/1a/helperstest_1acf5c5d554d6a79afa34f49ead1e180.map deleted file mode 100644 index 192dec8..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/1a/helperstest_1acf5c5d554d6a79afa34f49ead1e180.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE;IACvB,cAAc,EAAE,IAAI,CAAC,EAAE,EAAE;CAC5B,CAAC,CAAC,CAAC;AANJ,wCAAuF;AACvF,uDAAyC;AAOzC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAElE,UAAU,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE;YAC1C,KAAK,EAAE;gBACH,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;gBAClB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE;gBAClB,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE;aACxB;YACD,QAAQ,EAAE,IAAI;SACjB,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC7C,IAAA,sBAAY,EAAC,QAAQ,CAAC,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC5G,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YAC9C,MAAM,CAAC,YAAY,CAAC,OAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG,IAAA,sBAAY,GAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAChC,IAAA,yBAAe,GAAE,CAAC;YAClB,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACtD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC1B,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACtD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACxD,MAAM,UAAU,GAAG,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC,YAAY,CAAC;YACnF,MAAM,CAAC,IAAA,sBAAY,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;YACtD,MAAM,YAAY,GAAG,UAAU,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC;YACnF,MAAM,CAAC,IAAA,sBAAY,EAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,IAAA,sBAAY,EAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrC,aAAa;YACb,MAAM,CAAC,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YAC/E,uDAAuD;YACvD,IAAI,CAAC;gBACD,MAAM,CAAC,IAAA,sBAAY,EAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACT,8CAA8C;YAClD,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts"],"sourcesContent":["import { isTokenValid, getStateUser, setStateUser, deleteStateUser } from '../helpers';\nimport * as CookieUtils from '../cookie';\n\njest.mock('../cookie', () => ({\n getAuthToken: jest.fn(),\n clearAuthToken: jest.fn(),\n}));\n\ndescribe('Helper Utils', () => {\n const mockUser = { name: 'Test User', email: 'test@example.com' };\n\n beforeEach(() => {\n jest.clearAllMocks();\n Object.defineProperty(window, 'localStorage', {\n value: {\n getItem: jest.fn(),\n setItem: jest.fn(),\n removeItem: jest.fn(),\n },\n writable: true,\n });\n });\n\n describe('User State Persistence', () => {\n it('should set user state in localStorage', () => {\n setStateUser(mockUser);\n expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser));\n });\n\n it('should get user state from localStorage', () => {\n (window.localStorage.getItem as jest.Mock).mockReturnValue(JSON.stringify(mockUser));\n const user = getStateUser();\n expect(user).toEqual(mockUser);\n });\n\n it('should delete user state', () => {\n deleteStateUser();\n expect(CookieUtils.clearAuthToken).toHaveBeenCalled();\n expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user');\n });\n });\n\n describe('isTokenValid', () => {\n it('should return true for valid non-expired token', () => {\n const futureTime = Math.floor(Date.now() / 1000) + 3600;\n const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`;\n expect(isTokenValid(validToken)).toBe(true);\n });\n\n it('should return false for expired token', () => {\n const pastTime = Math.floor(Date.now() / 1000) - 3600;\n const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`;\n expect(isTokenValid(expiredToken)).toBe(false);\n });\n\n it('should return false for null/empty token', () => {\n expect(isTokenValid('')).toBe(false);\n // @ts-ignore\n expect(isTokenValid(null)).toBe(false);\n });\n\n it('should handle malformed token gracefully (currently crashes, needs fix)', () => {\n // This test documents current behavior or expected fix\n try {\n expect(isTokenValid('malformed.token')).toBe(false);\n } catch (e) {\n // Expected to throw in current implementation\n }\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/20/useAuth_20c244c64d4675ec51ad34a384af953f b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/20/useAuth_20c244c64d4675ec51ad34a384af953f deleted file mode 100644 index 2093be1..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/20/useAuth_20c244c64d4675ec51ad34a384af953f +++ /dev/null @@ -1,51 +0,0 @@ -3bd2c78e95147590e15f3fa9ac8e8a03 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const errors_1 = require("./errors"); -const useAuth = () => { - const context = React.useContext(AuthContext_1.default); - if (context === null) { - throw new errors_1.AuthError('AuthProvider is missing. ' + 'Please add the AuthProvider'); - } - return context; -}; -exports.default = useAuth; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91c2VBdXRoLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQThCO0FBQzlCLGdFQUF3QztBQUN4QyxxQ0FBb0M7QUFJcEMsTUFBTSxPQUFPLEdBQUcsR0FBdUIsRUFBRTtJQUNyQyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFXLENBQUMsQ0FBQTtJQUM3QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksa0JBQVMsQ0FBQywyQkFBMkIsR0FBRyw2QkFBNkIsQ0FBQyxDQUFBO0lBQ3BGLENBQUM7SUFDRCxPQUFPLE9BQU8sQ0FBQztBQUNuQixDQUFDLENBQUE7QUFFRCxrQkFBZSxPQUFPLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91c2VBdXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IEF1dGhDb250ZXh0IGZyb20gXCIuL0F1dGhDb250ZXh0XCI7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICcuL2Vycm9ycydcblxuaW1wb3J0IHsgU3RhcnRlckNvbnRleHRUeXBlIH0gZnJvbSBcIi4vdHlwZXNcIlxuXG5jb25zdCB1c2VBdXRoID0gKCk6IFN0YXJ0ZXJDb250ZXh0VHlwZSA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoQXV0aENvbnRleHQpXG4gICAgaWYgKGNvbnRleHQgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcignQXV0aFByb3ZpZGVyIGlzIG1pc3NpbmcuICcgKyAnUGxlYXNlIGFkZCB0aGUgQXV0aFByb3ZpZGVyJylcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHVzZUF1dGg7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/20/useAuth_20c244c64d4675ec51ad34a384af953f.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/20/useAuth_20c244c64d4675ec51ad34a384af953f.map deleted file mode 100644 index 86d2077..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/20/useAuth_20c244c64d4675ec51ad34a384af953f.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA8B;AAC9B,gEAAwC;AACxC,qCAAoC;AAIpC,MAAM,OAAO,GAAG,GAAuB,EAAE;IACrC,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAA;IAC7C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,kBAAS,CAAC,2BAA2B,GAAG,6BAA6B,CAAC,CAAA;IACpF,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC,CAAA;AAED,kBAAe,OAAO,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts"],"sourcesContent":["import * as React from 'react'\nimport AuthContext from \"./AuthContext\";\nimport { AuthError } from './errors'\n\nimport { StarterContextType } from \"./types\"\n\nconst useAuth = (): StarterContextType => {\n const context = React.useContext(AuthContext)\n if (context === null) {\n throw new AuthError('AuthProvider is missing. ' + 'Please add the AuthProvider')\n }\n return context;\n}\n\nexport default useAuth;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/23/useAuth_23c69358f7b93303f74835edb0c67bf2 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/23/useAuth_23c69358f7b93303f74835edb0c67bf2 deleted file mode 100644 index 872d9b4..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/23/useAuth_23c69358f7b93303f74835edb0c67bf2 +++ /dev/null @@ -1,51 +0,0 @@ -9e7bc81db5b5adc84d25bd53365c40ba -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const errors_1 = require("./errors"); -const useAuth = () => { - const context = React.useContext(AuthContext_1.default); - if (context === null) { - throw new errors_1.AuthError('AuthProvider is missing. Please add the AuthProvider'); - } - return context; -}; -exports.default = useAuth; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91c2VBdXRoLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQStCO0FBQy9CLGdFQUF3QztBQUN4QyxxQ0FBcUM7QUFHckMsTUFBTSxPQUFPLEdBQUcsR0FBd0QsRUFBRTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFXLENBQUMsQ0FBQztJQUM5QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksa0JBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxPQUFPLE9BQWlDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUYsa0JBQWUsT0FBTyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvdXNlQXV0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXV0aENvbnRleHQgZnJvbSAnLi9BdXRoQ29udGV4dCc7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBBdXRoQ29udGV4dFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgdXNlQXV0aCA9IDxUVXNlciA9IFJlY29yZDxzdHJpbmcsIGFueT4+KCk6IEF1dGhDb250ZXh0VHlwZTxUVXNlcj4gPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEF1dGhDb250ZXh0KTtcbiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKCdBdXRoUHJvdmlkZXIgaXMgbWlzc2luZy4gUGxlYXNlIGFkZCB0aGUgQXV0aFByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0IGFzIEF1dGhDb250ZXh0VHlwZTxUVXNlcj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1c2VBdXRoO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/23/useAuth_23c69358f7b93303f74835edb0c67bf2.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/23/useAuth_23c69358f7b93303f74835edb0c67bf2.map deleted file mode 100644 index 2d25dbd..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/23/useAuth_23c69358f7b93303f74835edb0c67bf2.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,gEAAwC;AACxC,qCAAqC;AAGrC,MAAM,OAAO,GAAG,GAAwD,EAAE;IACtE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,kBAAS,CAAC,sDAAsD,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAiC,CAAC;AAC7C,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts"],"sourcesContent":["import * as React from 'react';\nimport AuthContext from './AuthContext';\nimport { AuthError } from './errors';\nimport { AuthContextType } from './types';\n\nconst useAuth = >(): AuthContextType => {\n const context = React.useContext(AuthContext);\n if (context === null) {\n throw new AuthError('AuthProvider is missing. Please add the AuthProvider');\n }\n return context as AuthContextType;\n};\n\nexport default useAuth;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2c/cookie_2cb7e9f963eb147689b580666b69b666 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2c/cookie_2cb7e9f963eb147689b580666b69b666 deleted file mode 100644 index 7f41423..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2c/cookie_2cb7e9f963eb147689b580666b69b666 +++ /dev/null @@ -1,29 +0,0 @@ -6cd12c7fed2316d67b63a884c7cbaf9a -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.clearAuthToken = exports.getAuthToken = exports.setAuthToken = void 0; -const js_cookie_1 = __importDefault(require("js-cookie")); -const tokenName = 'starter_auth_token'; -const setAuthToken = (token, secure) => { - // Default to strict security - const isIdsProduction = process.env.NODE_ENV === 'production'; - const isSecure = typeof secure === 'boolean' ? secure : isIdsProduction; - js_cookie_1.default.set(tokenName, token, { - secure: isSecure, - sameSite: 'Strict', - expires: 7 // 7 days default - }); -}; -exports.setAuthToken = setAuthToken; -const getAuthToken = () => { - return js_cookie_1.default.get(tokenName) || null; -}; -exports.getAuthToken = getAuthToken; -const clearAuthToken = () => { - js_cookie_1.default.remove(tokenName); -}; -exports.clearAuthToken = clearAuthToken; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9jb29raWUudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQWdDO0FBRWhDLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFBO0FBRXRDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWUsRUFBRSxFQUFFO0lBQ3BELDZCQUE2QjtJQUM3QixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUM7SUFDOUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUV4RSxtQkFBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQzFCLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUMsaUJBQWlCO0tBQy9CLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQVVPLG9DQUFZO0FBUnJCLE1BQU0sWUFBWSxHQUFHLEdBQWtCLEVBQUU7SUFDckMsT0FBTyxtQkFBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBTXFCLG9DQUFZO0FBSm5DLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtJQUN4QixtQkFBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFbUMsd0NBQWMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9jb29raWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuXG5jb25zdCB0b2tlbk5hbWUgPSAnc3RhcnRlcl9hdXRoX3Rva2VuJ1xuXG5jb25zdCBzZXRBdXRoVG9rZW4gPSAodG9rZW46IHN0cmluZywgc2VjdXJlOiBib29sZWFuKSA9PiB7XG4gICAgLy8gRGVmYXVsdCB0byBzdHJpY3Qgc2VjdXJpdHlcbiAgICBjb25zdCBpc0lkc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGlzU2VjdXJlID0gdHlwZW9mIHNlY3VyZSA9PT0gJ2Jvb2xlYW4nID8gc2VjdXJlIDogaXNJZHNQcm9kdWN0aW9uO1xuXG4gICAgQ29va2llcy5zZXQodG9rZW5OYW1lLCB0b2tlbiwge1xuICAgICAgICBzZWN1cmU6IGlzU2VjdXJlLFxuICAgICAgICBzYW1lU2l0ZTogJ1N0cmljdCcsXG4gICAgICAgIGV4cGlyZXM6IDcgLy8gNyBkYXlzIGRlZmF1bHRcbiAgICB9KTtcbn07XG5cbmNvbnN0IGdldEF1dGhUb2tlbiA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICByZXR1cm4gQ29va2llcy5nZXQodG9rZW5OYW1lKSB8fCBudWxsO1xufTtcblxuY29uc3QgY2xlYXJBdXRoVG9rZW4gPSAoKSA9PiB7XG4gICAgQ29va2llcy5yZW1vdmUodG9rZW5OYW1lKTtcbn07XG5cbmV4cG9ydCB7IHNldEF1dGhUb2tlbiwgZ2V0QXV0aFRva2VuLCBjbGVhckF1dGhUb2tlbiB9Il0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2c/cookie_2cb7e9f963eb147689b580666b69b666.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2c/cookie_2cb7e9f963eb147689b580666b69b666.map deleted file mode 100644 index 4493fec..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2c/cookie_2cb7e9f963eb147689b580666b69b666.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts","mappings":";;;;;;AAAA,0DAAgC;AAEhC,MAAM,SAAS,GAAG,oBAAoB,CAAA;AAEtC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,MAAe,EAAE,EAAE;IACpD,6BAA6B;IAC7B,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAC9D,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IAExE,mBAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE;QAC1B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,CAAC,CAAC,iBAAiB;KAC/B,CAAC,CAAC;AACP,CAAC,CAAC;AAUO,oCAAY;AARrB,MAAM,YAAY,GAAG,GAAkB,EAAE;IACrC,OAAO,mBAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC1C,CAAC,CAAC;AAMqB,oCAAY;AAJnC,MAAM,cAAc,GAAG,GAAG,EAAE;IACxB,mBAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEmC,wCAAc","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts"],"sourcesContent":["import Cookies from \"js-cookie\";\n\nconst tokenName = 'starter_auth_token'\n\nconst setAuthToken = (token: string, secure: boolean) => {\n // Default to strict security\n const isIdsProduction = process.env.NODE_ENV === 'production';\n const isSecure = typeof secure === 'boolean' ? secure : isIdsProduction;\n\n Cookies.set(tokenName, token, {\n secure: isSecure,\n sameSite: 'Strict',\n expires: 7 // 7 days default\n });\n};\n\nconst getAuthToken = (): string | null => {\n return Cookies.get(tokenName) || null;\n};\n\nconst clearAuthToken = () => {\n Cookies.remove(tokenName);\n};\n\nexport { setAuthToken, getAuthToken, clearAuthToken }"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2d/AuthProvider_2d92e5c1d2bb7e112b10e7db6a90ef2f b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2d/AuthProvider_2d92e5c1d2bb7e112b10e7db6a90ef2f deleted file mode 100644 index 91f3cf1..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2d/AuthProvider_2d92e5c1d2bb7e112b10e7db6a90ef2f +++ /dev/null @@ -1,97 +0,0 @@ -b46253f39227fade70ae7ceb13892f67 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthProvider = AuthProvider; -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const helpers_1 = require("./utils/helpers"); -const cookie_1 = require("./utils/cookie"); -function AuthProvider({ children }) { - const [authUser, setAuthUser] = React.useState(null); - const [isLoading, setLoading] = React.useState(true); - const logOut = React.useCallback((redirectPath) => { - (0, helpers_1.deleteStateUser)(); - setAuthUser(null); - if (typeof window !== 'undefined' && redirectPath !== null) { - window.location.href = redirectPath || '/'; - } - }, []); - React.useEffect(() => { - async function loadUserFromCookies() { - try { - const token = (0, cookie_1.getAuthToken)(); - if (token) { - if ((0, helpers_1.isTokenValid)(token)) { - const user = (0, helpers_1.getStateUser)(); - setAuthUser(user); - } - else { - logOut(null); // Logout without redirect during init - } - } - } - catch (error) { - console.error('Failed to load auth state:', error); - } - finally { - setLoading(false); - } - } - loadUserFromCookies(); - }, [logOut]); - const signIn = React.useCallback((state) => { - if (state === null || state === void 0 ? void 0 : state.token) { - const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:'; - (0, cookie_1.setAuthToken)(state.token, isSecure); - const user = state.user || { name: 'Anonymous' }; - (0, helpers_1.setStateUser)(user); - setAuthUser(user); - } - }, []); - const value = React.useMemo(() => ({ - isLoading, - isAuthenticated: !!authUser, - user: authUser, - signIn, - logOut, - }), [isLoading, authUser, signIn, logOut]); - return (React.createElement(AuthContext_1.default.Provider, { value: value }, children)); -} -exports.default = AuthProvider; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoUHJvdmlkZXIudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0Esb0NBeURDO0FBcEVELDZDQUErQjtBQUUvQixnRUFBd0M7QUFDeEMsNkNBQTRGO0FBQzVGLDJDQUE0RDtBQU81RCxTQUFnQixZQUFZLENBQThCLEVBQUUsUUFBUSxFQUFxQjtJQUN2RixNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQWUsSUFBSSxDQUFDLENBQUM7SUFDbkUsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFxQixFQUFFLEVBQUU7UUFDekQsSUFBQSx5QkFBZSxHQUFFLENBQUM7UUFDbEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLElBQUksR0FBRyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNuQixLQUFLLFVBQVUsbUJBQW1CO1lBQ2hDLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztnQkFDN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixJQUFJLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksR0FBRyxJQUFBLHNCQUFZLEdBQVMsQ0FBQzt3QkFDbkMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxDQUFDLElBQVcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO29CQUM3RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFDRCxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFYixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBZ0MsRUFBRSxFQUFFO1FBQ3BFLElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7WUFDeEYsSUFBQSxxQkFBWSxFQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQXVCLENBQUM7WUFDdkUsSUFBQSxzQkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLFNBQVM7UUFDVCxlQUFlLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDM0IsSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNO1FBQ04sTUFBTTtLQUNQLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFM0MsT0FBTyxDQUNMLG9CQUFDLHFCQUFXLENBQUMsUUFBUSxJQUFDLEtBQUssRUFBRSxLQUFLLElBQy9CLFFBQVEsQ0FDWSxDQUN4QixDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUFlLFlBQVksQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL0F1dGhQcm92aWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0aENvbnRleHQgZnJvbSAnLi9BdXRoQ29udGV4dCc7XG5pbXBvcnQgeyBkZWxldGVTdGF0ZVVzZXIsIGdldFN0YXRlVXNlciwgaXNUb2tlblZhbGlkLCBzZXRTdGF0ZVVzZXIgfSBmcm9tICcuL3V0aWxzL2hlbHBlcnMnO1xuaW1wb3J0IHsgc2V0QXV0aFRva2VuLCBnZXRBdXRoVG9rZW4gfSBmcm9tICcuL3V0aWxzL2Nvb2tpZSc7XG5pbXBvcnQgeyBBdXRoU3RhdGVJbnRlcmZhY2UgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXI8VFVzZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7IGNoaWxkcmVuIH06IEF1dGhQcm92aWRlclByb3BzKSB7XG4gIGNvbnN0IFthdXRoVXNlciwgc2V0QXV0aFVzZXJdID0gUmVhY3QudXNlU3RhdGU8VFVzZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0TG9hZGluZ10gPSBSZWFjdC51c2VTdGF0ZSh0cnVlKTtcblxuICBjb25zdCBsb2dPdXQgPSBSZWFjdC51c2VDYWxsYmFjaygocmVkaXJlY3RQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgc2V0QXV0aFVzZXIobnVsbCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHJlZGlyZWN0UGF0aCAhPT0gbnVsbCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZWRpcmVjdFBhdGggfHwgJy8nO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZFVzZXJGcm9tQ29va2llcygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgIGlmIChpc1Rva2VuVmFsaWQodG9rZW4pKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZ2V0U3RhdGVVc2VyPFRVc2VyPigpO1xuICAgICAgICAgICAgc2V0QXV0aFVzZXIodXNlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ091dChudWxsIGFzIGFueSk7IC8vIExvZ291dCB3aXRob3V0IHJlZGlyZWN0IGR1cmluZyBpbml0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBhdXRoIHN0YXRlOicsIGVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2FkVXNlckZyb21Db29raWVzKCk7XG4gIH0sIFtsb2dPdXRdKTtcblxuICBjb25zdCBzaWduSW4gPSBSZWFjdC51c2VDYWxsYmFjaygoc3RhdGU6IEF1dGhTdGF0ZUludGVyZmFjZTxUVXNlcj4pID0+IHtcbiAgICBpZiAoc3RhdGU/LnRva2VuKSB7XG4gICAgICBjb25zdCBpc1NlY3VyZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICBzZXRBdXRoVG9rZW4oc3RhdGUudG9rZW4sIGlzU2VjdXJlKTtcblxuICAgICAgY29uc3QgdXNlciA9IHN0YXRlLnVzZXIgfHwgKHsgbmFtZTogJ0Fub255bW91cycgfSBhcyB1bmtub3duIGFzIFRVc2VyKTtcbiAgICAgIHNldFN0YXRlVXNlcih1c2VyKTtcbiAgICAgIHNldEF1dGhVc2VyKHVzZXIpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGlzTG9hZGluZyxcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6ICEhYXV0aFVzZXIsXG4gICAgdXNlcjogYXV0aFVzZXIsXG4gICAgc2lnbkluLFxuICAgIGxvZ091dCxcbiAgfSksIFtpc0xvYWRpbmcsIGF1dGhVc2VyLCBzaWduSW4sIGxvZ091dF0pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dGhDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9BdXRoQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXV0aFByb3ZpZGVyO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2d/AuthProvider_2d92e5c1d2bb7e112b10e7db6a90ef2f.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2d/AuthProvider_2d92e5c1d2bb7e112b10e7db6a90ef2f.map deleted file mode 100644 index fcf34de..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/2d/AuthProvider_2d92e5c1d2bb7e112b10e7db6a90ef2f.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,oCAyDC;AApED,6CAA+B;AAE/B,gEAAwC;AACxC,6CAA4F;AAC5F,2CAA4D;AAO5D,SAAgB,YAAY,CAA8B,EAAE,QAAQ,EAAqB;IACvF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAe,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,YAAqB,EAAE,EAAE;QACzD,IAAA,yBAAe,GAAE,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,IAAI,GAAG,CAAC;QAC7C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,mBAAmB;YAChC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAA,qBAAY,GAAE,CAAC;gBAC7B,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,IAAA,sBAAY,EAAC,KAAK,CAAC,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,IAAA,sBAAY,GAAS,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAW,CAAC,CAAC,CAAC,sCAAsC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,mBAAmB,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAgC,EAAE,EAAE;QACpE,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;YACxF,IAAA,qBAAY,EAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAK,EAAE,IAAI,EAAE,WAAW,EAAuB,CAAC;YACvE,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,SAAS;QACT,eAAe,EAAE,CAAC,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,MAAM;KACP,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3C,OAAO,CACL,oBAAC,qBAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAC/B,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC;AAED,kBAAe,YAAY,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport AuthContext from './AuthContext';\nimport { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers';\nimport { setAuthToken, getAuthToken } from './utils/cookie';\nimport { AuthStateInterface } from './types';\n\nexport interface AuthProviderProps {\n children: React.ReactNode;\n}\n\nexport function AuthProvider>({ children }: AuthProviderProps) {\n const [authUser, setAuthUser] = React.useState(null);\n const [isLoading, setLoading] = React.useState(true);\n\n const logOut = React.useCallback((redirectPath?: string) => {\n deleteStateUser();\n setAuthUser(null);\n if (typeof window !== 'undefined' && redirectPath !== null) {\n window.location.href = redirectPath || '/';\n }\n }, []);\n\n React.useEffect(() => {\n async function loadUserFromCookies() {\n try {\n const token = getAuthToken();\n if (token) {\n if (isTokenValid(token)) {\n const user = getStateUser();\n setAuthUser(user);\n } else {\n logOut(null as any); // Logout without redirect during init\n }\n }\n } catch (error) {\n console.error('Failed to load auth state:', error);\n } finally {\n setLoading(false);\n }\n }\n loadUserFromCookies();\n }, [logOut]);\n\n const signIn = React.useCallback((state: AuthStateInterface) => {\n if (state?.token) {\n const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:';\n setAuthToken(state.token, isSecure);\n\n const user = state.user || ({ name: 'Anonymous' } as unknown as TUser);\n setStateUser(user);\n setAuthUser(user);\n }\n }, []);\n\n const value = React.useMemo(() => ({\n isLoading,\n isAuthenticated: !!authUser,\n user: authUser,\n signIn,\n logOut,\n }), [isLoading, authUser, signIn, logOut]);\n\n return (\n \n {children}\n \n );\n}\n\nexport default AuthProvider;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/31/helpers_3112bf19d64903876fa685c73edea84d b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/31/helpers_3112bf19d64903876fa685c73edea84d deleted file mode 100644 index d272533..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/31/helpers_3112bf19d64903876fa685c73edea84d +++ /dev/null @@ -1,108 +0,0 @@ -0483444bb7a9052ff52eff6577e454ba -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isTokenValid = isTokenValid; -exports.setStateUser = setStateUser; -exports.getStateUser = getStateUser; -exports.deleteStateUser = deleteStateUser; -exports.isAuthenticated = isAuthenticated; -exports.tokenDecode = tokenDecode; -const cookie_1 = require("./cookie"); -const errors_1 = require("../errors"); -function setStateUser(user) { - if (typeof window !== "undefined" && window.localStorage) { - localStorage.setItem('starter_auth_user', JSON.stringify(user)); - } -} -function getStateUser() { - if (typeof window !== "undefined" && window.localStorage) { - const user = localStorage.getItem('starter_auth_user'); - if (user) { - return JSON.parse(user); - } - } -} -function deleteStateUser() { - (0, cookie_1.clearAuthToken)(); - if (typeof window !== "undefined" && window.localStorage) { - localStorage.removeItem('starter_auth_user'); - } -} -function isAuthenticated() { - const token = (0, cookie_1.getAuthToken)(); - if (token) { - return isTokenValid(token); - } - return false; -} -function b64DecodeUnicode(str) { - return decodeURIComponent(atob(str).replace(/(.)/g, (p) => { - let code = p.charCodeAt(0).toString(16).toUpperCase(); - if (code.length < 2) { - code = "0" + code; - } - return "%" + code; - })); -} -function base64UrlDecode(str) { - let output = str.replace(/-/g, "+").replace(/_/g, "/"); - switch (output.length % 4) { - case 0: - break; - case 2: - output += "=="; - break; - case 3: - output += "="; - break; - default: - throw new Error("base64 string is not of the correct length"); - } - try { - return b64DecodeUnicode(output); - } - catch (err) { - return atob(output); - } -} -function tokenDecode(token, options) { - if (typeof token !== "string") { - throw new errors_1.AuthError("Invalid token specified: must be a string"); - } - options || (options = {}); - const pos = options.header === true ? 0 : 1; - const part = token.split(".")[pos]; - if (typeof part !== "string") { - throw new errors_1.AuthError(`Invalid token specified: missing part #${pos + 1}`); - } - let decoded; - try { - decoded = base64UrlDecode(part); - } - catch (e) { - throw new errors_1.AuthError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`); - } - try { - return JSON.parse(decoded); - } - catch (e) { - throw new errors_1.AuthError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`); - } -} -function isTokenValid(token) { - try { - if (token) { - const decodedJwt = tokenDecode(token); - if (typeof decodedJwt === 'object' && decodedJwt !== null) { - if (decodedJwt.exp) { - return decodedJwt.exp * 1000 > Date.now(); - } - } - } - return false; - } - catch (error) { - return false; - } -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9oZWxwZXJzLnRzIiwibWFwcGluZ3MiOiI7O0FBcUhTLG9DQUFZO0FBQUUsb0NBQVk7QUFBRSxvQ0FBWTtBQUFFLDBDQUFlO0FBQUUsMENBQWU7QUFBRSxrQ0FBVztBQXJIaEcscUNBQXVEO0FBRXZELHNDQUFzQztBQUd0QyxTQUFTLFlBQVksQ0FBQyxJQUF5QjtJQUM3QyxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFlBQVk7SUFDbkIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixJQUFBLHVCQUFjLEdBQUUsQ0FBQTtJQUNoQixJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsWUFBWSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9DLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFBO0lBQzVCLElBQUksS0FBSyxFQUFFLENBQUM7UUFDVixPQUFPLFlBQVksQ0FBQyxLQUFLLENBQUMs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LElBQUksQ0FBQztRQUNILElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixNQUFNLFVBQVUsR0FBZ0IsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25ELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDMUQsSUFBSSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7b0JBQ25CLE9BQU8sVUFBVSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUMzQyxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL3V0aWxzL2hlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0QXV0aFRva2VuLCBjbGVhckF1dGhUb2tlbiB9IGZyb20gXCIuL2Nvb2tpZVwiXG5cbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcbmltcG9ydCB7IEF1dGhTdGF0ZVVzZXJPYmplY3QsIFRva2VuT2JqZWN0LCBUb2tlbkhlYWRlciwgVG9rZW5EZWNvZGVPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCJcblxuZnVuY3Rpb24gc2V0U3RhdGVVc2VyKHVzZXI6IEF1dGhTdGF0ZVVzZXJPYmplY3QpIHtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkge1xuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdzdGFydGVyX2F1dGhfdXNlcicsIEpTT04uc3RyaW5naWZ5KHVzZXIpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTdGF0ZVVzZXIoKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcbiAgICBjb25zdCB1c2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0YXJ0ZXJfYXV0aF91c2VyJyk7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHVzZXIpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBkZWxldGVTdGF0ZVVzZXIoKSB7XG4gIGNsZWFyQXV0aFRva2VuKClcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgJiYgd2luZG93LmxvY2FsU3RvcmFnZSkge1xuICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdzdGFydGVyX2F1dGhfdXNlcicpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQXV0aGVudGljYXRlZCgpIHtcbiAgY29uc3QgdG9rZW4gPSBnZXRBdXRoVG9rZW4oKVxuICBpZiAodG9rZW4pIHtcbiAgICByZXR1cm4gaXNUb2tlblZhbGlkKHRva2VuKVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5mdW5jdGlvbiBiNjREZWNvZGVVbmljb2RlKHN0cjogc3RyaW5nKSB7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoXG4gICAgYXRvYihzdHIpLnJlcGxhY2UoLyguKS9nLCAocCkgPT4ge1xuICAgICAgbGV0IGNvZGUgPSAocCBhcyBzdHJpbmcpLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgICBpZiAoY29kZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIGNvZGUgPSBcIjBcIiArIGNvZGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gXCIlXCIgKyBjb2RlO1xuICAgIH0pLFxuICApO1xufVxuXG5mdW5jdGlvbiBiYXNlNjRVcmxEZWNvZGUoc3RyOiBzdHJpbmcpIHtcbiAgbGV0IG91dHB1dCA9IHN0ci5yZXBsYWNlKC8tL2csIFwiK1wiKS5yZXBsYWNlKC9fL2csIFwiL1wiKTtcbiAgc3dpdGNoIChvdXRwdXQubGVuZ3RoICUgNCkge1xuICAgIGNhc2UgMDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMjpcbiAgICAgIG91dHB1dCArPSBcIj09XCI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDM6XG4gICAgICBvdXRwdXQgKz0gXCI9XCI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiYmFzZTY0IHN0cmluZyBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgbGVuZ3RoXCIpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYjY0RGVjb2RlVW5pY29kZShvdXRwdXQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gYXRvYihvdXRwdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRva2VuRGVjb2RlPFQgPSBUb2tlbkhlYWRlciB8IFRva2VuT2JqZWN0Pih0b2tlbjogc3RyaW5nLCBvcHRpb25zPzogVG9rZW5EZWNvZGVPcHRpb25zKTogVCB7XG4gIGlmICh0eXBlb2YgdG9rZW4gIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IG11c3QgYmUgYSBzdHJpbmdcIik7XG4gIH1cbiAgb3B0aW9ucyB8fD0ge307XG5cbiAgY29uc3QgcG9zID0gb3B0aW9ucy5oZWFkZXIgPT09IHRydWUgPyAwIDogMTtcbiAgY29uc3QgcGFydCA9IHRva2VuLnNwbGl0KFwiLlwiKVtwb3NdO1xuXG4gIGlmICh0eXBlb2YgcGFydCAhPT0gXCJzdHJpbmdcIikge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtaXNzaW5nIHBhcnQgIyR7cG9zICsgMX1gKTtcbiAgfVxuXG4gIGxldCBkZWNvZGVkOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgZGVjb2RlZCA9IGJhc2U2NFVybERlY29kZShwYXJ0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXG4gICAgICBgSW52YWxpZCB0b2tlbiBzcGVjaWZpZWQ6IGludmFsaWQgYmFzZTY0IGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxuICAgICk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBKU09OLnBhcnNlKGRlY29kZWQpIGFzIFQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFxuICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGpzb24gZm9yIHBhcnQgIyR7cG9zICsgMX0gKCR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9KWAsXG4gICAgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc1Rva2VuVmFsaWQodG9rZW46IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmICh0b2tlbikge1xuICAgICAgY29uc3QgZGVjb2RlZEp3dDogVG9rZW5PYmplY3QgPSB0b2tlbkRlY29kZSh0b2tlbik7XG4gICAgICBpZiAodHlwZW9mIGRlY29kZWRKd3QgPT09ICdvYmplY3QnICYmIGRlY29kZWRKd3QgIT09IG51bGwpIHtcbiAgICAgICAgaWYgKGRlY29kZWRKd3QuZXhwKSB7XG4gICAgICAgICAgcmV0dXJuIGRlY29kZWRKd3QuZXhwICogMTAwMCA+IERhdGUubm93KClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cblxuZXhwb3J0IHsgaXNUb2tlblZhbGlkLCBzZXRTdGF0ZVVzZXIsIGdldFN0YXRlVXNlciwgZGVsZXRlU3RhdGVVc2VyLCBpc0F1dGhlbnRpY2F0ZWQsIHRva2VuRGVjb2RlIH07XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/31/helpers_3112bf19d64903876fa685c73edea84d.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/31/helpers_3112bf19d64903876fa685c73edea84d.map deleted file mode 100644 index 5b67bbd..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/31/helpers_3112bf19d64903876fa685c73edea84d.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts"],"sourcesContent":["import { getAuthToken, clearAuthToken } from \"./cookie\"\n\nimport { AuthError } from \"../errors\";\nimport { AuthStateUserObject, TokenObject, TokenHeader, TokenDecodeOptions } from \"../types\"\n\nfunction setStateUser(user: AuthStateUserObject) {\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.setItem('starter_auth_user', JSON.stringify(user));\n }\n}\n\nfunction getStateUser() {\n if (typeof window !== \"undefined\" && window.localStorage) {\n const user = localStorage.getItem('starter_auth_user');\n if (user) {\n return JSON.parse(user);\n }\n }\n}\n\nfunction deleteStateUser() {\n clearAuthToken()\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.removeItem('starter_auth_user');\n }\n}\n\nfunction isAuthenticated() {\n const token = getAuthToken()\n if (token) {\n return isTokenValid(token)\n }\n return false\n}\n\nfunction b64DecodeUnicode(str: string) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (p) => {\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }),\n );\n}\n\nfunction base64UrlDecode(str: string) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n}\n\nfunction tokenDecode(token: string, options?: TokenDecodeOptions): T {\n if (typeof token !== \"string\") {\n throw new AuthError(\"Invalid token specified: must be a string\");\n }\n options ||= {};\n\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n\n if (typeof part !== \"string\") {\n throw new AuthError(`Invalid token specified: missing part #${pos + 1}`);\n }\n\n let decoded: string;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n\n try {\n return JSON.parse(decoded) as T;\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n}\n\nfunction isTokenValid(token: string): boolean {\n try {\n if (token) {\n const decodedJwt: TokenObject = tokenDecode(token);\n if (typeof decodedJwt === 'object' && decodedJwt !== null) {\n if (decodedJwt.exp) {\n return decodedJwt.exp * 1000 > Date.now()\n }\n }\n }\n return false;\n } catch (error) {\n return false;\n }\n}\n\n\nexport { isTokenValid, setStateUser, getStateUser, deleteStateUser, isAuthenticated, tokenDecode };\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/3c/AuthProvidertest_3cc9589d6c679f9cf522c2a92f828904 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/3c/AuthProvidertest_3cc9589d6c679f9cf522c2a92f828904 deleted file mode 100644 index b59c001..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/3c/AuthProvidertest_3cc9589d6c679f9cf522c2a92f828904 +++ /dev/null @@ -1,97 +0,0 @@ -5ffe24ee51bab0488fe4bfc1b1ca8b28 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// Mocks -jest.mock('../utils/cookie'); -jest.mock('../utils/helpers'); -const react_1 = __importDefault(require("react")); -const react_2 = require("@testing-library/react"); -const AuthProvider_1 = __importDefault(require("../AuthProvider")); -const useAuth_1 = __importDefault(require("../useAuth")); -const CookieUtils = __importStar(require("../utils/cookie")); -const Helpers = __importStar(require("../utils/helpers")); -const TestComponent = () => { - const { isAuthenticated, user, signIn, logOut } = (0, useAuth_1.default)(); - return (react_1.default.createElement("div", null, - react_1.default.createElement("div", { "data-testid": "auth-status" }, isAuthenticated ? 'Authenticated' : 'Not Authenticated'), - react_1.default.createElement("div", { "data-testid": "user-name" }, user ? user.name : 'No User'), - react_1.default.createElement("button", { onClick: () => signIn({ token: 'new-token', user: { name: 'New User', email: 'new@example.com' } }) }, "Sign In"), - react_1.default.createElement("button", { onClick: () => logOut() }, "Log Out"))); -}; -describe('AuthProvider', () => { - beforeEach(() => { - jest.clearAllMocks(); - // Default mock implementations - CookieUtils.getAuthToken.mockReturnValue(null); - Helpers.getStateUser.mockReturnValue(null); - Helpers.isTokenValid.mockReturnValue(false); - }); - it('renders children', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement("div", null, "Child Content"))); - expect(react_2.screen.getByText('Child Content')).toBeTruthy(); - }); - it('initializes as not authenticated by default', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - expect(react_2.screen.getByText('Not Authenticated')).toBeTruthy(); - }); - it('loads user from cookies if token is valid', async () => { - const mockUser = { name: 'Existing User' }; - CookieUtils.getAuthToken.mockReturnValue('valid-token'); - Helpers.isTokenValid.mockReturnValue(true); - Helpers.getStateUser.mockReturnValue(mockUser); - await (0, react_2.act)(async () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - }); - expect(react_2.screen.getByText('Authenticated')).toBeTruthy(); - expect(react_2.screen.getByText('Existing User')).toBeTruthy(); - }); - it('signs in user and updates state', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - (0, react_2.act)(() => { - react_2.screen.getByText('Sign In').click(); - }); - expect(CookieUtils.setAuthToken).toHaveBeenCalled(); - expect(Helpers.setStateUser).toHaveBeenCalled(); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9fX3Rlc3RzX18vQXV0aFByb3ZpZGVyLnRlc3QudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsUUFBUTtBQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFWOUIsa0RBQTBCO0FBQzFCLGtEQUE2RDtBQUM3RCxtRUFBMkM7QUFFM0MseURBQWlDO0FBQ2pDLDZEQUErQztBQUMvQywwREFBNEM7QUFNNUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUM1RCxPQUFPLENBQ0g7UUFDSSxzREFBaUIsYUFBYSxJQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBTztRQUM5RixzREFBaUIsV0FBVyxJQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFPO1FBQ2pFLDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxjQUVsRztRQUNULDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBa0IsQ0FDL0MsQ0FDVCxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQiwrQkFBK0I7UUFDOUIsV0FBVyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsMkRBQXdCLENBQ2IsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsOEJBQUMsYUFBYSxPQUFHLENBQ04sQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMxQyxXQUFXLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUEsV0FBRyxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO2dCQUNULDhCQUFDLGFBQWEsT0FBRyxDQUNOLENBQ2xCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDdkMsSUFBQSxjQUFNLEVBQ0YsOEJBQUMsc0JBQVk7WUFDVCw4QkFBQyxhQUFhLE9BQUcsQ0FDTixDQUNsQixDQUFDO1FBRUYsSUFBQSxXQUFHLEVBQUMsR0FBRyxFQUFFO1lBQ0wsY0FBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL19fdGVzdHNfXy9BdXRoUHJvdmlkZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuLCBhY3QgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBBdXRoUHJvdmlkZXIgZnJvbSAnLi4vQXV0aFByb3ZpZGVyJztcblxuaW1wb3J0IHVzZUF1dGggZnJvbSAnLi4vdXNlQXV0aCc7XG5pbXBvcnQgKiBhcyBDb29raWVVdGlscyBmcm9tICcuLi91dGlscy9jb29raWUnO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcblxuLy8gTW9ja3Ncbmplc3QubW9jaygnLi4vdXRpbHMvY29va2llJyk7XG5qZXN0Lm1vY2soJy4uL3V0aWxzL2hlbHBlcnMnKTtcblxuY29uc3QgVGVzdENvbXBvbmVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGlzQXV0aGVudGljYXRlZCwgdXNlciwgc2lnbkluLCBsb2dPdXQgfSA9IHVzZUF1dGgoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImF1dGgtc3RhdHVzXCI+e2lzQXV0aGVudGljYXRlZCA/ICdBdXRoZW50aWNhdGVkJyA6ICdOb3QgQXV0aGVudGljYXRlZCd9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidXNlci1uYW1lXCI+e3VzZXIgPyB1c2VyLm5hbWUgOiAnTm8gVXNlcid9PC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNpZ25Jbih7IHRva2VuOiAnbmV3LXRva2VuJywgdXNlcjogeyBuYW1lOiAnTmV3IFVzZXInLCBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScgfSB9KX0+XG4gICAgICAgICAgICAgICAgU2lnbiBJblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGxvZ091dCgpfT5Mb2cgT3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5kZXNjcmliZSgnQXV0aFByb3ZpZGVyJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICAgICAgLy8gRGVmYXVsdCBtb2NrIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAoQ29va2llVXRpbHMuZ2V0QXV0aFRva2VuIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKG51bGwpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobnVsbCk7XG4gICAgICAgIChIZWxwZXJzLmlzVG9rZW5WYWxpZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8ZGl2PkNoaWxkIENvbnRlbnQ8L2Rpdj5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuICAgICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ2hpbGQgQ29udGVudCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZXMgYXMgbm90IGF1dGhlbnRpY2F0ZWQgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8VGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgICAgPC9BdXRoUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdOb3QgQXV0aGVudGljYXRlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9hZHMgdXNlciBmcm9tIGNvb2tpZXMgaWYgdG9rZW4gaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBuYW1lOiAnRXhpc3RpbmcgVXNlcicgfTtcbiAgICAgICAgKENvb2tpZVV0aWxzLmdldEF1dGhUb2tlbiBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZSgndmFsaWQtdG9rZW4nKTtcbiAgICAgICAgKEhlbHBlcnMuaXNUb2tlblZhbGlkIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobW9ja1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgICAgICA8L0F1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBdXRoZW50aWNhdGVkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0V4aXN0aW5nIFVzZXInKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25zIGluIHVzZXIgYW5kIHVwZGF0ZXMgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHJlbmRlcihcbiAgICAgICAgICAgIDxBdXRoUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuXG4gICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBzY3JlZW4uZ2V0QnlUZXh0KCdTaWduIEluJykuY2xpY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KENvb2tpZVV0aWxzLnNldEF1dGhUb2tlbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoSGVscGVycy5zZXRTdGF0ZVVzZXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/3c/AuthProvidertest_3cc9589d6c679f9cf522c2a92f828904.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/3c/AuthProvidertest_3cc9589d6c679f9cf522c2a92f828904.map deleted file mode 100644 index 9672e83..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/3c/AuthProvidertest_3cc9589d6c679f9cf522c2a92f828904.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,QAAQ;AACR,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC7B,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;AAV9B,kDAA0B;AAC1B,kDAA6D;AAC7D,mEAA2C;AAE3C,yDAAiC;AACjC,6DAA+C;AAC/C,0DAA4C;AAM5C,MAAM,aAAa,GAAG,GAAG,EAAE;IACvB,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,iBAAO,GAAE,CAAC;IAC5D,OAAO,CACH;QACI,sDAAiB,aAAa,IAAE,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,mBAAmB,CAAO;QAC9F,sDAAiB,WAAW,IAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAO;QACjE,0CAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,CAAC,cAElG;QACT,0CAAQ,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,cAAkB,CAC/C,CACT,CAAC;AACN,CAAC,CAAC;AAEF,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,UAAU,CAAC,GAAG,EAAE;QACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,+BAA+B;QAC9B,WAAW,CAAC,YAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC7D,OAAO,CAAC,YAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO,CAAC,YAA0B,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QACxB,IAAA,cAAM,EACF,8BAAC,sBAAY;YACT,2DAAwB,CACb,CAClB,CAAC;QACF,MAAM,CAAC,cAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACnD,IAAA,cAAM,EACF,8BAAC,sBAAY;YACT,8BAAC,aAAa,OAAG,CACN,CAClB,CAAC;QACF,MAAM,CAAC,cAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;QAC1C,WAAW,CAAC,YAA0B,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACtE,OAAO,CAAC,YAA0B,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACzD,OAAO,CAAC,YAA0B,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QAE9D,MAAM,IAAA,WAAG,EAAC,KAAK,IAAI,EAAE;YACjB,IAAA,cAAM,EACF,8BAAC,sBAAY;gBACT,8BAAC,aAAa,OAAG,CACN,CAClB,CAAC;QACN,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,cAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACvD,MAAM,CAAC,cAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,IAAA,cAAM,EACF,8BAAC,sBAAY;YACT,8BAAC,aAAa,OAAG,CACN,CAClB,CAAC;QAEF,IAAA,WAAG,EAAC,GAAG,EAAE;YACL,cAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACpD,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx"],"sourcesContent":["import React from 'react';\nimport { render, screen, act } from '@testing-library/react';\nimport AuthProvider from '../AuthProvider';\n\nimport useAuth from '../useAuth';\nimport * as CookieUtils from '../utils/cookie';\nimport * as Helpers from '../utils/helpers';\n\n// Mocks\njest.mock('../utils/cookie');\njest.mock('../utils/helpers');\n\nconst TestComponent = () => {\n const { isAuthenticated, user, signIn, logOut } = useAuth();\n return (\n
\n
{isAuthenticated ? 'Authenticated' : 'Not Authenticated'}
\n
{user ? user.name : 'No User'}
\n \n \n
\n );\n};\n\ndescribe('AuthProvider', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n // Default mock implementations\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue(null);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(null);\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(false);\n });\n\n it('renders children', () => {\n render(\n \n
Child Content
\n
\n );\n expect(screen.getByText('Child Content')).toBeTruthy();\n });\n\n it('initializes as not authenticated by default', () => {\n render(\n \n \n \n );\n expect(screen.getByText('Not Authenticated')).toBeTruthy();\n });\n\n it('loads user from cookies if token is valid', async () => {\n const mockUser = { name: 'Existing User' };\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue('valid-token');\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(true);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(mockUser);\n\n await act(async () => {\n render(\n \n \n \n );\n });\n\n expect(screen.getByText('Authenticated')).toBeTruthy();\n expect(screen.getByText('Existing User')).toBeTruthy();\n });\n\n it('signs in user and updates state', () => {\n render(\n \n \n \n );\n\n act(() => {\n screen.getByText('Sign In').click();\n });\n\n expect(CookieUtils.setAuthToken).toHaveBeenCalled();\n expect(Helpers.setStateUser).toHaveBeenCalled();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/43/AuthProvidertestd_438b979f25bcadb60d66fcf40b1b564f b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/43/AuthProvidertestd_438b979f25bcadb60d66fcf40b1b564f deleted file mode 100644 index 1fb1f23..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/43/AuthProvidertestd_438b979f25bcadb60d66fcf40b1b564f +++ /dev/null @@ -1 +0,0 @@ -da39a3ee5e6b4b0d3255bfef95601890 diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5c/helperstest_5c061643557ab86fec018c4bb5efe25a b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5c/helperstest_5c061643557ab86fec018c4bb5efe25a deleted file mode 100644 index 97d92a4..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5c/helperstest_5c061643557ab86fec018c4bb5efe25a +++ /dev/null @@ -1,99 +0,0 @@ -77ef7775992cb2632435a0ae3ebf9363 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('../cookie', () => ({ - getAuthToken: jest.fn(), - clearAuthToken: jest.fn(), -})); -const helpers_1 = require("../helpers"); -const CookieUtils = __importStar(require("../cookie")); -describe('Helper Utils', () => { - const mockUser = { name: 'Test User', email: 'test@example.com' }; - beforeEach(() => { - jest.clearAllMocks(); - Object.defineProperty(window, 'localStorage', { - value: { - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), - }, - writable: true, - }); - }); - describe('User State Persistence', () => { - it('should set user state in localStorage', () => { - (0, helpers_1.setStateUser)(mockUser); - expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser)); - }); - it('should get user state from localStorage', () => { - window.localStorage.getItem.mockReturnValue(JSON.stringify(mockUser)); - const user = (0, helpers_1.getStateUser)(); - expect(user).toEqual(mockUser); - }); - it('should delete user state', () => { - (0, helpers_1.deleteStateUser)(); - expect(CookieUtils.clearAuthToken).toHaveBeenCalled(); - expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user'); - }); - }); - describe('isTokenValid', () => { - it('should return true for valid non-expired token', () => { - const futureTime = Math.floor(Date.now() / 1000) + 3600; - const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(validToken)).toBe(true); - }); - it('should return false for expired token', () => { - const pastTime = Math.floor(Date.now() / 1000) - 3600; - const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(expiredToken)).toBe(false); - }); - it('should return false for null/empty token', () => { - expect((0, helpers_1.isTokenValid)('')).toBe(false); - // @ts-ignore - expect((0, helpers_1.isTokenValid)(null)).toBe(false); - }); - it('should handle malformed token gracefully (currently crashes, needs fix)', () => { - // This test documents current behavior or expected fix - try { - expect((0, helpers_1.isTokenValid)('malformed.token')).toBe(false); - } - catch (e) { - // Expected to throw in current implementation - } - }); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUM1QixDQUFDLENBQUMsQ0FBQztBQU5KLHdDQUF1RjtBQUN2Rix1REFBeUM7QUFPekMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBRWxFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1lBQzFDLEtBQUssRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO2FBQ3hCO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDN0MsSUFBQSxzQkFBWSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG1C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Y3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzVG9rZW5WYWxpZCwgZ2V0U3RhdGVVc2VyLCBzZXRTdGF0ZVVzZXIsIGRlbGV0ZVN0YXRlVXNlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgQ29va2llVXRpbHMgZnJvbSAnLi4vY29va2llJztcblxuamVzdC5tb2NrKCcuLi9jb29raWUnLCAoKSA9PiAoe1xuICAgIGdldEF1dGhUb2tlbjogamVzdC5mbigpLFxuICAgIGNsZWFyQXV0aFRva2VuOiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdIZWxwZXIgVXRpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1VzZXIgPSB7IG5hbWU6ICdUZXN0IFVzZXInLCBlbWFpbDogJ3Rlc3RAZXhhbXBsZS5jb20nIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIGdldEl0ZW06IGplc3QuZm4oKSxcbiAgICAgICAgICAgICAgICBzZXRJdGVtOiBqZXN0LmZuKCksXG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbTogamVzdC5mbigpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVc2VyIFN0YXRlIFBlcnNpc3RlbmNlJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHNldCB1c2VyIHN0YXRlIGluIGxvY2FsU3RvcmFnZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlVXNlcihtb2NrVXNlcik7XG4gICAgICAgICAgICBleHBlY3Qod2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3VzZXInLCBKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGdldCB1c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlJywgKCkgPT4ge1xuICAgICAgICAgICAgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGdldFN0YXRlVXNlcigpO1xuICAgICAgICAgICAgZXhwZWN0KHVzZXIpLnRvRXF1YWwobW9ja1VzZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGRlbGV0ZSB1c2VyIHN0YXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgICAgICAgICBleHBlY3QoQ29va2llVXRpbHMuY2xlYXJBdXRoVG9rZW4pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICAgIGV4cGVjdCh3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdXNlcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpc1Rva2VuVmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIG5vbi1leHBpcmVkIHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnV0dXJlVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzYwMDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkVG9rZW4gPSBgaGVhZGVyLiR7YnRvYShKU09OLnN0cmluZ2lmeSh7IGV4cDogZnV0dXJlVGltZSB9KSl9LnNpZ25hdHVyZWA7XG4gICAgICAgICAgICBleHBlY3QoaXNUb2tlblZhbGlkKHZhbGlkVG9rZW4pKS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgZXhwaXJlZCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3RUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgLSAzNjAwO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlZFRva2VuID0gYGhlYWRlci4ke2J0b2EoSlNPTi5zdHJpbmdpZnkoeyBleHA6IHBhc3RUaW1lIH0pKX0uc2lnbmF0dXJlYDtcbiAgICAgICAgICAgIGV4cGVjdChpc1Rva2VuVmFsaWQoZXhwaXJlZFRva2VuKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBudWxsL2VtcHR5IHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZChudWxsKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG1hbGZvcm1lZCB0b2tlbiBncmFjZWZ1bGx5IChjdXJyZW50bHkgY3Jhc2hlcywgbmVlZHMgZml4KScsICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBkb2N1bWVudHMgY3VycmVudCBiZWhhdmlvciBvciBleHBlY3RlZCBmaXhcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnbWFsZm9ybWVkLnRva2VuJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIHRvIHRocm93IGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5c/helperstest_5c061643557ab86fec018c4bb5efe25a.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5c/helperstest_5c061643557ab86fec018c4bb5efe25a.map deleted file mode 100644 index 192dec8..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5c/helperstest_5c061643557ab86fec018c4bb5efe25a.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts"],"sourcesContent":["import { isTokenValid, getStateUser, setStateUser, deleteStateUser } from '../helpers';\nimport * as CookieUtils from '../cookie';\n\njest.mock('../cookie', () => ({\n getAuthToken: jest.fn(),\n clearAuthToken: jest.fn(),\n}));\n\ndescribe('Helper Utils', () => {\n const mockUser = { name: 'Test User', email: 'test@example.com' };\n\n beforeEach(() => {\n jest.clearAllMocks();\n Object.defineProperty(window, 'localStorage', {\n value: {\n getItem: jest.fn(),\n setItem: jest.fn(),\n removeItem: jest.fn(),\n },\n writable: true,\n });\n });\n\n describe('User State Persistence', () => {\n it('should set user state in localStorage', () => {\n setStateUser(mockUser);\n expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser));\n });\n\n it('should get user state from localStorage', () => {\n (window.localStorage.getItem as jest.Mock).mockReturnValue(JSON.stringify(mockUser));\n const user = getStateUser();\n expect(user).toEqual(mockUser);\n });\n\n it('should delete user state', () => {\n deleteStateUser();\n expect(CookieUtils.clearAuthToken).toHaveBeenCalled();\n expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user');\n });\n });\n\n describe('isTokenValid', () => {\n it('should return true for valid non-expired token', () => {\n const futureTime = Math.floor(Date.now() / 1000) + 3600;\n const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`;\n expect(isTokenValid(validToken)).toBe(true);\n });\n\n it('should return false for expired token', () => {\n const pastTime = Math.floor(Date.now() / 1000) - 3600;\n const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`;\n expect(isTokenValid(expiredToken)).toBe(false);\n });\n\n it('should return false for null/empty token', () => {\n expect(isTokenValid('')).toBe(false);\n // @ts-ignore\n expect(isTokenValid(null)).toBe(false);\n });\n\n it('should handle malformed token gracefully (currently crashes, needs fix)', () => {\n // This test documents current behavior or expected fix\n try {\n expect(isTokenValid('malformed.token')).toBe(false);\n } catch (e) {\n // Expected to throw in current implementation\n }\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5e/cookietestd_5e79ce91dd952bce127ef950f7212c7e b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5e/cookietestd_5e79ce91dd952bce127ef950f7212c7e deleted file mode 100644 index 1fb1f23..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/5e/cookietestd_5e79ce91dd952bce127ef950f7212c7e +++ /dev/null @@ -1 +0,0 @@ -da39a3ee5e6b4b0d3255bfef95601890 diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/61/helpers_61596d5f787c7b1a276394d7f1b105c4 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/61/helpers_61596d5f787c7b1a276394d7f1b105c4 deleted file mode 100644 index 54e8410..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/61/helpers_61596d5f787c7b1a276394d7f1b105c4 +++ /dev/null @@ -1,109 +0,0 @@ -e4695ffb018f4d171b92bf10aaa50025 -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isTokenValid = isTokenValid; -exports.setStateUser = setStateUser; -exports.getStateUser = getStateUser; -exports.deleteStateUser = deleteStateUser; -exports.isAuthenticated = isAuthenticated; -exports.tokenDecode = tokenDecode; -const cookie_1 = require("./cookie"); -const errors_1 = require("../errors"); -function setStateUser(user) { - if (typeof window !== "undefined" && window.localStorage) { - localStorage.setItem('starter_auth_user', JSON.stringify(user)); - } -} -function getStateUser() { - if (typeof window !== "undefined" && window.localStorage) { - const user = localStorage.getItem('starter_auth_user'); - if (user) { - return JSON.parse(user); - } - } - return null; -} -function deleteStateUser() { - (0, cookie_1.clearAuthToken)(); - if (typeof window !== "undefined" && window.localStorage) { - localStorage.removeItem('starter_auth_user'); - } -} -function isAuthenticated() { - const token = (0, cookie_1.getAuthToken)(); - if (token) { - return isTokenValid(token); - } - return false; -} -function b64DecodeUnicode(str) { - return decodeURIComponent(atob(str).replace(/(.)/g, (p) => { - let code = p.charCodeAt(0).toString(16).toUpperCase(); - if (code.length < 2) { - code = "0" + code; - } - return "%" + code; - })); -} -function base64UrlDecode(str) { - let output = str.replace(/-/g, "+").replace(/_/g, "/"); - switch (output.length % 4) { - case 0: - break; - case 2: - output += "=="; - break; - case 3: - output += "="; - break; - default: - throw new Error("base64 string is not of the correct length"); - } - try { - return b64DecodeUnicode(output); - } - catch (err) { - return atob(output); - } -} -function tokenDecode(token, options) { - if (typeof token !== "string") { - throw new errors_1.AuthError("Invalid token specified: must be a string"); - } - options || (options = {}); - const pos = options.header === true ? 0 : 1; - const part = token.split(".")[pos]; - if (typeof part !== "string") { - throw new errors_1.AuthError(`Invalid token specified: missing part #${pos + 1}`); - } - let decoded; - try { - decoded = base64UrlDecode(part); - } - catch (e) { - throw new errors_1.AuthError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`); - } - try { - return JSON.parse(decoded); - } - catch (e) { - throw new errors_1.AuthError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`); - } -} -function isTokenValid(token) { - try { - if (token) { - const decodedJwt = tokenDecode(token); - if (typeof decodedJwt === 'object' && decodedJwt !== null) { - if (decodedJwt.exp) { - return decodedJwt.exp * 1000 > Date.now(); - } - } - } - return false; - } - catch (error) { - return false; - } -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9oZWxwZXJzLnRzIiwibWFwcGluZ3MiOiI7O0FBc0hTLG9DQUFZO0FBQUUsb0NBQVk7QUFBRSxvQ0FBWTtBQUFFLDBDQUFlO0FBQUUsMENBQWU7QUFBRSxrQ0FBVztBQXRIaEcscUNBQXVEO0FBRXZELHNDQUFzQztBQUd0QyxTQUFTLFlBQVksQ0FBOEIsSUFBVztJQUM1RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFlBQVk7SUFDbkIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBVSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3RCLElBQUEsdUJBQWMsR0FBRSxDQUFBO0lBQ2hCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6RCxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGVBQWU7SUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUE7SUFDNUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE9BQU8s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WUFBWSxDQUFDLEtBQWE7SUFDakMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sVUFBVSxHQUFnQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQzNDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvdXRpbHMvaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRBdXRoVG9rZW4sIGNsZWFyQXV0aFRva2VuIH0gZnJvbSBcIi4vY29va2llXCJcblxuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgVG9rZW5PYmplY3QsIFRva2VuSGVhZGVyLCBUb2tlbkRlY29kZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiBzZXRTdGF0ZVVzZXI8VFVzZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih1c2VyOiBUVXNlcikge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cubG9jYWxTdG9yYWdlKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXJ0ZXJfYXV0aF91c2VyJywgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlVXNlcjxUVXNlciA9IFJlY29yZDxzdHJpbmcsIGFueT4+KCk6IFRVc2VyIHwgbnVsbCB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcbiAgICBjb25zdCB1c2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0YXJ0ZXJfYXV0aF91c2VyJyk7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHVzZXIpIGFzIFRVc2VyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGVsZXRlU3RhdGVVc2VyKCkge1xuICBjbGVhckF1dGhUb2tlbigpXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhcnRlcl9hdXRoX3VzZXInKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0F1dGhlbnRpY2F0ZWQoKSB7XG4gIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKClcbiAgaWYgKHRva2VuKSB7XG4gICAgcmV0dXJuIGlzVG9rZW5WYWxpZCh0b2tlbilcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgIGF0b2Ioc3RyKS5yZXBsYWNlKC8oLikvZywgKHApID0+IHtcbiAgICAgIGxldCBjb2RlID0gKHAgYXMgc3RyaW5nKS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgaWYgKGNvZGUubGVuZ3RoIDwgMikge1xuICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiJVwiICsgY29kZTtcbiAgICB9KSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gIHN3aXRjaCAob3V0cHV0Lmxlbmd0aCAlIDQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBvdXRwdXQgKz0gXCI9PVwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgb3V0cHV0ICs9IFwiPVwiO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhc2U2NCBzdHJpbmcgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkRlY29kZTxUID0gVG9rZW5IZWFkZXIgfCBUb2tlbk9iamVjdD4odG9rZW46IHN0cmluZywgb3B0aW9ucz86IFRva2VuRGVjb2RlT3B0aW9ucyk6IFQge1xuICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICB9XG4gIG9wdGlvbnMgfHw9IHt9O1xuXG4gIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDE7XG4gIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcblxuICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogbWlzc2luZyBwYXJ0ICMke3BvcyArIDF9YCk7XG4gIH1cblxuICBsZXQgZGVjb2RlZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGRlY29kZWQgPSBiYXNlNjRVcmxEZWNvZGUocGFydCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFxuICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHsoZSBhcyBFcnJvcikubWVzc2FnZX0pYCxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKSBhcyBUO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcbiAgICAgIGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUb2tlblZhbGlkKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGRlY29kZWRKd3Q6IFRva2VuT2JqZWN0ID0gdG9rZW5EZWNvZGUodG9rZW4pO1xuICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkSnd0ID09PSAnb2JqZWN0JyAmJiBkZWNvZGVkSnd0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChkZWNvZGVkSnd0LmV4cCkge1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkSnd0LmV4cCAqIDEwMDAgPiBEYXRlLm5vdygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5cbmV4cG9ydCB7IGlzVG9rZW5WYWxpZCwgc2V0U3RhdGVVc2VyLCBnZXRTdGF0ZVVzZXIsIGRlbGV0ZVN0YXRlVXNlciwgaXNBdXRoZW50aWNhdGVkLCB0b2tlbkRlY29kZSB9O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/61/helpers_61596d5f787c7b1a276394d7f1b105c4.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/61/helpers_61596d5f787c7b1a276394d7f1b105c4.map deleted file mode 100644 index 830fda0..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/61/helpers_61596d5f787c7b1a276394d7f1b105c4.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts"],"sourcesContent":["import { getAuthToken, clearAuthToken } from \"./cookie\"\n\nimport { AuthError } from \"../errors\";\nimport { TokenObject, TokenHeader, TokenDecodeOptions } from \"../types\"\n\nfunction setStateUser>(user: TUser) {\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.setItem('starter_auth_user', JSON.stringify(user));\n }\n}\n\nfunction getStateUser>(): TUser | null {\n if (typeof window !== \"undefined\" && window.localStorage) {\n const user = localStorage.getItem('starter_auth_user');\n if (user) {\n return JSON.parse(user) as TUser;\n }\n }\n return null;\n}\n\nfunction deleteStateUser() {\n clearAuthToken()\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.removeItem('starter_auth_user');\n }\n}\n\nfunction isAuthenticated() {\n const token = getAuthToken()\n if (token) {\n return isTokenValid(token)\n }\n return false\n}\n\nfunction b64DecodeUnicode(str: string) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (p) => {\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }),\n );\n}\n\nfunction base64UrlDecode(str: string) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n}\n\nfunction tokenDecode(token: string, options?: TokenDecodeOptions): T {\n if (typeof token !== \"string\") {\n throw new AuthError(\"Invalid token specified: must be a string\");\n }\n options ||= {};\n\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n\n if (typeof part !== \"string\") {\n throw new AuthError(`Invalid token specified: missing part #${pos + 1}`);\n }\n\n let decoded: string;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n\n try {\n return JSON.parse(decoded) as T;\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n}\n\nfunction isTokenValid(token: string): boolean {\n try {\n if (token) {\n const decodedJwt: TokenObject = tokenDecode(token);\n if (typeof decodedJwt === 'object' && decodedJwt !== null) {\n if (decodedJwt.exp) {\n return decodedJwt.exp * 1000 > Date.now()\n }\n }\n }\n return false;\n } catch (error) {\n return false;\n }\n}\n\n\nexport { isTokenValid, setStateUser, getStateUser, deleteStateUser, isAuthenticated, tokenDecode };\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/71/AuthProvidertest_7162ed79d6d9554131b2a055be5f39d1 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/71/AuthProvidertest_7162ed79d6d9554131b2a055be5f39d1 deleted file mode 100644 index b59c001..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/71/AuthProvidertest_7162ed79d6d9554131b2a055be5f39d1 +++ /dev/null @@ -1,97 +0,0 @@ -5ffe24ee51bab0488fe4bfc1b1ca8b28 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// Mocks -jest.mock('../utils/cookie'); -jest.mock('../utils/helpers'); -const react_1 = __importDefault(require("react")); -const react_2 = require("@testing-library/react"); -const AuthProvider_1 = __importDefault(require("../AuthProvider")); -const useAuth_1 = __importDefault(require("../useAuth")); -const CookieUtils = __importStar(require("../utils/cookie")); -const Helpers = __importStar(require("../utils/helpers")); -const TestComponent = () => { - const { isAuthenticated, user, signIn, logOut } = (0, useAuth_1.default)(); - return (react_1.default.createElement("div", null, - react_1.default.createElement("div", { "data-testid": "auth-status" }, isAuthenticated ? 'Authenticated' : 'Not Authenticated'), - react_1.default.createElement("div", { "data-testid": "user-name" }, user ? user.name : 'No User'), - react_1.default.createElement("button", { onClick: () => signIn({ token: 'new-token', user: { name: 'New User', email: 'new@example.com' } }) }, "Sign In"), - react_1.default.createElement("button", { onClick: () => logOut() }, "Log Out"))); -}; -describe('AuthProvider', () => { - beforeEach(() => { - jest.clearAllMocks(); - // Default mock implementations - CookieUtils.getAuthToken.mockReturnValue(null); - Helpers.getStateUser.mockReturnValue(null); - Helpers.isTokenValid.mockReturnValue(false); - }); - it('renders children', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement("div", null, "Child Content"))); - expect(react_2.screen.getByText('Child Content')).toBeTruthy(); - }); - it('initializes as not authenticated by default', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - expect(react_2.screen.getByText('Not Authenticated')).toBeTruthy(); - }); - it('loads user from cookies if token is valid', async () => { - const mockUser = { name: 'Existing User' }; - CookieUtils.getAuthToken.mockReturnValue('valid-token'); - Helpers.isTokenValid.mockReturnValue(true); - Helpers.getStateUser.mockReturnValue(mockUser); - await (0, react_2.act)(async () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - }); - expect(react_2.screen.getByText('Authenticated')).toBeTruthy(); - expect(react_2.screen.getByText('Existing User')).toBeTruthy(); - }); - it('signs in user and updates state', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - (0, react_2.act)(() => { - react_2.screen.getByText('Sign In').click(); - }); - expect(CookieUtils.setAuthToken).toHaveBeenCalled(); - expect(Helpers.setStateUser).toHaveBeenCalled(); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9fX3Rlc3RzX18vQXV0aFByb3ZpZGVyLnRlc3QudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsUUFBUTtBQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFWOUIsa0RBQTBCO0FBQzFCLGtEQUE2RDtBQUM3RCxtRUFBMkM7QUFFM0MseURBQWlDO0FBQ2pDLDZEQUErQztBQUMvQywwREFBNEM7QUFNNUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUM1RCxPQUFPLENBQ0g7UUFDSSxzREFBaUIsYUFBYSxJQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBTztRQUM5RixzREFBaUIsV0FBVyxJQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFPO1FBQ2pFLDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxjQUVsRztRQUNULDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBa0IsQ0FDL0MsQ0FDVCxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQiwrQkFBK0I7UUFDOUIsV0FBVyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsMkRBQXdCLENBQ2IsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsOEJBQUMsYUFBYSxPQUFHLENBQ04sQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMxQyxXQUFXLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUEsV0FBRyxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO2dCQUNULDhCQUFDLGFBQWEsT0FBRyxDQUNOLENBQ2xCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDdkMsSUFBQSxjQUFNLEVBQ0YsOEJBQUMsc0JBQVk7WUFDVCw4QkFBQyxhQUFhLE9BQUcsQ0FDTixDQUNsQixDQUFDO1FBRUYsSUFBQSxXQUFHLEVBQUMsR0FBRyxFQUFFO1lBQ0wsY0FBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL19fdGVzdHNfXy9BdXRoUHJvdmlkZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuLCBhY3QgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBBdXRoUHJvdmlkZXIgZnJvbSAnLi4vQXV0aFByb3ZpZGVyJztcblxuaW1wb3J0IHVzZUF1dGggZnJvbSAnLi4vdXNlQXV0aCc7XG5pbXBvcnQgKiBhcyBDb29raWVVdGlscyBmcm9tICcuLi91dGlscy9jb29raWUnO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcblxuLy8gTW9ja3Ncbmplc3QubW9jaygnLi4vdXRpbHMvY29va2llJyk7XG5qZXN0Lm1vY2soJy4uL3V0aWxzL2hlbHBlcnMnKTtcblxuY29uc3QgVGVzdENvbXBvbmVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGlzQXV0aGVudGljYXRlZCwgdXNlciwgc2lnbkluLCBsb2dPdXQgfSA9IHVzZUF1dGgoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImF1dGgtc3RhdHVzXCI+e2lzQXV0aGVudGljYXRlZCA/ICdBdXRoZW50aWNhdGVkJyA6ICdOb3QgQXV0aGVudGljYXRlZCd9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidXNlci1uYW1lXCI+e3VzZXIgPyB1c2VyLm5hbWUgOiAnTm8gVXNlcid9PC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNpZ25Jbih7IHRva2VuOiAnbmV3LXRva2VuJywgdXNlcjogeyBuYW1lOiAnTmV3IFVzZXInLCBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScgfSB9KX0+XG4gICAgICAgICAgICAgICAgU2lnbiBJblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGxvZ091dCgpfT5Mb2cgT3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5kZXNjcmliZSgnQXV0aFByb3ZpZGVyJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICAgICAgLy8gRGVmYXVsdCBtb2NrIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAoQ29va2llVXRpbHMuZ2V0QXV0aFRva2VuIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKG51bGwpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobnVsbCk7XG4gICAgICAgIChIZWxwZXJzLmlzVG9rZW5WYWxpZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8ZGl2PkNoaWxkIENvbnRlbnQ8L2Rpdj5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuICAgICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ2hpbGQgQ29udGVudCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZXMgYXMgbm90IGF1dGhlbnRpY2F0ZWQgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8VGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgICAgPC9BdXRoUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdOb3QgQXV0aGVudGljYXRlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9hZHMgdXNlciBmcm9tIGNvb2tpZXMgaWYgdG9rZW4gaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBuYW1lOiAnRXhpc3RpbmcgVXNlcicgfTtcbiAgICAgICAgKENvb2tpZVV0aWxzLmdldEF1dGhUb2tlbiBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZSgndmFsaWQtdG9rZW4nKTtcbiAgICAgICAgKEhlbHBlcnMuaXNUb2tlblZhbGlkIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobW9ja1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgICAgICA8L0F1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBdXRoZW50aWNhdGVkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0V4aXN0aW5nIFVzZXInKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25zIGluIHVzZXIgYW5kIHVwZGF0ZXMgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHJlbmRlcihcbiAgICAgICAgICAgIDxBdXRoUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuXG4gICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBzY3JlZW4uZ2V0QnlUZXh0KCdTaWduIEluJykuY2xpY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KENvb2tpZVV0aWxzLnNldEF1dGhUb2tlbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoSGVscGVycy5zZXRTdGF0ZVVzZXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/71/AuthProvidertest_7162ed79d6d9554131b2a055be5f39d1.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/71/AuthProvidertest_7162ed79d6d9554131b2a055be5f39d1.map deleted file mode 100644 index 9672e83..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/71/AuthProvidertest_7162ed79d6d9554131b2a055be5f39d1.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx"],"sourcesContent":["import React from 'react';\nimport { render, screen, act } from '@testing-library/react';\nimport AuthProvider from '../AuthProvider';\n\nimport useAuth from '../useAuth';\nimport * as CookieUtils from '../utils/cookie';\nimport * as Helpers from '../utils/helpers';\n\n// Mocks\njest.mock('../utils/cookie');\njest.mock('../utils/helpers');\n\nconst TestComponent = () => {\n const { isAuthenticated, user, signIn, logOut } = useAuth();\n return (\n
\n
{isAuthenticated ? 'Authenticated' : 'Not Authenticated'}
\n
{user ? user.name : 'No User'}
\n \n \n
\n );\n};\n\ndescribe('AuthProvider', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n // Default mock implementations\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue(null);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(null);\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(false);\n });\n\n it('renders children', () => {\n render(\n \n
Child Content
\n
\n );\n expect(screen.getByText('Child Content')).toBeTruthy();\n });\n\n it('initializes as not authenticated by default', () => {\n render(\n \n \n \n );\n expect(screen.getByText('Not Authenticated')).toBeTruthy();\n });\n\n it('loads user from cookies if token is valid', async () => {\n const mockUser = { name: 'Existing User' };\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue('valid-token');\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(true);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(mockUser);\n\n await act(async () => {\n render(\n \n \n \n );\n });\n\n expect(screen.getByText('Authenticated')).toBeTruthy();\n expect(screen.getByText('Existing User')).toBeTruthy();\n });\n\n it('signs in user and updates state', () => {\n render(\n \n \n \n );\n\n act(() => {\n screen.getByText('Sign In').click();\n });\n\n expect(CookieUtils.setAuthToken).toHaveBeenCalled();\n expect(Helpers.setStateUser).toHaveBeenCalled();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/77/cookietest_7709ab52686245a659849a04569b4aa8 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/77/cookietest_7709ab52686245a659849a04569b4aa8 deleted file mode 100644 index 2be0764..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/77/cookietest_7709ab52686245a659849a04569b4aa8 +++ /dev/null @@ -1,38 +0,0 @@ -4d1c7edda857341b0d21a153d6a7e5dd -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('js-cookie', () => ({ - set: jest.fn(), - get: jest.fn(), - remove: jest.fn(), -})); -const js_cookie_1 = __importDefault(require("js-cookie")); -const cookie_1 = require("../cookie"); -describe('Cookie Utils', () => { - const token = 'test-token'; - afterEach(() => { - jest.clearAllMocks(); - }); - it('should set auth token with secure flag', () => { - (0, cookie_1.setAuthToken)(token, true); - expect(js_cookie_1.default.set).toHaveBeenCalledWith('starter_auth_token', token, expect.objectContaining({ secure: true })); - }); - it('should set auth token without secure flag', () => { - (0, cookie_1.setAuthToken)(token, false); - expect(js_cookie_1.default.set).toHaveBeenCalledWith('starter_auth_token', token, expect.objectContaining({ secure: false })); - }); - it('should get auth token', () => { - js_cookie_1.default.get.mockReturnValue(token); - const result = (0, cookie_1.getAuthToken)(); - expect(js_cookie_1.default.get).toHaveBeenCalledWith('starter_auth_token'); - expect(result).toBe(token); - }); - it('should clear auth token', () => { - (0, cookie_1.clearAuthToken)(); - expect(js_cookie_1.default.remove).toHaveBeenCalledWith('starter_auth_token'); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vY29va2llLnRlc3QudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUNwQixDQUFDLENBQUMsQ0FBQztBQVBKLDBEQUFnQztBQUNoQyxzQ0FBdUU7QUFRdkUsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO0lBRTNCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLElBQUEscUJBQVksRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckgsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELElBQUEscUJBQVksRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEgsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQzVCLG1CQUFPLENBQUMsR0FBaUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFBLHVCQUFjLEdBQUUsQ0FBQztRQUNqQixNQUFNLENBQUMsbUJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vY29va2llLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IHNldEF1dGhUb2tlbiwgZ2V0QXV0aFRva2VuLCBjbGVhckF1dGhUb2tlbiB9IGZyb20gJy4uL2Nvb2tpZSc7XG5cbmplc3QubW9jaygnanMtY29va2llJywgKCkgPT4gKHtcbiAgICBzZXQ6IGplc3QuZm4oKSxcbiAgICBnZXQ6IGplc3QuZm4oKSxcbiAgICByZW1vdmU6IGplc3QuZm4oKSxcbn0pKTtcblxuZGVzY3JpYmUoJ0Nvb2tpZSBVdGlscycsICgpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9ICd0ZXN0LXRva2VuJztcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYXV0aCB0b2tlbiB3aXRoIHNlY3VyZSBmbGFnJywgKCkgPT4ge1xuICAgICAgICBzZXRBdXRoVG9rZW4odG9rZW4sIHRydWUpO1xuICAgICAgICBleHBlY3QoQ29va2llcy5zZXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdG9rZW4nLCB0b2tlbiwgZXhwZWN0Lm9iamVjdENvbnRhaW5pbmcoeyBzZWN1cmU6IHRydWUgfSkpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYXV0aCB0b2tlbiB3aXRob3V0IHNlY3VyZSBmbGFnJywgKCkgPT4ge1xuICAgICAgICBzZXRBdXRoVG9rZW4odG9rZW4sIGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KENvb2tpZXMuc2V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3Rva2VuJywgdG9rZW4sIGV4cGVjdC5vYmplY3RDb250YWluaW5nKHsgc2VjdXJlOiBmYWxzZSB9KSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGdldCBhdXRoIHRva2VuJywgKCkgPT4ge1xuICAgICAgICAoQ29va2llcy5nZXQgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUodG9rZW4pO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBnZXRBdXRoVG9rZW4oKTtcbiAgICAgICAgZXhwZWN0KENvb2tpZXMuZ2V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3Rva2VuJyk7XG4gICAgICAgIGV4cGVjdChyZXN1bHQpLnRvQmUodG9rZW4pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBjbGVhciBhdXRoIHRva2VuJywgKCkgPT4ge1xuICAgICAgICBjbGVhckF1dGhUb2tlbigpO1xuICAgICAgICBleHBlY3QoQ29va2llcy5yZW1vdmUpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdG9rZW4nKTtcbiAgICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/77/cookietest_7709ab52686245a659849a04569b4aa8.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/77/cookietest_7709ab52686245a659849a04569b4aa8.map deleted file mode 100644 index 3c5bf8f..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/77/cookietest_7709ab52686245a659849a04569b4aa8.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts","mappings":";;;;;AAGA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAPJ,0DAAgC;AAChC,sCAAuE;AAQvE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC;IAE3B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,IAAA,qBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACrH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,IAAA,qBAAY,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC5B,mBAAO,CAAC,GAAiB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC9B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,IAAA,uBAAc,GAAE,CAAC;QACjB,MAAM,CAAC,mBAAO,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts"],"sourcesContent":["import Cookies from 'js-cookie';\nimport { setAuthToken, getAuthToken, clearAuthToken } from '../cookie';\n\njest.mock('js-cookie', () => ({\n set: jest.fn(),\n get: jest.fn(),\n remove: jest.fn(),\n}));\n\ndescribe('Cookie Utils', () => {\n const token = 'test-token';\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should set auth token with secure flag', () => {\n setAuthToken(token, true);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, expect.objectContaining({ secure: true }));\n });\n\n it('should set auth token without secure flag', () => {\n setAuthToken(token, false);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, expect.objectContaining({ secure: false }));\n });\n\n it('should get auth token', () => {\n (Cookies.get as jest.Mock).mockReturnValue(token);\n const result = getAuthToken();\n expect(Cookies.get).toHaveBeenCalledWith('starter_auth_token');\n expect(result).toBe(token);\n });\n\n it('should clear auth token', () => {\n clearAuthToken();\n expect(Cookies.remove).toHaveBeenCalledWith('starter_auth_token');\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/82/cookie_828950438131d15c4bba84b4f1c5ab4f b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/82/cookie_828950438131d15c4bba84b4f1c5ab4f deleted file mode 100644 index 7f41423..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/82/cookie_828950438131d15c4bba84b4f1c5ab4f +++ /dev/null @@ -1,29 +0,0 @@ -6cd12c7fed2316d67b63a884c7cbaf9a -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.clearAuthToken = exports.getAuthToken = exports.setAuthToken = void 0; -const js_cookie_1 = __importDefault(require("js-cookie")); -const tokenName = 'starter_auth_token'; -const setAuthToken = (token, secure) => { - // Default to strict security - const isIdsProduction = process.env.NODE_ENV === 'production'; - const isSecure = typeof secure === 'boolean' ? secure : isIdsProduction; - js_cookie_1.default.set(tokenName, token, { - secure: isSecure, - sameSite: 'Strict', - expires: 7 // 7 days default - }); -}; -exports.setAuthToken = setAuthToken; -const getAuthToken = () => { - return js_cookie_1.default.get(tokenName) || null; -}; -exports.getAuthToken = getAuthToken; -const clearAuthToken = () => { - js_cookie_1.default.remove(tokenName); -}; -exports.clearAuthToken = clearAuthToken; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9jb29raWUudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQWdDO0FBRWhDLE1BQU0sU0FBUyxHQUFHLG9CQUFvQixDQUFBO0FBRXRDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFFLE1BQWUsRUFBRSxFQUFFO0lBQ3BELDZCQUE2QjtJQUM3QixNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLENBQUM7SUFDOUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUV4RSxtQkFBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFO1FBQzFCLE1BQU0sRUFBRSxRQUFRO1FBQ2hCLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLENBQUMsaUJBQWlCO0tBQy9CLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQztBQVVPLG9DQUFZO0FBUnJCLE1BQU0sWUFBWSxHQUFHLEdBQWtCLEVBQUU7SUFDckMsT0FBTyxtQkFBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBTXFCLG9DQUFZO0FBSm5DLE1BQU0sY0FBYyxHQUFHLEdBQUcsRUFBRTtJQUN4QixtQkFBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFbUMsd0NBQWMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9jb29raWUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvb2tpZXMgZnJvbSBcImpzLWNvb2tpZVwiO1xuXG5jb25zdCB0b2tlbk5hbWUgPSAnc3RhcnRlcl9hdXRoX3Rva2VuJ1xuXG5jb25zdCBzZXRBdXRoVG9rZW4gPSAodG9rZW46IHN0cmluZywgc2VjdXJlOiBib29sZWFuKSA9PiB7XG4gICAgLy8gRGVmYXVsdCB0byBzdHJpY3Qgc2VjdXJpdHlcbiAgICBjb25zdCBpc0lkc1Byb2R1Y3Rpb24gPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nO1xuICAgIGNvbnN0IGlzU2VjdXJlID0gdHlwZW9mIHNlY3VyZSA9PT0gJ2Jvb2xlYW4nID8gc2VjdXJlIDogaXNJZHNQcm9kdWN0aW9uO1xuXG4gICAgQ29va2llcy5zZXQodG9rZW5OYW1lLCB0b2tlbiwge1xuICAgICAgICBzZWN1cmU6IGlzU2VjdXJlLFxuICAgICAgICBzYW1lU2l0ZTogJ1N0cmljdCcsXG4gICAgICAgIGV4cGlyZXM6IDcgLy8gNyBkYXlzIGRlZmF1bHRcbiAgICB9KTtcbn07XG5cbmNvbnN0IGdldEF1dGhUb2tlbiA9ICgpOiBzdHJpbmcgfCBudWxsID0+IHtcbiAgICByZXR1cm4gQ29va2llcy5nZXQodG9rZW5OYW1lKSB8fCBudWxsO1xufTtcblxuY29uc3QgY2xlYXJBdXRoVG9rZW4gPSAoKSA9PiB7XG4gICAgQ29va2llcy5yZW1vdmUodG9rZW5OYW1lKTtcbn07XG5cbmV4cG9ydCB7IHNldEF1dGhUb2tlbiwgZ2V0QXV0aFRva2VuLCBjbGVhckF1dGhUb2tlbiB9Il0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/82/cookie_828950438131d15c4bba84b4f1c5ab4f.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/82/cookie_828950438131d15c4bba84b4f1c5ab4f.map deleted file mode 100644 index 4493fec..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/82/cookie_828950438131d15c4bba84b4f1c5ab4f.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts","mappings":";;;;;;AAAA,0DAAgC;AAEhC,MAAM,SAAS,GAAG,oBAAoB,CAAA;AAEtC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,MAAe,EAAE,EAAE;IACpD,6BAA6B;IAC7B,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IAC9D,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IAExE,mBAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE;QAC1B,MAAM,EAAE,QAAQ;QAChB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,CAAC,CAAC,iBAAiB;KAC/B,CAAC,CAAC;AACP,CAAC,CAAC;AAUO,oCAAY;AARrB,MAAM,YAAY,GAAG,GAAkB,EAAE;IACrC,OAAO,mBAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC;AAC1C,CAAC,CAAC;AAMqB,oCAAY;AAJnC,MAAM,cAAc,GAAG,GAAG,EAAE;IACxB,mBAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEmC,wCAAc","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts"],"sourcesContent":["import Cookies from \"js-cookie\";\n\nconst tokenName = 'starter_auth_token'\n\nconst setAuthToken = (token: string, secure: boolean) => {\n // Default to strict security\n const isIdsProduction = process.env.NODE_ENV === 'production';\n const isSecure = typeof secure === 'boolean' ? secure : isIdsProduction;\n\n Cookies.set(tokenName, token, {\n secure: isSecure,\n sameSite: 'Strict',\n expires: 7 // 7 days default\n });\n};\n\nconst getAuthToken = (): string | null => {\n return Cookies.get(tokenName) || null;\n};\n\nconst clearAuthToken = () => {\n Cookies.remove(tokenName);\n};\n\nexport { setAuthToken, getAuthToken, clearAuthToken }"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/83/errors_83909ecedce9d9c4d2db429e082275a4 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/83/errors_83909ecedce9d9c4d2db429e082275a4 deleted file mode 100644 index 52582fa..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/83/errors_83909ecedce9d9c4d2db429e082275a4 +++ /dev/null @@ -1,15 +0,0 @@ -efd340565295aa66e3592e82090f8a50 -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthError = void 0; -class AuthError extends Error { - /** - * @constructor - * @param message - Error message - */ - constructor(message) { - super(message); - } -} -exports.AuthError = AuthError; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9lcnJvcnMudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsTUFBYSxTQUFVLFNBQVEsS0FBSztJQUNsQzs7O1NBR0s7SUFDTCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQVJELDhCQVFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvZXJyb3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGNsYXNzIEF1dGhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/83/errors_83909ecedce9d9c4d2db429e082275a4.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/83/errors_83909ecedce9d9c4d2db429e082275a4.map deleted file mode 100644 index 716785f..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/83/errors_83909ecedce9d9c4d2db429e082275a4.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts","mappings":";;;AACA,MAAa,SAAU,SAAQ,KAAK;IAClC;;;SAGK;IACL,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AARD,8BAQC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts"],"sourcesContent":["\nexport class AuthError extends Error {\n /**\n * @constructor\n * @param message - Error message\n */\n constructor(message: string) {\n super(message);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/93/AuthContext_937da6c8676bbf372654f3f57c385dfa b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/93/AuthContext_937da6c8676bbf372654f3f57c385dfa deleted file mode 100644 index 9cd16cb..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/93/AuthContext_937da6c8676bbf372654f3f57c385dfa +++ /dev/null @@ -1,40 +0,0 @@ -cfa400e242c31f78bd21e7ce2dd15891 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext = React.createContext(null); -exports.default = AuthContext; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoQ29udGV4dC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUcvQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUE4QixJQUFJLENBQUMsQ0FBQztBQUUzRSxrQkFBZSxXQUFXLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoQ29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBdXRoQ29udGV4dFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQXV0aENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PEF1dGhDb250ZXh0VHlwZTxhbnk+IHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBkZWZhdWx0IEF1dGhDb250ZXh0O1xuXG5cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/93/AuthContext_937da6c8676bbf372654f3f57c385dfa.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/93/AuthContext_937da6c8676bbf372654f3f57c385dfa.map deleted file mode 100644 index 7cc14eb..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/93/AuthContext_937da6c8676bbf372654f3f57c385dfa.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAG/B,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAA8B,IAAI,CAAC,CAAC;AAE3E,kBAAe,WAAW,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts"],"sourcesContent":["import * as React from 'react';\nimport { AuthContextType } from './types';\n\nconst AuthContext = React.createContext | null>(null);\n\nexport default AuthContext;\n\n\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/a5/helperstestd_a5271216f3ac7770b6c769549f9a322d b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/a5/helperstestd_a5271216f3ac7770b6c769549f9a322d deleted file mode 100644 index 1fb1f23..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/a5/helperstestd_a5271216f3ac7770b6c769549f9a322d +++ /dev/null @@ -1 +0,0 @@ -da39a3ee5e6b4b0d3255bfef95601890 diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthContext_ac85caa4a74efeaf9b710803b5630481 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthContext_ac85caa4a74efeaf9b710803b5630481 deleted file mode 100644 index 9cd16cb..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthContext_ac85caa4a74efeaf9b710803b5630481 +++ /dev/null @@ -1,40 +0,0 @@ -cfa400e242c31f78bd21e7ce2dd15891 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext = React.createContext(null); -exports.default = AuthContext; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoQ29udGV4dC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUErQjtBQUcvQixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUE4QixJQUFJLENBQUMsQ0FBQztBQUUzRSxrQkFBZSxXQUFXLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoQ29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBdXRoQ29udGV4dFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgQXV0aENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PEF1dGhDb250ZXh0VHlwZTxhbnk+IHwgbnVsbD4obnVsbCk7XG5cbmV4cG9ydCBkZWZhdWx0IEF1dGhDb250ZXh0O1xuXG5cbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthContext_ac85caa4a74efeaf9b710803b5630481.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthContext_ac85caa4a74efeaf9b710803b5630481.map deleted file mode 100644 index 7cc14eb..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthContext_ac85caa4a74efeaf9b710803b5630481.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAG/B,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAA8B,IAAI,CAAC,CAAC;AAE3E,kBAAe,WAAW,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts"],"sourcesContent":["import * as React from 'react';\nimport { AuthContextType } from './types';\n\nconst AuthContext = React.createContext | null>(null);\n\nexport default AuthContext;\n\n\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthProvider_acf7f4ed8d2881ea38f7fad4e8a70bd5 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthProvider_acf7f4ed8d2881ea38f7fad4e8a70bd5 deleted file mode 100644 index 91f3cf1..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthProvider_acf7f4ed8d2881ea38f7fad4e8a70bd5 +++ /dev/null @@ -1,97 +0,0 @@ -b46253f39227fade70ae7ceb13892f67 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthProvider = AuthProvider; -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const helpers_1 = require("./utils/helpers"); -const cookie_1 = require("./utils/cookie"); -function AuthProvider({ children }) { - const [authUser, setAuthUser] = React.useState(null); - const [isLoading, setLoading] = React.useState(true); - const logOut = React.useCallback((redirectPath) => { - (0, helpers_1.deleteStateUser)(); - setAuthUser(null); - if (typeof window !== 'undefined' && redirectPath !== null) { - window.location.href = redirectPath || '/'; - } - }, []); - React.useEffect(() => { - async function loadUserFromCookies() { - try { - const token = (0, cookie_1.getAuthToken)(); - if (token) { - if ((0, helpers_1.isTokenValid)(token)) { - const user = (0, helpers_1.getStateUser)(); - setAuthUser(user); - } - else { - logOut(null); // Logout without redirect during init - } - } - } - catch (error) { - console.error('Failed to load auth state:', error); - } - finally { - setLoading(false); - } - } - loadUserFromCookies(); - }, [logOut]); - const signIn = React.useCallback((state) => { - if (state === null || state === void 0 ? void 0 : state.token) { - const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:'; - (0, cookie_1.setAuthToken)(state.token, isSecure); - const user = state.user || { name: 'Anonymous' }; - (0, helpers_1.setStateUser)(user); - setAuthUser(user); - } - }, []); - const value = React.useMemo(() => ({ - isLoading, - isAuthenticated: !!authUser, - user: authUser, - signIn, - logOut, - }), [isLoading, authUser, signIn, logOut]); - return (React.createElement(AuthContext_1.default.Provider, { value: value }, children)); -} -exports.default = AuthProvider; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoUHJvdmlkZXIudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0Esb0NBeURDO0FBcEVELDZDQUErQjtBQUUvQixnRUFBd0M7QUFDeEMsNkNBQTRGO0FBQzVGLDJDQUE0RDtBQU81RCxTQUFnQixZQUFZLENBQThCLEVBQUUsUUFBUSxFQUFxQjtJQUN2RixNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQWUsSUFBSSxDQUFDLENBQUM7SUFDbkUsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFxQixFQUFFLEVBQUU7UUFDekQsSUFBQSx5QkFBZSxHQUFFLENBQUM7UUFDbEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLElBQUksR0FBRyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNuQixLQUFLLFVBQVUsbUJBQW1CO1lBQ2hDLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztnQkFDN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixJQUFJLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksR0FBRyxJQUFBLHNCQUFZLEdBQVMsQ0FBQzt3QkFDbkMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxDQUFDLElBQVcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO29CQUM3RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFDRCxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFYixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBZ0MsRUFBRSxFQUFFO1FBQ3BFLElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7WUFDeEYsSUFBQSxxQkFBWSxFQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQXVCLENBQUM7WUFDdkUsSUFBQSxzQkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLFNBQVM7UUFDVCxlQUFlLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDM0IsSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNO1FBQ04sTUFBTTtLQUNQLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFM0MsT0FBTyxDQUNMLG9CQUFDLHFCQUFXLENBQUMsUUFBUSxJQUFDLEtBQUssRUFBRSxLQUFLLElBQy9CLFFBQVEsQ0FDWSxDQUN4QixDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUFlLFlBQVksQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL0F1dGhQcm92aWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0aENvbnRleHQgZnJvbSAnLi9BdXRoQ29udGV4dCc7XG5pbXBvcnQgeyBkZWxldGVTdGF0ZVVzZXIsIGdldFN0YXRlVXNlciwgaXNUb2tlblZhbGlkLCBzZXRTdGF0ZVVzZXIgfSBmcm9tICcuL3V0aWxzL2hlbHBlcnMnO1xuaW1wb3J0IHsgc2V0QXV0aFRva2VuLCBnZXRBdXRoVG9rZW4gfSBmcm9tICcuL3V0aWxzL2Nvb2tpZSc7XG5pbXBvcnQgeyBBdXRoU3RhdGVJbnRlcmZhY2UgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXI8VFVzZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7IGNoaWxkcmVuIH06IEF1dGhQcm92aWRlclByb3BzKSB7XG4gIGNvbnN0IFthdXRoVXNlciwgc2V0QXV0aFVzZXJdID0gUmVhY3QudXNlU3RhdGU8VFVzZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0TG9hZGluZ10gPSBSZWFjdC51c2VTdGF0ZSh0cnVlKTtcblxuICBjb25zdCBsb2dPdXQgPSBSZWFjdC51c2VDYWxsYmFjaygocmVkaXJlY3RQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgc2V0QXV0aFVzZXIobnVsbCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHJlZGlyZWN0UGF0aCAhPT0gbnVsbCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZWRpcmVjdFBhdGggfHwgJy8nO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZFVzZXJGcm9tQ29va2llcygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgIGlmIChpc1Rva2VuVmFsaWQodG9rZW4pKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZ2V0U3RhdGVVc2VyPFRVc2VyPigpO1xuICAgICAgICAgICAgc2V0QXV0aFVzZXIodXNlcik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ091dChudWxsIGFzIGFueSk7IC8vIExvZ291dCB3aXRob3V0IHJlZGlyZWN0IGR1cmluZyBpbml0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBhdXRoIHN0YXRlOicsIGVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICBsb2FkVXNlckZyb21Db29raWVzKCk7XG4gIH0sIFtsb2dPdXRdKTtcblxuICBjb25zdCBzaWduSW4gPSBSZWFjdC51c2VDYWxsYmFjaygoc3RhdGU6IEF1dGhTdGF0ZUludGVyZmFjZTxUVXNlcj4pID0+IHtcbiAgICBpZiAoc3RhdGU/LnRva2VuKSB7XG4gICAgICBjb25zdCBpc1NlY3VyZSA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5sb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgICBzZXRBdXRoVG9rZW4oc3RhdGUudG9rZW4sIGlzU2VjdXJlKTtcblxuICAgICAgY29uc3QgdXNlciA9IHN0YXRlLnVzZXIgfHwgKHsgbmFtZTogJ0Fub255bW91cycgfSBhcyB1bmtub3duIGFzIFRVc2VyKTtcbiAgICAgIHNldFN0YXRlVXNlcih1c2VyKTtcbiAgICAgIHNldEF1dGhVc2VyKHVzZXIpO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIGNvbnN0IHZhbHVlID0gUmVhY3QudXNlTWVtbygoKSA9PiAoe1xuICAgIGlzTG9hZGluZyxcbiAgICBpc0F1dGhlbnRpY2F0ZWQ6ICEhYXV0aFVzZXIsXG4gICAgdXNlcjogYXV0aFVzZXIsXG4gICAgc2lnbkluLFxuICAgIGxvZ091dCxcbiAgfSksIFtpc0xvYWRpbmcsIGF1dGhVc2VyLCBzaWduSW4sIGxvZ091dF0pO1xuXG4gIHJldHVybiAoXG4gICAgPEF1dGhDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9BdXRoQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgQXV0aFByb3ZpZGVyO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthProvider_acf7f4ed8d2881ea38f7fad4e8a70bd5.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthProvider_acf7f4ed8d2881ea38f7fad4e8a70bd5.map deleted file mode 100644 index fcf34de..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ac/AuthProvider_acf7f4ed8d2881ea38f7fad4e8a70bd5.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,oCAyDC;AApED,6CAA+B;AAE/B,gEAAwC;AACxC,6CAA4F;AAC5F,2CAA4D;AAO5D,SAAgB,YAAY,CAA8B,EAAE,QAAQ,EAAqB;IACvF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAe,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,YAAqB,EAAE,EAAE;QACzD,IAAA,yBAAe,GAAE,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,IAAI,GAAG,CAAC;QAC7C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,mBAAmB;YAChC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAA,qBAAY,GAAE,CAAC;gBAC7B,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,IAAA,sBAAY,EAAC,KAAK,CAAC,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,IAAA,sBAAY,GAAS,CAAC;wBACnC,WAAW,CAAC,IAAI,CAAC,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAW,CAAC,CAAC,CAAC,sCAAsC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,mBAAmB,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAgC,EAAE,EAAE;QACpE,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;YACxF,IAAA,qBAAY,EAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAK,EAAE,IAAI,EAAE,WAAW,EAAuB,CAAC;YACvE,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,SAAS;QACT,eAAe,EAAE,CAAC,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,MAAM;KACP,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3C,OAAO,CACL,oBAAC,qBAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAC/B,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC;AAED,kBAAe,YAAY,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport AuthContext from './AuthContext';\nimport { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers';\nimport { setAuthToken, getAuthToken } from './utils/cookie';\nimport { AuthStateInterface } from './types';\n\nexport interface AuthProviderProps {\n children: React.ReactNode;\n}\n\nexport function AuthProvider>({ children }: AuthProviderProps) {\n const [authUser, setAuthUser] = React.useState(null);\n const [isLoading, setLoading] = React.useState(true);\n\n const logOut = React.useCallback((redirectPath?: string) => {\n deleteStateUser();\n setAuthUser(null);\n if (typeof window !== 'undefined' && redirectPath !== null) {\n window.location.href = redirectPath || '/';\n }\n }, []);\n\n React.useEffect(() => {\n async function loadUserFromCookies() {\n try {\n const token = getAuthToken();\n if (token) {\n if (isTokenValid(token)) {\n const user = getStateUser();\n setAuthUser(user);\n } else {\n logOut(null as any); // Logout without redirect during init\n }\n }\n } catch (error) {\n console.error('Failed to load auth state:', error);\n } finally {\n setLoading(false);\n }\n }\n loadUserFromCookies();\n }, [logOut]);\n\n const signIn = React.useCallback((state: AuthStateInterface) => {\n if (state?.token) {\n const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:';\n setAuthToken(state.token, isSecure);\n\n const user = state.user || ({ name: 'Anonymous' } as unknown as TUser);\n setStateUser(user);\n setAuthUser(user);\n }\n }, []);\n\n const value = React.useMemo(() => ({\n isLoading,\n isAuthenticated: !!authUser,\n user: authUser,\n signIn,\n logOut,\n }), [isLoading, authUser, signIn, logOut]);\n\n return (\n \n {children}\n \n );\n}\n\nexport default AuthProvider;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b2/errors_b2837c86dd5dcd830200db7ea8e4fa03 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b2/errors_b2837c86dd5dcd830200db7ea8e4fa03 deleted file mode 100644 index 52582fa..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b2/errors_b2837c86dd5dcd830200db7ea8e4fa03 +++ /dev/null @@ -1,15 +0,0 @@ -efd340565295aa66e3592e82090f8a50 -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthError = void 0; -class AuthError extends Error { - /** - * @constructor - * @param message - Error message - */ - constructor(message) { - super(message); - } -} -exports.AuthError = AuthError; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9lcnJvcnMudHMiLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsTUFBYSxTQUFVLFNBQVEsS0FBSztJQUNsQzs7O1NBR0s7SUFDTCxZQUFZLE9BQWU7UUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2pCLENBQUM7Q0FDRjtBQVJELDhCQVFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvZXJyb3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGNsYXNzIEF1dGhFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgLyoqXG4gICAgICogQGNvbnN0cnVjdG9yXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgLSBFcnJvciBtZXNzYWdlXG4gICAgICovXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICB9XG59XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b2/errors_b2837c86dd5dcd830200db7ea8e4fa03.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b2/errors_b2837c86dd5dcd830200db7ea8e4fa03.map deleted file mode 100644 index 716785f..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b2/errors_b2837c86dd5dcd830200db7ea8e4fa03.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts","mappings":";;;AACA,MAAa,SAAU,SAAQ,KAAK;IAClC;;;SAGK;IACL,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AARD,8BAQC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts"],"sourcesContent":["\nexport class AuthError extends Error {\n /**\n * @constructor\n * @param message - Error message\n */\n constructor(message: string) {\n super(message);\n }\n}\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b4/AuthProvidertest_b4ed171313a88c2e99d74fbd068c2780 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b4/AuthProvidertest_b4ed171313a88c2e99d74fbd068c2780 deleted file mode 100644 index b59c001..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b4/AuthProvidertest_b4ed171313a88c2e99d74fbd068c2780 +++ /dev/null @@ -1,97 +0,0 @@ -5ffe24ee51bab0488fe4bfc1b1ca8b28 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// Mocks -jest.mock('../utils/cookie'); -jest.mock('../utils/helpers'); -const react_1 = __importDefault(require("react")); -const react_2 = require("@testing-library/react"); -const AuthProvider_1 = __importDefault(require("../AuthProvider")); -const useAuth_1 = __importDefault(require("../useAuth")); -const CookieUtils = __importStar(require("../utils/cookie")); -const Helpers = __importStar(require("../utils/helpers")); -const TestComponent = () => { - const { isAuthenticated, user, signIn, logOut } = (0, useAuth_1.default)(); - return (react_1.default.createElement("div", null, - react_1.default.createElement("div", { "data-testid": "auth-status" }, isAuthenticated ? 'Authenticated' : 'Not Authenticated'), - react_1.default.createElement("div", { "data-testid": "user-name" }, user ? user.name : 'No User'), - react_1.default.createElement("button", { onClick: () => signIn({ token: 'new-token', user: { name: 'New User', email: 'new@example.com' } }) }, "Sign In"), - react_1.default.createElement("button", { onClick: () => logOut() }, "Log Out"))); -}; -describe('AuthProvider', () => { - beforeEach(() => { - jest.clearAllMocks(); - // Default mock implementations - CookieUtils.getAuthToken.mockReturnValue(null); - Helpers.getStateUser.mockReturnValue(null); - Helpers.isTokenValid.mockReturnValue(false); - }); - it('renders children', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement("div", null, "Child Content"))); - expect(react_2.screen.getByText('Child Content')).toBeTruthy(); - }); - it('initializes as not authenticated by default', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - expect(react_2.screen.getByText('Not Authenticated')).toBeTruthy(); - }); - it('loads user from cookies if token is valid', async () => { - const mockUser = { name: 'Existing User' }; - CookieUtils.getAuthToken.mockReturnValue('valid-token'); - Helpers.isTokenValid.mockReturnValue(true); - Helpers.getStateUser.mockReturnValue(mockUser); - await (0, react_2.act)(async () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - }); - expect(react_2.screen.getByText('Authenticated')).toBeTruthy(); - expect(react_2.screen.getByText('Existing User')).toBeTruthy(); - }); - it('signs in user and updates state', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - (0, react_2.act)(() => { - react_2.screen.getByText('Sign In').click(); - }); - expect(CookieUtils.setAuthToken).toHaveBeenCalled(); - expect(Helpers.setStateUser).toHaveBeenCalled(); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9fX3Rlc3RzX18vQXV0aFByb3ZpZGVyLnRlc3QudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsUUFBUTtBQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFWOUIsa0RBQTBCO0FBQzFCLGtEQUE2RDtBQUM3RCxtRUFBMkM7QUFFM0MseURBQWlDO0FBQ2pDLDZEQUErQztBQUMvQywwREFBNEM7QUFNNUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUM1RCxPQUFPLENBQ0g7UUFDSSxzREFBaUIsYUFBYSxJQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBTztRQUM5RixzREFBaUIsV0FBVyxJQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFPO1FBQ2pFLDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxjQUVsRztRQUNULDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBa0IsQ0FDL0MsQ0FDVCxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQiwrQkFBK0I7UUFDOUIsV0FBVyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsMkRBQXdCLENBQ2IsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsOEJBQUMsYUFBYSxPQUFHLENBQ04sQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMxQyxXQUFXLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUEsV0FBRyxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO2dCQUNULDhCQUFDLGFBQWEsT0FBRyxDQUNOLENBQ2xCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDdkMsSUFBQSxjQUFNLEVBQ0YsOEJBQUMsc0JBQVk7WUFDVCw4QkFBQyxhQUFhLE9BQUcsQ0FDTixDQUNsQixDQUFDO1FBRUYsSUFBQSxXQUFHLEVBQUMsR0FBRyxFQUFFO1lBQ0wsY0FBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL19fdGVzdHNfXy9BdXRoUHJvdmlkZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuLCBhY3QgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBBdXRoUHJvdmlkZXIgZnJvbSAnLi4vQXV0aFByb3ZpZGVyJztcblxuaW1wb3J0IHVzZUF1dGggZnJvbSAnLi4vdXNlQXV0aCc7XG5pbXBvcnQgKiBhcyBDb29raWVVdGlscyBmcm9tICcuLi91dGlscy9jb29raWUnO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcblxuLy8gTW9ja3Ncbmplc3QubW9jaygnLi4vdXRpbHMvY29va2llJyk7XG5qZXN0Lm1vY2soJy4uL3V0aWxzL2hlbHBlcnMnKTtcblxuY29uc3QgVGVzdENvbXBvbmVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGlzQXV0aGVudGljYXRlZCwgdXNlciwgc2lnbkluLCBsb2dPdXQgfSA9IHVzZUF1dGgoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImF1dGgtc3RhdHVzXCI+e2lzQXV0aGVudGljYXRlZCA/ICdBdXRoZW50aWNhdGVkJyA6ICdOb3QgQXV0aGVudGljYXRlZCd9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidXNlci1uYW1lXCI+e3VzZXIgPyB1c2VyLm5hbWUgOiAnTm8gVXNlcid9PC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNpZ25Jbih7IHRva2VuOiAnbmV3LXRva2VuJywgdXNlcjogeyBuYW1lOiAnTmV3IFVzZXInLCBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScgfSB9KX0+XG4gICAgICAgICAgICAgICAgU2lnbiBJblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGxvZ091dCgpfT5Mb2cgT3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5kZXNjcmliZSgnQXV0aFByb3ZpZGVyJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICAgICAgLy8gRGVmYXVsdCBtb2NrIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAoQ29va2llVXRpbHMuZ2V0QXV0aFRva2VuIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKG51bGwpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobnVsbCk7XG4gICAgICAgIChIZWxwZXJzLmlzVG9rZW5WYWxpZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8ZGl2PkNoaWxkIENvbnRlbnQ8L2Rpdj5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuICAgICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ2hpbGQgQ29udGVudCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZXMgYXMgbm90IGF1dGhlbnRpY2F0ZWQgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8VGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgICAgPC9BdXRoUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdOb3QgQXV0aGVudGljYXRlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9hZHMgdXNlciBmcm9tIGNvb2tpZXMgaWYgdG9rZW4gaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBuYW1lOiAnRXhpc3RpbmcgVXNlcicgfTtcbiAgICAgICAgKENvb2tpZVV0aWxzLmdldEF1dGhUb2tlbiBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZSgndmFsaWQtdG9rZW4nKTtcbiAgICAgICAgKEhlbHBlcnMuaXNUb2tlblZhbGlkIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobW9ja1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgICAgICA8L0F1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBdXRoZW50aWNhdGVkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0V4aXN0aW5nIFVzZXInKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25zIGluIHVzZXIgYW5kIHVwZGF0ZXMgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHJlbmRlcihcbiAgICAgICAgICAgIDxBdXRoUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuXG4gICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBzY3JlZW4uZ2V0QnlUZXh0KCdTaWduIEluJykuY2xpY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KENvb2tpZVV0aWxzLnNldEF1dGhUb2tlbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoSGVscGVycy5zZXRTdGF0ZVVzZXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b4/AuthProvidertest_b4ed171313a88c2e99d74fbd068c2780.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b4/AuthProvidertest_b4ed171313a88c2e99d74fbd068c2780.map deleted file mode 100644 index 9672e83..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/b4/AuthProvidertest_b4ed171313a88c2e99d74fbd068c2780.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx"],"sourcesContent":["import React from 'react';\nimport { render, screen, act } from '@testing-library/react';\nimport AuthProvider from '../AuthProvider';\n\nimport useAuth from '../useAuth';\nimport * as CookieUtils from '../utils/cookie';\nimport * as Helpers from '../utils/helpers';\n\n// Mocks\njest.mock('../utils/cookie');\njest.mock('../utils/helpers');\n\nconst TestComponent = () => {\n const { isAuthenticated, user, signIn, logOut } = useAuth();\n return (\n
\n
{isAuthenticated ? 'Authenticated' : 'Not Authenticated'}
\n
{user ? user.name : 'No User'}
\n \n \n
\n );\n};\n\ndescribe('AuthProvider', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n // Default mock implementations\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue(null);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(null);\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(false);\n });\n\n it('renders children', () => {\n render(\n \n
Child Content
\n
\n );\n expect(screen.getByText('Child Content')).toBeTruthy();\n });\n\n it('initializes as not authenticated by default', () => {\n render(\n \n \n \n );\n expect(screen.getByText('Not Authenticated')).toBeTruthy();\n });\n\n it('loads user from cookies if token is valid', async () => {\n const mockUser = { name: 'Existing User' };\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue('valid-token');\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(true);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(mockUser);\n\n await act(async () => {\n render(\n \n \n \n );\n });\n\n expect(screen.getByText('Authenticated')).toBeTruthy();\n expect(screen.getByText('Existing User')).toBeTruthy();\n });\n\n it('signs in user and updates state', () => {\n render(\n \n \n \n );\n\n act(() => {\n screen.getByText('Sign In').click();\n });\n\n expect(CookieUtils.setAuthToken).toHaveBeenCalled();\n expect(Helpers.setStateUser).toHaveBeenCalled();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ca/helperstest_cae697be71c5e70d922e3c19be597bf0 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ca/helperstest_cae697be71c5e70d922e3c19be597bf0 deleted file mode 100644 index 97d92a4..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ca/helperstest_cae697be71c5e70d922e3c19be597bf0 +++ /dev/null @@ -1,99 +0,0 @@ -77ef7775992cb2632435a0ae3ebf9363 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('../cookie', () => ({ - getAuthToken: jest.fn(), - clearAuthToken: jest.fn(), -})); -const helpers_1 = require("../helpers"); -const CookieUtils = __importStar(require("../cookie")); -describe('Helper Utils', () => { - const mockUser = { name: 'Test User', email: 'test@example.com' }; - beforeEach(() => { - jest.clearAllMocks(); - Object.defineProperty(window, 'localStorage', { - value: { - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), - }, - writable: true, - }); - }); - describe('User State Persistence', () => { - it('should set user state in localStorage', () => { - (0, helpers_1.setStateUser)(mockUser); - expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser)); - }); - it('should get user state from localStorage', () => { - window.localStorage.getItem.mockReturnValue(JSON.stringify(mockUser)); - const user = (0, helpers_1.getStateUser)(); - expect(user).toEqual(mockUser); - }); - it('should delete user state', () => { - (0, helpers_1.deleteStateUser)(); - expect(CookieUtils.clearAuthToken).toHaveBeenCalled(); - expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user'); - }); - }); - describe('isTokenValid', () => { - it('should return true for valid non-expired token', () => { - const futureTime = Math.floor(Date.now() / 1000) + 3600; - const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(validToken)).toBe(true); - }); - it('should return false for expired token', () => { - const pastTime = Math.floor(Date.now() / 1000) - 3600; - const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(expiredToken)).toBe(false); - }); - it('should return false for null/empty token', () => { - expect((0, helpers_1.isTokenValid)('')).toBe(false); - // @ts-ignore - expect((0, helpers_1.isTokenValid)(null)).toBe(false); - }); - it('should handle malformed token gracefully (currently crashes, needs fix)', () => { - // This test documents current behavior or expected fix - try { - expect((0, helpers_1.isTokenValid)('malformed.token')).toBe(false); - } - catch (e) { - // Expected to throw in current implementation - } - }); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUM1QixDQUFDLENBQUMsQ0FBQztBQU5KLHdDQUF1RjtBQUN2Rix1REFBeUM7QUFPekMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBRWxFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1lBQzFDLEtBQUssRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO2FBQ3hCO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDN0MsSUFBQSxzQkFBWSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG1C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Y3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzVG9rZW5WYWxpZCwgZ2V0U3RhdGVVc2VyLCBzZXRTdGF0ZVVzZXIsIGRlbGV0ZVN0YXRlVXNlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgQ29va2llVXRpbHMgZnJvbSAnLi4vY29va2llJztcblxuamVzdC5tb2NrKCcuLi9jb29raWUnLCAoKSA9PiAoe1xuICAgIGdldEF1dGhUb2tlbjogamVzdC5mbigpLFxuICAgIGNsZWFyQXV0aFRva2VuOiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdIZWxwZXIgVXRpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1VzZXIgPSB7IG5hbWU6ICdUZXN0IFVzZXInLCBlbWFpbDogJ3Rlc3RAZXhhbXBsZS5jb20nIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIGdldEl0ZW06IGplc3QuZm4oKSxcbiAgICAgICAgICAgICAgICBzZXRJdGVtOiBqZXN0LmZuKCksXG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbTogamVzdC5mbigpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVc2VyIFN0YXRlIFBlcnNpc3RlbmNlJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHNldCB1c2VyIHN0YXRlIGluIGxvY2FsU3RvcmFnZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlVXNlcihtb2NrVXNlcik7XG4gICAgICAgICAgICBleHBlY3Qod2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3VzZXInLCBKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGdldCB1c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlJywgKCkgPT4ge1xuICAgICAgICAgICAgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGdldFN0YXRlVXNlcigpO1xuICAgICAgICAgICAgZXhwZWN0KHVzZXIpLnRvRXF1YWwobW9ja1VzZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGRlbGV0ZSB1c2VyIHN0YXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgICAgICAgICBleHBlY3QoQ29va2llVXRpbHMuY2xlYXJBdXRoVG9rZW4pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICAgIGV4cGVjdCh3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdXNlcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpc1Rva2VuVmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIG5vbi1leHBpcmVkIHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnV0dXJlVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzYwMDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkVG9rZW4gPSBgaGVhZGVyLiR7YnRvYShKU09OLnN0cmluZ2lmeSh7IGV4cDogZnV0dXJlVGltZSB9KSl9LnNpZ25hdHVyZWA7XG4gICAgICAgICAgICBleHBlY3QoaXNUb2tlblZhbGlkKHZhbGlkVG9rZW4pKS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgZXhwaXJlZCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3RUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgLSAzNjAwO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlZFRva2VuID0gYGhlYWRlci4ke2J0b2EoSlNPTi5zdHJpbmdpZnkoeyBleHA6IHBhc3RUaW1lIH0pKX0uc2lnbmF0dXJlYDtcbiAgICAgICAgICAgIGV4cGVjdChpc1Rva2VuVmFsaWQoZXhwaXJlZFRva2VuKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBudWxsL2VtcHR5IHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZChudWxsKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG1hbGZvcm1lZCB0b2tlbiBncmFjZWZ1bGx5IChjdXJyZW50bHkgY3Jhc2hlcywgbmVlZHMgZml4KScsICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBkb2N1bWVudHMgY3VycmVudCBiZWhhdmlvciBvciBleHBlY3RlZCBmaXhcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnbWFsZm9ybWVkLnRva2VuJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIHRvIHRocm93IGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ca/helperstest_cae697be71c5e70d922e3c19be597bf0.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ca/helperstest_cae697be71c5e70d922e3c19be597bf0.map deleted file mode 100644 index 192dec8..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ca/helperstest_cae697be71c5e70d922e3c19be597bf0.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts"],"sourcesContent":["import { isTokenValid, getStateUser, setStateUser, deleteStateUser } from '../helpers';\nimport * as CookieUtils from '../cookie';\n\njest.mock('../cookie', () => ({\n getAuthToken: jest.fn(),\n clearAuthToken: jest.fn(),\n}));\n\ndescribe('Helper Utils', () => {\n const mockUser = { name: 'Test User', email: 'test@example.com' };\n\n beforeEach(() => {\n jest.clearAllMocks();\n Object.defineProperty(window, 'localStorage', {\n value: {\n getItem: jest.fn(),\n setItem: jest.fn(),\n removeItem: jest.fn(),\n },\n writable: true,\n });\n });\n\n describe('User State Persistence', () => {\n it('should set user state in localStorage', () => {\n setStateUser(mockUser);\n expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser));\n });\n\n it('should get user state from localStorage', () => {\n (window.localStorage.getItem as jest.Mock).mockReturnValue(JSON.stringify(mockUser));\n const user = getStateUser();\n expect(user).toEqual(mockUser);\n });\n\n it('should delete user state', () => {\n deleteStateUser();\n expect(CookieUtils.clearAuthToken).toHaveBeenCalled();\n expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user');\n });\n });\n\n describe('isTokenValid', () => {\n it('should return true for valid non-expired token', () => {\n const futureTime = Math.floor(Date.now() / 1000) + 3600;\n const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`;\n expect(isTokenValid(validToken)).toBe(true);\n });\n\n it('should return false for expired token', () => {\n const pastTime = Math.floor(Date.now() / 1000) - 3600;\n const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`;\n expect(isTokenValid(expiredToken)).toBe(false);\n });\n\n it('should return false for null/empty token', () => {\n expect(isTokenValid('')).toBe(false);\n // @ts-ignore\n expect(isTokenValid(null)).toBe(false);\n });\n\n it('should handle malformed token gracefully (currently crashes, needs fix)', () => {\n // This test documents current behavior or expected fix\n try {\n expect(isTokenValid('malformed.token')).toBe(false);\n } catch (e) {\n // Expected to throw in current implementation\n }\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/cb/helperstest_cbd787b945a744affe59240076fb65ed b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/cb/helperstest_cbd787b945a744affe59240076fb65ed deleted file mode 100644 index 97d92a4..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/cb/helperstest_cbd787b945a744affe59240076fb65ed +++ /dev/null @@ -1,99 +0,0 @@ -77ef7775992cb2632435a0ae3ebf9363 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('../cookie', () => ({ - getAuthToken: jest.fn(), - clearAuthToken: jest.fn(), -})); -const helpers_1 = require("../helpers"); -const CookieUtils = __importStar(require("../cookie")); -describe('Helper Utils', () => { - const mockUser = { name: 'Test User', email: 'test@example.com' }; - beforeEach(() => { - jest.clearAllMocks(); - Object.defineProperty(window, 'localStorage', { - value: { - getItem: jest.fn(), - setItem: jest.fn(), - removeItem: jest.fn(), - }, - writable: true, - }); - }); - describe('User State Persistence', () => { - it('should set user state in localStorage', () => { - (0, helpers_1.setStateUser)(mockUser); - expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser)); - }); - it('should get user state from localStorage', () => { - window.localStorage.getItem.mockReturnValue(JSON.stringify(mockUser)); - const user = (0, helpers_1.getStateUser)(); - expect(user).toEqual(mockUser); - }); - it('should delete user state', () => { - (0, helpers_1.deleteStateUser)(); - expect(CookieUtils.clearAuthToken).toHaveBeenCalled(); - expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user'); - }); - }); - describe('isTokenValid', () => { - it('should return true for valid non-expired token', () => { - const futureTime = Math.floor(Date.now() / 1000) + 3600; - const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(validToken)).toBe(true); - }); - it('should return false for expired token', () => { - const pastTime = Math.floor(Date.now() / 1000) - 3600; - const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`; - expect((0, helpers_1.isTokenValid)(expiredToken)).toBe(false); - }); - it('should return false for null/empty token', () => { - expect((0, helpers_1.isTokenValid)('')).toBe(false); - // @ts-ignore - expect((0, helpers_1.isTokenValid)(null)).toBe(false); - }); - it('should handle malformed token gracefully (currently crashes, needs fix)', () => { - // This test documents current behavior or expected fix - try { - expect((0, helpers_1.isTokenValid)('malformed.token')).toBe(false); - } - catch (e) { - // Expected to throw in current implementation - } - }); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0EsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixZQUFZLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtJQUN2QixjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUM1QixDQUFDLENBQUMsQ0FBQztBQU5KLHdDQUF1RjtBQUN2Rix1REFBeUM7QUFPekMsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxRQUFRLEdBQUcsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBRWxFLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFO1lBQzFDLEtBQUssRUFBRTtnQkFDSCxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO2FBQ3hCO1lBQ0QsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLEVBQUUsQ0FBQyx1Q0FBdUMsRUFBRSxHQUFHLEVBQUU7WUFDN0MsSUFBQSxzQkFBWSxFQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG1C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Y3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vaGVscGVycy50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzVG9rZW5WYWxpZCwgZ2V0U3RhdGVVc2VyLCBzZXRTdGF0ZVVzZXIsIGRlbGV0ZVN0YXRlVXNlciB9IGZyb20gJy4uL2hlbHBlcnMnO1xuaW1wb3J0ICogYXMgQ29va2llVXRpbHMgZnJvbSAnLi4vY29va2llJztcblxuamVzdC5tb2NrKCcuLi9jb29raWUnLCAoKSA9PiAoe1xuICAgIGdldEF1dGhUb2tlbjogamVzdC5mbigpLFxuICAgIGNsZWFyQXV0aFRva2VuOiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdIZWxwZXIgVXRpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgbW9ja1VzZXIgPSB7IG5hbWU6ICdUZXN0IFVzZXInLCBlbWFpbDogJ3Rlc3RAZXhhbXBsZS5jb20nIH07XG5cbiAgICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICAgICAgamVzdC5jbGVhckFsbE1vY2tzKCk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csICdsb2NhbFN0b3JhZ2UnLCB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgIGdldEl0ZW06IGplc3QuZm4oKSxcbiAgICAgICAgICAgICAgICBzZXRJdGVtOiBqZXN0LmZuKCksXG4gICAgICAgICAgICAgICAgcmVtb3ZlSXRlbTogamVzdC5mbigpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdVc2VyIFN0YXRlIFBlcnNpc3RlbmNlJywgKCkgPT4ge1xuICAgICAgICBpdCgnc2hvdWxkIHNldCB1c2VyIHN0YXRlIGluIGxvY2FsU3RvcmFnZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFN0YXRlVXNlcihtb2NrVXNlcik7XG4gICAgICAgICAgICBleHBlY3Qod2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3VzZXInLCBKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGdldCB1c2VyIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlJywgKCkgPT4ge1xuICAgICAgICAgICAgKHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShKU09OLnN0cmluZ2lmeShtb2NrVXNlcikpO1xuICAgICAgICAgICAgY29uc3QgdXNlciA9IGdldFN0YXRlVXNlcigpO1xuICAgICAgICAgICAgZXhwZWN0KHVzZXIpLnRvRXF1YWwobW9ja1VzZXIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIGRlbGV0ZSB1c2VyIHN0YXRlJywgKCkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgICAgICAgICBleHBlY3QoQ29va2llVXRpbHMuY2xlYXJBdXRoVG9rZW4pLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICAgICAgICAgIGV4cGVjdCh3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdXNlcicpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGRlc2NyaWJlKCdpc1Rva2VuVmFsaWQnLCAoKSA9PiB7XG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIHRydWUgZm9yIHZhbGlkIG5vbi1leHBpcmVkIHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZnV0dXJlVGltZSA9IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgMzYwMDtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkVG9rZW4gPSBgaGVhZGVyLiR7YnRvYShKU09OLnN0cmluZ2lmeSh7IGV4cDogZnV0dXJlVGltZSB9KSl9LnNpZ25hdHVyZWA7XG4gICAgICAgICAgICBleHBlY3QoaXNUb2tlblZhbGlkKHZhbGlkVG9rZW4pKS50b0JlKHRydWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpdCgnc2hvdWxkIHJldHVybiBmYWxzZSBmb3IgZXhwaXJlZCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBhc3RUaW1lID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkgLSAzNjAwO1xuICAgICAgICAgICAgY29uc3QgZXhwaXJlZFRva2VuID0gYGhlYWRlci4ke2J0b2EoSlNPTi5zdHJpbmdpZnkoeyBleHA6IHBhc3RUaW1lIH0pKX0uc2lnbmF0dXJlYDtcbiAgICAgICAgICAgIGV4cGVjdChpc1Rva2VuVmFsaWQoZXhwaXJlZFRva2VuKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgcmV0dXJuIGZhbHNlIGZvciBudWxsL2VtcHR5IHRva2VuJywgKCkgPT4ge1xuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZChudWxsKSkudG9CZShmYWxzZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGl0KCdzaG91bGQgaGFuZGxlIG1hbGZvcm1lZCB0b2tlbiBncmFjZWZ1bGx5IChjdXJyZW50bHkgY3Jhc2hlcywgbmVlZHMgZml4KScsICgpID0+IHtcbiAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBkb2N1bWVudHMgY3VycmVudCBiZWhhdmlvciBvciBleHBlY3RlZCBmaXhcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZXhwZWN0KGlzVG9rZW5WYWxpZCgnbWFsZm9ybWVkLnRva2VuJykpLnRvQmUoZmFsc2UpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIHRvIHRocm93IGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/cb/helperstest_cbd787b945a744affe59240076fb65ed.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/cb/helperstest_cbd787b945a744affe59240076fb65ed.map deleted file mode 100644 index 192dec8..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/cb/helperstest_cbd787b945a744affe59240076fb65ed.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts"],"sourcesContent":["import { isTokenValid, getStateUser, setStateUser, deleteStateUser } from '../helpers';\nimport * as CookieUtils from '../cookie';\n\njest.mock('../cookie', () => ({\n getAuthToken: jest.fn(),\n clearAuthToken: jest.fn(),\n}));\n\ndescribe('Helper Utils', () => {\n const mockUser = { name: 'Test User', email: 'test@example.com' };\n\n beforeEach(() => {\n jest.clearAllMocks();\n Object.defineProperty(window, 'localStorage', {\n value: {\n getItem: jest.fn(),\n setItem: jest.fn(),\n removeItem: jest.fn(),\n },\n writable: true,\n });\n });\n\n describe('User State Persistence', () => {\n it('should set user state in localStorage', () => {\n setStateUser(mockUser);\n expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser));\n });\n\n it('should get user state from localStorage', () => {\n (window.localStorage.getItem as jest.Mock).mockReturnValue(JSON.stringify(mockUser));\n const user = getStateUser();\n expect(user).toEqual(mockUser);\n });\n\n it('should delete user state', () => {\n deleteStateUser();\n expect(CookieUtils.clearAuthToken).toHaveBeenCalled();\n expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user');\n });\n });\n\n describe('isTokenValid', () => {\n it('should return true for valid non-expired token', () => {\n const futureTime = Math.floor(Date.now() / 1000) + 3600;\n const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`;\n expect(isTokenValid(validToken)).toBe(true);\n });\n\n it('should return false for expired token', () => {\n const pastTime = Math.floor(Date.now() / 1000) - 3600;\n const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`;\n expect(isTokenValid(expiredToken)).toBe(false);\n });\n\n it('should return false for null/empty token', () => {\n expect(isTokenValid('')).toBe(false);\n // @ts-ignore\n expect(isTokenValid(null)).toBe(false);\n });\n\n it('should handle malformed token gracefully (currently crashes, needs fix)', () => {\n // This test documents current behavior or expected fix\n try {\n expect(isTokenValid('malformed.token')).toBe(false);\n } catch (e) {\n // Expected to throw in current implementation\n }\n });\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/d2/cookietest_d209f2d1dcdbdbaf37564ca46c24b9be b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/d2/cookietest_d209f2d1dcdbdbaf37564ca46c24b9be deleted file mode 100644 index 7f10274..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/d2/cookietest_d209f2d1dcdbdbaf37564ca46c24b9be +++ /dev/null @@ -1,38 +0,0 @@ -a94d85d18c2364a61345d3acaaec71e8 -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('js-cookie', () => ({ - set: jest.fn(), - get: jest.fn(), - remove: jest.fn(), -})); -const js_cookie_1 = __importDefault(require("js-cookie")); -const cookie_1 = require("../cookie"); -describe('Cookie Utils', () => { - const token = 'test-token'; - afterEach(() => { - jest.clearAllMocks(); - }); - it('should set auth token with secure flag', () => { - (0, cookie_1.setAuthToken)(token, true); - expect(js_cookie_1.default.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: true }); - }); - it('should set auth token without secure flag', () => { - (0, cookie_1.setAuthToken)(token, false); - expect(js_cookie_1.default.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: false }); - }); - it('should get auth token', () => { - js_cookie_1.default.get.mockReturnValue(token); - const result = (0, cookie_1.getAuthToken)(); - expect(js_cookie_1.default.get).toHaveBeenCalledWith('starter_auth_token'); - expect(result).toBe(token); - }); - it('should clear auth token', () => { - (0, cookie_1.clearAuthToken)(); - expect(js_cookie_1.default.remove).toHaveBeenCalledWith('starter_auth_token'); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vY29va2llLnRlc3QudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUNwQixDQUFDLENBQUMsQ0FBQztBQVBKLDBEQUFnQztBQUNoQyxzQ0FBdUU7QUFRdkUsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO0lBRTNCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLElBQUEscUJBQVksRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELElBQUEscUJBQVksRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0YsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQzVCLG1CQUFPLENBQUMsR0FBaUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEQsTUFBTSxNQUFNLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUMvQixJQUFBLHVCQUFjLEdBQUUsQ0FBQztRQUNqQixNQUFNLENBQUMsbUJBQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDLENBQUMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vY29va2llLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IENvb2tpZXMgZnJvbSAnanMtY29va2llJztcbmltcG9ydCB7IHNldEF1dGhUb2tlbiwgZ2V0QXV0aFRva2VuLCBjbGVhckF1dGhUb2tlbiB9IGZyb20gJy4uL2Nvb2tpZSc7XG5cbmplc3QubW9jaygnanMtY29va2llJywgKCkgPT4gKHtcbiAgICBzZXQ6IGplc3QuZm4oKSxcbiAgICBnZXQ6IGplc3QuZm4oKSxcbiAgICByZW1vdmU6IGplc3QuZm4oKSxcbn0pKTtcblxuZGVzY3JpYmUoJ0Nvb2tpZSBVdGlscycsICgpID0+IHtcbiAgICBjb25zdCB0b2tlbiA9ICd0ZXN0LXRva2VuJztcblxuICAgIGFmdGVyRWFjaCgoKSA9PiB7XG4gICAgICAgIGplc3QuY2xlYXJBbGxNb2NrcygpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYXV0aCB0b2tlbiB3aXRoIHNlY3VyZSBmbGFnJywgKCkgPT4ge1xuICAgICAgICBzZXRBdXRoVG9rZW4odG9rZW4sIHRydWUpO1xuICAgICAgICBleHBlY3QoQ29va2llcy5zZXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdG9rZW4nLCB0b2tlbiwgeyBzZWN1cmU6IHRydWUgfSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHNldCBhdXRoIHRva2VuIHdpdGhvdXQgc2VjdXJlIGZsYWcnLCAoKSA9PiB7XG4gICAgICAgIHNldEF1dGhUb2tlbih0b2tlbiwgZmFsc2UpO1xuICAgICAgICBleHBlY3QoQ29va2llcy5zZXQpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdzdGFydGVyX2F1dGhfdG9rZW4nLCB0b2tlbiwgeyBzZWN1cmU6IGZhbHNlIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYXV0aCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgKENvb2tpZXMuZ2V0IGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRva2VuKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICAgIGV4cGVjdChDb29raWVzLmdldCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3N0YXJ0ZXJfYXV0aF90b2tlbicpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRva2VuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2xlYXIgYXV0aCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgY2xlYXJBdXRoVG9rZW4oKTtcbiAgICAgICAgZXhwZWN0KENvb2tpZXMucmVtb3ZlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3Rva2VuJyk7XG4gICAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/d2/cookietest_d209f2d1dcdbdbaf37564ca46c24b9be.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/d2/cookietest_d209f2d1dcdbdbaf37564ca46c24b9be.map deleted file mode 100644 index 8f81566..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/d2/cookietest_d209f2d1dcdbdbaf37564ca46c24b9be.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts","mappings":";;;;;AAGA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAPJ,0DAAgC;AAChC,sCAAuE;AAQvE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC;IAE3B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,IAAA,qBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,IAAA,qBAAY,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC5B,mBAAO,CAAC,GAAiB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC9B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,IAAA,uBAAc,GAAE,CAAC;QACjB,MAAM,CAAC,mBAAO,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts"],"sourcesContent":["import Cookies from 'js-cookie';\nimport { setAuthToken, getAuthToken, clearAuthToken } from '../cookie';\n\njest.mock('js-cookie', () => ({\n set: jest.fn(),\n get: jest.fn(),\n remove: jest.fn(),\n}));\n\ndescribe('Cookie Utils', () => {\n const token = 'test-token';\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should set auth token with secure flag', () => {\n setAuthToken(token, true);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: true });\n });\n\n it('should set auth token without secure flag', () => {\n setAuthToken(token, false);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: false });\n });\n\n it('should get auth token', () => {\n (Cookies.get as jest.Mock).mockReturnValue(token);\n const result = getAuthToken();\n expect(Cookies.get).toHaveBeenCalledWith('starter_auth_token');\n expect(result).toBe(token);\n });\n\n it('should clear auth token', () => {\n clearAuthToken();\n expect(Cookies.remove).toHaveBeenCalledWith('starter_auth_token');\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dc/AuthProvidertest_dc793400965b1c0edb4cd145af3b89ee b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dc/AuthProvidertest_dc793400965b1c0edb4cd145af3b89ee deleted file mode 100644 index b59c001..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dc/AuthProvidertest_dc793400965b1c0edb4cd145af3b89ee +++ /dev/null @@ -1,97 +0,0 @@ -5ffe24ee51bab0488fe4bfc1b1ca8b28 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// Mocks -jest.mock('../utils/cookie'); -jest.mock('../utils/helpers'); -const react_1 = __importDefault(require("react")); -const react_2 = require("@testing-library/react"); -const AuthProvider_1 = __importDefault(require("../AuthProvider")); -const useAuth_1 = __importDefault(require("../useAuth")); -const CookieUtils = __importStar(require("../utils/cookie")); -const Helpers = __importStar(require("../utils/helpers")); -const TestComponent = () => { - const { isAuthenticated, user, signIn, logOut } = (0, useAuth_1.default)(); - return (react_1.default.createElement("div", null, - react_1.default.createElement("div", { "data-testid": "auth-status" }, isAuthenticated ? 'Authenticated' : 'Not Authenticated'), - react_1.default.createElement("div", { "data-testid": "user-name" }, user ? user.name : 'No User'), - react_1.default.createElement("button", { onClick: () => signIn({ token: 'new-token', user: { name: 'New User', email: 'new@example.com' } }) }, "Sign In"), - react_1.default.createElement("button", { onClick: () => logOut() }, "Log Out"))); -}; -describe('AuthProvider', () => { - beforeEach(() => { - jest.clearAllMocks(); - // Default mock implementations - CookieUtils.getAuthToken.mockReturnValue(null); - Helpers.getStateUser.mockReturnValue(null); - Helpers.isTokenValid.mockReturnValue(false); - }); - it('renders children', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement("div", null, "Child Content"))); - expect(react_2.screen.getByText('Child Content')).toBeTruthy(); - }); - it('initializes as not authenticated by default', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - expect(react_2.screen.getByText('Not Authenticated')).toBeTruthy(); - }); - it('loads user from cookies if token is valid', async () => { - const mockUser = { name: 'Existing User' }; - CookieUtils.getAuthToken.mockReturnValue('valid-token'); - Helpers.isTokenValid.mockReturnValue(true); - Helpers.getStateUser.mockReturnValue(mockUser); - await (0, react_2.act)(async () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - }); - expect(react_2.screen.getByText('Authenticated')).toBeTruthy(); - expect(react_2.screen.getByText('Existing User')).toBeTruthy(); - }); - it('signs in user and updates state', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - (0, react_2.act)(() => { - react_2.screen.getByText('Sign In').click(); - }); - expect(CookieUtils.setAuthToken).toHaveBeenCalled(); - expect(Helpers.setStateUser).toHaveBeenCalled(); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9fX3Rlc3RzX18vQXV0aFByb3ZpZGVyLnRlc3QudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsUUFBUTtBQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFWOUIsa0RBQTBCO0FBQzFCLGtEQUE2RDtBQUM3RCxtRUFBMkM7QUFFM0MseURBQWlDO0FBQ2pDLDZEQUErQztBQUMvQywwREFBNEM7QUFNNUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUM1RCxPQUFPLENBQ0g7UUFDSSxzREFBaUIsYUFBYSxJQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBTztRQUM5RixzREFBaUIsV0FBVyxJQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFPO1FBQ2pFLDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxjQUVsRztRQUNULDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBa0IsQ0FDL0MsQ0FDVCxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQiwrQkFBK0I7UUFDOUIsV0FBVyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsMkRBQXdCLENBQ2IsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsOEJBQUMsYUFBYSxPQUFHLENBQ04sQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMxQyxXQUFXLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUEsV0FBRyxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO2dCQUNULDhCQUFDLGFBQWEsT0FBRyxDQUNOLENBQ2xCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDdkMsSUFBQSxjQUFNLEVBQ0YsOEJBQUMsc0JBQVk7WUFDVCw4QkFBQyxhQUFhLE9BQUcsQ0FDTixDQUNsQixDQUFDO1FBRUYsSUFBQSxXQUFHLEVBQUMsR0FBRyxFQUFFO1lBQ0wsY0FBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL19fdGVzdHNfXy9BdXRoUHJvdmlkZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuLCBhY3QgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBBdXRoUHJvdmlkZXIgZnJvbSAnLi4vQXV0aFByb3ZpZGVyJztcblxuaW1wb3J0IHVzZUF1dGggZnJvbSAnLi4vdXNlQXV0aCc7XG5pbXBvcnQgKiBhcyBDb29raWVVdGlscyBmcm9tICcuLi91dGlscy9jb29raWUnO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcblxuLy8gTW9ja3Ncbmplc3QubW9jaygnLi4vdXRpbHMvY29va2llJyk7XG5qZXN0Lm1vY2soJy4uL3V0aWxzL2hlbHBlcnMnKTtcblxuY29uc3QgVGVzdENvbXBvbmVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGlzQXV0aGVudGljYXRlZCwgdXNlciwgc2lnbkluLCBsb2dPdXQgfSA9IHVzZUF1dGgoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImF1dGgtc3RhdHVzXCI+e2lzQXV0aGVudGljYXRlZCA/ICdBdXRoZW50aWNhdGVkJyA6ICdOb3QgQXV0aGVudGljYXRlZCd9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidXNlci1uYW1lXCI+e3VzZXIgPyB1c2VyLm5hbWUgOiAnTm8gVXNlcid9PC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNpZ25Jbih7IHRva2VuOiAnbmV3LXRva2VuJywgdXNlcjogeyBuYW1lOiAnTmV3IFVzZXInLCBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScgfSB9KX0+XG4gICAgICAgICAgICAgICAgU2lnbiBJblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGxvZ091dCgpfT5Mb2cgT3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5kZXNjcmliZSgnQXV0aFByb3ZpZGVyJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICAgICAgLy8gRGVmYXVsdCBtb2NrIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAoQ29va2llVXRpbHMuZ2V0QXV0aFRva2VuIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKG51bGwpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobnVsbCk7XG4gICAgICAgIChIZWxwZXJzLmlzVG9rZW5WYWxpZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8ZGl2PkNoaWxkIENvbnRlbnQ8L2Rpdj5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuICAgICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ2hpbGQgQ29udGVudCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZXMgYXMgbm90IGF1dGhlbnRpY2F0ZWQgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8VGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgICAgPC9BdXRoUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdOb3QgQXV0aGVudGljYXRlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9hZHMgdXNlciBmcm9tIGNvb2tpZXMgaWYgdG9rZW4gaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBuYW1lOiAnRXhpc3RpbmcgVXNlcicgfTtcbiAgICAgICAgKENvb2tpZVV0aWxzLmdldEF1dGhUb2tlbiBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZSgndmFsaWQtdG9rZW4nKTtcbiAgICAgICAgKEhlbHBlcnMuaXNUb2tlblZhbGlkIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobW9ja1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgICAgICA8L0F1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBdXRoZW50aWNhdGVkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0V4aXN0aW5nIFVzZXInKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25zIGluIHVzZXIgYW5kIHVwZGF0ZXMgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHJlbmRlcihcbiAgICAgICAgICAgIDxBdXRoUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuXG4gICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBzY3JlZW4uZ2V0QnlUZXh0KCdTaWduIEluJykuY2xpY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KENvb2tpZVV0aWxzLnNldEF1dGhUb2tlbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoSGVscGVycy5zZXRTdGF0ZVVzZXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dc/AuthProvidertest_dc793400965b1c0edb4cd145af3b89ee.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dc/AuthProvidertest_dc793400965b1c0edb4cd145af3b89ee.map deleted file mode 100644 index 9672e83..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dc/AuthProvidertest_dc793400965b1c0edb4cd145af3b89ee.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx"],"sourcesContent":["import React from 'react';\nimport { render, screen, act } from '@testing-library/react';\nimport AuthProvider from '../AuthProvider';\n\nimport useAuth from '../useAuth';\nimport * as CookieUtils from '../utils/cookie';\nimport * as Helpers from '../utils/helpers';\n\n// Mocks\njest.mock('../utils/cookie');\njest.mock('../utils/helpers');\n\nconst TestComponent = () => {\n const { isAuthenticated, user, signIn, logOut } = useAuth();\n return (\n
\n
{isAuthenticated ? 'Authenticated' : 'Not Authenticated'}
\n
{user ? user.name : 'No User'}
\n \n \n
\n );\n};\n\ndescribe('AuthProvider', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n // Default mock implementations\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue(null);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(null);\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(false);\n });\n\n it('renders children', () => {\n render(\n \n
Child Content
\n
\n );\n expect(screen.getByText('Child Content')).toBeTruthy();\n });\n\n it('initializes as not authenticated by default', () => {\n render(\n \n \n \n );\n expect(screen.getByText('Not Authenticated')).toBeTruthy();\n });\n\n it('loads user from cookies if token is valid', async () => {\n const mockUser = { name: 'Existing User' };\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue('valid-token');\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(true);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(mockUser);\n\n await act(async () => {\n render(\n \n \n \n );\n });\n\n expect(screen.getByText('Authenticated')).toBeTruthy();\n expect(screen.getByText('Existing User')).toBeTruthy();\n });\n\n it('signs in user and updates state', () => {\n render(\n \n \n \n );\n\n act(() => {\n screen.getByText('Sign In').click();\n });\n\n expect(CookieUtils.setAuthToken).toHaveBeenCalled();\n expect(Helpers.setStateUser).toHaveBeenCalled();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dd/AuthProvidertest_dd487d5685a68098185a34061b8f4fb8 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dd/AuthProvidertest_dd487d5685a68098185a34061b8f4fb8 deleted file mode 100644 index b59c001..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dd/AuthProvidertest_dd487d5685a68098185a34061b8f4fb8 +++ /dev/null @@ -1,97 +0,0 @@ -5ffe24ee51bab0488fe4bfc1b1ca8b28 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// Mocks -jest.mock('../utils/cookie'); -jest.mock('../utils/helpers'); -const react_1 = __importDefault(require("react")); -const react_2 = require("@testing-library/react"); -const AuthProvider_1 = __importDefault(require("../AuthProvider")); -const useAuth_1 = __importDefault(require("../useAuth")); -const CookieUtils = __importStar(require("../utils/cookie")); -const Helpers = __importStar(require("../utils/helpers")); -const TestComponent = () => { - const { isAuthenticated, user, signIn, logOut } = (0, useAuth_1.default)(); - return (react_1.default.createElement("div", null, - react_1.default.createElement("div", { "data-testid": "auth-status" }, isAuthenticated ? 'Authenticated' : 'Not Authenticated'), - react_1.default.createElement("div", { "data-testid": "user-name" }, user ? user.name : 'No User'), - react_1.default.createElement("button", { onClick: () => signIn({ token: 'new-token', user: { name: 'New User', email: 'new@example.com' } }) }, "Sign In"), - react_1.default.createElement("button", { onClick: () => logOut() }, "Log Out"))); -}; -describe('AuthProvider', () => { - beforeEach(() => { - jest.clearAllMocks(); - // Default mock implementations - CookieUtils.getAuthToken.mockReturnValue(null); - Helpers.getStateUser.mockReturnValue(null); - Helpers.isTokenValid.mockReturnValue(false); - }); - it('renders children', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement("div", null, "Child Content"))); - expect(react_2.screen.getByText('Child Content')).toBeTruthy(); - }); - it('initializes as not authenticated by default', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - expect(react_2.screen.getByText('Not Authenticated')).toBeTruthy(); - }); - it('loads user from cookies if token is valid', async () => { - const mockUser = { name: 'Existing User' }; - CookieUtils.getAuthToken.mockReturnValue('valid-token'); - Helpers.isTokenValid.mockReturnValue(true); - Helpers.getStateUser.mockReturnValue(mockUser); - await (0, react_2.act)(async () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - }); - expect(react_2.screen.getByText('Authenticated')).toBeTruthy(); - expect(react_2.screen.getByText('Existing User')).toBeTruthy(); - }); - it('signs in user and updates state', () => { - (0, react_2.render)(react_1.default.createElement(AuthProvider_1.default, null, - react_1.default.createElement(TestComponent, null))); - (0, react_2.act)(() => { - react_2.screen.getByText('Sign In').click(); - }); - expect(CookieUtils.setAuthToken).toHaveBeenCalled(); - expect(Helpers.setStateUser).toHaveBeenCalled(); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9fX3Rlc3RzX18vQXV0aFByb3ZpZGVyLnRlc3QudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUUEsUUFBUTtBQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFWOUIsa0RBQTBCO0FBQzFCLGtEQUE2RDtBQUM3RCxtRUFBMkM7QUFFM0MseURBQWlDO0FBQ2pDLDZEQUErQztBQUMvQywwREFBNEM7QUFNNUMsTUFBTSxhQUFhLEdBQUcsR0FBRyxFQUFFO0lBQ3ZCLE1BQU0sRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztJQUM1RCxPQUFPLENBQ0g7UUFDSSxzREFBaUIsYUFBYSxJQUFFLGVBQWUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxtQkFBbUIsQ0FBTztRQUM5RixzREFBaUIsV0FBVyxJQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFPO1FBQ2pFLDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsQ0FBQyxjQUVsRztRQUNULDBDQUFRLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBa0IsQ0FDL0MsQ0FDVCxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsVUFBVSxDQUFDLEdBQUcsRUFBRTtRQUNaLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQiwrQkFBK0I7UUFDOUIsV0FBVyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN6RCxPQUFPLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsMkRBQXdCLENBQ2IsQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1FBQ25ELElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO1lBQ1QsOEJBQUMsYUFBYSxPQUFHLENBQ04sQ0FDbEIsQ0FBQztRQUNGLE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxLQUFLLElBQUksRUFBRTtRQUN2RCxNQUFNLFFBQVEsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsQ0FBQztRQUMxQyxXQUFXLENBQUMsWUFBMEIsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLFlBQTBCLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxZQUEwQixDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUEsV0FBRyxFQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUEsY0FBTSxFQUNGLDhCQUFDLHNCQUFZO2dCQUNULDhCQUFDLGFBQWEsT0FBRyxDQUNOLENBQ2xCLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxjQUFNLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDdkQsTUFBTSxDQUFDLGNBQU0sQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMzRCxDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyxpQ0FBaUMsRUFBRSxHQUFHLEVBQUU7UUFDdkMsSUFBQSxjQUFNLEVBQ0YsOEJBQUMsc0JBQVk7WUFDVCw4QkFBQyxhQUFhLE9BQUcsQ0FDTixDQUNsQixDQUFDO1FBRUYsSUFBQSxXQUFHLEVBQUMsR0FBRyxFQUFFO1lBQ0wsY0FBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVILE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNwRCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDLENBQUMsQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL19fdGVzdHNfXy9BdXRoUHJvdmlkZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHJlbmRlciwgc2NyZWVuLCBhY3QgfSBmcm9tICdAdGVzdGluZy1saWJyYXJ5L3JlYWN0JztcbmltcG9ydCBBdXRoUHJvdmlkZXIgZnJvbSAnLi4vQXV0aFByb3ZpZGVyJztcblxuaW1wb3J0IHVzZUF1dGggZnJvbSAnLi4vdXNlQXV0aCc7XG5pbXBvcnQgKiBhcyBDb29raWVVdGlscyBmcm9tICcuLi91dGlscy9jb29raWUnO1xuaW1wb3J0ICogYXMgSGVscGVycyBmcm9tICcuLi91dGlscy9oZWxwZXJzJztcblxuLy8gTW9ja3Ncbmplc3QubW9jaygnLi4vdXRpbHMvY29va2llJyk7XG5qZXN0Lm1vY2soJy4uL3V0aWxzL2hlbHBlcnMnKTtcblxuY29uc3QgVGVzdENvbXBvbmVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IGlzQXV0aGVudGljYXRlZCwgdXNlciwgc2lnbkluLCBsb2dPdXQgfSA9IHVzZUF1dGgoKTtcbiAgICByZXR1cm4gKFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBkYXRhLXRlc3RpZD1cImF1dGgtc3RhdHVzXCI+e2lzQXV0aGVudGljYXRlZCA/ICdBdXRoZW50aWNhdGVkJyA6ICdOb3QgQXV0aGVudGljYXRlZCd9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwidXNlci1uYW1lXCI+e3VzZXIgPyB1c2VyLm5hbWUgOiAnTm8gVXNlcid9PC9kaXY+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IHNpZ25Jbih7IHRva2VuOiAnbmV3LXRva2VuJywgdXNlcjogeyBuYW1lOiAnTmV3IFVzZXInLCBlbWFpbDogJ25ld0BleGFtcGxlLmNvbScgfSB9KX0+XG4gICAgICAgICAgICAgICAgU2lnbiBJblxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIG9uQ2xpY2s9eygpID0+IGxvZ091dCgpfT5Mb2cgT3V0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICk7XG59O1xuXG5kZXNjcmliZSgnQXV0aFByb3ZpZGVyJywgKCkgPT4ge1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICAgICAgLy8gRGVmYXVsdCBtb2NrIGltcGxlbWVudGF0aW9uc1xuICAgICAgICAoQ29va2llVXRpbHMuZ2V0QXV0aFRva2VuIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKG51bGwpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobnVsbCk7XG4gICAgICAgIChIZWxwZXJzLmlzVG9rZW5WYWxpZCBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICBpdCgncmVuZGVycyBjaGlsZHJlbicsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8ZGl2PkNoaWxkIENvbnRlbnQ8L2Rpdj5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuICAgICAgICBleHBlY3Qoc2NyZWVuLmdldEJ5VGV4dCgnQ2hpbGQgQ29udGVudCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnaW5pdGlhbGl6ZXMgYXMgbm90IGF1dGhlbnRpY2F0ZWQgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgICAgcmVuZGVyKFxuICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICA8VGVzdENvbXBvbmVudCAvPlxuICAgICAgICAgICAgPC9BdXRoUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdOb3QgQXV0aGVudGljYXRlZCcpKS50b0JlVHJ1dGh5KCk7XG4gICAgfSk7XG5cbiAgICBpdCgnbG9hZHMgdXNlciBmcm9tIGNvb2tpZXMgaWYgdG9rZW4gaXMgdmFsaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1vY2tVc2VyID0geyBuYW1lOiAnRXhpc3RpbmcgVXNlcicgfTtcbiAgICAgICAgKENvb2tpZVV0aWxzLmdldEF1dGhUb2tlbiBhcyBqZXN0Lk1vY2spLm1vY2tSZXR1cm5WYWx1ZSgndmFsaWQtdG9rZW4nKTtcbiAgICAgICAgKEhlbHBlcnMuaXNUb2tlblZhbGlkIGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRydWUpO1xuICAgICAgICAoSGVscGVycy5nZXRTdGF0ZVVzZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmV0dXJuVmFsdWUobW9ja1VzZXIpO1xuXG4gICAgICAgIGF3YWl0IGFjdChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICByZW5kZXIoXG4gICAgICAgICAgICAgICAgPEF1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgICAgICA8L0F1dGhQcm92aWRlcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cGVjdChzY3JlZW4uZ2V0QnlUZXh0KCdBdXRoZW50aWNhdGVkJykpLnRvQmVUcnV0aHkoKTtcbiAgICAgICAgZXhwZWN0KHNjcmVlbi5nZXRCeVRleHQoJ0V4aXN0aW5nIFVzZXInKSkudG9CZVRydXRoeSgpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3NpZ25zIGluIHVzZXIgYW5kIHVwZGF0ZXMgc3RhdGUnLCAoKSA9PiB7XG4gICAgICAgIHJlbmRlcihcbiAgICAgICAgICAgIDxBdXRoUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgPFRlc3RDb21wb25lbnQgLz5cbiAgICAgICAgICAgIDwvQXV0aFByb3ZpZGVyPlxuICAgICAgICApO1xuXG4gICAgICAgIGFjdCgoKSA9PiB7XG4gICAgICAgICAgICBzY3JlZW4uZ2V0QnlUZXh0KCdTaWduIEluJykuY2xpY2soKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZXhwZWN0KENvb2tpZVV0aWxzLnNldEF1dGhUb2tlbikudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgICBleHBlY3QoSGVscGVycy5zZXRTdGF0ZVVzZXIpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dd/AuthProvidertest_dd487d5685a68098185a34061b8f4fb8.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dd/AuthProvidertest_dd487d5685a68098185a34061b8f4fb8.map deleted file mode 100644 index 9672e83..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/dd/AuthProvidertest_dd487d5685a68098185a34061b8f4fb8.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx"],"sourcesContent":["import React from 'react';\nimport { render, screen, act } from '@testing-library/react';\nimport AuthProvider from '../AuthProvider';\n\nimport useAuth from '../useAuth';\nimport * as CookieUtils from '../utils/cookie';\nimport * as Helpers from '../utils/helpers';\n\n// Mocks\njest.mock('../utils/cookie');\njest.mock('../utils/helpers');\n\nconst TestComponent = () => {\n const { isAuthenticated, user, signIn, logOut } = useAuth();\n return (\n
\n
{isAuthenticated ? 'Authenticated' : 'Not Authenticated'}
\n
{user ? user.name : 'No User'}
\n \n \n
\n );\n};\n\ndescribe('AuthProvider', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n // Default mock implementations\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue(null);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(null);\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(false);\n });\n\n it('renders children', () => {\n render(\n \n
Child Content
\n
\n );\n expect(screen.getByText('Child Content')).toBeTruthy();\n });\n\n it('initializes as not authenticated by default', () => {\n render(\n \n \n \n );\n expect(screen.getByText('Not Authenticated')).toBeTruthy();\n });\n\n it('loads user from cookies if token is valid', async () => {\n const mockUser = { name: 'Existing User' };\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue('valid-token');\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(true);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(mockUser);\n\n await act(async () => {\n render(\n \n \n \n );\n });\n\n expect(screen.getByText('Authenticated')).toBeTruthy();\n expect(screen.getByText('Existing User')).toBeTruthy();\n });\n\n it('signs in user and updates state', () => {\n render(\n \n \n \n );\n\n act(() => {\n screen.getByText('Sign In').click();\n });\n\n expect(CookieUtils.setAuthToken).toHaveBeenCalled();\n expect(Helpers.setStateUser).toHaveBeenCalled();\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/e4/cookietest_e496487d7cc113ca5aa1e150d457dbbe b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/e4/cookietest_e496487d7cc113ca5aa1e150d457dbbe deleted file mode 100644 index 0d29ffb..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/e4/cookietest_e496487d7cc113ca5aa1e150d457dbbe +++ /dev/null @@ -1,38 +0,0 @@ -ee4f9e6f40b1e3f8de59bb8f8a77d4d9 -"use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -jest.mock('js-cookie', () => ({ - set: jest.fn(), - get: jest.fn(), - remove: jest.fn(), -})); -const js_cookie_1 = __importDefault(require("js-cookie")); -const cookie_1 = require("../cookie"); -describe('Cookie Utils', () => { - const token = 'test-token'; - afterEach(() => { - jest.clearAllMocks(); - }); - it('should set auth token with secure flag', () => { - (0, cookie_1.setAuthToken)(token, true); - expect(js_cookie_1.default.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: true }); - }); - it('should set auth token without secure flag', () => { - (0, cookie_1.setAuthToken)(token, false); - expect(js_cookie_1.default.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: false, sameSite: 'Strict', expires: 7 }); - }); - it('should get auth token', () => { - js_cookie_1.default.get.mockReturnValue(token); - const result = (0, cookie_1.getAuthToken)(); - expect(js_cookie_1.default.get).toHaveBeenCalledWith('starter_auth_token'); - expect(result).toBe(token); - }); - it('should clear auth token', () => { - (0, cookie_1.clearAuthToken)(); - expect(js_cookie_1.default.remove).toHaveBeenCalledWith('starter_auth_token'); - }); -}); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9fX3Rlc3RzX18vY29va2llLnRlc3QudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFHQSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzFCLEdBQUcsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0lBQ2QsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7SUFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUNwQixDQUFDLENBQUMsQ0FBQztBQVBKLDBEQUFnQztBQUNoQyxzQ0FBdUU7QUFRdkUsUUFBUSxDQUFDLGNBQWMsRUFBRSxHQUFHLEVBQUU7SUFDMUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO0lBRTNCLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDWCxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDekIsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1FBQzlDLElBQUEscUJBQVksRUFBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDMUIsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDNUYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1FBQ2pELElBQUEscUJBQVksRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLG1CQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdILENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRTtRQUM1QixtQkFBTyxDQUFDLEdBQWlCLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xELE1BQU0sTUFBTSxHQUFHLElBQUEscUJBQVksR0FBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxtQkFBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDL0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsSUFBQSx1QkFBYyxHQUFFLENBQUM7UUFDakIsTUFBTSxDQUFDLG1CQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsb0JBQW9CLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvdXRpbHMvX190ZXN0c19fL2Nvb2tpZS50ZXN0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBDb29raWVzIGZyb20gJ2pzLWNvb2tpZSc7XG5pbXBvcnQgeyBzZXRBdXRoVG9rZW4sIGdldEF1dGhUb2tlbiwgY2xlYXJBdXRoVG9rZW4gfSBmcm9tICcuLi9jb29raWUnO1xuXG5qZXN0Lm1vY2soJ2pzLWNvb2tpZScsICgpID0+ICh7XG4gICAgc2V0OiBqZXN0LmZuKCksXG4gICAgZ2V0OiBqZXN0LmZuKCksXG4gICAgcmVtb3ZlOiBqZXN0LmZuKCksXG59KSk7XG5cbmRlc2NyaWJlKCdDb29raWUgVXRpbHMnLCAoKSA9PiB7XG4gICAgY29uc3QgdG9rZW4gPSAndGVzdC10b2tlbic7XG5cbiAgICBhZnRlckVhY2goKCkgPT4ge1xuICAgICAgICBqZXN0LmNsZWFyQWxsTW9ja3MoKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgc2V0IGF1dGggdG9rZW4gd2l0aCBzZWN1cmUgZmxhZycsICgpID0+IHtcbiAgICAgICAgc2V0QXV0aFRva2VuKHRva2VuLCB0cnVlKTtcbiAgICAgICAgZXhwZWN0KENvb2tpZXMuc2V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3Rva2VuJywgdG9rZW4sIHsgc2VjdXJlOiB0cnVlIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBzZXQgYXV0aCB0b2tlbiB3aXRob3V0IHNlY3VyZSBmbGFnJywgKCkgPT4ge1xuICAgICAgICBzZXRBdXRoVG9rZW4odG9rZW4sIGZhbHNlKTtcbiAgICAgICAgZXhwZWN0KENvb2tpZXMuc2V0KS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3Rva2VuJywgdG9rZW4sIHsgc2VjdXJlOiBmYWxzZSwgc2FtZVNpdGU6ICdTdHJpY3QnLCBleHBpcmVzOiA3IH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBnZXQgYXV0aCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgKENvb2tpZXMuZ2V0IGFzIGplc3QuTW9jaykubW9ja1JldHVyblZhbHVlKHRva2VuKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICAgIGV4cGVjdChDb29raWVzLmdldCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ3N0YXJ0ZXJfYXV0aF90b2tlbicpO1xuICAgICAgICBleHBlY3QocmVzdWx0KS50b0JlKHRva2VuKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgY2xlYXIgYXV0aCB0b2tlbicsICgpID0+IHtcbiAgICAgICAgY2xlYXJBdXRoVG9rZW4oKTtcbiAgICAgICAgZXhwZWN0KENvb2tpZXMucmVtb3ZlKS50b0hhdmVCZWVuQ2FsbGVkV2l0aCgnc3RhcnRlcl9hdXRoX3Rva2VuJyk7XG4gICAgfSk7XG59KTtcbiJdLCJ2ZXJzaW9uIjozfQ== \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/e4/cookietest_e496487d7cc113ca5aa1e150d457dbbe.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/e4/cookietest_e496487d7cc113ca5aa1e150d457dbbe.map deleted file mode 100644 index c6f9dd3..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/e4/cookietest_e496487d7cc113ca5aa1e150d457dbbe.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts","mappings":";;;;;AAGA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAPJ,0DAAgC;AAChC,sCAAuE;AAQvE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC1B,MAAM,KAAK,GAAG,YAAY,CAAC;IAE3B,SAAS,CAAC,GAAG,EAAE;QACX,IAAI,CAAC,aAAa,EAAE,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,IAAA,qBAAY,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACjD,IAAA,qBAAY,EAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC5B,mBAAO,CAAC,GAAiB,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAA,qBAAY,GAAE,CAAC;QAC9B,MAAM,CAAC,mBAAO,CAAC,GAAG,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QAC/B,IAAA,uBAAc,GAAE,CAAC;QACjB,MAAM,CAAC,mBAAO,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts"],"sourcesContent":["import Cookies from 'js-cookie';\nimport { setAuthToken, getAuthToken, clearAuthToken } from '../cookie';\n\njest.mock('js-cookie', () => ({\n set: jest.fn(),\n get: jest.fn(),\n remove: jest.fn(),\n}));\n\ndescribe('Cookie Utils', () => {\n const token = 'test-token';\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should set auth token with secure flag', () => {\n setAuthToken(token, true);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: true });\n });\n\n it('should set auth token without secure flag', () => {\n setAuthToken(token, false);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: false, sameSite: 'Strict', expires: 7 });\n });\n\n it('should get auth token', () => {\n (Cookies.get as jest.Mock).mockReturnValue(token);\n const result = getAuthToken();\n expect(Cookies.get).toHaveBeenCalledWith('starter_auth_token');\n expect(result).toBe(token);\n });\n\n it('should clear auth token', () => {\n clearAuthToken();\n expect(Cookies.remove).toHaveBeenCalledWith('starter_auth_token');\n });\n});\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ea/AuthContext_ea6a69ea9e7781bc1f0e1adb05ca8359 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ea/AuthContext_ea6a69ea9e7781bc1f0e1adb05ca8359 deleted file mode 100644 index efdaafa..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ea/AuthContext_ea6a69ea9e7781bc1f0e1adb05ca8359 +++ /dev/null @@ -1,40 +0,0 @@ -93fa33826e245445b0d9d248e8dc9f28 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext = React.createContext(null); -exports.default = AuthContext; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoQ29udGV4dC50cyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUE4QjtBQUk5QixNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUE0QixJQUFJLENBQUMsQ0FBQTtBQUV4RSxrQkFBZSxXQUFXLENBQUEiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoQ29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgU3RhcnRlckNvbnRleHRUeXBlIH0gZnJvbSAnLi90eXBlcydcblxuY29uc3QgQXV0aENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PFN0YXJ0ZXJDb250ZXh0VHlwZSB8IG51bGw+KG51bGwpXG5cbmV4cG9ydCBkZWZhdWx0IEF1dGhDb250ZXh0XG5cblxuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ea/AuthContext_ea6a69ea9e7781bc1f0e1adb05ca8359.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ea/AuthContext_ea6a69ea9e7781bc1f0e1adb05ca8359.map deleted file mode 100644 index fe7b75e..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ea/AuthContext_ea6a69ea9e7781bc1f0e1adb05ca8359.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA8B;AAI9B,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAA4B,IAAI,CAAC,CAAA;AAExE,kBAAe,WAAW,CAAA","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts"],"sourcesContent":["import * as React from 'react'\n\nimport { StarterContextType } from './types'\n\nconst AuthContext = React.createContext(null)\n\nexport default AuthContext\n\n\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ec/helpers_ec2518ec911c0e9bfefe6626c9497886 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ec/helpers_ec2518ec911c0e9bfefe6626c9497886 deleted file mode 100644 index 54e8410..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ec/helpers_ec2518ec911c0e9bfefe6626c9497886 +++ /dev/null @@ -1,109 +0,0 @@ -e4695ffb018f4d171b92bf10aaa50025 -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.isTokenValid = isTokenValid; -exports.setStateUser = setStateUser; -exports.getStateUser = getStateUser; -exports.deleteStateUser = deleteStateUser; -exports.isAuthenticated = isAuthenticated; -exports.tokenDecode = tokenDecode; -const cookie_1 = require("./cookie"); -const errors_1 = require("../errors"); -function setStateUser(user) { - if (typeof window !== "undefined" && window.localStorage) { - localStorage.setItem('starter_auth_user', JSON.stringify(user)); - } -} -function getStateUser() { - if (typeof window !== "undefined" && window.localStorage) { - const user = localStorage.getItem('starter_auth_user'); - if (user) { - return JSON.parse(user); - } - } - return null; -} -function deleteStateUser() { - (0, cookie_1.clearAuthToken)(); - if (typeof window !== "undefined" && window.localStorage) { - localStorage.removeItem('starter_auth_user'); - } -} -function isAuthenticated() { - const token = (0, cookie_1.getAuthToken)(); - if (token) { - return isTokenValid(token); - } - return false; -} -function b64DecodeUnicode(str) { - return decodeURIComponent(atob(str).replace(/(.)/g, (p) => { - let code = p.charCodeAt(0).toString(16).toUpperCase(); - if (code.length < 2) { - code = "0" + code; - } - return "%" + code; - })); -} -function base64UrlDecode(str) { - let output = str.replace(/-/g, "+").replace(/_/g, "/"); - switch (output.length % 4) { - case 0: - break; - case 2: - output += "=="; - break; - case 3: - output += "="; - break; - default: - throw new Error("base64 string is not of the correct length"); - } - try { - return b64DecodeUnicode(output); - } - catch (err) { - return atob(output); - } -} -function tokenDecode(token, options) { - if (typeof token !== "string") { - throw new errors_1.AuthError("Invalid token specified: must be a string"); - } - options || (options = {}); - const pos = options.header === true ? 0 : 1; - const part = token.split(".")[pos]; - if (typeof part !== "string") { - throw new errors_1.AuthError(`Invalid token specified: missing part #${pos + 1}`); - } - let decoded; - try { - decoded = base64UrlDecode(part); - } - catch (e) { - throw new errors_1.AuthError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`); - } - try { - return JSON.parse(decoded); - } - catch (e) { - throw new errors_1.AuthError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`); - } -} -function isTokenValid(token) { - try { - if (token) { - const decodedJwt = tokenDecode(token); - if (typeof decodedJwt === 'object' && decodedJwt !== null) { - if (decodedJwt.exp) { - return decodedJwt.exp * 1000 > Date.now(); - } - } - } - return false; - } - catch (error) { - return false; - } -} -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91dGlscy9oZWxwZXJzLnRzIiwibWFwcGluZ3MiOiI7O0FBc0hTLG9DQUFZO0FBQUUsb0NBQVk7QUFBRSxvQ0FBWTtBQUFFLDBDQUFlO0FBQUUsMENBQWU7QUFBRSxrQ0FBVztBQXRIaEcscUNBQXVEO0FBRXZELHNDQUFzQztBQUd0QyxTQUFTLFlBQVksQ0FBOEIsSUFBVztJQUM1RCxJQUFJLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekQsWUFBWSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFlBQVk7SUFDbkIsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUN2RCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBVSxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBUyxlQUFlO0lBQ3RCLElBQUEsdUJBQWMsR0FBRSxDQUFBO0lBQ2hCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6RCxZQUFZLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDL0MsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLGVBQWU7SUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBWSxHQUFFLENBQUE7SUFDNUIsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUNWLE9BQU8s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WUFBWSxDQUFDLEtBQWE7SUFDakMsSUFBSSxDQUFDO1FBQ0gsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLE1BQU0sVUFBVSxHQUFnQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUMxRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDbkIsT0FBTyxVQUFVLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQzNDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvdXRpbHMvaGVscGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRBdXRoVG9rZW4sIGNsZWFyQXV0aFRva2VuIH0gZnJvbSBcIi4vY29va2llXCJcblxuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuaW1wb3J0IHsgVG9rZW5PYmplY3QsIFRva2VuSGVhZGVyLCBUb2tlbkRlY29kZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIlxuXG5mdW5jdGlvbiBzZXRTdGF0ZVVzZXI8VFVzZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih1c2VyOiBUVXNlcikge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cubG9jYWxTdG9yYWdlKSB7XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3N0YXJ0ZXJfYXV0aF91c2VyJywgSlNPTi5zdHJpbmdpZnkodXNlcikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN0YXRlVXNlcjxUVXNlciA9IFJlY29yZDxzdHJpbmcsIGFueT4+KCk6IFRVc2VyIHwgbnVsbCB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcbiAgICBjb25zdCB1c2VyID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0YXJ0ZXJfYXV0aF91c2VyJyk7XG4gICAgaWYgKHVzZXIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKHVzZXIpIGFzIFRVc2VyO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gZGVsZXRlU3RhdGVVc2VyKCkge1xuICBjbGVhckF1dGhUb2tlbigpXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcbiAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgnc3RhcnRlcl9hdXRoX3VzZXInKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0F1dGhlbnRpY2F0ZWQoKSB7XG4gIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKClcbiAgaWYgKHRva2VuKSB7XG4gICAgcmV0dXJuIGlzVG9rZW5WYWxpZCh0b2tlbilcbiAgfVxuICByZXR1cm4gZmFsc2Vcbn1cblxuZnVuY3Rpb24gYjY0RGVjb2RlVW5pY29kZShzdHI6IHN0cmluZykge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgIGF0b2Ioc3RyKS5yZXBsYWNlKC8oLikvZywgKHApID0+IHtcbiAgICAgIGxldCBjb2RlID0gKHAgYXMgc3RyaW5nKS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpO1xuICAgICAgaWYgKGNvZGUubGVuZ3RoIDwgMikge1xuICAgICAgICBjb2RlID0gXCIwXCIgKyBjb2RlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFwiJVwiICsgY29kZTtcbiAgICB9KSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gYmFzZTY0VXJsRGVjb2RlKHN0cjogc3RyaW5nKSB7XG4gIGxldCBvdXRwdXQgPSBzdHIucmVwbGFjZSgvLS9nLCBcIitcIikucmVwbGFjZSgvXy9nLCBcIi9cIik7XG4gIHN3aXRjaCAob3V0cHV0Lmxlbmd0aCAlIDQpIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDI6XG4gICAgICBvdXRwdXQgKz0gXCI9PVwiO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAzOlxuICAgICAgb3V0cHV0ICs9IFwiPVwiO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImJhc2U2NCBzdHJpbmcgaXMgbm90IG9mIHRoZSBjb3JyZWN0IGxlbmd0aFwiKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGI2NERlY29kZVVuaWNvZGUob3V0cHV0KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIGF0b2Iob3V0cHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b2tlbkRlY29kZTxUID0gVG9rZW5IZWFkZXIgfCBUb2tlbk9iamVjdD4odG9rZW46IHN0cmluZywgb3B0aW9ucz86IFRva2VuRGVjb2RlT3B0aW9ucyk6IFQge1xuICBpZiAodHlwZW9mIHRva2VuICE9PSBcInN0cmluZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcIkludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICB9XG4gIG9wdGlvbnMgfHw9IHt9O1xuXG4gIGNvbnN0IHBvcyA9IG9wdGlvbnMuaGVhZGVyID09PSB0cnVlID8gMCA6IDE7XG4gIGNvbnN0IHBhcnQgPSB0b2tlbi5zcGxpdChcIi5cIilbcG9zXTtcblxuICBpZiAodHlwZW9mIHBhcnQgIT09IFwic3RyaW5nXCIpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogbWlzc2luZyBwYXJ0ICMke3BvcyArIDF9YCk7XG4gIH1cblxuICBsZXQgZGVjb2RlZDogc3RyaW5nO1xuICB0cnkge1xuICAgIGRlY29kZWQgPSBiYXNlNjRVcmxEZWNvZGUocGFydCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFxuICAgICAgYEludmFsaWQgdG9rZW4gc3BlY2lmaWVkOiBpbnZhbGlkIGJhc2U2NCBmb3IgcGFydCAjJHtwb3MgKyAxfSAoJHsoZSBhcyBFcnJvcikubWVzc2FnZX0pYCxcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKSBhcyBUO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcbiAgICAgIGBJbnZhbGlkIHRva2VuIHNwZWNpZmllZDogaW52YWxpZCBqc29uIGZvciBwYXJ0ICMke3BvcyArIDF9ICgkeyhlIGFzIEVycm9yKS5tZXNzYWdlfSlgLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUb2tlblZhbGlkKHRva2VuOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIGNvbnN0IGRlY29kZWRKd3Q6IFRva2VuT2JqZWN0ID0gdG9rZW5EZWNvZGUodG9rZW4pO1xuICAgICAgaWYgKHR5cGVvZiBkZWNvZGVkSnd0ID09PSAnb2JqZWN0JyAmJiBkZWNvZGVkSnd0ICE9PSBudWxsKSB7XG4gICAgICAgIGlmIChkZWNvZGVkSnd0LmV4cCkge1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkSnd0LmV4cCAqIDEwMDAgPiBEYXRlLm5vdygpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5cbmV4cG9ydCB7IGlzVG9rZW5WYWxpZCwgc2V0U3RhdGVVc2VyLCBnZXRTdGF0ZVVzZXIsIGRlbGV0ZVN0YXRlVXNlciwgaXNBdXRoZW50aWNhdGVkLCB0b2tlbkRlY29kZSB9O1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ec/helpers_ec2518ec911c0e9bfefe6626c9497886.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ec/helpers_ec2518ec911c0e9bfefe6626c9497886.map deleted file mode 100644 index 830fda0..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ec/helpers_ec2518ec911c0e9bfefe6626c9497886.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts","mappings":"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","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts"],"sourcesContent":["import { getAuthToken, clearAuthToken } from \"./cookie\"\n\nimport { AuthError } from \"../errors\";\nimport { TokenObject, TokenHeader, TokenDecodeOptions } from \"../types\"\n\nfunction setStateUser>(user: TUser) {\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.setItem('starter_auth_user', JSON.stringify(user));\n }\n}\n\nfunction getStateUser>(): TUser | null {\n if (typeof window !== \"undefined\" && window.localStorage) {\n const user = localStorage.getItem('starter_auth_user');\n if (user) {\n return JSON.parse(user) as TUser;\n }\n }\n return null;\n}\n\nfunction deleteStateUser() {\n clearAuthToken()\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.removeItem('starter_auth_user');\n }\n}\n\nfunction isAuthenticated() {\n const token = getAuthToken()\n if (token) {\n return isTokenValid(token)\n }\n return false\n}\n\nfunction b64DecodeUnicode(str: string) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (p) => {\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }),\n );\n}\n\nfunction base64UrlDecode(str: string) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n}\n\nfunction tokenDecode(token: string, options?: TokenDecodeOptions): T {\n if (typeof token !== \"string\") {\n throw new AuthError(\"Invalid token specified: must be a string\");\n }\n options ||= {};\n\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n\n if (typeof part !== \"string\") {\n throw new AuthError(`Invalid token specified: missing part #${pos + 1}`);\n }\n\n let decoded: string;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n\n try {\n return JSON.parse(decoded) as T;\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n}\n\nfunction isTokenValid(token: string): boolean {\n try {\n if (token) {\n const decodedJwt: TokenObject = tokenDecode(token);\n if (typeof decodedJwt === 'object' && decodedJwt !== null) {\n if (decodedJwt.exp) {\n return decodedJwt.exp * 1000 > Date.now()\n }\n }\n }\n return false;\n } catch (error) {\n return false;\n }\n}\n\n\nexport { isTokenValid, setStateUser, getStateUser, deleteStateUser, isAuthenticated, tokenDecode };\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ee/AuthProvider_eea598efbe4e77742c20233e9c6f5c18 b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ee/AuthProvider_eea598efbe4e77742c20233e9c6f5c18 deleted file mode 100644 index 35be9c1..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ee/AuthProvider_eea598efbe4e77742c20233e9c6f5c18 +++ /dev/null @@ -1,97 +0,0 @@ -449812fe5cfedc3c5ebfe0b4dc3ef779 -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.AuthProvider = AuthProvider; -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const helpers_1 = require("./utils/helpers"); -const cookie_1 = require("./utils/cookie"); -function AuthProvider({ children }) { - const [authUser, setAuthUser] = React.useState(null); - const [isLoading, setLoading] = React.useState(true); - const logOut = React.useCallback((redirectPath) => { - (0, helpers_1.deleteStateUser)(); - setAuthUser(null); - if (typeof window !== 'undefined' && redirectPath !== null) { - window.location.href = redirectPath || '/'; - } - }, []); - React.useEffect(() => { - async function loadUserFromCookies() { - try { - const token = (0, cookie_1.getAuthToken)(); - if (token) { - if ((0, helpers_1.isTokenValid)(token)) { - const user = (0, helpers_1.getStateUser)(); - setAuthUser(user); - } - else { - logOut(null); // Logout without redirect during init - } - } - } - catch (error) { - console.error('Failed to load auth state:', error); - } - finally { - setLoading(false); - } - } - loadUserFromCookies(); - }, [logOut]); - const signIn = React.useCallback((state) => { - if (state === null || state === void 0 ? void 0 : state.token) { - const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:'; - (0, cookie_1.setAuthToken)(state.token, isSecure); - const user = state.user || { name: 'Anonymous' }; - (0, helpers_1.setStateUser)(user); - setAuthUser(user); - } - }, []); - const value = React.useMemo(() => ({ - isLoading, - isAuthenticated: !!authUser, - user: authUser, - signIn, - logOut, - }), [isLoading, authUser, signIn, logOut]); - return (React.createElement(AuthContext_1.default.Provider, { value: value }, children)); -} -exports.default = AuthProvider; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy9BdXRoUHJvdmlkZXIudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBV0Esb0NBeURDO0FBcEVELDZDQUErQjtBQUUvQixnRUFBd0M7QUFDeEMsNkNBQTRGO0FBQzVGLDJDQUE0RDtBQU81RCxTQUFnQixZQUFZLENBQThCLEVBQUUsUUFBUSxFQUFxQjtJQUN2RixNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQWUsSUFBSSxDQUFDLENBQUM7SUFDbkUsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxZQUFxQixFQUFFLEVBQUU7UUFDekQsSUFBQSx5QkFBZSxHQUFFLENBQUM7UUFDbEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUMzRCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxZQUFZLElBQUksR0FBRyxDQUFDO1FBQzdDLENBQUM7SUFDSCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNuQixLQUFLLFVBQVUsbUJBQW1CO1lBQ2hDLElBQUksQ0FBQztnQkFDSCxNQUFNLEtBQUssR0FBRyxJQUFBLHFCQUFZLEdBQUUsQ0FBQztnQkFDN0IsSUFBSSxLQUFLLEVBQUUsQ0FBQztvQkFDVixJQUFJLElBQUEsc0JBQVksRUFBQyxLQUFLLENBQUMsRUFBRSxDQUFDO3dCQUN4QixNQUFNLElBQUksR0FBRyxJQUFBLHNCQUFZLEdBQUUsQ0FBQzt3QkFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNwQixDQUFDO3lCQUFNLENBQUM7d0JBQ04sTUFBTSxDQUFDLElBQVcsQ0FBQyxDQUFDLENBQUMsc0NBQXNDO29CQUM3RCxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDRCQUE0QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JELENBQUM7b0JBQVMsQ0FBQztnQkFDVCxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEIsQ0FBQztRQUNILENBQUM7UUFDRCxtQkFBbUIsRUFBRSxDQUFDO0lBQ3hCLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFYixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBZ0MsRUFBRSxFQUFFO1FBQ3BFLElBQUksS0FBSyxhQUFMLEtBQUssdUJBQUwsS0FBSyxDQUFFLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sUUFBUSxHQUFHLE9BQU8sTUFBTSxLQUFLLFdBQVcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7WUFDeEYsSUFBQSxxQkFBWSxFQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksSUFBSyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQXVCLENBQUM7WUFDdkUsSUFBQSxzQkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDO1lBQ25CLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwQixDQUFDO0lBQ0gsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLFNBQVM7UUFDVCxlQUFlLEVBQUUsQ0FBQyxDQUFDLFFBQVE7UUFDM0IsSUFBSSxFQUFFLFFBQVE7UUFDZCxNQUFNO1FBQ04sTUFBTTtLQUNQLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFFM0MsT0FBTyxDQUNMLG9CQUFDLHFCQUFXLENBQUMsUUFBUSxJQUFDLEtBQUssRUFBRSxLQUFLLElBQy9CLFFBQVEsQ0FDWSxDQUN4QixDQUFDO0FBQ0osQ0FBQztBQUVELGtCQUFlLFlBQVksQ0FBQyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIvVXNlcnMvYWtvc2lkZW5jaW8vRG9jdW1lbnRzL0JPT0tTUElORS9yZWFjdC1zdGFydGVyLWF1dGgvc3JjL0F1dGhQcm92aWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQXV0aENvbnRleHQgZnJvbSAnLi9BdXRoQ29udGV4dCc7XG5pbXBvcnQgeyBkZWxldGVTdGF0ZVVzZXIsIGdldFN0YXRlVXNlciwgaXNUb2tlblZhbGlkLCBzZXRTdGF0ZVVzZXIgfSBmcm9tICcuL3V0aWxzL2hlbHBlcnMnO1xuaW1wb3J0IHsgc2V0QXV0aFRva2VuLCBnZXRBdXRoVG9rZW4gfSBmcm9tICcuL3V0aWxzL2Nvb2tpZSc7XG5pbXBvcnQgeyBBdXRoU3RhdGVJbnRlcmZhY2UgfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBBdXRoUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBBdXRoUHJvdmlkZXI8VFVzZXIgPSBSZWNvcmQ8c3RyaW5nLCBhbnk+Pih7IGNoaWxkcmVuIH06IEF1dGhQcm92aWRlclByb3BzKSB7XG4gIGNvbnN0IFthdXRoVXNlciwgc2V0QXV0aFVzZXJdID0gUmVhY3QudXNlU3RhdGU8VFVzZXIgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2lzTG9hZGluZywgc2V0TG9hZGluZ10gPSBSZWFjdC51c2VTdGF0ZSh0cnVlKTtcblxuICBjb25zdCBsb2dPdXQgPSBSZWFjdC51c2VDYWxsYmFjaygocmVkaXJlY3RQYXRoPzogc3RyaW5nKSA9PiB7XG4gICAgZGVsZXRlU3RhdGVVc2VyKCk7XG4gICAgc2V0QXV0aFVzZXIobnVsbCk7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHJlZGlyZWN0UGF0aCAhPT0gbnVsbCkge1xuICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSByZWRpcmVjdFBhdGggfHwgJy8nO1xuICAgIH1cbiAgfSwgW10pO1xuXG4gIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gbG9hZFVzZXJGcm9tQ29va2llcygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKCk7XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgIGlmIChpc1Rva2VuVmFsaWQodG9rZW4pKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VyID0gZ2V0U3RhdGVVc2VyKCk7XG4gICAgICAgICAgICBzZXRBdXRoVXNlcih1c2VyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nT3V0KG51bGwgYXMgYW55KTsgLy8gTG9nb3V0IHdpdGhvdXQgcmVkaXJlY3QgZHVyaW5nIGluaXRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGF1dGggc3RhdGU6JywgZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGxvYWRVc2VyRnJvbUNvb2tpZXMoKTtcbiAgfSwgW2xvZ091dF0pO1xuXG4gIGNvbnN0IHNpZ25JbiA9IFJlYWN0LnVzZUNhbGxiYWNrKChzdGF0ZTogQXV0aFN0YXRlSW50ZXJmYWNlPFRVc2VyPikgPT4ge1xuICAgIGlmIChzdGF0ZT8udG9rZW4pIHtcbiAgICAgIGNvbnN0IGlzU2VjdXJlID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICAgIHNldEF1dGhUb2tlbihzdGF0ZS50b2tlbiwgaXNTZWN1cmUpO1xuXG4gICAgICBjb25zdCB1c2VyID0gc3RhdGUudXNlciB8fCAoeyBuYW1lOiAnQW5vbnltb3VzJyB9IGFzIHVua25vd24gYXMgVFVzZXIpO1xuICAgICAgc2V0U3RhdGVVc2VyKHVzZXIpO1xuICAgICAgc2V0QXV0aFVzZXIodXNlcik7XG4gICAgfVxuICB9LCBbXSk7XG5cbiAgY29uc3QgdmFsdWUgPSBSZWFjdC51c2VNZW1vKCgpID0+ICh7XG4gICAgaXNMb2FkaW5nLFxuICAgIGlzQXV0aGVudGljYXRlZDogISFhdXRoVXNlcixcbiAgICB1c2VyOiBhdXRoVXNlcixcbiAgICBzaWduSW4sXG4gICAgbG9nT3V0LFxuICB9KSwgW2lzTG9hZGluZywgYXV0aFVzZXIsIHNpZ25JbiwgbG9nT3V0XSk7XG5cbiAgcmV0dXJuIChcbiAgICA8QXV0aENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3ZhbHVlfT5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0F1dGhDb250ZXh0LlByb3ZpZGVyPlxuICApO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBdXRoUHJvdmlkZXI7XG4iXSwidmVyc2lvbiI6M30= \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ee/AuthProvider_eea598efbe4e77742c20233e9c6f5c18.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ee/AuthProvider_eea598efbe4e77742c20233e9c6f5c18.map deleted file mode 100644 index bc9978c..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/ee/AuthProvider_eea598efbe4e77742c20233e9c6f5c18.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,oCAyDC;AApED,6CAA+B;AAE/B,gEAAwC;AACxC,6CAA4F;AAC5F,2CAA4D;AAO5D,SAAgB,YAAY,CAA8B,EAAE,QAAQ,EAAqB;IACvF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAe,IAAI,CAAC,CAAC;IACnE,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,YAAqB,EAAE,EAAE;QACzD,IAAA,yBAAe,GAAE,CAAC;QAClB,WAAW,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YAC3D,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,YAAY,IAAI,GAAG,CAAC;QAC7C,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,UAAU,mBAAmB;YAChC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,IAAA,qBAAY,GAAE,CAAC;gBAC7B,IAAI,KAAK,EAAE,CAAC;oBACV,IAAI,IAAA,sBAAY,EAAC,KAAK,CAAC,EAAE,CAAC;wBACxB,MAAM,IAAI,GAAG,IAAA,sBAAY,GAAE,CAAC;wBAC5B,WAAW,CAAC,IAAI,CAAC,CAAC;oBACpB,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAW,CAAC,CAAC,CAAC,sCAAsC;oBAC7D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACrD,CAAC;oBAAS,CAAC;gBACT,UAAU,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,mBAAmB,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,KAAgC,EAAE,EAAE;QACpE,IAAI,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,KAAK,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC;YACxF,IAAA,qBAAY,EAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAEpC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAK,EAAE,IAAI,EAAE,WAAW,EAAuB,CAAC;YACvE,IAAA,sBAAY,EAAC,IAAI,CAAC,CAAC;YACnB,WAAW,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACjC,SAAS;QACT,eAAe,EAAE,CAAC,CAAC,QAAQ;QAC3B,IAAI,EAAE,QAAQ;QACd,MAAM;QACN,MAAM;KACP,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3C,OAAO,CACL,oBAAC,qBAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAC/B,QAAQ,CACY,CACxB,CAAC;AACJ,CAAC;AAED,kBAAe,YAAY,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport AuthContext from './AuthContext';\nimport { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers';\nimport { setAuthToken, getAuthToken } from './utils/cookie';\nimport { AuthStateInterface } from './types';\n\nexport interface AuthProviderProps {\n children: React.ReactNode;\n}\n\nexport function AuthProvider>({ children }: AuthProviderProps) {\n const [authUser, setAuthUser] = React.useState(null);\n const [isLoading, setLoading] = React.useState(true);\n\n const logOut = React.useCallback((redirectPath?: string) => {\n deleteStateUser();\n setAuthUser(null);\n if (typeof window !== 'undefined' && redirectPath !== null) {\n window.location.href = redirectPath || '/';\n }\n }, []);\n\n React.useEffect(() => {\n async function loadUserFromCookies() {\n try {\n const token = getAuthToken();\n if (token) {\n if (isTokenValid(token)) {\n const user = getStateUser();\n setAuthUser(user);\n } else {\n logOut(null as any); // Logout without redirect during init\n }\n }\n } catch (error) {\n console.error('Failed to load auth state:', error);\n } finally {\n setLoading(false);\n }\n }\n loadUserFromCookies();\n }, [logOut]);\n\n const signIn = React.useCallback((state: AuthStateInterface) => {\n if (state?.token) {\n const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:';\n setAuthToken(state.token, isSecure);\n\n const user = state.user || ({ name: 'Anonymous' } as unknown as TUser);\n setStateUser(user);\n setAuthUser(user);\n }\n }, []);\n\n const value = React.useMemo(() => ({\n isLoading,\n isAuthenticated: !!authUser,\n user: authUser,\n signIn,\n logOut,\n }), [isLoading, authUser, signIn, logOut]);\n\n return (\n \n {children}\n \n );\n}\n\nexport default AuthProvider;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/fd/useAuth_fde6c53bf404770a280a00877f52e3df b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/fd/useAuth_fde6c53bf404770a280a00877f52e3df deleted file mode 100644 index 872d9b4..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/fd/useAuth_fde6c53bf404770a280a00877f52e3df +++ /dev/null @@ -1,51 +0,0 @@ -9e7bc81db5b5adc84d25bd53365c40ba -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || (function () { - var ownKeys = function(o) { - ownKeys = Object.getOwnPropertyNames || function (o) { - var ar = []; - for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; - return ar; - }; - return ownKeys(o); - }; - return function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); - __setModuleDefault(result, mod); - return result; - }; -})(); -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __importStar(require("react")); -const AuthContext_1 = __importDefault(require("./AuthContext")); -const errors_1 = require("./errors"); -const useAuth = () => { - const context = React.useContext(AuthContext_1.default); - if (context === null) { - throw new errors_1.AuthError('AuthProvider is missing. Please add the AuthProvider'); - } - return context; -}; -exports.default = useAuth; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJmaWxlIjoiL1VzZXJzL2Frb3NpZGVuY2lvL0RvY3VtZW50cy9CT09LU1BJTkUvcmVhY3Qtc3RhcnRlci1hdXRoL3NyYy91c2VBdXRoLnRzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQStCO0FBQy9CLGdFQUF3QztBQUN4QyxxQ0FBcUM7QUFHckMsTUFBTSxPQUFPLEdBQUcsR0FBd0QsRUFBRTtJQUN0RSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDLHFCQUFXLENBQUMsQ0FBQztJQUM5QyxJQUFJLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFNLElBQUksa0JBQVMsQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO0lBQ2hGLENBQUM7SUFDRCxPQUFPLE9BQWlDLENBQUM7QUFDN0MsQ0FBQyxDQUFDO0FBRUYsa0JBQWUsT0FBTyxDQUFDIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi9Vc2Vycy9ha29zaWRlbmNpby9Eb2N1bWVudHMvQk9PS1NQSU5FL3JlYWN0LXN0YXJ0ZXItYXV0aC9zcmMvdXNlQXV0aC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgQXV0aENvbnRleHQgZnJvbSAnLi9BdXRoQ29udGV4dCc7XG5pbXBvcnQgeyBBdXRoRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQgeyBBdXRoQ29udGV4dFR5cGUgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgdXNlQXV0aCA9IDxUVXNlciA9IFJlY29yZDxzdHJpbmcsIGFueT4+KCk6IEF1dGhDb250ZXh0VHlwZTxUVXNlcj4gPT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEF1dGhDb250ZXh0KTtcbiAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKCdBdXRoUHJvdmlkZXIgaXMgbWlzc2luZy4gUGxlYXNlIGFkZCB0aGUgQXV0aFByb3ZpZGVyJyk7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0IGFzIEF1dGhDb250ZXh0VHlwZTxUVXNlcj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCB1c2VBdXRoO1xuIl0sInZlcnNpb24iOjN9 \ No newline at end of file diff --git a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/fd/useAuth_fde6c53bf404770a280a00877f52e3df.map b/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/fd/useAuth_fde6c53bf404770a280a00877f52e3df.map deleted file mode 100644 index 2d25dbd..0000000 --- a/.jest-cache/jest-transform-cache-035ab3f27a3c3d5379cf62831f4255ef-79ef2876fae7ca75eedb2aa53dc48338/fd/useAuth_fde6c53bf404770a280a00877f52e3df.map +++ /dev/null @@ -1 +0,0 @@ -{"file":"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAA+B;AAC/B,gEAAwC;AACxC,qCAAqC;AAGrC,MAAM,OAAO,GAAG,GAAwD,EAAE;IACtE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,qBAAW,CAAC,CAAC;IAC9C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,MAAM,IAAI,kBAAS,CAAC,sDAAsD,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAiC,CAAC;AAC7C,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC","names":[],"sources":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts"],"sourcesContent":["import * as React from 'react';\nimport AuthContext from './AuthContext';\nimport { AuthError } from './errors';\nimport { AuthContextType } from './types';\n\nconst useAuth = >(): AuthContextType => {\n const context = React.useContext(AuthContext);\n if (context === null) {\n throw new AuthError('AuthProvider is missing. Please add the AuthProvider');\n }\n return context as AuthContextType;\n};\n\nexport default useAuth;\n"],"version":3} \ No newline at end of file diff --git a/.jest-cache/perf-cache-035ab3f27a3c3d5379cf62831f4255ef-da39a3ee5e6b4b0d3255bfef95601890 b/.jest-cache/perf-cache-035ab3f27a3c3d5379cf62831f4255ef-da39a3ee5e6b4b0d3255bfef95601890 deleted file mode 100644 index b6468a7..0000000 --- a/.jest-cache/perf-cache-035ab3f27a3c3d5379cf62831f4255ef-da39a3ee5e6b4b0d3255bfef95601890 +++ /dev/null @@ -1 +0,0 @@ -{"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/dist/utils/__tests__/cookie.test.d.ts":[1,0],"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/dist/__tests__/AuthProvider.test.d.ts":[1,0],"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/dist/utils/__tests__/helpers.test.d.ts":[1,0],"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts":[1,6058],"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts":[1,5916],"/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx":[1,6939]} \ No newline at end of file diff --git a/.jest-cache/ts-jest/4a/7328d7b23fcda496d2edeefbd8ee98d8da998e/e9a8ee471bc676fe755c57379268f21a1390a7a4 b/.jest-cache/ts-jest/4a/7328d7b23fcda496d2edeefbd8ee98d8da998e/e9a8ee471bc676fe755c57379268f21a1390a7a4 deleted file mode 100644 index a9a9c4a..0000000 --- a/.jest-cache/ts-jest/4a/7328d7b23fcda496d2edeefbd8ee98d8da998e/e9a8ee471bc676fe755c57379268f21a1390a7a4 +++ /dev/null @@ -1 +0,0 @@ -[["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/dist/utils/__tests__/cookie.test.d.ts",{"fileContent":"export {};\n//# sourceMappingURL=cookie.test.d.ts.map","resolvedModuleNames":[]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/helpers.test.ts",{"fileContent":"import { isTokenValid, getStateUser, setStateUser, deleteStateUser } from '../helpers';\nimport * as CookieUtils from '../cookie';\n\njest.mock('../cookie', () => ({\n getAuthToken: jest.fn(),\n clearAuthToken: jest.fn(),\n}));\n\ndescribe('Helper Utils', () => {\n const mockUser = { name: 'Test User', email: 'test@example.com' };\n\n beforeEach(() => {\n jest.clearAllMocks();\n Object.defineProperty(window, 'localStorage', {\n value: {\n getItem: jest.fn(),\n setItem: jest.fn(),\n removeItem: jest.fn(),\n },\n writable: true,\n });\n });\n\n describe('User State Persistence', () => {\n it('should set user state in localStorage', () => {\n setStateUser(mockUser);\n expect(window.localStorage.setItem).toHaveBeenCalledWith('starter_auth_user', JSON.stringify(mockUser));\n });\n\n it('should get user state from localStorage', () => {\n (window.localStorage.getItem as jest.Mock).mockReturnValue(JSON.stringify(mockUser));\n const user = getStateUser();\n expect(user).toEqual(mockUser);\n });\n\n it('should delete user state', () => {\n deleteStateUser();\n expect(CookieUtils.clearAuthToken).toHaveBeenCalled();\n expect(window.localStorage.removeItem).toHaveBeenCalledWith('starter_auth_user');\n });\n });\n\n describe('isTokenValid', () => {\n it('should return true for valid non-expired token', () => {\n const futureTime = Math.floor(Date.now() / 1000) + 3600;\n const validToken = `header.${btoa(JSON.stringify({ exp: futureTime }))}.signature`;\n expect(isTokenValid(validToken)).toBe(true);\n });\n\n it('should return false for expired token', () => {\n const pastTime = Math.floor(Date.now() / 1000) - 3600;\n const expiredToken = `header.${btoa(JSON.stringify({ exp: pastTime }))}.signature`;\n expect(isTokenValid(expiredToken)).toBe(false);\n });\n\n it('should return false for null/empty token', () => {\n expect(isTokenValid('')).toBe(false);\n // @ts-ignore\n expect(isTokenValid(null)).toBe(false);\n });\n\n it('should handle malformed token gracefully (currently crashes, needs fix)', () => {\n // This test documents current behavior or expected fix\n try {\n expect(isTokenValid('malformed.token')).toBe(false);\n } catch (e) {\n // Expected to throw in current implementation\n }\n });\n });\n});\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/types.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/__tests__/AuthProvider.test.tsx",{"fileContent":"import React from 'react';\nimport { render, screen, act } from '@testing-library/react';\nimport AuthProvider from '../AuthProvider';\n\nimport useAuth from '../useAuth';\nimport * as CookieUtils from '../utils/cookie';\nimport * as Helpers from '../utils/helpers';\n\n// Mocks\njest.mock('../utils/cookie');\njest.mock('../utils/helpers');\n\nconst TestComponent = () => {\n const { isAuthenticated, user, signIn, logOut } = useAuth();\n return (\n
\n
{isAuthenticated ? 'Authenticated' : 'Not Authenticated'}
\n
{user ? user.name : 'No User'}
\n \n \n
\n );\n};\n\ndescribe('AuthProvider', () => {\n beforeEach(() => {\n jest.clearAllMocks();\n // Default mock implementations\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue(null);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(null);\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(false);\n });\n\n it('renders children', () => {\n render(\n \n
Child Content
\n
\n );\n expect(screen.getByText('Child Content')).toBeTruthy();\n });\n\n it('initializes as not authenticated by default', () => {\n render(\n \n \n \n );\n expect(screen.getByText('Not Authenticated')).toBeTruthy();\n });\n\n it('loads user from cookies if token is valid', async () => {\n const mockUser = { name: 'Existing User' };\n (CookieUtils.getAuthToken as jest.Mock).mockReturnValue('valid-token');\n (Helpers.isTokenValid as jest.Mock).mockReturnValue(true);\n (Helpers.getStateUser as jest.Mock).mockReturnValue(mockUser);\n\n await act(async () => {\n render(\n \n \n \n );\n });\n\n expect(screen.getByText('Authenticated')).toBeTruthy();\n expect(screen.getByText('Existing User')).toBeTruthy();\n });\n\n it('signs in user and updates state', () => {\n render(\n \n \n \n );\n\n act(() => {\n screen.getByText('Sign In').click();\n });\n\n expect(CookieUtils.setAuthToken).toHaveBeenCalled();\n expect(Helpers.setStateUser).toHaveBeenCalled();\n });\n});\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/types.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthProvider.tsx",{"fileContent":"import * as React from 'react';\n\nimport AuthContext from './AuthContext';\nimport { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers';\nimport { setAuthToken, getAuthToken } from './utils/cookie';\nimport { AuthStateInterface } from './types';\n\nexport interface AuthProviderProps {\n children: React.ReactNode;\n}\n\nexport function AuthProvider>({ children }: AuthProviderProps) {\n const [authUser, setAuthUser] = React.useState(null);\n const [isLoading, setLoading] = React.useState(true);\n\n const logOut = React.useCallback((redirectPath?: string) => {\n deleteStateUser();\n setAuthUser(null);\n if (typeof window !== 'undefined' && redirectPath !== null) {\n window.location.href = redirectPath || '/';\n }\n }, []);\n\n React.useEffect(() => {\n async function loadUserFromCookies() {\n try {\n const token = getAuthToken();\n if (token) {\n if (isTokenValid(token)) {\n const user = getStateUser();\n setAuthUser(user);\n } else {\n logOut(null as any); // Logout without redirect during init\n }\n }\n } catch (error) {\n console.error('Failed to load auth state:', error);\n } finally {\n setLoading(false);\n }\n }\n loadUserFromCookies();\n }, [logOut]);\n\n const signIn = React.useCallback((state: AuthStateInterface) => {\n if (state?.token) {\n const isSecure = typeof window !== 'undefined' && window.location.protocol === 'https:';\n setAuthToken(state.token, isSecure);\n\n const user = state.user || ({ name: 'Anonymous' } as unknown as TUser);\n setStateUser(user);\n setAuthUser(user);\n }\n }, []);\n\n const value = React.useMemo(() => ({\n isLoading,\n isAuthenticated: !!authUser,\n user: authUser,\n signIn,\n logOut,\n }), [isLoading, authUser, signIn, logOut]);\n\n return (\n \n {children}\n \n );\n}\n\nexport default AuthProvider;\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/types.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts",{"fileContent":"import * as React from 'react';\nimport { AuthContextType } from './types';\n\nconst AuthContext = React.createContext | null>(null);\n\nexport default AuthContext;\n\n\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/types.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/helpers.ts",{"fileContent":"import { getAuthToken, clearAuthToken } from \"./cookie\"\n\nimport { AuthError } from \"../errors\";\nimport { TokenObject, TokenHeader, TokenDecodeOptions } from \"../types\"\n\nfunction setStateUser>(user: TUser) {\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.setItem('starter_auth_user', JSON.stringify(user));\n }\n}\n\nfunction getStateUser>(): TUser | null {\n if (typeof window !== \"undefined\" && window.localStorage) {\n const user = localStorage.getItem('starter_auth_user');\n if (user) {\n return JSON.parse(user) as TUser;\n }\n }\n return null;\n}\n\nfunction deleteStateUser() {\n clearAuthToken()\n if (typeof window !== \"undefined\" && window.localStorage) {\n localStorage.removeItem('starter_auth_user');\n }\n}\n\nfunction isAuthenticated() {\n const token = getAuthToken()\n if (token) {\n return isTokenValid(token)\n }\n return false\n}\n\nfunction b64DecodeUnicode(str: string) {\n return decodeURIComponent(\n atob(str).replace(/(.)/g, (p) => {\n let code = (p as string).charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }),\n );\n}\n\nfunction base64UrlDecode(str: string) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n\n try {\n return b64DecodeUnicode(output);\n } catch (err) {\n return atob(output);\n }\n}\n\nfunction tokenDecode(token: string, options?: TokenDecodeOptions): T {\n if (typeof token !== \"string\") {\n throw new AuthError(\"Invalid token specified: must be a string\");\n }\n options ||= {};\n\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n\n if (typeof part !== \"string\") {\n throw new AuthError(`Invalid token specified: missing part #${pos + 1}`);\n }\n\n let decoded: string;\n try {\n decoded = base64UrlDecode(part);\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid base64 for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n\n try {\n return JSON.parse(decoded) as T;\n } catch (e) {\n throw new AuthError(\n `Invalid token specified: invalid json for part #${pos + 1} (${(e as Error).message})`,\n );\n }\n}\n\nfunction isTokenValid(token: string): boolean {\n try {\n if (token) {\n const decodedJwt: TokenObject = tokenDecode(token);\n if (typeof decodedJwt === 'object' && decodedJwt !== null) {\n if (decodedJwt.exp) {\n return decodedJwt.exp * 1000 > Date.now()\n }\n }\n }\n return false;\n } catch (error) {\n return false;\n }\n}\n\n\nexport { isTokenValid, setStateUser, getStateUser, deleteStateUser, isAuthenticated, tokenDecode };\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/types.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts",{"fileContent":"import Cookies from \"js-cookie\";\n\nconst tokenName = 'starter_auth_token'\n\nconst setAuthToken = (token: string, secure: boolean) => {\n // Default to strict security\n const isIdsProduction = process.env.NODE_ENV === 'production';\n const isSecure = typeof secure === 'boolean' ? secure : isIdsProduction;\n\n Cookies.set(tokenName, token, {\n secure: isSecure,\n sameSite: 'Strict',\n expires: 7 // 7 days default\n });\n};\n\nconst getAuthToken = (): string | null => {\n return Cookies.get(tokenName) || null;\n};\n\nconst clearAuthToken = () => {\n Cookies.remove(tokenName);\n};\n\nexport { setAuthToken, getAuthToken, clearAuthToken }","resolvedModuleNames":[]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts",{"fileContent":"\nexport class AuthError extends Error {\n /**\n * @constructor\n * @param message - Error message\n */\n constructor(message: string) {\n super(message);\n }\n}\n","resolvedModuleNames":[]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/useAuth.ts",{"fileContent":"import * as React from 'react';\nimport AuthContext from './AuthContext';\nimport { AuthError } from './errors';\nimport { AuthContextType } from './types';\n\nconst useAuth = >(): AuthContextType => {\n const context = React.useContext(AuthContext);\n if (context === null) {\n throw new AuthError('AuthProvider is missing. Please add the AuthProvider');\n }\n return context as AuthContextType;\n};\n\nexport default useAuth;\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/AuthContext.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/errors.ts","/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/types.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/__tests__/cookie.test.ts",{"fileContent":"import Cookies from 'js-cookie';\nimport { setAuthToken, getAuthToken, clearAuthToken } from '../cookie';\n\njest.mock('js-cookie', () => ({\n set: jest.fn(),\n get: jest.fn(),\n remove: jest.fn(),\n}));\n\ndescribe('Cookie Utils', () => {\n const token = 'test-token';\n\n afterEach(() => {\n jest.clearAllMocks();\n });\n\n it('should set auth token with secure flag', () => {\n setAuthToken(token, true);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, expect.objectContaining({ secure: true }));\n });\n\n it('should set auth token without secure flag', () => {\n setAuthToken(token, false);\n expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, expect.objectContaining({ secure: false }));\n });\n\n it('should get auth token', () => {\n (Cookies.get as jest.Mock).mockReturnValue(token);\n const result = getAuthToken();\n expect(Cookies.get).toHaveBeenCalledWith('starter_auth_token');\n expect(result).toBe(token);\n });\n\n it('should clear auth token', () => {\n clearAuthToken();\n expect(Cookies.remove).toHaveBeenCalledWith('starter_auth_token');\n });\n});\n","resolvedModuleNames":["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/src/utils/cookie.ts"]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/dist/utils/__tests__/helpers.test.d.ts",{"fileContent":"export {};\n//# sourceMappingURL=helpers.test.d.ts.map","resolvedModuleNames":[]}],["/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/dist/__tests__/AuthProvider.test.d.ts",{"fileContent":"export {};\n//# sourceMappingURL=AuthProvider.test.d.ts.map","resolvedModuleNames":[]}]] \ No newline at end of file diff --git a/.npmignore b/.npmignore deleted file mode 100644 index c107bc1..0000000 --- a/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -npm-debug.log -node_modules -build/* -examples \ No newline at end of file diff --git a/.release-it.json b/.release-it.json index 4653d43..79314d6 100644 --- a/.release-it.json +++ b/.release-it.json @@ -1,18 +1,21 @@ { - "git": { - "commitMessage": "chore: release v${version}", - "tagName": "v${version}" - }, - "npm": { - "publish": true - }, - "github": { - "release": true - }, - "plugins": { - "@release-it/conventional-changelog": { - "preset": "angular", - "infile": "CHANGELOG.md" - } + "git": { + "commitMessage": "chore: release v${version}", + "tagName": "v${version}", + "tagAnnotation": "Release v${version}" + }, + "npm": { + "publish": true + }, + "github": { + "release": true, + "releaseName": "v${version}", + "autoGenerate": false + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": "angular", + "ignoreRecommendedBump": true } -} \ No newline at end of file + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..63cd52c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,99 @@ +# Changelog + +All notable changes to this project are documented here. This project follows +[Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## 1.0.0 — 2026-08-13 + +First stable release, and a rewrite. The 0.1.x line kept the JWT in a +JavaScript-readable cookie, kept the user in `localStorage`, and never verified a +token signature. None of that could be fixed incrementally — the token had to +move to the server — so the API changed shape. + +**See [MIGRATION.md](MIGRATION.md) for the step-by-step upgrade.** + +### ⚠️ Breaking changes + +- **The package scope changed** to `@thinkgrid/react-starter-auth`. +- **A server is now required.** Mount the handlers from + `@thinkgrid/react-starter-auth/server`; there must be somewhere to hold the + token. Apps with no server of their own have no equivalently safe option — see + the SPA caveat in the README. +- **`createAuthClient()` replaces the top-level exports.** `AuthProvider`, + `useAuth` and `fetcher` are returned from it rather than imported directly, so + the user type is declared once instead of asserted at every call site. +- **`signIn` takes credentials, not a token.** It posts them to your server and + never receives one back. It throws an `AuthError` carrying the server's error + code on failure. +- **`logOut(path)` became `signOut({ redirectTo })`**, which resolves instead of + forcing a full page load. The `logOut(null as any)` escape hatch is gone. +- **`ProtectedRoute` and `withAuthentication` were removed**, replaced by + `useRequireAuth()`, `` and ``. +- **`status` replaces the `isLoading` / `isAuthenticated` pair** as the source of + truth. Both remain, derived, so they can no longer contradict each other. +- **`fetcher` no longer sends an `Authorization` header.** It sends the session + cookie, attaches CSRF, and refreshes once on a `401`. +- **Removed:** `isTokenValid`, `tokenDecode`, `setAuthToken`, `getAuthToken`, + `setStateUser`, `getStateUser`. +- **`js-cookie` is no longer a dependency.** `jose` is the only runtime one. +- **React 19 is supported**; the peer range now covers 16.8 through 19. + +### Added + +- **HttpOnly sessions.** The token lives server-side in an encrypted + (`dir` + `A256GCM` JWE) `HttpOnly`, `Secure`, `SameSite=Lax` cookie, with the + `__Host-` prefix applied automatically when the cookie qualifies for it. +- **Real JWT verification** via `jose`, against a JWKS or a shared secret, with + an explicit algorithm allowlist. `none` is rejected at construction, closing + the `alg: none` and RS256→HS256 downgrades. +- **CSRF protection**: double-submit token plus `Origin` / `Sec-Fetch-Site` + validation on every unsafe request. Disabling it for a cross-site cookie + throws at startup rather than shipping. +- **Refresh rotation**, single-flight on the client, with optional reuse + detection when a `SessionStore` is supplied. +- **Server-rendered sessions.** `initialSession` makes the first client render + correct — no loading flash, no hydration mismatch, no fetch on mount. +- **Framework adapters**: `/next` (route handlers, `getSession` from `cookies()`, + a middleware `guard`), `/react-router` (loader/action plus a throwing + `requireSession`), `/node` (Express/Fastify bridge), and `/core` for anything + else. No adapter imports its framework — all are duck-typed, so none becomes a + peer dependency. +- **Separate `Session` and `SealedSession` types**, so serializing a token into a + response body is a compile error rather than a review catch. +- Cross-tab sign-out via `BroadcastChannel`, revalidation on window focus, and a + refresh scheduled before the access token expires. +- Runs on Node, edge middleware, Workers, Deno and Bun — the server core touches + only `Request`, `Response` and `crypto`. +- A working [Next.js App Router example](examples/next-js). +- `LICENSE` (MIT), which had been claimed in the README but never included. + +### Fixed + +- Cookie lifetime is derived from the access token's `exp` when no refresh + callback is configured, instead of a hardcoded 7 days — a stale cookie can no + longer outlive the credential inside it. +- Route guards read auth state from context rather than re-reading cookies, so + signing out re-renders the protected subtree instead of leaving it on screen. +- Guards no longer read cookies during render, which was causing SSR hydration + mismatches and a flash of the wrong UI. +- `signIn` no longer fabricates a `{ name: 'Anonymous' }` user when none is + supplied, which previously reported an unauthenticated visitor as signed in. +- `AuthError` sets `name`, so it no longer stringifies as a plain `Error`. +- Redirects go through an injectable `navigate`, preserving client-side routing + instead of forcing a full document load. + +### Packaging + +- Dual ESM and CJS builds with a full `exports` map across six entry points, plus + `sideEffects: false`. `main` previously pointed at an ESM file with no `type` + field, which threw on Node 18. +- Test declarations no longer ship in the tarball. + +### Internal + +- 184 unit tests and 9 Playwright end-to-end tests, with a coverage gate in CI. + The e2e suite asserts in a real browser that `document.cookie` does not contain + the session after signing in. +- CI ran a `lint` script that did not exist, so it had never passed. Releases + published on every push to `main` with no dependency on tests passing; they are + now gated on a green CI run and skip versions that are already tagged. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2a159ab --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 ThinkGrid Labs + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/MIGRATION.md b/MIGRATION.md new file mode 100644 index 0000000..a1cc692 --- /dev/null +++ b/MIGRATION.md @@ -0,0 +1,215 @@ +# Migrating from 0.1.x + +0.1.x kept the JWT in a JavaScript-readable cookie, kept the user in `localStorage`, and never verified a signature. None of that can be fixed incrementally — the token has to move to the server — so the client API changed shape. + +The upgrade is mechanical, but it has one genuinely new obligation: **there must be a server.** That is the whole point. + +--- + +## What changed and why + +| 0.1.x | Now | Why | +|---|---|---| +| Token in a JS-readable cookie | `HttpOnly` cookie, server-side | An XSS could read and exfiltrate the old one | +| User in `localStorage` | Never persisted client-side | Same exposure, plus it outlived the session | +| `isTokenValid()` decodes only | `jose` verifies the signature | A forged token with a future `exp` passed every guard | +| `ProtectedRoute` blocked render | Middleware blocks the request | The old check was client-side, so cosmetic | +| Cookie fixed at 7 days | Derived from the token's `exp` | The cookie could outlive the credential inside it | +| No CSRF defence | Double-submit + `Origin` check | Cookie auth without CSRF is exploitable | + +`js-cookie` is no longer a dependency. The only runtime dependency is `jose`. + +--- + +## Step 1 — Add the server handlers + +This is the new part. Mount them wherever your app already has a server. + +```ts +// auth.ts +import { createAuthHandlers } from '@thinkgrid/react-starter-auth/server'; + +export const auth = createAuthHandlers({ + secret: process.env.AUTH_SECRET!, // 32+ chars: openssl rand -base64 32 + authenticate: async ({ email, password }) => { + // Whatever your old login endpoint did, do it here instead. + const res = await api.login({ email, password }); + if (!res.ok) return null; + return { + user: { id: res.user.id, name: res.user.name }, + accessToken: res.access_token, + refreshToken: res.refresh_token, + }; + }, +}); +``` + +```ts +// Next.js App Router — app/api/auth/[...auth]/route.ts +import { createNextAdapter } from '@thinkgrid/react-starter-auth/next'; +import { auth } from '@/auth'; + +export const { GET, POST } = createNextAdapter(auth).handlers; +``` + +Other frameworks: `/react-router` for loaders and actions, `/node` for Express and Fastify, or `auth.handle` directly — it is a plain `(Request) => Promise`. + +If your app has **no** server, see the SPA caveat in the [README](README.md#-framework-adapters). There is no configuration that makes a serverless SPA as safe as this. + +--- + +## Step 2 — Replace the imports with one client + +```diff +- import { AuthProvider, useAuth, fetcher } from '@thinkgrid/react-starter-auth'; ++ import { createAuthClient } from '@thinkgrid/react-starter-auth'; ++ ++ export interface User { id: string; name: string } ++ ++ export const { AuthProvider, useAuth, useRequireAuth, SignedIn, SignedOut, fetcher } = ++ createAuthClient({ basePath: '/api/auth' }); +``` + +Declaring `User` once here replaces `useAuth()` at every call site. The old per-call type argument was an unchecked assertion — a wrong one failed silently at runtime. + +--- + +## Step 3 — Pass the session in from the server + +```diff +- {children} ++ {children} +``` + +This is what removes the loading flash and the hydration mismatch. Omit `initialSession` and the provider fetches on mount instead — correct, but with a brief `loading` state. + +--- + +## Step 4 — Rewrite sign-in + +```diff +- const { token, user } = await api.login(credentials); +- signIn({ token, user }); ++ await signIn({ email, password }); +``` + +`signIn` now posts credentials to your server and never receives a token. It throws an `AuthError` carrying the server's error code (`invalid_credentials`, …) instead of returning silently. + +**Watch for this:** `signIn({ token })` with no user used to fabricate `{ name: 'Anonymous' }` and report you as authenticated. If you relied on that, you were relying on a bug. + +--- + +## Step 5 — Replace state checks + +```diff +- const { isLoading, isAuthenticated, user } = useAuth(); ++ const { status, user } = useAuth(); ++ // status: 'loading' | 'authenticated' | 'unauthenticated' +``` + +`isLoading` and `isAuthenticated` still exist, but they are now derived from `status` and cannot contradict it. Prefer `status` — it is the only value that distinguishes "still checking" from "signed out". + +--- + +## Step 6 — Replace sign-out + +```diff +- logOut('/goodbye'); // always a full page reload +- logOut(null as any); // the only way to avoid navigating ++ await signOut({ redirectTo: '/goodbye' }); ++ await signOut(); // stays put +``` + +`signOut` resolves instead of navigating, and redirects go through the client's `navigate` — pass your router's push to keep client-side routing: + +```ts +createAuthClient({ navigate: (path) => router.push(path) }); +``` + +--- + +## Step 7 — Replace the route guards + +```diff +- ++ // in Dashboard: ++ const status = useRequireAuth({ redirectTo: '/login' }); ++ if (status !== 'authenticated') return null; +``` + +```diff +- export default withAuthentication(PrivatePage); ++ // inside PrivatePage: ++ useRequireAuth(); +``` + +Or declaratively: + +```tsx +}> + + + + + +``` + +**Then add the real check.** The guards above are UX; they run in the browser after render. Enforce on the server: + +```ts +// Next.js — src/middleware.ts (must be in src/ when you use a src directory) +export async function middleware(request: NextRequest) { + const redirectTo = await nextAuth.guard(request, { redirectTo: '/login' }); + return redirectTo ? NextResponse.redirect(redirectTo) : NextResponse.next(); +} +export const config = { matcher: ['/dashboard', '/dashboard/:path*'] }; +``` + +--- + +## Step 8 — Update data fetching + +`fetcher` keeps its name and signature, but the mechanics changed: it sends the session cookie with `credentials: 'include'`, attaches the CSRF header on unsafe methods, and on a `401` refreshes once (single-flight) and retries. It no longer attaches an `Authorization` header, because it no longer has a token. + +```ts +const res = await fetcher('/api/books'); +``` + +To call a resource API **from the server**, take the token from the sealed session: + +```ts +const sealed = await auth.getSealedSession(request); +await fetch('https://api.example.com/me', { + headers: { Authorization: `Bearer ${sealed!.accessToken}` }, +}); +``` + +`getSession` returns public state with no token; `getSealedSession` includes it. They are separate types so serializing the wrong one into a response is a compile error. + +--- + +## Removed exports + +| Removed | Replacement | +|---|---| +| `ProtectedRoute` | `useRequireAuth()` or `` | +| `withAuthentication` | `useRequireAuth()` inside the component | +| `AuthProvider` (top-level) | returned by `createAuthClient()` | +| `useAuth` (top-level) | returned by `createAuthClient()` | +| `fetcher` (top-level) | returned by `createAuthClient()`, or `createFetcher()` | +| `isTokenValid`, `tokenDecode` | server-side verification via `jwt` config | +| `setStateUser`, `getStateUser` | nothing — the user is not persisted client-side | +| `setAuthToken`, `getAuthToken` | nothing — the client never holds a token | + +--- + +## Checklist + +- [ ] `AUTH_SECRET` set, at least 32 characters, and not in version control +- [ ] Handlers mounted; `GET /api/auth/session` returns 401 when signed out +- [ ] `basePath` matches on both client and server +- [ ] `initialSession` passed from the server +- [ ] Server-side enforcement added for every protected route +- [ ] `navigate` wired to your router +- [ ] Served over HTTPS in production — the cookie is `Secure` outside development +- [ ] After signing in, `document.cookie` shows `csrf` and **not** the session diff --git a/README.md b/README.md index fe2a5e5..163c0d8 100644 --- a/README.md +++ b/README.md @@ -1,134 +1,417 @@ -# @think-grid-labs/react-starter-auth +# @thinkgrid/react-starter-auth
- React Starter Authentication -

A lightweight, type-safe, and robust authentication suite for React and Next.js.

+ React Starter Authentication +

Secure, configurable JWT authentication for React — the token never reaches the browser.

--- ### 🚀 Features -- **Type-Safe**: Built with TypeScript, supporting generic User objects for better developer experience. -- **Next.js & React Ready**: Optimized for both client-side and server-side contexts. -- **JWT Centric**: Seamless handling of JWT tokens with automatic expiry checks. -- **Secure by Default**: Strict cookie settings and secure state persistence. -- **Fetcher Integration**: Auto-injects `Authorization` headers into your API requests. -- **Route Protection**: Higher-Order Components and Wrapper components for private routes. + +- **HttpOnly sessions.** The token lives on the server inside an encrypted, `HttpOnly`, `SameSite=Lax` cookie. Script cannot read it, so an XSS cannot steal it. +- **Real JWT verification.** Signatures checked with [`jose`](https://github.com/panva/jose) against a JWKS or shared secret, with an algorithm allowlist. `none` is rejected outright. +- **CSRF built in.** Double-submit token plus `Origin` / `Sec-Fetch-Site` validation on every unsafe request. +- **Refresh rotation.** Automatic, single-flight, with optional reuse detection. +- **SSR without the flash.** Resolve the session on the server and the first client render is already correct — no loading spinner, no hydration mismatch. +- **Runs anywhere.** The server core speaks only `Request`/`Response`: Node, Next.js middleware on the edge, Cloudflare Workers, Deno, Bun. +- **One typed client.** `createAuthClient()` fixes your user type once; every hook and component infers it. --- ### 📦 Installation ```bash -# Using pnpm -pnpm add @think-grid-labs/react-starter-auth +pnpm add @thinkgrid/react-starter-auth +# npm install @thinkgrid/react-starter-auth +# yarn add @thinkgrid/react-starter-auth +``` + +`react` and `react-dom` are peer dependencies (16.8+, including 19). The only runtime dependency is `jose`. + +--- + +### 🧭 How it works + +``` +Browser Your server (BFF) Resource API +──────── ───────────────── ──────────── +AuthProvider ──cookie──▶ /login /logout Authorization: +useAuth() ◀──user─── /session /refresh ──token──▶ Bearer … +fetcher() holds access + refresh + verifies with jose +__Host-session enforces CSRF +HttpOnly · Secure · Lax + ▲ + └── script cannot read this. No token. No localStorage. +``` + +The browser holds one opaque cookie and learns *who it is* from `GET /session`. It never holds a credential, so a script injected into your page can act as the user while the page is open but cannot steal anything to replay later. + +--- + +### 🖥️ 1. Mount the server handlers + +```ts +// auth.ts +import { createAuthHandlers } from '@thinkgrid/react-starter-auth/server'; + +export const auth = createAuthHandlers({ + secret: process.env.AUTH_SECRET!, // 32+ chars: openssl rand -base64 32 + + authenticate: async ({ email, password }) => { + const res = await myIdp.login({ email, password }); + if (!res.ok) return null; // null → 401, no detail leaked + return { + user: { id: res.user.id, name: res.user.name }, + accessToken: res.access_token, + refreshToken: res.refresh_token, + }; + }, + + refresh: async (refreshToken) => { // omit to disable refresh + const res = await myIdp.refresh(refreshToken); + return res.ok + ? { user: res.user, accessToken: res.access_token, refreshToken: res.refresh_token } + : null; + }, + + jwt: { jwks: process.env.JWKS_URL }, // optional: verify tokens on the way in +}); +``` + +```ts +// Next.js App Router — app/api/auth/[...auth]/route.ts +import { auth } from '@/auth'; + +export const GET = auth.handle; +export const POST = auth.handle; +``` -# Using npm -npm install @think-grid-labs/react-starter-auth +That exposes five routes under `basePath` (default `/api/auth`): + +| Route | Method | Purpose | +|---|---|---| +| `/login` | POST | Exchange credentials for a session cookie | +| `/logout` | POST | Clear the session | +| `/session` | GET | `{ user, expiresAt }` or 401 — also bootstraps the CSRF token | +| `/refresh` | POST | Rotate tokens | +| `/csrf` | GET | Issue a CSRF token explicitly | + +--- + +### ⚛️ 2. Create the client + +```ts +// auth-client.ts +import { createAuthClient } from '@thinkgrid/react-starter-auth'; + +export interface User { + id: string; + name: string; +} -# Using yarn -yarn add @think-grid-labs/react-starter-auth +export const { AuthProvider, useAuth, useRequireAuth, SignedIn, SignedOut, fetcher } = + createAuthClient({ + basePath: '/api/auth', + // Preserve client-side routing instead of a full page load: + // navigate: (path) => router.push(path), + }); ``` +Declaring `User` once here is what makes `useAuth()` return `User | null` everywhere, with no per-call-site type argument to get wrong. + --- -### 🛠️ Setup +### 🔗 3. Wire the provider -Wrap your application in the `AuthProvider`: +Pass a server-resolved session and the first paint is already correct: ```tsx -import { AuthProvider } from '@think-grid-labs/react-starter-auth'; +// app/layout.tsx +import { auth } from '@/auth'; +import { AuthProvider } from '@/auth-client'; +import { cookies } from 'next/headers'; + +export default async function RootLayout({ children }: { children: React.ReactNode }) { + const session = await auth.getSession( + new Request('http://internal', { headers: { cookie: cookies().toString() } }), + ); -function App({ children }) { return ( - - {children} - + + + {children} + + ); } ``` +Omit `initialSession` entirely and the provider fetches `/session` on mount instead — correct, but with a brief `loading` state. Passing `null` means "the server checked and nobody is signed in". + --- -### 🔑 Authentication Flow +### 🔑 4. Use it -#### Sign In ```tsx -import { useAuth } from '@think-grid-labs/react-starter-auth'; - -const { signIn } = useAuth(); - -const handleLogin = async () => { - const { token, user } = await api.login(credentials); - - signIn({ - token, - user: { - id: user.id, - name: user.display_name, - role: 'admin' - } - }); -}; +'use client'; +import { useAuth, SignedIn, SignedOut } from '@/auth-client'; + +export function Account() { + const { status, user, signIn, signOut } = useAuth(); + + if (status === 'loading') return ; + + return ( + <> + +

Hello {user!.name}

+ +
+ + + + + ); +} +``` + +`status` is `'loading' | 'authenticated' | 'unauthenticated'` and is the single source of truth. `isLoading` and `isAuthenticated` are derived from it, so they can never disagree with it. + +`signIn` takes **credentials, not a token** — it posts them to your server and never sees what comes back. It throws an `AuthError` carrying the server's error code on failure. + +#### Fetching protected data + +```ts +import { fetcher } from '@/auth-client'; + +const res = await fetcher('/api/books'); // sends the cookie, attaches CSRF, +const books = await res.json(); // refreshes once on a 401 and retries ``` -#### Get User (State) +The refresh is single-flight: ten concurrent requests that all `401` trigger one refresh, not ten. + +> Retrying replays your `RequestInit`. A one-shot body (a `ReadableStream`) cannot be replayed — pass a string, `FormData` or `URLSearchParams` if you need the retry. + +#### Redirecting signed-out visitors + ```tsx -import { useAuth } from '@think-grid-labs/react-starter-auth'; +'use client'; +import { useRequireAuth } from '@/auth-client'; -// Define your own User interface for full type safety -interface UserProfile { - id: string; - name: string; - role: string; +export default function Dashboard() { + const status = useRequireAuth({ redirectTo: '/login' }); + if (status !== 'authenticated') return null; + return ; } +``` + +> ⚠️ `useRequireAuth`, `SignedIn` and `SignedOut` are **UX affordances, not access control.** They run in the browser, after render. Authorize on the server — in middleware, a loader, or a server component — for anything that matters. + +--- -const { user, isAuthenticated, isLoading } = useAuth(); +### 🔒 Reading the session on the server -console.log(user?.role); // Fully typed! +```ts +// Public state — safe to send to the client. Cannot contain a token. +const session = await auth.getSession(request); + +// Server-only — includes the access token, for calling your resource API. +const sealed = await auth.getSealedSession(request); +await fetch('https://api.example.com/me', { + headers: { Authorization: `Bearer ${sealed!.accessToken}` }, +}); ``` +`Session` and `SealedSession` are separate types on purpose: the public one has no token field at all, so leaking a credential into a response body is a compile error rather than something a review has to catch. + --- -### 📡 Data Fetching +### ⚙️ Configuration + +Server — everything optional except `secret` and `authenticate`: + +```ts +createAuthHandlers({ + secret: process.env.AUTH_SECRET!, + basePath: '/api/auth', + cookie: { + name: 'session', // gains a __Host- prefix automatically when it qualifies + sameSite: 'lax', // 'strict' breaks OAuth callbacks and email links + secure: true, // defaults to false only under NODE_ENV development/test + maxAge: 60 * 60 * 24 * 7, + }, + csrf: { enabled: true, headerName: 'x-csrf-token', trustedOrigins: [] }, + jwt: { jwks: '…', issuer: '…', audience: '…', algorithms: ['RS256'] }, + session: { strategy: 'jwe' }, // or 'store' with a SessionStore + authenticate, +}); +``` -The `fetcher` utility automatically appends the `Authorization: Bearer ` header to your requests if a valid token exists. +Client: + +```ts +createAuthClient({ + basePath: '/api/auth', // must match the server + csrfCookieName: 'csrf', + csrfHeaderName: 'x-csrf-token', + navigate: (path) => router.push(path), + revalidateOnFocus: true, // re-check the session when the tab regains focus + refreshSkewSeconds: 60, // refresh this early, before the token dies + syncAcrossTabs: true, // sign out in one tab, sign out in all +}); +``` -```tsx -import { fetcher } from '@think-grid-labs/react-starter-auth'; +The defaults encode most of the security decisions: -const getProfile = async () => { - const response = await fetcher('https://api.example.com/me'); - const data = await response.json(); - return data; -}; -``` +- **Cookie lifetime tracks the token.** With no `refresh` callback the cookie's `Max-Age` is clamped to the access token's own `exp`, so a stale cookie can never outlive the credential inside it. With `refresh` configured the cookie spans `cookie.maxAge` instead. +- **`__Host-` prefix** is applied automatically when the cookie is `Secure`, `Path=/` and has no `Domain` — browsers then refuse any cross-subdomain overwrite. Over plain HTTP in development the bare name is used. +- **CSRF cannot be disabled for a cross-site cookie.** `sameSite: 'none'` with `csrf.enabled: false` throws at startup rather than shipping. +- **Algorithms are allowlisted**, defaulting to `RS256`/`ES256` for JWKS and `HS256` for a shared secret. +- **Refresh-token reuse detection** needs state, so it only runs when you supply a `SessionStore` with `consumeRefreshToken`. It is most valuable alongside the default storeless strategy, where the refresh token rides in the cookie and a copied cookie can therefore be replayed. --- -### 🛡️ Route Protection +### 🌍 Framework adapters -#### Using `ProtectedRoute` -```tsx -import { ProtectedRoute } from '@think-grid-labs/react-starter-auth'; -import Dashboard from './Dashboard'; +| Framework | Import | Enforcement point | +|---|---|---| +| Next.js App Router | `/next` | `guard` in middleware | +| React Router 7 · Remix | `/react-router` | `requireSession` in a loader | +| Express · Fastify · Connect | `/node` | `middleware` + `getSession` | +| Hono · Deno · Workers | `/server` | `auth.handle` directly | +| Vite / CRA SPA | root | see the caveat below | + +None of the adapters imports its framework — everything is duck-typed, so no framework becomes a peer dependency. + +#### Next.js + +```ts +// auth.ts +import { createAuthHandlers } from '@thinkgrid/react-starter-auth/server'; +import { createNextAdapter } from '@thinkgrid/react-starter-auth/next'; + +export const auth = createAuthHandlers({ /* … */ }); +export const nextAuth = createNextAdapter(auth); +``` + +```ts +// app/api/auth/[...auth]/route.ts +export const { GET, POST } = nextAuth.handlers; +``` -// Automatically redirects to /login if not authenticated - +```ts +// middleware.ts — the real access control +export async function middleware(request: NextRequest) { + const redirectTo = await nextAuth.guard(request, { redirectTo: '/login' }); + return redirectTo ? NextResponse.redirect(redirectTo) : NextResponse.next(); +} +// Both entries: '/dashboard/:path*' matches the children, not '/dashboard' itself +export const config = { matcher: ['/dashboard', '/dashboard/:path*'] }; ``` -#### Using `withAuthentication` (HOC) +`guard` hands back a `URL` rather than a `Response` so middleware stays in one idiom — the continue branch already needs `NextResponse.next()` — and so headers, cookies and rewrites stay under your control. + ```tsx -import { withAuthentication } from '@think-grid-labs/react-starter-auth'; +// app/layout.tsx — read the session from cookies(), no fake Request needed +const session = await nextAuth.getSession(await cookies()); +return {children}; +``` + +`guard` sends signed-out visitors to `redirectTo` with the original path in a `next` query parameter. Narrow it further with `protect: (pathname) => …`, or drop the parameter with `returnToParam: null`. + +#### React Router 7 / Remix + +```ts +// routes/api.auth.$.ts +export const { loader, action } = createReactRouterAdapter(auth); +``` + +```ts +// any protected loader +export async function loader({ request }: LoaderFunctionArgs) { + const session = await rrAuth.requireSession(request); // throws a redirect if signed out + return { user: session.user }; +} +``` + +`requireSession` throws a redirect `Response`, which is the loader idiom — so the happy path reads as straight-line code. Use `requireSealedSession` when you need the access token to call your API. + +#### Express / Fastify -const PrivatePage = () =>
Private Content
; +```ts +import { createNodeAdapter } from '@thinkgrid/react-starter-auth/node'; -export default withAuthentication(PrivatePage); +const nodeAuth = createNodeAdapter(auth); +app.all('/api/auth/*splat', nodeAuth.middleware); + +app.get('/api/me', async (req, res) => { + const session = await nodeAuth.getSession(req); + if (!session) return res.status(401).json({ error: 'unauthorized' }); + res.json(session.user); +}); ``` +The bridge handles the parts that are easy to get wrong: multiple `Set-Cookie` headers emitted separately rather than folded into one, `x-forwarded-proto` honoured so `Secure` cookies aren't mislabelled behind a proxy, and a body read either from the stream or from whatever your body parser already consumed. + +`toWebRequest` and `sendWebResponse` are exported too, if you would rather wire it yourself. + +**One honest caveat for pure SPAs.** A Vite or CRA app with no server of its own *cannot* set an `HttpOnly` cookie — only a server can. Either serve the app from the same origin as your API so a normal `SameSite=Lax` cookie works, or run the small BFF above. A cross-origin SPA needs `SameSite=None; Secure` plus strict CSRF, which works but is strictly weaker. No configuration makes a serverless SPA as safe as the BFF path. + +**One honest caveat for pure SPAs.** A Vite or CRA app with no server of its own *cannot* set an `HttpOnly` cookie — only a server can. Either serve the app from the same origin as your API so a normal `SameSite=Lax` cookie works, or run the small BFF above. A cross-origin SPA needs `SameSite=None; Secure` plus strict CSRF, which works but is strictly weaker. No configuration makes a serverless SPA as safe as the BFF path. + --- -### 📄 License -MIT © [ThinkGrid-Labs](https://github.com/ThinkGrid-Labs) +### 📂 Example + +[`examples/next-js`](examples/next-js) is a working App Router app: sign-in form, middleware-protected route, and a server component that reads the access token. Build the library first, then: + +```bash +cd examples/next-js && cp .env.example .env.local && pnpm install && pnpm dev +``` + +Sign in, then run `document.cookie` in devtools — you will see `csrf` and not the session. + +--- +### 🧪 Security model + +What this protects against, stated plainly: + +| Threat | Outcome | +|---|---| +| XSS reads the token | **Prevented.** The cookie is `HttpOnly`; no token or user data is in `localStorage`. | +| XSS acts as the user while the page is open | **Not prevented.** No cookie-based scheme can. Keep your dependencies clean and set a CSP. | +| Forged / unsigned token | **Prevented** when `jwt` is configured — signature, issuer, audience and algorithm are all checked. | +| Cross-site request forgery | **Prevented** by double-submit plus `Origin` / `Sec-Fetch-Site`. | +| Stolen cookie replayed | **Detected** when a `SessionStore` with `consumeRefreshToken` is configured. | +| Client-side route guard bypassed | **Expected.** Guards are UX. Authorize on the server. | + +--- + +### ⬆️ Migrating from 0.1.x + +0.1.x kept the JWT in a JavaScript-readable cookie and the user in `localStorage`, and never verified a signature. There is no way to make that secure incrementally, so the client API changed shape. `js-cookie` is no longer a dependency. + +**[MIGRATION.md](MIGRATION.md) has the step-by-step guide.** The summary: + +| 0.1.x | Now | +|---|---| +| `import { AuthProvider, useAuth } from '…'` | `createAuthClient()` returns them | +| `signIn({ token, user })` | `signIn({ email, password })` — the server issues the cookie | +| `isLoading` + `isAuthenticated` | `status`; both remain as derived values | +| `logOut(path)` / `logOut(null as any)` | `signOut()`, or `signOut({ redirectTo })` | +| `` | `useRequireAuth()`, or `` | +| `withAuthentication(X)` | `useRequireAuth()` inside `X` | +| `fetcher(url)` attaches a Bearer header | `fetcher(url)` sends the cookie and refreshes on 401 | +| `useAuth()` per call site | `createAuthClient()` once | +| — | **New:** mount `/server` handlers; this is the required half | + +The one genuinely new obligation is the server: there must be somewhere to hold the token. That is the whole point. + +--- + +### 📄 License +MIT © [ThinkGrid-Labs](https://github.com/thinkgrid-labs) diff --git a/build_error.log b/build_error.log deleted file mode 100644 index 5c7c4c8..0000000 --- a/build_error.log +++ /dev/null @@ -1,23 +0,0 @@ - -src/index.tsx → ./dist... -[!] (plugin rpt2) RollupError: There was an error during the build: - [plugin rpt2] src/AuthProvider.tsx:4:41 - error TS6133: 'isTokenValid' is declared but its value is never read. - -4 import { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers'; -   ~~~~~~~~~~~~ - -Additionally, handling the error in the 'buildEnd' hook caused the following error: - [plugin rpt2] src/AuthProvider.tsx:4:41 - error TS6133: 'isTokenValid' is declared but its value is never read. - -4 import { deleteStateUser, getStateUser, isTokenValid, setStateUser } from './utils/helpers'; -   ~~~~~~~~~~~~ - -src/index.tsx - at Object.getRollupError (/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/node_modules/.pnpm/rollup@4.57.0/node_modules/rollup/dist/shared/parseAst.js:287:41) - at /Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/node_modules/.pnpm/rollup@4.57.0/node_modules/rollup/dist/shared/rollup.js:23778:51 - at catchUnfinishedHookActions (/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/node_modules/.pnpm/rollup@4.57.0/node_modules/rollup/dist/shared/rollup.js:23271:16) - at rollupInternal (/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/node_modules/.pnpm/rollup@4.57.0/node_modules/rollup/dist/shared/rollup.js:23761:5) - at build (/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/node_modules/.pnpm/rollup@4.57.0/node_modules/rollup/dist/bin/rollup:1722:55) - at runRollup (/Users/akosidencio/Documents/BOOKSPINE/react-starter-auth/node_modules/.pnpm/rollup@4.57.0/node_modules/rollup/dist/bin/rollup:1858:21) - - diff --git a/e2e/auth.spec.ts b/e2e/auth.spec.ts new file mode 100644 index 0000000..cd2eaa7 --- /dev/null +++ b/e2e/auth.spec.ts @@ -0,0 +1,134 @@ +import { expect, test } from '@playwright/test'; + +/** + * The assertions that only a real browser can make. + * + * Everything else in the suite talks to `Request`/`Response` objects or a jsdom + * approximation. These tests check the two claims the whole design rests on: + * script cannot read the session cookie, and the server turns away a real + * navigation before the page renders. + */ + +const EMAIL = 'ada@example.com'; +const PASSWORD = 'password'; + +async function signIn(page: import('@playwright/test').Page) { + await page.goto('/login'); + await page.getByLabel('Email').fill(EMAIL); + await page.getByLabel('Password').fill(PASSWORD); + await page.getByRole('button', { name: 'Sign in' }).click(); + await page.waitForURL('**/dashboard'); +} + +test.describe('session lifecycle', () => { + test('signs in, reaches the dashboard, and keeps the cookie away from script', async ({ + page, + context, + }) => { + await page.goto('/'); + await expect(page.getByText('You are signed out.')).toBeVisible(); + + await signIn(page); + await expect(page.getByRole('heading', { name: 'Dashboard' })).toBeVisible(); + await expect(page.getByText('Rendered on the server, for Ada Lovelace.')).toBeVisible(); + + // ── The headline assertion ──────────────────────────────────────────── + const scriptVisible = await page.evaluate(() => document.cookie); + expect(scriptVisible).not.toContain('session'); + + // The cookie does exist — the browser has it and will send it. + const cookies = await context.cookies(); + const session = cookies.find((cookie) => cookie.name.includes('session')); + expect(session, 'a session cookie should have been set').toBeTruthy(); + expect(session!.httpOnly).toBe(true); + expect(session!.sameSite).toBe('Lax'); + + // And it is opaque: the access token is not sitting in it. + expect(session!.value).not.toContain('header.'); + + // The CSRF cookie is readable on purpose — the client echoes it back. + expect(scriptVisible).toContain('csrf'); + }); + + test('never exposes a token to the page', async ({ page }) => { + await signIn(page); + + // The dashboard prints a truncated token server-side, but nothing + // token-shaped should be reachable from client storage. + const storage = await page.evaluate(() => ({ + local: JSON.stringify(window.localStorage), + session: JSON.stringify(window.sessionStorage), + cookie: document.cookie, + })); + + expect(storage.local).toBe('{}'); + expect(storage.session).toBe('{}'); + expect(storage.cookie).not.toContain('header.'); + }); + + test('survives a reload without a flash of signed-out UI', async ({ page }) => { + await signIn(page); + await page.goto('/'); + + // `initialSession` comes from the server, so the signed-in branch is in the + // very first HTML rather than appearing after a client fetch. + const html = await page.content(); + expect(html).toContain('You are signed in'); + await expect(page.getByText('You are signed out.')).toBeHidden(); + }); + + test('signs out and drops the cookie', async ({ page, context }) => { + await signIn(page); + + await page.getByRole('button', { name: 'Sign out' }).click(); + await page.waitForURL((url) => !url.pathname.startsWith('/dashboard')); + + const cookies = await context.cookies(); + expect(cookies.find((cookie) => cookie.name.includes('session'))).toBeFalsy(); + }); +}); + +test.describe('server-side enforcement', () => { + test('middleware redirects an unauthenticated navigation', async ({ page }) => { + await page.goto('/dashboard'); + + // Not a client-side redirect — the server refused before rendering. + await expect(page).toHaveURL(/\/login/); + expect(new URL(page.url()).searchParams.get('next')).toBe('/dashboard'); + }); + + test('middleware still redirects after signing out', async ({ page }) => { + await signIn(page); + await page.getByRole('button', { name: 'Sign out' }).click(); + await page.waitForURL((url) => !url.pathname.startsWith('/dashboard')); + + await page.goto('/dashboard'); + await expect(page).toHaveURL(/\/login/); + }); + + test('rejects a login without a CSRF token', async ({ request }) => { + // A bare API call, as a cross-site form post would be. + const response = await request.post('/api/auth/login', { + data: { email: EMAIL, password: PASSWORD }, + }); + + expect(response.status()).toBe(403); + expect(await response.json()).toMatchObject({ error: 'csrf_failed' }); + }); + + test('rejects wrong credentials without revealing which field was wrong', async ({ page }) => { + await page.goto('/login'); + await page.getByLabel('Email').fill(EMAIL); + await page.getByLabel('Password').fill('wrong-password'); + await page.getByRole('button', { name: 'Sign in' }).click(); + + await expect(page.getByText('Wrong email or password.')).toBeVisible(); + await expect(page).toHaveURL(/\/login/); + }); + + test('the session endpoint is not cacheable', async ({ page }) => { + await page.goto('/'); + const response = await page.request.get('/api/auth/session'); + expect(response.headers()['cache-control']).toBe('no-store'); + }); +}); diff --git a/examples/next-js/.env.example b/examples/next-js/.env.example new file mode 100644 index 0000000..f5edc76 --- /dev/null +++ b/examples/next-js/.env.example @@ -0,0 +1,3 @@ +# Encryption key for the session cookie. Must be at least 32 characters. +# Generate one with: openssl rand -base64 32 +AUTH_SECRET=replace-me-with-at-least-32-characters!! diff --git a/examples/next-js/.eslintrc.json b/examples/next-js/.eslintrc.json index bffb357..a2569c2 100644 --- a/examples/next-js/.eslintrc.json +++ b/examples/next-js/.eslintrc.json @@ -1,3 +1,4 @@ { + "root": true, "extends": "next/core-web-vitals" } diff --git a/examples/next-js/README.md b/examples/next-js/README.md index c403366..ba6db50 100644 --- a/examples/next-js/README.md +++ b/examples/next-js/README.md @@ -1,36 +1,57 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +# Next.js App Router example -## Getting Started +A working sign-in flow with the token held server-side in an `HttpOnly` cookie. -First, run the development server: +## Run it + +The example depends on the library by path (`file:../..`), so build the library first. ```bash -npm run dev -# or -yarn dev -# or +# from the repository root +pnpm install +pnpm build + +cd examples/next-js +cp .env.example .env.local # then set AUTH_SECRET +pnpm install pnpm dev -# or -bun dev ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +Open http://localhost:3000 and sign in with `ada@example.com` / `password`. + +## What to look at + +| File | Shows | +|---|---| +| [`src/auth.ts`](src/auth.ts) | Server config — `authenticate`, `refresh`, and the Next adapter | +| [`src/auth-client.ts`](src/auth-client.ts) | `createAuthClient()`, typed once | +| [`src/app/api/auth/[...auth]/route.ts`](src/app/api/auth/[...auth]/route.ts) | All five routes in one line | +| [`src/app/layout.tsx`](src/app/layout.tsx) | Server-resolved `initialSession` — no loading flash | +| [`src/middleware.ts`](src/middleware.ts) | **The real access control** | +| [`src/app/dashboard/page.tsx`](src/app/dashboard/page.tsx) | Server component reading the access token | +| [`src/app/login/page.tsx`](src/app/login/page.tsx) | `signIn({ email, password })` — credentials, not a token | -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. +## The thing worth verifying + +Sign in, then open devtools and run: + +```js +document.cookie; +``` -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. +You will see `csrf=…` and **not** the session cookie. The credential is `HttpOnly`, so no script on the page — yours or a compromised dependency's — can read or exfiltrate it. -## Learn More +Compare the two halves of the dashboard: the server component prints the access token because it can, while the browser only ever received `user` and `expiresAt`. -To learn more about Next.js, take a look at the following resources: +## Two Next.js gotchas this example encodes -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +Both were caught by the e2e suite, and both fail *silently* — the app still redirects, just from the page instead of the server, so nothing looks broken: -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +1. **`middleware.ts` must live in `src/`** when the project uses a `src/` directory. At the project root it is never compiled, and the middleware simply does not run. +2. **`matcher: ['/dashboard/:path*']` does not match `/dashboard` itself** — only its children. Both entries are needed. -## Deploy on Vercel +## Notes -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +`src/auth.ts` fakes an identity provider so the example runs with no external services. Replace `authenticate` and `refresh` with real calls; nothing else changes. -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +Middleware is the enforcement point. `useRequireAuth`, `SignedIn` and `SignedOut` keep the UI coherent but run in the browser after render — they are not access control. diff --git a/examples/next-js/next.config.js b/examples/next-js/next.config.js index 767719f..dd89207 100644 --- a/examples/next-js/next.config.js +++ b/examples/next-js/next.config.js @@ -1,4 +1,13 @@ +const path = require('path'); + /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = { + // The library above has its own lockfile, so Next would otherwise infer a + // workspace root somewhere up the tree and warn about it. + outputFileTracingRoot: path.join(__dirname), + + // The e2e suite drives the dev server over 127.0.0.1 rather than localhost. + allowedDevOrigins: ['127.0.0.1'], +}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/examples/next-js/package-lock.json b/examples/next-js/package-lock.json deleted file mode 100644 index c3d1ba1..0000000 --- a/examples/next-js/package-lock.json +++ /dev/null @@ -1,4356 +0,0 @@ -{ - "name": "next-js", - "version": "0.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "next-js", - "version": "0.1.0", - "dependencies": { - "next": "14.0.1", - "react": "^18", - "react-dom": "^18" - }, - "devDependencies": { - "@types/node": "^20", - "@types/react": "^18", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", - "eslint": "^8", - "eslint-config-next": "14.0.1", - "postcss": "^8", - "tailwindcss": "^3.3.0", - "typescript": "^5" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", - "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", - "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@next/env": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.0.1.tgz", - "integrity": "sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.1.tgz", - "integrity": "sha512-bLjJMwXdzvhnQOnxvHoTTUh/+PYk6FF/DCgHi4BXwXCINer+o1ZYfL9aVeezj/oI7wqGJOqwGIXrlBvPbAId3w==", - "dev": true, - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz", - "integrity": "sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz", - "integrity": "sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz", - "integrity": "sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz", - "integrity": "sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz", - "integrity": "sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz", - "integrity": "sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz", - "integrity": "sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz", - "integrity": "sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz", - "integrity": "sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz", - "integrity": "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA==", - "dev": true - }, - "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "20.8.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.10.tgz", - "integrity": "sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.9", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", - "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==", - "dev": true - }, - "node_modules/@types/react": { - "version": "18.2.33", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.33.tgz", - "integrity": "sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg==", - "dev": true, - "dependencies": { - "@types/prop-types": "*", - "@types/scheduler": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.2.14", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.14.tgz", - "integrity": "sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/scheduler": { - "version": "0.16.5", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.5.tgz", - "integrity": "sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw==", - "dev": true - }, - "node_modules/@typescript-eslint/parser": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz", - "integrity": "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "6.9.1", - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/typescript-estree": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz", - "integrity": "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz", - "integrity": "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz", - "integrity": "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "@typescript-eslint/visitor-keys": "6.9.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz", - "integrity": "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.9.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", - "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", - "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", - "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", - "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "is-array-buffer": "^3.0.2", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, - "node_modules/asynciterator.prototype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", - "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.16", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", - "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.21.10", - "caniuse-lite": "^1.0.30001538", - "fraction.js": "^4.3.6", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/axe-core": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.8.2.tgz", - "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", - "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", - "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001541", - "electron-to-chromium": "^1.4.535", - "node-releases": "^2.0.13", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/call-bind": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", - "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.1", - "set-function-length": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-css": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001559", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz", - "integrity": "sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/client-only": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", - "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", - "dev": true - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-data-property": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", - "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.572", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.572.tgz", - "integrity": "sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/es-abstract": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", - "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "arraybuffer.prototype.slice": "^1.0.2", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.5", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.2", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.12", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "safe-array-concat": "^1.0.1", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", - "typed-array-buffer": "^1.0.0", - "typed-array-byte-length": "^1.0.0", - "typed-array-byte-offset": "^1.0.0", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", - "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", - "dev": true, - "dependencies": { - "asynciterator.prototype": "^1.0.0", - "call-bind": "^1.0.2", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.1", - "es-set-tostringtag": "^2.0.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.0.1" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", - "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "has-tostringtag": "^1.0.0", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.52.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", - "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.52.0", - "@humanwhocodes/config-array": "^0.11.13", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-next": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.0.1.tgz", - "integrity": "sha512-QfIFK2WD39H4WOespjgf6PLv9Bpsd7KGGelCtmq4l67nGvnlsGpuvj0hIT+aIy6p5gKH+lAChYILsyDlxP52yg==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "14.0.1", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-import-resolver-typescript": "^3.5.2", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsx-a11y": "^6.7.1", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - }, - "peerDependencies": { - "eslint": "^7.23.0 || ^8.0.0", - "typescript": ">=3.3.1" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" - }, - "peerDependencies": { - "eslint": "*", - "eslint-plugin-import": "*" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", - "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlastindex": "^1.2.3", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.8.0", - "hasown": "^2.0.0", - "is-core-module": "^2.13.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.7", - "object.groupby": "^1.0.1", - "object.values": "^1.1.7", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.33.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", - "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.12", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.8" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz", - "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/function.prototype.name": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", - "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", - "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", - "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" - }, - "node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", - "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.2", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", - "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", - "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", - "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", - "dev": true, - "dependencies": { - "which-typed-array": "^1.1.11" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", - "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", - "dev": true, - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsx-ast-utils": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", - "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "object.assign": "^4.1.4", - "object.values": "^1.1.6" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "dependencies": { - "language-subtag-registry": "~0.3.2" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/next": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/next/-/next-14.0.1.tgz", - "integrity": "sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA==", - "dependencies": { - "@next/env": "14.0.1", - "@swc/helpers": "0.5.2", - "busboy": "1.6.0", - "caniuse-lite": "^1.0.30001406", - "postcss": "8.4.31", - "styled-jsx": "5.1.1", - "watchpack": "2.4.0" - }, - "bin": { - "next": "dist/bin/next" - }, - "engines": { - "node": ">=18.17.0" - }, - "optionalDependencies": { - "@next/swc-darwin-arm64": "14.0.1", - "@next/swc-darwin-x64": "14.0.1", - "@next/swc-linux-arm64-gnu": "14.0.1", - "@next/swc-linux-arm64-musl": "14.0.1", - "@next/swc-linux-x64-gnu": "14.0.1", - "@next/swc-linux-x64-musl": "14.0.1", - "@next/swc-win32-arm64-msvc": "14.0.1", - "@next/swc-win32-ia32-msvc": "14.0.1", - "@next/swc-win32-x64-msvc": "14.0.1" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "sass": "^1.3.0" - }, - "peerDependenciesMeta": { - "@opentelemetry/api": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/node-releases": { - "version": "2.0.13", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", - "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", - "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", - "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.hasown": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", - "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", - "dev": true, - "dependencies": { - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss": { - "version": "8.4.31", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", - "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", - "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, - "dependencies": { - "lilconfig": "^2.0.5", - "yaml": "^2.1.1" - }, - "engines": { - "node": ">= 14" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", - "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", - "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", - "dev": true - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "dev": true, - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-array-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", - "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-function-length": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", - "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", - "dev": true, - "dependencies": { - "define-data-property": "^1.1.1", - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", - "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "regexp.prototype.flags": "^1.5.0", - "set-function-name": "^2.0.0", - "side-channel": "^1.0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/styled-jsx": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", - "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/sucrase": { - "version": "3.34.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", - "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "7.1.6", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tailwindcss": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", - "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", - "dev": true, - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.19.1", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", - "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", - "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", - "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", - "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "has-proto": "^1.0.1", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", - "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", - "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.4", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz", - "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/examples/next-js/package.json b/examples/next-js/package.json index b44110a..585e83f 100644 --- a/examples/next-js/package.json +++ b/examples/next-js/package.json @@ -1,5 +1,5 @@ { - "name": "next-js", + "name": "next-js-example", "version": "0.1.0", "private": true, "scripts": { @@ -9,20 +9,17 @@ "lint": "next lint" }, "dependencies": { - "next": "14.0.1", - "react": "^18", - "react-dom": "^18", - "react-starter-auth": "^0.1.1" + "@thinkgrid/react-starter-auth": "file:../..", + "next": "15.5.7", + "react": "^19.2.0", + "react-dom": "^19.2.0" }, "devDependencies": { "@types/node": "^20", - "@types/react": "^18.2.33", - "@types/react-dom": "^18", - "autoprefixer": "^10.0.1", + "@types/react": "^19", + "@types/react-dom": "^19", "eslint": "^8", - "eslint-config-next": "14.0.1", - "postcss": "^8", - "tailwindcss": "^3.3.0", + "eslint-config-next": "15.5.7", "typescript": "^5" } } diff --git a/examples/next-js/pnpm-lock.yaml b/examples/next-js/pnpm-lock.yaml new file mode 100644 index 0000000..5949fe3 --- /dev/null +++ b/examples/next-js/pnpm-lock.yaml @@ -0,0 +1,3486 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@thinkgrid/react-starter-auth': + specifier: file:../.. + version: file:../..(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + next: + specifier: 15.5.7 + version: 15.5.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8) + react: + specifier: ^19.2.0 + version: 19.2.8 + react-dom: + specifier: ^19.2.0 + version: 19.2.8(react@19.2.8) + devDependencies: + '@types/node': + specifier: ^20 + version: 20.19.43 + '@types/react': + specifier: ^19 + version: 19.2.18 + '@types/react-dom': + specifier: ^19 + version: 19.2.4(@types/react@19.2.18) + eslint: + specifier: ^8 + version: 8.57.1 + eslint-config-next: + specifier: 15.5.7 + version: 15.5.7(eslint@8.57.1)(typescript@5.9.3) + typescript: + specifier: ^5 + version: 5.9.3 + +packages: + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@napi-rs/wasm-runtime@1.2.3': + resolution: {integrity: sha512-UMduMbqO5s5zF2NkNacMT/yK5Y5QiKvWr2+50bzIIxFDwVJ2h49b+oyjaCGPhJxd2/gC2x39EHv/gHVuu36x2Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0} + peerDependencies: + '@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4 + '@emnapi/runtime': ^1.7.1 || ^2.0.0-alpha.4 + + '@next/env@15.5.7': + resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} + + '@next/eslint-plugin-next@15.5.7': + resolution: {integrity: sha512-DtRU2N7BkGr8r+pExfuWHwMEPX5SD57FeA6pxdgCHODo+b/UgIgjE+rgWKtJAbEbGhVZ2jtHn4g3wNhWFoNBQQ==} + + '@next/swc-darwin-arm64@15.5.7': + resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@15.5.7': + resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@15.5.7': + resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@15.5.7': + resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@15.5.7': + resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@15.5.7': + resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@15.5.7': + resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-x64-msvc@15.5.7': + resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nolyfill/is-core-module@1.0.39': + resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} + engines: {node: '>=12.4.0'} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@rushstack/eslint-patch@1.16.1': + resolution: {integrity: sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==} + + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + + '@thinkgrid/react-starter-auth@file:../..': + resolution: {directory: ../.., type: directory} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + + '@types/react-dom@19.2.4': + resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} + peerDependencies: + '@types/react': ^19.2.0 + + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} + + '@typescript-eslint/eslint-plugin@8.67.0': + resolution: {integrity: sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.67.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/parser@8.67.0': + resolution: {integrity: sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/project-service@8.67.0': + resolution: {integrity: sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/scope-manager@8.67.0': + resolution: {integrity: sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/tsconfig-utils@8.67.0': + resolution: {integrity: sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/type-utils@8.67.0': + resolution: {integrity: sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/types@8.67.0': + resolution: {integrity: sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.67.0': + resolution: {integrity: sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.67.0': + resolution: {integrity: sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.67.0': + resolution: {integrity: sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@ungap/structured-clone@1.3.3': + resolution: {integrity: sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==} + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + resolution: {integrity: sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==} + cpu: [arm] + os: [android] + + '@unrs/resolver-binding-android-arm64@1.12.2': + resolution: {integrity: sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==} + cpu: [arm64] + os: [android] + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + resolution: {integrity: sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==} + cpu: [arm64] + os: [darwin] + + '@unrs/resolver-binding-darwin-x64@1.12.2': + resolution: {integrity: sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==} + cpu: [x64] + os: [darwin] + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + resolution: {integrity: sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==} + cpu: [x64] + os: [freebsd] + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + resolution: {integrity: sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + resolution: {integrity: sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==} + cpu: [arm] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + resolution: {integrity: sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + resolution: {integrity: sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==} + cpu: [arm64] + os: [linux] + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + resolution: {integrity: sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==} + cpu: [loong64] + os: [linux] + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + resolution: {integrity: sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==} + cpu: [loong64] + os: [linux] + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + resolution: {integrity: sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==} + cpu: [ppc64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + resolution: {integrity: sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + resolution: {integrity: sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==} + cpu: [riscv64] + os: [linux] + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + resolution: {integrity: sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==} + cpu: [s390x] + os: [linux] + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + resolution: {integrity: sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + resolution: {integrity: sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==} + cpu: [x64] + os: [linux] + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + resolution: {integrity: sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==} + cpu: [arm64] + os: [openharmony] + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + resolution: {integrity: sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + resolution: {integrity: sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==} + cpu: [arm64] + os: [win32] + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + resolution: {integrity: sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==} + cpu: [ia32] + os: [win32] + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + resolution: {integrity: sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==} + cpu: [x64] + os: [win32] + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} + engines: {node: '>= 0.4'} + + array-includes@3.1.9: + resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.6: + resolution: {integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + array.prototype.tosorted@1.1.4: + resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + async-function@1.0.0: + resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} + engines: {node: '>= 0.4'} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.13.0: + resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==} + engines: {node: '>=4'} + + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} + + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} + engines: {node: 20 || >=22} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + call-bind@1.0.9: + resolution: {integrity: sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==} + engines: {node: '>= 0.4'} + + call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001809: + resolution: {integrity: sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + es-abstract-get@1.0.0: + resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} + engines: {node: '>= 0.4'} + + es-abstract@1.24.2: + resolution: {integrity: sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.4.0: + resolution: {integrity: sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.2: + resolution: {integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.1.0: + resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.4: + resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} + engines: {node: '>= 0.4'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-next@15.5.7: + resolution: {integrity: sha512-nU/TRGHHeG81NeLW5DeQT5t6BDUqbpsNQTvef1ld/tqHT+/zTx60/TIhKnmPISTTe++DVo+DLxDmk4rnwHaZVw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + + eslint-import-resolver-node@0.3.10: + resolution: {integrity: sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==} + + eslint-import-resolver-typescript@3.10.1: + resolution: {integrity: sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + + eslint-module-utils@2.14.0: + resolution: {integrity: sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-import@2.32.0: + resolution: {integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jsx-a11y@6.10.2: + resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + + eslint-plugin-react-hooks@5.2.0: + resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + + eslint-plugin-react@7.37.5: + resolution: {integrity: sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.20.1: + resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + + for-each@0.3.5: + resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} + engines: {node: '>= 0.4'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.2.0: + resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generator-function@2.0.1: + resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} + engines: {node: '>= 0.4'} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.14.2: + resolution: {integrity: sha512-XpwZALwwl/BaKTAyC6+c5T8y6kCg2jk+XGqOVrKIQmW49pNypYLMRjCUXqa28tQgJlhS2RlzP7sc+Rx7W6qsfw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.4: + resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} + engines: {node: '>= 0.4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + ignore@7.0.6: + resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + engines: {node: '>= 4'} + + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-async-function@2.1.1: + resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} + engines: {node: '>= 0.4'} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.2: + resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} + engines: {node: '>= 0.4'} + + is-bun-module@2.0.0: + resolution: {integrity: sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-document.all@1.0.0: + resolution: {integrity: sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-generator-function@1.1.2: + resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.1.1: + resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + iterator.prototype@1.1.5: + resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} + engines: {node: '>= 0.4'} + + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.3.1: + resolution: {integrity: sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + language-subtag-registry@0.3.23: + resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} + + minimatch@3.1.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.18: + resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-postinstall@0.3.4: + resolution: {integrity: sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + next@15.5.7: + resolution: {integrity: sha512-+t2/0jIJ48kUpGKkdlhgkv+zPTEOoXyr60qXe68eB/pl3CMJaLeIGjzp5D6Oqt25hCBiBTt8wEeeAzfJvUKnPQ==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + + node-exports-info@1.6.2: + resolution: {integrity: sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==} + engines: {node: '>= 0.4'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.entries@1.1.9: + resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + own-keys@1.0.2: + resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} + engines: {node: '>= 0.4'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} + engines: {node: '>=12'} + + possible-typed-array-names@1.1.0: + resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} + engines: {node: '>= 0.4'} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + react-dom@19.2.8: + resolution: {integrity: sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==} + peerDependencies: + react: ^19.2.8 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react@19.2.8: + resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==} + engines: {node: '>=0.10.0'} + + reflect.getprototypeof@1.0.10: + resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.4: + resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} + engines: {node: '>= 0.4'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@2.0.0-next.7: + resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} + engines: {node: '>= 0.4'} + hasBin: true + + reusify@1.1.0: + resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} + engines: {node: '>=0.4'} + + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + set-proto@1.0.0: + resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} + engines: {node: '>= 0.4'} + + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.1: + resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.1.1: + resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} + engines: {node: '>= 0.4'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stable-hash@0.0.5: + resolution: {integrity: sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==} + + stop-iteration-iterator@1.1.0: + resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} + engines: {node: '>= 0.4'} + + string.prototype.includes@2.0.1: + resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} + engines: {node: '>= 0.4'} + + string.prototype.matchall@4.0.12: + resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} + engines: {node: '>= 0.4'} + + string.prototype.repeat@1.0.0: + resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} + + string.prototype.trim@1.2.11: + resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.10: + resolution: {integrity: sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.8: + resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} + engines: {node: '>= 0.4'} + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} + + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + unrs-resolver@1.12.2: + resolution: {integrity: sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.22: + resolution: {integrity: sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@eslint-community/eslint-utils@4.10.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.2': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.15.0 + debug: 4.4.3 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.3.1 + minimatch: 3.1.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.3 + minimatch: 3.1.5 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.11.3 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@napi-rs/wasm-runtime@1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@next/env@15.5.7': {} + + '@next/eslint-plugin-next@15.5.7': + dependencies: + fast-glob: 3.3.1 + + '@next/swc-darwin-arm64@15.5.7': + optional: true + + '@next/swc-darwin-x64@15.5.7': + optional: true + + '@next/swc-linux-arm64-gnu@15.5.7': + optional: true + + '@next/swc-linux-arm64-musl@15.5.7': + optional: true + + '@next/swc-linux-x64-gnu@15.5.7': + optional: true + + '@next/swc-linux-x64-musl@15.5.7': + optional: true + + '@next/swc-win32-arm64-msvc@15.5.7': + optional: true + + '@next/swc-win32-x64-msvc@15.5.7': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.20.1 + + '@nolyfill/is-core-module@1.0.39': {} + + '@rtsao/scc@1.1.0': {} + + '@rushstack/eslint-patch@1.16.1': {} + + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + + '@thinkgrid/react-starter-auth@file:../..(react-dom@19.2.8(react@19.2.8))(react@19.2.8)': + dependencies: + jose: 5.10.0 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/json5@0.0.29': {} + + '@types/node@20.19.43': + dependencies: + undici-types: 6.21.0 + + '@types/react-dom@19.2.4(@types/react@19.2.18)': + dependencies: + '@types/react': 19.2.18 + + '@types/react@19.2.18': + dependencies: + csstype: 3.2.3 + + '@typescript-eslint/eslint-plugin@8.67.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/type-utils': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.67.0 + eslint: 8.57.1 + ignore: 7.0.6 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3 + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/project-service@8.67.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@5.9.3) + '@typescript-eslint/types': 8.67.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.67.0': + dependencies: + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 + + '@typescript-eslint/tsconfig-utils@8.67.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.67.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + debug: 4.4.3 + eslint: 8.57.1 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@8.67.0': {} + + '@typescript-eslint/typescript-estree@8.67.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.67.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.67.0(typescript@5.9.3) + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/visitor-keys': 8.67.0 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.67.0(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 8.67.0 + '@typescript-eslint/types': 8.67.0 + '@typescript-eslint/typescript-estree': 8.67.0(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/visitor-keys@8.67.0': + dependencies: + '@typescript-eslint/types': 8.67.0 + eslint-visitor-keys: 5.0.1 + + '@ungap/structured-clone@1.3.3': {} + + '@unrs/resolver-binding-android-arm-eabi@1.12.2': + optional: true + + '@unrs/resolver-binding-android-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-darwin-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-freebsd-x64@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-loong64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.12.2': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.12.2': + optional: true + + '@unrs/resolver-binding-openharmony-arm64@1.12.2': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.12.2': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.2.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.12.2': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.12.2': + optional: true + + acorn-jsx@5.3.2(acorn@8.18.0): + dependencies: + acorn: 8.18.0 + + acorn@8.18.0: {} + + ajv@6.15.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-buffer-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + is-array-buffer: 3.0.5 + + array-includes@3.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.findlastindex@1.2.6: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-shim-unscopables: 1.1.0 + + array.prototype.tosorted@1.1.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-shim-unscopables: 1.1.0 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 + + ast-types-flow@0.0.8: {} + + async-function@1.0.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axe-core@4.13.0: {} + + axobject-query@4.1.0: {} + + balanced-match@1.0.2: {} + + balanced-match@4.0.4: {} + + brace-expansion@1.1.18: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@5.0.9: + dependencies: + balanced-match: 4.0.4 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.9: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001809: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + client-only@0.0.1: {} + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + concat-map@0.0.1: {} + + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + csstype@3.2.3: {} + + damerau-levenshtein@1.0.8: {} + + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + deep-is@0.1.4: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + detect-libc@2.1.2: + optional: true + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + emoji-regex@9.2.2: {} + + es-abstract-get@1.0.0: + dependencies: + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + is-callable: 1.2.7 + object-inspect: 1.13.4 + + es-abstract@1.24.2: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.4 + function.prototype.name: 1.2.0 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 + object-keys: 1.1.1 + object.assign: 4.1.7 + own-keys: 1.0.2 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.4 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.11 + string.prototype.trimend: 1.0.10 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.8 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.22 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-iterator-helpers@1.4.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-set-tostringtag: 2.1.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 + + es-object-atoms@1.1.2: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + es-shim-unscopables@1.1.0: + dependencies: + hasown: 2.0.4 + + es-to-primitive@1.3.4: + dependencies: + es-abstract-get: 1.0.0 + es-define-property: 1.0.1 + es-errors: 1.3.0 + is-callable: 1.2.7 + is-date-object: 1.1.0 + is-symbol: 1.1.1 + + escape-string-regexp@4.0.0: {} + + eslint-config-next@15.5.7(eslint@8.57.1)(typescript@5.9.3): + dependencies: + '@next/eslint-plugin-next': 15.5.7 + '@rushstack/eslint-patch': 1.16.1 + '@typescript-eslint/eslint-plugin': 8.67.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) + eslint-plugin-react: 7.37.5(eslint@8.57.1) + eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + + eslint-import-resolver-node@0.3.10: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.2 + resolve: 2.0.0-next.7 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1): + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.4.3 + eslint: 8.57.1 + get-tsconfig: 4.14.2 + is-bun-module: 2.0.0 + stable-hash: 0.0.5 + tinyglobby: 0.2.17 + unrs-resolver: 1.12.2 + optionalDependencies: + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.10 + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) + transitivePeerDependencies: + - supports-color + + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.10 + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.67.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.10)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + hasown: 2.0.4 + is-core-module: 2.16.2 + is-glob: 4.0.3 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.10 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 8.67.0(eslint@8.57.1)(typescript@5.9.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jsx-a11y@6.10.2(eslint@8.57.1): + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.9 + array.prototype.flatmap: 1.3.3 + ast-types-flow: 0.0.8 + axe-core: 4.13.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + eslint: 8.57.1 + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.5 + object.fromentries: 2.0.8 + safe-regex-test: 1.1.0 + string.prototype.includes: 2.0.1 + + eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-react@7.37.5(eslint@8.57.1): + dependencies: + array-includes: 3.1.9 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.3 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.4.0 + eslint: 8.57.1 + estraverse: 5.3.0 + hasown: 2.0.4 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.5 + object.entries: 1.1.9 + object.fromentries: 2.0.8 + object.values: 1.2.1 + prop-types: 15.8.1 + resolve: 2.0.0-next.7 + semver: 6.3.1 + string.prototype.matchall: 4.0.12 + string.prototype.repeat: 1.0.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.2 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.3.3 + ajv: 6.15.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.3.1 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.5 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@9.6.1: + dependencies: + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 3.4.3 + + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.1: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.20.1: + dependencies: + reusify: 1.1.0 + + fdir@6.5.0(picomatch@4.0.5): + optionalDependencies: + picomatch: 4.0.5 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.2.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat-cache@3.2.0: + dependencies: + flatted: 3.4.4 + keyv: 4.5.4 + rimraf: 3.0.2 + + flatted@3.4.4: {} + + for-each@0.3.5: + dependencies: + is-callable: 1.2.7 + + fs.realpath@1.0.0: {} + + function-bind@1.1.2: {} + + function.prototype.name@1.2.0: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + es-define-property: 1.0.1 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + hasown: 2.0.4 + is-callable: 1.2.7 + is-document.all: 1.0.0 + + functions-have-names@1.2.3: {} + + generator-function@2.0.1: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.4 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.2 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + + get-tsconfig@4.14.2: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + gopd@1.2.0: {} + + graphemer@1.4.0: {} + + has-bigints@1.1.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.4: + dependencies: + function-bind: 1.1.2 + + ignore@5.3.2: {} + + ignore@7.0.6: {} + + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + imurmurhash@0.1.4: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.4 + side-channel: 1.1.1 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.1.0 + + is-boolean-object@1.2.2: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-bun-module@2.0.0: + dependencies: + semver: 7.8.5 + + is-callable@1.2.7: {} + + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-document.all@1.0.0: + dependencies: + call-bound: 1.0.4 + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-generator-function@1.1.2: + dependencies: + call-bound: 1.0.4 + generator-function: 2.0.1 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-inside@3.0.3: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.4 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.4 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.22 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: + dependencies: + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + iterator.prototype@1.1.5: + dependencies: + define-data-property: 1.1.4 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + has-symbols: 1.1.0 + set-function-name: 2.0.2 + + jose@5.10.0: {} + + js-tokens@4.0.0: {} + + js-yaml@4.3.1: + dependencies: + argparse: 2.0.1 + + json-buffer@3.0.1: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.9 + array.prototype.flat: 1.3.3 + object.assign: 4.1.7 + object.values: 1.2.1 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + language-subtag-registry@0.3.23: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.23 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.merge@4.6.2: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + math-intrinsics@1.1.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.2 + + minimatch@10.2.6: + dependencies: + brace-expansion: 5.0.9 + + minimatch@3.1.5: + dependencies: + brace-expansion: 1.1.18 + + minimist@1.2.8: {} + + ms@2.1.3: {} + + nanoid@3.3.18: {} + + napi-postinstall@0.3.4: {} + + natural-compare@1.4.0: {} + + next@15.5.7(react-dom@19.2.8(react@19.2.8))(react@19.2.8): + dependencies: + '@next/env': 15.5.7 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001809 + postcss: 8.4.31 + react: 19.2.8 + react-dom: 19.2.8(react@19.2.8) + styled-jsx: 5.1.6(react@19.2.8) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.7 + '@next/swc-darwin-x64': 15.5.7 + '@next/swc-linux-arm64-gnu': 15.5.7 + '@next/swc-linux-arm64-musl': 15.5.7 + '@next/swc-linux-x64-gnu': 15.5.7 + '@next/swc-linux-x64-musl': 15.5.7 + '@next/swc-win32-arm64-msvc': 15.5.7 + '@next/swc-win32-x64-msvc': 15.5.7 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + node-exports-info@1.6.2: + dependencies: + array.prototype.flatmap: 1.3.3 + es-errors: 1.3.0 + object.entries: 1.1.9 + semver: 6.3.1 + + object-assign@4.1.1: {} + + object-inspect@1.13.4: {} + + object-keys@1.1.1: {} + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.entries@1.1.9: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + own-keys@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + picocolors@1.1.1: {} + + picomatch@2.3.2: {} + + picomatch@4.0.5: {} + + possible-typed-array-names@1.1.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.18 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prelude-ls@1.2.1: {} + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + punycode@2.3.1: {} + + queue-microtask@1.2.3: {} + + react-dom@19.2.8(react@19.2.8): + dependencies: + react: 19.2.8 + scheduler: 0.27.0 + + react-is@16.13.1: {} + + react@19.2.8: {} + + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regexp.prototype.flags@1.5.4: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 + + resolve-from@4.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@2.0.0-next.7: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + node-exports-info: 1.6.2 + object-keys: 1.1.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.1.0: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.4: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-push-apply@1.0.0: + dependencies: + es-errors: 1.3.0 + isarray: 2.0.5 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 + + scheduler@0.27.0: {} + + semver@6.3.1: {} + + semver@7.8.5: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.8.5 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.1: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.1 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + source-map-js@1.2.1: {} + + stable-hash@0.0.5: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 + + string.prototype.includes@2.0.1: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.matchall@4.0.12: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-errors: 1.3.0 + es-object-atoms: 1.1.2 + get-intrinsic: 1.3.0 + gopd: 1.2.0 + has-symbols: 1.1.0 + internal-slot: 1.1.0 + regexp.prototype.flags: 1.5.4 + set-function-name: 2.0.2 + side-channel: 1.1.1 + + string.prototype.repeat@1.0.0: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.24.2 + + string.prototype.trim@1.2.11: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.2 + es-object-atoms: 1.1.2 + has-property-descriptors: 1.0.2 + safe-regex-test: 1.1.0 + + string.prototype.trimend@1.0.10: + dependencies: + call-bind: 1.0.9 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.9 + define-properties: 1.2.1 + es-object-atoms: 1.1.2 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: {} + + strip-json-comments@3.1.1: {} + + styled-jsx@5.1.6(react@19.2.8): + dependencies: + client-only: 0.0.1 + react: 19.2.8 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + text-table@0.2.0: {} + + tinyglobby@0.2.17: + dependencies: + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@2.8.1: {} + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 + + typed-array-length@1.0.8: + dependencies: + call-bind: 1.0.9 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 + + typescript@5.9.3: {} + + unbox-primitive@1.1.0: + dependencies: + call-bound: 1.0.4 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 + + undici-types@6.21.0: {} + + unrs-resolver@1.12.2: + dependencies: + napi-postinstall: 0.3.4 + optionalDependencies: + '@unrs/resolver-binding-android-arm-eabi': 1.12.2 + '@unrs/resolver-binding-android-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-arm64': 1.12.2 + '@unrs/resolver-binding-darwin-x64': 1.12.2 + '@unrs/resolver-binding-freebsd-x64': 1.12.2 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.12.2 + '@unrs/resolver-binding-linux-arm64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-arm64-musl': 1.12.2 + '@unrs/resolver-binding-linux-loong64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-loong64-musl': 1.12.2 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-riscv64-musl': 1.12.2 + '@unrs/resolver-binding-linux-s390x-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-gnu': 1.12.2 + '@unrs/resolver-binding-linux-x64-musl': 1.12.2 + '@unrs/resolver-binding-openharmony-arm64': 1.12.2 + '@unrs/resolver-binding-wasm32-wasi': 1.12.2 + '@unrs/resolver-binding-win32-arm64-msvc': 1.12.2 + '@unrs/resolver-binding-win32-ia32-msvc': 1.12.2 + '@unrs/resolver-binding-win32-x64-msvc': 1.12.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.4 + function.prototype.name: 1.2.0 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.2 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.22 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.22: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.9 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + yocto-queue@0.1.0: {} diff --git a/examples/next-js/postcss.config.js b/examples/next-js/postcss.config.js deleted file mode 100644 index 33ad091..0000000 --- a/examples/next-js/postcss.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, -} diff --git a/examples/next-js/public/next.svg b/examples/next-js/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/examples/next-js/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/examples/next-js/public/vercel.svg b/examples/next-js/public/vercel.svg deleted file mode 100644 index d2f8422..0000000 --- a/examples/next-js/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/examples/next-js/src/app/api/auth/[...auth]/route.ts b/examples/next-js/src/app/api/auth/[...auth]/route.ts new file mode 100644 index 0000000..e7b5792 --- /dev/null +++ b/examples/next-js/src/app/api/auth/[...auth]/route.ts @@ -0,0 +1,8 @@ +import { nextAuth } from '@/auth'; + +/** + * The five auth routes: /login, /logout, /session, /refresh, /csrf. + * + * Everything the browser needs, and the only place the tokens exist. + */ +export const { GET, POST } = nextAuth.handlers; diff --git a/examples/next-js/src/app/auth-provider.tsx b/examples/next-js/src/app/auth-provider.tsx deleted file mode 100644 index 89a2b4a..0000000 --- a/examples/next-js/src/app/auth-provider.tsx +++ /dev/null @@ -1,17 +0,0 @@ -'use client' - -import { AuthProvider } from "react-starter-auth" - - -export default function Provider ({ - children -}: { - children: React.ReactNode -}) { - return ( - - {children} - - ) -} - diff --git a/examples/next-js/src/app/dashboard/page.tsx b/examples/next-js/src/app/dashboard/page.tsx new file mode 100644 index 0000000..af89c63 --- /dev/null +++ b/examples/next-js/src/app/dashboard/page.tsx @@ -0,0 +1,57 @@ +import { cookies } from 'next/headers'; +import { redirect } from 'next/navigation'; + +import { nextAuth } from '@/auth'; + +import { SignOutButton } from './sign-out-button'; + +/** + * A server-protected page. + * + * Middleware already turned away signed-out visitors, and this checks again — + * defence in depth, and it is what makes the access token available for calling + * a resource API without that token ever touching the browser. + */ +export default async function DashboardPage() { + const store = await cookies(); + const sealed = await nextAuth.getSealedSession(store); + + if (!sealed) redirect('/login'); + + // In a real app this is where you would call your API: + // + // await fetch('https://api.example.com/me', { + // headers: { Authorization: `Bearer ${sealed.accessToken}` }, + // }); + // + // The token is readable here, on the server, and nowhere else. + const tokenPreview = `${sealed.accessToken.slice(0, 12)}…`; + + return ( + <> +

Dashboard

+

Rendered on the server, for {sealed.user.name}.

+ +
+

What the server can see

+
+          {JSON.stringify(
+            {
+              user: sealed.user,
+              expiresAt: new Date(sealed.expiresAt).toISOString(),
+              accessToken: tokenPreview,
+            },
+            null,
+            2,
+          )}
+        
+

+ The browser received only user and expiresAt. The token above + never left the server. +

+
+ + + + ); +} diff --git a/examples/next-js/src/app/dashboard/sign-out-button.tsx b/examples/next-js/src/app/dashboard/sign-out-button.tsx new file mode 100644 index 0000000..a4c715c --- /dev/null +++ b/examples/next-js/src/app/dashboard/sign-out-button.tsx @@ -0,0 +1,15 @@ +'use client'; + +import { useAuth } from '@/auth-client'; + +export function SignOutButton() { + const { signOut } = useAuth(); + + // `signOut` resolves rather than navigating, so the caller decides where to + // go — `redirectTo` routes through the client's `navigate`. + return ( + + ); +} diff --git a/examples/next-js/src/app/globals.css b/examples/next-js/src/app/globals.css index fd81e88..b5973ba 100644 --- a/examples/next-js/src/app/globals.css +++ b/examples/next-js/src/app/globals.css @@ -1,27 +1,126 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - :root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; + --bg: #f5f6f8; + --surface: #ffffff; + --ink: #151a21; + --muted: #5c6673; + --line: #dde1e7; + --accent: #2b47b8; + --danger: #a8322a; } @media (prefers-color-scheme: dark) { :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; + --bg: #10141a; + --surface: #171c24; + --ink: #e6e9ee; + --muted: #98a2b0; + --line: #262e39; + --accent: #7d93f0; + --danger: #f0918a; } } +* { + box-sizing: border-box; +} + body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); + margin: 0; + background: var(--bg); + color: var(--ink); + font-family: system-ui, -apple-system, "Segoe UI", sans-serif; + line-height: 1.6; +} + +main { + max-width: 34rem; + margin: 0 auto; + padding: 4rem 1.5rem; +} + +h1 { + font-size: 1.75rem; + letter-spacing: -0.02em; + margin: 0 0 0.5rem; +} + +h2 { + font-size: 1.1rem; + margin: 2rem 0 0.5rem; +} + +p { + color: var(--muted); + margin: 0 0 1rem; +} + +.card { + background: var(--surface); + border: 1px solid var(--line); + border-radius: 6px; + padding: 1.25rem 1.5rem; + margin-bottom: 1rem; +} + +label { + display: block; + font-size: 0.85rem; + font-weight: 600; + margin-bottom: 0.25rem; +} + +input { + width: 100%; + padding: 0.5rem 0.65rem; + margin-bottom: 1rem; + border: 1px solid var(--line); + border-radius: 4px; + background: var(--bg); + color: var(--ink); + font: inherit; +} + +button { + padding: 0.5rem 1rem; + border: 0; + border-radius: 4px; + background: var(--accent); + color: #fff; + font: inherit; + font-weight: 600; + cursor: pointer; +} + +button:disabled { + opacity: 0.6; + cursor: default; +} + +button.secondary { + background: transparent; + color: var(--accent); + border: 1px solid var(--line); +} + +a { + color: var(--accent); +} + +.error { + color: var(--danger); + font-size: 0.9rem; +} + +code, +pre { + font-family: ui-monospace, Menlo, monospace; + font-size: 0.85em; +} + +pre { + background: var(--bg); + border: 1px solid var(--line); + border-radius: 4px; + padding: 0.75rem; + overflow-x: auto; } diff --git a/examples/next-js/src/app/layout.tsx b/examples/next-js/src/app/layout.tsx index 2fbe571..5a48bcc 100644 --- a/examples/next-js/src/app/layout.tsx +++ b/examples/next-js/src/app/layout.tsx @@ -1,26 +1,28 @@ -import type { Metadata } from 'next' -import { Inter } from 'next/font/google' -import './globals.css' +import { cookies } from 'next/headers'; +import type { Metadata } from 'next'; -import Provider from './auth-provider' +import { nextAuth } from '@/auth'; +import { AuthProvider } from '@/auth-client'; -const inter = Inter({ subsets: ['latin'] }) +import './globals.css'; export const metadata: Metadata = { - title: 'Create Next App', - description: 'Generated by create next app', -} + title: 'react-starter-auth · Next.js example', + description: 'HttpOnly cookie sessions with React and Next.js', +}; + +export default async function RootLayout({ children }: { children: React.ReactNode }) { + // Resolved on the server, so the first client render is already correct: + // no loading flash, no hydration mismatch, no fetch waterfall on mount. + const session = await nextAuth.getSession(await cookies()); -export default function RootLayout({ - children, -}: { - children: React.ReactNode -}) { return ( - -
{children}
+ + +
{children}
+
- ) + ); } diff --git a/examples/next-js/src/app/login/page.tsx b/examples/next-js/src/app/login/page.tsx new file mode 100644 index 0000000..4bf4dca --- /dev/null +++ b/examples/next-js/src/app/login/page.tsx @@ -0,0 +1,71 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import { useState } from 'react'; + +import { useAuth } from '@/auth-client'; + +export default function LoginPage() { + const { signIn, status } = useAuth(); + const router = useRouter(); + + const [email, setEmail] = useState('ada@example.com'); + const [password, setPassword] = useState('password'); + const [error, setError] = useState(null); + const [busy, setBusy] = useState(false); + + async function onSubmit(event: React.FormEvent) { + event.preventDefault(); + setError(null); + setBusy(true); + try { + // Credentials go to the server, which sets the HttpOnly cookie. + // Nothing token-shaped comes back to this component. + await signIn({ email, password }); + router.push('/dashboard'); + } catch (caught) { + setError(caught instanceof Error ? caught.message : 'Sign in failed'); + } finally { + setBusy(false); + } + } + + return ( + <> +

Sign in

+

+ Demo credentials are pre-filled: ada@example.com / password. +

+ +
+ + setEmail(event.target.value)} + autoComplete="username" + /> + + + setPassword(event.target.value)} + autoComplete="current-password" + /> + + + + {error ? ( +

+ {error === 'invalid_credentials' ? 'Wrong email or password.' : error} +

+ ) : null} +
+ + ); +} diff --git a/examples/next-js/src/app/page.tsx b/examples/next-js/src/app/page.tsx index e38c626..e55a4c6 100644 --- a/examples/next-js/src/app/page.tsx +++ b/examples/next-js/src/app/page.tsx @@ -1,113 +1,58 @@ -import Image from 'next/image' +'use client'; + +import Link from 'next/link'; + +import { SignedIn, SignedOut, useAuth } from '@/auth-client'; export default function Home() { + const { status, user, signOut } = useAuth(); + return ( -
-
-

- Get started by editing  - src/app/page.tsx -

- -
+ <> +

react-starter-auth

+

+ HttpOnly cookie sessions for React. The token is held by the server — this page cannot read + it. +

-
- Next.js Logo +
+

Session

+

+ status: {status} + {user ? ( + <> + {' · '}signed in as {user.email} + + ) : null} +

- -
- ) +

Try it

+

+ Open devtools and run document.cookie. You will see the csrf{' '} + cookie and not the session — that is the whole point. +

+ + ); } diff --git a/examples/next-js/src/auth-client.ts b/examples/next-js/src/auth-client.ts new file mode 100644 index 0000000..f6daf40 --- /dev/null +++ b/examples/next-js/src/auth-client.ts @@ -0,0 +1,16 @@ +'use client'; + +import { createAuthClient } from '@thinkgrid/react-starter-auth'; + +import type { User } from './auth'; + +/** + * The typed client, created once. + * + * `User` is fixed here, so `useAuth()` returns `User | null` everywhere with no + * per-call-site type argument to get wrong. + */ +export const { AuthProvider, useAuth, useRequireAuth, SignedIn, SignedOut, fetcher } = + createAuthClient({ + basePath: '/api/auth', + }); diff --git a/examples/next-js/src/auth.ts b/examples/next-js/src/auth.ts new file mode 100644 index 0000000..7f90ef5 --- /dev/null +++ b/examples/next-js/src/auth.ts @@ -0,0 +1,50 @@ +import { createAuthHandlers } from '@thinkgrid/react-starter-auth/server'; +import { createNextAdapter } from '@thinkgrid/react-starter-auth/next'; + +export interface User extends Record { + id: string; + name: string; + email: string; +} + +/** + * A stand-in for your identity provider. + * + * Replace `authenticate` with a real call — a database lookup, an OAuth token + * exchange, whatever issues your tokens. The only contract is: return the user + * plus an access token, or `null` to reject. + */ +const DEMO_USER: User = { id: '1', name: 'Ada Lovelace', email: 'ada@example.com' }; + +function fakeAccessToken(): string { + // A real deployment receives this from its identity provider. It is opaque to + // this library unless you also configure `jwt` to verify it. + const payload = Buffer.from( + JSON.stringify({ sub: DEMO_USER.id, exp: Math.floor(Date.now() / 1000) + 900 }), + ).toString('base64url'); + return `header.${payload}.signature`; +} + +export const auth = createAuthHandlers({ + secret: process.env.AUTH_SECRET!, + + authenticate: async ({ email, password }) => { + if (email !== DEMO_USER.email || password !== 'password') return null; + return { + user: DEMO_USER, + accessToken: fakeAccessToken(), + refreshToken: 'demo-refresh-token', + }; + }, + + refresh: async (refreshToken) => { + if (refreshToken !== 'demo-refresh-token') return null; + return { + user: DEMO_USER, + accessToken: fakeAccessToken(), + refreshToken: 'demo-refresh-token', + }; + }, +}); + +export const nextAuth = createNextAdapter(auth); diff --git a/examples/next-js/src/middleware.ts b/examples/next-js/src/middleware.ts new file mode 100644 index 0000000..e0c19e4 --- /dev/null +++ b/examples/next-js/src/middleware.ts @@ -0,0 +1,22 @@ +import { NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; + +import { nextAuth } from '@/auth'; + +/** + * The real access control. + * + * This runs on the server before the page does, which is what makes it + * enforcement rather than decoration. The client-side guards in the pages keep + * the UI coherent but are not security. + */ +export async function middleware(request: NextRequest) { + const redirectTo = await nextAuth.guard(request, { redirectTo: '/login' }); + return redirectTo ? NextResponse.redirect(redirectTo) : NextResponse.next(); +} + +export const config = { + // Both entries are needed: `/dashboard/:path*` matches the children but not + // `/dashboard` itself, which would leave the page unguarded by middleware. + matcher: ['/dashboard', '/dashboard/:path*'], +}; diff --git a/examples/next-js/tailwind.config.ts b/examples/next-js/tailwind.config.ts deleted file mode 100644 index 1af3b8f..0000000 --- a/examples/next-js/tailwind.config.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { Config } from 'tailwindcss' - -const config: Config = { - content: [ - './src/pages/**/*.{js,ts,jsx,tsx,mdx}', - './src/components/**/*.{js,ts,jsx,tsx,mdx}', - './src/app/**/*.{js,ts,jsx,tsx,mdx}', - ], - theme: { - extend: { - backgroundImage: { - 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', - 'gradient-conic': - 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', - }, - }, - }, - plugins: [], -} -export default config diff --git a/examples/next-js/yarn.lock b/examples/next-js/yarn.lock deleted file mode 100644 index 9f2fe80..0000000 --- a/examples/next-js/yarn.lock +++ /dev/null @@ -1,2518 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@aashutoshrathi/word-wrap@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" - integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== - -"@alloc/quick-lru@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" - integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== - -"@babel/runtime@^7.20.7": - version "7.23.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" - integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== - dependencies: - regenerator-runtime "^0.14.0" - -"@eslint-community/eslint-utils@^4.2.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" - integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== - dependencies: - eslint-visitor-keys "^3.3.0" - -"@eslint-community/regexpp@^4.6.1": - version "4.10.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" - integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== - -"@eslint/eslintrc@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" - integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@eslint/js@8.52.0": - version "8.52.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.52.0.tgz#78fe5f117840f69dc4a353adf9b9cd926353378c" - integrity sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA== - -"@humanwhocodes/config-array@^0.11.13": - version "0.11.13" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" - integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== - dependencies: - "@humanwhocodes/object-schema" "^2.0.1" - debug "^4.1.1" - minimatch "^3.0.5" - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^2.0.1": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" - integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": - version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@next/env@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/env/-/env-14.0.1.tgz#7d03c9042c205a320aef2ea3f83c2d16b6825563" - integrity sha512-Ms8ZswqY65/YfcjrlcIwMPD7Rg/dVjdLapMcSHG26W6O67EJDF435ShW4H4LXi1xKO1oRc97tLXUpx8jpLe86A== - -"@next/eslint-plugin-next@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/eslint-plugin-next/-/eslint-plugin-next-14.0.1.tgz#6e587b76588a02d77267945b5d1f059a6c8fd9ca" - integrity sha512-bLjJMwXdzvhnQOnxvHoTTUh/+PYk6FF/DCgHi4BXwXCINer+o1ZYfL9aVeezj/oI7wqGJOqwGIXrlBvPbAId3w== - dependencies: - glob "7.1.7" - -"@next/swc-darwin-arm64@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.0.1.tgz#75a5f872c4077ecd536d7496bc24f3d312d5dcd0" - integrity sha512-JyxnGCS4qT67hdOKQ0CkgFTp+PXub5W1wsGvIq98TNbF3YEIN7iDekYhYsZzc8Ov0pWEsghQt+tANdidITCLaw== - -"@next/swc-darwin-x64@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-14.0.1.tgz#7d8498fc680cc8b4d5181bee336818c63779bc5e" - integrity sha512-625Z7bb5AyIzswF9hvfZWa+HTwFZw+Jn3lOBNZB87lUS0iuCYDHqk3ujuHCkiyPtSC0xFBtYDLcrZ11mF/ap3w== - -"@next/swc-linux-arm64-gnu@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.0.1.tgz#184286794e67bed192de7dbb10d7f040c996f965" - integrity sha512-iVpn3KG3DprFXzVHM09kvb//4CNNXBQ9NB/pTm8LO+vnnnaObnzFdS5KM+w1okwa32xH0g8EvZIhoB3fI3mS1g== - -"@next/swc-linux-arm64-musl@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.0.1.tgz#e8121b860ebc97a8d2a9113e5a42878430e749d5" - integrity sha512-mVsGyMxTLWZXyD5sen6kGOTYVOO67lZjLApIj/JsTEEohDDt1im2nkspzfV5MvhfS7diDw6Rp/xvAQaWZTv1Ww== - -"@next/swc-linux-x64-gnu@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.0.1.tgz#cdc4276b11a10c892fd1cb7dd31e024064db9c3b" - integrity sha512-wMqf90uDWN001NqCM/auRl3+qVVeKfjJdT9XW+RMIOf+rhUzadmYJu++tp2y+hUbb6GTRhT+VjQzcgg/QTD9NQ== - -"@next/swc-linux-x64-musl@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.0.1.tgz#4a194a484ceb34fd370e8d1af571493859fb2542" - integrity sha512-ol1X1e24w4j4QwdeNjfX0f+Nza25n+ymY0T2frTyalVczUmzkVD7QGgPTZMHfR1aLrO69hBs0G3QBYaj22J5GQ== - -"@next/swc-win32-arm64-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.0.1.tgz#71923debee50f98ef166b28cdb3ad7e7463e6598" - integrity sha512-WEmTEeWs6yRUEnUlahTgvZteh5RJc4sEjCQIodJlZZ5/VJwVP8p2L7l6VhzQhT4h7KvLx/Ed4UViBdne6zpIsw== - -"@next/swc-win32-ia32-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.0.1.tgz#b8f46da899c279fd65db76f0951849290c480ef9" - integrity sha512-oFpHphN4ygAgZUKjzga7SoH2VGbEJXZa/KL8bHCAwCjDWle6R1SpiGOdUdA8EJ9YsG1TYWpzY6FTbUA+iAJeww== - -"@next/swc-win32-x64-msvc@14.0.1": - version "14.0.1" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.0.1.tgz#be3dd8b3729ec51c99ff04b51e2b235756d02b6e" - integrity sha512-FFp3nOJ/5qSpeWT0BZQ+YE1pSMk4IMpkME/1DwKBwhg4mJLB9L+6EXuJi4JEwaJdl5iN+UUlmUD3IsR1kx5fAg== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": - version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@rushstack/eslint-patch@^1.3.3": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz#5f1b518ec5fa54437c0b7c4a821546c64fed6922" - integrity sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA== - -"@swc/helpers@0.5.2": - version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" - integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== - dependencies: - tslib "^2.4.0" - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/node@^20": - version "20.8.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.10.tgz#a5448b895c753ae929c26ce85cab557c6d4a365e" - integrity sha512-TlgT8JntpcbmKUFzjhsyhGfP2fsiz1Mv56im6enJ905xG1DAYesxJaeSbGqQmAw8OWPdhyJGhGSQGKRNJ45u9w== - dependencies: - undici-types "~5.26.4" - -"@types/prop-types@*": - version "15.7.9" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.9.tgz#b6f785caa7ea1fe4414d9df42ee0ab67f23d8a6d" - integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== - -"@types/react-dom@^18": - version "18.2.14" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.14.tgz#c01ba40e5bb57fc1dc41569bb3ccdb19eab1c539" - integrity sha512-V835xgdSVmyQmI1KLV2BEIUgqEuinxp9O4G6g3FqO/SqLac049E53aysv0oEFD2kHfejeKU+ZqL2bcFWj9gLAQ== - dependencies: - "@types/react" "*" - -"@types/react@*", "@types/react@^18.2.33": - version "18.2.33" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.33.tgz#055356243dc4350a9ee6c6a2c07c5cae12e38877" - integrity sha512-v+I7S+hu3PIBoVkKGpSYYpiBT1ijqEzWpzQD62/jm4K74hPpSP7FF9BnKG6+fg2+62weJYkkBWDJlZt5JO/9hg== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/scheduler@*": - version "0.16.5" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.5.tgz#4751153abbf8d6199babb345a52e1eb4167d64af" - integrity sha512-s/FPdYRmZR8SjLWGMCuax7r3qCWQw9QKHzXVukAuuIJkXkDRwp+Pu5LMIVFi0Fxbav35WURicYr8u1QsoybnQw== - -"@typescript-eslint/parser@^5.4.2 || ^6.0.0": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.9.1.tgz#4f685f672f8b9580beb38d5fb99d52fc3e34f7a3" - integrity sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg== - dependencies: - "@typescript-eslint/scope-manager" "6.9.1" - "@typescript-eslint/types" "6.9.1" - "@typescript-eslint/typescript-estree" "6.9.1" - "@typescript-eslint/visitor-keys" "6.9.1" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@6.9.1": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz#e96afeb9a68ad1cd816dba233351f61e13956b75" - integrity sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg== - dependencies: - "@typescript-eslint/types" "6.9.1" - "@typescript-eslint/visitor-keys" "6.9.1" - -"@typescript-eslint/types@6.9.1": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.9.1.tgz#a6cfc20db0fcedcb2f397ea728ef583e0ee72459" - integrity sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ== - -"@typescript-eslint/typescript-estree@6.9.1": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz#8c77910a49a04f0607ba94d78772da07dab275ad" - integrity sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw== - dependencies: - "@typescript-eslint/types" "6.9.1" - "@typescript-eslint/visitor-keys" "6.9.1" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.5.4" - ts-api-utils "^1.0.1" - -"@typescript-eslint/visitor-keys@6.9.1": - version "6.9.1" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz#6753a9225a0ba00459b15d6456b9c2780b66707d" - integrity sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw== - dependencies: - "@typescript-eslint/types" "6.9.1" - eslint-visitor-keys "^3.4.1" - -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn@^8.9.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -aria-query@^5.1.3: - version "5.3.0" - resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.3.0.tgz#650c569e41ad90b51b3d7df5e5eed1c7549c103e" - integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== - dependencies: - dequal "^2.0.3" - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-includes@^3.1.6, array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" - -array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" - integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1, array.prototype.flatmap@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" - integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.tosorted@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" - integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" - -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -ast-types-flow@^0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad" - integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== - -asynciterator.prototype@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" - integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== - dependencies: - has-symbols "^1.0.3" - -autoprefixer@^10.0.1: - version "10.4.16" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" - integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== - dependencies: - browserslist "^4.21.10" - caniuse-lite "^1.0.30001538" - fraction.js "^4.3.6" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axe-core@^4.6.2: - version "4.8.2" - resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.2.tgz#2f6f3cde40935825cf4465e3c1c9e77b240ff6ae" - integrity sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g== - -axobject-query@^3.1.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" - integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== - dependencies: - dequal "^2.0.3" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.21.10: - version "4.22.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" - integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== - dependencies: - caniuse-lite "^1.0.30001541" - electron-to-chromium "^1.4.535" - node-releases "^2.0.13" - update-browserslist-db "^1.0.13" - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== - dependencies: - function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-css@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: - version "1.0.30001559" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001559.tgz#95a982440d3d314c471db68d02664fb7536c5a30" - integrity sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA== - -chalk@^4.0.0: - version "4.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -commander@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" - integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -cross-spawn@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -damerau-levenshtein@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz#b43d286ccbd36bc5b2f7ed41caf2d0aba1f8a6e7" - integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== - dependencies: - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -dequal@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" - integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== - -didyoumean@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" - integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dlv@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -electron-to-chromium@^1.4.535: - version "1.4.572" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.572.tgz#ed9876658998138fe9e3aa47ecfa0bf914192a86" - integrity sha512-RlFobl4D3ieetbnR+2EpxdzFl9h0RAJkPK3pfiwMug2nhBin2ZCsGIAJWdpNniLz43sgXam/CgipOmvTA+rUiA== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -enhanced-resolve@^5.12.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.12" - is-weakref "^1.0.2" - object-inspect "^1.13.1" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" - -es-iterator-helpers@^1.0.12: - version "1.0.15" - resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" - integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== - dependencies: - asynciterator.prototype "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.1" - es-abstract "^1.22.1" - es-set-tostringtag "^2.0.1" - function-bind "^1.1.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - iterator.prototype "^1.1.2" - safe-array-concat "^1.0.1" - -es-set-tostringtag@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" - integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== - dependencies: - get-intrinsic "^1.2.2" - has-tostringtag "^1.0.0" - hasown "^2.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" - integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== - dependencies: - hasown "^2.0.0" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-next@14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/eslint-config-next/-/eslint-config-next-14.0.1.tgz#4e59cbaa1c1c72f6d7c4d9110b0902630493ef56" - integrity sha512-QfIFK2WD39H4WOespjgf6PLv9Bpsd7KGGelCtmq4l67nGvnlsGpuvj0hIT+aIy6p5gKH+lAChYILsyDlxP52yg== - dependencies: - "@next/eslint-plugin-next" "14.0.1" - "@rushstack/eslint-patch" "^1.3.3" - "@typescript-eslint/parser" "^5.4.2 || ^6.0.0" - eslint-import-resolver-node "^0.3.6" - eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.28.1" - eslint-plugin-jsx-a11y "^6.7.1" - eslint-plugin-react "^7.33.2" - eslint-plugin-react-hooks "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" - -eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: - version "0.3.9" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz#d4eaac52b8a2e7c3cd1903eb00f7e053356118ac" - integrity sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== - dependencies: - debug "^3.2.7" - is-core-module "^2.13.0" - resolve "^1.22.4" - -eslint-import-resolver-typescript@^3.5.2: - version "3.6.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz#7b983680edd3f1c5bce1a5829ae0bc2d57fe9efa" - integrity sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - fast-glob "^3.3.1" - get-tsconfig "^4.5.0" - is-core-module "^2.11.0" - is-glob "^4.0.3" - -eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-import@^2.28.1: - version "2.29.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz#8133232e4329ee344f2f612885ac3073b0b7e155" - integrity sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg== - dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" - array.prototype.flat "^1.3.2" - array.prototype.flatmap "^1.3.2" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" - semver "^6.3.1" - tsconfig-paths "^3.14.2" - -eslint-plugin-jsx-a11y@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz#fca5e02d115f48c9a597a6894d5bcec2f7a76976" - integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== - dependencies: - "@babel/runtime" "^7.20.7" - aria-query "^5.1.3" - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - ast-types-flow "^0.0.7" - axe-core "^4.6.2" - axobject-query "^3.1.1" - damerau-levenshtein "^1.0.8" - emoji-regex "^9.2.2" - has "^1.0.3" - jsx-ast-utils "^3.3.3" - language-tags "=1.0.5" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - semver "^6.3.0" - -"eslint-plugin-react-hooks@^4.5.0 || 5.0.0-canary-7118f5dd7-20230705": - version "4.6.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz#4c3e697ad95b77e93f8646aaa1630c1ba607edd3" - integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== - -eslint-plugin-react@^7.33.2: - version "7.33.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" - integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" - doctrine "^2.1.0" - es-iterator-helpers "^1.0.12" - estraverse "^5.3.0" - jsx-ast-utils "^2.4.1 || ^3.0.0" - minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" - prop-types "^15.8.1" - resolve "^2.0.0-next.4" - semver "^6.3.1" - string.prototype.matchall "^4.0.8" - -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: - version "3.4.3" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" - integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== - -eslint@^8: - version "8.52.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.52.0.tgz#d0cd4a1fac06427a61ef9242b9353f36ea7062fc" - integrity sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg== - dependencies: - "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.2" - "@eslint/js" "8.52.0" - "@humanwhocodes/config-array" "^0.11.13" - "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" - ajv "^6.12.4" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" - ignore "^5.2.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== - dependencies: - acorn "^8.9.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" - -esquery@^1.4.2: - version "1.5.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" - integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.9, fast-glob@^3.3.0, fast-glob@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" - integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.1.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" - integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== - dependencies: - flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" - -flatted@^3.2.9: - version "3.2.9" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" - integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -fraction.js@^4.3.6: - version "4.3.7" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" - integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" - integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== - -function-bind@^1.1.1, function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" - integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - functions-have-names "^1.2.3" - -functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== - dependencies: - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.5.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.2.tgz#0dcd6fb330391d46332f4c6c1bf89a6514c2ddce" - integrity sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A== - dependencies: - resolve-pkg-maps "^1.0.0" - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@7.1.7: - version "7.1.7" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" - integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.1.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globals@^13.19.0: - version "13.23.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" - integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@^4.1.2, graceful-fs@^4.2.4: - version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -graphemer@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" - integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" - integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== - dependencies: - get-intrinsic "^1.2.2" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.4.tgz#2eb2860e000011dae4f1406a86fe80e530fb2ec6" - integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== - -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== - dependencies: - function-bind "^1.1.2" - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -internal-slot@^1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" - integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== - dependencies: - get-intrinsic "^1.2.2" - hasown "^2.0.0" - side-channel "^1.0.4" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-async-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" - integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== - dependencies: - has-tostringtag "^1.0.0" - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.11.0, is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-date-object@^1.0.1, is-date-object@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-finalizationregistry@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" - integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== - dependencies: - call-bind "^1.0.2" - -is-generator-function@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" - integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== - dependencies: - has-tostringtag "^1.0.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-map@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" - integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-set@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" - integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== - dependencies: - which-typed-array "^1.1.11" - -is-weakmap@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" - integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-weakset@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" - integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -iterator.prototype@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" - integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== - dependencies: - define-properties "^1.2.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - reflect.getprototypeof "^1.0.4" - set-function-name "^2.0.1" - -jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== - -js-cookie@^3.0.1: - version "3.0.5" - resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc" - integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw== - -"js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -json-buffer@3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" - integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: - version "3.3.5" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" - integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - object.assign "^4.1.4" - object.values "^1.1.6" - -keyv@^4.5.3: - version "4.5.4" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" - integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== - dependencies: - json-buffer "3.0.1" - -language-subtag-registry@~0.3.2: - version "0.3.22" - resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" - integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== - -language-tags@=1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" - integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== - dependencies: - language-subtag-registry "~0.3.2" - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lilconfig@^2.0.5, lilconfig@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mz@^2.7.0: - version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -next@14.0.1: - version "14.0.1" - resolved "https://registry.yarnpkg.com/next/-/next-14.0.1.tgz#1375d94c5dc7af730234af48401be270e975cb22" - integrity sha512-s4YaLpE4b0gmb3ggtmpmV+wt+lPRuGtANzojMQ2+gmBpgX9w5fTbjsy6dXByBuENsdCX5pukZH/GxdFgO62+pA== - dependencies: - "@next/env" "14.0.1" - "@swc/helpers" "0.5.2" - busboy "1.6.0" - caniuse-lite "^1.0.30001406" - postcss "8.4.31" - styled-jsx "5.1.1" - watchpack "2.4.0" - optionalDependencies: - "@next/swc-darwin-arm64" "14.0.1" - "@next/swc-darwin-x64" "14.0.1" - "@next/swc-linux-arm64-gnu" "14.0.1" - "@next/swc-linux-arm64-musl" "14.0.1" - "@next/swc-linux-x64-gnu" "14.0.1" - "@next/swc-linux-x64-musl" "14.0.1" - "@next/swc-win32-arm64-msvc" "14.0.1" - "@next/swc-win32-ia32-msvc" "14.0.1" - "@next/swc-win32-x64-msvc" "14.0.1" - -node-releases@^2.0.13: - version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -object-assign@^4.0.1, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-hash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" - integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== - -object-inspect@^1.13.1, object-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.entries@^1.1.6: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" - integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.fromentries@^2.0.6, object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - -object.hasown@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" - integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== - dependencies: - define-properties "^1.2.0" - es-abstract "^1.22.1" - -object.values@^1.1.6, object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -optionator@^0.9.3: - version "0.9.3" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" - integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== - dependencies: - "@aashutoshrathi/word-wrap" "^1.2.3" - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pirates@^4.0.1: - version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" - integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== - -postcss-import@^15.1.0: - version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" - integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== - dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" - resolve "^1.1.7" - -postcss-js@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" - integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== - dependencies: - camelcase-css "^2.0.1" - -postcss-load-config@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" - integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== - dependencies: - lilconfig "^2.0.5" - yaml "^2.1.1" - -postcss-nested@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" - integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== - dependencies: - postcss-selector-parser "^6.0.11" - -postcss-selector-parser@^6.0.11: - version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@8.4.31, postcss@^8, postcss@^8.4.23: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -punycode@^2.1.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" - integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -"react-dom@>=16.8.0 || ^17.x || ^18.x", react-dom@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.0" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-starter-auth@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/react-starter-auth/-/react-starter-auth-0.1.1.tgz#836b5acfeff29be65bcf26b126e1c999b0f221d7" - integrity sha512-yifLGP/gTy1CE7J49JOiN1AHFrX9ykWFnu1d2DQe0gUKyPZ5llYEWFl1BEvnF/jWLFH0hTWfBee//pLxitMUaQ== - dependencies: - js-cookie "^3.0.1" - react ">=16.8.0 || ^17.x || ^18.x" - react-dom ">=16.8.0 || ^17.x || ^18.x" - -"react@>=16.8.0 || ^17.x || ^18.x", react@^18: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== - dependencies: - loose-envify "^1.1.0" - -read-cache@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" - integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== - dependencies: - pify "^2.3.0" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reflect.getprototypeof@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" - integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - globalthis "^1.0.3" - which-builtin-type "^1.1.3" - -regenerator-runtime@^0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" - integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== - -regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve@^1.1.7, resolve@^1.22.2, resolve@^1.22.4: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^2.0.0-next.4: - version "2.0.0-next.5" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" - integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== - dependencies: - loose-envify "^1.1.0" - -semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== - dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" - gopd "^1.0.1" - has-property-descriptors "^1.0.0" - -set-function-name@^2.0.0, set-function-name@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== - dependencies: - define-data-property "^1.0.1" - functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string.prototype.matchall@^4.0.8: - version "4.0.10" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" - integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - regexp.prototype.flags "^1.5.0" - set-function-name "^2.0.0" - side-channel "^1.0.4" - -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - -strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -styled-jsx@5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" - integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== - dependencies: - client-only "0.0.1" - -sucrase@^3.32.0: - version "3.34.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" - integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.2" - commander "^4.0.0" - glob "7.1.6" - lines-and-columns "^1.1.6" - mz "^2.7.0" - pirates "^4.0.1" - ts-interface-checker "^0.1.9" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -tailwindcss@^3.3.0: - version "3.3.5" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.5.tgz#22a59e2fbe0ecb6660809d9cc5f3976b077be3b8" - integrity sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA== - dependencies: - "@alloc/quick-lru" "^5.2.0" - arg "^5.0.2" - chokidar "^3.5.3" - didyoumean "^1.2.2" - dlv "^1.1.3" - fast-glob "^3.3.0" - glob-parent "^6.0.2" - is-glob "^4.0.3" - jiti "^1.19.1" - lilconfig "^2.1.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - object-hash "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.23" - postcss-import "^15.1.0" - postcss-js "^4.0.1" - postcss-load-config "^4.0.1" - postcss-nested "^6.0.1" - postcss-selector-parser "^6.0.11" - resolve "^1.22.2" - sucrase "^3.32.0" - -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -ts-api-utils@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.0.3.tgz#f12c1c781d04427313dbac808f453f050e54a331" - integrity sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg== - -ts-interface-checker@^0.1.9: - version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" - integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== - -tsconfig-paths@^3.14.2: - version "3.14.2" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^2.4.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typescript@^5: - version "5.2.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -update-browserslist-db@^1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" - integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -watchpack@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-builtin-type@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" - integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== - dependencies: - function.prototype.name "^1.1.5" - has-tostringtag "^1.0.0" - is-async-function "^2.0.0" - is-date-object "^1.0.5" - is-finalizationregistry "^1.0.2" - is-generator-function "^1.0.10" - is-regex "^1.1.4" - is-weakref "^1.0.2" - isarray "^2.0.5" - which-boxed-primitive "^1.0.2" - which-collection "^1.0.1" - which-typed-array "^1.1.9" - -which-collection@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" - integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== - dependencies: - is-map "^2.0.1" - is-set "^2.0.1" - is-weakmap "^2.0.1" - is-weakset "^2.0.1" - -which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^2.1.1: - version "2.3.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" - integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/full_test_results.log b/full_test_results.log deleted file mode 100644 index 6530506..0000000 --- a/full_test_results.log +++ /dev/null @@ -1,108 +0,0 @@ -FAIL src/utils/__tests__/cookie.test.ts (8.721 s) - Cookie Utils - ✕ should set auth token with secure flag (52 ms) - ✓ should set auth token without secure flag - ✓ should get auth token (1 ms) - ✓ should clear auth token - - ● Cookie Utils › should set auth token with secure flag - - expect(jest.fn()).toHaveBeenCalledWith(...expected) - - - Expected - + Received - - "starter_auth_token", - "test-token", - Object { - + "expires": 7, - + "sameSite": "Strict", - "secure": true, - }, - - Number of calls: 1 - - 17 | it('should set auth token with secure flag', () => { - 18 | setAuthToken(token, true); - > 19 | expect(Cookies.set).toHaveBeenCalledWith('starter_auth_token', token, { secure: true }); - | ^ - 20 | }); - 21 | - 22 | it('should set auth token without secure flag', () => { - - at Object. (src/utils/__tests__/cookie.test.ts:19:29) - -PASS src/utils/__tests__/helpers.test.ts (8.81 s) - Helper Utils - User State Persistence - ✓ should set user state in localStorage (10 ms) - ✓ should get user state from localStorage (1 ms) - ✓ should delete user state (4 ms) - isTokenValid - ✓ should return true for valid non-expired token (2 ms) - ✓ should return false for expired token (2 ms) - ✓ should return false for null/empty token - ✓ should handle malformed token gracefully (currently crashes, needs fix) - -FAIL dist/utils/__tests__/helpers.test.d.ts - ● Test suite failed to run - - Your test suite must contain at least one test. - - at onResult (node_modules/.pnpm/@jest+core@29.7.0/node_modules/@jest/core/build/TestScheduler.js:133:18) - at node_modules/.pnpm/@jest+core@29.7.0/node_modules/@jest/core/build/TestScheduler.js:254:19 - at node_modules/.pnpm/emittery@0.13.1/node_modules/emittery/index.js:363:13 - at Array.map () - at Emittery.emit (node_modules/.pnpm/emittery@0.13.1/node_modules/emittery/index.js:361:23) - -FAIL dist/utils/__tests__/cookie.test.d.ts - ● Test suite failed to run - - Your test suite must contain at least one test. - - at onResult (node_modules/.pnpm/@jest+core@29.7.0/node_modules/@jest/core/build/TestScheduler.js:133:18) - at node_modules/.pnpm/@jest+core@29.7.0/node_modules/@jest/core/build/TestScheduler.js:254:19 - at node_modules/.pnpm/emittery@0.13.1/node_modules/emittery/index.js:363:13 - at Array.map () - at Emittery.emit (node_modules/.pnpm/emittery@0.13.1/node_modules/emittery/index.js:361:23) - -FAIL dist/__tests__/AuthProvider.test.d.ts - ● Test suite failed to run - - Your test suite must contain at least one test. - - at onResult (node_modules/.pnpm/@jest+core@29.7.0/node_modules/@jest/core/build/TestScheduler.js:133:18) - at node_modules/.pnpm/@jest+core@29.7.0/node_modules/@jest/core/build/TestScheduler.js:254:19 - at node_modules/.pnpm/emittery@0.13.1/node_modules/emittery/index.js:363:13 - at Array.map () - at Emittery.emit (node_modules/.pnpm/emittery@0.13.1/node_modules/emittery/index.js:361:23) - - console.error - `ReactDOMTestUtils.act` is deprecated in favor of `React.act`. Import `act` from `react` instead of `react-dom/test-utils`. See https://react.dev/warnings/react-dom-test-utils for more info. - - 35 | - 36 | it('renders children', () => { - > 37 | render( - | ^ - 38 | - 39 |
Child Content
- 40 |
- - at Object..process.env.NODE_ENV.exports.act (node_modules/.pnpm/react-dom@19.2.4_react@19.2.4/node_modules/react-dom/cjs/react-dom-test-utils.development.js:19:17) - at node_modules/.pnpm/@testing-library+react@14.0.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@testing-library/react/dist/act-compat.js:46:25 - at renderRoot (node_modules/.pnpm/@testing-library+react@14.0.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@testing-library/react/dist/pure.js:161:26) - at render (node_modules/.pnpm/@testing-library+react@14.0.0_react-dom@19.2.4_react@19.2.4__react@19.2.4/node_modules/@testing-library/react/dist/pure.js:247:10) - at Object. (src/__tests__/AuthProvider.test.tsx:37:15) - -PASS src/__tests__/AuthProvider.test.tsx (9.664 s) - AuthProvider - ✓ renders children (104 ms) - ✓ initializes as not authenticated by default (16 ms) - ✓ loads user from cookies if token is valid (12 ms) - ✓ signs in user and updates state (13 ms) - -Test Suites: 4 failed, 2 passed, 6 total -Tests: 1 failed, 14 passed, 15 total -Snapshots: 0 total -Time: 12.77 s -Ran all test suites. diff --git a/jest.config.js b/jest.config.js index faa4d0d..1f40850 100644 --- a/jest.config.js +++ b/jest.config.js @@ -4,4 +4,26 @@ module.exports = { testEnvironment: 'jest-environment-jsdom', cacheDirectory: '.jest-cache', modulePathIgnorePatterns: ['/dist/'], + // e2e/ holds Playwright specs, which jest must not try to run. + testPathIgnorePatterns: ['/node_modules/', '/e2e/'], + + collectCoverageFrom: [ + 'src/**/*.{ts,tsx}', + '!src/**/__tests__/**', + // Barrel files: pure re-exports with no logic to cover. + '!src/index.tsx', + '!src/core/index.ts', + '!src/server/index.ts', + ], + + // Set just under what the suite currently achieves, so a regression fails + // the build but ordinary refactoring does not. + coverageThreshold: { + global: { + statements: 93, + branches: 84, + functions: 95, + lines: 96, + }, + }, }; diff --git a/lefthook.yml b/lefthook.yml index 56c56ea..c543120 100644 --- a/lefthook.yml +++ b/lefthook.yml @@ -1,9 +1,11 @@ pre-commit: parallel: true commands: + # Scoped to the library source: the example apps have their own eslint + # configs that cannot resolve from this root. lint: - glob: "*.{js,ts,tsx}" + glob: "src/**/*.{ts,tsx}" run: pnpm eslint {staged_files} typecheck: - glob: "*.{ts,tsx}" - run: pnpm tsc --noEmit + glob: "src/**/*.{ts,tsx}" + run: pnpm typecheck diff --git a/package.json b/package.json index fae374d..892d2b0 100644 --- a/package.json +++ b/package.json @@ -1,61 +1,126 @@ { - "name": "@think-grid-labs/react-starter-auth", - "version": "0.1.0", - "description": "React Next Starter Authentication", + "name": "@thinkgrid/react-starter-auth", + "version": "1.0.0", + "description": "Secure JWT authentication for React and Next.js — HttpOnly server sessions, verified tokens, CSRF built in.", "keywords": [ - "reactjs", + "react", "nextjs", "authentication", - "jwt" + "auth", + "jwt", + "session", + "httponly", + "cookie", + "csrf", + "jose", + "bff", + "react-router", + "remix", + "ssr" ], + "license": "MIT", + "author": "Dennis Paler ", + "homepage": "https://github.com/thinkgrid-labs/react-starter-auth#readme", + "repository": { + "type": "git", + "url": "git+https://github.com/thinkgrid-labs/react-starter-auth.git" + }, + "bugs": { + "url": "https://github.com/thinkgrid-labs/react-starter-auth/issues" + }, + "engines": { + "node": ">=18.17.0" + }, "source": "src/index.tsx", - "main": "dist/index.js", - "module": "dist/index.js", - "unpkg": "dist/index.umd.js", - "types": "dist/index.d.ts", - "directories": { - "dist": "dist" + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "unpkg": "./dist/index.umd.js", + "types": "./dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.cjs", + "default": "./dist/index.mjs" + }, + "./core": { + "types": "./dist/core/index.d.ts", + "import": "./dist/core.mjs", + "require": "./dist/core.cjs", + "default": "./dist/core.mjs" + }, + "./server": { + "types": "./dist/server/index.d.ts", + "import": "./dist/server.mjs", + "require": "./dist/server.cjs", + "default": "./dist/server.mjs" + }, + "./next": { + "types": "./dist/adapters/next.d.ts", + "import": "./dist/next.mjs", + "require": "./dist/next.cjs", + "default": "./dist/next.mjs" + }, + "./react-router": { + "types": "./dist/adapters/react-router.d.ts", + "import": "./dist/react-router.mjs", + "require": "./dist/react-router.cjs", + "default": "./dist/react-router.mjs" + }, + "./node": { + "types": "./dist/adapters/node.d.ts", + "import": "./dist/node.mjs", + "require": "./dist/node.cjs", + "default": "./dist/node.mjs" + }, + "./package.json": "./package.json" }, + "sideEffects": false, "files": [ - "dist" + "dist", + "CHANGELOG.md", + "MIGRATION.md" ], - "author": "Dennis Paler ", - "homepage": "https://github.com/ThinkGrid-Labs/react-starter-auth#readme", - "license": "MIT", "publishConfig": { "access": "public" }, - "repository": { - "type": "git", - "url": "git+https://github.com/ThinkGrid-Labs/react-starter-auth.git" - }, "scripts": { - "build": "run-s build:*", + "build": "run-s build:clean build:bundle", "build:clean": "rimraf ./dist", - "build:dir": "mkdirp ./dist", - "build:build": "rollup -c", - "preversion": "run-s test", - "test": "run-s test:*", - "test:build": "run-s build", + "build:bundle": "rollup -c", + "lint": "eslint \"src/**/*.{ts,tsx}\"", + "lint:fix": "eslint \"src/**/*.{ts,tsx}\" --fix", + "typecheck": "tsc --noEmit", + "test": "run-s lint typecheck test:unit", "test:unit": "jest", - "test:lint": "eslint src/**/*.ts src/**/*.tsx --fix", "test:unit:watch": "jest --watch", + "test:coverage": "jest --coverage", + "test:e2e": "playwright test", "format": "prettier --write \"src/**/*.{ts,tsx}\"", + "preversion": "run-s test", + "prepublishOnly": "run-s test build", "release": "release-it", "prepare": "lefthook install" }, + "dependencies": { + "jose": "^5.10.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, "devDependencies": { + "@playwright/test": "^1.62.1", "@release-it/conventional-changelog": "^8.0.1", "@rollup/plugin-node-resolve": "^15.2.3", "@rollup/plugin-terser": "^0.4.4", - "@testing-library/react": "14.0.0", + "@testing-library/dom": "^10.4.0", + "@testing-library/react": "^16.1.0", "@trivago/prettier-plugin-sort-imports": "^4.3.0", "@types/jest": "29.5.5", - "@types/js-cookie": "3.0.4", "@types/node": "20.8.6", - "@types/react": "18.2.28", - "@types/react-dom": "18.2.13", - "@types/react-router-dom": "5.3.3", + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", "@typescript-eslint/eslint-plugin": "6.8.0", "@typescript-eslint/parser": "6.8.0", "eslint": "8.50.0", @@ -66,11 +131,10 @@ "jest": "29.7.0", "jest-environment-jsdom": "^29.4.3", "lefthook": "^1.6.1", - "mkdirp": "3.0.1", "npm-run-all": "4.1.5", "prettier": "^3.2.5", - "react": ">=16.8.0 || ^17.x || ^18.x", - "react-dom": ">=16.8.0 || ^17.x || ^18.x", + "react": "^19.2.0", + "react-dom": "^19.2.0", "release-it": "^17.0.3", "rimraf": "5.0.5", "rollup": "^4.1.5", @@ -82,13 +146,5 @@ "tslib": "^2.8.1", "typescript": "^5.9.3" }, - "dependencies": { - "js-cookie": "^3.0.1" - }, - "peerDependencies": { - "js-cookie": "^3.0.1", - "react": ">=16.8.0 || ^17.x || ^18.x", - "react-dom": ">=16.8.0 || ^17.x || ^18.x" - }, "packageManager": "pnpm@10.24.0+sha512.01ff8ae71b4419903b65c60fb2dc9d34cf8bb6e06d03bde112ef38f7a34d6904c424ba66bea5cdcf12890230bf39f9580473140ed9c946fef328b6e5238a345a" -} \ No newline at end of file +} diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..5b501c4 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,42 @@ +import { defineConfig, devices } from '@playwright/test'; + +const PORT = 3100; +const BASE_URL = `http://127.0.0.1:${PORT}`; + +/** + * End-to-end tests against the Next.js example. + * + * These exist for the assertions unit tests structurally cannot make: that a + * real browser refuses to expose the session cookie to script, and that the + * middleware turns away a real navigation. + * + * Requires the library to be built first — the example depends on it by path. + */ +export default defineConfig({ + testDir: './e2e', + fullyParallel: false, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: 1, + reporter: process.env.CI ? 'list' : [['list']], + + use: { + baseURL: BASE_URL, + trace: 'retain-on-failure', + }, + + projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }], + + webServer: { + // `dev` rather than `start`: a production build sets Secure cookies, and + // relying on the browser's localhost exemption would make this test a worse + // model of how the library behaves over plain HTTP. + command: `pnpm --dir examples/next-js dev --port ${PORT}`, + url: BASE_URL, + timeout: 180_000, + reuseExistingServer: !process.env.CI, + env: { + AUTH_SECRET: 'e2e-test-secret-at-least-32-characters!!', + }, + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4015b52..01c31a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,10 +8,13 @@ importers: .: dependencies: - js-cookie: - specifier: ^3.0.1 - version: 3.0.5 + jose: + specifier: ^5.10.0 + version: 5.10.0 devDependencies: + '@playwright/test': + specifier: ^1.62.1 + version: 1.62.1 '@release-it/conventional-changelog': specifier: ^8.0.1 version: 8.0.2(release-it@17.11.0(typescript@5.9.3)) @@ -21,30 +24,27 @@ importers: '@rollup/plugin-terser': specifier: ^0.4.4 version: 0.4.4(rollup@4.57.0) + '@testing-library/dom': + specifier: ^10.4.0 + version: 10.4.1 '@testing-library/react': - specifier: 14.0.0 - version: 14.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + specifier: ^16.1.0 + version: 16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 version: 4.3.0(prettier@3.8.1) '@types/jest': specifier: 29.5.5 version: 29.5.5 - '@types/js-cookie': - specifier: 3.0.4 - version: 3.0.4 '@types/node': specifier: 20.8.6 version: 20.8.6 '@types/react': - specifier: 18.2.28 - version: 18.2.28 + specifier: ^19.2.0 + version: 19.2.18 '@types/react-dom': - specifier: 18.2.13 - version: 18.2.13 - '@types/react-router-dom': - specifier: 5.3.3 - version: 5.3.3 + specifier: ^19.2.0 + version: 19.2.4(@types/react@19.2.18) '@typescript-eslint/eslint-plugin': specifier: 6.8.0 version: 6.8.0(@typescript-eslint/parser@6.8.0(eslint@8.50.0)(typescript@5.9.3))(eslint@8.50.0)(typescript@5.9.3) @@ -75,9 +75,6 @@ importers: lefthook: specifier: ^1.6.1 version: 1.13.6 - mkdirp: - specifier: 3.0.1 - version: 3.0.1 npm-run-all: specifier: 4.1.5 version: 4.1.5 @@ -85,10 +82,10 @@ importers: specifier: ^3.2.5 version: 3.8.1 react: - specifier: '>=16.8.0 || ^17.x || ^18.x' + specifier: ^19.2.0 version: 19.2.4 react-dom: - specifier: '>=16.8.0 || ^17.x || ^18.x' + specifier: ^19.2.0 version: 19.2.4(react@19.2.4) release-it: specifier: ^17.0.3 @@ -576,6 +573,11 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@playwright/test@1.62.1': + resolution: {integrity: sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==} + engines: {node: '>=20'} + hasBin: true + '@pnpm/config.env-replace@1.1.0': resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} engines: {node: '>=12.22.0'} @@ -779,16 +781,24 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@testing-library/dom@9.3.4': - resolution: {integrity: sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==} - engines: {node: '>=14'} + '@testing-library/dom@10.4.1': + resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} + engines: {node: '>=18'} - '@testing-library/react@14.0.0': - resolution: {integrity: sha512-S04gSNJbYE30TlIMLTzv6QCTzt9AqIF5y6s6SzVFILNcNvbV/jU96GeiTPillGQo+Ny64M/5PV7klNYYgv5Dfg==} - engines: {node: '>=14'} + '@testing-library/react@16.3.2': + resolution: {integrity: sha512-XU5/SytQM+ykqMnAnvB2umaJNIOsLF3PVv//1Ew4CTcpz0/BRyy/af40qqrt7SjKpDdT1saBMc42CUok5gaw+g==} + engines: {node: '>=18'} peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 + '@testing-library/dom': ^10.0.0 + '@types/react': ^18.0.0 || ^19.0.0 + '@types/react-dom': ^18.0.0 || ^19.0.0 + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} @@ -835,9 +845,6 @@ packages: '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - '@types/history@4.7.11': - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -850,9 +857,6 @@ packages: '@types/jest@29.5.5': resolution: {integrity: sha512-ebylz2hnsWR9mYvmBFbXJXr+33UPc4+ZdxyDXh5w0FlPBTfCVN3wPL+kuOiQt3xvrK419v7XWeAs+AeOksafXg==} - '@types/js-cookie@3.0.4': - resolution: {integrity: sha512-vMMnFF+H5KYqdd/myCzq6wLDlPpteJK+jGFgBus3Da7lw+YsDmx2C8feGTzY2M3Fo823yON+HC2CL240j4OV+w==} - '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} @@ -865,27 +869,17 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/prop-types@15.7.15': - resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} - - '@types/react-dom@18.2.13': - resolution: {integrity: sha512-eJIUv7rPP+EC45uNYp/ThhSpE16k22VJUknt5OLoH9tbXoi8bMhwLf5xRuWMywamNbWzhrSmU7IBJfPup1+3fw==} - - '@types/react-router-dom@5.3.3': - resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} - - '@types/react-router@5.1.20': - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} + '@types/react-dom@19.2.4': + resolution: {integrity: sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==} + peerDependencies: + '@types/react': ^19.2.0 - '@types/react@18.2.28': - resolution: {integrity: sha512-ad4aa/RaaJS3hyGz0BGegdnSRXQBkd1CCYDCdNjBPg90UUpLgo+WlJqb9fMYUxtehmzF3PJaTWqRZjko6BRzBg==} + '@types/react@19.2.18': + resolution: {integrity: sha512-AnzbBERsrLKtk2XSfTbYRLjQPdy116Sty4q+T+Bp3IC4l6jNBvreVPAHmpq9qhXQM7CXZPjLVmGMw9sy+hxQ3w==} '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} - '@types/scheduler@0.26.0': - resolution: {integrity: sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA==} - '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -1085,8 +1079,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} @@ -1182,6 +1176,7 @@ packages: basic-ftp@5.1.0: resolution: {integrity: sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==} engines: {node: '>=10.0.0'} + deprecated: Security vulnerability fixed in 5.2.1, please upgrade before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} @@ -1410,10 +1405,12 @@ packages: conventional-changelog-atom@4.0.0: resolution: {integrity: sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-codemirror@4.0.0: resolution: {integrity: sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-conventionalcommits@7.0.2: resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} @@ -1422,26 +1419,32 @@ packages: conventional-changelog-core@7.0.0: resolution: {integrity: sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg==} engines: {node: '>=16'} + deprecated: Deprecated and no longer maintained. Please use conventional-changelog instead. conventional-changelog-ember@4.0.0: resolution: {integrity: sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-eslint@5.0.0: resolution: {integrity: sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-express@4.0.0: resolution: {integrity: sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-jquery@5.0.0: resolution: {integrity: sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-jshint@4.0.0: resolution: {integrity: sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==} engines: {node: '>=16'} + deprecated: This preset is deprecated. Please use conventional-changelog-conventionalcommits or conventional-changelog-angular instead. conventional-changelog-preset-loader@4.1.0: resolution: {integrity: sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA==} @@ -1552,10 +1555,6 @@ packages: babel-plugin-macros: optional: true - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -1604,6 +1603,10 @@ packages: deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1698,9 +1701,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - es-iterator-helpers@1.2.2: resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} engines: {node: '>= 0.4'} @@ -1940,6 +1940,11 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2007,16 +2012,19 @@ packages: git-raw-commits@4.0.0: resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} engines: {node: '>=16'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true git-semver-tags@7.0.1: resolution: {integrity: sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q==} engines: {node: '>=16'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true git-semver-tags@8.0.0: resolution: {integrity: sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==} engines: {node: '>=18'} + deprecated: Deprecated and no longer maintained. Use @conventional-changelog/git-client instead. hasBin: true git-up@7.0.0: @@ -2035,16 +2043,17 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} @@ -2243,10 +2252,6 @@ packages: resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} engines: {node: '>= 12'} - is-arguments@1.2.0: - resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} - engines: {node: '>= 0.4'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -2623,9 +2628,8 @@ packages: node-notifier: optional: true - js-cookie@3.0.5: - resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} - engines: {node: '>=14'} + jose@5.10.0: + resolution: {integrity: sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==} js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2986,11 +2990,6 @@ packages: engines: {node: '>=10'} hasBin: true - mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -3110,10 +3109,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -3333,6 +3328,16 @@ packages: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + playwright-core@1.62.1: + resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} + engines: {node: '>=20'} + hasBin: true + + playwright@1.62.1: + resolution: {integrity: sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==} + engines: {node: '>=20'} + hasBin: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -3895,7 +3900,7 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me terser@5.46.0: resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} @@ -4888,6 +4893,10 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@playwright/test@1.62.1': + dependencies: + playwright: 1.62.1 + '@pnpm/config.env-replace@1.1.0': {} '@pnpm/network.ca-file@1.0.2': @@ -5051,24 +5060,26 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@testing-library/dom@9.3.4': + '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.28.6 '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 - aria-query: 5.1.3 - chalk: 4.1.2 + aria-query: 5.3.0 dom-accessibility-api: 0.5.16 lz-string: 1.5.0 + picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@14.0.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@testing-library/react@16.3.2(@testing-library/dom@10.4.1)(@types/react-dom@19.2.4(@types/react@19.2.18))(@types/react@19.2.18)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 - '@testing-library/dom': 9.3.4 - '@types/react-dom': 18.2.13 + '@testing-library/dom': 10.4.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.18 + '@types/react-dom': 19.2.4(@types/react@19.2.18) '@tootallnate/once@2.0.0': {} @@ -5122,8 +5133,6 @@ snapshots: dependencies: '@types/node': 20.8.6 - '@types/history@4.7.11': {} - '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -5139,8 +5148,6 @@ snapshots: expect: 29.7.0 pretty-format: 29.7.0 - '@types/js-cookie@3.0.4': {} - '@types/jsdom@20.0.1': dependencies: '@types/node': 20.8.6 @@ -5155,33 +5162,16 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/prop-types@15.7.15': {} - - '@types/react-dom@18.2.13': - dependencies: - '@types/react': 18.2.28 - - '@types/react-router-dom@5.3.3': - dependencies: - '@types/history': 4.7.11 - '@types/react': 18.2.28 - '@types/react-router': 5.1.20 - - '@types/react-router@5.1.20': + '@types/react-dom@19.2.4(@types/react@19.2.18)': dependencies: - '@types/history': 4.7.11 - '@types/react': 18.2.28 + '@types/react': 19.2.18 - '@types/react@18.2.28': + '@types/react@19.2.18': dependencies: - '@types/prop-types': 15.7.15 - '@types/scheduler': 0.26.0 csstype: 3.2.3 '@types/resolve@1.20.2': {} - '@types/scheduler@0.26.0': {} - '@types/semver@7.7.1': {} '@types/stack-utils@2.0.3': {} @@ -5412,9 +5402,9 @@ snapshots: argparse@2.0.1: {} - aria-query@5.1.3: + aria-query@5.3.0: dependencies: - deep-equal: 2.2.3 + dequal: 2.0.3 array-buffer-byte-length@1.0.2: dependencies: @@ -5968,27 +5958,6 @@ snapshots: dedent@1.7.1: {} - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 - is-arguments: 1.2.0 - is-array-buffer: 3.0.5 - is-date-object: 1.1.0 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.7 - regexp.prototype.flags: 1.5.4 - side-channel: 1.1.0 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.20 - deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -6032,6 +6001,8 @@ snapshots: deprecation@2.3.1: {} + dequal@2.0.3: {} + detect-newline@3.1.0: {} diff-sequences@29.6.3: {} @@ -6160,18 +6131,6 @@ snapshots: es-errors@1.3.0: {} - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - is-arguments: 1.2.0 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.1.1 - isarray: 2.0.5 - stop-iteration-iterator: 1.1.0 - es-iterator-helpers@1.2.2: dependencies: call-bind: 1.0.8 @@ -6487,6 +6446,9 @@ snapshots: fs.realpath@1.0.0: {} + fsevents@2.3.2: + optional: true + fsevents@2.3.3: optional: true @@ -6825,11 +6787,6 @@ snapshots: ip-address@10.1.0: {} - is-arguments@1.2.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -7390,7 +7347,7 @@ snapshots: - supports-color - ts-node - js-cookie@3.0.5: {} + jose@5.10.0: {} js-tokens@4.0.0: {} @@ -7755,8 +7712,6 @@ snapshots: mkdirp@1.0.4: {} - mkdirp@3.0.1: {} - moment@2.30.1: {} ms@2.1.3: {} @@ -7897,11 +7852,6 @@ snapshots: object-inspect@1.13.4: {} - object-is@1.1.6: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - object-keys@1.1.1: {} object.assign@4.1.7: @@ -8171,6 +8121,14 @@ snapshots: dependencies: find-up: 4.1.0 + playwright-core@1.62.1: {} + + playwright@1.62.1: + dependencies: + playwright-core: 1.62.1 + optionalDependencies: + fsevents: 2.3.2 + possible-typed-array-names@1.1.0: {} prelude-ls@1.2.1: {} diff --git a/rollup.config.mjs b/rollup.config.mjs index 59eecd2..127c553 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -1,13 +1,33 @@ -import license from 'rollup-plugin-license'; +import resolve from '@rollup/plugin-node-resolve'; import terser from '@rollup/plugin-terser'; import filesize from 'rollup-plugin-filesize'; +import license from 'rollup-plugin-license'; import peerDepsExternal from 'rollup-plugin-peer-deps-external'; -import resolve from '@rollup/plugin-node-resolve'; import typescript from 'rollup-plugin-typescript2'; -import { createRequire } from 'module'; -const require = createRequire(import.meta.url); -const pkg = require('./package.json'); +const input = 'src/index.tsx'; + +// Subpath entries. `core` and `server` never import React, so a Next.js +// middleware or route handler pulling in `/server` does not drag the client +// bundle along with it. +const entries = { + index: 'src/index.tsx', + core: 'src/core/index.ts', + server: 'src/server/index.ts', + next: 'src/adapters/next.ts', + 'react-router': 'src/adapters/react-router.ts', + node: 'src/adapters/node.ts', +}; + +// Real runtime dependencies: keep them external so consumers resolve them +// through npm rather than getting a second copy inlined. +const external = ['react', 'react-dom', 'react/jsx-runtime', 'jose']; + +const globals = { + react: 'React', + 'react-dom': 'ReactDOM', + jose: 'jose', +}; const licenseBanner = license({ banner: { @@ -17,56 +37,63 @@ const licenseBanner = license({ }); export default [ + // ESM + CJS. Declarations are emitted here only, from tsconfig.build.json, + // which excludes __tests__ so test typings stay out of the tarball. { - input: 'src/index.tsx', + input: entries, output: [ { dir: './dist', format: 'esm', sourcemap: true, - preserveModules: true, - name: 'ReactStarterAuth', - globals: { - "react": "React", - "js-cookie": "Cookies", - "axios": "Axios", - "react-router-dom": "ReactRouterDOM" - }, - sourcemap: true + entryFileNames: '[name].mjs', + chunkFileNames: 'shared/[name]-[hash].mjs', + }, + { + dir: './dist', + format: 'cjs', + sourcemap: true, + exports: 'named', + entryFileNames: '[name].cjs', + chunkFileNames: 'shared/[name]-[hash].cjs', }, ], plugins: [ peerDepsExternal(), resolve(), - typescript(), + typescript({ tsconfig: 'tsconfig.build.json', clean: true }), filesize(), ], - external: ["react", "react-dom"], + external, }, + + // UMD for