diff --git a/.eslintrc.json b/.eslintrc.json index bcee5bb1bf..14fb7c67fd 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -113,12 +113,6 @@ "project": "./tsconfig.json" } }, - { - "files": ["tests/**/*.tsx"], - "env": { - "jest/globals": true - } - }, { "files": ["./*.js"], "rules": { diff --git a/.github/workflows/test-multiple-builds.yml b/.github/workflows/test-multiple-builds.yml index 3815f5e6fa..36ffcdce86 100644 --- a/.github/workflows/test-multiple-builds.yml +++ b/.github/workflows/test-multiple-builds.yml @@ -30,11 +30,13 @@ jobs: - name: Patch for DEV-ONLY if: ${{ matrix.env == 'development' }} run: | - sed -i~ "s/it[a-zA-Z]*('\[PRD-ONLY\]/it.skip('/" tests/*.tsx + sed -i~ "s/it[.a-zA-Z]*('\[DEV-ONLY\]/it('/" tests/*.tsx + sed -i~ "s/it[.a-zA-Z]*('\[PRD-ONLY\]/it.skip('/" tests/*.tsx - name: Patch for PRD-ONLY if: ${{ matrix.env == 'production' }} run: | - sed -i~ "s/it[a-zA-Z]*('\[DEV-ONLY\]/it.skip('/" tests/*.tsx + sed -i~ "s/it[.a-zA-Z]*('\[PRD-ONLY\]/it('/" tests/*.tsx + sed -i~ "s/it[.a-zA-Z]*('\[DEV-ONLY\]/it.skip('/" tests/*.tsx - name: Patch for CJS if: ${{ matrix.build == 'cjs' }} run: | @@ -50,12 +52,12 @@ jobs: if: ${{ matrix.build == 'umd' || matrix.build == 'system' }} run: | sed -i~ "s/\/src\(.*\)\.ts/\/dist\/${BUILD}\1.${NODE_ENV}.js/" package.json + sed -i~ 's/"test:ci":.*,$/"test:ci": "jest",/' package.json env: BUILD: ${{ matrix.build }} NODE_ENV: ${{ matrix.env }} - name: Test ${{ matrix.build }} ${{ matrix.env }} run: | - cat package.json yarn test:ci env: NODE_ENV: ${{ matrix.env }} diff --git a/.github/workflows/test-multiple-versions.yml b/.github/workflows/test-multiple-versions.yml index c9b2f8409e..73b1429097 100644 --- a/.github/workflows/test-multiple-versions.yml +++ b/.github/workflows/test-multiple-versions.yml @@ -50,8 +50,9 @@ jobs: if: ${{ startsWith(matrix.react, '16.') }} run: | sed -i~ '1s/^/import React from "react";/' tests/*.tsx - sed -i~ 's/automatic/classic/' babel.config.js - sed -i~ 's/automatic/classic/' .swcrc + sed -i~ 's/"jsx": "react-jsx"/"jsx": "react"/' tsconfig.json + sed -i~ 's/import\.meta\.env[?]\.MODE/"DEVELOPMENT".toLowerCase()/' src/*.ts src/*/*.ts + sed -i~ 's/"test:ci":.*,$/"test:ci": "jest",/' package.json - name: Test ${{ matrix.react }} run: | yarn add -D react@${{ matrix.react }} react-dom@${{ matrix.react }} diff --git a/.github/workflows/test-old-typescript.yml b/.github/workflows/test-old-typescript.yml index dda313f787..b0cba204fc 100644 --- a/.github/workflows/test-old-typescript.yml +++ b/.github/workflows/test-old-typescript.yml @@ -32,18 +32,14 @@ jobs: - run: yarn build - name: Patch for Old TS run: | - sed -i~ "s/\/\/ @ts-expect-error.*\[LATEST-TS-ONLY\]//" tests/*.tsx - sed -i~ "s/\"exactOptionalPropertyTypes\": true,//" tsconfig.json - sed -i~ "s/\"zustand\": \[\"\.\/src\/index\.ts\"\],/\"zustand\": [\".\/dist\/index.d.ts\"],/" tsconfig.json - sed -i~ "s/\"zustand\/\*\": \[\"\.\/src\/\*\.ts\"\]/\"zustand\/*\": [\".\/dist\/*.d.ts\"]/" tsconfig.json - sed -i~ "s/\"include\": .*/\"include\": [\"src\/types.d.ts\", \"dist\/**\/*\", \"tests\/**\/*\"],/" tsconfig.json - - name: Patch for Older TS - if: ${{ matrix.typescript == '4.2.3' || matrix.typescript == '4.1.5' }} - run: | - yarn json -I -f package.json -e "this.resolutions['@types/jest']='29.2.0';" - yarn add -D @types/jest@29.2.0 + sed -i~ 's/\/\/ @ts-expect-error.*\[LATEST-TS-ONLY\]//' tests/*.tsx + sed -i~ 's/"target":/"skipLibCheck":true,"target":/' tsconfig.json + sed -i~ 's/"exactOptionalPropertyTypes": true,//' tsconfig.json + sed -i~ 's/"zustand": \["\.\/src\/index\.ts"\],/"zustand": [".\/dist\/index.d.ts"],/' tsconfig.json + sed -i~ 's/"zustand\/\*": \["\.\/src\/\*\.ts"\]/"zustand\/*": [".\/dist\/*.d.ts"]/' tsconfig.json + sed -i~ 's/"include": .*/"include": ["src\/types.d.ts", "dist\/**\/*", "tests\/**\/*"],/' tsconfig.json - name: Test ${{ matrix.typescript }} run: | yarn add -D typescript@${{ matrix.typescript }} - rm -r node_modules/@types/jsdom node_modules/parse5 node_modules/@types/prettier + rm -r node_modules/parse5 yarn tsc --noEmit diff --git a/.swcrc b/.swcrc deleted file mode 100644 index 2c80a0a03e..0000000000 --- a/.swcrc +++ /dev/null @@ -1,19 +0,0 @@ -{ - "jsc": { - "target": "es5", - "parser": { - "syntax": "typescript", - "tsx": true - }, - "transform": { - "react": { - "runtime": "automatic", - "pragma": "React.createElement", - "pragmaFrag": "React.Fragment", - "throwIfNamespace": true, - "useBuiltins": true - } - } - }, - "sourceMaps": true -} diff --git a/package.json b/package.json index 87fe017d33..0a5c0d8da9 100644 --- a/package.json +++ b/package.json @@ -91,10 +91,10 @@ "eslint": "eslint --fix '*.{js,json}' '{src,tests}/**/*.{ts,tsx}'", "eslint:ci": "eslint '*.{js,json}' '{src,tests}/**/*.{ts,tsx}'", "pretest": "tsc --noEmit", - "test": "jest", - "test:ci": "jest", - "test:dev": "jest --watch --no-coverage", - "test:coverage:watch": "jest --watch", + "test": "yarn node --experimental-vm-modules $(yarn bin jest)", + "test:ci": "yarn node --experimental-vm-modules $(yarn bin jest)", + "test:dev": "yarn node --experimental-vm-modules $(yarn bin jest) --watch --no-coverage", + "test:coverage:watch": "yarn node --experimental-vm-modules $(yarn bin jest) --watch", "copy": "shx cp -r dist/src/* dist/esm && shx cp -r dist/src/* dist && shx rm -rf dist/src && shx rm -rf dist/{src,tests} && downlevel-dts dist dist/ts3.4 && shx cp package.json readme.md LICENSE dist && json -I -f dist/package.json -e \"this.private=false; this.devDependencies=undefined; this.optionalDependencies=undefined; this.scripts=undefined; this.prettier=undefined; this.jest=undefined;\"", "patch-esm-ts": "node -e \"require('shelljs').find('dist/esm/**/*.d.ts').forEach(f=>{var f2=f.replace(/\\.ts$/,'.mts');require('fs').copyFileSync(f,f2);require('shelljs').sed('-i',/ from '(\\.[^']+)';$/,' from \\'\\$1.mjs\\';',f2);require('shelljs').sed('-i',/^declare module '(\\.[^']+)'/,'declare module \\'\\$1.mjs\\'',f2)})\"" }, @@ -134,14 +134,19 @@ "jest": { "rootDir": ".", "testEnvironment": "jsdom", + "preset": "ts-jest/presets/default-esm", "transform": { "^.+\\.(t|j)sx?$": [ - "@swc/jest" + "ts-jest", + { + "useESM": true + } ] }, - "globals": { - "__DEV__": true - }, + "extensionsToTreatAsEsm": [ + ".ts", + ".tsx" + ], "moduleNameMapper": { "^zustand$": "/src/index.ts", "^zustand/(.*)$": "/src/$1.ts" @@ -180,10 +185,7 @@ "@rollup/plugin-replace": "^5.0.2", "@rollup/plugin-terser": "^0.3.0", "@rollup/plugin-typescript": "^11.0.0", - "@swc/core": "^1.3.26", - "@swc/jest": "^0.2.24", "@testing-library/react": "^13.4.0", - "@types/jest": "^29.2.5", "@types/react": "^18.0.26", "@types/react-dom": "^18.0.10", "@types/use-sync-external-store": "^0.0.3", @@ -211,11 +213,9 @@ "rollup": "^3.10.0", "rollup-plugin-esbuild": "^5.0.0", "shx": "^0.3.4", + "ts-jest": "^29.0.5", "typescript": "^4.9.4" }, - "resolutions": { - "date-fns": "2.27.0" - }, "peerDependencies": { "immer": ">=9.0", "react": ">=16.8" diff --git a/rollup.config.js b/rollup.config.js index 8f57405448..4294252b08 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -62,12 +62,15 @@ function createESMConfig(input, output) { }), resolve({ extensions }), replace({ - __DEV__: output.endsWith('.mjs') - ? '((import.meta.env&&import.meta.env.MODE)!=="production")' - : '(process.env.NODE_ENV!=="production")', + ...(output.endsWith('.js') + ? { + 'import.meta.env?.MODE': 'process.env.NODE_ENV', + } + : {}), // a workround for #829 'use-sync-external-store/shim/with-selector': 'use-sync-external-store/shim/with-selector.js', + delimiters: ['\\b', '\\b(?!(\\.|/))'], preventAssignment: true, }), getEsbuild('node12'), @@ -95,7 +98,8 @@ function createCommonJSConfig(input, output, options) { }), resolve({ extensions }), replace({ - __DEV__: '(process.env.NODE_ENV!=="production")', + 'import.meta.env?.MODE': 'process.env.NODE_ENV', + delimiters: ['\\b', '\\b(?!(\\.|/))'], preventAssignment: true, }), babelPlugin(getBabelOptions({ ie: 11 })), @@ -131,7 +135,8 @@ function createUMDConfig(input, output, env) { }), resolve({ extensions }), replace({ - __DEV__: env !== 'production' ? 'true' : 'false', + 'import.meta.env?.MODE': JSON.stringify(env), + delimiters: ['\\b', '\\b(?!(\\.|/))'], preventAssignment: true, }), babelPlugin(getBabelOptions({ ie: 11 })), @@ -156,7 +161,8 @@ function createSystemConfig(input, output, env) { }), resolve({ extensions }), replace({ - __DEV__: env !== 'production' ? 'true' : 'false', + 'import.meta.env?.MODE': JSON.stringify(env), + delimiters: ['\\b', '\\b(?!(\\.|/))'], preventAssignment: true, }), getEsbuild('node12', env), diff --git a/src/context.ts b/src/context.ts index 24a45222c1..2805b3d7c5 100644 --- a/src/context.ts +++ b/src/context.ts @@ -25,7 +25,7 @@ type WithoutCallSignature = { [K in keyof T]: T[K] } * @deprecated Use `createStore` and `useStore` for context usage */ function createContext>() { - if (__DEV__) { + if (import.meta.env?.MODE !== 'production') { console.warn( "[DEPRECATED] `context` will be removed in a future version. Instead use `import { createStore, useStore } from 'zustand'`. See: https://github.com/pmndrs/zustand/discussions/1180." ) diff --git a/src/middleware/devtools.ts b/src/middleware/devtools.ts index c328078685..a72d5b7176 100644 --- a/src/middleware/devtools.ts +++ b/src/middleware/devtools.ts @@ -210,13 +210,14 @@ const devtoolsImpl: DevtoolsImpl = | false try { extensionConnector = - (enabled ?? __DEV__) && window.__REDUX_DEVTOOLS_EXTENSION__ + (enabled ?? import.meta.env?.MODE !== 'production') && + window.__REDUX_DEVTOOLS_EXTENSION__ } catch (e) { // ignored } if (!extensionConnector) { - if (__DEV__ && enabled) { + if (import.meta.env?.MODE !== 'production' && enabled) { console.warn( '[zustand devtools middleware] Please install/enable Redux devtools extension' ) @@ -286,7 +287,7 @@ const devtoolsImpl: DevtoolsImpl = const originalDispatch = (api as any).dispatch ;(api as any).dispatch = (...a: any[]) => { if ( - __DEV__ && + import.meta.env?.MODE !== 'production' && a[0].type === '__setState' && !didWarnAboutReservedActionType ) { diff --git a/src/middleware/persist.ts b/src/middleware/persist.ts index fc143b0ce1..3ea470e9ac 100644 --- a/src/middleware/persist.ts +++ b/src/middleware/persist.ts @@ -502,7 +502,7 @@ const persistImpl: PersistImpl = (config, baseOptions) => { 'serialize' in baseOptions || 'deserialize' in baseOptions ) { - if (__DEV__) { + if (import.meta.env?.MODE !== 'production') { console.warn( '[DEPRECATED] `getStorage`, `serialize` and `deserialize` options are deprecated. Use `storage` option instead.' ) diff --git a/src/react.ts b/src/react.ts index 130f519806..840323541f 100644 --- a/src/react.ts +++ b/src/react.ts @@ -68,7 +68,10 @@ type Create = { } const createImpl = (createState: StateCreator) => { - if (__DEV__ && typeof createState !== 'function') { + if ( + import.meta.env?.MODE !== 'production' && + typeof createState !== 'function' + ) { console.warn( "[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`." ) @@ -91,7 +94,7 @@ export const create = ((createState: StateCreator | undefined) => * @deprecated Use `import { create } from 'zustand'` */ export default ((createState: any) => { - if (__DEV__) { + if (import.meta.env?.MODE !== 'production') { console.warn( "[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`." ) diff --git a/src/shallow.ts b/src/shallow.ts index 4ec1785384..d9cd2eb712 100644 --- a/src/shallow.ts +++ b/src/shallow.ts @@ -52,7 +52,7 @@ export function shallow(objA: T, objB: T) { * @deprecated Use `import { shallow } from 'zustand/shallow'` */ export default ((objA, objB) => { - if (__DEV__) { + if (import.meta.env?.MODE !== 'production') { console.warn( "[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand/shallow'`." ) diff --git a/src/types.d.ts b/src/types.d.ts index 4781b52c00..f10fd4e38b 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -1,2 +1,5 @@ -// eslint-disable-next-line no-var -declare var __DEV__: boolean +declare interface ImportMeta { + env?: { + MODE: string + } +} diff --git a/src/vanilla.ts b/src/vanilla.ts index 3cb46610ec..63387982f4 100644 --- a/src/vanilla.ts +++ b/src/vanilla.ts @@ -89,7 +89,7 @@ const createStoreImpl: CreateStoreImpl = (createState) => { } const destroy: StoreApi['destroy'] = () => { - if (__DEV__) { + if (import.meta.env?.MODE !== 'production') { console.warn( '[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.' ) @@ -109,7 +109,7 @@ export const createStore = ((createState) => * @deprecated Use `import { createStore } from 'zustand/vanilla'` */ export default ((createState) => { - if (__DEV__) { + if (import.meta.env?.MODE !== 'production') { console.warn( "[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'." ) diff --git a/tests/basic.test.tsx b/tests/basic.test.tsx index 21c4ba92df..b479ccba0d 100644 --- a/tests/basic.test.tsx +++ b/tests/basic.test.tsx @@ -6,6 +6,7 @@ import { useLayoutEffect, useState, } from 'react' +import { afterEach, expect, it, jest } from '@jest/globals' import { act, fireEvent, render } from '@testing-library/react' import ReactDOM from 'react-dom' import { create } from 'zustand' diff --git a/tests/context.test.tsx b/tests/context.test.tsx index 39705fad6c..f1d0dc10b4 100644 --- a/tests/context.test.tsx +++ b/tests/context.test.tsx @@ -6,6 +6,7 @@ import { useEffect, useState, } from 'react' +import { afterEach, it, jest } from '@jest/globals' import { render } from '@testing-library/react' import { create } from 'zustand' import type { StoreApi } from 'zustand' diff --git a/tests/devtools.test.tsx b/tests/devtools.test.tsx index 30827d1a1c..c6f5796502 100644 --- a/tests/devtools.test.tsx +++ b/tests/devtools.test.tsx @@ -1,3 +1,11 @@ +import { + afterEach, + beforeEach, + describe, + expect, + it, + jest, +} from '@jest/globals' import { StoreApi } from 'zustand/vanilla' const getImports = async () => { @@ -20,12 +28,12 @@ type TupleOfEqualLength = number extends Arr['length'] type Connection = { subscribers: ((message: unknown) => void)[] api: { - subscribe: jest.Mock<() => void, [f: any]> - unsubscribe: jest.Mock - send: jest.Mock - init: jest.Mock - error: jest.Mock - dispatch?: jest.Mock + subscribe: jest.Mock<(f: (message: unknown) => void) => void> + unsubscribe: jest.Mock + send: jest.Mock + init: jest.Mock + error: jest.Mock + dispatch?: jest.Mock } } const namedConnections = new Map() @@ -86,7 +94,7 @@ function getKeyFromOptions(options: any): string | undefined { } const extensionConnector = { - connect: jest.fn((options) => { + connect: jest.fn((options: any) => { const key = getKeyFromOptions(options) //console.log('options', options) const areNameUndefinedMapsNeeded = @@ -96,7 +104,7 @@ const extensionConnector = { : namedConnections const subscribers: Connection['subscribers'] = [] const api = { - subscribe: jest.fn((f) => { + subscribe: jest.fn((f: (m: unknown) => void) => { subscribers.push(f) return () => {} }), @@ -138,16 +146,13 @@ it('connects to the extension by passing the options and initializes', async () describe('If there is no extension installed...', () => { let savedConsoleWarn: any - let savedDEV: boolean beforeEach(() => { savedConsoleWarn = console.warn console.warn = jest.fn() - savedDEV = __DEV__ ;(window as any).__REDUX_DEVTOOLS_EXTENSION__ = undefined }) afterEach(() => { console.warn = savedConsoleWarn - __DEV__ = savedDEV ;(window as any).__REDUX_DEVTOOLS_EXTENSION__ = extensionConnector }) @@ -166,21 +171,18 @@ describe('If there is no extension installed...', () => { it('[DEV-ONLY] warns if enabled in dev mode', async () => { const { devtools, createStore } = await getImports() - __DEV__ = true createStore(devtools(() => ({ count: 0 }), { enabled: true })) expect(console.warn).toBeCalled() }) - it('[PRD-ONLY] does not warn if not in dev env', async () => { + it.skip('[PRD-ONLY] does not warn if not in dev env', async () => { const { devtools, createStore } = await getImports() - __DEV__ = false createStore(devtools(() => ({ count: 0 }))) expect(console.warn).not.toBeCalled() }) - it('[PRD-ONLY] does not warn if not in dev env even if enabled', async () => { + it.skip('[PRD-ONLY] does not warn if not in dev env even if enabled', async () => { const { devtools, createStore } = await getImports() - __DEV__ = false createStore(devtools(() => ({ count: 0 }), { enabled: true })) expect(console.warn).not.toBeCalled() }) @@ -637,11 +639,22 @@ describe('with redux middleware', () => { payload: JSON.stringify({ type: 'DECREMENT' }), }) - expect(connection.init.mock.calls).toMatchObject([[{ count: 0 }]]) + expect(connection.init.mock.calls).toMatchObject([ + [{ count: 0 }] as unknown as Record, + ]) expect(connection.send.mock.calls).toMatchObject([ - [{ type: 'INCREMENT' }, { count: 1 }], - [{ type: 'INCREMENT' }, { count: 2 }], - [{ type: 'DECREMENT' }, { count: 1 }], + [{ type: 'INCREMENT' }, { count: 1 }] as unknown as Record< + string, + unknown + >, + [{ type: 'INCREMENT' }, { count: 2 }] as unknown as Record< + string, + unknown + >, + [{ type: 'DECREMENT' }, { count: 1 }] as unknown as Record< + string, + unknown + >, ]) expect(api.getState()).toMatchObject({ count: 1 }) }) @@ -1008,17 +1021,39 @@ describe('when redux connection was called on multiple stores with `name` provid payload: JSON.stringify({ type: 'DECREMENT' }), }) - expect(connection1.init.mock.calls).toMatchObject([[{ count: 0 }]]) - expect(connection2.init.mock.calls).toMatchObject([[{ count: 10 }]]) + expect(connection1.init.mock.calls).toMatchObject([ + [{ count: 0 }] as unknown as Record, + ]) + expect(connection2.init.mock.calls).toMatchObject([ + [{ count: 10 }] as unknown as Record, + ]) expect(connection1.send.mock.calls).toMatchObject([ - [{ type: 'INCREMENT' }, { count: 1 }], - [{ type: 'INCREMENT' }, { count: 2 }], - [{ type: 'DECREMENT' }, { count: 1 }], + [{ type: 'INCREMENT' }, { count: 1 }] as unknown as Record< + string, + unknown + >, + [{ type: 'INCREMENT' }, { count: 2 }] as unknown as Record< + string, + unknown + >, + [{ type: 'DECREMENT' }, { count: 1 }] as unknown as Record< + string, + unknown + >, ]) expect(connection2.send.mock.calls).toMatchObject([ - [{ type: 'INCREMENT' }, { count: 11 }], - [{ type: 'INCREMENT' }, { count: 12 }], - [{ type: 'DECREMENT' }, { count: 11 }], + [{ type: 'INCREMENT' }, { count: 11 }] as unknown as Record< + string, + unknown + >, + [{ type: 'INCREMENT' }, { count: 12 }] as unknown as Record< + string, + unknown + >, + [{ type: 'DECREMENT' }, { count: 11 }] as unknown as Record< + string, + unknown + > as unknown as Record, ]) expect(api1.getState()).toMatchObject({ count: 1 }) expect(api2.getState()).toMatchObject({ count: 11 }) diff --git a/tests/middlewareTypes.test.tsx b/tests/middlewareTypes.test.tsx index 200132d31e..63574259ad 100644 --- a/tests/middlewareTypes.test.tsx +++ b/tests/middlewareTypes.test.tsx @@ -1,3 +1,4 @@ +import { describe, it } from '@jest/globals' import { create } from 'zustand' import type { StoreApi } from 'zustand' import { @@ -35,14 +36,6 @@ describe('counter state spec (no middleware)', () => { }) describe('counter state spec (single middleware)', () => { - let savedDEV: boolean - beforeEach(() => { - savedDEV = __DEV__ - }) - afterEach(() => { - __DEV__ = savedDEV - }) - it('immer', () => { const useBoundStore = create()( immer((set, get) => ({ @@ -98,7 +91,6 @@ describe('counter state spec (single middleware)', () => { }) it('devtools', () => { - __DEV__ = false const useBoundStore = create()( devtools( (set, get) => ({ @@ -252,16 +244,7 @@ describe('counter state spec (single middleware)', () => { }) describe('counter state spec (double middleware)', () => { - let savedDEV: boolean - beforeEach(() => { - savedDEV = __DEV__ - }) - afterEach(() => { - __DEV__ = savedDEV - }) - it('immer & devtools', () => { - __DEV__ = false const useBoundStore = create()( immer( devtools( @@ -294,7 +277,6 @@ describe('counter state spec (double middleware)', () => { }) it('devtools & redux', () => { - __DEV__ = false const useBoundStore = create( devtools( redux( @@ -323,7 +305,6 @@ describe('counter state spec (double middleware)', () => { }) it('devtools & combine', () => { - __DEV__ = false const useBoundStore = create( devtools( combine({ count: 1 }, (set, get) => ({ @@ -370,7 +351,6 @@ describe('counter state spec (double middleware)', () => { }) it('devtools & subscribeWithSelector', () => { - __DEV__ = false const useBoundStore = create()( devtools( subscribeWithSelector((set, get) => ({ @@ -398,7 +378,6 @@ describe('counter state spec (double middleware)', () => { }) it('devtools & persist', () => { - __DEV__ = false const useBoundStore = create()( devtools( persist( @@ -427,16 +406,7 @@ describe('counter state spec (double middleware)', () => { }) describe('counter state spec (triple middleware)', () => { - let savedDEV: boolean - beforeEach(() => { - savedDEV = __DEV__ - }) - afterEach(() => { - __DEV__ = savedDEV - }) - it('devtools & persist & immer', () => { - __DEV__ = false const useBoundStore = create()( devtools( persist( @@ -467,7 +437,6 @@ describe('counter state spec (triple middleware)', () => { }) it('devtools & subscribeWithSelector & combine', () => { - __DEV__ = false const useBoundStore = create( devtools( subscribeWithSelector( @@ -496,7 +465,6 @@ describe('counter state spec (triple middleware)', () => { }) it('devtools & subscribeWithSelector & persist', () => { - __DEV__ = false const useBoundStore = create()( devtools( subscribeWithSelector( @@ -531,16 +499,7 @@ describe('counter state spec (triple middleware)', () => { }) describe('counter state spec (quadruple middleware)', () => { - let savedDEV: boolean - beforeEach(() => { - savedDEV = __DEV__ - }) - afterEach(() => { - __DEV__ = savedDEV - }) - it('devtools & subscribeWithSelector & persist & immer (#616)', () => { - __DEV__ = false const useBoundStore = create()( devtools( subscribeWithSelector( diff --git a/tests/persistAsync.test.tsx b/tests/persistAsync.test.tsx index a6ead447ec..4463bfd480 100644 --- a/tests/persistAsync.test.tsx +++ b/tests/persistAsync.test.tsx @@ -1,4 +1,5 @@ import { StrictMode, useEffect } from 'react' +import { afterEach, describe, expect, it, jest } from '@jest/globals' import { act, render, waitFor } from '@testing-library/react' import { create } from 'zustand' import { createJSONStorage, persist } from 'zustand/middleware' @@ -190,7 +191,7 @@ describe('persist middleware with async configuration', () => { }) it('can migrate persisted state', async () => { - const setItemSpy = jest.fn() + const setItemSpy = jest.fn<() => void>() const onRehydrateStorageSpy = jest.fn() const migrateSpy = jest.fn(() => ({ count: 99 })) diff --git a/tests/persistSync.test.tsx b/tests/persistSync.test.tsx index b2e1df43e4..1258d67eb3 100644 --- a/tests/persistSync.test.tsx +++ b/tests/persistSync.test.tsx @@ -1,3 +1,4 @@ +import { afterEach, describe, expect, it, jest } from '@jest/globals' import { create } from 'zustand' import { createJSONStorage, persist } from 'zustand/middleware' @@ -130,7 +131,7 @@ describe('persist middleware with sync configuration', () => { }) it('can migrate persisted state', () => { - const setItemSpy = jest.fn() + const setItemSpy = jest.fn<() => void>() const onRehydrateStorageSpy = jest.fn() const migrateSpy = jest.fn(() => ({ count: 99 })) @@ -319,7 +320,7 @@ describe('persist middleware with sync configuration', () => { }) it('can filter the persisted value', () => { - const setItemSpy = jest.fn() + const setItemSpy = jest.fn<() => void>() const storage = { getItem: () => '', @@ -386,7 +387,7 @@ describe('persist middleware with sync configuration', () => { it('can access the options through the api', () => { const storage = { getItem: () => null, - setItem: jest.fn(), + setItem: jest.fn<() => void>(), removeItem: () => {}, } @@ -401,7 +402,7 @@ describe('persist middleware with sync configuration', () => { }) it('can change the options through the api', () => { - const setItemSpy = jest.fn() + const setItemSpy = jest.fn<() => void>() const storage = { getItem: () => null, @@ -438,7 +439,7 @@ describe('persist middleware with sync configuration', () => { }) it('can clear the storage through the api', () => { - const removeItemSpy = jest.fn() + const removeItemSpy = jest.fn<() => void>() const storage = { getItem: () => null, diff --git a/tests/shallow.test.tsx b/tests/shallow.test.tsx index 6f45206ad3..c244f522c8 100644 --- a/tests/shallow.test.tsx +++ b/tests/shallow.test.tsx @@ -1,3 +1,4 @@ +import { describe, expect, it } from '@jest/globals' import { create } from 'zustand' import { shallow } from 'zustand/shallow' diff --git a/tests/subscribe.test.tsx b/tests/subscribe.test.tsx index fa5a5dbaa9..a61a05e904 100644 --- a/tests/subscribe.test.tsx +++ b/tests/subscribe.test.tsx @@ -1,3 +1,4 @@ +import { describe, expect, it, jest } from '@jest/globals' import { create } from 'zustand' import { subscribeWithSelector } from 'zustand/middleware' diff --git a/tests/types.test.tsx b/tests/types.test.tsx index a24317c077..8e03d8c7cd 100644 --- a/tests/types.test.tsx +++ b/tests/types.test.tsx @@ -1,3 +1,4 @@ +import { expect, it } from '@jest/globals' import { create } from 'zustand' import type { StateCreator, diff --git a/yarn.lock b/yarn.lock index 4318947731..9799d1dc79 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1182,13 +1182,6 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/create-cache-key-function@^27.4.2": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" - integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== - dependencies: - "@jest/types" "^27.5.1" - "@jest/environment@^29.3.1": version "29.3.1" resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" @@ -1273,6 +1266,13 @@ dependencies: "@sinclair/typebox" "^0.24.1" +"@jest/schemas@^29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.0.tgz#0d6ad358f295cc1deca0b643e6b4c86ebd539f17" + integrity sha512-0E01f/gOZeNTG76i5eWWSupvSHaIINrTie7vCyjiYFKgzNdyEGd12BUv4oNBFHOqlHDbtoJi3HrQ38KCC90NsQ== + dependencies: + "@sinclair/typebox" "^0.25.16" + "@jest/source-map@^29.2.0": version "29.2.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" @@ -1323,23 +1323,24 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== dependencies: + "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" - "@types/yargs" "^16.0.0" + "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== +"@jest/types@^29.4.1": + version "29.4.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.4.1.tgz#f9f83d0916f50696661da72766132729dcb82ecb" + integrity sha512-zbrAXDUOnpJ+FMST2rV7QZOgec8rskg2zv8g2ajeqitp4tvZiyqTCYXANrKsM+ryj5o+LI+ZN2EgU9drrkiwSA== dependencies: - "@jest/schemas" "^29.0.0" + "@jest/schemas" "^29.4.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" @@ -1489,6 +1490,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.51.tgz#645f33fe4e02defe26f2f5c0410e1c094eac7f5f" integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== +"@sinclair/typebox@^0.25.16": + version "0.25.21" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.21.tgz#763b05a4b472c93a8db29b2c3e359d55b29ce272" + integrity sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g== + "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -1503,80 +1509,6 @@ dependencies: "@sinonjs/commons" "^1.7.0" -"@swc/core-darwin-arm64@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.26.tgz#43355315f0668a6a5366208f09678349bc0f44ee" - integrity sha512-FWWflBfKRYrUJtko2xiedC5XCa31O75IZZqnTWuLpe9g3C5tnUuF3M8LSXZS/dn6wprome1MhtG9GMPkSYkhkg== - -"@swc/core-darwin-x64@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.26.tgz#462fc2e1377437b7c7bbdf5988f51adfeea3efa9" - integrity sha512-0uQeebAtsewqJ2b35aPZstGrylwd6oJjUyAJOfVJNbremFSJ5JzytB3NoDCIw7CT5UQrSRpvD3mU95gfdQjDGA== - -"@swc/core-linux-arm-gnueabihf@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.26.tgz#fecd9c2e7d9b69c849907a83a5101a98c047d986" - integrity sha512-06T+LbVFlyciQtwrUB5/a16A1ju1jFoYvd/hq9TWhf7GrtL43U7oJIgqMOPHx2j0+Ps2R3S6R/UUN5YXu618zA== - -"@swc/core-linux-arm64-gnu@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.26.tgz#82a8462212263f4e4f6691473d4c2839b73c2084" - integrity sha512-2NT/0xALPfK+U01qIlHxjkGdIj6F0txhu1U2v6B0YP2+k0whL2gCgYeg9QUvkYEXSD5r1Yx+vcb2R/vaSCSClg== - -"@swc/core-linux-arm64-musl@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.26.tgz#050b7c1aa81d6f34769eb556c3a94c61a9b69aaa" - integrity sha512-64KrTay9hC0mTvZ1AmEFmNEwV5QDjw9U7PJU5riotSc28I+Q/ZoM0qcSFW9JRRa6F2Tr+IfMtyv8+eB2//BQ5g== - -"@swc/core-linux-x64-gnu@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.26.tgz#e306778c2c1838350f588c8ae800e74434dc2b9a" - integrity sha512-Te8G13l3dcRM1Mf3J4JzGUngzNXLKnMYlUmBOYN/ORsx7e+VNelR3zsTLHC0+0jGqELDgqvMyzDfk+dux/C/bQ== - -"@swc/core-linux-x64-musl@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.26.tgz#531d9ec7c37f56df5c6cc121db5dd6faff5e2c38" - integrity sha512-nqQWuSM6OTKepUiQ9+rXgERq/JiO72RBOpXKO2afYppsL96sngjIRewV74v5f6IAfyzw+k+AhC5pgRA4Xu/Jkg== - -"@swc/core-win32-arm64-msvc@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.26.tgz#9c7f245903694484bd00c4da5142f24070094d0f" - integrity sha512-xx34mx+9IBV1sun7sxoNFiqNom9wiOuvsQFJUyQptCnZHgYwOr9OI204LBF95dCcBCZsTm2hT1wBnySJOeimYw== - -"@swc/core-win32-ia32-msvc@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.26.tgz#56d83cc216218d78cc578f01499777cdfc0a4eeb" - integrity sha512-48LZ/HKNuU9zl8c7qG6IQKb5rBCwmJgysGOmEGzTRBYxAf/x6Scmt0aqxCoV4J02HOs2WduCBDnhUKsSQ2kcXQ== - -"@swc/core-win32-x64-msvc@1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.26.tgz#bb65bc0fff712c8ca3702d9c0adc59894ca54bae" - integrity sha512-UPe7S+MezD/S6cKBIc50TduGzmw6PBz1Ms5p+5wDLOKYNS/LSEM4iRmLwvePzP5X8mOyesXrsbwxLy8KHP65Yw== - -"@swc/core@^1.3.26": - version "1.3.26" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.3.26.tgz#6f7fe6ad54eac7ecffbdfa75d5c4300e2f96b8f6" - integrity sha512-U7vEsaLn3IGg0XCRLJX/GTkK9WIfFHUX5USdrp1L2QD29sWPe25HqNndXmUR9KytzKmpDMNoUuHyiuhpVrnNeQ== - optionalDependencies: - "@swc/core-darwin-arm64" "1.3.26" - "@swc/core-darwin-x64" "1.3.26" - "@swc/core-linux-arm-gnueabihf" "1.3.26" - "@swc/core-linux-arm64-gnu" "1.3.26" - "@swc/core-linux-arm64-musl" "1.3.26" - "@swc/core-linux-x64-gnu" "1.3.26" - "@swc/core-linux-x64-musl" "1.3.26" - "@swc/core-win32-arm64-msvc" "1.3.26" - "@swc/core-win32-ia32-msvc" "1.3.26" - "@swc/core-win32-x64-msvc" "1.3.26" - -"@swc/jest@^0.2.24": - version "0.2.24" - resolved "https://registry.yarnpkg.com/@swc/jest/-/jest-0.2.24.tgz#35d9377ede049613cd5fdd6c24af2b8dcf622875" - integrity sha512-fwgxQbM1wXzyKzl1+IW0aGrRvAA8k0Y3NxFhKigbPjOJ4mCKnWEcNX9HQS3gshflcxq8YKhadabGUVfdwjCr6Q== - dependencies: - "@jest/create-cache-key-function" "^27.4.2" - jsonc-parser "^3.2.0" - "@testing-library/dom@^8.5.0": version "8.19.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-8.19.1.tgz#0e2dafd281dedb930bb235eac1045470b4129d0e" @@ -1674,14 +1606,6 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^29.2.5": - version "29.2.5" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.2.5.tgz#c27f41a9d6253f288d1910d3c5f09484a56b73c0" - integrity sha512-H2cSxkKgVmqNHXP7TC2L/WUorrZu8ZigyRywfVzv6EyBlxj39n4C00hjXYQWsbwqgElaj/CiAeSRmk5GoaKTgw== - dependencies: - expect "^29.0.0" - pretty-format "^29.0.0" - "@types/jsdom@^20.0.0": version "20.0.1" resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-20.0.1.tgz#07c14bc19bd2f918c1929541cdaacae894744808" @@ -1767,13 +1691,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== -"@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.19" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.19.tgz#8dbecdc9ab48bee0cb74f6e3327de3fa0d0c98ae" @@ -2138,6 +2055,13 @@ browserslist@^4.21.3, browserslist@^4.21.4: node-releases "^2.0.6" update-browserslist-db "^1.0.9" +bs-logger@0.x: + version "0.2.6" + resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" + integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== + dependencies: + fast-json-stable-stringify "2.x" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2347,10 +2271,10 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -date-fns@2.27.0, date-fns@^2.29.1: - version "2.27.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.27.0.tgz#e1ff3c3ddbbab8a2eaadbb6106be2929a5a2d92b" - integrity sha512-sj+J0Mo2p2X1e306MHq282WS4/A8Pz/95GIFcsPNMPMZVI3EUrAdSv90al1k+p74WGLCruMXk23bfEDZa71X9Q== +date-fns@^2.29.1: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" @@ -2878,7 +2802,7 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== -expect@^29.0.0, expect@^29.3.1: +expect@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== @@ -2910,7 +2834,7 @@ fast-glob@^3.2.9: merge2 "^1.3.0" micromatch "^4.0.4" -fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: +fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.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== @@ -3845,6 +3769,18 @@ jest-snapshot@^29.3.1: pretty-format "^29.3.1" semver "^7.3.5" +jest-util@^29.0.0: + version "29.4.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.4.1.tgz#2eeed98ff4563b441b5a656ed1a786e3abc3e4c4" + integrity sha512-bQy9FPGxVutgpN4VRc0hk6w7Hx/m6L53QxpDreTZgJd9gfx/AV2MjyPde9tGyZRINAUrSv57p2inGBu2dRLmkQ== + dependencies: + "@jest/types" "^29.4.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-util@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" @@ -3997,7 +3933,7 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" -json5@^2.2.2: +json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -4070,6 +4006,11 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.memoize@4.x: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + lodash.merge@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" @@ -4120,6 +4061,11 @@ make-dir@^3.0.0: dependencies: semver "^6.0.0" +make-error@1.x: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -4462,7 +4408,7 @@ pretty-format@^27.0.2: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^29.0.0, pretty-format@^29.3.1: +pretty-format@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== @@ -4748,18 +4694,18 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: +semver@7.x, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + serialize-javascript@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" @@ -5050,6 +4996,20 @@ tree-kill@^1.2.2: resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== +ts-jest@^29.0.5: + version "29.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.0.5.tgz#c5557dcec8fe434fcb8b70c3e21c6b143bfce066" + integrity sha512-PL3UciSgIpQ7f6XjVOmbi96vmDHUqAyqDr8YxzopDqX3kfgYtX1cuNeBjP+L9sFXi6nzsGGA6R3fP3DDDJyrxA== + dependencies: + bs-logger "0.x" + fast-json-stable-stringify "2.x" + jest-util "^29.0.0" + json5 "^2.2.3" + lodash.memoize "4.x" + make-error "1.x" + semver "7.x" + yargs-parser "^21.0.1" + tsconfig-paths@^3.14.1: version "3.14.1" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" @@ -5336,7 +5296,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yargs-parser@^21.1.1: +yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==