diff --git a/package.json b/package.json index 0baa4252d31..0b87ffb0977 100644 --- a/package.json +++ b/package.json @@ -131,7 +131,6 @@ "@types/react-virtualized": "^9.18.7", "@types/recompose": "^0.20.4", "@types/reselect": "^2.0.27", - "@types/seamless-immutable": "^6.1.2", "@types/sinon": "^4.1.3", "@types/superagent": "^2.0.36", "autobind-decorator": "^2.1.0", @@ -277,7 +276,6 @@ "sass-loader": "10.1.1", "sass-resources-loader": "^1.3.1", "save-svg-as-png": "^1.4.17", - "seamless-immutable": "^7.0.1", "source-map-loader": "^0.1.6", "style-loader": "^4.0.0", "styled-components": "^4.2.1", diff --git a/packages/cbioportal-frontend-commons/package.json b/packages/cbioportal-frontend-commons/package.json index 8ec39f16913..a3ab1a684b4 100644 --- a/packages/cbioportal-frontend-commons/package.json +++ b/packages/cbioportal-frontend-commons/package.json @@ -54,7 +54,6 @@ "react-overlays": "0.7.4", "react-select": "^3.0.4", "save-svg-as-png": "^1.4.17", - "seamless-immutable": "^7.0.1", "superagent": "^3.8.3", "svg2pdf.js": "github:cbioportal/svg2pdf.js#v1.3.3-cbio-patch-1", "typescript": "4.0.3", diff --git a/packages/cbioportal-frontend-commons/src/api/remoteData.ts b/packages/cbioportal-frontend-commons/src/api/remoteData.ts index 14d5a97d67d..92c35a40831 100644 --- a/packages/cbioportal-frontend-commons/src/api/remoteData.ts +++ b/packages/cbioportal-frontend-commons/src/api/remoteData.ts @@ -18,10 +18,6 @@ export function addServiceErrorHandler(handler: errorHandler) { return JSON.stringify(this.result); }; -/** - * Constructs a MobxPromise which will call seamlessImmutable.from() on the result and the default value. - */ - export const remoteData: MobxPromiseFactory = function( input: MobxPromiseInputUnion, defaultResult?: R diff --git a/packages/cbioportal-frontend-commons/src/lib/SimpleCache.ts b/packages/cbioportal-frontend-commons/src/lib/SimpleCache.ts index e1bf1aad77c..6e1af88821f 100644 --- a/packages/cbioportal-frontend-commons/src/lib/SimpleCache.ts +++ b/packages/cbioportal-frontend-commons/src/lib/SimpleCache.ts @@ -1,5 +1,4 @@ import { observable, action, makeObservable } from 'mobx'; -import Immutable from 'seamless-immutable'; export interface ICacheData { status: 'pending' | 'complete' | 'error'; @@ -10,19 +9,16 @@ export interface ICache { [queryId: string]: ICacheData; } -export type ImmutableCache = ICache & - Immutable.ImmutableObject>; - /** * @author Selcuk Onur Sumer */ export default class SimpleCache { - @observable.ref protected _cache: ImmutableCache; + @observable.ref protected _cache: ICache; protected _pendingCache: ICache; constructor() { makeObservable, '_cache' | 'putData'>(this); - this._cache = Immutable.from>({}); + this._cache = {}; this._pendingCache = {}; } @@ -86,9 +82,7 @@ export default class SimpleCache { // put the data into the actual cache if (Object.keys(data).length > 0) { - this._cache = this._cache.merge(data, { - deep: true, - }) as ImmutableCache; + this._cache = { ...this._cache, ...data }; } } } diff --git a/packages/react-mutation-mapper/package.json b/packages/react-mutation-mapper/package.json index b282d09b2a5..9e9870e5608 100644 --- a/packages/react-mutation-mapper/package.json +++ b/packages/react-mutation-mapper/package.json @@ -54,7 +54,6 @@ "react-rangeslider": "^2.2.0", "react-select": "^3.0.4", "react-table": "^6.10.0", - "seamless-immutable": "^7.1.4", "superagent": "^3.8.3", "typescript": "4.0.3" } diff --git a/packages/react-variant-view/package.json b/packages/react-variant-view/package.json index 482883539e1..d906f0cbc98 100644 --- a/packages/react-variant-view/package.json +++ b/packages/react-variant-view/package.json @@ -55,7 +55,6 @@ "react-rangeslider": "^2.2.0", "react-select": "^3.0.4", "react-table": "^6.10.0", - "seamless-immutable": "^7.1.4", "superagent": "^3.8.3", "typescript": "4.0.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8d39c7ee81f..0b56c7cfc61 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -186,9 +186,6 @@ importers: '@types/reselect': specifier: ^2.0.27 version: 2.2.0 - '@types/seamless-immutable': - specifier: ^6.1.2 - version: 6.1.2 '@types/sinon': specifier: ^4.1.3 version: 4.3.3 @@ -624,9 +621,6 @@ importers: save-svg-as-png: specifier: ^1.4.17 version: 1.4.17 - seamless-immutable: - specifier: ^7.0.1 - version: 7.1.4 source-map-loader: specifier: ^0.1.6 version: 0.1.6 @@ -871,9 +865,6 @@ importers: save-svg-as-png: specifier: ^1.4.17 version: 1.4.17 - seamless-immutable: - specifier: ^7.0.1 - version: 7.1.4 superagent: specifier: ^3.8.3 version: 3.8.3 @@ -954,7 +945,7 @@ importers: version: 0.31.5(react-dom@16.14.0(react@16.14.0))(react@16.14.0) react-collapse: specifier: ^4.0.3 - version: 4.0.3(react-motion@0.4.8(react@16.14.0))(react@16.14.0) + version: 4.0.3(react-motion@0.5.2(react@16.14.0))(react@16.14.0) react-if: specifier: ^2.1.0 version: 2.2.2(prop-types@15.7.2)(react@16.14.0) @@ -1045,9 +1036,6 @@ importers: react-table: specifier: ^6.10.0 version: 6.10.0(prop-types@15.7.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - seamless-immutable: - specifier: ^7.1.4 - version: 7.1.4 superagent: specifier: ^3.8.3 version: 3.8.3 @@ -1111,9 +1099,6 @@ importers: react-table: specifier: ^6.10.0 version: 6.10.0(prop-types@15.7.2)(react-dom@16.14.0(react@16.14.0))(react@16.14.0) - seamless-immutable: - specifier: ^7.1.4 - version: 7.1.4 superagent: specifier: ^3.8.3 version: 3.8.3 @@ -3376,9 +3361,6 @@ packages: '@types/scheduler@0.16.8': resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - '@types/seamless-immutable@6.1.2': - resolution: {integrity: sha512-l2P2b2sGaJ22TNjZvga7HaLBF9oHrrqK2zi+9okJ9uXAhXAGIeDBc6wptnHUX0TwHsQqDNDixRxJ56cRhI21aQ==} - '@types/send@0.17.6': resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} @@ -10594,9 +10576,6 @@ packages: scrollparent@2.0.1: resolution: {integrity: sha512-HSdN78VMvFCSGCkh0oYX/tY4R3P1DW61f8+TeZZ4j2VLgfwvw0bpRSOv4PCVKisktIwbzHCfZsx+rLbbDBqIBA==} - seamless-immutable@7.1.4: - resolution: {integrity: sha512-XiUO1QP4ki4E2PHegiGAlu6r82o5A+6tRh7IkGGTVg/h+UoeX4nFBeCGPOhb4CYjvkqsfm/TUtvOMYC1xmV30A==} - select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -15683,8 +15662,6 @@ snapshots: '@types/scheduler@0.16.8': {} - '@types/seamless-immutable@6.1.2': {} - '@types/send@0.17.6': dependencies: '@types/mime': 1.3.5 @@ -25043,8 +25020,6 @@ snapshots: scrollparent@2.0.1: {} - seamless-immutable@7.1.4: {} - select-hose@2.0.0: {} select@1.1.2: {} diff --git a/src/pages/patientView/clinicalInformation/SampleGeneCache.ts b/src/pages/patientView/clinicalInformation/SampleGeneCache.ts index 3237accb241..321999ce506 100644 --- a/src/pages/patientView/clinicalInformation/SampleGeneCache.ts +++ b/src/pages/patientView/clinicalInformation/SampleGeneCache.ts @@ -1,5 +1,4 @@ import { observable, action, makeObservable } from 'mobx'; -import Immutable from 'seamless-immutable'; import _ from 'lodash'; import accumulatingDebounce from '../../../shared/lib/accumulatingDebounce'; @@ -32,8 +31,7 @@ type SampleToEntrezSet = { [sampleId: string]: { [entrez: string]: true } }; export default class SampleGeneCache< T extends { sampleId: string; entrezGeneId: number } > { - @observable.ref private _cache: Cache & - Immutable.ImmutableObject>; + @observable.ref private _cache: Cache; private _pending: PendingCache; private dependencies: any[]; @@ -158,7 +156,7 @@ export default class SampleGeneCache< geneData: {}, }; } - this._cache = Immutable.from>(_cache); + this._cache = _cache; } private markError(sampleToEntrezList: SampleToEntrezListOrNull) { @@ -288,11 +286,24 @@ export default class SampleGeneCache< } @action private updateCache(toMerge: CacheMerge) { - if (Object.keys(toMerge).length > 0) { - this._cache = this._cache.merge(toMerge, { deep: true }) as Cache< - T - > & - Immutable.ImmutableObject>; + if (Object.keys(toMerge).length === 0) { + return; + } + const merged: Cache = { ...this._cache }; + for (const sampleId of Object.keys(toMerge)) { + const existing = merged[sampleId] || { + fetchedWithoutGeneArgument: false as const, + geneData: {}, + }; + const update = toMerge[sampleId]; + merged[sampleId] = { + fetchedWithoutGeneArgument: + update.fetchedWithoutGeneArgument !== undefined + ? update.fetchedWithoutGeneArgument + : existing.fetchedWithoutGeneArgument, + geneData: { ...existing.geneData, ...(update.geneData || {}) }, + }; } + this._cache = merged; } } diff --git a/src/shared/components/lazyMobXTable/LazyMobXTable.tsx b/src/shared/components/lazyMobXTable/LazyMobXTable.tsx index 7a478237b7d..d75d221cbe2 100644 --- a/src/shared/components/lazyMobXTable/LazyMobXTable.tsx +++ b/src/shared/components/lazyMobXTable/LazyMobXTable.tsx @@ -199,8 +199,6 @@ export function lazyMobXTableSort( }[] = []; for (let i = 0; i < data.length; i++) { - // Have to do this loop instead of using data.map because we need dataAndValue to be mutable, - // and Immutable.js makes .map return another immutable structure; const d = data[i]; dataAndValue.push({ data: d, diff --git a/src/shared/lib/LazyMobXCache.ts b/src/shared/lib/LazyMobXCache.ts index 088772de6d6..1cd43d5ad6d 100644 --- a/src/shared/lib/LazyMobXCache.ts +++ b/src/shared/lib/LazyMobXCache.ts @@ -1,4 +1,3 @@ -import Immutable from 'seamless-immutable'; // need to use immutables so mobX can observe the cache shallowly import accumulatingDebounce from './accumulatingDebounce'; import { observable, action, reaction, makeObservable } from 'mobx'; import { AccumulatingDebouncedFunction } from './accumulatingDebounce'; @@ -23,9 +22,6 @@ type Pending = { [key: string]: boolean; }; -type ImmutableCache = Cache & - Immutable.ImmutableObject>; - type QueryKeyToQuery = { [queryKey: string]: Q }; export type AugmentedData = { @@ -48,7 +44,7 @@ function isAugmentedData( } export default class LazyMobXCache { - @observable.ref private _cache: ImmutableCache; + @observable.ref private _cache: Cache; private pending: Pending; private staticDependencies: any[]; @@ -102,7 +98,7 @@ export default class LazyMobXCache { private init() { this.pending = {}; - this._cache = Immutable.from>({}); + this._cache = {}; this.promises = []; } public get cache() { @@ -298,9 +294,7 @@ export default class LazyMobXCache { @action private updateCache(toMerge: Cache) { if (Object.keys(toMerge).length > 0) { - this._cache = this._cache.merge(toMerge, { - deep: true, - }) as ImmutableCache; + this._cache = { ...this._cache, ...toMerge }; } } } diff --git a/typings/missing.d.ts b/typings/missing.d.ts index a4f02fddf66..b653f1d494d 100644 --- a/typings/missing.d.ts +++ b/typings/missing.d.ts @@ -11,7 +11,6 @@ declare module 'object-sizeof'; declare module 'save-svg-as-png'; declare module 'react-file-download'; declare module 'reactableMSK'; -declare module 'redux-seamless-immutable'; declare module 'react-if'; declare module 'webpack-raphael'; declare module 'javascript-natural-sort';