From 0b4e34e877131762e6ab7a4d2ae69234366b5593 Mon Sep 17 00:00:00 2001 From: StefanNedelchev Date: Fri, 24 Mar 2023 22:13:08 +0200 Subject: [PATCH 1/4] drop lodash.clonedeep in favor of structuredClone --- common/reviews/api/tools.api.md | 16 ++++++++-------- package.json | 4 ++-- packages/core/package.json | 3 +-- .../core/src/RenderingEngine/StackViewport.ts | 3 +-- packages/core/src/RenderingEngine/Viewport.ts | 15 +++++++-------- packages/core/src/Settings.ts | 4 +++- packages/core/src/loaders/volumeLoader.ts | 5 ++--- packages/tools/package.json | 1 - .../keyboard/keyDownListener.ts | 3 +-- ...ameOfReferenceSpecificAnnotationManager.ts | 9 ++++----- .../segmentation/SegmentationStateManager.ts | 5 ++--- .../addSegmentationRepresentations.ts | 1 - .../segmentation/addSegmentations.ts | 3 +-- .../src/store/ToolGroupManager/ToolGroup.ts | 3 +-- packages/tools/src/store/state.ts | 4 +--- .../createLabelmapVolumeForViewport.ts | 19 +++++++++---------- tsconfig.base.json | 4 ++-- yarn.lock | 18 +++++++++--------- 18 files changed, 54 insertions(+), 66 deletions(-) diff --git a/common/reviews/api/tools.api.md b/common/reviews/api/tools.api.md index 8be7b331c..4663edc88 100644 --- a/common/reviews/api/tools.api.md +++ b/common/reviews/api/tools.api.md @@ -1208,16 +1208,16 @@ function createLabelmapVolumeForViewport(input: { renderingEngineId: string; segmentationId?: string; options?: { - volumeId?: string; - scalarData?: Float32Array | Uint8Array | Uint16Array | Int16Array; - targetBuffer?: { + volumeId: string; + scalarData: Float32Array | Uint8Array | Uint16Array | Int16Array; + targetBuffer: { type: 'Float32Array' | 'Uint8Array' | 'Uint16Array' | 'Int8Array'; }; - metadata?: any; - dimensions?: Types_2.Point3; - spacing?: Types_2.Point3; - origin?: Types_2.Point3; - direction?: Float32Array; + metadata: Types_2.Metadata; + dimensions: Types_2.Point3; + spacing: Types_2.Point3; + origin: Types_2.Point3; + direction: Types_2.Mat3; }; }): Promise; diff --git a/package.json b/package.json index 11a94a718..6c0048b5f 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", "@rollup/plugin-typescript": "^11.0.0", - "@types/node": "^14.18.9", + "@types/node": "^18.15.7", "@types/react": "^17.0.38", "@types/react-dom": "^17.0.11", "@typescript-eslint/eslint-plugin": "^5.48.1", @@ -109,7 +109,7 @@ "stylelint-config-recommended": "^4.0.0", "ts-loader": "^9.2.6", "typedoc": "^0.22.13", - "typescript": "4.6.4", + "typescript": "4.9.5", "unzipper": "^0.10.9", "url-loader": "^4.1.1", "webpack": "5.67.0", diff --git a/packages/core/package.json b/packages/core/package.json index 74f5ee7df..3281a4532 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -31,8 +31,7 @@ "gl-matrix": "^3.4.3" }, "dependencies": { - "detect-gpu": "^4.0.45", - "lodash.clonedeep": "4.5.0" + "detect-gpu": "^4.0.45" }, "devDependencies": { "@kitware/vtk.js": "26.5.6", diff --git a/packages/core/src/RenderingEngine/StackViewport.ts b/packages/core/src/RenderingEngine/StackViewport.ts index 2046cacb2..d8604a834 100644 --- a/packages/core/src/RenderingEngine/StackViewport.ts +++ b/packages/core/src/RenderingEngine/StackViewport.ts @@ -1,7 +1,6 @@ import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray'; import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; import type { vtkImageData as vtkImageDataType } from '@kitware/vtk.js/Common/DataModel/ImageData'; -import _cloneDeep from 'lodash.clonedeep'; import vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera'; import { vec2, vec3, mat4 } from 'gl-matrix'; import vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper'; @@ -1877,7 +1876,7 @@ class StackViewport extends Viewport implements IStackViewport { // Cache camera props so we can trigger one camera changed event after // The full transition. - const previousCameraProps = _cloneDeep(this.getCamera()); + const previousCameraProps = structuredClone(this.getCamera()); if (sameImageData && !this.stackInvalidated) { // 3a. If we can reuse it, replace the scalar data under the hood this._updateVTKImageDataFromCornerstoneImage(image); diff --git a/packages/core/src/RenderingEngine/Viewport.ts b/packages/core/src/RenderingEngine/Viewport.ts index 83aaf47fc..619189308 100644 --- a/packages/core/src/RenderingEngine/Viewport.ts +++ b/packages/core/src/RenderingEngine/Viewport.ts @@ -4,7 +4,6 @@ import vtkMath from '@kitware/vtk.js/Common/Core/Math'; import vtkPlane from '@kitware/vtk.js/Common/DataModel/Plane'; import { vec2, vec3 } from 'gl-matrix'; -import _cloneDeep from 'lodash.clonedeep'; import Events from '../enums/Events'; import ViewportType from '../enums/ViewportType'; @@ -91,11 +90,11 @@ class Viewport implements IViewport { this.renderingEngineId ); - this.defaultOptions = _cloneDeep(props.defaultOptions); + this.defaultOptions = structuredClone(props.defaultOptions); this.suppressEvents = props.defaultOptions.suppressEvents ? props.defaultOptions.suppressEvents : false; - this.options = _cloneDeep(props.defaultOptions); + this.options = structuredClone(props.defaultOptions); this.isDisabled = false; } @@ -151,7 +150,7 @@ class Viewport implements IViewport { * @param immediate - If `true`, renders the viewport after the options are set. */ public setOptions(options: ViewportInputOptions, immediate = false): void { - this.options = _cloneDeep(options); + this.options = structuredClone(options); // TODO When this is needed we need to move the camera position. // We can steal some logic from the tools we build to do this. @@ -167,7 +166,7 @@ class Viewport implements IViewport { * @param immediate - If `true`, renders the viewport after the options are reset. */ public reset(immediate = false) { - this.options = _cloneDeep(this.defaultOptions); + this.options = structuredClone(this.defaultOptions); // TODO When this is needed we need to move the camera position. // We can steal some logic from the tools we build to do this. @@ -555,7 +554,7 @@ class Viewport implements IViewport { flipVertical: false, }); - const previousCamera = _cloneDeep(this.getCamera()); + const previousCamera = structuredClone(this.getCamera()); const bounds = renderer.computeVisiblePropBounds(); const focalPoint = [0, 0, 0]; @@ -671,7 +670,7 @@ class Viewport implements IViewport { clippingRange: clippingRangeToUse, }); - const modifiedCamera = _cloneDeep(this.getCamera()); + const modifiedCamera = structuredClone(this.getCamera()); if (storeAsInitialCamera) { this.setInitialCamera(modifiedCamera); @@ -881,7 +880,7 @@ class Viewport implements IViewport { storeAsInitialCamera = false ): void { const vtkCamera = this.getVtkActiveCamera(); - const previousCamera = _cloneDeep(this.getCamera()); + const previousCamera = structuredClone(this.getCamera()); const updatedCamera = Object.assign({}, previousCamera, cameraInterface); const { viewUp, diff --git a/packages/core/src/Settings.ts b/packages/core/src/Settings.ts index bb79bf713..a139b0d4b 100644 --- a/packages/core/src/Settings.ts +++ b/packages/core/src/Settings.ts @@ -13,7 +13,9 @@ const DICTIONARY = Symbol('Dictionary'); export default class Settings { constructor(base?: Settings) { const dictionary = Object.create( - base instanceof Settings && DICTIONARY in base ? base[DICTIONARY] : null + base instanceof Settings && DICTIONARY in base + ? (base[DICTIONARY] as object) + : null ); Object.seal( Object.defineProperty(this, DICTIONARY, { diff --git a/packages/core/src/loaders/volumeLoader.ts b/packages/core/src/loaders/volumeLoader.ts index 9c9e6ea16..a6091e1d1 100644 --- a/packages/core/src/loaders/volumeLoader.ts +++ b/packages/core/src/loaders/volumeLoader.ts @@ -3,7 +3,6 @@ import '@kitware/vtk.js/Rendering/Profiles/Volume'; import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData'; import type { vtkImageData as vtkImageDataType } from '@kitware/vtk.js/Common/DataModel/ImageData'; import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray'; -import cloneDeep from 'lodash.clonedeep'; import { ImageVolume } from '../cache/classes/ImageVolume'; import type * as Types from '../types'; @@ -330,7 +329,7 @@ export async function createAndCacheDerivedVolume( const derivedVolume = new ImageVolume({ volumeId, - metadata: cloneDeep(metadata), + metadata: structuredClone(metadata), dimensions: [dimensions[0], dimensions[1], dimensions[2]], spacing, origin, @@ -419,7 +418,7 @@ export function createLocalVolume( const derivedVolume = new ImageVolume({ volumeId, - metadata: cloneDeep(metadata), + metadata: structuredClone(metadata), dimensions: [dimensions[0], dimensions[1], dimensions[2]], spacing, origin, diff --git a/packages/tools/package.json b/packages/tools/package.json index a45f5521f..c62d3cf28 100644 --- a/packages/tools/package.json +++ b/packages/tools/package.json @@ -27,7 +27,6 @@ }, "dependencies": { "@cornerstonejs/core": "^0.36.4", - "lodash.clonedeep": "4.5.0", "lodash.get": "^4.4.2" }, "peerDependencies": { diff --git a/packages/tools/src/eventListeners/keyboard/keyDownListener.ts b/packages/tools/src/eventListeners/keyboard/keyDownListener.ts index f78043f79..03d3695a3 100644 --- a/packages/tools/src/eventListeners/keyboard/keyDownListener.ts +++ b/packages/tools/src/eventListeners/keyboard/keyDownListener.ts @@ -1,4 +1,3 @@ -import _cloneDeep from 'lodash.clonedeep'; import { getEnabledElement, triggerEvent } from '@cornerstonejs/core'; import Events from '../../enums/Events'; import { KeyDownEventDetail, KeyUpEventDetail } from '../../types/EventTypes'; @@ -84,7 +83,7 @@ function _onKeyUp(evt: KeyboardEvent): void { state.element.addEventListener('keydown', keyListener); // Restore `state` to `defaultState` - state = _cloneDeep(defaultState); + state = structuredClone(defaultState); triggerEvent(eventDetail.element, Events.KEY_UP, eventDetail); } diff --git a/packages/tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts b/packages/tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts index 4dd8d9975..c15c4460b 100644 --- a/packages/tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +++ b/packages/tools/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts @@ -1,4 +1,3 @@ -import cloneDeep from 'lodash.clonedeep'; import { Annotation, Annotations, @@ -314,14 +313,14 @@ class FrameOfReferenceSpecificAnnotationManager implements IAnnotationManager { const toolSpecificAnnotations = frameOfReferenceSpecificAnnotations[toolName]; - return cloneDeep(toolSpecificAnnotations); + return structuredClone(toolSpecificAnnotations); } else if (groupKey) { const frameOfReferenceSpecificAnnotations = annotations[groupKey]; - return cloneDeep(frameOfReferenceSpecificAnnotations); + return structuredClone(frameOfReferenceSpecificAnnotations); } - return cloneDeep(annotations); + return structuredClone(annotations); }; /** @@ -361,7 +360,7 @@ class FrameOfReferenceSpecificAnnotationManager implements IAnnotationManager { annotations[groupKey] = state; } else { // Set entire annotations - this.annotations = cloneDeep(state); + this.annotations = structuredClone(state); } }; diff --git a/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts b/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts index e5a9eb495..7c47e0f7a 100644 --- a/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts +++ b/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts @@ -1,4 +1,3 @@ -import cloneDeep from 'lodash.clonedeep'; import { utilities as csUtils } from '@cornerstonejs/core'; import CORNERSTONE_COLOR_LUT from '../../constants/COLOR_LUT'; @@ -49,7 +48,7 @@ export default class SegmentationStateManager { if (!uid) { uid = csUtils.uuidv4(); } - this.state = cloneDeep(initialDefaultState); + this.state = structuredClone(initialDefaultState); this.uid = uid; } @@ -82,7 +81,7 @@ export default class SegmentationStateManager { * Reset the state to the default state */ resetState(): void { - this.state = cloneDeep(initialDefaultState); + this.state = structuredClone(initialDefaultState); } /** diff --git a/packages/tools/src/stateManagement/segmentation/addSegmentationRepresentations.ts b/packages/tools/src/stateManagement/segmentation/addSegmentationRepresentations.ts index 290bf3cd5..dbc5fae27 100644 --- a/packages/tools/src/stateManagement/segmentation/addSegmentationRepresentations.ts +++ b/packages/tools/src/stateManagement/segmentation/addSegmentationRepresentations.ts @@ -1,4 +1,3 @@ -import _cloneDeep from 'lodash.clonedeep'; import { SegmentationRepresentationConfig, RepresentationPublicInput, diff --git a/packages/tools/src/stateManagement/segmentation/addSegmentations.ts b/packages/tools/src/stateManagement/segmentation/addSegmentations.ts index 5e78bc343..f7c377d69 100644 --- a/packages/tools/src/stateManagement/segmentation/addSegmentations.ts +++ b/packages/tools/src/stateManagement/segmentation/addSegmentations.ts @@ -1,4 +1,3 @@ -import _cloneDeep from 'lodash.clonedeep'; import { SegmentationPublicInput } from '../../types/SegmentationStateTypes'; import { validateSegmentationInput } from './helpers'; import { addSegmentation as addSegmentationToState } from './segmentationState'; @@ -18,7 +17,7 @@ function addSegmentations( validateSegmentationInput(segmentationInputArray); segmentationInputArray.map((segInput) => { - const segmentationInput = _cloneDeep(segInput); + const segmentationInput = structuredClone(segInput); addSegmentationToState(segmentationInput); }); diff --git a/packages/tools/src/store/ToolGroupManager/ToolGroup.ts b/packages/tools/src/store/ToolGroupManager/ToolGroup.ts index 4c6fa125f..c80de7ae2 100644 --- a/packages/tools/src/store/ToolGroupManager/ToolGroup.ts +++ b/packages/tools/src/store/ToolGroupManager/ToolGroup.ts @@ -1,5 +1,4 @@ import { MouseBindings, ToolModes } from '../../enums'; -import cloneDeep from 'lodash.clonedeep'; import get from 'lodash.get'; import { getRenderingEngine, @@ -641,7 +640,7 @@ export default class ToolGroup implements IToolGroup { configurationPath ); - return cloneDeep(_configuration); + return structuredClone(_configuration); } /** diff --git a/packages/tools/src/store/state.ts b/packages/tools/src/store/state.ts index 80fb41c85..057a54a2f 100644 --- a/packages/tools/src/store/state.ts +++ b/packages/tools/src/store/state.ts @@ -1,5 +1,3 @@ -import _cloneDeep from 'lodash.clonedeep'; - import { IToolGroup, IToolClassReference } from '../types'; import Synchronizer from './SynchronizerManager/Synchronizer'; import svgNodeCache, { resetSvgNodeCache } from './svgNodeCache'; @@ -46,7 +44,7 @@ let state: ICornerstoneTools3dState = { function resetCornerstoneToolsState(): void { resetSvgNodeCache(); - state = _cloneDeep(defaultState); + state = structuredClone(defaultState); } export { diff --git a/packages/tools/src/utilities/segmentation/createLabelmapVolumeForViewport.ts b/packages/tools/src/utilities/segmentation/createLabelmapVolumeForViewport.ts index a7be313a0..0a682233e 100644 --- a/packages/tools/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +++ b/packages/tools/src/utilities/segmentation/createLabelmapVolumeForViewport.ts @@ -1,4 +1,3 @@ -import { _cloneDeep } from 'lodash.clonedeep'; import { getEnabledElementByIds, volumeLoader, @@ -23,16 +22,16 @@ export default async function createLabelmapVolumeForViewport(input: { renderingEngineId: string; segmentationId?: string; options?: { - volumeId?: string; - scalarData?: Float32Array | Uint8Array | Uint16Array | Int16Array; - targetBuffer?: { + volumeId: string; + scalarData: Float32Array | Uint8Array | Uint16Array | Int16Array; + targetBuffer: { type: 'Float32Array' | 'Uint8Array' | 'Uint16Array' | 'Int8Array'; }; - metadata?: any; - dimensions?: Types.Point3; - spacing?: Types.Point3; - origin?: Types.Point3; - direction?: Float32Array; + metadata: Types.Metadata; + dimensions: Types.Point3; + spacing: Types.Point3; + origin: Types.Point3; + direction: Types.Mat3; }; }): Promise { const { viewportId, renderingEngineId, options } = input; @@ -60,7 +59,7 @@ export default async function createLabelmapVolumeForViewport(input: { if (options) { // create a new labelmap with its own properties // This allows creation of a higher resolution labelmap vs reference volume - const properties = _cloneDeep(options); + const properties = structuredClone(options); await volumeLoader.createLocalVolume(properties, segmentationId); } else { // create a labelmap from a reference volume diff --git a/tsconfig.base.json b/tsconfig.base.json index 5562fa7fa..1bfc35400 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -15,7 +15,7 @@ "forceConsistentCasingInFileNames": true, "useDefineForClassFields": false, "jsx": "react-jsx", - "lib": ["ES6", "dom"], // "ES6", "DOM" | "es2015", "dom" + "lib": ["ES2021", "dom"], "module": "esnext", // esnext | commonjs "moduleResolution": "node", "noImplicitAny": false, @@ -27,7 +27,7 @@ "sourceMap": true, "strict": true, "strictNullChecks": false, - "target": "es5", // esnext | es5 + "target": "ES2021", "downlevelIteration": true, "resolveJsonModule": true }, diff --git a/yarn.lock b/yarn.lock index 5e8a023f4..654bf9629 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5767,16 +5767,16 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== -"@types/node@^14.18.9": - version "14.18.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.20.tgz#268f028b36eaf51181c3300252f605488c4f0650" - integrity sha512-Q8KKwm9YqEmUBRsqJ2GWJDtXltBDxTdC4m5vTdXBolu2PeQh8LX+f6BTwU+OuXPu37fLxoN6gidqBmnky36FXA== - "@types/node@^16.0.0": version "16.11.38" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.38.tgz#be0edd097b23eace6c471c525a74b3f98803017f" integrity sha512-hjO/0K140An3GWDw2HJfq7gko3wWeznbjXgg+rzPdVzhe198hp4x2i1dgveAOEiFKd8sOilAxzoSJiVv5P/CUg== +"@types/node@^18.15.7": + version "18.15.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.7.tgz#33514fca9bdf136f77027358850c0fb9cd93c669" + integrity sha512-LFmUbFunqmBn26wJZgZPYZPrDR1RwGOu2v79Mgcka1ndO6V0/cwjivPTc4yoK6n9kmw4/ls1r8cLrvh2iMibFA== + "@types/normalize-package-data@^2.4.0", "@types/normalize-package-data@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -22452,10 +22452,10 @@ typedoc@^0.23.22: minimatch "^5.1.2" shiki "^0.12.1" -typescript@4.6.4: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== +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@^3.9.10: version "3.9.10" From 70fb8c0a58491015ca5a3f52c2b37fc43a240fb3 Mon Sep 17 00:00:00 2001 From: StefanNedelchev Date: Tue, 28 Mar 2023 23:07:05 +0300 Subject: [PATCH 2/4] copy svgNodeCache outside structured clone when resetting state --- packages/tools/src/store/state.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/store/state.ts b/packages/tools/src/store/state.ts index 057a54a2f..6354e0e9c 100644 --- a/packages/tools/src/store/state.ts +++ b/packages/tools/src/store/state.ts @@ -44,7 +44,15 @@ let state: ICornerstoneTools3dState = { function resetCornerstoneToolsState(): void { resetSvgNodeCache(); - state = structuredClone(defaultState); + state = { + ...structuredClone({ + ...defaultState, + svgNodeCache: {}, + }), + svgNodeCache: { + ...defaultState.svgNodeCache, + }, + }; } export { From d532d907e9bc38ff622a50091f35db36eeede15e Mon Sep 17 00:00:00 2001 From: Stefan Date: Sat, 27 May 2023 18:10:24 +0300 Subject: [PATCH 3/4] remove clonedeep leftovers --- .eslintignore | 1 + packages/adapters/config/webpack/merge.js | 29 ++++++++++++------- packages/adapters/package.json | 1 - packages/adapters/rollup.config.mjs | 2 +- .../adapters/Cornerstone/Segmentation_4X.js | 9 +++--- packages/core/.webpack/webpack.prod.js | 8 ----- packages/dicomImageLoader/.webpack/merge.js | 2 +- .../segmentation/SegmentationStateManager.ts | 1 - 8 files changed, 26 insertions(+), 27 deletions(-) diff --git a/.eslintignore b/.eslintignore index 412fc060c..5f24d87ef 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,4 +1,5 @@ *.css *.md *.json +packages/adapters/config/webpack/*.js packages/docs/*.js diff --git a/packages/adapters/config/webpack/merge.js b/packages/adapters/config/webpack/merge.js index 1c754acd9..86393cf5e 100644 --- a/packages/adapters/config/webpack/merge.js +++ b/packages/adapters/config/webpack/merge.js @@ -1,15 +1,24 @@ -const _ = require('lodash'); +const _ = require("lodash"); // Merge two objects // Instead of merging array objects index by index (n-th source // item with n-th object item) it concatenates both arrays -module.exports = function(object, source) { - const clone = _.cloneDeep(object); - const merged = _.mergeWith(clone, source, function(objValue, srcValue, key, object, source, stack) { - if(objValue && srcValue && _.isArray(objValue) && _.isArray(srcValue)) { - return _.concat(objValue, srcValue); - } - }); +module.exports = function (object, source) { + const clone = structuredClone(object); + const merged = _.mergeWith( + clone, + source, + function (objValue, srcValue, key, object, source, stack) { + if ( + objValue && + srcValue && + _.isArray(objValue) && + _.isArray(srcValue) + ) { + return _.concat(objValue, srcValue); + } + } + ); - return merged; -} \ No newline at end of file + return merged; +}; diff --git a/packages/adapters/package.json b/packages/adapters/package.json index f1b37f4ec..22f96ab56 100644 --- a/packages/adapters/package.json +++ b/packages/adapters/package.json @@ -43,7 +43,6 @@ "@babel/runtime-corejs2": "^7.17.8", "dcmjs": "^0.29.5", "gl-matrix": "^3.4.3", - "lodash.clonedeep": "^4.5.0", "ndarray": "^1.0.19" } } diff --git a/packages/adapters/rollup.config.mjs b/packages/adapters/rollup.config.mjs index ca5c98f54..cd7c14e26 100644 --- a/packages/adapters/rollup.config.mjs +++ b/packages/adapters/rollup.config.mjs @@ -8,7 +8,7 @@ import { readFileSync } from "fs"; const pkg = JSON.parse(readFileSync("package.json", { encoding: "utf8" })); export default { - external: ["dcmjs", "gl-matrix", "lodash.clonedeep", "ndarray"], + external: ["dcmjs", "gl-matrix", "ndarray"], input: pkg.src || "src/index.ts", output: [ // { diff --git a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js index e4920c5f1..ba4c5c031 100644 --- a/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js +++ b/packages/adapters/src/adapters/Cornerstone/Segmentation_4X.js @@ -1,6 +1,5 @@ import { log, utilities, normalizers, derivations } from "dcmjs"; import ndarray from "ndarray"; -import cloneDeep from "lodash.clonedeep"; const { rotateDirectionCosinesInPlane, @@ -858,7 +857,7 @@ function insertOverlappingPixelDataPlanar( let tempBuffer = labelmapBufferArray[m].slice(0); // temp list for checking overlaps - let tempSegmentsOnFrame = cloneDeep(segmentsOnFrameArray[m]); + let tempSegmentsOnFrame = structuredClone(segmentsOnFrameArray[m]); /** split overlapping SEGs algorithm for each segment: * A) copy the labelmapBuffer in the array with index 0 @@ -974,7 +973,7 @@ function insertOverlappingPixelDataPlanar( M++; } tempBuffer = labelmapBufferArray[m].slice(0); - tempSegmentsOnFrame = cloneDeep( + tempSegmentsOnFrame = structuredClone( segmentsOnFrameArray[m] ); @@ -1003,12 +1002,12 @@ function insertOverlappingPixelDataPlanar( } labelmapBufferArray[m] = tempBuffer.slice(0); - segmentsOnFrameArray[m] = cloneDeep(tempSegmentsOnFrame); + segmentsOnFrameArray[m] = structuredClone(tempSegmentsOnFrame); // reset temp variables/buffers for new segment m = 0; tempBuffer = labelmapBufferArray[m].slice(0); - tempSegmentsOnFrame = cloneDeep(segmentsOnFrameArray[m]); + tempSegmentsOnFrame = structuredClone(segmentsOnFrameArray[m]); } } diff --git a/packages/core/.webpack/webpack.prod.js b/packages/core/.webpack/webpack.prod.js index ed4f61548..bfacc5dae 100644 --- a/packages/core/.webpack/webpack.prod.js +++ b/packages/core/.webpack/webpack.prod.js @@ -43,14 +43,6 @@ module.exports = (env, argv) => { amd: 'detect-gpu', }, }, - { - 'lodash.clonedeep': { - root: 'window', - commonjs: 'lodash.clonedeep', - commonjs2: 'lodash.clonedeep', - amd: 'lodash.clonedeep', - }, - }, ], // plugins: [new webpackBundleAnalyzer.BundleAnalyzerPlugin()], }); diff --git a/packages/dicomImageLoader/.webpack/merge.js b/packages/dicomImageLoader/.webpack/merge.js index 2b6f358a8..38dac1d05 100644 --- a/packages/dicomImageLoader/.webpack/merge.js +++ b/packages/dicomImageLoader/.webpack/merge.js @@ -4,7 +4,7 @@ const _ = require('lodash'); // Instead of merging array objects index by index (n-th source // item with n-th object item) it concatenates both arrays module.exports = function (object, source) { - const clone = _.cloneDeep(object); + const clone = structuredClone(object); const merged = _.mergeWith( clone, source, diff --git a/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts b/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts index 9a3ddc103..081e96e61 100644 --- a/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts +++ b/packages/tools/src/stateManagement/segmentation/SegmentationStateManager.ts @@ -1,5 +1,4 @@ import { utilities as csUtils } from '@cornerstonejs/core'; -import cloneDeep from 'lodash.clonedeep'; import CORNERSTONE_COLOR_LUT from '../../constants/COLOR_LUT'; From 4ce99e09f8f81eb6b44676e8fd25116739a7878d Mon Sep 17 00:00:00 2001 From: Alireza Date: Mon, 16 Oct 2023 14:23:49 -0400 Subject: [PATCH 4/4] api --- yarn.lock | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/yarn.lock b/yarn.lock index 14c691925..f2e074030 100644 --- a/yarn.lock +++ b/yarn.lock @@ -14009,7 +14009,7 @@ lodash-es@^4.17.21: resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== -lodash.clonedeep@^4.5.0: +lodash.clonedeep@4.5.0, lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" integrity sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ== @@ -20953,12 +20953,7 @@ typedoc@^0.24.6: minimatch "^9.0.0" shiki "^0.14.1" -typescript@4.6.4: - version "4.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" - integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== - -"typescript@^3 || ^4": +typescript@4.9.5, "typescript@^3 || ^4": version "4.9.5" resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==