From ec79b386e3ae0b324d5ffcfbf04afea56049382b Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Tue, 7 Mar 2023 11:54:35 -0700 Subject: [PATCH 1/7] style(redux): added a comment to index.ts --- packages/redux/src/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/redux/src/index.ts b/packages/redux/src/index.ts index d598cbf..db92813 100644 --- a/packages/redux/src/index.ts +++ b/packages/redux/src/index.ts @@ -1,2 +1,3 @@ +// redux/src/index.ts export * from './slice'; export * from './store'; From 16226fa06e5aa8744d50f03b096e716034b69b05 Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Fri, 10 Mar 2023 21:08:10 -0700 Subject: [PATCH 2/7] chore(apps): removed unnecessary apps --- apps/dummy-testing-library/.babelrc | 11 - apps/dummy-testing-library/.browserslistrc | 16 -- apps/dummy-testing-library/.eslintrc.json | 18 -- apps/dummy-testing-library/project.json | 76 ------- .../src/app/App.module.css | 18 -- apps/dummy-testing-library/src/app/App.tsx | 138 ------------- .../src/app/components/graphRender.tsx | 192 ------------------ .../src/app/utils/translate.ts | 3 - .../dummy-testing-library/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 6 - apps/dummy-testing-library/src/favicon.ico | Bin 15086 -> 0 bytes apps/dummy-testing-library/src/index.html | 14 -- apps/dummy-testing-library/src/main.tsx | 13 -- apps/dummy-testing-library/src/polyfills.ts | 7 - apps/dummy-testing-library/src/styles.css | 12 -- apps/dummy-testing-library/tsconfig.app.json | 23 --- apps/dummy-testing-library/tsconfig.json | 22 -- apps/react-trrack-example/.babelrc | 11 - apps/react-trrack-example/.browserslistrc | 16 -- apps/react-trrack-example/.eslintrc.json | 18 -- apps/react-trrack-example/jest.config.ts | 14 -- apps/react-trrack-example/project.json | 85 -------- apps/react-trrack-example/src/app/App.tsx | 89 -------- .../src/app/components/Navbar.tsx | 78 ------- .../src/app/store/trrack.ts | 116 ----------- .../src/app/store/types.ts | 7 - apps/react-trrack-example/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 6 - apps/react-trrack-example/src/favicon.ico | Bin 15086 -> 0 bytes apps/react-trrack-example/src/index.html | 14 -- apps/react-trrack-example/src/main.tsx | 13 -- apps/react-trrack-example/src/polyfills.ts | 7 - apps/react-trrack-example/src/styles.css | 1 - apps/react-trrack-example/tsconfig.app.json | 23 --- apps/react-trrack-example/tsconfig.json | 25 --- apps/react-trrack-example/tsconfig.spec.json | 24 --- apps/rtk-trrack-example/.babelrc | 11 - apps/rtk-trrack-example/.browserslistrc | 16 -- apps/rtk-trrack-example/.eslintrc.json | 18 -- apps/rtk-trrack-example/jest.config.ts | 14 -- apps/rtk-trrack-example/project.json | 85 -------- apps/rtk-trrack-example/src/app/App.tsx | 103 ---------- .../src/app/components/Navbar.tsx | 97 --------- .../src/app/features/counter/counterSlice.ts | 30 --- .../src/app/features/counter/types.ts | 5 - .../src/app/features/posts/postSlice.ts | 53 ----- .../src/app/features/todo/taskSlice.ts | 51 ----- .../src/app/features/todo/types.ts | 5 - .../rtk-trrack-example/src/app/store/store.ts | 17 -- apps/rtk-trrack-example/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 6 - apps/rtk-trrack-example/src/favicon.ico | Bin 15086 -> 0 bytes apps/rtk-trrack-example/src/index.html | 14 -- apps/rtk-trrack-example/src/main.tsx | 24 --- apps/rtk-trrack-example/src/polyfills.ts | 7 - apps/rtk-trrack-example/src/styles.css | 1 - apps/rtk-trrack-example/tsconfig.app.json | 23 --- apps/rtk-trrack-example/tsconfig.json | 25 --- apps/rtk-trrack-example/tsconfig.spec.json | 24 --- 62 files changed, 1754 deletions(-) delete mode 100644 apps/dummy-testing-library/.babelrc delete mode 100644 apps/dummy-testing-library/.browserslistrc delete mode 100644 apps/dummy-testing-library/.eslintrc.json delete mode 100644 apps/dummy-testing-library/project.json delete mode 100644 apps/dummy-testing-library/src/app/App.module.css delete mode 100644 apps/dummy-testing-library/src/app/App.tsx delete mode 100644 apps/dummy-testing-library/src/app/components/graphRender.tsx delete mode 100644 apps/dummy-testing-library/src/app/utils/translate.ts delete mode 100644 apps/dummy-testing-library/src/assets/.gitkeep delete mode 100644 apps/dummy-testing-library/src/environments/environment.prod.ts delete mode 100644 apps/dummy-testing-library/src/environments/environment.ts delete mode 100644 apps/dummy-testing-library/src/favicon.ico delete mode 100644 apps/dummy-testing-library/src/index.html delete mode 100644 apps/dummy-testing-library/src/main.tsx delete mode 100644 apps/dummy-testing-library/src/polyfills.ts delete mode 100644 apps/dummy-testing-library/src/styles.css delete mode 100644 apps/dummy-testing-library/tsconfig.app.json delete mode 100644 apps/dummy-testing-library/tsconfig.json delete mode 100644 apps/react-trrack-example/.babelrc delete mode 100644 apps/react-trrack-example/.browserslistrc delete mode 100644 apps/react-trrack-example/.eslintrc.json delete mode 100644 apps/react-trrack-example/jest.config.ts delete mode 100644 apps/react-trrack-example/project.json delete mode 100644 apps/react-trrack-example/src/app/App.tsx delete mode 100644 apps/react-trrack-example/src/app/components/Navbar.tsx delete mode 100644 apps/react-trrack-example/src/app/store/trrack.ts delete mode 100644 apps/react-trrack-example/src/app/store/types.ts delete mode 100644 apps/react-trrack-example/src/assets/.gitkeep delete mode 100644 apps/react-trrack-example/src/environments/environment.prod.ts delete mode 100644 apps/react-trrack-example/src/environments/environment.ts delete mode 100644 apps/react-trrack-example/src/favicon.ico delete mode 100644 apps/react-trrack-example/src/index.html delete mode 100644 apps/react-trrack-example/src/main.tsx delete mode 100644 apps/react-trrack-example/src/polyfills.ts delete mode 100644 apps/react-trrack-example/src/styles.css delete mode 100644 apps/react-trrack-example/tsconfig.app.json delete mode 100644 apps/react-trrack-example/tsconfig.json delete mode 100644 apps/react-trrack-example/tsconfig.spec.json delete mode 100644 apps/rtk-trrack-example/.babelrc delete mode 100644 apps/rtk-trrack-example/.browserslistrc delete mode 100644 apps/rtk-trrack-example/.eslintrc.json delete mode 100644 apps/rtk-trrack-example/jest.config.ts delete mode 100644 apps/rtk-trrack-example/project.json delete mode 100644 apps/rtk-trrack-example/src/app/App.tsx delete mode 100644 apps/rtk-trrack-example/src/app/components/Navbar.tsx delete mode 100644 apps/rtk-trrack-example/src/app/features/counter/counterSlice.ts delete mode 100644 apps/rtk-trrack-example/src/app/features/counter/types.ts delete mode 100644 apps/rtk-trrack-example/src/app/features/posts/postSlice.ts delete mode 100644 apps/rtk-trrack-example/src/app/features/todo/taskSlice.ts delete mode 100644 apps/rtk-trrack-example/src/app/features/todo/types.ts delete mode 100644 apps/rtk-trrack-example/src/app/store/store.ts delete mode 100644 apps/rtk-trrack-example/src/assets/.gitkeep delete mode 100644 apps/rtk-trrack-example/src/environments/environment.prod.ts delete mode 100644 apps/rtk-trrack-example/src/environments/environment.ts delete mode 100644 apps/rtk-trrack-example/src/favicon.ico delete mode 100644 apps/rtk-trrack-example/src/index.html delete mode 100644 apps/rtk-trrack-example/src/main.tsx delete mode 100644 apps/rtk-trrack-example/src/polyfills.ts delete mode 100644 apps/rtk-trrack-example/src/styles.css delete mode 100644 apps/rtk-trrack-example/tsconfig.app.json delete mode 100644 apps/rtk-trrack-example/tsconfig.json delete mode 100644 apps/rtk-trrack-example/tsconfig.spec.json diff --git a/apps/dummy-testing-library/.babelrc b/apps/dummy-testing-library/.babelrc deleted file mode 100644 index 61641ec..0000000 --- a/apps/dummy-testing-library/.babelrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "presets": [ - [ - "@nrwl/react/babel", - { - "runtime": "automatic" - } - ] - ], - "plugins": [] -} diff --git a/apps/dummy-testing-library/.browserslistrc b/apps/dummy-testing-library/.browserslistrc deleted file mode 100644 index f1d12df..0000000 --- a/apps/dummy-testing-library/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by: -# 1. autoprefixer to adjust CSS to support the below specified browsers -# 2. babel preset-env to adjust included polyfills -# -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries -# -# If you need to support different browsers in production, you may tweak the list below. - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major version -last 2 iOS major versions -Firefox ESR -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/apps/dummy-testing-library/.eslintrc.json b/apps/dummy-testing-library/.eslintrc.json deleted file mode 100644 index 734ddac..0000000 --- a/apps/dummy-testing-library/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - } - ] -} diff --git a/apps/dummy-testing-library/project.json b/apps/dummy-testing-library/project.json deleted file mode 100644 index 1f0003b..0000000 --- a/apps/dummy-testing-library/project.json +++ /dev/null @@ -1,76 +0,0 @@ -{ - "name": "dummy-testing-library", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/dummy-testing-library/src", - "projectType": "application", - "targets": { - "build": { - "executor": "@nrwl/webpack:webpack", - "outputs": ["{options.outputPath}"], - "defaultConfiguration": "production", - "options": { - "compiler": "swc", - "outputPath": "dist/apps/dummy-testing-library", - "index": "apps/dummy-testing-library/src/index.html", - "baseHref": "/", - "main": "apps/dummy-testing-library/src/main.tsx", - "polyfills": "apps/dummy-testing-library/src/polyfills.ts", - "tsConfig": "apps/dummy-testing-library/tsconfig.app.json", - "assets": [ - "apps/dummy-testing-library/src/favicon.ico", - "apps/dummy-testing-library/src/assets" - ], - "styles": ["apps/dummy-testing-library/src/styles.css"], - "scripts": [], - "webpackConfig": "@nrwl/react/plugins/webpack" - }, - "configurations": { - "development": { - "extractLicenses": false, - "optimization": false, - "sourceMap": true, - "vendorChunk": true - }, - "production": { - "fileReplacements": [ - { - "replace": "apps/dummy-testing-library/src/environments/environment.ts", - "with": "apps/dummy-testing-library/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false - } - } - }, - "serve": { - "executor": "@nrwl/webpack:dev-server", - "defaultConfiguration": "development", - "options": { - "buildTarget": "dummy-testing-library:build", - "hmr": true - }, - "configurations": { - "development": { - "buildTarget": "dummy-testing-library:build:development" - }, - "production": { - "buildTarget": "dummy-testing-library:build:production", - "hmr": false - } - } - }, - "lint": { - "executor": "@nrwl/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/dummy-testing-library/**/*.{ts,tsx,js,jsx}"] - } - } - }, - "tags": [] -} diff --git a/apps/dummy-testing-library/src/app/App.module.css b/apps/dummy-testing-library/src/app/App.module.css deleted file mode 100644 index b219fa2..0000000 --- a/apps/dummy-testing-library/src/app/App.module.css +++ /dev/null @@ -1,18 +0,0 @@ -/* Your styles goes here. */ -.container { - margin: 1em; - flex: 1; - background-color: hsl(57, 1%, 98%); - display: flex; - flex-direction: column; - overflow: auto; -} - -.container > svg { - border: 1px solid hsla(360, 0%, 50%, 0.2); -} - -svg circle { - stroke: white; - stroke-width: 2px; -} diff --git a/apps/dummy-testing-library/src/app/App.tsx b/apps/dummy-testing-library/src/app/App.tsx deleted file mode 100644 index 032d856..0000000 --- a/apps/dummy-testing-library/src/app/App.tsx +++ /dev/null @@ -1,138 +0,0 @@ -import { Button } from '@mantine/core'; -import { useElementSize } from '@mantine/hooks'; -import { PayloadAction } from '@reduxjs/toolkit'; -import { IProvenanceGraph, ProvenanceGraph, Trrack } from '@trrack/core'; -import test from 'node:test'; -import { useCallback, useEffect, useMemo, useState } from 'react'; - -import styles from './App.module.css'; -import { GraphRenderer } from './components/graphRender'; -import translate from './utils/translate'; - -function useGraph(state: T) { - const { reducer, actions } = Trrack.createState({ - initialState: 'Hello, World!', - name: 'Test', - reducers: { - change(test, action: PayloadAction) { - return action.payload; - }, - }, - }); - - const t = Trrack.init({ - reducer: { - test: reducer, - }, - }); - t.apply('A', actions.change('Bye')); - t.apply('2', actions.change('Bye eqr')); - t.apply('3', actions.change('Bye asd')); - t.apply('4', actions.change('Bye 1')); - - const [provenance, setProvenance] = useState | null>( - null - ); - - useEffect(() => { - if (provenance) return; - - const prov = ProvenanceGraph.create(state); - - prov.addAction('Hello', { - do: { - name: 'test', - args: [1, 2], - }, - undo: { - name: 'test', - args: [1, 2], - }, - }); - - setProvenance(prov); - }, [provenance, state]); - - const backend = useMemo(() => { - return provenance?.backend; - }, [provenance?.backend]); - - return { graph: provenance, backend }; -} - -export function App() { - const { ref, width, height } = useElementSize(); - const { graph, backend } = useGraph({ helloTo: 'World' }); - const [a, setA] = useState(Math.random()); - - const key = useCallback(() => { - if (!a) return ''; - return graph?.current.id || 'None'; - }, [graph, a]); - - return ( -
-
- - - -
- {backend && ( - - - - - - )} -
- ); -} - -export default App; diff --git a/apps/dummy-testing-library/src/app/components/graphRender.tsx b/apps/dummy-testing-library/src/app/components/graphRender.tsx deleted file mode 100644 index 038f2d5..0000000 --- a/apps/dummy-testing-library/src/app/components/graphRender.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import { Graph, IActionNode, IProvenanceNode, IStateNode } from '@trrack/core'; -import { useMemo } from 'react'; - -import translate from '../utils/translate'; - -const SPACING = 150; -const YSPACING = SPACING * 0.5; -const NODE_SIZE = 6; - -function useStateNodes( - graph: Graph -): Array<{ node: IStateNode; x: number; y: number }> { - return graph - .nodesBy>( - (node) => (node as IProvenanceNode).type === 'State' - ) - .sort((a, b) => a.createdOn.getTime() - b.createdOn.getTime()) - .map((node, idx) => ({ node, x: SPACING * idx, y: 0 })); -} - -function useActionNodes(graph: Graph) { - const allActionNodes = graph - .nodesBy>( - (node) => (node as IProvenanceNode).type === 'Action' - ) - .sort((a, b) => a.createdOn.getTime() - b.createdOn.getTime()); - - const actionNodes: Array<{ - node: IActionNode; - x: number; - y: number; - }> = []; - const inverseActionNodes: Array<{ - node: IActionNode; - x: number; - y: number; - }> = []; - - allActionNodes - .filter((node) => !node.isInverse) - .forEach((node, idx) => { - actionNodes.push({ - node, - x: SPACING / 2 + SPACING * idx, - y: YSPACING, - }); - - if (node.isInvertible) { - const inverse = node.inverse; - if (inverse) { - inverseActionNodes.push({ - node: inverse, - x: SPACING / 2 + SPACING * idx, - y: -YSPACING, - }); - } - } - }); - - return { - actionNodes, - inverseActionNodes, - }; -} - -export const GraphRenderer = ({ graph }: { graph: Graph }) => { - const stateNodes = useStateNodes(graph); - const { actionNodes, inverseActionNodes } = useActionNodes(graph); - - const nMap = useMemo(() => { - const nm: { - [key: string]: { node: IProvenanceNode; x: number; y: number }; - } = {}; - - stateNodes.forEach((n) => (nm[n.node.id] = n)); - actionNodes.forEach((n) => { - if (n) nm[n.node.id] = n; - }); - inverseActionNodes.forEach((n) => { - if (n) nm[n.node.id] = n; - }); - - return nm; - }, [stateNodes, actionNodes, inverseActionNodes]); - - const getX = (id: string) => { - return nMap[id].x; - }; - - const getY = (id: string) => { - return nMap[id].y; - }; - - return ( - - {Array.from(graph.edges.values()).map((edge) => ( - - {edge.type !== 'inverted_by' && edge.type !== 'inverts' ? ( - - ) : edge.type === 'inverts' ? ( - - ) : ( - - )} - - ))} - - {stateNodes.map(({ node, x, y }) => ( - - - - {node.label} - - - ))} - - {actionNodes.map(({ node, x, y }) => { - return ( - node && ( - - - - {node.label} - - - ) - ); - })} - - {inverseActionNodes.map(({ node, x, y }) => { - return ( - node && ( - - - - {node.label} - - - ) - ); - })} - - ); -}; diff --git a/apps/dummy-testing-library/src/app/utils/translate.ts b/apps/dummy-testing-library/src/app/utils/translate.ts deleted file mode 100644 index b676973..0000000 --- a/apps/dummy-testing-library/src/app/utils/translate.ts +++ /dev/null @@ -1,3 +0,0 @@ -export default function translate(x: number, y = 0) { - return `translate(${x}, ${y})`; -} diff --git a/apps/dummy-testing-library/src/assets/.gitkeep b/apps/dummy-testing-library/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/dummy-testing-library/src/environments/environment.prod.ts b/apps/dummy-testing-library/src/environments/environment.prod.ts deleted file mode 100644 index c966979..0000000 --- a/apps/dummy-testing-library/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/apps/dummy-testing-library/src/environments/environment.ts b/apps/dummy-testing-library/src/environments/environment.ts deleted file mode 100644 index 7ed8376..0000000 --- a/apps/dummy-testing-library/src/environments/environment.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// When building for production, this file is replaced with `environment.prod.ts`. - -export const environment = { - production: false, -}; diff --git a/apps/dummy-testing-library/src/favicon.ico b/apps/dummy-testing-library/src/favicon.ico deleted file mode 100644 index 317ebcb2336e0833a22dddf0ab287849f26fda57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI332;U^%p|z7g|#(P)qFEA@4f!_@qOK2 z_lJl}!lhL!VT_U|uN7%8B2iKH??xhDa;*`g{yjTFWHvXn;2s{4R7kH|pKGdy(7z!K zgftM+Ku7~24TLlh(!g)gz|foI94G^t2^IO$uvX$3(OR0<_5L2sB)lMAMy|+`xodJ{ z_Uh_1m)~h?a;2W{dmhM;u!YGo=)OdmId_B<%^V^{ovI@y`7^g1_V9G}*f# zNzAtvou}I!W1#{M^@ROc(BZ! z+F!!_aR&Px3_reO(EW+TwlW~tv*2zr?iP7(d~a~yA|@*a89IUke+c472NXM0wiX{- zl`UrZC^1XYyf%1u)-Y)jj9;MZ!SLfd2Hl?o|80Su%Z?To_=^g_Jt0oa#CT*tjx>BI z16wec&AOWNK<#i0Qd=1O$fymLRoUR*%;h@*@v7}wApDl^w*h}!sYq%kw+DKDY)@&A z@9$ULEB3qkR#85`lb8#WZw=@})#kQig9oqy^I$dj&k4jU&^2(M3q{n1AKeGUKPFbr z1^<)aH;VsG@J|B&l>UtU#Ejv3GIqERzYgL@UOAWtW<{p#zy`WyJgpCy8$c_e%wYJL zyGHRRx38)HyjU3y{-4z6)pzb>&Q1pR)B&u01F-|&Gx4EZWK$nkUkOI|(D4UHOXg_- zw{OBf!oWQUn)Pe(=f=nt=zkmdjpO^o8ZZ9o_|4tW1ni+Un9iCW47*-ut$KQOww!;u z`0q)$s6IZO!~9$e_P9X!hqLxu`fpcL|2f^I5d4*a@Dq28;@2271v_N+5HqYZ>x;&O z05*7JT)mUe&%S0@UD)@&8SmQrMtsDfZT;fkdA!r(S=}Oz>iP)w=W508=Rc#nNn7ym z1;42c|8($ALY8#a({%1#IXbWn9-Y|0eDY$_L&j{63?{?AH{);EzcqfydD$@-B`Y3<%IIj7S7rK_N}je^=dEk%JQ4c z!tBdTPE3Tse;oYF>cnrapWq*o)m47X1`~6@(!Y29#>-#8zm&LXrXa(3=7Z)ElaQqj z-#0JJy3Fi(C#Rx(`=VXtJ63E2_bZGCz+QRa{W0e2(m3sI?LOcUBx)~^YCqZ{XEPX)C>G>U4tfqeH8L(3|pQR*zbL1 zT9e~4Tb5p9_G}$y4t`i*4t_Mr9QYvL9C&Ah*}t`q*}S+VYh0M6GxTTSXI)hMpMpIq zD1ImYqJLzbj0}~EpE-aH#VCH_udYEW#`P2zYmi&xSPs_{n6tBj=MY|-XrA;SGA_>y zGtU$?HXm$gYj*!N)_nQ59%lQdXtQZS3*#PC-{iB_sm+ytD*7j`D*k(P&IH2GHT}Eh z5697eQECVIGQAUe#eU2I!yI&%0CP#>%6MWV z@zS!p@+Y1i1b^QuuEF*13CuB zu69dve5k7&Wgb+^s|UB08Dr3u`h@yM0NTj4h7MnHo-4@xmyr7(*4$rpPwsCDZ@2be zRz9V^GnV;;?^Lk%ynzq&K(Aix`mWmW`^152Hoy$CTYVehpD-S1-W^#k#{0^L`V6CN+E z!w+xte;2vu4AmVNEFUOBmrBL>6MK@!O2*N|2=d|Y;oN&A&qv=qKn73lDD zI(+oJAdgv>Yr}8(&@ZuAZE%XUXmX(U!N+Z_sjL<1vjy1R+1IeHt`79fnYdOL{$ci7 z%3f0A*;Zt@ED&Gjm|OFTYBDe%bbo*xXAQsFz+Q`fVBH!N2)kaxN8P$c>sp~QXnv>b zwq=W3&Mtmih7xkR$YA)1Yi?avHNR6C99!u6fh=cL|KQ&PwF!n@ud^n(HNIImHD!h87!i*t?G|p0o+eelJ?B@A64_9%SBhNaJ64EvKgD&%LjLCYnNfc; znj?%*p@*?dq#NqcQFmmX($wms@CSAr9#>hUR^=I+=0B)vvGX%T&#h$kmX*s=^M2E!@N9#m?LhMvz}YB+kd zG~mbP|D(;{s_#;hsKK9lbVK&Lo734x7SIFJ9V_}2$@q?zm^7?*XH94w5Qae{7zOMUF z^?%F%)c1Y)Q?Iy?I>knw*8gYW#ok|2gdS=YYZLiD=CW|Nj;n^x!=S#iJ#`~Ld79+xXpVmUK^B(xO_vO!btA9y7w3L3-0j-y4 z?M-V{%z;JI`bk7yFDcP}OcCd*{Q9S5$iGA7*E1@tfkyjAi!;wP^O71cZ^Ep)qrQ)N z#wqw0_HS;T7x3y|`P==i3hEwK%|>fZ)c&@kgKO1~5<5xBSk?iZV?KI6&i72H6S9A* z=U(*e)EqEs?Oc04)V-~K5AUmh|62H4*`UAtItO$O(q5?6jj+K^oD!04r=6#dsxp?~}{`?&sXn#q2 zGuY~7>O2=!u@@Kfu7q=W*4egu@qPMRM>(eyYyaIE<|j%d=iWNdGsx%c!902v#ngNg z@#U-O_4xN$s_9?(`{>{>7~-6FgWpBpqXb`Ydc3OFL#&I}Irse9F_8R@4zSS*Y*o*B zXL?6*Aw!AfkNCgcr#*yj&p3ZDe2y>v$>FUdKIy_2N~}6AbHc7gA3`6$g@1o|dE>vz z4pl(j9;kyMsjaw}lO?(?Xg%4k!5%^t#@5n=WVc&JRa+XT$~#@rldvN3S1rEpU$;XgxVny7mki3 z-Hh|jUCHrUXuLr!)`w>wgO0N%KTB-1di>cj(x3Bav`7v z3G7EIbU$z>`Nad7Rk_&OT-W{;qg)-GXV-aJT#(ozdmnA~Rq3GQ_3mby(>q6Ocb-RgTUhTN)))x>m&eD;$J5Bg zo&DhY36Yg=J=$Z>t}RJ>o|@hAcwWzN#r(WJ52^g$lh^!63@hh+dR$&_dEGu&^CR*< z!oFqSqO@>xZ*nC2oiOd0eS*F^IL~W-rsrO`J`ej{=ou_q^_(<$&-3f^J z&L^MSYWIe{&pYq&9eGaArA~*kA - - - - DummyTestingLibrary - - - - - - -
- - diff --git a/apps/dummy-testing-library/src/main.tsx b/apps/dummy-testing-library/src/main.tsx deleted file mode 100644 index f1dacd9..0000000 --- a/apps/dummy-testing-library/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import * as ReactDOM from 'react-dom/client'; - -import App from './app/App'; - -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); -root.render( - - - -); diff --git a/apps/dummy-testing-library/src/polyfills.ts b/apps/dummy-testing-library/src/polyfills.ts deleted file mode 100644 index 2adf3d0..0000000 --- a/apps/dummy-testing-library/src/polyfills.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Polyfill stable language features. These imports will be optimized by `@babel/preset-env`. - * - * See: https://github.com/zloirock/core-js#babel - */ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; diff --git a/apps/dummy-testing-library/src/styles.css b/apps/dummy-testing-library/src/styles.css deleted file mode 100644 index 744c738..0000000 --- a/apps/dummy-testing-library/src/styles.css +++ /dev/null @@ -1,12 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ -html, -body { - margin: 0; - padding: 0; -} - -#root { - width: 100vw; - height: 100vh; - display: flex; -} diff --git a/apps/dummy-testing-library/tsconfig.app.json b/apps/dummy-testing-library/tsconfig.app.json deleted file mode 100644 index af84f21..0000000 --- a/apps/dummy-testing-library/tsconfig.app.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "types": ["node"] - }, - "files": [ - "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", - "../../node_modules/@nrwl/react/typings/image.d.ts" - ], - "exclude": [ - "jest.config.ts", - "**/*.spec.ts", - "**/*.test.ts", - "**/*.spec.tsx", - "**/*.test.tsx", - "**/*.spec.js", - "**/*.test.js", - "**/*.spec.jsx", - "**/*.test.jsx" - ], - "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] -} diff --git a/apps/dummy-testing-library/tsconfig.json b/apps/dummy-testing-library/tsconfig.json deleted file mode 100644 index a6adc91..0000000 --- a/apps/dummy-testing-library/tsconfig.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "jsx": "react-jsx", - "allowJs": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true - }, - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.app.json" - } - ] -} diff --git a/apps/react-trrack-example/.babelrc b/apps/react-trrack-example/.babelrc deleted file mode 100644 index 61641ec..0000000 --- a/apps/react-trrack-example/.babelrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "presets": [ - [ - "@nrwl/react/babel", - { - "runtime": "automatic" - } - ] - ], - "plugins": [] -} diff --git a/apps/react-trrack-example/.browserslistrc b/apps/react-trrack-example/.browserslistrc deleted file mode 100644 index f1d12df..0000000 --- a/apps/react-trrack-example/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by: -# 1. autoprefixer to adjust CSS to support the below specified browsers -# 2. babel preset-env to adjust included polyfills -# -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries -# -# If you need to support different browsers in production, you may tweak the list below. - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major version -last 2 iOS major versions -Firefox ESR -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/apps/react-trrack-example/.eslintrc.json b/apps/react-trrack-example/.eslintrc.json deleted file mode 100644 index 734ddac..0000000 --- a/apps/react-trrack-example/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - } - ] -} diff --git a/apps/react-trrack-example/jest.config.ts b/apps/react-trrack-example/jest.config.ts deleted file mode 100644 index 817443e..0000000 --- a/apps/react-trrack-example/jest.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -export default { - displayName: 'react-trrack-example', - preset: '../../jest.preset.js', - transform: { - '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', - '^.+\\.[tj]sx?$': [ - '@swc/jest', - { jsc: { transform: { react: { runtime: 'automatic' } } } }, - ], - }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], - coverageDirectory: '../../coverage/apps/react-trrack-example', -}; diff --git a/apps/react-trrack-example/project.json b/apps/react-trrack-example/project.json deleted file mode 100644 index c35bdcf..0000000 --- a/apps/react-trrack-example/project.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "react-trrack-example", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/react-trrack-example/src", - "projectType": "application", - "targets": { - "build": { - "executor": "@nrwl/webpack:webpack", - "outputs": ["{options.outputPath}"], - "defaultConfiguration": "production", - "options": { - "compiler": "swc", - "outputPath": "dist/apps/react-trrack-example", - "index": "apps/react-trrack-example/src/index.html", - "baseHref": "/", - "main": "apps/react-trrack-example/src/main.tsx", - "polyfills": "apps/react-trrack-example/src/polyfills.ts", - "tsConfig": "apps/react-trrack-example/tsconfig.app.json", - "assets": [ - "apps/react-trrack-example/src/favicon.ico", - "apps/react-trrack-example/src/assets" - ], - "styles": ["apps/react-trrack-example/src/styles.css"], - "scripts": [], - "webpackConfig": "@nrwl/react/plugins/webpack" - }, - "configurations": { - "development": { - "extractLicenses": false, - "optimization": false, - "sourceMap": true, - "vendorChunk": true - }, - "production": { - "fileReplacements": [ - { - "replace": "apps/react-trrack-example/src/environments/environment.ts", - "with": "apps/react-trrack-example/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false - } - } - }, - "serve": { - "executor": "@nrwl/webpack:dev-server", - "defaultConfiguration": "development", - "options": { - "buildTarget": "react-trrack-example:build", - "hmr": true, - "port": 3000 - }, - "configurations": { - "development": { - "buildTarget": "react-trrack-example:build:development" - }, - "production": { - "buildTarget": "react-trrack-example:build:production", - "hmr": false - } - } - }, - "lint": { - "executor": "@nrwl/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/react-trrack-example/**/*.{ts,tsx,js,jsx}"] - } - }, - "test": { - "executor": "@nrwl/jest:jest", - "outputs": ["{workspaceRoot}/coverage/apps/react-trrack-example"], - "options": { - "jestConfig": "apps/react-trrack-example/jest.config.ts", - "passWithNoTests": true - } - } - }, - "tags": [] -} diff --git a/apps/react-trrack-example/src/app/App.tsx b/apps/react-trrack-example/src/app/App.tsx deleted file mode 100644 index 388ec21..0000000 --- a/apps/react-trrack-example/src/app/App.tsx +++ /dev/null @@ -1,89 +0,0 @@ -import { Box, Checkbox, List, ListItem, ListItemIcon, ListItemText, Typography } from '@mui/material'; -import Tree, { useTreeState } from 'react-hyper-tree'; -import { TreeNode } from 'react-hyper-tree/dist/helpers/node'; - -import { Navbar } from './components/Navbar'; -import { useTrrackTaskManager } from './store/trrack'; - -function App() { - const trrackManager = useTrrackTaskManager(); - const { trrack } = trrackManager; - const { actions } = trrackManager; - - const { required, handlers } = useTreeState({ - data: trrackManager.trrack.tree(), - id: 'test', - defaultOpened: true, - }); - - open(required.data, trrackManager.trrack.current.id); - - return ( - - - - - {trrackManager.state.tasks.map((task) => ( - - - { - if (task.completed) - trrack.apply( - `Mark ${task.desc} as not done`, - actions.markTaskIncomplete(task) - ); - else - trrack.apply( - `Mark ${task.desc} as done`, - actions.markTaskComplete(task) - ); - }} - /> - - - {task.desc} - - } - > - - ))} - - trrackManager.trrack.to(node.id)} - /> - - - ); -} - -export default App; - -export function open(nodes: TreeNode[], current: string) { - nodes.forEach((node) => { - node.setSelected(current === node.id); - node.setOpened(true); - - if (node.children) open(node.children, current); - }); -} diff --git a/apps/react-trrack-example/src/app/components/Navbar.tsx b/apps/react-trrack-example/src/app/components/Navbar.tsx deleted file mode 100644 index 6f21417..0000000 --- a/apps/react-trrack-example/src/app/components/Navbar.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import AddIcon from '@mui/icons-material/Add'; -import RedoIcon from '@mui/icons-material/Redo'; -import RemoveIcon from '@mui/icons-material/Remove'; -import UndoIcon from '@mui/icons-material/Undo'; -import { AppBar, Button, IconButton, Toolbar, Typography } from '@mui/material'; - -import { Trrack } from '../store/trrack'; -import { Task } from '../store/types'; - -export function Navbar({ t }: { t: Trrack }) { - const { trrack, isAtLatest, isAtRoot, actions, counter } = t; - - return ( - <> - - - - Action based tracking with React - - { - trrack.apply('Increment counter', actions.incrementCounter(1)); - }} - > - - - - Counter: {counter} - - { - trrack.apply('Decrement counter', actions.decrementCounter(1)); - }} - > - - - - - - - - - - ); -} diff --git a/apps/react-trrack-example/src/app/store/trrack.ts b/apps/react-trrack-example/src/app/store/trrack.ts deleted file mode 100644 index 0af14cd..0000000 --- a/apps/react-trrack-example/src/app/store/trrack.ts +++ /dev/null @@ -1,116 +0,0 @@ -import { initializeTrrack, Registry } from '@trrack/core'; -import { useMemo, useState } from 'react'; - -import { Task } from './types'; - -const initialState = { - tasks: [] as Task[], -}; - -type State = typeof initialState; - -// ! Add example for async action (e.g. data loading) -export function useTrrackTaskManager() { - const [counter, setCounter] = useState(0); - const [state, setState] = useState(initialState); - - const { registry, actions } = useMemo(() => { - const reg = Registry.create(); - - const addTask = reg.register('add-task', (state, task: Task) => { - state.tasks.push(task); - }); - - const removeTask = reg.register('remove-task', (state, task: Task) => { - state.tasks = state.tasks.filter((t: Task) => t.id !== task.id); - }); - - const markTaskComplete = reg.register( - 'complete-task', - (state, task: Task) => { - const idx = state.tasks.findIndex((d: any) => d.id === task.id); - state.tasks[idx].completed = true; - } - ); - - const markTaskIncomplete = reg.register( - 'incomplete-task', - (state, task: Task) => { - const idx = state.tasks.findIndex((d: any) => d.id === task.id); - state.tasks[idx].completed = false; - } - ); - - const incrementCounter = reg.register( - 'increment-counter', - (add: number) => { - setCounter((c) => c + add); - return { - type: 'decrement-counter', - payload: add, - meta: { - hasSideEffects: true, - }, - }; - } - ); - - const decrementCounter = reg.register( - 'decrement-counter', - (sub: number) => { - setCounter((c) => c - sub); - return { - type: 'increment-counter', - payload: sub, - meta: { - hasSideEffects: true, - }, - }; - } - ); - - return { - registry: reg, - actions: { - addTask, - removeTask, - markTaskComplete, - markTaskIncomplete, - incrementCounter, - decrementCounter, - }, - }; - }, []); - - const trrack = useMemo(() => { - const t = initializeTrrack({ - initialState, - registry, - }); - - t.currentChange(() => { - setState(t.current.state.val as State); - }); - - return t; - }, [registry]); - - const current = useMemo(() => { - return trrack.current; - }, [trrack]); - - const isAtLatest = current ? current.children.length === 0 : false; - - const isAtRoot = current ? current.id === trrack.root.id : false; - - return { - trrack, - isAtLatest, - isAtRoot, - state, - counter, - actions, - }; -} - -export type Trrack = ReturnType; diff --git a/apps/react-trrack-example/src/app/store/types.ts b/apps/react-trrack-example/src/app/store/types.ts deleted file mode 100644 index 1d4a81d..0000000 --- a/apps/react-trrack-example/src/app/store/types.ts +++ /dev/null @@ -1,7 +0,0 @@ -export type Task = { - id: string; - taskNumber: number; - createdOn: number; - desc: string; - completed: boolean; -}; diff --git a/apps/react-trrack-example/src/assets/.gitkeep b/apps/react-trrack-example/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/react-trrack-example/src/environments/environment.prod.ts b/apps/react-trrack-example/src/environments/environment.prod.ts deleted file mode 100644 index c966979..0000000 --- a/apps/react-trrack-example/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/apps/react-trrack-example/src/environments/environment.ts b/apps/react-trrack-example/src/environments/environment.ts deleted file mode 100644 index 7ed8376..0000000 --- a/apps/react-trrack-example/src/environments/environment.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// When building for production, this file is replaced with `environment.prod.ts`. - -export const environment = { - production: false, -}; diff --git a/apps/react-trrack-example/src/favicon.ico b/apps/react-trrack-example/src/favicon.ico deleted file mode 100644 index 317ebcb2336e0833a22dddf0ab287849f26fda57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI332;U^%p|z7g|#(P)qFEA@4f!_@qOK2 z_lJl}!lhL!VT_U|uN7%8B2iKH??xhDa;*`g{yjTFWHvXn;2s{4R7kH|pKGdy(7z!K zgftM+Ku7~24TLlh(!g)gz|foI94G^t2^IO$uvX$3(OR0<_5L2sB)lMAMy|+`xodJ{ z_Uh_1m)~h?a;2W{dmhM;u!YGo=)OdmId_B<%^V^{ovI@y`7^g1_V9G}*f# zNzAtvou}I!W1#{M^@ROc(BZ! z+F!!_aR&Px3_reO(EW+TwlW~tv*2zr?iP7(d~a~yA|@*a89IUke+c472NXM0wiX{- zl`UrZC^1XYyf%1u)-Y)jj9;MZ!SLfd2Hl?o|80Su%Z?To_=^g_Jt0oa#CT*tjx>BI z16wec&AOWNK<#i0Qd=1O$fymLRoUR*%;h@*@v7}wApDl^w*h}!sYq%kw+DKDY)@&A z@9$ULEB3qkR#85`lb8#WZw=@})#kQig9oqy^I$dj&k4jU&^2(M3q{n1AKeGUKPFbr z1^<)aH;VsG@J|B&l>UtU#Ejv3GIqERzYgL@UOAWtW<{p#zy`WyJgpCy8$c_e%wYJL zyGHRRx38)HyjU3y{-4z6)pzb>&Q1pR)B&u01F-|&Gx4EZWK$nkUkOI|(D4UHOXg_- zw{OBf!oWQUn)Pe(=f=nt=zkmdjpO^o8ZZ9o_|4tW1ni+Un9iCW47*-ut$KQOww!;u z`0q)$s6IZO!~9$e_P9X!hqLxu`fpcL|2f^I5d4*a@Dq28;@2271v_N+5HqYZ>x;&O z05*7JT)mUe&%S0@UD)@&8SmQrMtsDfZT;fkdA!r(S=}Oz>iP)w=W508=Rc#nNn7ym z1;42c|8($ALY8#a({%1#IXbWn9-Y|0eDY$_L&j{63?{?AH{);EzcqfydD$@-B`Y3<%IIj7S7rK_N}je^=dEk%JQ4c z!tBdTPE3Tse;oYF>cnrapWq*o)m47X1`~6@(!Y29#>-#8zm&LXrXa(3=7Z)ElaQqj z-#0JJy3Fi(C#Rx(`=VXtJ63E2_bZGCz+QRa{W0e2(m3sI?LOcUBx)~^YCqZ{XEPX)C>G>U4tfqeH8L(3|pQR*zbL1 zT9e~4Tb5p9_G}$y4t`i*4t_Mr9QYvL9C&Ah*}t`q*}S+VYh0M6GxTTSXI)hMpMpIq zD1ImYqJLzbj0}~EpE-aH#VCH_udYEW#`P2zYmi&xSPs_{n6tBj=MY|-XrA;SGA_>y zGtU$?HXm$gYj*!N)_nQ59%lQdXtQZS3*#PC-{iB_sm+ytD*7j`D*k(P&IH2GHT}Eh z5697eQECVIGQAUe#eU2I!yI&%0CP#>%6MWV z@zS!p@+Y1i1b^QuuEF*13CuB zu69dve5k7&Wgb+^s|UB08Dr3u`h@yM0NTj4h7MnHo-4@xmyr7(*4$rpPwsCDZ@2be zRz9V^GnV;;?^Lk%ynzq&K(Aix`mWmW`^152Hoy$CTYVehpD-S1-W^#k#{0^L`V6CN+E z!w+xte;2vu4AmVNEFUOBmrBL>6MK@!O2*N|2=d|Y;oN&A&qv=qKn73lDD zI(+oJAdgv>Yr}8(&@ZuAZE%XUXmX(U!N+Z_sjL<1vjy1R+1IeHt`79fnYdOL{$ci7 z%3f0A*;Zt@ED&Gjm|OFTYBDe%bbo*xXAQsFz+Q`fVBH!N2)kaxN8P$c>sp~QXnv>b zwq=W3&Mtmih7xkR$YA)1Yi?avHNR6C99!u6fh=cL|KQ&PwF!n@ud^n(HNIImHD!h87!i*t?G|p0o+eelJ?B@A64_9%SBhNaJ64EvKgD&%LjLCYnNfc; znj?%*p@*?dq#NqcQFmmX($wms@CSAr9#>hUR^=I+=0B)vvGX%T&#h$kmX*s=^M2E!@N9#m?LhMvz}YB+kd zG~mbP|D(;{s_#;hsKK9lbVK&Lo734x7SIFJ9V_}2$@q?zm^7?*XH94w5Qae{7zOMUF z^?%F%)c1Y)Q?Iy?I>knw*8gYW#ok|2gdS=YYZLiD=CW|Nj;n^x!=S#iJ#`~Ld79+xXpVmUK^B(xO_vO!btA9y7w3L3-0j-y4 z?M-V{%z;JI`bk7yFDcP}OcCd*{Q9S5$iGA7*E1@tfkyjAi!;wP^O71cZ^Ep)qrQ)N z#wqw0_HS;T7x3y|`P==i3hEwK%|>fZ)c&@kgKO1~5<5xBSk?iZV?KI6&i72H6S9A* z=U(*e)EqEs?Oc04)V-~K5AUmh|62H4*`UAtItO$O(q5?6jj+K^oD!04r=6#dsxp?~}{`?&sXn#q2 zGuY~7>O2=!u@@Kfu7q=W*4egu@qPMRM>(eyYyaIE<|j%d=iWNdGsx%c!902v#ngNg z@#U-O_4xN$s_9?(`{>{>7~-6FgWpBpqXb`Ydc3OFL#&I}Irse9F_8R@4zSS*Y*o*B zXL?6*Aw!AfkNCgcr#*yj&p3ZDe2y>v$>FUdKIy_2N~}6AbHc7gA3`6$g@1o|dE>vz z4pl(j9;kyMsjaw}lO?(?Xg%4k!5%^t#@5n=WVc&JRa+XT$~#@rldvN3S1rEpU$;XgxVny7mki3 z-Hh|jUCHrUXuLr!)`w>wgO0N%KTB-1di>cj(x3Bav`7v z3G7EIbU$z>`Nad7Rk_&OT-W{;qg)-GXV-aJT#(ozdmnA~Rq3GQ_3mby(>q6Ocb-RgTUhTN)))x>m&eD;$J5Bg zo&DhY36Yg=J=$Z>t}RJ>o|@hAcwWzN#r(WJ52^g$lh^!63@hh+dR$&_dEGu&^CR*< z!oFqSqO@>xZ*nC2oiOd0eS*F^IL~W-rsrO`J`ej{=ou_q^_(<$&-3f^J z&L^MSYWIe{&pYq&9eGaArA~*kA - - - - ReactTrrackExample - - - - - - -
- - diff --git a/apps/react-trrack-example/src/main.tsx b/apps/react-trrack-example/src/main.tsx deleted file mode 100644 index f1dacd9..0000000 --- a/apps/react-trrack-example/src/main.tsx +++ /dev/null @@ -1,13 +0,0 @@ -import { StrictMode } from 'react'; -import * as ReactDOM from 'react-dom/client'; - -import App from './app/App'; - -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); -root.render( - - - -); diff --git a/apps/react-trrack-example/src/polyfills.ts b/apps/react-trrack-example/src/polyfills.ts deleted file mode 100644 index 2adf3d0..0000000 --- a/apps/react-trrack-example/src/polyfills.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Polyfill stable language features. These imports will be optimized by `@babel/preset-env`. - * - * See: https://github.com/zloirock/core-js#babel - */ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; diff --git a/apps/react-trrack-example/src/styles.css b/apps/react-trrack-example/src/styles.css deleted file mode 100644 index 90d4ee0..0000000 --- a/apps/react-trrack-example/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/apps/react-trrack-example/tsconfig.app.json b/apps/react-trrack-example/tsconfig.app.json deleted file mode 100644 index af84f21..0000000 --- a/apps/react-trrack-example/tsconfig.app.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "types": ["node"] - }, - "files": [ - "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", - "../../node_modules/@nrwl/react/typings/image.d.ts" - ], - "exclude": [ - "jest.config.ts", - "**/*.spec.ts", - "**/*.test.ts", - "**/*.spec.tsx", - "**/*.test.tsx", - "**/*.spec.js", - "**/*.test.js", - "**/*.spec.jsx", - "**/*.test.jsx" - ], - "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] -} diff --git a/apps/react-trrack-example/tsconfig.json b/apps/react-trrack-example/tsconfig.json deleted file mode 100644 index 9657042..0000000 --- a/apps/react-trrack-example/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "jsx": "react-jsx", - "allowJs": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true - }, - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} diff --git a/apps/react-trrack-example/tsconfig.spec.json b/apps/react-trrack-example/tsconfig.spec.json deleted file mode 100644 index b8a9507..0000000 --- a/apps/react-trrack-example/tsconfig.spec.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "module": "commonjs", - "types": ["jest", "node"] - }, - "include": [ - "jest.config.ts", - "**/*.test.ts", - "**/*.spec.ts", - "**/*.test.tsx", - "**/*.spec.tsx", - "**/*.test.js", - "**/*.spec.js", - "**/*.test.jsx", - "**/*.spec.jsx", - "**/*.d.ts" - ], - "files": [ - "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", - "../../node_modules/@nrwl/react/typings/image.d.ts" - ] -} diff --git a/apps/rtk-trrack-example/.babelrc b/apps/rtk-trrack-example/.babelrc deleted file mode 100644 index 61641ec..0000000 --- a/apps/rtk-trrack-example/.babelrc +++ /dev/null @@ -1,11 +0,0 @@ -{ - "presets": [ - [ - "@nrwl/react/babel", - { - "runtime": "automatic" - } - ] - ], - "plugins": [] -} diff --git a/apps/rtk-trrack-example/.browserslistrc b/apps/rtk-trrack-example/.browserslistrc deleted file mode 100644 index f1d12df..0000000 --- a/apps/rtk-trrack-example/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by: -# 1. autoprefixer to adjust CSS to support the below specified browsers -# 2. babel preset-env to adjust included polyfills -# -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries -# -# If you need to support different browsers in production, you may tweak the list below. - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major version -last 2 iOS major versions -Firefox ESR -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/apps/rtk-trrack-example/.eslintrc.json b/apps/rtk-trrack-example/.eslintrc.json deleted file mode 100644 index 734ddac..0000000 --- a/apps/rtk-trrack-example/.eslintrc.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"], - "ignorePatterns": ["!**/*"], - "overrides": [ - { - "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], - "rules": {} - }, - { - "files": ["*.ts", "*.tsx"], - "rules": {} - }, - { - "files": ["*.js", "*.jsx"], - "rules": {} - } - ] -} diff --git a/apps/rtk-trrack-example/jest.config.ts b/apps/rtk-trrack-example/jest.config.ts deleted file mode 100644 index 0cae162..0000000 --- a/apps/rtk-trrack-example/jest.config.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable */ -export default { - displayName: 'rtk-trrack-example', - preset: '../../jest.preset.js', - transform: { - '^(?!.*\\.(js|jsx|ts|tsx|css|json)$)': '@nrwl/react/plugins/jest', - '^.+\\.[tj]sx?$': [ - '@swc/jest', - { jsc: { transform: { react: { runtime: 'automatic' } } } }, - ], - }, - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx'], - coverageDirectory: '../../coverage/apps/rtk-trrack-example', -}; diff --git a/apps/rtk-trrack-example/project.json b/apps/rtk-trrack-example/project.json deleted file mode 100644 index 0e5a98a..0000000 --- a/apps/rtk-trrack-example/project.json +++ /dev/null @@ -1,85 +0,0 @@ -{ - "name": "rtk-trrack-example", - "$schema": "../../node_modules/nx/schemas/project-schema.json", - "sourceRoot": "apps/rtk-trrack-example/src", - "projectType": "application", - "targets": { - "build": { - "executor": "@nrwl/webpack:webpack", - "outputs": ["{options.outputPath}"], - "defaultConfiguration": "production", - "options": { - "compiler": "swc", - "outputPath": "dist/apps/rtk-trrack-example", - "index": "apps/rtk-trrack-example/src/index.html", - "baseHref": "/", - "main": "apps/rtk-trrack-example/src/main.tsx", - "polyfills": "apps/rtk-trrack-example/src/polyfills.ts", - "tsConfig": "apps/rtk-trrack-example/tsconfig.app.json", - "assets": [ - "apps/rtk-trrack-example/src/favicon.ico", - "apps/rtk-trrack-example/src/assets" - ], - "styles": ["apps/rtk-trrack-example/src/styles.css"], - "scripts": [], - "webpackConfig": "@nrwl/react/plugins/webpack" - }, - "configurations": { - "development": { - "extractLicenses": false, - "optimization": false, - "sourceMap": true, - "vendorChunk": true - }, - "production": { - "fileReplacements": [ - { - "replace": "apps/rtk-trrack-example/src/environments/environment.ts", - "with": "apps/rtk-trrack-example/src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false - } - } - }, - "serve": { - "executor": "@nrwl/webpack:dev-server", - "defaultConfiguration": "development", - "options": { - "buildTarget": "rtk-trrack-example:build", - "hmr": true, - "port": 3001 - }, - "configurations": { - "development": { - "buildTarget": "rtk-trrack-example:build:development" - }, - "production": { - "buildTarget": "rtk-trrack-example:build:production", - "hmr": false - } - } - }, - "lint": { - "executor": "@nrwl/linter:eslint", - "outputs": ["{options.outputFile}"], - "options": { - "lintFilePatterns": ["apps/rtk-trrack-example/**/*.{ts,tsx,js,jsx}"] - } - }, - "test": { - "executor": "@nrwl/jest:jest", - "outputs": ["{workspaceRoot}/coverage/apps/rtk-trrack-example"], - "options": { - "jestConfig": "apps/rtk-trrack-example/jest.config.ts", - "passWithNoTests": true - } - } - }, - "tags": [] -} diff --git a/apps/rtk-trrack-example/src/app/App.tsx b/apps/rtk-trrack-example/src/app/App.tsx deleted file mode 100644 index 6f38d92..0000000 --- a/apps/rtk-trrack-example/src/app/App.tsx +++ /dev/null @@ -1,103 +0,0 @@ -import { Box, Checkbox, List, ListItem, ListItemIcon, ListItemText, Typography } from '@mui/material'; -import React, { useEffect } from 'react'; -import { Tree, useTreeState } from 'react-hyper-tree'; -import { TreeNode } from 'react-hyper-tree/dist/helpers/node'; -import { useDispatch, useSelector } from 'react-redux'; - -import { useTrrackSelector } from '../main'; -import { Navbar } from './components/Navbar'; -import { setTodoStatus } from './features/todo/taskSlice'; -import { AppDispatch, RootState, trrack } from './store/store'; - -function App() { - const tasks = useSelector((state: RootState) => state.tasks); - const dispatch = useDispatch(); - const current = useTrrackSelector((state: any) => state.current); - const post = useSelector((state: RootState) => state.post); - - useEffect(() => { - const url = new URLSearchParams(window.location.search); - const importString = url.get('prov'); - if (importString) { - const g = JSON.parse(importString); - if (trrack.root.id !== g.root) { - trrack.import(importString); - } - } - }, []); - - const { required, handlers } = useTreeState({ - data: trrack.tree(), - id: 'test', - defaultOpened: true, - }); - - open(required.data, current); - - return ( - - - - - {tasks.map((task) => ( - - - { - dispatch( - setTodoStatus({ - id: task.id, - completed: !task.completed, - }) - ); - }} - /> - - - {task.description} - - } - > - - ))} - - - trrack.to(node.id)} - /> - -
{JSON.stringify(post, null, 2)}
-
- ); -} - -export default App; - -export function open(nodes: TreeNode[], current: string) { - nodes.forEach((node) => { - node.setSelected(current === node.id); - node.setOpened(true); - - if (node.children) open(node.children, current); - }); -} diff --git a/apps/rtk-trrack-example/src/app/components/Navbar.tsx b/apps/rtk-trrack-example/src/app/components/Navbar.tsx deleted file mode 100644 index 8aefb27..0000000 --- a/apps/rtk-trrack-example/src/app/components/Navbar.tsx +++ /dev/null @@ -1,97 +0,0 @@ -import AddIcon from '@mui/icons-material/Add'; -import RedoIcon from '@mui/icons-material/Redo'; -import RemoveIcon from '@mui/icons-material/Remove'; -import UndoIcon from '@mui/icons-material/Undo'; -import { AppBar, Button, IconButton, Toolbar, Typography } from '@mui/material'; -import { useDispatch, useSelector } from 'react-redux'; - -import { decrement, increment } from '../features/counter/counterSlice'; -import { getPostById } from '../features/posts/postSlice'; -import { addTodo } from '../features/todo/taskSlice'; -import { AppDispatch, RootState, trrack } from '../store/store'; - -export const Navbar = () => { - const counter = useSelector((s) => s.counter.counter); - const dispatch = useDispatch(); - const post = useSelector((state: RootState) => state.post); - - return ( - <> - - - - Action based tracking with Redux-Toolkit - - - - - { - dispatch(increment()); - }} - > - - - - Counter: {counter as any} - - { - dispatch(decrement()); - }} - > - - - - - - - - - - - ); -}; diff --git a/apps/rtk-trrack-example/src/app/features/counter/counterSlice.ts b/apps/rtk-trrack-example/src/app/features/counter/counterSlice.ts deleted file mode 100644 index 86d5872..0000000 --- a/apps/rtk-trrack-example/src/app/features/counter/counterSlice.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { createTrrackableSlice } from '@trrack/redux'; - -import { Counter, counterInitState } from './types'; - -export const counterSlice = createTrrackableSlice({ - name: 'counter', - initialState: counterInitState, - reducers: { - increment(state: Counter) { - state.counter += 1; - }, - decrement(state: Counter) { - state.counter -= 1; - }, - }, - doUndoActionCreators: { - increment: () => { - return { - undo: decrement(), - }; - }, - decrement: () => { - return { - undo: increment(), - }; - }, - }, -}); - -export const { increment, decrement } = counterSlice.actions as any; diff --git a/apps/rtk-trrack-example/src/app/features/counter/types.ts b/apps/rtk-trrack-example/src/app/features/counter/types.ts deleted file mode 100644 index 97e816f..0000000 --- a/apps/rtk-trrack-example/src/app/features/counter/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const counterInitState = { - counter: 0, -}; - -export type Counter = typeof counterInitState; diff --git a/apps/rtk-trrack-example/src/app/features/posts/postSlice.ts b/apps/rtk-trrack-example/src/app/features/posts/postSlice.ts deleted file mode 100644 index 7d18fd3..0000000 --- a/apps/rtk-trrack-example/src/app/features/posts/postSlice.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { createAsyncThunk } from '@reduxjs/toolkit'; -import { asyncDoUndoActionCreatorHelper, createTrrackableSlice } from '@trrack/redux'; - -export const getPostById = createAsyncThunk( - 'post/getpostById', - async (postId: number, _api) => { - if (postId < 1) { - return Promise.resolve({ - userId: -1, - id: -1, - title: '', - body: '', - }); - } - - const response = await fetch( - `https://jsonplaceholder.typicode.com/posts/${postId}` - ); - - return response.json(); - } -); - -export const postSlice = createTrrackableSlice({ - name: 'post', - initialState: { - userId: -1, - id: -1, - title: '', - body: '', - }, - reducers: {}, - asyncThunks: [getPostById], - extraReducers(builder) { - builder.addCase(getPostById.fulfilled, (_, action) => { - return action.payload; - }); - }, - doUndoActionCreators: { - [getPostById.typePrefix]: ({ action }) => { - return { - do: asyncDoUndoActionCreatorHelper( - getPostById.typePrefix, - action.payload.id - ), - undo: asyncDoUndoActionCreatorHelper( - getPostById.typePrefix, - action.payload.id - 1 - ), - }; - }, - }, -}); diff --git a/apps/rtk-trrack-example/src/app/features/todo/taskSlice.ts b/apps/rtk-trrack-example/src/app/features/todo/taskSlice.ts deleted file mode 100644 index e521346..0000000 --- a/apps/rtk-trrack-example/src/app/features/todo/taskSlice.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { PayloadAction } from '@reduxjs/toolkit'; -import { createTrrackableSlice } from '@trrack/redux'; -import { v4 as uuid } from 'uuid'; - -import { Todo } from './types'; - -const initialState: Todo[] = []; - -export const tasksSlice = createTrrackableSlice({ - name: 'tasks', - initialState, - reducers: { - addTodo: { - reducer: (state, action: PayloadAction) => { - state.push(action.payload); - }, - prepare: (description: string) => { - return { - payload: { - id: uuid(), - description, - completed: false, - }, - }; - }, - }, - removeTodo(state, action: PayloadAction) { - const index = state.findIndex((t) => t.id === action.payload); - state.splice(index, 1); - }, - setTodoStatus( - state, - action: PayloadAction<{ id: string; completed: boolean }> - ) { - const index = state.findIndex((t) => t.id === action.payload.id); - state[index].completed = action.payload.completed; - }, - }, - labels: { - setTodoStatus: (payload: { id: string; completed: boolean }) => { - return `Mark ${payload.id} as ${ - payload.completed ? 'complete' : 'incomplete' - }`; - }, - addTodo: ((task: Todo) => { - return `Add task ${task.description}`; - }) as any, - }, -}); - -export const { addTodo, setTodoStatus, removeTodo } = tasksSlice.actions; diff --git a/apps/rtk-trrack-example/src/app/features/todo/types.ts b/apps/rtk-trrack-example/src/app/features/todo/types.ts deleted file mode 100644 index 8df4913..0000000 --- a/apps/rtk-trrack-example/src/app/features/todo/types.ts +++ /dev/null @@ -1,5 +0,0 @@ -export type Todo = { - id: string; - description: string; - completed: boolean; -}; diff --git a/apps/rtk-trrack-example/src/app/store/store.ts b/apps/rtk-trrack-example/src/app/store/store.ts deleted file mode 100644 index 9e214c7..0000000 --- a/apps/rtk-trrack-example/src/app/store/store.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { configureTrrackableStore } from '@trrack/redux'; - -import { counterSlice } from '../features/counter/counterSlice'; -import { postSlice } from '../features/posts/postSlice'; -import { tasksSlice } from '../features/todo/taskSlice'; - -export const { store, trrack, trrackStore } = configureTrrackableStore({ - reducer: { - tasks: tasksSlice.reducer, - counter: counterSlice.reducer, - post: postSlice.reducer, - }, - slices: [counterSlice, tasksSlice, postSlice], -}); - -export type AppDispatch = typeof store.dispatch; -export type RootState = ReturnType; diff --git a/apps/rtk-trrack-example/src/assets/.gitkeep b/apps/rtk-trrack-example/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/rtk-trrack-example/src/environments/environment.prod.ts b/apps/rtk-trrack-example/src/environments/environment.prod.ts deleted file mode 100644 index c966979..0000000 --- a/apps/rtk-trrack-example/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true, -}; diff --git a/apps/rtk-trrack-example/src/environments/environment.ts b/apps/rtk-trrack-example/src/environments/environment.ts deleted file mode 100644 index 7ed8376..0000000 --- a/apps/rtk-trrack-example/src/environments/environment.ts +++ /dev/null @@ -1,6 +0,0 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// When building for production, this file is replaced with `environment.prod.ts`. - -export const environment = { - production: false, -}; diff --git a/apps/rtk-trrack-example/src/favicon.ico b/apps/rtk-trrack-example/src/favicon.ico deleted file mode 100644 index 317ebcb2336e0833a22dddf0ab287849f26fda57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeI332;U^%p|z7g|#(P)qFEA@4f!_@qOK2 z_lJl}!lhL!VT_U|uN7%8B2iKH??xhDa;*`g{yjTFWHvXn;2s{4R7kH|pKGdy(7z!K zgftM+Ku7~24TLlh(!g)gz|foI94G^t2^IO$uvX$3(OR0<_5L2sB)lMAMy|+`xodJ{ z_Uh_1m)~h?a;2W{dmhM;u!YGo=)OdmId_B<%^V^{ovI@y`7^g1_V9G}*f# zNzAtvou}I!W1#{M^@ROc(BZ! z+F!!_aR&Px3_reO(EW+TwlW~tv*2zr?iP7(d~a~yA|@*a89IUke+c472NXM0wiX{- zl`UrZC^1XYyf%1u)-Y)jj9;MZ!SLfd2Hl?o|80Su%Z?To_=^g_Jt0oa#CT*tjx>BI z16wec&AOWNK<#i0Qd=1O$fymLRoUR*%;h@*@v7}wApDl^w*h}!sYq%kw+DKDY)@&A z@9$ULEB3qkR#85`lb8#WZw=@})#kQig9oqy^I$dj&k4jU&^2(M3q{n1AKeGUKPFbr z1^<)aH;VsG@J|B&l>UtU#Ejv3GIqERzYgL@UOAWtW<{p#zy`WyJgpCy8$c_e%wYJL zyGHRRx38)HyjU3y{-4z6)pzb>&Q1pR)B&u01F-|&Gx4EZWK$nkUkOI|(D4UHOXg_- zw{OBf!oWQUn)Pe(=f=nt=zkmdjpO^o8ZZ9o_|4tW1ni+Un9iCW47*-ut$KQOww!;u z`0q)$s6IZO!~9$e_P9X!hqLxu`fpcL|2f^I5d4*a@Dq28;@2271v_N+5HqYZ>x;&O z05*7JT)mUe&%S0@UD)@&8SmQrMtsDfZT;fkdA!r(S=}Oz>iP)w=W508=Rc#nNn7ym z1;42c|8($ALY8#a({%1#IXbWn9-Y|0eDY$_L&j{63?{?AH{);EzcqfydD$@-B`Y3<%IIj7S7rK_N}je^=dEk%JQ4c z!tBdTPE3Tse;oYF>cnrapWq*o)m47X1`~6@(!Y29#>-#8zm&LXrXa(3=7Z)ElaQqj z-#0JJy3Fi(C#Rx(`=VXtJ63E2_bZGCz+QRa{W0e2(m3sI?LOcUBx)~^YCqZ{XEPX)C>G>U4tfqeH8L(3|pQR*zbL1 zT9e~4Tb5p9_G}$y4t`i*4t_Mr9QYvL9C&Ah*}t`q*}S+VYh0M6GxTTSXI)hMpMpIq zD1ImYqJLzbj0}~EpE-aH#VCH_udYEW#`P2zYmi&xSPs_{n6tBj=MY|-XrA;SGA_>y zGtU$?HXm$gYj*!N)_nQ59%lQdXtQZS3*#PC-{iB_sm+ytD*7j`D*k(P&IH2GHT}Eh z5697eQECVIGQAUe#eU2I!yI&%0CP#>%6MWV z@zS!p@+Y1i1b^QuuEF*13CuB zu69dve5k7&Wgb+^s|UB08Dr3u`h@yM0NTj4h7MnHo-4@xmyr7(*4$rpPwsCDZ@2be zRz9V^GnV;;?^Lk%ynzq&K(Aix`mWmW`^152Hoy$CTYVehpD-S1-W^#k#{0^L`V6CN+E z!w+xte;2vu4AmVNEFUOBmrBL>6MK@!O2*N|2=d|Y;oN&A&qv=qKn73lDD zI(+oJAdgv>Yr}8(&@ZuAZE%XUXmX(U!N+Z_sjL<1vjy1R+1IeHt`79fnYdOL{$ci7 z%3f0A*;Zt@ED&Gjm|OFTYBDe%bbo*xXAQsFz+Q`fVBH!N2)kaxN8P$c>sp~QXnv>b zwq=W3&Mtmih7xkR$YA)1Yi?avHNR6C99!u6fh=cL|KQ&PwF!n@ud^n(HNIImHD!h87!i*t?G|p0o+eelJ?B@A64_9%SBhNaJ64EvKgD&%LjLCYnNfc; znj?%*p@*?dq#NqcQFmmX($wms@CSAr9#>hUR^=I+=0B)vvGX%T&#h$kmX*s=^M2E!@N9#m?LhMvz}YB+kd zG~mbP|D(;{s_#;hsKK9lbVK&Lo734x7SIFJ9V_}2$@q?zm^7?*XH94w5Qae{7zOMUF z^?%F%)c1Y)Q?Iy?I>knw*8gYW#ok|2gdS=YYZLiD=CW|Nj;n^x!=S#iJ#`~Ld79+xXpVmUK^B(xO_vO!btA9y7w3L3-0j-y4 z?M-V{%z;JI`bk7yFDcP}OcCd*{Q9S5$iGA7*E1@tfkyjAi!;wP^O71cZ^Ep)qrQ)N z#wqw0_HS;T7x3y|`P==i3hEwK%|>fZ)c&@kgKO1~5<5xBSk?iZV?KI6&i72H6S9A* z=U(*e)EqEs?Oc04)V-~K5AUmh|62H4*`UAtItO$O(q5?6jj+K^oD!04r=6#dsxp?~}{`?&sXn#q2 zGuY~7>O2=!u@@Kfu7q=W*4egu@qPMRM>(eyYyaIE<|j%d=iWNdGsx%c!902v#ngNg z@#U-O_4xN$s_9?(`{>{>7~-6FgWpBpqXb`Ydc3OFL#&I}Irse9F_8R@4zSS*Y*o*B zXL?6*Aw!AfkNCgcr#*yj&p3ZDe2y>v$>FUdKIy_2N~}6AbHc7gA3`6$g@1o|dE>vz z4pl(j9;kyMsjaw}lO?(?Xg%4k!5%^t#@5n=WVc&JRa+XT$~#@rldvN3S1rEpU$;XgxVny7mki3 z-Hh|jUCHrUXuLr!)`w>wgO0N%KTB-1di>cj(x3Bav`7v z3G7EIbU$z>`Nad7Rk_&OT-W{;qg)-GXV-aJT#(ozdmnA~Rq3GQ_3mby(>q6Ocb-RgTUhTN)))x>m&eD;$J5Bg zo&DhY36Yg=J=$Z>t}RJ>o|@hAcwWzN#r(WJ52^g$lh^!63@hh+dR$&_dEGu&^CR*< z!oFqSqO@>xZ*nC2oiOd0eS*F^IL~W-rsrO`J`ej{=ou_q^_(<$&-3f^J z&L^MSYWIe{&pYq&9eGaArA~*kA - - - - RtkTrrackExample - - - - - - -
- - diff --git a/apps/rtk-trrack-example/src/main.tsx b/apps/rtk-trrack-example/src/main.tsx deleted file mode 100644 index e63d9d7..0000000 --- a/apps/rtk-trrack-example/src/main.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import { TrrackStoreType } from '@trrack/redux'; -import { createContext, StrictMode } from 'react'; -import * as ReactDOM from 'react-dom/client'; -import { createSelectorHook, Provider } from 'react-redux'; - -import App from './app/App'; -import { store, trrackStore } from './app/store/store'; - -const trrackContext = createContext(undefined!); -export const useTrrackSelector = createSelectorHook(trrackContext as any); - -const root = ReactDOM.createRoot( - document.getElementById('root') as HTMLElement -); - -root.render( - - - - - - - -); diff --git a/apps/rtk-trrack-example/src/polyfills.ts b/apps/rtk-trrack-example/src/polyfills.ts deleted file mode 100644 index 2adf3d0..0000000 --- a/apps/rtk-trrack-example/src/polyfills.ts +++ /dev/null @@ -1,7 +0,0 @@ -/** - * Polyfill stable language features. These imports will be optimized by `@babel/preset-env`. - * - * See: https://github.com/zloirock/core-js#babel - */ -import 'core-js/stable'; -import 'regenerator-runtime/runtime'; diff --git a/apps/rtk-trrack-example/src/styles.css b/apps/rtk-trrack-example/src/styles.css deleted file mode 100644 index 90d4ee0..0000000 --- a/apps/rtk-trrack-example/src/styles.css +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/apps/rtk-trrack-example/tsconfig.app.json b/apps/rtk-trrack-example/tsconfig.app.json deleted file mode 100644 index af84f21..0000000 --- a/apps/rtk-trrack-example/tsconfig.app.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "types": ["node"] - }, - "files": [ - "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", - "../../node_modules/@nrwl/react/typings/image.d.ts" - ], - "exclude": [ - "jest.config.ts", - "**/*.spec.ts", - "**/*.test.ts", - "**/*.spec.tsx", - "**/*.test.tsx", - "**/*.spec.js", - "**/*.test.js", - "**/*.spec.jsx", - "**/*.test.jsx" - ], - "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] -} diff --git a/apps/rtk-trrack-example/tsconfig.json b/apps/rtk-trrack-example/tsconfig.json deleted file mode 100644 index 9657042..0000000 --- a/apps/rtk-trrack-example/tsconfig.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "jsx": "react-jsx", - "allowJs": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "forceConsistentCasingInFileNames": true, - "strict": true, - "noImplicitOverride": true, - "noPropertyAccessFromIndexSignature": true, - "noImplicitReturns": true, - "noFallthroughCasesInSwitch": true - }, - "files": [], - "include": [], - "references": [ - { - "path": "./tsconfig.app.json" - }, - { - "path": "./tsconfig.spec.json" - } - ] -} diff --git a/apps/rtk-trrack-example/tsconfig.spec.json b/apps/rtk-trrack-example/tsconfig.spec.json deleted file mode 100644 index b8a9507..0000000 --- a/apps/rtk-trrack-example/tsconfig.spec.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "outDir": "../../dist/out-tsc", - "module": "commonjs", - "types": ["jest", "node"] - }, - "include": [ - "jest.config.ts", - "**/*.test.ts", - "**/*.spec.ts", - "**/*.test.tsx", - "**/*.spec.tsx", - "**/*.test.js", - "**/*.spec.js", - "**/*.test.jsx", - "**/*.spec.jsx", - "**/*.d.ts" - ], - "files": [ - "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", - "../../node_modules/@nrwl/react/typings/image.d.ts" - ] -} From 00af46cd947b1a39336364831c8185fa8386ed77 Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Fri, 10 Mar 2023 21:11:21 -0700 Subject: [PATCH 3/7] chore: [nx migration] update-configs-jest-29 --- jest.preset.js | 14 +- package.json | 33 +- yarn.lock | 1095 ++++++++++++++++++++++++++++++++++++------------ 3 files changed, 861 insertions(+), 281 deletions(-) diff --git a/jest.preset.js b/jest.preset.js index e6c8ebe..29f4d19 100644 --- a/jest.preset.js +++ b/jest.preset.js @@ -1,3 +1,15 @@ const nxPreset = require('@nrwl/jest/preset').default; -module.exports = { ...nxPreset }; +module.exports = { + ...nxPreset, + /* TODO: Update to latest Jest snapshotFormat + * By default Nx has kept the older style of Jest Snapshot formats + * to prevent breaking of any existing tests with snapshots. + * It's recommend you update to the latest format. + * You can do this by removing snapshotFormat property + * and running tests with --update-snapshot flag. + * Example: "nx affected --targets=test --update-snapshot" + * More info: https://jestjs.io/docs/upgrading-to-jest29#snapshot-format + */ + snapshotFormat: { escapeString: true, printBasicPrototype: true }, +}; diff --git a/package.json b/package.json index eb07ce1..3a122c1 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "dependencies": { "@mantine/core": "^4.2.12", "@mantine/hooks": "^4.2.12", - "@nrwl/next": "15.6.3", + "@nrwl/next": "15.8.6", "@reduxjs/toolkit": "^1.9.1", "@swc/helpers": "^0.4.0", "autoprefixer": "^10.4.13", @@ -47,23 +47,23 @@ "@jscutlery/semver": "^2.25.2", "@mui/icons-material": "^5.8.0", "@mui/material": "^5.8.1", - "@nrwl/cli": "15.6.3", - "@nrwl/eslint-plugin-nx": "15.6.3", - "@nrwl/jest": "15.6.3", - "@nrwl/js": "15.6.3", - "@nrwl/linter": "15.6.3", - "@nrwl/nx-cloud": "15.0.3", - "@nrwl/react": "15.6.3", - "@nrwl/vite": "^15.6.3", - "@nrwl/web": "15.6.3", - "@nrwl/workspace": "15.6.3", + "@nrwl/cli": "15.8.6", + "@nrwl/eslint-plugin-nx": "15.8.6", + "@nrwl/jest": "15.8.6", + "@nrwl/js": "15.8.6", + "@nrwl/linter": "15.8.6", + "@nrwl/nx-cloud": "15.2.1", + "@nrwl/react": "15.8.6", + "@nrwl/vite": "15.8.6", + "@nrwl/web": "15.8.6", + "@nrwl/workspace": "15.8.6", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.7", "@svgr/webpack": "^6.1.2", "@swc/cli": "~0.1.55", "@swc/core": "~1.2.143", "@swc/jest": "0.2.20", "@testing-library/react": "13.4.0", - "@types/jest": "28.1.8", + "@types/jest": "29.4.0", "@types/node": "18.11.9", "@types/react": "18.0.25", "@types/react-dom": "18.0.9", @@ -83,12 +83,12 @@ "eslint-plugin-react": "7.31.11", "eslint-plugin-react-hooks": "4.6.0", "husky": "^8.0.0", - "jest": "28.1.3", + "jest": "29.4.3", "jsdom": "~20.0.3", "lineupjs": "^4.6.1", "lint-staged": "^13.1.0", "ngx-deploy-npm": "^4.1.3", - "nx": "15.6.3", + "nx": "15.8.6", "prettier": "2.7.1", "react-hyper-tree": "^0.3.12", "react-redux": "8.0.5", @@ -101,9 +101,9 @@ "stylus": "^0.55.0", "stylus-loader": "^7.1.0", "swc-loader": "0.1.15", - "ts-jest": "28.0.8", + "ts-jest": "29.0.5", "ts-node": "10.9.1", - "typescript": "4.8.4", + "typescript": "4.9.5", "url-loader": "^4.1.1", "vite": "^4.0.1", "vite-plugin-dts": "~1.7.1", @@ -123,3 +123,4 @@ } } } + diff --git a/yarn.lock b/yarn.lock index b0ec639..c91fea2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -567,7 +567,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6": +"@babel/plugin-syntax-jsx@^7.17.12", "@babel/plugin-syntax-jsx@^7.18.6", "@babel/plugin-syntax-jsx@^7.7.2": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== @@ -1722,38 +1722,49 @@ jest-util "^28.1.3" slash "^3.0.0" -"@jest/core@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.3.tgz#0ebf2bd39840f1233cd5f2d1e6fc8b71bd5a1ac7" - integrity sha512-CIKBrlaKOzA7YG19BEqCw3SLIsEwjZkeJzf5bdooVnW4bH5cktqe3JX+G2YV1aK5vP8N9na1IGWFzYaTp6k6NA== +"@jest/console@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.5.0.tgz#593a6c5c0d3f75689835f1b3b4688c4f8544cb57" + integrity sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ== dependencies: - "@jest/console" "^28.1.3" - "@jest/reporters" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + +"@jest/core@^29.4.3", "@jest/core@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.5.0.tgz#76674b96904484e8214614d17261cc491e5f1f03" + integrity sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/reporters" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" ci-info "^3.2.0" exit "^0.1.2" graceful-fs "^4.2.9" - jest-changed-files "^28.1.3" - jest-config "^28.1.3" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-resolve-dependencies "^28.1.3" - jest-runner "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" - jest-watcher "^28.1.3" + jest-changed-files "^29.5.0" + jest-config "^29.5.0" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-resolve-dependencies "^29.5.0" + jest-runner "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" + jest-watcher "^29.5.0" micromatch "^4.0.4" - pretty-format "^28.1.3" - rimraf "^3.0.0" + pretty-format "^29.5.0" slash "^3.0.0" strip-ansi "^6.0.0" @@ -1774,6 +1785,16 @@ "@types/node" "*" jest-mock "^28.1.3" +"@jest/environment@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.5.0.tgz#9152d56317c1fdb1af389c46640ba74ef0bb4c65" + integrity sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ== + dependencies: + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + "@jest/expect-utils@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" @@ -1781,6 +1802,13 @@ dependencies: jest-get-type "^28.0.2" +"@jest/expect-utils@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.5.0.tgz#f74fad6b6e20f924582dc8ecbf2cb800fe43a036" + integrity sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg== + dependencies: + jest-get-type "^29.4.3" + "@jest/expect@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" @@ -1789,6 +1817,14 @@ expect "^28.1.3" jest-snapshot "^28.1.3" +"@jest/expect@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.5.0.tgz#80952f5316b23c483fbca4363ce822af79c38fba" + integrity sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g== + dependencies: + expect "^29.5.0" + jest-snapshot "^29.5.0" + "@jest/fake-timers@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" @@ -1801,6 +1837,18 @@ jest-mock "^28.1.3" jest-util "^28.1.3" +"@jest/fake-timers@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.5.0.tgz#d4d09ec3286b3d90c60bdcd66ed28d35f1b4dc2c" + integrity sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg== + dependencies: + "@jest/types" "^29.5.0" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-util "^29.5.0" + "@jest/globals@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" @@ -1810,6 +1858,16 @@ "@jest/expect" "^28.1.3" "@jest/types" "^28.1.3" +"@jest/globals@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.5.0.tgz#6166c0bfc374c58268677539d0c181f9c1833298" + integrity sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/types" "^29.5.0" + jest-mock "^29.5.0" + "@jest/reporters@28.1.1": version "28.1.1" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" @@ -1841,17 +1899,17 @@ terminal-link "^2.0.0" v8-to-istanbul "^9.0.0" -"@jest/reporters@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.3.tgz#9adf6d265edafc5fc4a434cfb31e2df5a67a369a" - integrity sha512-JuAy7wkxQZVNU/V6g9xKzCGC5LVXx9FDcABKsSXp5MiKPEE2144a/vXTEDoyzjUpZKfVwp08Wqg5A4WfTMAzjg== +"@jest/reporters@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.5.0.tgz#985dfd91290cd78ddae4914ba7921bcbabe8ac9b" + integrity sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" + "@jest/console" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -1863,13 +1921,12 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - jest-worker "^28.1.3" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + jest-worker "^29.5.0" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" "@jest/schemas@^28.1.3": @@ -1879,6 +1936,13 @@ dependencies: "@sinclair/typebox" "^0.24.1" +"@jest/schemas@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" + integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== + dependencies: + "@sinclair/typebox" "^0.25.16" + "@jest/source-map@^28.1.2": version "28.1.2" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" @@ -1888,6 +1952,15 @@ callsites "^3.0.0" graceful-fs "^4.2.9" +"@jest/source-map@^29.4.3": + version "29.4.3" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.4.3.tgz#ff8d05cbfff875d4a791ab679b4333df47951d20" + integrity sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" + "@jest/test-result@28.1.1": version "28.1.1" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" @@ -1908,7 +1981,17 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.1", "@jest/test-sequencer@^28.1.3": +"@jest/test-result@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.5.0.tgz#7c856a6ca84f45cc36926a4e9c6b57f1973f1408" + integrity sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^28.1.1": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== @@ -1918,6 +2001,16 @@ jest-haste-map "^28.1.3" slash "^3.0.0" +"@jest/test-sequencer@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz#34d7d82d3081abd523dbddc038a3ddcb9f6d3cc4" + integrity sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ== + dependencies: + "@jest/test-result" "^29.5.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + slash "^3.0.0" + "@jest/transform@^28.1.1", "@jest/transform@^28.1.3": version "28.1.3" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" @@ -1939,6 +2032,27 @@ slash "^3.0.0" write-file-atomic "^4.0.1" +"@jest/transform@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.5.0.tgz#cf9c872d0965f0cbd32f1458aa44a2b1988b00f9" + integrity sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^29.5.0" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + "@jest/types@^27.5.1": version "27.5.1" resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" @@ -1962,6 +2076,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^29.4.3", "@jest/types@^29.5.0": + version "29.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" + integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== + dependencies: + "@jest/schemas" "^29.4.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" @@ -2010,7 +2136,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.15", "@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": version "0.3.17" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== @@ -2710,21 +2836,22 @@ read-package-json-fast "^2.0.3" which "^2.0.2" -"@nrwl/cli@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.6.3.tgz#999531d6efb30afc39373bdcbd7e78254a3a3fd3" - integrity sha512-K4E0spofThZXMnhA6R8hkUTdfqmwSnUE2+DlD5Y3jqsvKTAgwF5U41IFkEouFZCf+dWjy0RA20bWoX48EVFtmQ== +"@nrwl/cli@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.8.6.tgz#5e4ae589c4736a597125f41c79c9e7f1510cbe6c" + integrity sha512-KrWoYcZgE6woCubPO1QSnwbZAjs2rdV4dotHxR+iRkeHRPAq0D6w83CVo5oP/krfUri2pxwzhnbkgAK1LSPBYg== dependencies: - nx "15.6.3" + nx "15.8.6" -"@nrwl/cypress@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-15.6.3.tgz#a9213555eb1581ad36f3df512ef5f32f77af9089" - integrity sha512-ZPQ60KTkEgCQaIhaoPICiACfufuE8klwkBSl3bbTL5d6QEYlpTb2M1IeHEYZP1aEKXJlC9Kb6al9lB87peNVkQ== +"@nrwl/cypress@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/cypress/-/cypress-15.8.6.tgz#7af80e3a2de92898d45f06f1cc5a9bed98ace393" + integrity sha512-VnIQOChL+T4BJxLitsjsU2ziVMLrhlLyHpsd4Cz1+jCDajrcywUZkDNuwwGJ58RL9tERBgO0iVmIbWPNcue2dA== dependencies: - "@nrwl/devkit" "15.6.3" - "@nrwl/linter" "15.6.3" - "@nrwl/workspace" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/linter" "15.8.6" + "@nrwl/workspace" "15.8.6" "@phenomnomnominal/tsquery" "4.1.1" dotenv "~10.0.0" semver "7.3.4" @@ -2740,36 +2867,38 @@ semver "7.3.4" tslib "^2.3.0" -"@nrwl/devkit@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.6.3.tgz#e4e96c53ba3304786a49034286c8511534b2b194" - integrity sha512-/JDvdzNxUM+C1PCZPCrvmFx+OfywqZdOq1GS9QR8C0VctTLG4D/SGSFD88O1SAdcbH/f1mMiBGfEYZYd23fghQ== +"@nrwl/devkit@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-15.8.6.tgz#9da231504ab2cbea9d95d45ed85d4ce4d4866aaa" + integrity sha512-yA5hBpeqoIlyEN5lUkejUrmB/5vfg+k6xoT4KhXnmj6bLPDGOYTuixg8k+iYrIAFIRMx0F8zYbYOYzXG3lmvHg== dependencies: "@phenomnomnominal/tsquery" "4.1.1" ejs "^3.1.7" ignore "^5.0.4" semver "7.3.4" + tmp "~0.2.1" tslib "^2.3.0" -"@nrwl/eslint-plugin-nx@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.6.3.tgz#a365de151783e90eccd8af8d49b13fd011f64943" - integrity sha512-UCwyMKlU3shoccNHSeYqF/F9FPm3vMx827Pu2L+Kmkbuy8MhpA20BBpNm/ISXD4w37BBrXgr5e8ATZPuVZTl7A== +"@nrwl/eslint-plugin-nx@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.8.6.tgz#0a8a02b455eda34fc35ef074ff003c850f4da702" + integrity sha512-SSN1IwA/gKYmfeNXATW7Z9UNT2LHl73pqUXjiLgBMdvMMMbIqdJPxLoW/2UJZh+CXuHgauJkmbiD+ovOTTOhlg== dependencies: - "@nrwl/devkit" "15.6.3" + "@nrwl/devkit" "15.8.6" "@typescript-eslint/utils" "^5.36.1" chalk "^4.1.0" confusing-browser-globals "^1.0.9" semver "7.3.4" -"@nrwl/jest@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-15.6.3.tgz#66b1c387352cbbf666959fd7fe921d4980c6084a" - integrity sha512-pG8ESEJFkgyBGOOVZ6bFohklkDXn7JrDPSjmnoKvcOzprluPS7Nx4Ce5bw7wk2Ul3fqJcpAcH5LAZvb+HtA85w== +"@nrwl/jest@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-15.8.6.tgz#00bf4e65649f8ae3059de42012dc193ac2e1166f" + integrity sha512-o6kQ2d2tzNYXAGdWqNyqZatYAvMyXlj63qnoaCt8/1WYpr68JyzrvQ8lu9QX8ev3Vx1yeig2qVVwIAemW9cQUA== dependencies: "@jest/reporters" "28.1.1" "@jest/test-result" "28.1.1" - "@nrwl/devkit" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" "@phenomnomnominal/tsquery" "4.1.1" chalk "^4.1.0" dotenv "~10.0.0" @@ -2780,10 +2909,10 @@ resolve.exports "1.1.0" tslib "^2.3.0" -"@nrwl/js@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-15.6.3.tgz#82c831ab2bf620c3cd376515ff861c9041341d5c" - integrity sha512-OkjpbNAL6732jGPR7Lz/6K6AScqjxMGuZCHmMqmlK0NpSRcOtYJpGsn4XZzPRsWteqXCvY/l3efceiL6eNPmRg== +"@nrwl/js@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-15.8.6.tgz#6a2310b9c5a42449db3768b69acffd6ff7be6a88" + integrity sha512-nFLsmmvmuSdoFJoP0u8zObgNcW9abbZJn3LIciHLh8hQhhbUdAiVvFzhwqIrBhMtT/dK9y4XE9QXSvwbzRR/rg== dependencies: "@babel/core" "^7.15.0" "@babel/plugin-proposal-class-properties" "^7.14.5" @@ -2792,9 +2921,9 @@ "@babel/preset-env" "^7.15.0" "@babel/preset-typescript" "^7.15.0" "@babel/runtime" "^7.14.8" - "@nrwl/devkit" "15.6.3" - "@nrwl/linter" "15.6.3" - "@nrwl/workspace" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/workspace" "15.8.6" + "@phenomnomnominal/tsquery" "4.1.1" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" babel-plugin-transform-typescript-metadata "^0.3.1" @@ -2808,29 +2937,31 @@ tree-kill "1.2.2" tslib "^2.3.0" -"@nrwl/linter@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-15.6.3.tgz#9cffa150109c604827c06ce0ccd5c925d4cd7c01" - integrity sha512-efGOduHbUa/L6MuJLb2SoDwi4hEKpz6lM1X/Yg36dYDjLuJdpLC23K4WwEOQeZL6jkcUerfY65W8NMPinAHWKg== +"@nrwl/linter@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/linter/-/linter-15.8.6.tgz#f816df4c53b4df95289908b64c8fbe895ae2727b" + integrity sha512-6x+EO6GbhLY/UvgRXE2daftB80VrVCQDfZeKnA/SX+HxFEzRjrxBbH+Gaa7iyHVYgBZbVjDHVRuOviEABYbh0w== dependencies: - "@nrwl/devkit" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" "@phenomnomnominal/tsquery" "4.1.1" tmp "~0.2.1" tslib "^2.3.0" -"@nrwl/next@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/next/-/next-15.6.3.tgz#4ec611f4e28f46cf84df09f5727e4d063ef7df0f" - integrity sha512-yLXBCx/O5HKDvJvG7xrtU9TASWr+gF9Cy+XNvTEqERb8e/evXCpI0yjErON6WsVeo/Rthv+pSBCtJJzvoOqM4Q== +"@nrwl/next@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/next/-/next-15.8.6.tgz#40c62132b5fd2dd5d0f4fa0f75103d9cff8032f2" + integrity sha512-5lvPMWs8j1Sq6ya2Yu70CXWClZGblEf3pQtMRvq3p++HqCZF/JJSGtXMvMA0p8dkWz4IEw0VsNOGfziLpUdjAw== dependencies: "@babel/plugin-proposal-decorators" "^7.14.5" - "@nrwl/cypress" "15.6.3" - "@nrwl/devkit" "15.6.3" - "@nrwl/jest" "15.6.3" - "@nrwl/linter" "15.6.3" - "@nrwl/react" "15.6.3" - "@nrwl/webpack" "15.6.3" - "@nrwl/workspace" "15.6.3" + "@nrwl/cypress" "15.8.6" + "@nrwl/devkit" "15.8.6" + "@nrwl/jest" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/linter" "15.8.6" + "@nrwl/react" "15.8.6" + "@nrwl/webpack" "15.8.6" + "@nrwl/workspace" "15.8.6" "@svgr/webpack" "^6.1.2" chalk "^4.1.0" dotenv "~10.0.0" @@ -2842,10 +2973,10 @@ url-loader "^4.1.1" webpack-merge "^5.8.0" -"@nrwl/nx-cloud@15.0.3": - version "15.0.3" - resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-15.0.3.tgz#e24428969aebafcf0989d9504d941d42d51a12db" - integrity sha512-KvwM8/IbCOlbWIzi+Tm14tJkEdQK3ruN6TPUmeKnkeFZsJyoFw4GCyKJMOLs8y4MQokHgskg3nbF822JLR9xJg== +"@nrwl/nx-cloud@15.2.1": + version "15.2.1" + resolved "https://registry.yarnpkg.com/@nrwl/nx-cloud/-/nx-cloud-15.2.1.tgz#71289a9f134b5c6c39fef87609546f152d7dfb9f" + integrity sha512-T4ycGSx77TdvS0j6tKI/6zmh6YtsPHyfB2li+wDR+BW9wjGGqOTX1QvG3gf0k2enhA3dxLgYnmeDZoEUek6MOw== dependencies: axios "^0.21.2" chalk "4.1.0" @@ -2856,26 +2987,72 @@ tar "6.1.11" yargs-parser ">=21.0.1" -"@nrwl/react@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/react/-/react-15.6.3.tgz#2165d6b51b99bde0f1e4e9dc784f35f687e2cc1b" - integrity sha512-WpINxLNsX4Wq9O/stsJIXDGE8GdatyyeeKI0Y9GjVdMPfdPq3qTifnCsUrb97D0WjTEceyPGUzGsx0GmhPB3Dg== - dependencies: - "@nrwl/devkit" "15.6.3" - "@nrwl/linter" "15.6.3" - "@nrwl/workspace" "15.6.3" +"@nrwl/nx-darwin-arm64@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.8.6.tgz#d5c7bf238cd6f555b49f5edc4b1831fba31f06f0" + integrity sha512-8diQitlyjHxpkWcXNecd6T2ch8fHR7LOMaZg9+qgrt5AypWkEGf+UHMxTSNRObAiBGnoxySa+AL/UKVtpQ203Q== + +"@nrwl/nx-darwin-x64@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.8.6.tgz#97a290d133b102031aae3840dc1eb183c080a37b" + integrity sha512-h9/JULzPZTpt6oNpKMZLc1NGDu+CLyx91c8DJUh/hH0Zh/7dS9LFxe9jWeFIdh18iAu7ZAoktK2KJ5YhOrUYhA== + +"@nrwl/nx-linux-arm-gnueabihf@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.8.6.tgz#7106ac1678412b1ceb0f3a98c19c7171500460c1" + integrity sha512-Yp/YjzcIHW+OW4revPRZIt0Px9cKRsOL69FPLlYSxWuR/PD9SPeXWcbo3pKkjnIWIjOL2YT8z5cHiQ3bV1NVfw== + +"@nrwl/nx-linux-arm64-gnu@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.8.6.tgz#ccfd0d4c04d70cf1d7ba6f021ae3bd97f63cbf86" + integrity sha512-b+OenpPhhxqgaG6EFHRLfVGtAU4+UbKqOhv7DLLh5P7tX3RAQAtyrT6tVkfDRFYl6kgEme/I5ZrevcbaGyDO+w== + +"@nrwl/nx-linux-arm64-musl@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.8.6.tgz#ebf2ab49a2fd6b6ac47c48cc20c77ca1737c815f" + integrity sha512-F9D8moy+lfJQhVrZoY54vDwpigBgxQy4HB9PRmc6Ln9mIk3ouOvKNC99OjUYEO+ensHr9eMpsbghsRCjod//uw== + +"@nrwl/nx-linux-x64-gnu@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.8.6.tgz#a768e4dec29b2161a8050393bc6f1df24cf94c52" + integrity sha512-an0zD6lKpblexazKssFvcfOx7BuGutwlrzmwScxISPXj5+ly99u+sYclDg2P56YRHYXIuYGBK0c0VWaJ91QIcw== + +"@nrwl/nx-linux-x64-musl@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.8.6.tgz#22b8963c1d2025f62006d07f59985d7036964aa3" + integrity sha512-LOurlSuLf9LWdjvpHHIsHC0auxgMVrkeOFFCUJ3oVv/dN4uZ0vuNG98XM2E7fPDXDacBZIyKdx34KQlmFfBHsA== + +"@nrwl/nx-win32-arm64-msvc@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.8.6.tgz#8e5ffbb447540576715c5ad4539f85b2603710ba" + integrity sha512-MvH84nLv1tdM96z92abeQd+tguY/zKC22AFHek9PSR1StUQzwwPu6rR7XDn3mggwnkLm11jTUXlk7wdbE5sldQ== + +"@nrwl/nx-win32-x64-msvc@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.8.6.tgz#35488ded6d5208518acca3b59004078fa8e83e5c" + integrity sha512-P0Sb4HJCeoeTvPFdUMKljRUIjzso0go36cn1Zpl+Z5CG/nbOvLlbnzh6rg15SRNu9OLWTHNPtyQIvKxjqEDoxg== + +"@nrwl/react@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/react/-/react-15.8.6.tgz#800c61adfb1feb4c8ff9db77e76025a3148880d3" + integrity sha512-QrcjQbyFnmhE8yhQ8D5xsee+qfvOvQUW3AcZITtoH48rDJBZlgQ8pNDC6/WPtc+Gwkc7vbOn7sXkED8ZBqZb3Q== + dependencies: + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/linter" "15.8.6" + "@nrwl/workspace" "15.8.6" "@phenomnomnominal/tsquery" "4.1.1" chalk "^4.1.0" minimatch "3.0.5" -"@nrwl/rollup@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/rollup/-/rollup-15.6.3.tgz#0dde9be33d05da130497a8b0c4420e89413d89dc" - integrity sha512-8m581XeXsAlPXk1MGQey/iNtYl6HxTDxodiz7y/uihl8Fg0gv+VuukL8WY/CaRNOryTst0GotfXrISt7T/I6xw== +"@nrwl/rollup@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/rollup/-/rollup-15.8.6.tgz#d94b8cc55cd6babf9e7e666af1ac73f41b28dfb4" + integrity sha512-8Pk/ao4MZSqQHO6tP3cDGd7ISEgzHgHkt4PRQbHzmfMCZQ50pBPB8pBjiMZCRhqG0xOq7pjRhB9nH/oH6I36yg== dependencies: - "@nrwl/devkit" "15.6.3" - "@nrwl/js" "15.6.3" - "@nrwl/workspace" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/workspace" "15.8.6" "@rollup/plugin-babel" "^5.3.0" "@rollup/plugin-commonjs" "^20.0.0" "@rollup/plugin-image" "^2.1.0" @@ -2885,7 +3062,6 @@ babel-plugin-transform-async-to-promises "^0.8.15" chalk "^4.1.0" dotenv "~10.0.0" - fs-extra "^11.1.0" postcss "^8.4.14" rollup "^2.56.2" rollup-plugin-copy "^3.4.0" @@ -2895,52 +3071,52 @@ rxjs "^6.5.4" tslib "^2.3.0" -"@nrwl/tao@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.6.3.tgz#b24e11345375dea96bc386c60b9b1102a7584932" - integrity sha512-bDZbPIbU5Mf2BvX0q8GjPxrm1WkYyfW+gp7mLuuJth2sEpZiCr47mSwuGko/y4CKXvIX46VQcAS0pKQMKugXsg== +"@nrwl/tao@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.8.6.tgz#b92de65866fea5e2c7ab37d1cb0bbec711421998" + integrity sha512-dY205cotLiKTV+5BrUlneZEOucDmXiJU4asj1G4vQCf8Nt7awwuLYOmgbsACS27gkopSVV+DPl1zmtkSJX8Cjg== dependencies: - nx "15.6.3" + nx "15.8.6" -"@nrwl/vite@^15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/vite/-/vite-15.6.3.tgz#4ad5e85c055a7e103cdafab6fad6d6f6f3278552" - integrity sha512-vO5JUoS4nhOk42nVyhmU/itX+1GmxoXG3NgTmWtjtLgYwi7eo3lddtMdzgKLKH0Ktwo4kfApiHaU36iDadyS9A== +"@nrwl/vite@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/vite/-/vite-15.8.6.tgz#fbcfc6528e89372b85671542a6d317b3877767cd" + integrity sha512-NxMIesHg0ZZ7ZlOaA1SCqtqU01DG7l9oSSGaxiHyuw+9sAMUs4KApczKSFKm1bk3fKtJQwoFFFtsBFLgSPSMSA== dependencies: - "@nrwl/devkit" "15.6.3" - "@nrwl/js" "15.6.3" - "@nrwl/workspace" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/workspace" "15.8.6" "@phenomnomnominal/tsquery" "4.1.1" "@swc/helpers" "^0.4.11" dotenv "~10.0.0" enquirer "~2.3.6" -"@nrwl/web@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-15.6.3.tgz#54d0731c752dc5fc3ec7be2729364b1447fe175e" - integrity sha512-K4qbULw6hiAegDB4YwkPTj9xcWpw4Fj8s+uP7l+/KgTElO5e6phS3iiij3ClDe8AUPliTp/PdzCftiuwwxxM5A== - dependencies: - "@nrwl/cypress" "15.6.3" - "@nrwl/devkit" "15.6.3" - "@nrwl/jest" "15.6.3" - "@nrwl/js" "15.6.3" - "@nrwl/linter" "15.6.3" - "@nrwl/rollup" "15.6.3" - "@nrwl/workspace" "15.6.3" +"@nrwl/web@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/web/-/web-15.8.6.tgz#0bbd385e8146b7ab6781b6676a9e1bd0c407e8bc" + integrity sha512-ih+r1IySduEbNxgFvXip1NLJb6cheC3BiUvqaTPUNiz5c0POAKnGhHOrPMUp0ssXRMlZu0Vo+Fav9lIOorB+/g== + dependencies: + "@nrwl/cypress" "15.8.6" + "@nrwl/devkit" "15.8.6" + "@nrwl/jest" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/linter" "15.8.6" + "@nrwl/rollup" "15.8.6" + "@nrwl/workspace" "15.8.6" chalk "^4.1.0" chokidar "^3.5.1" http-server "^14.1.0" ignore "^5.0.4" tslib "^2.3.0" -"@nrwl/webpack@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-15.6.3.tgz#65b6d68a7a7c8580b8b97e8e4676dba5c5153090" - integrity sha512-/cnUHtMwUE9/FnctI0sQCc9Y/VdS4w15FBSlN1JB+CSF9Sm/CIZ9LzpINGnjqxa+3P2Pz3svx0eyzsBIUFseMA== +"@nrwl/webpack@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/webpack/-/webpack-15.8.6.tgz#ccff684c85558ffc810e7756c613e18f563f237a" + integrity sha512-16enwfGsqf9pr0DuaBUa/XYCDBOeAMF3fgOCah2IDk+YKGx88PVvYXQsf0LH/CiTPKqStWaSOPRzU8SvSSgmUQ== dependencies: - "@nrwl/devkit" "15.6.3" - "@nrwl/js" "15.6.3" - "@nrwl/workspace" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/js" "15.8.6" + "@nrwl/workspace" "15.8.6" autoprefixer "^10.4.9" babel-loader "^9.1.2" chalk "^4.1.0" @@ -2951,15 +3127,13 @@ dotenv "~10.0.0" file-loader "^6.2.0" fork-ts-checker-webpack-plugin "7.2.13" - fs-extra "^11.1.0" ignore "^5.0.4" - less "3.12.2" - less-loader "^11.1.0" + less "4.1.3" + less-loader "11.1.0" license-webpack-plugin "^4.0.2" loader-utils "^2.0.3" mini-css-extract-plugin "~2.4.7" parse5 "4.0.0" - parse5-html-rewriting-stream "6.0.1" postcss "^8.4.14" postcss-import "~14.1.0" postcss-loader "^6.1.1" @@ -2978,33 +3152,29 @@ tslib "^2.3.0" webpack "^5.75.0" webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" webpack-node-externals "^3.0.0" webpack-subresource-integrity "^5.1.0" -"@nrwl/workspace@15.6.3": - version "15.6.3" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-15.6.3.tgz#a9fd3c5692dfaebb04642e4e86d930d144bc2fed" - integrity sha512-RkCmDvcMXCVanR0RS8CZ14D7OMojSyvAal+b37P521MpizDkiN+zdRKewKvyOonzDeTAmZODtYccQ/uM5DjRfQ== +"@nrwl/workspace@15.8.6": + version "15.8.6" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-15.8.6.tgz#38293f137002be9d36f15cb4fb205e334e07f4e6" + integrity sha512-ybD6MNiVovmc4KIV7zKNXf3kZdjgszdG7opaXjDn/D9RauAikqFsXepeotU7fgBzXmSht4kIEXP/oAOPHNQ2vA== dependencies: - "@nrwl/devkit" "15.6.3" - "@nrwl/linter" "15.6.3" + "@nrwl/devkit" "15.8.6" + "@nrwl/linter" "15.8.6" "@parcel/watcher" "2.0.4" chalk "^4.1.0" chokidar "^3.5.1" cli-cursor "3.1.0" cli-spinners "2.6.1" dotenv "~10.0.0" - enquirer "~2.3.6" figures "3.2.0" flat "^5.0.2" - fs-extra "^11.1.0" glob "7.1.4" ignore "^5.0.4" - jsonc-parser "3.2.0" minimatch "3.0.5" npm-run-path "^4.0.1" - nx "15.6.3" + nx "15.8.6" open "^8.4.0" rxjs "^6.5.4" semver "7.3.4" @@ -3530,6 +3700,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.24" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" + integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== + "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -3537,6 +3712,20 @@ dependencies: type-detect "4.0.8" +"@sinonjs/commons@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-2.0.0.tgz#fd4ca5b063554307e8327b4564bd56d3b73924a3" + integrity sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz#d10549ed1f423d80639c528b6c7f5a1017747d0c" + integrity sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw== + dependencies: + "@sinonjs/commons" "^2.0.0" + "@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" @@ -4104,13 +4293,13 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@28.1.8": - version "28.1.8" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.8.tgz#6936409f3c9724ea431efd412ea0238a0f03b09b" - integrity sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw== +"@types/jest@29.4.0": + version "29.4.0" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-29.4.0.tgz#a8444ad1704493e84dbf07bb05990b275b3b9206" + integrity sha512-VaywcGQ9tPorCX/Jkkni7RWGFfI11whqzs8dvxF41P17Z+z872thvEvlIbznjPJ02kl1HMX3LmLOonsj2n7HeQ== dependencies: - expect "^28.0.0" - pretty-format "^28.0.0" + expect "^29.0.0" + pretty-format "^29.0.0" "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" @@ -5235,7 +5424,7 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^28.1.1, babel-jest@^28.1.3: +babel-jest@^28.1.1: version "28.1.3" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== @@ -5248,6 +5437,19 @@ babel-jest@^28.1.1, babel-jest@^28.1.3: graceful-fs "^4.2.9" slash "^3.0.0" +babel-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.5.0.tgz#3fe3ddb109198e78b1c88f9ebdecd5e4fc2f50a5" + integrity sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q== + dependencies: + "@jest/transform" "^29.5.0" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^29.5.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-loader@^9.1.2: version "9.1.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.1.2.tgz#a16a080de52d08854ee14570469905a5fc00d39c" @@ -5286,6 +5488,16 @@ babel-plugin-jest-hoist@^28.1.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" +babel-plugin-jest-hoist@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz#a97db437936f441ec196990c9738d4b88538618a" + integrity sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-macros@^2.8.0: version "2.8.0" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.8.0.tgz#0f958a7cc6556b1e65344465d99111a1e5e10138" @@ -5366,6 +5578,14 @@ babel-preset-jest@^28.1.3: babel-plugin-jest-hoist "^28.1.3" babel-preset-current-node-syntax "^1.0.0" +babel-preset-jest@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz#57bc8cc88097af7ff6a5ab59d1cd29d52a5916e2" + integrity sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg== + dependencies: + babel-plugin-jest-hoist "^29.5.0" + babel-preset-current-node-syntax "^1.0.0" + bail@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/bail/-/bail-2.0.2.tgz#d26f5cd8fe5d6f832a31517b9f7c356040ba6d5d" @@ -6414,6 +6634,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6424,6 +6649,13 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +copy-anything@^2.0.1: + version "2.0.6" + resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" + integrity sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw== + dependencies: + is-what "^3.14.1" + copy-webpack-plugin@^10.2.4: version "10.2.4" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz#6c854be3fdaae22025da34b9112ccf81c63308fe" @@ -6806,7 +7038,7 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, d dependencies: ms "2.1.2" -debug@^3.2.7: +debug@^3.2.6, debug@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== @@ -7048,6 +7280,11 @@ diff-sequences@^28.1.1: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -7205,6 +7442,11 @@ emittery@^0.10.2: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7814,7 +8056,7 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" -expect@^28.0.0, expect@^28.1.3: +expect@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== @@ -7825,6 +8067,17 @@ expect@^28.0.0, expect@^28.1.3: jest-message-util "^28.1.3" jest-util "^28.1.3" +expect@^29.0.0, expect@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.5.0.tgz#68c0509156cb2a0adb8865d413b137eeaae682f7" + integrity sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg== + dependencies: + "@jest/expect-utils" "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + express@^4.17.3: version "4.18.2" resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" @@ -7925,7 +8178,7 @@ fast-json-patch@^3.1.1: resolved "https://registry.yarnpkg.com/fast-json-patch/-/fast-json-patch-3.1.1.tgz#85064ea1b1ebf97a3f7ad01e23f9337e72c66947" integrity sha512-vf6IHUX2SBcA+5/+4883dsIjpBTqmfBjmYiWK1savxQmFk4JfBMLa7ynTYOs1Rolp/T1betJxHiGD3g1Mn8lUQ== -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.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== @@ -9618,6 +9871,11 @@ is-weakset@^2.0.1: call-bind "^1.0.2" get-intrinsic "^1.1.1" +is-what@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1" + integrity sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA== + is-windows@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -9723,15 +9981,15 @@ java-properties@^1.0.0: resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211" integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ== -jest-changed-files@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-28.1.3.tgz#d9aeee6792be3686c47cb988a8eaf82ff4238831" - integrity sha512-esaOfUWJXk2nfZt9SPyC8gA1kNfdKLkQWyzsMlqq8msYSlNKfmZxfRgZn4Cd4MGVUF+7v6dBs0d5TOAKa7iIiA== +jest-changed-files@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.5.0.tgz#e88786dca8bf2aa899ec4af7644e16d9dcf9b23e" + integrity sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag== dependencies: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^28.1.1, jest-circus@^28.1.3: +jest-circus@^28.1.1: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== @@ -9756,21 +10014,47 @@ jest-circus@^28.1.1, jest-circus@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" -jest-cli@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.3.tgz#558b33c577d06de55087b8448d373b9f654e46b2" - integrity sha512-roY3kvrv57Azn1yPgdTebPAXvdR2xfezaKKYzVxZ6It/5NCxzJym6tUI5P1zkdWhfUYkxEI9uZWcQdaFLo8mJQ== +jest-circus@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.5.0.tgz#b5926989449e75bff0d59944bae083c9d7fb7317" + integrity sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA== dependencies: - "@jest/core" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.5.0" + "@jest/expect" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^29.5.0" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-runtime "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + p-limit "^3.1.0" + pretty-format "^29.5.0" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.4.3: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.5.0.tgz#b34c20a6d35968f3ee47a7437ff8e53e086b4a67" + integrity sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw== + dependencies: + "@jest/core" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-config "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" prompts "^2.0.1" yargs "^17.3.1" @@ -9802,31 +10086,31 @@ jest-config@28.1.1: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-config@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.3.tgz#e315e1f73df3cac31447eed8b8740a477392ec60" - integrity sha512-MG3INjByJ0J4AsNBm7T3hsuxKQqFIiRo/AUqb1q9LRKI5UU6Aar9JHbr9Ivn1TVwfUD9KirRoM/T6u8XlcQPHQ== +jest-config@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.5.0.tgz#3cc972faec8c8aaea9ae158c694541b79f3748da" + integrity sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.3" - "@jest/types" "^28.1.3" - babel-jest "^28.1.3" + "@jest/test-sequencer" "^29.5.0" + "@jest/types" "^29.5.0" + babel-jest "^29.5.0" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.3" - jest-environment-node "^28.1.3" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-runner "^28.1.3" - jest-util "^28.1.3" - jest-validate "^28.1.3" + jest-circus "^29.5.0" + jest-environment-node "^29.5.0" + jest-get-type "^29.4.3" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-runner "^29.5.0" + jest-util "^29.5.0" + jest-validate "^29.5.0" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.3" + pretty-format "^29.5.0" slash "^3.0.0" strip-json-comments "^3.1.1" @@ -9840,6 +10124,16 @@ jest-diff@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" +jest-diff@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.5.0.tgz#e0d83a58eb5451dcc1fa61b1c3ee4e8f5a290d63" + integrity sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + jest-docblock@^28.1.1: version "28.1.1" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" @@ -9847,6 +10141,13 @@ jest-docblock@^28.1.1: dependencies: detect-newline "^3.0.0" +jest-docblock@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.4.3.tgz#90505aa89514a1c7dceeac1123df79e414636ea8" + integrity sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg== + dependencies: + detect-newline "^3.0.0" + jest-each@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" @@ -9858,6 +10159,17 @@ jest-each@^28.1.3: jest-util "^28.1.3" pretty-format "^28.1.3" +jest-each@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.5.0.tgz#fc6e7014f83eac68e22b7195598de8554c2e5c06" + integrity sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA== + dependencies: + "@jest/types" "^29.5.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + jest-util "^29.5.0" + pretty-format "^29.5.0" + jest-environment-node@^28.1.1, jest-environment-node@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" @@ -9870,11 +10182,28 @@ jest-environment-node@^28.1.1, jest-environment-node@^28.1.3: jest-mock "^28.1.3" jest-util "^28.1.3" +jest-environment-node@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.5.0.tgz#f17219d0f0cc0e68e0727c58b792c040e332c967" + integrity sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-mock "^29.5.0" + jest-util "^29.5.0" + jest-get-type@^28.0.2: version "28.0.2" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.4.3.tgz#1ab7a5207c995161100b5187159ca82dd48b3dd5" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + jest-haste-map@^28.1.1, jest-haste-map@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" @@ -9894,6 +10223,25 @@ jest-haste-map@^28.1.1, jest-haste-map@^28.1.3: optionalDependencies: fsevents "^2.3.2" +jest-haste-map@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.5.0.tgz#69bd67dc9012d6e2723f20a945099e972b2e94de" + integrity sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA== + dependencies: + "@jest/types" "^29.5.0" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.4.3" + jest-util "^29.5.0" + jest-worker "^29.5.0" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-leak-detector@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" @@ -9902,6 +10250,14 @@ jest-leak-detector@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" +jest-leak-detector@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz#cf4bdea9615c72bac4a3a7ba7e7930f9c0610c8c" + integrity sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow== + dependencies: + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + jest-matcher-utils@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" @@ -9912,6 +10268,16 @@ jest-matcher-utils@^28.1.3: jest-get-type "^28.0.2" pretty-format "^28.1.3" +jest-matcher-utils@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz#d957af7f8c0692c5453666705621ad4abc2c59c5" + integrity sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw== + dependencies: + chalk "^4.0.0" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + pretty-format "^29.5.0" + jest-message-util@^28.1.1, jest-message-util@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" @@ -9927,6 +10293,21 @@ jest-message-util@^28.1.1, jest-message-util@^28.1.3: slash "^3.0.0" stack-utils "^2.0.3" +jest-message-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.5.0.tgz#1f776cac3aca332ab8dd2e3b41625435085c900e" + integrity sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.5.0" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.5.0" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-mock@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" @@ -9935,6 +10316,15 @@ jest-mock@^28.1.3: "@jest/types" "^28.1.3" "@types/node" "*" +jest-mock@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.5.0.tgz#26e2172bcc71d8b0195081ff1f146ac7e1518aed" + integrity sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + jest-util "^29.5.0" + jest-pnp-resolver@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" @@ -9945,13 +10335,18 @@ jest-regex-util@^28.0.2: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve-dependencies@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.3.tgz#8c65d7583460df7275c6ea2791901fa975c1fe66" - integrity sha512-qa0QO2Q0XzQoNPouMbCc7Bvtsem8eQgVPNkwn9LnS+R2n8DaVDPL/U1gngC0LTl1RYXJU0uJa2BMC2DbTfFrHA== +jest-regex-util@^29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.4.3.tgz#a42616141e0cae052cfa32c169945d00c0aa0bb8" + integrity sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg== + +jest-resolve-dependencies@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz#f0ea29955996f49788bf70996052aa98e7befee4" + integrity sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg== dependencies: - jest-regex-util "^28.0.2" - jest-snapshot "^28.1.3" + jest-regex-util "^29.4.3" + jest-snapshot "^29.5.0" jest-resolve@28.1.1: version "28.1.1" @@ -9983,7 +10378,22 @@ jest-resolve@^28.1.1, jest-resolve@^28.1.3: resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^28.1.1, jest-runner@^28.1.3: +jest-resolve@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.5.0.tgz#b053cc95ad1d5f6327f0ac8aae9f98795475ecdc" + integrity sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-pnp-resolver "^1.2.2" + jest-util "^29.5.0" + jest-validate "^29.5.0" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^28.1.1: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== @@ -10010,6 +10420,33 @@ jest-runner@^28.1.1, jest-runner@^28.1.3: p-limit "^3.1.0" source-map-support "0.5.13" +jest-runner@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.5.0.tgz#6a57c282eb0ef749778d444c1d758c6a7693b6f8" + integrity sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ== + dependencies: + "@jest/console" "^29.5.0" + "@jest/environment" "^29.5.0" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.4.3" + jest-environment-node "^29.5.0" + jest-haste-map "^29.5.0" + jest-leak-detector "^29.5.0" + jest-message-util "^29.5.0" + jest-resolve "^29.5.0" + jest-runtime "^29.5.0" + jest-util "^29.5.0" + jest-watcher "^29.5.0" + jest-worker "^29.5.0" + p-limit "^3.1.0" + source-map-support "0.5.13" + jest-runtime@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" @@ -10038,6 +10475,34 @@ jest-runtime@^28.1.3: slash "^3.0.0" strip-bom "^4.0.0" +jest-runtime@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.5.0.tgz#c83f943ee0c1da7eb91fa181b0811ebd59b03420" + integrity sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw== + dependencies: + "@jest/environment" "^29.5.0" + "@jest/fake-timers" "^29.5.0" + "@jest/globals" "^29.5.0" + "@jest/source-map" "^29.4.3" + "@jest/test-result" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^29.5.0" + jest-message-util "^29.5.0" + jest-mock "^29.5.0" + jest-regex-util "^29.4.3" + jest-resolve "^29.5.0" + jest-snapshot "^29.5.0" + jest-util "^29.5.0" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-snapshot@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" @@ -10067,6 +10532,35 @@ jest-snapshot@^28.1.3: pretty-format "^28.1.3" semver "^7.3.5" +jest-snapshot@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.5.0.tgz#c9c1ce0331e5b63cd444e2f95a55a73b84b1e8ce" + integrity sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^29.5.0" + "@jest/transform" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.5.0" + graceful-fs "^4.2.9" + jest-diff "^29.5.0" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.5.0" + jest-message-util "^29.5.0" + jest-util "^29.5.0" + natural-compare "^1.4.0" + pretty-format "^29.5.0" + semver "^7.3.5" + jest-util@28.1.1: version "28.1.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" @@ -10079,7 +10573,7 @@ jest-util@28.1.1: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^28.0.0, jest-util@^28.1.1, jest-util@^28.1.3: +jest-util@^28.1.1, jest-util@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== @@ -10091,6 +10585,18 @@ jest-util@^28.0.0, jest-util@^28.1.1, jest-util@^28.1.3: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-util@^29.0.0, jest-util@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" + integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== + dependencies: + "@jest/types" "^29.5.0" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + jest-validate@^28.1.1, jest-validate@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" @@ -10103,6 +10609,18 @@ jest-validate@^28.1.1, jest-validate@^28.1.3: leven "^3.1.0" pretty-format "^28.1.3" +jest-validate@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.5.0.tgz#8e5a8f36178d40e47138dc00866a5f3bd9916ffc" + integrity sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ== + dependencies: + "@jest/types" "^29.5.0" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^29.4.3" + leven "^3.1.0" + pretty-format "^29.5.0" + jest-watcher@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" @@ -10117,6 +10635,20 @@ jest-watcher@^28.1.3: jest-util "^28.1.3" string-length "^4.0.1" +jest-watcher@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.5.0.tgz#cf7f0f949828ba65ddbbb45c743a382a4d911363" + integrity sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA== + dependencies: + "@jest/test-result" "^29.5.0" + "@jest/types" "^29.5.0" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.5.0" + string-length "^4.0.1" + jest-worker@^27.0.2, jest-worker@^27.4.5: version "27.5.1" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" @@ -10135,15 +10667,25 @@ jest-worker@^28.1.1, jest-worker@^28.1.3: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.3.tgz#e9c6a7eecdebe3548ca2b18894a50f45b36dfc6b" - integrity sha512-N4GT5on8UkZgH0O5LUavMRV1EDEhNTL0KEfRmDIeZHSV7p2XgLoY9t9VDUgL6o+yfdgYHVxuz81G8oB9VG5uyA== +jest-worker@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" + integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== dependencies: - "@jest/core" "^28.1.3" - "@jest/types" "^28.1.3" + "@types/node" "*" + jest-util "^29.5.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@29.4.3: + version "29.4.3" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.4.3.tgz#1b8be541666c6feb99990fd98adac4737e6e6386" + integrity sha512-XvK65feuEFGZT8OO0fB/QAQS+LGHvQpaadkH5p47/j3Ocqq3xf2pK9R+G0GzgfuhXVxEv76qCOOcMb5efLk6PA== + dependencies: + "@jest/core" "^29.4.3" + "@jest/types" "^29.4.3" import-local "^3.0.2" - jest-cli "^28.1.3" + jest-cli "^29.4.3" jju@~1.4.0: version "1.4.0" @@ -10269,7 +10811,7 @@ json5@^2.1.2, json5@^2.2.1: resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== -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== @@ -10375,26 +10917,28 @@ language-tags@^1.0.5: dependencies: language-subtag-registry "^0.3.20" -less-loader@^11.1.0: +less-loader@11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-11.1.0.tgz#a452384259bdf8e4f6d5fdcc39543609e6313f82" integrity sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug== dependencies: klona "^2.0.4" -less@3.12.2: - version "3.12.2" - resolved "https://registry.yarnpkg.com/less/-/less-3.12.2.tgz#157e6dd32a68869df8859314ad38e70211af3ab4" - integrity sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q== +less@4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/less/-/less-4.1.3.tgz#175be9ddcbf9b250173e0a00b4d6920a5b770246" + integrity sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA== dependencies: - tslib "^1.10.0" + copy-anything "^2.0.1" + parse-node-version "^1.0.1" + tslib "^2.3.0" optionalDependencies: errno "^0.1.1" graceful-fs "^4.1.2" image-size "~0.5.0" make-dir "^2.1.0" mime "^1.4.1" - native-request "^1.0.5" + needle "^3.1.0" source-map "~0.6.0" leven@^3.1.0: @@ -11969,11 +12513,6 @@ napi-build-utils@^1.0.1: resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== -native-request@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/native-request/-/native-request-1.1.0.tgz#acdb30fe2eefa3e1bc8c54b3a6852e9c5c0d3cb0" - integrity sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw== - natural-compare-lite@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz#17b09581988979fddafe0201e931ba933c96cbb4" @@ -11984,6 +12523,15 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +needle@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/needle/-/needle-3.2.0.tgz#07d240ebcabfd65c76c03afae7f6defe6469df44" + integrity sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ== + dependencies: + debug "^3.2.6" + iconv-lite "^0.6.3" + sax "^1.2.4" + negotiator@0.6.3, negotiator@^0.6.2, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" @@ -12611,13 +13159,13 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== -nx@15.6.3: - version "15.6.3" - resolved "https://registry.yarnpkg.com/nx/-/nx-15.6.3.tgz#900087bce38c6e5975660c23ebd41ead1bf54f98" - integrity sha512-3t0A0GPLNen1yPAyE+VGZ3nkAzZYb5nfXtAcx8SHBlKq4u42yBY3khBmP1y4Og3jhIwFIj7J7Npeh8ZKrthmYQ== +nx@15.8.6: + version "15.8.6" + resolved "https://registry.yarnpkg.com/nx/-/nx-15.8.6.tgz#ffe9a32b0c4614ec25d7308e3a37455dc386d29f" + integrity sha512-3OsT6HMyyUyRuP07vLr7iuWzqziQvkh/vSfOWQb3PXakm6N1IvaLxF+NuUCtSaBDUACfqoVO4MC7WE2270OrKQ== dependencies: - "@nrwl/cli" "15.6.3" - "@nrwl/tao" "15.6.3" + "@nrwl/cli" "15.8.6" + "@nrwl/tao" "15.8.6" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18" @@ -12651,6 +13199,16 @@ nx@15.6.3: v8-compile-cache "2.3.0" yargs "^17.6.2" yargs-parser "21.1.1" + optionalDependencies: + "@nrwl/nx-darwin-arm64" "15.8.6" + "@nrwl/nx-darwin-x64" "15.8.6" + "@nrwl/nx-linux-arm-gnueabihf" "15.8.6" + "@nrwl/nx-linux-arm64-gnu" "15.8.6" + "@nrwl/nx-linux-arm64-musl" "15.8.6" + "@nrwl/nx-linux-x64-gnu" "15.8.6" + "@nrwl/nx-linux-x64-musl" "15.8.6" + "@nrwl/nx-win32-arm64-msvc" "15.8.6" + "@nrwl/nx-win32-x64-msvc" "15.8.6" oauth-sign@~0.9.0: version "0.9.0" @@ -13056,6 +13614,11 @@ parse-json@^5.0.0, parse-json@^5.2.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" +parse-node-version@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/parse-node-version/-/parse-node-version-1.0.1.tgz#e2b5dbede00e7fa9bc363607f53327e8b073189b" + integrity sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA== + parse-numeric-range@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" @@ -13080,31 +13643,11 @@ parse-url@^8.1.0: dependencies: parse-path "^7.0.0" -parse5-html-rewriting-stream@6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz#de1820559317ab4e451ea72dba05fddfd914480b" - integrity sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg== - dependencies: - parse5 "^6.0.1" - parse5-sax-parser "^6.0.1" - -parse5-sax-parser@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz#98b4d366b5b266a7cd90b4b58906667af882daba" - integrity sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg== - dependencies: - parse5 "^6.0.1" - parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" integrity sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA== -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - parse5@^7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" @@ -13622,7 +14165,7 @@ pretty-format@^27.0.2, pretty-format@^27.5.1: ansi-styles "^5.0.0" react-is "^17.0.1" -pretty-format@^28.0.0, pretty-format@^28.1.1, pretty-format@^28.1.3: +pretty-format@^28.1.1, pretty-format@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== @@ -13632,6 +14175,15 @@ pretty-format@^28.0.0, pretty-format@^28.1.1, pretty-format@^28.1.3: ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^29.0.0, pretty-format@^29.5.0: + version "29.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.5.0.tgz#283134e74f70e2e3e7229336de0e4fce94ccde5a" + integrity sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw== + dependencies: + "@jest/schemas" "^29.4.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + proc-log@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-1.0.0.tgz#0d927307401f69ed79341e83a0b2c9a13395eb77" @@ -13760,6 +14312,11 @@ punycode@^2.1.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== +pure-rand@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.0.0.tgz#701996ceefa253507923a0e864c17ab421c04a7c" + integrity sha512-rLSBxJjP+4DQOgcJAx6RZHT2he2pkhQdSnofG5VWyVl6GRq/K02ISOuOLcsMOrtKDIJb8JN2zm3FFzWNbezdPw== + q@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -14338,6 +14895,11 @@ resolve.exports@1.1.0, resolve.exports@^1.1.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== +resolve.exports@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.1.tgz#cee884cd4e3f355660e501fa3276b27d7ffe5a20" + integrity sha512-OEJWVeimw8mgQuj3HfkNl4KqRevH7lzeQNaWRPfx0PPse7Jk6ozcsG4FKVgtzDsC1KUF+YlTHh17NcgHOPykLw== + resolve@^1.1.7, resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.22.1, resolve@~1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" @@ -14559,7 +15121,7 @@ sass@^1.42.1: immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" -sax@~1.2.4: +sax@^1.2.4, sax@~1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== @@ -15903,15 +16465,15 @@ trough@^2.0.0: resolved "https://registry.yarnpkg.com/trough/-/trough-2.1.0.tgz#0f7b511a4fde65a46f18477ab38849b22c554876" integrity sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g== -ts-jest@28.0.8: - version "28.0.8" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.8.tgz#cd204b8e7a2f78da32cf6c95c9a6165c5b99cc73" - integrity sha512-5FaG0lXmRPzApix8oFG8RKjAz4ehtm8yMKOTy5HX3fY6W8kmvOrmcY0hKDElW52FJov+clhUbrKAqofnj4mXTg== +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 "^28.0.0" - json5 "^2.2.1" + jest-util "^29.0.0" + json5 "^2.2.3" lodash.memoize "4.x" make-error "1.x" semver "7.x" @@ -15987,7 +16549,7 @@ tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -16100,16 +16662,21 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@4.8.4, typescript@~4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@4.9.5: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^4.6.4: version "4.9.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + ufo@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ufo/-/ufo-1.0.1.tgz#64ed43b530706bda2e4892f911f568cf4cf67d29" @@ -16944,7 +17511,7 @@ write-file-atomic@^3.0.3: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: +write-file-atomic@^4.0.0, write-file-atomic@^4.0.1, write-file-atomic@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== From 5b1615aa7cf41251f20b01a99202a38a94141572 Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Fri, 10 Mar 2023 21:34:13 -0700 Subject: [PATCH 4/7] chore(redux): added vitest & dev test config --- package.json | 3 +-- packages/redux/project.json | 6 ++++++ packages/redux/tests/dev.spec.ts | 5 +++++ packages/redux/vite.config.ts | 1 + yarn.lock | 14 +++++++++----- 5 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 packages/redux/tests/dev.spec.ts diff --git a/package.json b/package.json index 3a122c1..a9bfbc9 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "@typescript-eslint/parser": "5.42.0", "@vitejs/plugin-react": "^3.0.1", "@vitest/coverage-c8": "~0.25.8", - "@vitest/ui": "^0.25.8", + "@vitest/ui": "^0.29.2", "commitizen": "^4.3.0", "css-loader": "^6.4.0", "eslint": "8.15.0", @@ -123,4 +123,3 @@ } } } - diff --git a/packages/redux/project.json b/packages/redux/project.json index 6059f9d..e096f3e 100644 --- a/packages/redux/project.json +++ b/packages/redux/project.json @@ -42,6 +42,12 @@ "options": { "passWithNoTests": true, "reportsDirectory": "../../coverage/packages/redux" + }, + "configurations": { + "dev": { + "watch": true, + "ui": true + } } }, "lint": { diff --git a/packages/redux/tests/dev.spec.ts b/packages/redux/tests/dev.spec.ts new file mode 100644 index 0000000..8161d1f --- /dev/null +++ b/packages/redux/tests/dev.spec.ts @@ -0,0 +1,5 @@ +describe('it', () => { + it('should work', () => { + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/redux/vite.config.ts b/packages/redux/vite.config.ts index 2aa41ef..e251aff 100644 --- a/packages/redux/vite.config.ts +++ b/packages/redux/vite.config.ts @@ -65,5 +65,6 @@ export default defineConfig({ }, environment: 'jsdom', include: ['tests/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + reporters: ['default', 'html'], }, }); diff --git a/yarn.lock b/yarn.lock index c91fea2..0c7c7ac 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4743,11 +4743,15 @@ dependencies: tinyspy "^1.0.2" -"@vitest/ui@^0.25.8": - version "0.25.8" - resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-0.25.8.tgz#c97f25cd5ca8e9c0294326657420c9a047540297" - integrity sha512-wfuhghldD5QHLYpS46GK8Ru8P3XcMrWvFjRQD21KNzc9Y/qtJsqoC8KmT6xWVkMNw4oHYixpo3a4ZySRJdserw== +"@vitest/ui@^0.29.2": + version "0.29.2" + resolved "https://registry.yarnpkg.com/@vitest/ui/-/ui-0.29.2.tgz#b5c9d6e7c98163a5136c91760a602cf61edc473b" + integrity sha512-GpCExCMptrS1z3Xf6kz35Xdvjc2eTBy9OIIwW3HjePVxw9Q++ZoEaIBVimRTTGzSe40XiAI/ZyR0H0Ya9brqLA== dependencies: + fast-glob "^3.2.12" + flatted "^3.2.7" + pathe "^1.1.0" + picocolors "^1.0.0" sirv "^2.0.2" "@vitest/utils@0.28.3": @@ -8345,7 +8349,7 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: +flatted@^3.1.0, flatted@^3.2.7: version "3.2.7" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== From 10b612e3b5281ce474360a96ac3e853771ab4828 Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Sat, 11 Mar 2023 12:46:52 -0700 Subject: [PATCH 5/7] fix(redux): setup tests + addressing the issue with trracked slice appearing --- package.json | 2 + .../redux/src/slice/trrackableSliceCreator.ts | 480 ++++++++-------- packages/redux/src/slice/types.ts | 110 ++-- .../redux/src/store/trrackableStoreCreator.ts | 523 ++++++++++-------- packages/redux/src/store/types.ts | 31 +- packages/redux/tests/api/client.ts | 49 ++ packages/redux/tests/api/server.ts | 80 +++ packages/redux/tests/async.spec.ts | 5 + packages/redux/tests/dev.spec.ts | 5 - packages/redux/tests/index.spec.ts | 4 +- packages/redux/tests/slices/counter.ts | 60 ++ packages/redux/tests/slices/posts.ts | 94 ++++ packages/redux/tests/slices/users.ts | 48 ++ packages/redux/tests/slices/utils.ts | 9 + .../redux/tests/store/fullyTrrackableStore.ts | 17 + .../tests/store/partiallyTrrackableStore.ts | 18 + packages/redux/tests/trracked.spec.ts | 86 +++ packages/redux/tests/untrracked.spec.ts | 49 ++ packages/redux/vite.config.ts | 1 + yarn.lock | 266 ++++++++- 20 files changed, 1380 insertions(+), 557 deletions(-) create mode 100644 packages/redux/tests/api/client.ts create mode 100644 packages/redux/tests/api/server.ts create mode 100644 packages/redux/tests/async.spec.ts delete mode 100644 packages/redux/tests/dev.spec.ts create mode 100644 packages/redux/tests/slices/counter.ts create mode 100644 packages/redux/tests/slices/posts.ts create mode 100644 packages/redux/tests/slices/users.ts create mode 100644 packages/redux/tests/slices/utils.ts create mode 100644 packages/redux/tests/store/fullyTrrackableStore.ts create mode 100644 packages/redux/tests/store/partiallyTrrackableStore.ts create mode 100644 packages/redux/tests/trracked.spec.ts create mode 100644 packages/redux/tests/untrracked.spec.ts diff --git a/package.json b/package.json index a9bfbc9..7457ff6 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "@mantine/core": "^4.2.12", "@mantine/hooks": "^4.2.12", + "@mswjs/data": "^0.11.2", "@nrwl/next": "15.8.6", "@reduxjs/toolkit": "^1.9.1", "@swc/helpers": "^0.4.0", @@ -24,6 +25,7 @@ "clsx": "^1.2.1", "core-js": "^3.6.5", "fast-json-patch": "^3.1.1", + "msw": "^1.1.0", "next": "13.1.1", "nextra": "^2.0.1", "nextra-theme-docs": "^2.0.1", diff --git a/packages/redux/src/slice/trrackableSliceCreator.ts b/packages/redux/src/slice/trrackableSliceCreator.ts index 96c891d..a6ac9a1 100644 --- a/packages/redux/src/slice/trrackableSliceCreator.ts +++ b/packages/redux/src/slice/trrackableSliceCreator.ts @@ -1,268 +1,272 @@ import { - AsyncThunk, - CaseReducerActions, - createSlice, - CreateSliceOptions, - PayloadAction, - PayloadActionCreator, - Slice, - SliceCaseReducers, + AsyncThunk, + CaseReducerActions, + createSlice, + CreateSliceOptions, + PayloadAction, + PayloadActionCreator, + Slice, + SliceCaseReducers, } from '@reduxjs/toolkit'; import { - ACTION_NAME_TYPE_MAP, - ActionNameToTypeMap, - ASYNC_THUNKS, - DO_UNDO_ACTION_CREATORS, - DoUndoActionCreators, - EVENTS, - GeneratedDoUndoActionCreators, - LabelGenerators, - LabelLike, - LABELS, - NO_OP_ACTION, - ReducerEventTypes, - TRRACKABLE, - TrrackableSlice, + ACTION_NAME_TYPE_MAP, + ActionNameToTypeMap, + ASYNC_THUNKS, + DO_UNDO_ACTION_CREATORS, + DoUndoActionCreators, + EVENTS, + GeneratedDoUndoActionCreators, + LabelGenerators, + LabelLike, + LABELS, + NO_OP_ACTION, + ReducerEventTypes, + TRRACKABLE, + TrrackableSlice, } from './types'; /* eslint-disable @typescript-eslint/no-explicit-any */ function createNameToTypeMap< - CaseReducers extends SliceCaseReducers, - S extends Slice + CaseReducers extends SliceCaseReducers, + S extends Slice >(slice: S) { - const actionNameToType = {} as ActionNameToTypeMap; - - Object.entries(slice.actions).forEach( - ([key, action]: [ - keyof CaseReducerActions, - PayloadActionCreator - ]) => { - actionNameToType[key] = - action.type as ActionNameToTypeMap[typeof key]; - } - ); - - return actionNameToType; + const actionNameToType = {} as ActionNameToTypeMap; + + Object.entries(slice.actions).forEach( + ([key, action]: [ + keyof CaseReducerActions, + PayloadActionCreator + ]) => { + actionNameToType[key] = + action.type as ActionNameToTypeMap[typeof key]; + } + ); + + return actionNameToType; } function normalizeLabelGenerators< - CaseReducers extends SliceCaseReducers, - S extends Slice + CaseReducers extends SliceCaseReducers, + S extends Slice >( - slice: S, - suppliedLabelLikes: LabelLike, - thunks: Array> + slice: S, + suppliedLabelLikes: LabelLike, + thunks: Array> ): LabelGenerators { - const labelGenerators: LabelGenerators = {}; - - thunks.forEach((thunk) => { - const key = thunk.typePrefix; - const suppliedLabelLike = suppliedLabelLikes[key]; - - if (!suppliedLabelLike) { - labelGenerators[key] = () => key; - return; - } - - if (typeof suppliedLabelLike === 'string') { - labelGenerators[key] = () => suppliedLabelLike; - return; - } - - if (typeof suppliedLabelLike === 'function') { - labelGenerators[key] = suppliedLabelLike; - } - - throw new Error(`Error creating label generator for ${key.toString()}`); - }); - - Object.entries(slice.actions).forEach( - ([key, action]: [ - keyof CaseReducerActions, - PayloadActionCreator - ]) => { - const suppliedLabelLike = suppliedLabelLikes[key]; - - if (!suppliedLabelLike) { - labelGenerators[action.type] = () => action.type; - return; - } - - if (typeof suppliedLabelLike === 'string') { - labelGenerators[action.type] = () => suppliedLabelLike; - return; - } - - if (typeof suppliedLabelLike === 'function') { - labelGenerators[action.type] = suppliedLabelLike; - return; - } - - throw new Error( - `Error creating label generator for ${key.toString()}: ${action.type}` - ); - } - ); - - return labelGenerators; + const labelGenerators: LabelGenerators = {}; + + thunks.forEach((thunk) => { + const key = thunk.typePrefix; + const suppliedLabelLike = suppliedLabelLikes[key]; + + if (!suppliedLabelLike) { + labelGenerators[key] = () => key; + return; + } + + if (typeof suppliedLabelLike === 'string') { + labelGenerators[key] = () => suppliedLabelLike; + return; + } + + if (typeof suppliedLabelLike === 'function') { + labelGenerators[key] = suppliedLabelLike; + } + + throw new Error(`Error creating label generator for ${key.toString()}`); + }); + + Object.entries(slice.actions).forEach( + ([key, action]: [ + keyof CaseReducerActions, + PayloadActionCreator + ]) => { + const suppliedLabelLike = suppliedLabelLikes[key]; + + if (!suppliedLabelLike) { + labelGenerators[action.type] = () => action.type; + return; + } + + if (typeof suppliedLabelLike === 'string') { + labelGenerators[action.type] = () => suppliedLabelLike; + return; + } + + if (typeof suppliedLabelLike === 'function') { + labelGenerators[action.type] = suppliedLabelLike; + return; + } + + throw new Error( + `Error creating label generator for ${key.toString()}: ${ + action.type + }` + ); + } + ); + + return labelGenerators; } function createReducerEventTypes< - Event extends string, - CaseReducers extends SliceCaseReducers, - S extends Slice + Event extends string, + CaseReducers extends SliceCaseReducers, + S extends Slice >( - slice: S, - suppliedEventTypes: Partial>, - thunks: Array> + slice: S, + suppliedEventTypes: Partial>, + thunks: Array> ): ReducerEventTypes { - const reducerEventTypes: any = {}; - - thunks.forEach((thunk) => { - const key = thunk.typePrefix; - const suppliedEventType = suppliedEventTypes[key]; - - if (!suppliedEventType) { - reducerEventTypes[key] = key; - } else { - reducerEventTypes[key] = suppliedEventType; - } - }); - - Object.entries(slice.actions).forEach( - ([key, action]: [ - keyof CaseReducerActions, - PayloadActionCreator - ]) => { - const suppliedEventType = suppliedEventTypes[key]; - - if (!suppliedEventType) reducerEventTypes[action.type] = action.type; - else reducerEventTypes[action.type] = suppliedEventType; - } - ); - - return reducerEventTypes as ReducerEventTypes; + const reducerEventTypes: any = {}; + + thunks.forEach((thunk) => { + const key = thunk.typePrefix; + const suppliedEventType = suppliedEventTypes[key]; + + if (!suppliedEventType) { + reducerEventTypes[key] = key; + } else { + reducerEventTypes[key] = suppliedEventType; + } + }); + + Object.entries(slice.actions).forEach( + ([key, action]: [ + keyof CaseReducerActions, + PayloadActionCreator + ]) => { + const suppliedEventType = suppliedEventTypes[key]; + + if (!suppliedEventType) + reducerEventTypes[action.type] = action.type; + else reducerEventTypes[action.type] = suppliedEventType; + } + ); + + return reducerEventTypes as ReducerEventTypes; } function createDoUndoActionCreators< - State, - CaseReducers extends SliceCaseReducers + State, + CaseReducers extends SliceCaseReducers >( - slice: Slice, - suppliedDoUndoActionCreators: DoUndoActionCreators, - thunks: Array> + slice: Slice, + suppliedDoUndoActionCreators: DoUndoActionCreators, + thunks: Array> ): GeneratedDoUndoActionCreators { - const duac: GeneratedDoUndoActionCreators = {}; - - thunks.forEach((thunk) => { - const key = thunk.typePrefix; - - const suppliedDoUndoActionCreator = suppliedDoUndoActionCreators[key]; - - if (!suppliedDoUndoActionCreator) { - const act = () => { - return { - do: NO_OP_ACTION(), - undo: NO_OP_ACTION(), - }; - }; - duac[key] = act; - } else { - const act = (args: { - action: PayloadAction; - previousState: State; - currentState: State; - }) => { - const { do: doAct, undo } = suppliedDoUndoActionCreator(args); - - return { - do: doAct ? doAct : NO_OP_ACTION(), - undo, - }; - }; - - duac[key] = act; - } - }); - - Object.entries(slice.actions).forEach( - >([key, action]: [ - K, - Exclude[K], void> - ]) => { - const suppliedDoUndoActionCreator = - suppliedDoUndoActionCreators[key as string]; - if (!suppliedDoUndoActionCreator) { - duac[action.type] = () => { - return { - do: NO_OP_ACTION(), - undo: NO_OP_ACTION(), - }; - }; - } else { - duac[action.type] = (args: { - action: PayloadAction; - previousState: State; - currentState: State; - }) => { - const { do: doAct, undo } = suppliedDoUndoActionCreator(args); - - return { - do: doAct ? doAct : NO_OP_ACTION(), - undo, - }; - }; - } - } - ); - - return duac; + const duac: GeneratedDoUndoActionCreators = {}; + + thunks.forEach((thunk) => { + const key = thunk.typePrefix; + + const suppliedDoUndoActionCreator = suppliedDoUndoActionCreators[key]; + + if (!suppliedDoUndoActionCreator) { + const act = () => { + return { + do: NO_OP_ACTION(), + undo: NO_OP_ACTION(), + }; + }; + duac[key] = act; + } else { + const act = (args: { + action: PayloadAction; + previousState: State; + currentState: State; + }) => { + const { do: doAct, undo } = suppliedDoUndoActionCreator(args); + + return { + do: doAct ? doAct : NO_OP_ACTION(), + undo, + }; + }; + + duac[key] = act; + } + }); + + Object.entries(slice.actions).forEach( + >([key, action]: [ + K, + Exclude[K], void> + ]) => { + const suppliedDoUndoActionCreator = + suppliedDoUndoActionCreators[key as string]; + if (!suppliedDoUndoActionCreator) { + duac[action.type] = () => { + return { + do: NO_OP_ACTION(), + undo: NO_OP_ACTION(), + }; + }; + } else { + duac[action.type] = (args: { + action: PayloadAction; + previousState: State; + currentState: State; + }) => { + const { do: doAct, undo } = + suppliedDoUndoActionCreator(args); + + return { + do: doAct ? doAct : NO_OP_ACTION(), + undo, + }; + }; + } + } + ); + + return duac; } export function createTrrackableSlice< - State, - CaseReducers extends SliceCaseReducers, - Event extends string = string, - Name extends string = string + State, + CaseReducers extends SliceCaseReducers, + Event extends string = string, + Name extends string = string >( - options: CreateSliceOptions & { - labels?: LabelLike; - reducerEventTypes?: Partial>; - doUndoActionCreators?: DoUndoActionCreators; - asyncThunks?: Array>; - } + options: CreateSliceOptions & { + labels?: LabelLike; + reducerEventTypes?: Partial>; + doUndoActionCreators?: DoUndoActionCreators; + asyncThunks?: Array>; + } ): TrrackableSlice { - const slice = createSlice(options); - - const actionNameToType: ActionNameToTypeMap = - createNameToTypeMap(slice); - - const labels = normalizeLabelGenerators( - slice, - options.labels || {}, - options.asyncThunks || [] - ); - - const reducerEventTypes = createReducerEventTypes( - slice, - options.reducerEventTypes || {}, - options.asyncThunks || [] - ); - - const doUndoActioncreators = createDoUndoActionCreators( - slice, - options.doUndoActionCreators || {}, - options.asyncThunks || [] - ); - - return { - ...slice, - [LABELS]: labels, - [EVENTS]: reducerEventTypes, - [DO_UNDO_ACTION_CREATORS]: doUndoActioncreators, - [TRRACKABLE]: true, - [ACTION_NAME_TYPE_MAP]: actionNameToType, - [ASYNC_THUNKS]: options.asyncThunks || [], - }; + const slice = createSlice(options); + + const actionNameToType: ActionNameToTypeMap = + createNameToTypeMap(slice); + + const labels = normalizeLabelGenerators( + slice, + options.labels || {}, + options.asyncThunks || [] + ); + + const reducerEventTypes = createReducerEventTypes( + slice, + options.reducerEventTypes || {}, + options.asyncThunks || [] + ); + + const doUndoActioncreators = createDoUndoActionCreators( + slice, + options.doUndoActionCreators || {}, + options.asyncThunks || [] + ); + + return { + ...slice, + [LABELS]: labels, + [EVENTS]: reducerEventTypes, + [DO_UNDO_ACTION_CREATORS]: doUndoActioncreators, + [TRRACKABLE]: true, + [ACTION_NAME_TYPE_MAP]: actionNameToType, + [ASYNC_THUNKS]: options.asyncThunks || [], + }; } diff --git a/packages/redux/src/slice/types.ts b/packages/redux/src/slice/types.ts index b557ddb..d3b68c3 100644 --- a/packages/redux/src/slice/types.ts +++ b/packages/redux/src/slice/types.ts @@ -1,36 +1,36 @@ import { - ActionCreatorWithPayload, - AsyncThunk, - CaseReducerActions, - createAction, - PayloadAction, - PayloadActionCreator, - Slice, - SliceCaseReducers, + ActionCreatorWithPayload, + AsyncThunk, + CaseReducerActions, + createAction, + PayloadAction, + PayloadActionCreator, + Slice, + SliceCaseReducers, } from '@reduxjs/toolkit'; import { Label, LabelGenerator } from '@trrack/core'; export type LabelLike> = Partial<{ - [K in keyof CaseReducerActions]: CaseReducerActions< - CaseReducers, - any - >[K] extends PayloadActionCreator - ? Label | LabelGenerator

- : never; + [K in keyof CaseReducerActions]: CaseReducerActions< + CaseReducers, + any + >[K] extends PayloadActionCreator + ? Label | LabelGenerator

+ : never; }>; export type LabelGenerators = { - [key: string]: LabelGenerator; + [key: string]: LabelGenerator; }; /** * Events */ export type ReducerEventTypes< - Event extends string, - CaseReducers extends SliceCaseReducers + Event extends string, + CaseReducers extends SliceCaseReducers > = { - [K in keyof CaseReducerActions]: Event; + [K in keyof CaseReducerActions]: Event; }; /** @@ -38,15 +38,15 @@ export type ReducerEventTypes< */ export type ActionNameToTypeMap< - CaseReducers extends SliceCaseReducers, - CRA extends CaseReducerActions = CaseReducerActions< - CaseReducers, - any - > + CaseReducers extends SliceCaseReducers, + CRA extends CaseReducerActions = CaseReducerActions< + CaseReducers, + any + > > = { - [K in keyof CRA]: CRA[K] extends ActionCreatorWithPayload - ? T - : never; + [K in keyof CRA]: CRA[K] extends ActionCreatorWithPayload + ? T + : never; }; /** @@ -57,32 +57,32 @@ export const NO_OP_ACTION = createAction('NO_OP'); type NoOpActionType = typeof NO_OP_ACTION; type DoUndoActionCreator< - Payload, - DoPayload = Payload, - UndoPayload = DoPayload + Payload, + DoPayload = Payload, + UndoPayload = DoPayload > = (args: { - action: PayloadAction; - currentState: any; - previousState: any; + action: PayloadAction; + currentState: any; + previousState: any; }) => { - do?: NoOpActionType | PayloadAction; - undo: NoOpActionType | PayloadAction; + do?: NoOpActionType | PayloadAction; + undo: NoOpActionType | PayloadAction; }; export type DoUndoActionCreators> = - Partial<{ - [key: string]: DoUndoActionCreator; - // [K in keyof CaseReducerActions]: CaseReducerActions[K] extends PayloadActionCreator< - // infer P - // > - // ? DoUndoActionCreator - // : never; - }>; + Partial<{ + [key: string]: DoUndoActionCreator; + // [K in keyof CaseReducerActions]: CaseReducerActions[K] extends PayloadActionCreator< + // infer P + // > + // ? DoUndoActionCreator + // : never; + }>; export type GeneratedDoUndoActionCreators = { - [key: string]: ( - args: Parameters>[0] - ) => Required>>; + [key: string]: ( + args: Parameters>[0] + ) => Required>>; }; export const LABELS = Symbol('label'); @@ -93,15 +93,15 @@ export const ACTION_NAME_TYPE_MAP = Symbol('action_name_type_map'); export const ASYNC_THUNKS = Symbol('async_thunks'); export type TrrackableSlice< - State, - CaseReducers extends SliceCaseReducers, - Event extends string = string, - Name extends string = string + State = any, + CaseReducers extends SliceCaseReducers = SliceCaseReducers, + Event extends string = string, + Name extends string = string > = Slice & { - [LABELS]: LabelGenerators; - [EVENTS]: ReducerEventTypes; - [TRRACKABLE]: boolean; - [DO_UNDO_ACTION_CREATORS]: GeneratedDoUndoActionCreators; - [ACTION_NAME_TYPE_MAP]: ActionNameToTypeMap; - [ASYNC_THUNKS]: Array>; + [LABELS]: LabelGenerators; + [EVENTS]: ReducerEventTypes; + [TRRACKABLE]: boolean; + [DO_UNDO_ACTION_CREATORS]: GeneratedDoUndoActionCreators; + [ACTION_NAME_TYPE_MAP]: ActionNameToTypeMap; + [ASYNC_THUNKS]: Array>; }; diff --git a/packages/redux/src/store/trrackableStoreCreator.ts b/packages/redux/src/store/trrackableStoreCreator.ts index abdd2ed..f1a2439 100644 --- a/packages/redux/src/store/trrackableStoreCreator.ts +++ b/packages/redux/src/store/trrackableStoreCreator.ts @@ -1,297 +1,336 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { - Action, - AnyAction, - AsyncThunk, - combineReducers, - configureStore, - ConfigureStoreOptions, - createAction, - createListenerMiddleware, - isAnyOf, - isAsyncThunkAction, - isFulfilled, - PayloadAction, - PayloadActionCreator, - Reducer, - Slice, - SliceCaseReducers, - TypedStartListening, + Action, + AnyAction, + AsyncThunk, + combineReducers, + configureStore, + ConfigureStoreOptions, + createAction, + createListenerMiddleware, + isAnyOf, + isAsyncThunkAction, + isFulfilled, + PayloadAction, + PayloadActionCreator, + Reducer, + Slice, + SliceCaseReducers, + TypedStartListening, } from '@reduxjs/toolkit'; import { initializeTrrack, Registry } from '@trrack/core'; import { isSliceTrrackable } from '../slice'; import { - ACTION_NAME_TYPE_MAP, - ASYNC_THUNKS, - DO_UNDO_ACTION_CREATORS, - GeneratedDoUndoActionCreators, - LabelGenerators, - LABELS, - NO_OP_ACTION, + ACTION_NAME_TYPE_MAP, + ASYNC_THUNKS, + DO_UNDO_ACTION_CREATORS, + GeneratedDoUndoActionCreators, + LabelGenerators, + LABELS, + NO_OP_ACTION, + TrrackableSlice, } from '../slice/types'; import { changeCurrent, getTrrackStore } from './trrackStore'; +import { Trrackable } from './types'; // Fin. export const trrackTraverseAction = createAction('traverse', function prepare< - T + T >(state: T) { - return { - payload: state, - }; + return { + payload: state, + }; }); function isTraverseAction( - action: AnyAction + action: AnyAction ): action is ReturnType { - return action.type === trrackTraverseAction.type; + return action.type === trrackTraverseAction.type; } function makeTrrackable( - reducer: Reducer + reducer: Reducer ) { - return function (state: State | undefined, action: A) { - if (isTraverseAction(action)) - return reducer(action.payload as State, action); - return reducer(state, action); - }; + return function (state: State | undefined, action: A) { + if (isTraverseAction(action)) + return reducer(action.payload as State, action); + return reducer(state, action); + }; } function mergeLabels(slices: Slice[]) { - return slices.reduce((acc, slice) => { - if (isSliceTrrackable(slice)) { - return { ...acc, ...slice[LABELS] }; - } - return acc; - }, {} as LabelGenerators); + return slices.reduce((acc, slice) => { + if (isSliceTrrackable(slice)) { + return { ...acc, ...slice[LABELS] }; + } + return acc; + }, {} as LabelGenerators); } function mergeDoUndoActionCreators(slices: Slice[]) { - return slices.reduce((acc, slice) => { - if (isSliceTrrackable(slice)) { - return { ...acc, ...slice[DO_UNDO_ACTION_CREATORS] }; - } - return acc; - }, {} as GeneratedDoUndoActionCreators); + return slices.reduce((acc, slice) => { + if (isSliceTrrackable(slice)) { + return { ...acc, ...slice[DO_UNDO_ACTION_CREATORS] }; + } + return acc; + }, {} as GeneratedDoUndoActionCreators); } function mergeReducerEventTypes(slices: Slice[]) { - return slices.reduce((acc, slice) => { - if (isSliceTrrackable(slice)) { - return { ...acc, ...slice[ACTION_NAME_TYPE_MAP] }; - } - return acc; - }, {} as { [key: string]: string }); + return slices.reduce((acc, slice) => { + if (isSliceTrrackable(slice)) { + return { ...acc, ...slice[ACTION_NAME_TYPE_MAP] }; + } + return acc; + }, {} as { [key: string]: string }); } function mergeAsyncThunks(slices: Slice[]) { - return slices.reduce((acc, slice) => { - if (isSliceTrrackable(slice)) { - const asyncs: { [key: string]: AsyncThunk } = {}; - - slice[ASYNC_THUNKS].forEach((thunk) => { - asyncs[thunk.typePrefix] = thunk; - asyncs[thunk.fulfilled.type] = thunk; - }); - - return { ...acc, ...asyncs }; - } - return acc; - }, {} as { [key: string]: AsyncThunk }); + return slices.reduce((acc, slice) => { + if (isSliceTrrackable(slice)) { + const asyncs: { [key: string]: AsyncThunk } = {}; + + slice[ASYNC_THUNKS].forEach((thunk) => { + asyncs[thunk.typePrefix] = thunk; + asyncs[thunk.fulfilled.type] = thunk; + }); + + return { ...acc, ...asyncs }; + } + return acc; + }, {} as { [key: string]: AsyncThunk }); } function mergeTrrackedActions(slices: Slice[]) { - return slices.reduce((acc, slice) => { - if (isSliceTrrackable(slice)) { - return [ - ...acc, - ...(Object.values(slice.actions) as Array), - ]; - } - return acc; - }, [] as Array); + return slices.reduce((acc, slice) => { + if (isSliceTrrackable(slice)) { + return [ + ...acc, + ...(Object.values( + slice.actions + ) as Array), + ]; + } + return acc; + }, [] as Array); } -function mergeReducers(slices: Slice[]) { - return slices.reduce((acc, slice) => { - const scr: SliceCaseReducers = {}; +function mergeReducers(sliceMap: SliceMap) { + const slices = Object.values(sliceMap) as Slice[]; + return slices.reduce((acc, slice) => { + const scr: SliceCaseReducers = { + [slice.name]: slice.reducer, + }; - Object.entries(slice.actions).forEach(([key, action]) => { - scr[action.type] = slice.caseReducers[key]; - }); + // Object.entries(slice.actions).forEach(([key, action]) => { + // scr[action.type] = slice.caseReducers[key]; + // }); - return { ...acc, ...scr }; - }, {} as SliceCaseReducers); + return { ...acc, ...scr }; + }, {} as { [K in keyof State]: SliceMap[K]['reducer'] }); } function mergeActionToSliceName(slices: Slice[]) { - return slices.reduce((acc, slice) => { - const scr: { [key: string]: string } = {}; + return slices.reduce((acc, slice) => { + const scr: { [key: string]: string } = {}; - Object.values(slice.actions).forEach((action) => { - scr[action.type] = slice.name; - }); + Object.values(slice.actions).forEach((action) => { + scr[action.type] = slice.name; + }); - return { ...acc, ...scr }; - }, {} as { [key: string]: string }); + return { ...acc, ...scr }; + }, {} as { [key: string]: string }); } +function trrackedState( + state: State, + sliceMap: SliceMap +): Trrackable { + const slices: Slice[] = Object.values(sliceMap); + + for (const key in state) { + const k = key as keyof State; + const slice = slices.find((s) => s.name === k); + if (slice && !isSliceTrrackable(slice)) { + delete state[k]; + } + } + return state; +} + +type SliceMap = { + [K in keyof State]: Slice | TrrackableSlice; +}; + export function configureTrrackableStore( - opts: ConfigureStoreOptions & { - slices: Slice[]; - } -) { - const trrackMiddleware = createListenerMiddleware(); - - const _reducer = opts.reducer; - - const store = configureStore({ - ...opts, - reducer: makeTrrackable( - typeof _reducer === 'function' - ? _reducer - : (combineReducers(_reducer) as any) - ), - middleware(getDefaultMiddleware) { - const suppliedMiddleware = opts.middleware; - if (!suppliedMiddleware) - return getDefaultMiddleware().prepend(trrackMiddleware.middleware); - if (typeof suppliedMiddleware === 'function') { - return [ - ...suppliedMiddleware(getDefaultMiddleware), - trrackMiddleware.middleware, - ]; - } - return [...suppliedMiddleware, trrackMiddleware.middleware]; - }, - }); - - /** - * Create types for listener - */ - type RootState = ReturnType; - type AppDispatch = typeof store.dispatch; - - type AppStartListening = TypedStartListening; - const startListening = trrackMiddleware.startListening as AppStartListening; - // Fin. - - const labels = mergeLabels(opts.slices); - const doUndoActionCreators = mergeDoUndoActionCreators(opts.slices); - const reducerEventTypes = mergeReducerEventTypes(opts.slices); - const asyncThunks = mergeAsyncThunks(opts.slices); - const trrackedActions = mergeTrrackedActions(opts.slices); - - const trrack = initializeTrrack({ - initialState: store.getState(), - registry: Registry.create(), - }); - - let middlewareStatus: 'active' | 'paused' = 'active'; - - Object.values(asyncThunks).forEach((thunk) => { - if (!trrack.registry.has(thunk.typePrefix)) { - trrack.registry.register(thunk.typePrefix, (args: any) => { - middlewareStatus = 'paused'; - const th = store.dispatch(thunk(args) as any); - return th.then(() => (middlewareStatus = 'active')); - }); + opts: ConfigureStoreOptions & { + sliceMap: SliceMap; } - }); +) { + const slices: Slice[] = Object.values(opts.sliceMap); + const trrackMiddleware = createListenerMiddleware(); + + const _reducer = mergeReducers(opts.sliceMap); + + const store = configureStore({ + ...opts, + reducer: makeTrrackable( + typeof _reducer === 'function' + ? _reducer + : (combineReducers(_reducer) as any) + ), + middleware(getDefaultMiddleware) { + const suppliedMiddleware = opts.middleware; + if (!suppliedMiddleware) + return getDefaultMiddleware().prepend( + trrackMiddleware.middleware + ); + if (typeof suppliedMiddleware === 'function') { + return [ + ...suppliedMiddleware(getDefaultMiddleware), + trrackMiddleware.middleware, + ]; + } + return [...suppliedMiddleware, trrackMiddleware.middleware]; + }, + }); - opts.slices.forEach((slice) => { - Object.values(slice.actions).forEach((action) => { - trrack.registry.register(action.type, ((act: AnyAction) => { - return store.dispatch(act); - }) as any); + /** + * Create types for listener + */ + type RootState = ReturnType; + type AppDispatch = typeof store.dispatch; + + type AppStartListening = TypedStartListening; + const startListening = trrackMiddleware.startListening as AppStartListening; + // Fin. + + const labels = mergeLabels(slices); + const doUndoActionCreators = mergeDoUndoActionCreators(slices); + const reducerEventTypes = mergeReducerEventTypes(slices); + const asyncThunks = mergeAsyncThunks(slices); + const trrackedActions = mergeTrrackedActions(slices); + + const newState = trrackedState(store.getState(), opts.sliceMap); + + console.log(newState); + + const trrack = initializeTrrack({ + initialState: store.getState(), + registry: Registry.create(), }); - }); - - const trrackStore = getTrrackStore({ - current: trrack.current.id, - }); - - trrack.currentChange(() => { - middlewareStatus = 'paused'; - store.dispatch(trrackTraverseAction(trrack.getState())); - trrackStore.dispatch(changeCurrent(trrack.current.id)); - middlewareStatus = 'active'; - }); - - startListening({ - predicate(action) { - if (trrack.isTraversing) return false; // Never run middleware when trrack is traversing. - - if (middlewareStatus === 'paused') return false; // Never run middleware when middleware is set to pause. - - // Check if given actions is fulfilled async thunk action and only then return true. - if (isAsyncThunkAction(action)) { - return isFulfilled(action); - } - - // Run the middleware if the action is trracked, trrack is not traversing and middleware is not paused. - const isTrrackedAction = isAnyOf(trrackedActions[0], ...trrackedActions); - return isTrrackedAction(action); - }, - effect(action, api) { - const isThunk = isFulfilled(action); - - const type = isThunk ? asyncThunks[action.type].typePrefix : action.type; - const payload = action['payload']; - const labelGenerator = labels[type]; - - const label = labelGenerator(payload); - - const doUndoObject = doUndoActionCreators[type]({ - action: action as PayloadAction, - currentState: api.getState(), - previousState: api.getOriginalState(), - }); - - const hasSideEffects = !NO_OP_ACTION.match(doUndoObject.undo); - - if (hasSideEffects) { - const undoAct = doUndoObject.undo as PayloadAction; - const doAct = NO_OP_ACTION.match(doUndoObject.do) - ? (action as PayloadAction) - : (doUndoObject.do as PayloadAction); - - trrack.record({ - label, - state: api.getState(), - eventType: reducerEventTypes[type], - sideEffects: { - do: [ - { - type: isThunk ? type : doAct.type, - payload: isThunk ? doAct.payload : doAct, - }, - ], - undo: [ - { - type: undoAct.type, - payload: isThunk ? undoAct.payload : undoAct, - }, - ], - }, - onlySideEffects: true, - }); - } else { - // ! Fix - - trrack.record({ - label, - state: api.getState(), - eventType: reducerEventTypes[type], - sideEffects: { - do: [], - undo: [], - }, + + let middlewareStatus: 'active' | 'paused' = 'active'; + + Object.values(asyncThunks).forEach((thunk) => { + if (!trrack.registry.has(thunk.typePrefix)) { + trrack.registry.register(thunk.typePrefix, (args: any) => { + middlewareStatus = 'paused'; + const th = store.dispatch(thunk(args) as any); + return th.then(() => (middlewareStatus = 'active')); + }); + } + }); + + slices.forEach((slice) => { + Object.values(slice.actions).forEach((action) => { + trrack.registry.register(action.type, ((act: AnyAction) => { + return store.dispatch(act); + }) as any); }); - } - }, - }); + }); + + const trrackStore = getTrrackStore({ + current: trrack.current.id, + }); + + trrack.currentChange(() => { + middlewareStatus = 'paused'; + store.dispatch(trrackTraverseAction(trrack.getState())); + trrackStore.dispatch(changeCurrent(trrack.current.id)); + middlewareStatus = 'active'; + }); + + startListening({ + predicate(action) { + if (trrack.isTraversing) return false; // Never run middleware when trrack is traversing. + + if (middlewareStatus === 'paused') return false; // Never run middleware when middleware is set to pause. + + // Check if given actions is fulfilled async thunk action and only then return true. + if (isAsyncThunkAction(action)) { + return isFulfilled(action); + } + + // Run the middleware if the action is trracked, trrack is not traversing and middleware is not paused. + const isTrrackedAction = isAnyOf( + trrackedActions[0], + ...trrackedActions + ); + return isTrrackedAction(action); + }, + effect(action, api) { + const isThunk = isFulfilled(action); + + const type = isThunk + ? asyncThunks[action.type].typePrefix + : action.type; + const payload = action['payload']; + const labelGenerator = labels[type]; + + const label = labelGenerator(payload); + + const doUndoObject = doUndoActionCreators[type]({ + action: action as PayloadAction, + currentState: api.getState(), + previousState: api.getOriginalState(), + }); + + const hasSideEffects = !NO_OP_ACTION.match(doUndoObject.undo); + + if (hasSideEffects) { + const undoAct = doUndoObject.undo as PayloadAction; + const doAct = NO_OP_ACTION.match(doUndoObject.do) + ? (action as PayloadAction) + : (doUndoObject.do as PayloadAction); + + trrack.record({ + label, + state: api.getState(), + eventType: reducerEventTypes[type], + sideEffects: { + do: [ + { + type: isThunk ? type : doAct.type, + payload: isThunk ? doAct.payload : doAct, + }, + ], + undo: [ + { + type: undoAct.type, + payload: isThunk ? undoAct.payload : undoAct, + }, + ], + }, + onlySideEffects: true, + }); + } else { + // ! Fix + + trrack.record({ + label, + state: api.getState(), + eventType: reducerEventTypes[type], + sideEffects: { + do: [], + undo: [], + }, + }); + } + }, + }); - return { store, trrack, trrackStore }; + return { store, trrack, trrackStore }; } diff --git a/packages/redux/src/store/types.ts b/packages/redux/src/store/types.ts index c4fefef..5d8c354 100644 --- a/packages/redux/src/store/types.ts +++ b/packages/redux/src/store/types.ts @@ -1,19 +1,38 @@ import { Middleware, Slice } from '@reduxjs/toolkit'; import { CurriedGetDefaultMiddleware } from '@reduxjs/toolkit/dist/getDefaultMiddleware'; +import { TrrackableSlice } from '../slice'; export type SliceMapLike = { - [K in keyof State]: Slice; + [K in keyof State]: Slice; }; export type StateFromSliceMap = M extends SliceMapLike - ? { [P in keyof M]: M[P] extends Slice ? S : never } - : never; + ? { [P in keyof M]: M[P] extends Slice ? S : never } + : never; export type Middlewares = ReadonlyArray< - Middleware, State> + Middleware, State> >; export type PossibleMiddleware< - State = any, - M extends Middlewares = Middlewares + State = any, + M extends Middlewares = Middlewares > = ((g: CurriedGetDefaultMiddleware) => M) | M; + +export type Trrackable = SM extends any + ? { + [K in keyof SM]: SM[K] extends TrrackableSlice ? K : never; + } + : never; + +type T = { + k: string; +}; + +type Temp = T extends any + ? { + [K in keyof T]: T[K] extends string ? Slice | TrrackableSlice : never; + } + : never; + +export type TT = Trrackable>; diff --git a/packages/redux/tests/api/client.ts b/packages/redux/tests/api/client.ts new file mode 100644 index 0000000..7c1dd68 --- /dev/null +++ b/packages/redux/tests/api/client.ts @@ -0,0 +1,49 @@ +// A tiny wrapper around fetch(), borrowed from +// https://kentcdodds.com/blog/replace-axios-with-a-simple-custom-fetch-wrapper +// I borrowed from https://github.com/reduxjs/redux-essentials-example-app/blob/tutorial-steps/src/api/client.js + +export async function client( + endpoint: string, + { body, ...customConfig }: any = {} +) { + const headers = { 'Content-Type': 'application/json' }; + + const config = { + method: body ? 'POST' : 'GET', + ...customConfig, + headers: { + ...headers, + ...customConfig.headers, + }, + }; + + if (body) { + config.body = JSON.stringify(body); + } + + let data; + try { + const response = await window.fetch(endpoint, config); + data = await response.json(); + if (response.ok) { + // Return a result object similar to Axios + return { + status: response.status, + data, + headers: response.headers, + url: response.url, + }; + } + throw new Error(response.statusText); + } catch (err: any) { + return Promise.reject(err.message ? err.message : data); + } +} + +client.get = function (endpoint: string, customConfig: any = {}) { + return client(endpoint, { ...customConfig, method: 'GET' }); +}; + +client.post = function (endpoint: string, body: any, customConfig: any = {}) { + return client(endpoint, { ...customConfig, body }); +}; diff --git a/packages/redux/tests/api/server.ts b/packages/redux/tests/api/server.ts new file mode 100644 index 0000000..cb4fc28 --- /dev/null +++ b/packages/redux/tests/api/server.ts @@ -0,0 +1,80 @@ +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { afterAll, afterEach, beforeAll } from 'vitest'; +import { Posts } from '../slices/posts'; +import { Users } from '../slices/users'; + +export const BASE_URL = 'https://trrack-test.dev'; + +const users: Users = [ + { + id: '1', + name: 'Leanne Graham', + }, + { + id: '2', + name: 'Ervin Howell', + }, + { + id: '3', + name: 'Clementine Bauch', + }, +]; + +const posts: Posts = [ + { + user: '1', + id: '1', + title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', + content: + 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto', + }, + { + user: '1', + id: '2', + title: 'qui est esse', + content: + 'est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla', + }, + { + user: '2', + id: '3', + title: 'ea molestias quasi exercitationem repellat qui ipsa sit aut', + content: + 'et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut', + }, + { + user: '3', + id: '4', + title: 'eum et est occaecati', + content: + 'ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit', + }, + { + user: '3', + id: '5', + title: 'nesciunt quas odio', + content: + 'repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque', + }, +]; + +export const restHandlers = [ + rest.get(`${BASE_URL}/posts`, (req, res, ctx) => { + return res(ctx.status(200), ctx.json(posts)); + }), + rest.get(`${BASE_URL}/users`, (req, res, ctx) => { + return res(ctx.status(200), ctx.json(users)); + }), +]; + +const server = setupServer(...restHandlers); + +// Start server before all tests +beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); + +// Close server after all tests +afterAll(() => server.close()); + +// Reset handlers after each test `important for test isolation` +afterEach(() => server.resetHandlers()); diff --git a/packages/redux/tests/async.spec.ts b/packages/redux/tests/async.spec.ts new file mode 100644 index 0000000..7f6410c --- /dev/null +++ b/packages/redux/tests/async.spec.ts @@ -0,0 +1,5 @@ +describe('trracked slice', () => { + it('should be tracked', () => { + expect(true).toBeTruthy(); + }); +}); diff --git a/packages/redux/tests/dev.spec.ts b/packages/redux/tests/dev.spec.ts deleted file mode 100644 index 8161d1f..0000000 --- a/packages/redux/tests/dev.spec.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('it', () => { - it('should work', () => { - expect(true).toBeTruthy(); - }); -}); diff --git a/packages/redux/tests/index.spec.ts b/packages/redux/tests/index.spec.ts index dcb8a0c..37fbd1a 100644 --- a/packages/redux/tests/index.spec.ts +++ b/packages/redux/tests/index.spec.ts @@ -54,7 +54,9 @@ describe('it', () => { reducer: { test: testSlice.reducer, }, - slices: [testSlice], + sliceMap: { + test: testSlice, + }, }); // store.dispatch(sayHello('Mars')); diff --git a/packages/redux/tests/slices/counter.ts b/packages/redux/tests/slices/counter.ts new file mode 100644 index 0000000..8160560 --- /dev/null +++ b/packages/redux/tests/slices/counter.ts @@ -0,0 +1,60 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { createTrrackableSlice } from '../../src'; +import { SliceWrapper } from './utils'; + +export type CounterState = { + value: number; +}; + +const initialState: CounterState = { + value: 0, +}; + +const counterSlice = createSlice({ + name: 'counter', + initialState, + reducers: { + increment: (state) => { + state.value += 1; + }, + decrement: (state) => { + state.value -= 1; + }, + // Use the PayloadAction type to declare the contents of `action.payload` + incrementByAmount: (state, action: PayloadAction) => { + state.value += action.payload; + }, + }, +}); + +const trrackableCounterSlice = createTrrackableSlice({ + name: 'counter', + initialState, + reducers: { + increment: (state) => { + state.value += 1; + }, + decrement: (state) => { + state.value -= 1; + }, + // Use the PayloadAction type to declare the contents of `action.payload` + incrementByAmount: (state, action: PayloadAction) => { + state.value += action.payload; + }, + }, +}); + +export const Counter: SliceWrapper< + typeof counterSlice, + typeof trrackableCounterSlice, + CounterState +> = { + slice: counterSlice, + trrackableSlice: trrackableCounterSlice, + generate() { + return { + value: -1, + }; + }, + actions: trrackableCounterSlice.actions, +}; diff --git a/packages/redux/tests/slices/posts.ts b/packages/redux/tests/slices/posts.ts new file mode 100644 index 0000000..f432fa4 --- /dev/null +++ b/packages/redux/tests/slices/posts.ts @@ -0,0 +1,94 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { randomUUID } from 'crypto'; +import { createTrrackableSlice } from '../../src'; +import { SliceWrapper } from './utils'; + +export type SinglePost = { + id: string; + title: string; + content: string; + user: string; +}; + +export type Posts = SinglePost[]; + +const initialState: Posts = []; + +const postsSlice = createSlice({ + name: 'posts', + initialState, + reducers: { + postAdded: { + reducer(state, action: PayloadAction) { + state.push(action.payload); + }, + prepare(args: { title: string; content: string; user: string }) { + const { title, content, user } = args; + return { + payload: { + id: randomUUID(), + title, + content, + user, + }, + }; + }, + }, + postUpdated(state, action: PayloadAction) { + const { id, title, content } = action.payload; + const existingPost = state.find((post) => post.id === id); + if (existingPost) { + existingPost.title = title; + existingPost.content = content; + } + }, + }, +}); + +const trrackablePostsSlice = createTrrackableSlice({ + name: 'posts', + initialState, + reducers: { + postAdded: { + reducer(state, action: PayloadAction) { + state.push(action.payload); + }, + prepare(args: { title: string; content: string; user: string }) { + const { title, content, user } = args; + return { + payload: { + id: randomUUID(), + title, + content, + user, + }, + }; + }, + }, + postUpdated(state, action: PayloadAction) { + const { id, title, content } = action.payload; + const existingPost = state.find((post) => post.id === id); + if (existingPost) { + existingPost.title = title; + existingPost.content = content; + } + }, + }, +}); + +export const Post: SliceWrapper< + typeof postsSlice, + typeof trrackablePostsSlice, + Omit +> = { + slice: postsSlice, + trrackableSlice: trrackablePostsSlice, + generate(args: string) { + return { + title: `Post ${Math.floor(Math.random() * 1000)}`, + content: `Content ${Math.floor(Math.random() * 10000)}`, + user: args, + }; + }, + actions: trrackablePostsSlice.actions, +}; diff --git a/packages/redux/tests/slices/users.ts b/packages/redux/tests/slices/users.ts new file mode 100644 index 0000000..42a13f8 --- /dev/null +++ b/packages/redux/tests/slices/users.ts @@ -0,0 +1,48 @@ +import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { createTrrackableSlice } from '../../src'; +import { SliceWrapper } from './utils'; + +export type SingleUser = { + id: string; + name: string; +}; + +export type Users = SingleUser[]; + +const initialState: Users = []; + +const usersSlice = createSlice({ + name: 'users', + initialState, + reducers: { + addUser(state, action: PayloadAction) { + state.push(action.payload); + }, + }, +}); + +const trrackableUsersSlice = createTrrackableSlice({ + name: 'users', + initialState, + reducers: { + addUser(state, action: PayloadAction) { + state.push(action.payload); + }, + }, +}); + +export const User: SliceWrapper< + typeof usersSlice, + typeof trrackableUsersSlice, + SingleUser +> = { + slice: usersSlice, + trrackableSlice: trrackableUsersSlice, + generate() { + return { + id: Math.random().toString(), + name: `User ${Math.floor(Math.random() * 1000)}`, + }; + }, + actions: trrackableUsersSlice.actions, +}; diff --git a/packages/redux/tests/slices/utils.ts b/packages/redux/tests/slices/utils.ts new file mode 100644 index 0000000..d6d1eae --- /dev/null +++ b/packages/redux/tests/slices/utils.ts @@ -0,0 +1,9 @@ +import { Slice } from '@reduxjs/toolkit'; +import { TrrackableSlice } from '../../src'; + +export type SliceWrapper = { + slice: S; + trrackableSlice: TS; + generate(args?: unknown): T; + actions: S['actions']; +}; diff --git a/packages/redux/tests/store/fullyTrrackableStore.ts b/packages/redux/tests/store/fullyTrrackableStore.ts new file mode 100644 index 0000000..841b5c2 --- /dev/null +++ b/packages/redux/tests/store/fullyTrrackableStore.ts @@ -0,0 +1,17 @@ +import { configureTrrackableStore } from '../../src'; +import { Counter } from '../slices/counter'; +import { Post } from '../slices/posts'; +import { User } from '../slices/users'; + +export const trrackableStore = configureTrrackableStore({ + reducer: { + users: User.trrackableSlice.reducer, + posts: Post.trrackableSlice.reducer, + counter: Counter.trrackableSlice.reducer, + }, + sliceMap: { + users: User.trrackableSlice, + posts: Post.trrackableSlice, + counter: Counter.trrackableSlice, + }, +}); diff --git a/packages/redux/tests/store/partiallyTrrackableStore.ts b/packages/redux/tests/store/partiallyTrrackableStore.ts new file mode 100644 index 0000000..066e3e2 --- /dev/null +++ b/packages/redux/tests/store/partiallyTrrackableStore.ts @@ -0,0 +1,18 @@ +import { configureTrrackableStore } from '../../src'; +import { Counter } from '../slices/counter'; +import { Post } from '../slices/posts'; +import { User } from '../slices/users'; + +export const trrackableStore = () => + configureTrrackableStore({ + reducer: { + users: User.trrackableSlice.reducer, + posts: Post.slice.reducer, + counter: Counter.slice.reducer, + }, + sliceMap: { + users: User.trrackableSlice, + posts: Post.slice, + counter: Counter.slice, + }, + }); diff --git a/packages/redux/tests/trracked.spec.ts b/packages/redux/tests/trracked.spec.ts new file mode 100644 index 0000000..88e3294 --- /dev/null +++ b/packages/redux/tests/trracked.spec.ts @@ -0,0 +1,86 @@ +import { Counter } from './slices/counter'; +import { Post } from './slices/posts'; +import { User } from './slices/users'; +import { trrackableStore } from './store/fullyTrrackableStore'; + +describe('trracked slice', () => { + const { store, trrack } = trrackableStore; + const actions = { + ...User.actions, + ...Post.actions, + ...Counter.actions, + }; + + const user1 = User.generate(); + const user2 = User.generate(); + const user3 = User.generate(); + + const post1 = Post.generate(user1.id); + const post2 = Post.generate(user1.id); + const post3 = Post.generate(user2.id); + const post4 = Post.generate(user2.id); + const post5 = Post.generate(user3.id); + + it('should have all users added at correct position', () => { + store.dispatch(actions.addUser(user1)); + store.dispatch(actions.addUser(user2)); + store.dispatch(actions.addUser(user3)); + + expect(trrack.getState().users).toHaveLength(3); + expect(trrack.getState().users[0]).toStrictEqual(user1); + expect(trrack.getState().users[1]).toStrictEqual(user2); + expect(trrack.getState().users[2]).toStrictEqual(user3); + }); + + it('undo should remove last added user', () => { + trrack.undo(); + + expect(trrack.getState().users).toHaveLength(2); + expect(trrack.getState().users[0]).toStrictEqual(user1); + expect(trrack.getState().users[1]).toStrictEqual(user2); + expect(trrack.getState().users[2]).toBeUndefined(); + + trrack.redo(); + }); + + it('should have all posts added at correct position', () => { + store.dispatch(actions.postAdded(post1)); + store.dispatch(actions.postAdded(post2)); + store.dispatch(actions.postAdded(post3)); + store.dispatch(actions.postAdded(post4)); + store.dispatch(actions.postAdded(post5)); + + expect(trrack.getState().posts).toHaveLength(5); + expect(trrack.getState().posts[0].content).toEqual(post1.content); + expect(trrack.getState().posts[1].content).toEqual(post2.content); + expect(trrack.getState().posts[2].content).toEqual(post3.content); + expect(trrack.getState().posts[3].content).toEqual(post4.content); + expect(trrack.getState().posts[4].content).toEqual(post5.content); + }); + + it('undo should remove last added post', () => { + trrack.undo(); + + expect(trrack.getState().posts).toHaveLength(4); + expect(trrack.getState().posts[0].content).toEqual(post1.content); + expect(trrack.getState().posts[1].content).toEqual(post2.content); + expect(trrack.getState().posts[2].content).toEqual(post3.content); + expect(trrack.getState().posts[3].content).toEqual(post4.content); + expect(trrack.getState().posts[4]).toBeUndefined(); + + trrack.redo(); + }); + + it('undo should remove last added post', () => { + trrack.undo(); + + expect(trrack.getState().posts).toHaveLength(4); + expect(trrack.getState().posts[0].content).toEqual(post1.content); + expect(trrack.getState().posts[1].content).toEqual(post2.content); + expect(trrack.getState().posts[2].content).toEqual(post3.content); + expect(trrack.getState().posts[3].content).toEqual(post4.content); + expect(trrack.getState().posts[4]).toBeUndefined(); + + trrack.redo(); + }); +}); diff --git a/packages/redux/tests/untrracked.spec.ts b/packages/redux/tests/untrracked.spec.ts new file mode 100644 index 0000000..6d272ab --- /dev/null +++ b/packages/redux/tests/untrracked.spec.ts @@ -0,0 +1,49 @@ +import { Counter } from './slices/counter'; +import { Post } from './slices/posts'; +import { User } from './slices/users'; +import { trrackableStore } from './store/partiallyTrrackableStore'; + +describe('untrracked slice', () => { + const { store, trrack } = trrackableStore(); + const actions = { + ...User.actions, + ...Post.actions, + ...Counter.actions, + }; + + const user1 = User.generate(); + const user2 = User.generate(); + const user3 = User.generate(); + + it('should have all users added at correct position', () => { + store.dispatch(actions.addUser(user1)); + store.dispatch(actions.addUser(user2)); + store.dispatch(actions.addUser(user3)); + + expect(trrack.getState().users).toHaveLength(3); + expect(trrack.getState().users[0]).toStrictEqual(user1); + expect(trrack.getState().users[1]).toStrictEqual(user2); + expect(trrack.getState().users[2]).toStrictEqual(user3); + }); + + it('undo should remove last added user', () => { + trrack.undo(); + + expect(trrack.getState().users).toHaveLength(2); + expect(trrack.getState().users[0]).toStrictEqual(user1); + expect(trrack.getState().users[1]).toStrictEqual(user2); + expect(trrack.getState().users[2]).toBeUndefined(); + + trrack.redo(); + }); + + // it('should not have posts key', () => { + // expect(trrack.getState().posts).toBeUndefined(); + // }); + + // it('should increment counter by 1', () => { + // store.dispatch(actions.increment()); + + // expect(trrack.getState().counter).toBeUndefined(); + // }); +}); diff --git a/packages/redux/vite.config.ts b/packages/redux/vite.config.ts index e251aff..eed978e 100644 --- a/packages/redux/vite.config.ts +++ b/packages/redux/vite.config.ts @@ -64,6 +64,7 @@ export default defineConfig({ dir: '../../node_modules/.vitest', }, environment: 'jsdom', + include: ['tests/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], reporters: ['default', 'html'], }, diff --git a/yarn.lock b/yarn.lock index 0c7c7ac..856fbc7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2262,6 +2262,49 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== +"@mswjs/cookies@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mswjs/cookies/-/cookies-0.2.2.tgz#b4e207bf6989e5d5427539c2443380a33ebb922b" + integrity sha512-mlN83YSrcFgk7Dm1Mys40DLssI1KdJji2CMKN8eOlBqsTADYzj2+jWzsANsUTFbxDMWPD5e9bfA1RGqBpS3O1g== + dependencies: + "@types/set-cookie-parser" "^2.4.0" + set-cookie-parser "^2.4.6" + +"@mswjs/data@^0.11.2": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@mswjs/data/-/data-0.11.2.tgz#92d6f8284165ef0d50be010b5e2dfadc7b7ad81b" + integrity sha512-x7cx5GZ9D9DmjO9zkWaybOQVGm/vt7eEYSw7Gk955yf/XdN4qqaSEXaqZuHB84cncNJaV2EMRuNU+k92ssmroQ== + dependencies: + "@types/lodash" "^4.14.172" + "@types/md5" "^2.3.0" + "@types/pluralize" "^0.0.29" + "@types/uuid" "^8.3.0" + date-fns "^2.21.1" + debug "^4.3.1" + graphql "^15.5.0" + lodash "^4.17.21" + md5 "^2.3.0" + outvariant "^1.2.1" + pluralize "^8.0.0" + strict-event-emitter "^0.2.0" + uuid "^8.3.1" + optionalDependencies: + msw latest + +"@mswjs/interceptors@^0.17.5": + version "0.17.9" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.17.9.tgz#0096fc88fea63ee42e36836acae8f4ae33651c04" + integrity sha512-4LVGt03RobMH/7ZrbHqRxQrS9cc2uh+iNKSj8UWr8M26A2i793ju+csaB5zaqYltqJmA2jUq4VeYfKmVqvsXQg== + dependencies: + "@open-draft/until" "^1.0.3" + "@types/debug" "^4.1.7" + "@xmldom/xmldom" "^0.8.3" + debug "^4.3.3" + headers-polyfill "^3.1.0" + outvariant "^1.2.1" + strict-event-emitter "^0.2.4" + web-encoding "^1.1.5" + "@mui/base@5.0.0-alpha.110": version "5.0.0-alpha.110" resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-alpha.110.tgz#61174f64b23e667387708b2cbb31339e58c714cf" @@ -3284,6 +3327,11 @@ dependencies: "@octokit/openapi-types" "^16.0.0" +"@open-draft/until@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-1.0.3.tgz#db9cc719191a62e7d9200f6e7bab21c5b848adca" + integrity sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q== + "@parcel/watcher@2.0.4": version "2.0.4" resolved "https://registry.yarnpkg.com/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" @@ -4129,6 +4177,11 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" + integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + "@types/d3-color@^2.0.1": version "2.0.3" resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-2.0.3.tgz#8bc4589073c80e33d126345542f588056511fe82" @@ -4166,7 +4219,7 @@ resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-2.1.1.tgz#743fdc821c81f86537cbfece07093ac39b4bc342" integrity sha512-9MVYlmIgmRR31C5b4FVSWtuMmBHh2mOWQYfl7XAYOa8dsnb7iEmUmRSWSFgXFtkjxO65d7hTUHQC+RhR/9IWFg== -"@types/debug@^4.0.0": +"@types/debug@^4.0.0", "@types/debug@^4.1.7": version "4.1.7" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== @@ -4301,6 +4354,11 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/js-levenshtein@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@types/js-levenshtein/-/js-levenshtein-1.1.1.tgz#ba05426a43f9e4e30b631941e0aa17bf0c890ed5" + integrity sha512-qC4bCqYGy1y/NP7dDVr7KJarn+PbX1nSpwA7JXdu0HxT3QYjO8MJ+cntENtHFVy2dRAyBV23OZ6MxsW1AM1L8g== + "@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -4318,11 +4376,16 @@ dependencies: "@types/lodash" "*" -"@types/lodash@*": +"@types/lodash@*", "@types/lodash@^4.14.172": version "4.14.191" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== +"@types/md5@^2.3.0": + version "2.3.2" + resolved "https://registry.yarnpkg.com/@types/md5/-/md5-2.3.2.tgz#529bb3f8a7e9e9f621094eb76a443f585d882528" + integrity sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og== + "@types/mdast@^3.0.0": version "3.0.10" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af" @@ -4375,6 +4438,11 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pluralize@^0.0.29": + version "0.0.29" + resolved "https://registry.yarnpkg.com/@types/pluralize/-/pluralize-0.0.29.tgz#6ffa33ed1fc8813c469b859681d09707eb40d03c" + integrity sha512-BYOID+l2Aco2nBik+iYS4SZX0Lf20KPILP5RGmM1IgzdwNdTs0eebiFriOPcej1sX9mLnSoiNte5zcFxssgpGA== + "@types/prettier@^2.1.5": version "2.7.1" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.1.tgz#dfd20e2dc35f027cdd6c1908e80a5ddc7499670e" @@ -4471,6 +4539,13 @@ "@types/mime" "*" "@types/node" "*" +"@types/set-cookie-parser@^2.4.0": + version "2.4.2" + resolved "https://registry.yarnpkg.com/@types/set-cookie-parser/-/set-cookie-parser-2.4.2.tgz#b6a955219b54151bfebd4521170723df5e13caad" + integrity sha512-fBZgytwhYAUkj/jC/FAV4RQ5EerRup1YQsXQCh8rZfiHkc4UahC192oH0smGwsXol3cL3A5oETuAHeQHmhXM4w== + dependencies: + "@types/node" "*" + "@types/sockjs@^0.3.33": version "0.3.33" resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" @@ -4493,6 +4568,11 @@ resolved "https://registry.yarnpkg.com/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz#b6725d5f4af24ace33b36fafd295136e75509f43" integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== +"@types/uuid@^8.3.0": + version "8.3.4" + resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" + integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== + "@types/uuid@^9.0.0": version "9.0.0" resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-9.0.0.tgz#53ef263e5239728b56096b0a869595135b7952d2" @@ -4886,6 +4966,11 @@ "@webassemblyjs/ast" "1.11.1" "@xtuc/long" "4.2.2" +"@xmldom/xmldom@^0.8.3": + version "0.8.6" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440" + integrity sha512-uRjjusqpoqfmRkTaNuLJ2VohVr67Q5YwDATW3VU7PfzTj6IRaihGrYI7zckGZjxQPBIp63nfvJbM+Yu5ICh0Bg== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -4916,6 +5001,11 @@ dependencies: argparse "^2.0.1" +"@zxing/text-encoding@0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@zxing/text-encoding/-/text-encoding-0.9.0.tgz#fb50ffabc6c7c66a0c96b4c03e3d9be74864b70b" + integrity sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA== + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -5972,6 +6062,14 @@ chalk@4.1.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.1.tgz#c80b3fab28bf6371e6863325eee67e618b77e6ad" + integrity sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -6024,12 +6122,17 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +charenc@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== + check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== -"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.1, chokidar@^3.5.3: +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.2, chokidar@^3.5.1, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -6653,6 +6756,11 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@^0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.2.tgz#0e41f24de5ecf317947c82fc789e06a884824432" + integrity sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA== + copy-anything@^2.0.1: version "2.0.6" resolved "https://registry.yarnpkg.com/copy-anything/-/copy-anything-2.0.6.tgz#092454ea9584a7b7ad5573062b2a87f5900fc480" @@ -6764,6 +6872,11 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +crypt@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== + crypto-random-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" @@ -7023,6 +7136,11 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" +date-fns@^2.21.1: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -7035,7 +7153,7 @@ debug@2.6.9, debug@^2.6.9: dependencies: ms "2.0.0" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, 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== @@ -7995,7 +8113,7 @@ eventemitter3@^4.0.0, eventemitter3@^4.0.4: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== -events@^3.2.0: +events@^3.2.0, events@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== @@ -8917,6 +9035,16 @@ graceful-fs@4.2.10, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +"graphql@^15.0.0 || ^16.0.0": + version "16.6.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.6.0.tgz#c2dcffa4649db149f6282af726c8c83f1c7c5fdb" + integrity sha512-KPIBPDlW7NxrbT/eh4qPXz5FiFdL5UbaA0XUNz2Rp3Z3hqBSkbj0GVjwFDztsWVauZUWsbKHgMg++sk8UX0bkw== + +graphql@^15.5.0: + version "15.8.0" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-15.8.0.tgz#33410e96b012fa3bdb1091cc99a94769db212b38" + integrity sha512-5gghUc24tP9HRznNpV2+FIoq3xKkj5dTQqf4v0CpdPbFVwFkWoxOM+o+2OC9ZSvjEMTjfmG9QT+gcvggTwW1zw== + gray-matter@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" @@ -9059,6 +9187,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +headers-polyfill@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-3.1.2.tgz#9a4dcb545c5b95d9569592ef7ec0708aab763fbe" + integrity sha512-tWCK4biJ6hcLqTviLXVR9DTRfYGQMXEIUj3gwJ2rZ5wO/at3XtkI4g8mCvFdUF9l1KMBNCfmNAdnahm1cgavQA== + hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" @@ -9445,7 +9578,7 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -inquirer@8.2.5: +inquirer@8.2.5, inquirer@^8.2.0: version "8.2.5" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== @@ -9526,7 +9659,7 @@ is-alphanumerical@^2.0.0: is-alphabetical "^2.0.0" is-decimal "^2.0.0" -is-arguments@^1.1.0, is-arguments@^1.1.1: +is-arguments@^1.0.4, is-arguments@^1.1.0, is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -9571,6 +9704,11 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== +is-buffer@~1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + is-builtin-module@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-3.2.0.tgz#bb0310dfe881f144ca83f30100ceb10cf58835e0" @@ -9651,6 +9789,13 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.7: + 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" @@ -9688,6 +9833,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-node-process@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.0.1.tgz#4fc7ac3a91e8aac58175fe0578abbc56f2831b23" + integrity sha512-5IcdXuf++TTNt3oGl9EBdkvndXA8gmc4bz/Y+mdEpWh3Mcn/+kOw6hI7LD5CocqJWMzeb0I0ClndRVNdEPuJXQ== + 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" @@ -9829,7 +9979,7 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" -is-typed-array@^1.1.10: +is-typed-array@^1.1.10, is-typed-array@^1.1.3: version "1.1.10" resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== @@ -10696,6 +10846,11 @@ jju@~1.4.0: resolved "https://registry.yarnpkg.com/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" integrity sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== +js-levenshtein@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -11643,6 +11798,15 @@ match-sorter@^6.3.1: "@babel/runtime" "^7.12.5" remove-accents "0.4.2" +md5@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + mdast-util-definitions@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-5.1.1.tgz#2c1d684b28e53f84938bb06317944bee8efa79db" @@ -12494,6 +12658,31 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@^1.1.0, msw@latest: + version "1.1.0" + resolved "https://registry.yarnpkg.com/msw/-/msw-1.1.0.tgz#f88806b7ce4cade89b5bf629fa98c17218a4f036" + integrity sha512-oqMvUXm1bMbwvGpoXAQVz8vXXQyQyx52HBDg3EDOK+dFXkQHssgkXEG4LfMwwZyr2Qt18I/w04XPaY4BkFTkzA== + dependencies: + "@mswjs/cookies" "^0.2.2" + "@mswjs/interceptors" "^0.17.5" + "@open-draft/until" "^1.0.3" + "@types/cookie" "^0.4.1" + "@types/js-levenshtein" "^1.1.1" + chalk "4.1.1" + chokidar "^3.4.2" + cookie "^0.4.2" + graphql "^15.0.0 || ^16.0.0" + headers-polyfill "^3.1.0" + inquirer "^8.2.0" + is-node-process "^1.0.1" + js-levenshtein "^1.1.6" + node-fetch "^2.6.7" + outvariant "^1.3.0" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.4.3" + type-fest "^2.19.0" + yargs "^17.3.1" + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" @@ -13388,6 +13577,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +outvariant@^1.2.1, outvariant@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.3.0.tgz#c39723b1d2cba729c930b74bf962317a81b9b1c9" + integrity sha512-yeWM9k6UPfG/nzxdaPlJkB2p08hCg4xP6Lx99F+vP8YF7xyZVfTmJjrrNalkmzudD4WFvNLVudQikqUmF8zhVQ== + p-each-series@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a" @@ -13709,6 +13903,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^6.2.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -13808,6 +14007,11 @@ pkg-types@^1.0.1: mlly "^1.0.0" pathe "^1.0.0" +pluralize@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-8.0.0.tgz#1a6fa16a38d12a1901e0320fa017051c539ce3b1" + integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== + portfinder@^1.0.28: version "1.0.32" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" @@ -15367,6 +15571,11 @@ set-blocking@^2.0.0, set-blocking@~2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-cookie-parser@^2.4.6: + version "2.5.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz#ddd3e9a566b0e8e0862aca974a6ac0e01349430b" + integrity sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ== + setprototypeof@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" @@ -15800,6 +16009,18 @@ stream-combiner2@~1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" +strict-event-emitter@^0.2.0, strict-event-emitter@^0.2.4: + version "0.2.8" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.2.8.tgz#b4e768927c67273c14c13d20e19d5e6c934b47ca" + integrity sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A== + dependencies: + events "^3.3.0" + +strict-event-emitter@^0.4.3: + version "0.4.6" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.4.6.tgz#ff347c8162b3e931e3ff5f02cfce6772c3b07eb3" + integrity sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg== + string-argv@^0.3.1, string-argv@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" @@ -16641,6 +16862,11 @@ type-fest@^1.0.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-1.4.0.tgz#e9fb813fe3bf1744ec359d55d1affefa76f14be1" integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== +type-fest@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" + integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -16970,6 +17196,17 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +util@^0.12.3: + version "0.12.5" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.5.tgz#5f17a6059b73db61a875668781a1c2b136bd6fbc" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" @@ -16980,7 +17217,7 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.3.2: +uuid@^8.3.1, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -17252,6 +17489,15 @@ wcwidth@^1.0.0, wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web-encoding@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/web-encoding/-/web-encoding-1.1.5.tgz#fc810cf7667364a6335c939913f5051d3e0c4864" + integrity sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA== + dependencies: + util "^0.12.3" + optionalDependencies: + "@zxing/text-encoding" "0.9.0" + webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" @@ -17426,7 +17672,7 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" -which-typed-array@^1.1.8: +which-typed-array@^1.1.2, which-typed-array@^1.1.8: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== From ef49886b85c48ef1e7e04636d501e52f6706a679 Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Tue, 13 Jun 2023 12:48:59 -0600 Subject: [PATCH 6/7] fix: working on non-trrackable redux slices --- .../redux/src/store/trrackableStoreCreator.ts | 72 ++++++++++++----- packages/redux/tests/api/client.ts | 49 ------------ packages/redux/tests/api/server.ts | 80 ------------------- packages/redux/tests/async.spec.ts | 5 -- packages/redux/tests/index.spec.ts | 67 ---------------- packages/redux/tests/slices/posts.ts | 4 +- packages/redux/tests/slices/users.ts | 8 +- .../redux/tests/store/fullyTrrackableStore.ts | 6 +- packages/redux/tests/trracked.spec.ts | 52 ++++++------ packages/redux/tests/untrracked.spec.ts | 55 +++++++++---- 10 files changed, 133 insertions(+), 265 deletions(-) delete mode 100644 packages/redux/tests/api/client.ts delete mode 100644 packages/redux/tests/api/server.ts delete mode 100644 packages/redux/tests/async.spec.ts delete mode 100644 packages/redux/tests/index.spec.ts diff --git a/packages/redux/src/store/trrackableStoreCreator.ts b/packages/redux/src/store/trrackableStoreCreator.ts index f1a2439..8aaefbc 100644 --- a/packages/redux/src/store/trrackableStoreCreator.ts +++ b/packages/redux/src/store/trrackableStoreCreator.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { Action, + ActionCreatorWithoutPayload, AnyAction, AsyncThunk, combineReducers, @@ -132,7 +133,7 @@ function mergeReducers(sliceMap: SliceMap) { }, {} as { [K in keyof State]: SliceMap[K]['reducer'] }); } -function mergeActionToSliceName(slices: Slice[]) { +export function __mergeActionToSliceName(slices: Slice[]) { return slices.reduce((acc, slice) => { const scr: { [key: string]: string } = {}; @@ -144,6 +145,17 @@ function mergeActionToSliceName(slices: Slice[]) { }, {} as { [key: string]: string }); } +type SliceMap = { + [K in keyof State]: Slice | TrrackableSlice; +}; + +function trrackActionCheckerCreator( + actions: Array +) { + // Run the middleware if the action is trracked, trrack is not traversing and middleware is not paused. + return isAnyOf(actions[0], ...actions); +} + function trrackedState( state: State, sliceMap: SliceMap @@ -157,14 +169,25 @@ function trrackedState( delete state[k]; } } - return state; + return state as any; } -type SliceMap = { - [K in keyof State]: Slice | TrrackableSlice; -}; - export function configureTrrackableStore( + opts: Omit, 'reducer'> & { + sliceMap: SliceMap; + } +) { + const reducer = mergeReducers(opts.sliceMap); + + const reduxStore = configureStore({ + ...opts, + reducer, + }); + + return { store: reduxStore, trrack: {} as any, trrackStore: {} as any }; +} + +export function _configureTrrackableStore( opts: ConfigureStoreOptions & { sliceMap: SliceMap; } @@ -212,13 +235,12 @@ export function configureTrrackableStore( const reducerEventTypes = mergeReducerEventTypes(slices); const asyncThunks = mergeAsyncThunks(slices); const trrackedActions = mergeTrrackedActions(slices); + const isTrrackedAction = trrackActionCheckerCreator(trrackedActions); - const newState = trrackedState(store.getState(), opts.sliceMap); - - console.log(newState); + const onlyTrrackedState = trrackedState(store.getState(), opts.sliceMap); const trrack = initializeTrrack({ - initialState: store.getState(), + initialState: onlyTrrackedState, registry: Registry.create(), }); @@ -248,7 +270,19 @@ export function configureTrrackableStore( trrack.currentChange(() => { middlewareStatus = 'paused'; - store.dispatch(trrackTraverseAction(trrack.getState())); + + console.group(trrack.current.id); + + console.log(trrack.current.label); + console.log('new', onlyTrrackedState); + console.log('store', store.getState()); + console.log('trrack', trrack.getState()); + + console.groupEnd(); + + store.dispatch( + trrackTraverseAction({ ...store.getState(), ...trrack.getState() }) + ); trrackStore.dispatch(changeCurrent(trrack.current.id)); middlewareStatus = 'active'; }); @@ -264,11 +298,6 @@ export function configureTrrackableStore( return isFulfilled(action); } - // Run the middleware if the action is trracked, trrack is not traversing and middleware is not paused. - const isTrrackedAction = isAnyOf( - trrackedActions[0], - ...trrackedActions - ); return isTrrackedAction(action); }, effect(action, api) { @@ -284,10 +313,15 @@ export function configureTrrackableStore( const doUndoObject = doUndoActionCreators[type]({ action: action as PayloadAction, - currentState: api.getState(), - previousState: api.getOriginalState(), + currentState: trrackedState(api.getState(), opts.sliceMap), + previousState: trrackedState( + api.getOriginalState(), + opts.sliceMap + ), }); + console.log({ doUndoObject }); + const hasSideEffects = !NO_OP_ACTION.match(doUndoObject.undo); if (hasSideEffects) { @@ -298,7 +332,7 @@ export function configureTrrackableStore( trrack.record({ label, - state: api.getState(), + state: trrackedState(api.getState(), opts.sliceMap), eventType: reducerEventTypes[type], sideEffects: { do: [ diff --git a/packages/redux/tests/api/client.ts b/packages/redux/tests/api/client.ts deleted file mode 100644 index 7c1dd68..0000000 --- a/packages/redux/tests/api/client.ts +++ /dev/null @@ -1,49 +0,0 @@ -// A tiny wrapper around fetch(), borrowed from -// https://kentcdodds.com/blog/replace-axios-with-a-simple-custom-fetch-wrapper -// I borrowed from https://github.com/reduxjs/redux-essentials-example-app/blob/tutorial-steps/src/api/client.js - -export async function client( - endpoint: string, - { body, ...customConfig }: any = {} -) { - const headers = { 'Content-Type': 'application/json' }; - - const config = { - method: body ? 'POST' : 'GET', - ...customConfig, - headers: { - ...headers, - ...customConfig.headers, - }, - }; - - if (body) { - config.body = JSON.stringify(body); - } - - let data; - try { - const response = await window.fetch(endpoint, config); - data = await response.json(); - if (response.ok) { - // Return a result object similar to Axios - return { - status: response.status, - data, - headers: response.headers, - url: response.url, - }; - } - throw new Error(response.statusText); - } catch (err: any) { - return Promise.reject(err.message ? err.message : data); - } -} - -client.get = function (endpoint: string, customConfig: any = {}) { - return client(endpoint, { ...customConfig, method: 'GET' }); -}; - -client.post = function (endpoint: string, body: any, customConfig: any = {}) { - return client(endpoint, { ...customConfig, body }); -}; diff --git a/packages/redux/tests/api/server.ts b/packages/redux/tests/api/server.ts deleted file mode 100644 index cb4fc28..0000000 --- a/packages/redux/tests/api/server.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { rest } from 'msw'; -import { setupServer } from 'msw/node'; -import { afterAll, afterEach, beforeAll } from 'vitest'; -import { Posts } from '../slices/posts'; -import { Users } from '../slices/users'; - -export const BASE_URL = 'https://trrack-test.dev'; - -const users: Users = [ - { - id: '1', - name: 'Leanne Graham', - }, - { - id: '2', - name: 'Ervin Howell', - }, - { - id: '3', - name: 'Clementine Bauch', - }, -]; - -const posts: Posts = [ - { - user: '1', - id: '1', - title: 'sunt aut facere repellat provident occaecati excepturi optio reprehenderit', - content: - 'quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto', - }, - { - user: '1', - id: '2', - title: 'qui est esse', - content: - 'est rerum tempore vitae\nsequi sint nihil reprehenderit dolor beatae ea dolores neque\nfugiat blanditiis voluptate porro vel nihil molestiae ut reiciendis\nqui aperiam non debitis possimus qui neque nisi nulla', - }, - { - user: '2', - id: '3', - title: 'ea molestias quasi exercitationem repellat qui ipsa sit aut', - content: - 'et iusto sed quo iure\nvoluptatem occaecati omnis eligendi aut ad\nvoluptatem doloribus vel accusantium quis pariatur\nmolestiae porro eius odio et labore et velit aut', - }, - { - user: '3', - id: '4', - title: 'eum et est occaecati', - content: - 'ullam et saepe reiciendis voluptatem adipisci\nsit amet autem assumenda provident rerum culpa\nquis hic commodi nesciunt rem tenetur doloremque ipsam iure\nquis sunt voluptatem rerum illo velit', - }, - { - user: '3', - id: '5', - title: 'nesciunt quas odio', - content: - 'repudiandae veniam quaerat sunt sed\nalias aut fugiat sit autem sed est\nvoluptatem omnis possimus esse voluptatibus quis\nest aut tenetur dolor neque', - }, -]; - -export const restHandlers = [ - rest.get(`${BASE_URL}/posts`, (req, res, ctx) => { - return res(ctx.status(200), ctx.json(posts)); - }), - rest.get(`${BASE_URL}/users`, (req, res, ctx) => { - return res(ctx.status(200), ctx.json(users)); - }), -]; - -const server = setupServer(...restHandlers); - -// Start server before all tests -beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); - -// Close server after all tests -afterAll(() => server.close()); - -// Reset handlers after each test `important for test isolation` -afterEach(() => server.resetHandlers()); diff --git a/packages/redux/tests/async.spec.ts b/packages/redux/tests/async.spec.ts deleted file mode 100644 index 7f6410c..0000000 --- a/packages/redux/tests/async.spec.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('trracked slice', () => { - it('should be tracked', () => { - expect(true).toBeTruthy(); - }); -}); diff --git a/packages/redux/tests/index.spec.ts b/packages/redux/tests/index.spec.ts deleted file mode 100644 index 37fbd1a..0000000 --- a/packages/redux/tests/index.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'; - -import { configureTrrackableStore, createTrrackableSlice } from '../src'; - -describe('it', () => { - it('should work', () => { - const getPostById = createAsyncThunk( - 'test/getpostById', - async (postId: number, _api) => { - const response = await fetch( - ` https://jsonplaceholder.typicode.com/posts/${postId} ` - ); - - return response.json(); - } - ); - - const testSlice = createTrrackableSlice({ - name: 'test', - initialState: { - hello: 'World', - post: { - userId: -1, - id: -1, - title: '', - body: '', - }, - }, - reducers: { - sayHello(state, action: PayloadAction) { - state.hello = action.payload; - }, - }, - extraReducers: (builder) => { - builder.addCase(getPostById.fulfilled, (state, action) => { - state.post = action.payload; - }); - }, - labels: { - sayHello: (args) => `Say hello to ${args}`, - }, - doUndoActionCreators: { - sayHello({ previousState }) { - return { - undo: sayHello(previousState.test.hello), - }; - }, - }, - }); - - const { sayHello } = testSlice.actions as any; - - const { store, trrack } = configureTrrackableStore({ - reducer: { - test: testSlice.reducer, - }, - sliceMap: { - test: testSlice, - }, - }); - - // store.dispatch(sayHello('Mars')); - // trrack.undo(); - - expect(true).toBeTruthy(); - }); -}); diff --git a/packages/redux/tests/slices/posts.ts b/packages/redux/tests/slices/posts.ts index f432fa4..b0009f9 100644 --- a/packages/redux/tests/slices/posts.ts +++ b/packages/redux/tests/slices/posts.ts @@ -1,4 +1,4 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { randomUUID } from 'crypto'; import { createTrrackableSlice } from '../../src'; import { SliceWrapper } from './utils'; @@ -15,7 +15,7 @@ export type Posts = SinglePost[]; const initialState: Posts = []; const postsSlice = createSlice({ - name: 'posts', + name: 'user', initialState, reducers: { postAdded: { diff --git a/packages/redux/tests/slices/users.ts b/packages/redux/tests/slices/users.ts index 42a13f8..611d24b 100644 --- a/packages/redux/tests/slices/users.ts +++ b/packages/redux/tests/slices/users.ts @@ -1,4 +1,4 @@ -import { PayloadAction, createSlice } from '@reduxjs/toolkit'; +import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { createTrrackableSlice } from '../../src'; import { SliceWrapper } from './utils'; @@ -29,6 +29,12 @@ const trrackableUsersSlice = createTrrackableSlice({ state.push(action.payload); }, }, + labels: { + addUser: 'custom-adder-label', + }, + reducerEventTypes: { + addUser: 'add-user-event', + }, }); export const User: SliceWrapper< diff --git a/packages/redux/tests/store/fullyTrrackableStore.ts b/packages/redux/tests/store/fullyTrrackableStore.ts index 841b5c2..05b3979 100644 --- a/packages/redux/tests/store/fullyTrrackableStore.ts +++ b/packages/redux/tests/store/fullyTrrackableStore.ts @@ -1,14 +1,18 @@ +import { configureStore } from '@reduxjs/toolkit'; import { configureTrrackableStore } from '../../src'; import { Counter } from '../slices/counter'; import { Post } from '../slices/posts'; import { User } from '../slices/users'; -export const trrackableStore = configureTrrackableStore({ +export const ts = configureStore({ reducer: { users: User.trrackableSlice.reducer, posts: Post.trrackableSlice.reducer, counter: Counter.trrackableSlice.reducer, }, +}); + +export const trrackableStore = configureTrrackableStore({ sliceMap: { users: User.trrackableSlice, posts: Post.trrackableSlice, diff --git a/packages/redux/tests/trracked.spec.ts b/packages/redux/tests/trracked.spec.ts index 88e3294..9b2dfcc 100644 --- a/packages/redux/tests/trracked.spec.ts +++ b/packages/redux/tests/trracked.spec.ts @@ -26,19 +26,19 @@ describe('trracked slice', () => { store.dispatch(actions.addUser(user2)); store.dispatch(actions.addUser(user3)); - expect(trrack.getState().users).toHaveLength(3); - expect(trrack.getState().users[0]).toStrictEqual(user1); - expect(trrack.getState().users[1]).toStrictEqual(user2); - expect(trrack.getState().users[2]).toStrictEqual(user3); + expect(store.getState().users).toHaveLength(3); + expect(store.getState().users[0]).toStrictEqual(user1); + expect(store.getState().users[1]).toStrictEqual(user2); + expect(store.getState().users[2]).toStrictEqual(user3); }); it('undo should remove last added user', () => { trrack.undo(); - expect(trrack.getState().users).toHaveLength(2); - expect(trrack.getState().users[0]).toStrictEqual(user1); - expect(trrack.getState().users[1]).toStrictEqual(user2); - expect(trrack.getState().users[2]).toBeUndefined(); + expect(store.getState().users).toHaveLength(2); + expect(store.getState().users[0]).toStrictEqual(user1); + expect(store.getState().users[1]).toStrictEqual(user2); + expect(store.getState().users[2]).toBeUndefined(); trrack.redo(); }); @@ -50,23 +50,23 @@ describe('trracked slice', () => { store.dispatch(actions.postAdded(post4)); store.dispatch(actions.postAdded(post5)); - expect(trrack.getState().posts).toHaveLength(5); - expect(trrack.getState().posts[0].content).toEqual(post1.content); - expect(trrack.getState().posts[1].content).toEqual(post2.content); - expect(trrack.getState().posts[2].content).toEqual(post3.content); - expect(trrack.getState().posts[3].content).toEqual(post4.content); - expect(trrack.getState().posts[4].content).toEqual(post5.content); + expect(store.getState().posts).toHaveLength(5); + expect(store.getState().posts[0].content).toEqual(post1.content); + expect(store.getState().posts[1].content).toEqual(post2.content); + expect(store.getState().posts[2].content).toEqual(post3.content); + expect(store.getState().posts[3].content).toEqual(post4.content); + expect(store.getState().posts[4].content).toEqual(post5.content); }); it('undo should remove last added post', () => { trrack.undo(); - expect(trrack.getState().posts).toHaveLength(4); - expect(trrack.getState().posts[0].content).toEqual(post1.content); - expect(trrack.getState().posts[1].content).toEqual(post2.content); - expect(trrack.getState().posts[2].content).toEqual(post3.content); - expect(trrack.getState().posts[3].content).toEqual(post4.content); - expect(trrack.getState().posts[4]).toBeUndefined(); + expect(store.getState().posts).toHaveLength(4); + expect(store.getState().posts[0].content).toEqual(post1.content); + expect(store.getState().posts[1].content).toEqual(post2.content); + expect(store.getState().posts[2].content).toEqual(post3.content); + expect(store.getState().posts[3].content).toEqual(post4.content); + expect(store.getState().posts[4]).toBeUndefined(); trrack.redo(); }); @@ -74,12 +74,12 @@ describe('trracked slice', () => { it('undo should remove last added post', () => { trrack.undo(); - expect(trrack.getState().posts).toHaveLength(4); - expect(trrack.getState().posts[0].content).toEqual(post1.content); - expect(trrack.getState().posts[1].content).toEqual(post2.content); - expect(trrack.getState().posts[2].content).toEqual(post3.content); - expect(trrack.getState().posts[3].content).toEqual(post4.content); - expect(trrack.getState().posts[4]).toBeUndefined(); + expect(store.getState().posts).toHaveLength(4); + expect(store.getState().posts[0].content).toEqual(post1.content); + expect(store.getState().posts[1].content).toEqual(post2.content); + expect(store.getState().posts[2].content).toEqual(post3.content); + expect(store.getState().posts[3].content).toEqual(post4.content); + expect(store.getState().posts[4]).toBeUndefined(); trrack.redo(); }); diff --git a/packages/redux/tests/untrracked.spec.ts b/packages/redux/tests/untrracked.spec.ts index 6d272ab..ea1e30e 100644 --- a/packages/redux/tests/untrracked.spec.ts +++ b/packages/redux/tests/untrracked.spec.ts @@ -15,35 +15,60 @@ describe('untrracked slice', () => { const user2 = User.generate(); const user3 = User.generate(); + const post1 = Post.generate(user1.id); + const post2 = Post.generate(user1.id); + const post3 = Post.generate(user2.id); + const post4 = Post.generate(user2.id); + const post5 = Post.generate(user3.id); + it('should have all users added at correct position', () => { store.dispatch(actions.addUser(user1)); store.dispatch(actions.addUser(user2)); store.dispatch(actions.addUser(user3)); - expect(trrack.getState().users).toHaveLength(3); - expect(trrack.getState().users[0]).toStrictEqual(user1); - expect(trrack.getState().users[1]).toStrictEqual(user2); - expect(trrack.getState().users[2]).toStrictEqual(user3); + expect(store.getState().users).toHaveLength(3); + expect(store.getState().users[0]).toStrictEqual(user1); + expect(store.getState().users[1]).toStrictEqual(user2); + expect(store.getState().users[2]).toStrictEqual(user3); }); it('undo should remove last added user', () => { trrack.undo(); - expect(trrack.getState().users).toHaveLength(2); - expect(trrack.getState().users[0]).toStrictEqual(user1); - expect(trrack.getState().users[1]).toStrictEqual(user2); - expect(trrack.getState().users[2]).toBeUndefined(); + expect(store.getState().users).toHaveLength(2); + expect(store.getState().users[0]).toStrictEqual(user1); + expect(store.getState().users[1]).toStrictEqual(user2); + expect(store.getState().users[2]).toBeUndefined(); trrack.redo(); }); - // it('should not have posts key', () => { - // expect(trrack.getState().posts).toBeUndefined(); - // }); + it('should have all posts added at correct position', () => { + store.dispatch(actions.postAdded(post1)); + store.dispatch(actions.postAdded(post2)); + store.dispatch(actions.postAdded(post3)); + store.dispatch(actions.postAdded(post4)); + store.dispatch(actions.postAdded(post5)); + + expect(store.getState().posts).toHaveLength(5); + expect(store.getState().posts[0].content).toEqual(post1.content); + expect(store.getState().posts[1].content).toEqual(post2.content); + expect(store.getState().posts[2].content).toEqual(post3.content); + expect(store.getState().posts[3].content).toEqual(post4.content); + expect(store.getState().posts[4].content).toEqual(post5.content); + }); - // it('should increment counter by 1', () => { - // store.dispatch(actions.increment()); + it('undo should remove last added post', () => { + console.log('Hello'); + trrack.undo(); - // expect(trrack.getState().counter).toBeUndefined(); - // }); + expect(store.getState().posts).toHaveLength(5); + expect(store.getState().posts[0].content).toEqual(post1.content); + expect(store.getState().posts[1].content).toEqual(post2.content); + expect(store.getState().posts[2].content).toEqual(post3.content); + expect(store.getState().posts[3].content).toEqual(post4.content); + expect(store.getState().posts[4]).toBeUndefined(); + + trrack.redo(); + }); }); From a982f2c0d1b862cbd5caaeeb0112aa6cf085312f Mon Sep 17 00:00:00 2001 From: Kiran Gadhave Date: Thu, 15 Jun 2023 01:25:56 -0600 Subject: [PATCH 7/7] fix(redux): fixed the bug with untrracked slices untrracked slices should maintain value during undo/redo. fixed the logic to make sure this happens. Added unit tests to test the behaviour closes #34 --- .../redux/src/slice/trrackableSliceCreator.ts | 14 +- .../redux/src/store/trrackableStoreCreator.ts | 191 +++++++++--------- packages/redux/tests/slices/posts.ts | 4 +- .../redux/tests/store/fullyTrrackableStore.ts | 9 - .../tests/store/partiallyTrrackableStore.ts | 5 - packages/redux/tests/untrracked.spec.ts | 14 +- 6 files changed, 126 insertions(+), 111 deletions(-) diff --git a/packages/redux/src/slice/trrackableSliceCreator.ts b/packages/redux/src/slice/trrackableSliceCreator.ts index a6ac9a1..5fa8d5b 100644 --- a/packages/redux/src/slice/trrackableSliceCreator.ts +++ b/packages/redux/src/slice/trrackableSliceCreator.ts @@ -10,11 +10,11 @@ import { } from '@reduxjs/toolkit'; import { - ACTION_NAME_TYPE_MAP, ActionNameToTypeMap, + ACTION_NAME_TYPE_MAP, ASYNC_THUNKS, - DO_UNDO_ACTION_CREATORS, DoUndoActionCreators, + DO_UNDO_ACTION_CREATORS, EVENTS, GeneratedDoUndoActionCreators, LabelGenerators, @@ -224,6 +224,16 @@ function createDoUndoActionCreators< return duac; } +/** + * @template State - type of the state handled by the slice + * @template CaseReducers extends SliceCaseReducers - type for reducers + * @template Event extends string = string - type for events associated with the reducers + * @template Name extends string = string - name of the slice + * + * @param options - accepts the same arguments as `createSlice` from `redux-toolkit` along with optional config for trrackable slice + * + * @returns - a trrackable slice object + */ export function createTrrackableSlice< State, CaseReducers extends SliceCaseReducers, diff --git a/packages/redux/src/store/trrackableStoreCreator.ts b/packages/redux/src/store/trrackableStoreCreator.ts index 8aaefbc..85c96d7 100644 --- a/packages/redux/src/store/trrackableStoreCreator.ts +++ b/packages/redux/src/store/trrackableStoreCreator.ts @@ -51,16 +51,6 @@ function isTraverseAction( return action.type === trrackTraverseAction.type; } -function makeTrrackable( - reducer: Reducer -) { - return function (state: State | undefined, action: A) { - if (isTraverseAction(action)) - return reducer(action.payload as State, action); - return reducer(state, action); - }; -} - function mergeLabels(slices: Slice[]) { return slices.reduce((acc, slice) => { if (isSliceTrrackable(slice)) { @@ -119,10 +109,20 @@ function mergeTrrackedActions(slices: Slice[]) { } function mergeReducers(sliceMap: SliceMap) { - const slices = Object.values(sliceMap) as Slice[]; - return slices.reduce((acc, slice) => { + const slices: Array<{ key: string; slice: Slice }> = []; + + for (const sliceKey in sliceMap) { + const slice = sliceMap[sliceKey]; + + slices.push({ + key: sliceKey, + slice, + }); + } + + return slices.reduce((acc, slc) => { const scr: SliceCaseReducers = { - [slice.name]: slice.reducer, + [slc.key]: slc.slice.reducer, }; // Object.entries(slice.actions).forEach(([key, action]) => { @@ -156,7 +156,7 @@ function trrackActionCheckerCreator( return isAnyOf(actions[0], ...actions); } -function trrackedState( +function extractTrrackedState( state: State, sliceMap: SliceMap ): Trrackable { @@ -172,62 +172,63 @@ function trrackedState( return state as any; } -export function configureTrrackableStore( - opts: Omit, 'reducer'> & { - sliceMap: SliceMap; - } +function makeTrrackable( + reducer: Reducer ) { - const reducer = mergeReducers(opts.sliceMap); - - const reduxStore = configureStore({ - ...opts, - reducer, - }); - - return { store: reduxStore, trrack: {} as any, trrackStore: {} as any }; + return function (state: State | undefined, action: A) { + if (isTraverseAction(action)) + return reducer(action.payload as State, action); + return reducer(state, action); + }; } -export function _configureTrrackableStore( - opts: ConfigureStoreOptions & { +type MiddlewareRunState = 'active' | 'paused'; + +export function configureTrrackableStore( + opts: Omit, 'reducer'> & { sliceMap: SliceMap; } ) { const slices: Slice[] = Object.values(opts.sliceMap); - const trrackMiddleware = createListenerMiddleware(); - const _reducer = mergeReducers(opts.sliceMap); + const reducerMap = mergeReducers(opts.sliceMap); - const store = configureStore({ + const reducer = makeTrrackable(combineReducers(reducerMap)) as any; + + const trrackListenerMiddleware = createListenerMiddleware(); + + const reduxStore = configureStore({ ...opts, - reducer: makeTrrackable( - typeof _reducer === 'function' - ? _reducer - : (combineReducers(_reducer) as any) - ), + reducer, middleware(getDefaultMiddleware) { const suppliedMiddleware = opts.middleware; - if (!suppliedMiddleware) + + if (!suppliedMiddleware) { return getDefaultMiddleware().prepend( - trrackMiddleware.middleware + trrackListenerMiddleware.middleware ); + } + if (typeof suppliedMiddleware === 'function') { return [ ...suppliedMiddleware(getDefaultMiddleware), - trrackMiddleware.middleware, + trrackListenerMiddleware.middleware, ]; } - return [...suppliedMiddleware, trrackMiddleware.middleware]; + + return [...suppliedMiddleware, trrackListenerMiddleware.middleware]; }, }); /** * Create types for listener */ - type RootState = ReturnType; - type AppDispatch = typeof store.dispatch; + type RootState = ReturnType; + type AppDispatch = typeof reduxStore.dispatch; type AppStartListening = TypedStartListening; - const startListening = trrackMiddleware.startListening as AppStartListening; + const startListening = + trrackListenerMiddleware.startListening as AppStartListening; // Fin. const labels = mergeLabels(slices); @@ -235,70 +236,77 @@ export function _configureTrrackableStore( const reducerEventTypes = mergeReducerEventTypes(slices); const asyncThunks = mergeAsyncThunks(slices); const trrackedActions = mergeTrrackedActions(slices); - const isTrrackedAction = trrackActionCheckerCreator(trrackedActions); + const isActionTrracked = trrackActionCheckerCreator(trrackedActions); - const onlyTrrackedState = trrackedState(store.getState(), opts.sliceMap); + const trrackedState = extractTrrackedState( + reduxStore.getState(), + opts.sliceMap + ); - const trrack = initializeTrrack({ - initialState: onlyTrrackedState, + const trrackInstance = initializeTrrack({ + initialState: trrackedState, registry: Registry.create(), }); - let middlewareStatus: 'active' | 'paused' = 'active'; - - Object.values(asyncThunks).forEach((thunk) => { - if (!trrack.registry.has(thunk.typePrefix)) { - trrack.registry.register(thunk.typePrefix, (args: any) => { - middlewareStatus = 'paused'; - const th = store.dispatch(thunk(args) as any); - return th.then(() => (middlewareStatus = 'active')); - }); + let middlewareStatus: MiddlewareRunState = 'active'; + + for (const key in asyncThunks) { + const thunk = asyncThunks[key]; + if (!trrackInstance.registry.has(thunk.typePrefix)) { + trrackInstance.registry.register( + thunk.typePrefix, + async (args: any) => { + middlewareStatus = 'paused'; + const th = await reduxStore.dispatch(thunk(args) as any); + middlewareStatus = 'active'; + return th; + } + ); } - }); + } slices.forEach((slice) => { - Object.values(slice.actions).forEach((action) => { - trrack.registry.register(action.type, ((act: AnyAction) => { - return store.dispatch(act); - }) as any); - }); + for (const actionName in slice.actions) { + const action = slice.actions[actionName]; + + if (!trrackInstance.registry.has(action.type)) { + trrackInstance.registry.register( + action.type, + (act: AnyAction) => { + return reduxStore.dispatch(act); + } + ); + } + } }); const trrackStore = getTrrackStore({ - current: trrack.current.id, + current: trrackInstance.current.id, }); - trrack.currentChange(() => { + trrackInstance.currentChange(() => { middlewareStatus = 'paused'; - console.group(trrack.current.id); - - console.log(trrack.current.label); - console.log('new', onlyTrrackedState); - console.log('store', store.getState()); - console.log('trrack', trrack.getState()); - - console.groupEnd(); - - store.dispatch( - trrackTraverseAction({ ...store.getState(), ...trrack.getState() }) + const state = reduxStore.getState(); + reduxStore.dispatch( + trrackTraverseAction({ ...state, ...trrackInstance.getState() }) ); - trrackStore.dispatch(changeCurrent(trrack.current.id)); + trrackStore.dispatch(changeCurrent(trrackInstance.current.id)); + middlewareStatus = 'active'; }); startListening({ predicate(action) { - if (trrack.isTraversing) return false; // Never run middleware when trrack is traversing. + if (trrackInstance.isTraversing) return false; - if (middlewareStatus === 'paused') return false; // Never run middleware when middleware is set to pause. + if (middlewareStatus === 'paused') return false; - // Check if given actions is fulfilled async thunk action and only then return true. if (isAsyncThunkAction(action)) { return isFulfilled(action); } - return isTrrackedAction(action); + return isActionTrracked(action); }, effect(action, api) { const isThunk = isFulfilled(action); @@ -306,22 +314,25 @@ export function _configureTrrackableStore( const type = isThunk ? asyncThunks[action.type].typePrefix : action.type; + const payload = action['payload']; + const labelGenerator = labels[type]; const label = labelGenerator(payload); const doUndoObject = doUndoActionCreators[type]({ action: action as PayloadAction, - currentState: trrackedState(api.getState(), opts.sliceMap), - previousState: trrackedState( + currentState: extractTrrackedState( + api.getState(), + opts.sliceMap + ), + previousState: extractTrrackedState( api.getOriginalState(), opts.sliceMap ), }); - console.log({ doUndoObject }); - const hasSideEffects = !NO_OP_ACTION.match(doUndoObject.undo); if (hasSideEffects) { @@ -330,10 +341,11 @@ export function _configureTrrackableStore( ? (action as PayloadAction) : (doUndoObject.do as PayloadAction); - trrack.record({ + trrackInstance.record({ label, - state: trrackedState(api.getState(), opts.sliceMap), + state: extractTrrackedState(api.getState(), opts.sliceMap), eventType: reducerEventTypes[type], + sideEffects: { do: [ { @@ -352,10 +364,9 @@ export function _configureTrrackableStore( }); } else { // ! Fix - - trrack.record({ + trrackInstance.record({ label, - state: api.getState(), + state: extractTrrackedState(api.getState(), opts.sliceMap), eventType: reducerEventTypes[type], sideEffects: { do: [], @@ -366,5 +377,5 @@ export function _configureTrrackableStore( }, }); - return { store, trrack, trrackStore }; + return { store: reduxStore, trrack: trrackInstance, trrackStore }; } diff --git a/packages/redux/tests/slices/posts.ts b/packages/redux/tests/slices/posts.ts index b0009f9..fac9c42 100644 --- a/packages/redux/tests/slices/posts.ts +++ b/packages/redux/tests/slices/posts.ts @@ -15,7 +15,7 @@ export type Posts = SinglePost[]; const initialState: Posts = []; const postsSlice = createSlice({ - name: 'user', + name: 'posts', initialState, reducers: { postAdded: { @@ -90,5 +90,5 @@ export const Post: SliceWrapper< user: args, }; }, - actions: trrackablePostsSlice.actions, + actions: trrackablePostsSlice.actions as any, }; diff --git a/packages/redux/tests/store/fullyTrrackableStore.ts b/packages/redux/tests/store/fullyTrrackableStore.ts index 05b3979..eb23fe2 100644 --- a/packages/redux/tests/store/fullyTrrackableStore.ts +++ b/packages/redux/tests/store/fullyTrrackableStore.ts @@ -1,17 +1,8 @@ -import { configureStore } from '@reduxjs/toolkit'; import { configureTrrackableStore } from '../../src'; import { Counter } from '../slices/counter'; import { Post } from '../slices/posts'; import { User } from '../slices/users'; -export const ts = configureStore({ - reducer: { - users: User.trrackableSlice.reducer, - posts: Post.trrackableSlice.reducer, - counter: Counter.trrackableSlice.reducer, - }, -}); - export const trrackableStore = configureTrrackableStore({ sliceMap: { users: User.trrackableSlice, diff --git a/packages/redux/tests/store/partiallyTrrackableStore.ts b/packages/redux/tests/store/partiallyTrrackableStore.ts index 066e3e2..35b246b 100644 --- a/packages/redux/tests/store/partiallyTrrackableStore.ts +++ b/packages/redux/tests/store/partiallyTrrackableStore.ts @@ -5,11 +5,6 @@ import { User } from '../slices/users'; export const trrackableStore = () => configureTrrackableStore({ - reducer: { - users: User.trrackableSlice.reducer, - posts: Post.slice.reducer, - counter: Counter.slice.reducer, - }, sliceMap: { users: User.trrackableSlice, posts: Post.slice, diff --git a/packages/redux/tests/untrracked.spec.ts b/packages/redux/tests/untrracked.spec.ts index ea1e30e..c0f5fe2 100644 --- a/packages/redux/tests/untrracked.spec.ts +++ b/packages/redux/tests/untrracked.spec.ts @@ -50,6 +50,8 @@ describe('untrracked slice', () => { store.dispatch(actions.postAdded(post4)); store.dispatch(actions.postAdded(post5)); + // TODO: Possibly has a bug + expect(store.getState().posts).toHaveLength(5); expect(store.getState().posts[0].content).toEqual(post1.content); expect(store.getState().posts[1].content).toEqual(post2.content); @@ -58,16 +60,22 @@ describe('untrracked slice', () => { expect(store.getState().posts[4].content).toEqual(post5.content); }); - it('undo should remove last added post', () => { - console.log('Hello'); + it('undo should remove last added user, but not the post', () => { trrack.undo(); + console.log(store.getState()); + + expect(store.getState().users).toHaveLength(2); + expect(store.getState().users[0]).toStrictEqual(user1); + expect(store.getState().users[1]).toStrictEqual(user2); + expect(store.getState().users[2]).toBeUndefined(); + expect(store.getState().posts).toHaveLength(5); expect(store.getState().posts[0].content).toEqual(post1.content); expect(store.getState().posts[1].content).toEqual(post2.content); expect(store.getState().posts[2].content).toEqual(post3.content); expect(store.getState().posts[3].content).toEqual(post4.content); - expect(store.getState().posts[4]).toBeUndefined(); + expect(store.getState().posts[4].content).toEqual(post5.content); trrack.redo(); });