From 81c1c28c49ca42474cc156d13a60ee3b58cd8481 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 12:36:36 +0100 Subject: [PATCH 01/44] test: automated build for nmr-cli --- .github/workflows/dev-build.yml | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 0bea825..abd0bff 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -11,12 +11,13 @@ name : Dev Build, Test and Publish on: push: - branches: [development] + branches: [dev-nisha] env: DOCKER_HUB_USERNAME : ${{ secrets.DOCKER_USERNAME }} DOCKER_HUB_PASSWORD : ${{ secrets.DOCKER_PASSWORD }} - REPOSITORY_NAME: nmrkit + NMRKIT_REPOSITORY_NAME: nmrkit + NMR_CLI_REPOSITORY_NAME: nmrkit REPOSITORY_NAMESPACE: nfdi4chem RELEASE_TAG: dev-latest @@ -38,14 +39,26 @@ jobs: username: ${{ env.DOCKER_HUB_USERNAME }} password: ${{ env.DOCKER_HUB_PASSWORD }} - - name: Build and push Docker image + # - name: Build and push nmrKit Docker image + # uses: docker/build-push-action@v4 + # with: + # context: . + # file: ./Dockerfile + # push: true + # build-args: | + # RELEASE_VERSION=dev-latest + # tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.NMRKIT_REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} + # username: ${{ env.DOCKER_HUB_USERNAME }} + # password: ${{ env.DOCKER_HUB_PASSWORD }} + + - name: Build and push nmr-cli Docker image uses: docker/build-push-action@v4 with: - context: . + context: ./app/scripts/nmr-cli file: ./Dockerfile push: true build-args: | RELEASE_VERSION=dev-latest - tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} + tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.NMR_CLI_REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} username: ${{ env.DOCKER_HUB_USERNAME }} password: ${{ env.DOCKER_HUB_PASSWORD }} \ No newline at end of file From 59b17bb68bf765b0497277d458fd655f25267523 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 12:37:39 +0100 Subject: [PATCH 02/44] skip testing --- .github/workflows/dev-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index abd0bff..53baa0a 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -28,7 +28,7 @@ jobs: push_to_registry: name: Push Docker image to Docker Hub runs-on: ubuntu-latest - needs: test_and_lint + #needs: test_and_lint steps: - name: Check out the repo uses: actions/checkout@v3 From 6ed829125945e7ace314259fe78b23dc7cee38d3 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 12:39:49 +0100 Subject: [PATCH 03/44] update context path --- .github/workflows/dev-build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 53baa0a..05c2a28 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -54,8 +54,8 @@ jobs: - name: Build and push nmr-cli Docker image uses: docker/build-push-action@v4 with: - context: ./app/scripts/nmr-cli - file: ./Dockerfile + context: . + file: ./app/scripts/nmr-cli/Dockerfile push: true build-args: | RELEASE_VERSION=dev-latest From a28853ef4f0bae2973ee7758419a8bef5f7559be Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:16:08 +0100 Subject: [PATCH 04/44] update context path --- .github/workflows/dev-build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 05c2a28..ea20891 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -22,8 +22,8 @@ env: RELEASE_TAG: dev-latest jobs: - test_and_lint: - uses: NFDI4Chem/nmrkit/.github/workflows/test.yml@main + # test_and_lint: + # uses: NFDI4Chem/nmrkit/.github/workflows/test.yml@main push_to_registry: name: Push Docker image to Docker Hub @@ -54,7 +54,7 @@ jobs: - name: Build and push nmr-cli Docker image uses: docker/build-push-action@v4 with: - context: . + context: ./app/scripts/nmr-cli/ file: ./app/scripts/nmr-cli/Dockerfile push: true build-args: | From f9499dcac612b8929ecc425859f1eb31a22156de Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:21:45 +0100 Subject: [PATCH 05/44] update repo name --- .github/workflows/dev-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index ea20891..ffd261a 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -17,7 +17,7 @@ env: DOCKER_HUB_USERNAME : ${{ secrets.DOCKER_USERNAME }} DOCKER_HUB_PASSWORD : ${{ secrets.DOCKER_PASSWORD }} NMRKIT_REPOSITORY_NAME: nmrkit - NMR_CLI_REPOSITORY_NAME: nmrkit + NMR_CLI_REPOSITORY_NAME: nmr-cli REPOSITORY_NAMESPACE: nfdi4chem RELEASE_TAG: dev-latest From ef56a4a48f30d88382d751895db5a7c96b0bb691 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:27:56 +0100 Subject: [PATCH 06/44] uncomment old changes --- .github/workflows/dev-build.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index ffd261a..1c513f7 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -22,8 +22,8 @@ env: RELEASE_TAG: dev-latest jobs: - # test_and_lint: - # uses: NFDI4Chem/nmrkit/.github/workflows/test.yml@main + test_and_lint: + uses: NFDI4Chem/nmrkit/.github/workflows/test.yml@main push_to_registry: name: Push Docker image to Docker Hub @@ -39,17 +39,17 @@ jobs: username: ${{ env.DOCKER_HUB_USERNAME }} password: ${{ env.DOCKER_HUB_PASSWORD }} - # - name: Build and push nmrKit Docker image - # uses: docker/build-push-action@v4 - # with: - # context: . - # file: ./Dockerfile - # push: true - # build-args: | - # RELEASE_VERSION=dev-latest - # tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.NMRKIT_REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} - # username: ${{ env.DOCKER_HUB_USERNAME }} - # password: ${{ env.DOCKER_HUB_PASSWORD }} + - name: Build and push nmrKit Docker image + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile + push: true + build-args: | + RELEASE_VERSION=dev-latest + tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.NMRKIT_REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} + username: ${{ env.DOCKER_HUB_USERNAME }} + password: ${{ env.DOCKER_HUB_PASSWORD }} - name: Build and push nmr-cli Docker image uses: docker/build-push-action@v4 From 4d3540fbdb331eb4fead011ce1519b1427140809 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:28:23 +0100 Subject: [PATCH 07/44] update branch name --- .github/workflows/dev-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 1c513f7..b7dc12a 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -11,7 +11,7 @@ name : Dev Build, Test and Publish on: push: - branches: [dev-nisha] + branches: [development] env: DOCKER_HUB_USERNAME : ${{ secrets.DOCKER_USERNAME }} From 27d568a46e713cd68d25304f80ac12413c6e6c63 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 12:36:36 +0100 Subject: [PATCH 08/44] feat: add automated build for nmr-cli --- .github/workflows/dev-build.yml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 0bea825..b7dc12a 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -16,7 +16,8 @@ on: env: DOCKER_HUB_USERNAME : ${{ secrets.DOCKER_USERNAME }} DOCKER_HUB_PASSWORD : ${{ secrets.DOCKER_PASSWORD }} - REPOSITORY_NAME: nmrkit + NMRKIT_REPOSITORY_NAME: nmrkit + NMR_CLI_REPOSITORY_NAME: nmr-cli REPOSITORY_NAMESPACE: nfdi4chem RELEASE_TAG: dev-latest @@ -27,7 +28,7 @@ jobs: push_to_registry: name: Push Docker image to Docker Hub runs-on: ubuntu-latest - needs: test_and_lint + #needs: test_and_lint steps: - name: Check out the repo uses: actions/checkout@v3 @@ -38,7 +39,7 @@ jobs: username: ${{ env.DOCKER_HUB_USERNAME }} password: ${{ env.DOCKER_HUB_PASSWORD }} - - name: Build and push Docker image + - name: Build and push nmrKit Docker image uses: docker/build-push-action@v4 with: context: . @@ -46,6 +47,18 @@ jobs: push: true build-args: | RELEASE_VERSION=dev-latest - tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} + tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.NMRKIT_REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} + username: ${{ env.DOCKER_HUB_USERNAME }} + password: ${{ env.DOCKER_HUB_PASSWORD }} + + - name: Build and push nmr-cli Docker image + uses: docker/build-push-action@v4 + with: + context: ./app/scripts/nmr-cli/ + file: ./app/scripts/nmr-cli/Dockerfile + push: true + build-args: | + RELEASE_VERSION=dev-latest + tags: ${{ env.REPOSITORY_NAMESPACE }}/${{ env.NMR_CLI_REPOSITORY_NAME }}:${{ env.RELEASE_TAG }} username: ${{ env.DOCKER_HUB_USERNAME }} password: ${{ env.DOCKER_HUB_PASSWORD }} \ No newline at end of file From 4707d9806036957845e6fe5b6f9441904c5ea58f Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:39:16 +0100 Subject: [PATCH 09/44] fix: ignore lwreg in pylint --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c67c001..c9a1698 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,7 +59,7 @@ jobs: pip install flake8 pytest - name: Analysing the code with pylint run: | - flake8 --per-file-ignores="__init__.py:F401" --ignore E402,E501,W503 $(git ls-files 'app/*.py') . + flake8 --per-file-ignores="__init__.py:F401" --ignore E402,E501,W503 $(git ls-files 'app/*.py') --ignore=lwreg/lwreg/ . - name: Run test run: | python3 -m pytest -p no:warnings --ignore=lwreg/lwreg/test-cli.py --ignore=lwreg/lwreg/test_lwreg.py From 483ac8f0b390691ec778e048ecfb5250305c5a2d Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:45:54 +0100 Subject: [PATCH 10/44] ignore lwreg in pylint --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c9a1698..7b29312 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,7 +59,7 @@ jobs: pip install flake8 pytest - name: Analysing the code with pylint run: | - flake8 --per-file-ignores="__init__.py:F401" --ignore E402,E501,W503 $(git ls-files 'app/*.py') --ignore=lwreg/lwreg/ . + flake8 --per-file-ignores="__init__.py:F401" --ignore E402,E501,W503,lwreg/lwreg/ $(git ls-files 'app/*.py') . - name: Run test run: | python3 -m pytest -p no:warnings --ignore=lwreg/lwreg/test-cli.py --ignore=lwreg/lwreg/test_lwreg.py From 3b53f347638154861a6cd05a58c572698f5ea5c4 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Thu, 4 Jan 2024 13:53:38 +0100 Subject: [PATCH 11/44] remove the ignore command --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7b29312..c67c001 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -59,7 +59,7 @@ jobs: pip install flake8 pytest - name: Analysing the code with pylint run: | - flake8 --per-file-ignores="__init__.py:F401" --ignore E402,E501,W503,lwreg/lwreg/ $(git ls-files 'app/*.py') . + flake8 --per-file-ignores="__init__.py:F401" --ignore E402,E501,W503 $(git ls-files 'app/*.py') . - name: Run test run: | python3 -m pytest -p no:warnings --ignore=lwreg/lwreg/test-cli.py --ignore=lwreg/lwreg/test_lwreg.py From e237621035649b5915368ad75ece14d6e89216e8 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Fri, 5 Jan 2024 16:58:25 +0100 Subject: [PATCH 12/44] build and push nmrkit --- .github/workflows/dev-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/dev-build.yml b/.github/workflows/dev-build.yml index 0bea825..08928d1 100644 --- a/.github/workflows/dev-build.yml +++ b/.github/workflows/dev-build.yml @@ -1,5 +1,5 @@ -# This worklflow will perform following actions when the code is pushed to development branch: +# This worklflow will perform following actions when the code is pushed to the development branch: # - Build the latest docker image in development which needs test to pass first. # - Push the docker image to Docker Hub under namespace - nfdi4chem with tag:dev-latest. # From f7f8e427e01ae27d177b3a261565007bee366c37 Mon Sep 17 00:00:00 2001 From: NishaSharma14 Date: Fri, 12 Jan 2024 15:52:58 +0100 Subject: [PATCH 13/44] fix: pull image from Docker Hub instead of building locally. --- docker-compose.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 40ddb3d..30451e3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -28,13 +28,15 @@ services: env_file: - ./.env nmr-load-save: - build: ./app/scripts/nmr-cli + #build: ./app/scripts/nmr-cli + image: nfdi4chem/nmr-cli:dev-latest entrypoint: /bin/sh stdin_open: true tty: true container_name: nmr-converter nmr-respredict: - build: ./app/scripts/nmr-respredict + #build: ./app/scripts/nmr-respredict + image: nfdi4chem/nmr-respredict:dev-latest entrypoint: /bin/sh stdin_open: true tty: true From 8a9d9153823b83a5569b5695ce662c3299473cdd Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 19 Jan 2024 19:30:56 +0100 Subject: [PATCH 14/44] refactor: nmr-cli --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/bin/index.js | 225 +++++++---------------- app/scripts/nmr-cli/bin/prase-spectra.js | 122 ++++++++++++ app/scripts/nmr-cli/package-lock.json | 2 +- 4 files changed, 194 insertions(+), 157 deletions(-) create mode 100644 app/scripts/nmr-cli/bin/prase-spectra.js diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index a6b0393..d97a4b9 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -19,7 +19,7 @@ RUN npm install COPY . ./ #install the nmr-cli as a global package -# for example, nmr-cli -u https://cheminfo.github.io/bruker-data-test/data/zipped/aspirin-1h.zip +# for example, nmr-cli parse-spectra -u https://cheminfo.github.io/bruker-data-test/data/zipped/aspirin-1h.zip RUN npm install . -g diff --git a/app/scripts/nmr-cli/bin/index.js b/app/scripts/nmr-cli/bin/index.js index a8a895b..24b1ce3 100755 --- a/app/scripts/nmr-cli/bin/index.js +++ b/app/scripts/nmr-cli/bin/index.js @@ -1,166 +1,81 @@ #!/usr/bin/env node -const { join, isAbsolute } = require("path"); const yargs = require("yargs"); -const loader = require("nmr-load-save"); -const fileUtils = require("filelist-utils"); -const playwright = require('playwright'); - -const usageMessage = "Usage: nmr-cli -u or -p -s" - - -/** - * How to Use the Command Line Tool: - * Example 1: Process spectra files from a URL - * Usage: nmr-cli -u https://example.com/file.zip - * ------------------------------------------------------------------------- - * Example 2: process a spectra files from a directory - * Usage: nmr-cli -p /path/to/directory - * ------------------------------------------------------------------------- - * you could also combine the above examples with an optional parameter to capturing a snapshot using the -s option - * - */ - -const options = yargs - .usage(usageMessage) - .option("u", { alias: "url", describe: "File URL", type: "string", nargs: 1 }) - .option("p", { alias: "path", describe: "Directory path", type: "string", nargs: 1 }) - .option("s", { alias: "capture-snapshot", describe: "Capture snapshot", type: "boolean" }).showHelpOnFail(); - - - - -function generateNMRiumURL() { - const baseURL = process.env['BASE_NMRIUM_URL']; - const url = new URL(baseURL) - url.searchParams.append('workspace', "embedded") - return url.toString() -} - -async function captureSpectraViewAsBase64(nmriumState) { - const { data: { spectra }, version } = nmriumState; - const browser = await playwright.chromium.launch() - const context = await browser.newContext(playwright.devices['Desktop Chrome HiDPI']) - const page = await context.newPage() - - const url = generateNMRiumURL() - - await page.goto(url) - - await page.locator('text=Loading').waitFor({ state: 'hidden' }); - - let snapshots = [] - - for (const spectrum of spectra || []) { - const spectrumObject = { - version, - data: { - spectra: [{ ...spectrum }], - } +const { loadSpectrumFromURL, loadSpectrumFromFilePath } = require("./prase-spectra"); + + +const usageMessage = ` +Usage: nmr-cli [options] + +Commands: + parse-spectra Parse a spectra file to NMRium file + +Options for 'parse-spectra' command: + -u, --url File URL + -p, --path Directory path + -s, --capture-snapshot Capture snapshot + +Examples: + nmr-cli parse-spectra -u file-url -s // Process spectra files from a URL and capture an image for the spectra + nmr-cli parse-spectra -p directory-path -s // process a spectra files from a directory and capture an image for the spectra + nmr-cli parse-spectra -u file-url // Process spectra files from a URL + nmr-cli parse-spectra -p directory-path // Process spectra files from a directory +`; + + +// Define options for parsing a file +const fileOptions = { + u: { + alias: 'url', + describe: 'File URL', + type: 'string', + nargs: 1, + }, + p: { + alias: 'path', + describe: 'Directory path', + type: 'string', + nargs: 1, + }, + s: { + alias: 'capture-snapshot', + describe: 'Capture snapshot', + type: 'boolean', + }, +}; + + +// Define the 'parse-file' command +const parseFileCommand = { + command: ['parse-spectra', 'ps'], + describe: 'Parse a spectra file to NMRium file', + builder: (yargs) => { + return yargs.options(fileOptions).conflicts('u', 'p'); + }, + handler: (argv) => { + // Handle parsing the spectra file logic based on argv options + console.log(argv) + if (argv?.u) { + loadSpectrumFromURL(argv.u, argv.s).then((result) => { + console.log(JSON.stringify(result)) + }) } - // convert typed array to array - const stringObject = JSON.stringify(spectrumObject, (key, value) => { - return ArrayBuffer.isView(value) ? Array.from(value) : value - }) - - // load the spectrum into NMRium using the custom event - await page.evaluate( - ` - window.postMessage({ type: "nmr-wrapper:load", data:{data: ${stringObject},type:"nmrium"}}, '*'); - ` - ) - - //wait for NMRium process and load spectra - await page.locator('text=Loading').waitFor({ state: 'hidden' }); - - // take a snapshot for the spectrum - try { - const snapshot = await page.locator('#nmrSVG .container').screenshot() - - snapshots.push({ - image: snapshot.toString('base64'), - id: spectrum.id, + if (argv?.p) { + loadSpectrumFromFilePath(argv.p, argv.s).then((result) => { + console.log(JSON.stringify(result)) }) - } catch (e) { - console.log(e) } - } - - await context.close() - await browser.close() - - return snapshots; -} - -async function loadSpectrumFromURL(url, enableSnapshot = false) { - const { pathname: relativePath, origin: baseURL } = new URL(url); - const source = { - entries: [ - { - relativePath, - } - ], - baseURL - }; - const fileCollection = await fileUtils.fileCollectionFromWebSource(source, {}); - - const { - nmriumState: { data, version }, - } = await loader.read(fileCollection); - - let images = [] - - if (enableSnapshot) { - images = await captureSpectraViewAsBase64({ data, version }); - } - - - return { data, version, images }; -} - - -async function loadSpectrumFromFilePath(path, enableSnapshot = false) { - const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) - - const fileCollection = await fileUtils.fileCollectionFromPath(dirPath, {}); - - const { - nmriumState: { data, version } - } = await loader.read(fileCollection); - - let images = [] - - if (enableSnapshot) { - images = await captureSpectraViewAsBase64({ data, version }); - } - - - return { data, version, images }; -} - - -const parameters = options.argv; - -if (parameters.u && parameters.p) { - options.showHelp(); -} else { - - if (parameters.u) { - loadSpectrumFromURL(parameters.u, parameters.s).then((result) => { - console.log(JSON.stringify(result)) - }) - - } - - if (parameters.p) { - loadSpectrumFromFilePath(parameters.p, parameters.s).then((result) => { - console.log(JSON.stringify(result)) - }) - } - -} + }, +}; +// Set up Yargs with the two commands +yargs + .usage(usageMessage) + .command(parseFileCommand) + .showHelpOnFail(true) + .help() + .argv; diff --git a/app/scripts/nmr-cli/bin/prase-spectra.js b/app/scripts/nmr-cli/bin/prase-spectra.js new file mode 100644 index 0000000..2b040f4 --- /dev/null +++ b/app/scripts/nmr-cli/bin/prase-spectra.js @@ -0,0 +1,122 @@ +const { join, isAbsolute } = require("path"); +const loader = require("nmr-load-save"); +const fileUtils = require("filelist-utils"); +const playwright = require('playwright'); + + +function generateNMRiumURL() { + const baseURL = process.env['BASE_NMRIUM_URL']; + const url = new URL(baseURL) + url.searchParams.append('workspace', "embedded") + return url.toString() +} + +async function captureSpectraViewAsBase64(nmriumState) { + const { data: { spectra }, version } = nmriumState; + const browser = await playwright.chromium.launch() + const context = await browser.newContext(playwright.devices['Desktop Chrome HiDPI']) + const page = await context.newPage() + + const url = generateNMRiumURL() + + await page.goto(url) + + await page.locator('text=Loading').waitFor({ state: 'hidden' }); + + let snapshots = [] + + for (const spectrum of spectra || []) { + const spectrumObject = { + version, + data: { + spectra: [{ ...spectrum }], + } + + } + + // convert typed array to array + const stringObject = JSON.stringify(spectrumObject, (key, value) => { + return ArrayBuffer.isView(value) ? Array.from(value) : value + }) + + // load the spectrum into NMRium using the custom event + await page.evaluate( + ` + window.postMessage({ type: "nmr-wrapper:load", data:{data: ${stringObject},type:"nmrium"}}, '*'); + ` + ) + + //wait for NMRium process and load spectra + await page.locator('text=Loading').waitFor({ state: 'hidden' }); + + // take a snapshot for the spectrum + try { + const snapshot = await page.locator('#nmrSVG .container').screenshot() + + snapshots.push({ + image: snapshot.toString('base64'), + id: spectrum.id, + }) + } catch (e) { + console.log(e) + } + } + + await context.close() + await browser.close() + + return snapshots; +} + +async function loadSpectrumFromURL(url, enableSnapshot = false) { + const { pathname: relativePath, origin: baseURL } = new URL(url); + const source = { + entries: [ + { + relativePath, + } + ], + baseURL + }; + const fileCollection = await fileUtils.fileCollectionFromWebSource(source, {}); + + const { + nmriumState: { data, version }, + } = await loader.read(fileCollection); + + let images = [] + + if (enableSnapshot) { + images = await captureSpectraViewAsBase64({ data, version }); + } + + + return { data, version, images }; +} + + +async function loadSpectrumFromFilePath(path, enableSnapshot = false) { + const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) + + const fileCollection = await fileUtils.fileCollectionFromPath(dirPath, {}); + + const { + nmriumState: { data, version } + } = await loader.read(fileCollection); + + let images = [] + + if (enableSnapshot) { + images = await captureSpectraViewAsBase64({ data, version }); + } + + + return { data, version, images }; +} + + +module.exports = { + loadSpectrumFromFilePath, + loadSpectrumFromURL +}; + diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 2497fcf..313bccf 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -1078,4 +1078,4 @@ } } } -} \ No newline at end of file +} From 375c62ff8b4ce99c3fb8ad8524d673ec751b00b2 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 19 Jan 2024 23:21:37 +0100 Subject: [PATCH 15/44] feat: resurrect spectrum from publication string refactor: migrate to TypeScript --- app/scripts/nmr-cli/.gitignore | 2 + app/scripts/nmr-cli/Dockerfile | 2 + app/scripts/nmr-cli/package-lock.json | 259 ++++++++++++++++-- app/scripts/nmr-cli/package.json | 17 +- .../nmr-cli/{bin/index.js => src/index.ts} | 48 +++- .../prase-spectra.js => src/prase-spectra.ts} | 45 +-- app/scripts/nmr-cli/src/publication-string.ts | 73 +++++ .../nmr-cli/src/utilities/castToArray.ts | 3 + app/scripts/nmr-cli/tsconfig.json | 18 ++ 9 files changed, 412 insertions(+), 55 deletions(-) create mode 100644 app/scripts/nmr-cli/.gitignore rename app/scripts/nmr-cli/{bin/index.js => src/index.ts} (56%) rename app/scripts/nmr-cli/{bin/prase-spectra.js => src/prase-spectra.ts} (67%) create mode 100644 app/scripts/nmr-cli/src/publication-string.ts create mode 100644 app/scripts/nmr-cli/src/utilities/castToArray.ts create mode 100644 app/scripts/nmr-cli/tsconfig.json diff --git a/app/scripts/nmr-cli/.gitignore b/app/scripts/nmr-cli/.gitignore new file mode 100644 index 0000000..b38db2f --- /dev/null +++ b/app/scripts/nmr-cli/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +build/ diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index d97a4b9..afc252d 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -18,6 +18,8 @@ RUN npm install COPY . ./ +RUN npm run build + #install the nmr-cli as a global package # for example, nmr-cli parse-spectra -u https://cheminfo.github.io/bruker-data-test/data/zipped/aspirin-1h.zip RUN npm install . -g diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 313bccf..20fb3ce 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -10,12 +10,56 @@ "license": "ISC", "dependencies": { "filelist-utils": "^1.10.2", - "nmr-load-save": "^0.23.11", + "nmr-load-save": "^0.24.0", + "nmr-processing": "^11.7.0", "playwright": "^1.40.1", "yargs": "^17.7.2" }, "bin": { "nmr-cli": "bin/index.js" + }, + "devDependencies": { + "@types/node": "^20.11.5", + "@types/yargs": "^17.0.32", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@lukeed/csprng": { @@ -37,6 +81,30 @@ "node": ">=8" } }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, "node_modules/@types/lodash": { "version": "4.14.196", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", @@ -50,6 +118,51 @@ "@types/lodash": "*" } }, + "node_modules/@types/node": { + "version": "20.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", + "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -72,6 +185,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -100,15 +219,15 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brukerconverter": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.2.tgz", - "integrity": "sha512-+sR1s3uOuZSkxxW06WmHn0X10HFVngRG1a+/4FUZmWypUEFtD+W/7OyNBK3if/1Kx6hX2oJrkL1xwCNH/srwKg==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.4.tgz", + "integrity": "sha512-WoIAyD4ANOnWuemOJFUZuwt+OamliivwidfXhdMGbhXCI5ZB4rlHEP0NycuOsbOvsahJ1vtsHpsowSVMh8Lovw==", "dependencies": { "cheminfo-types": "^1.5.0", "filelist-utils": "^1.8.0", "iobuffer": "^5.3.2", "is-any-array": "^2.0.0", - "jcampconverter": "^9.1.0", + "jcampconverter": "^9.5.1", "ml-spectra-processing": "^12.0.0" } }, @@ -175,6 +294,12 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-fetch": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", @@ -201,6 +326,15 @@ "node": ">=0.4.0" } }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/dynamic-typing": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dynamic-typing/-/dynamic-typing-1.0.0.tgz", @@ -357,9 +491,9 @@ } }, "node_modules/jcampconverter": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.5.0.tgz", - "integrity": "sha512-xsuZXcUd+YkF0Rlt0IZa1+4XbMYq/fR6+gewwDJd5M17y2+SbjrgESKZH73+GokzLC7H1KTS0/l5/7cQFFLgiA==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.6.0.tgz", + "integrity": "sha512-rLkyJxnGM3e4KD5NfPfHtFuk4lMnvHgmpfxvUiRlJDLizIFgiNgsiFAgQTqey0OY6eJQAM381TmxSb3DkEPNSg==", "dependencies": { "cheminfo-types": "^1.7.2", "dynamic-typing": "^1.0.0", @@ -426,6 +560,12 @@ "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/median-quickselect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/median-quickselect/-/median-quickselect-1.0.1.tgz", @@ -731,24 +871,24 @@ } }, "node_modules/nmr-load-save": { - "version": "0.23.11", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.23.11.tgz", - "integrity": "sha512-tvZDBfiZYy7xBUdx7MVVoQ3M3DzhsEKZCgkjkVk0tGVNcy1q9C1WYT48nSJXhgTMNslfH8GH9f2ojSTFnHoUDQ==", + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.24.0.tgz", + "integrity": "sha512-08Kouo4DjkJj6CPr4fgXO82oLZzexTqRqZOCtP2TDor+N7wae7yo8MtwotrPLY4VQDHoiRIy6A96KEuWviimZQ==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.7", - "brukerconverter": "^6.3.2", + "brukerconverter": "^6.3.3", "cheminfo-types": "^1.7.2", "convert-to-jcamp": "^5.4.9", "filelist-utils": "^1.10.2", "gyromagnetic-ratio": "^1.1.0", "is-any-array": "^2.0.1", - "jcampconverter": "^9.5.0", + "jcampconverter": "^9.6.0", "jeolconverter": "^1.0.2", "lodash.merge": "^4.6.2", "ml-spectra-processing": "^12.8.0", "nmr-correlation": "^2.3.3", - "nmr-processing": "^11.6.1", + "nmr-processing": "^11.7.0", "nmredata": "^0.9.9", "openchemlib": "^8.7.0", "openchemlib-utils": "^5.6.0", @@ -757,25 +897,25 @@ } }, "node_modules/nmr-processing": { - "version": "11.6.1", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-11.6.1.tgz", - "integrity": "sha512-NA6uoFbqkqFdrEoEKf3KLeh22opI7torSBi017n4Sqc/jis5/A7MpgunmHVxFYo09BDBIwKM4YvWur86NKXBUw==", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-11.7.0.tgz", + "integrity": "sha512-wws8YO5M9UOE+HFxLUtcRJR/nH8InrKCWvX2Hejo8xeuA1oODrkW4TauyfPzXDK1fmqJ82U9ou78H+55alqShw==", "dependencies": { "@lukeed/uuid": "^2.0.1", "binary-search": "^1.3.6", "cross-fetch": "^4.0.0", "form-data": "^4.0.0", - "gyromagnetic-ratio": "^1.1.0", + "gyromagnetic-ratio": "^1.1.1", "is-any-array": "^2.0.1", "linear-sum-assignment": "^1.0.5", "lodash.omit": "^4.5.0", - "ml-airpls": "^1.0.2", + "ml-airpls": "^1.0.3", "ml-baseline-correction-regression": "^1.0.2", "ml-direct": "^0.1.3", "ml-gsd": "^12.1.3", "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^4.1.3", - "ml-matrix": "^6.10.7", + "ml-matrix": "^6.11.0", "ml-matrix-convolution": "^1.0.0", "ml-matrix-peaks-finder": "^1.0.0", "ml-peak-shape-generator": "^4.1.2", @@ -786,7 +926,7 @@ "ml-tree-set": "^0.1.1", "nmr-correlation": "^2.3.3", "numeral": "^2.0.6", - "openchemlib-utils": "^5.4.0", + "openchemlib-utils": "^5.6.1", "spectrum-generator": "^8.0.8" } }, @@ -999,11 +1139,79 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/typescript": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/varian-converter": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/varian-converter/-/varian-converter-0.3.3.tgz", @@ -1076,6 +1284,15 @@ "engines": { "node": ">=12" } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } } } } diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 83792f0..5b7df59 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -2,20 +2,29 @@ "name": "test-node", "version": "1.0.0", "description": "", - "main": "bin/index.js", + "main": "./build/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "build": "tsc", + "start": "node build/index.js", + "dev": "ts-node src/index.ts" }, "keywords": [], "author": "", "license": "ISC", "bin": { - "nmr-cli": "./bin/index.js" + "nmr-cli": "./build/index.js" }, "dependencies": { "filelist-utils": "^1.10.2", - "nmr-load-save": "^0.23.11", + "nmr-load-save": "^0.24.0", + "nmr-processing": "^11.7.0", "playwright": "^1.40.1", "yargs": "^17.7.2" + }, + "devDependencies": { + "@types/node": "^20.11.5", + "@types/yargs": "^17.0.32", + "ts-node": "^10.9.2", + "typescript": "^5.3.3" } } \ No newline at end of file diff --git a/app/scripts/nmr-cli/bin/index.js b/app/scripts/nmr-cli/src/index.ts similarity index 56% rename from app/scripts/nmr-cli/bin/index.js rename to app/scripts/nmr-cli/src/index.ts index 24b1ce3..a66dec1 100755 --- a/app/scripts/nmr-cli/bin/index.js +++ b/app/scripts/nmr-cli/src/index.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node -const yargs = require("yargs"); -const { loadSpectrumFromURL, loadSpectrumFromFilePath } = require("./prase-spectra"); +import yargs, { type Argv, type CommandModule, type Options, } from "yargs"; +import { loadSpectrumFromURL, loadSpectrumFromFilePath } from "./prase-spectra"; +import { generateSpectrumFromPublicationString } from "./publication-string"; const usageMessage = ` @@ -8,22 +9,33 @@ Usage: nmr-cli [options] Commands: parse-spectra Parse a spectra file to NMRium file + parse-publication-string resurrect spectrum from the publication string Options for 'parse-spectra' command: -u, --url File URL -p, --path Directory path -s, --capture-snapshot Capture snapshot +Arguments for 'parse-publication-string' command: + publicationString Publication string + Examples: nmr-cli parse-spectra -u file-url -s // Process spectra files from a URL and capture an image for the spectra nmr-cli parse-spectra -p directory-path -s // process a spectra files from a directory and capture an image for the spectra nmr-cli parse-spectra -u file-url // Process spectra files from a URL nmr-cli parse-spectra -p directory-path // Process spectra files from a directory + nmr-cli parse-publication-string "your publication string" `; +interface FileOptionsArgs { + u?: string; + p?: string; + s?: boolean; +} + -// Define options for parsing a file -const fileOptions = { +// Define options for parsing a spectra file +const fileOptions: { [key in keyof FileOptionsArgs]: Options } = { u: { alias: 'url', describe: 'File URL', @@ -41,19 +53,17 @@ const fileOptions = { describe: 'Capture snapshot', type: 'boolean', }, -}; +} as const; -// Define the 'parse-file' command -const parseFileCommand = { +const parseFileCommand: CommandModule<{}, FileOptionsArgs> = { command: ['parse-spectra', 'ps'], describe: 'Parse a spectra file to NMRium file', builder: (yargs) => { - return yargs.options(fileOptions).conflicts('u', 'p'); + return yargs.options(fileOptions).conflicts('u', 'p') as Argv; }, handler: (argv) => { // Handle parsing the spectra file logic based on argv options - console.log(argv) if (argv?.u) { loadSpectrumFromURL(argv.u, argv.s).then((result) => { console.log(JSON.stringify(result)) @@ -69,13 +79,29 @@ const parseFileCommand = { }, }; -// Set up Yargs with the two commands +// Define the parse publication string command +const parsePublicationCommand: CommandModule = { + command: ['parse-publication-string', 'pps'], + describe: 'Parse a publication string', + handler: (argv) => { + const publicationString = argv._[1]; + // Handle parsing publication string + if (typeof publicationString == "string") { + const nmriumObject = generateSpectrumFromPublicationString(publicationString); + + + console.log(JSON.stringify(nmriumObject)); + } + }, +}; + yargs .usage(usageMessage) .command(parseFileCommand) + .command(parsePublicationCommand) .showHelpOnFail(true) .help() - .argv; + .parse(); diff --git a/app/scripts/nmr-cli/bin/prase-spectra.js b/app/scripts/nmr-cli/src/prase-spectra.ts similarity index 67% rename from app/scripts/nmr-cli/bin/prase-spectra.js rename to app/scripts/nmr-cli/src/prase-spectra.ts index 2b040f4..b107ecc 100644 --- a/app/scripts/nmr-cli/bin/prase-spectra.js +++ b/app/scripts/nmr-cli/src/prase-spectra.ts @@ -1,18 +1,25 @@ -const { join, isAbsolute } = require("path"); -const loader = require("nmr-load-save"); -const fileUtils = require("filelist-utils"); -const playwright = require('playwright'); +import { join, isAbsolute } from "path"; +import { type NmriumState, read } from "nmr-load-save"; +import { fileCollectionFromWebSource, fileCollectionFromPath } from "filelist-utils"; +import playwright from 'playwright'; + + +interface Snapshot { + image: string, + id: string; +} function generateNMRiumURL() { - const baseURL = process.env['BASE_NMRIUM_URL']; + const baseURL = process.env['BASE_NMRIUM_URL'] || ''; const url = new URL(baseURL) url.searchParams.append('workspace', "embedded") return url.toString() } -async function captureSpectraViewAsBase64(nmriumState) { - const { data: { spectra }, version } = nmriumState; + +async function captureSpectraViewAsBase64(nmriumState: Partial) { + const { data: { spectra } = { spectra: [] }, version } = nmriumState; const browser = await playwright.chromium.launch() const context = await browser.newContext(playwright.devices['Desktop Chrome HiDPI']) const page = await context.newPage() @@ -23,7 +30,7 @@ async function captureSpectraViewAsBase64(nmriumState) { await page.locator('text=Loading').waitFor({ state: 'hidden' }); - let snapshots = [] + let snapshots: Snapshot[] = [] for (const spectrum of spectra || []) { const spectrumObject = { @@ -35,8 +42,8 @@ async function captureSpectraViewAsBase64(nmriumState) { } // convert typed array to array - const stringObject = JSON.stringify(spectrumObject, (key, value) => { - return ArrayBuffer.isView(value) ? Array.from(value) : value + const stringObject = JSON.stringify(spectrumObject, (key, value: unknown) => { + return ArrayBuffer.isView(value) ? Array.from(value as unknown as Iterable) : value }) // load the spectrum into NMRium using the custom event @@ -68,7 +75,7 @@ async function captureSpectraViewAsBase64(nmriumState) { return snapshots; } -async function loadSpectrumFromURL(url, enableSnapshot = false) { +async function loadSpectrumFromURL(url: string, enableSnapshot = false) { const { pathname: relativePath, origin: baseURL } = new URL(url); const source = { entries: [ @@ -78,13 +85,13 @@ async function loadSpectrumFromURL(url, enableSnapshot = false) { ], baseURL }; - const fileCollection = await fileUtils.fileCollectionFromWebSource(source, {}); + const fileCollection = await fileCollectionFromWebSource(source, {}); const { nmriumState: { data, version }, - } = await loader.read(fileCollection); + } = await read(fileCollection); - let images = [] + let images: Snapshot[] = [] if (enableSnapshot) { images = await captureSpectraViewAsBase64({ data, version }); @@ -95,16 +102,16 @@ async function loadSpectrumFromURL(url, enableSnapshot = false) { } -async function loadSpectrumFromFilePath(path, enableSnapshot = false) { +async function loadSpectrumFromFilePath(path: string, enableSnapshot = false) { const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) - const fileCollection = await fileUtils.fileCollectionFromPath(dirPath, {}); + const fileCollection = await fileCollectionFromPath(dirPath, {}); const { nmriumState: { data, version } - } = await loader.read(fileCollection); + } = await read(fileCollection); - let images = [] + let images: Snapshot[] = [] if (enableSnapshot) { images = await captureSpectraViewAsBase64({ data, version }); @@ -115,7 +122,7 @@ async function loadSpectrumFromFilePath(path, enableSnapshot = false) { } -module.exports = { +export { loadSpectrumFromFilePath, loadSpectrumFromURL }; diff --git a/app/scripts/nmr-cli/src/publication-string.ts b/app/scripts/nmr-cli/src/publication-string.ts new file mode 100644 index 0000000..f423894 --- /dev/null +++ b/app/scripts/nmr-cli/src/publication-string.ts @@ -0,0 +1,73 @@ +import { resurrect, rangesToXY, type NMRRange } from 'nmr-processing'; +import { v4 } from '@lukeed/uuid'; +import { CURRENT_EXPORT_VERSION } from 'nmr-load-save'; +import { castToArray } from './utilities/castToArray' + + +interface Info { + nucleus: string; solvent: string; name: string +} + +function generateSpectrumFromRanges( + ranges: NMRRange[], + info: Info, +) { + const { nucleus, solvent, name = null } = info; + + const frequency = 400; + try { + const { x, y } = rangesToXY(ranges, { + nucleus, + frequency, + nbPoints: 2 ** 17, + }); + + const info = { + isFid: false, + isComplex: false, + dimension: 1, + nucleus, + originFrequency: frequency, + baseFrequency: frequency, + pulseSequence: '', + solvent, + isFt: true, + name, + }; + + const spectrum = + { + id: v4(), + data: { x: castToArray(x), im: undefined, re: castToArray(y) }, + info, + ranges: { + values: ranges, options: { + sum: 100, + isSumConstant: false, + sumAuto: false + } + }, + }; + + return { data: { spectra: [spectrum] }, version: CURRENT_EXPORT_VERSION }; + } catch (error) { + console.log(error); + } +} + + +function generateSpectrumFromPublicationString( + publicationString: string +) { + const { + ranges, + experiment: { nucleus, solvent }, + parts, + } = resurrect(publicationString); + return generateSpectrumFromRanges( + ranges, + { nucleus, solvent, name: parts[0] }, + ); +} + +export { generateSpectrumFromPublicationString } diff --git a/app/scripts/nmr-cli/src/utilities/castToArray.ts b/app/scripts/nmr-cli/src/utilities/castToArray.ts new file mode 100644 index 0000000..6cd3a48 --- /dev/null +++ b/app/scripts/nmr-cli/src/utilities/castToArray.ts @@ -0,0 +1,3 @@ +export function castToArray(value: Float64Array | number[]): number[] { + return ArrayBuffer.isView(value) ? Array.from(value) : value +} \ No newline at end of file diff --git a/app/scripts/nmr-cli/tsconfig.json b/app/scripts/nmr-cli/tsconfig.json new file mode 100644 index 0000000..0f9b561 --- /dev/null +++ b/app/scripts/nmr-cli/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2020", + "module": "CommonJS", + "strict": true, + "esModuleInterop": true, + "moduleResolution": "node", + "outDir": "./build", + "skipLibCheck": true, + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file From 99f6986066b3c0723dd1d2740d8dc7b7cb003581 Mon Sep 17 00:00:00 2001 From: hamed-musallam <35760236+hamed-musallam@users.noreply.github.com> Date: Mon, 22 Apr 2024 10:56:37 +0200 Subject: [PATCH 16/44] feat: update nmr-load-save to version 0.28.0 (#75) * chore: update dependencies * feat: update nmr-load-save to version 0.28.0 --- app/scripts/nmr-cli/package-lock.json | 511 ++++++++++++++++---------- app/scripts/nmr-cli/package.json | 12 +- 2 files changed, 326 insertions(+), 197 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 20fb3ce..ea15b1f 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,20 +9,20 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "filelist-utils": "^1.10.2", - "nmr-load-save": "^0.24.0", - "nmr-processing": "^11.7.0", - "playwright": "^1.40.1", + "filelist-utils": "^1.11.0", + "nmr-load-save": "^0.28.0", + "nmr-processing": "^12.0.1", + "playwright": "^1.42.1", "yargs": "^17.7.2" }, "bin": { - "nmr-cli": "bin/index.js" + "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^20.11.5", + "@types/node": "^20.11.28", "@types/yargs": "^17.0.32", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.2" } }, "node_modules/@cspotcode/source-map-support": { @@ -106,22 +106,22 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.196", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.196.tgz", - "integrity": "sha512-22y3o88f4a94mKljsZcanlNWPzO0uBsBdzLAngf2tp533LzZcQzb6+eZPJ+vCTt+bqF2XnvT9gejTLsAcJAJyQ==" + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" }, "node_modules/@types/lodash.merge": { - "version": "4.6.7", - "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.7.tgz", - "integrity": "sha512-OwxUJ9E50gw3LnAefSHJPHaBLGEKmQBQ7CZe/xflHkyy/wH2zVyEIAKReHvVrrn7zKdF58p16We9kMfh7v0RRQ==", + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz", + "integrity": "sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==", "dependencies": { "@types/lodash": "*" } }, "node_modules/@types/node": { - "version": "20.11.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.5.tgz", - "integrity": "sha512-g557vgQjUUfN76MZAN/dt1z3dzcUsimuysco0KeluHgrPdJXkP/XdAURgyO2W9fZWHRtRBiVKzKn8vyOAwlG+w==", + "version": "20.11.28", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", + "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -191,26 +191,35 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, "node_modules/atom-sorter": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.0.0.tgz", "integrity": "sha512-30O3ccAH+lmysMykyEkBsfB65BU329GatBeYrgzKjDBhaURgvWT7B2+C9gmBFnVmbMO2HaqvyAuce3eMsICluw==" }, "node_modules/baselines": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.6.tgz", - "integrity": "sha512-UxKzVNQlewXopLmYBgmsFTAnCfX1uQzHJRqBpqtiYYVHlGcam2POg855gCh9feVic7x10ZFVw6S7VPZxcAhQrg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.7.tgz", + "integrity": "sha512-UaZbIovi2Ur0AiKl5lR3OZ8B/CxXhySd7BjDiuv8g9A/bEfstQjUASdjsDFQMBBHC6vzBfwXYGRhPEWX8VvcYQ==", "dependencies": { - "ml-airpls": "^1.0.2", + "ml-airpls": "^1.0.3", "ml-array-sequential-fill": "^1.1.8", "ml-baseline-correction-regression": "^1.0.2", - "ml-rolling-ball-baseline": "^2.0.2", - "ml-spectra-processing": "^12.5.0" + "ml-rolling-ball-baseline": "^2.0.3", + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/baselines/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/binary-search": { @@ -219,22 +228,36 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brukerconverter": { - "version": "6.3.4", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.4.tgz", - "integrity": "sha512-WoIAyD4ANOnWuemOJFUZuwt+OamliivwidfXhdMGbhXCI5ZB4rlHEP0NycuOsbOvsahJ1vtsHpsowSVMh8Lovw==", + "version": "6.3.6", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.6.tgz", + "integrity": "sha512-l995nNGSONWv2d4LxHf7qbG1z3vSe+5ksUGw4M5eUypedg2pycItdGeGIipEkP3JTsc+So8d8RshlNm4TbSYVQ==", "dependencies": { - "cheminfo-types": "^1.5.0", - "filelist-utils": "^1.8.0", + "cheminfo-types": "^1.7.2", + "filelist-utils": "^1.11.0", "iobuffer": "^5.3.2", - "is-any-array": "^2.0.0", - "jcampconverter": "^9.5.1", - "ml-spectra-processing": "^12.0.0" + "is-any-array": "^2.0.1", + "jcampconverter": "^9.6.1", + "ml-spectra-processing": "^14.1.1" + } + }, + "node_modules/brukerconverter/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/cheminfo-types": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.7.2.tgz", - "integrity": "sha512-Zz7HPnh6wB2beEK7nfsXlNSK1Tpl4O0DpYUod8L6gI/5+INpn/d5UgJLI+3ck6CYY5Qsq34ylyKhERmZ5Wks2A==" + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.7.3.tgz", + "integrity": "sha512-KIKBULfo+XwkSBwMfwjBmZCmY+RXisN2kRc33WikuWBsCQQy5alHWYVrMCO8//lDvy9h1giOzwsC9kgq0OahUw==" }, "node_modules/cliui": { "version": "8.0.1", @@ -265,17 +288,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/convert-to-jcamp": { "version": "5.4.9", "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.9.tgz", @@ -318,14 +330,6 @@ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-0.7.1.tgz", "integrity": "sha512-Ifi3fH46Bco+Lb1mOlTxbFEuF3NdyElEVVD+EmoK327I0JzKAP4x57cl+HoxHqFcVd8F/uXLC+wtY3n/R1uO2w==" }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -368,9 +372,9 @@ "integrity": "sha512-f9c00hphOgeQTlDyavwTtu6RiK8AIFjD6+jvXkNkpeQ7rirK3uFWVpalkoS4LAwbdX7mfZ8aoBfFVQX1Re/8aw==" }, "node_modules/filelist-utils": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.10.2.tgz", - "integrity": "sha512-E4wIKXIXEyON7i6Z/7+hjytm53S0GSE/b+lvPlE5jAbHRV8thv7a4G+aLLFeOPYQK01MCH1l+ti6jHQ3tl/7bg==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.11.0.tgz", + "integrity": "sha512-POCfHquP6jw2aPjfs7UWyywfWkSsLFsXquPNEchrFkc7ffxlz42IiJHeqc7SweMccSF4tV2Kgr1yzPAA/z/iPg==", "dependencies": { "cheminfo-types": "^1.7.2", "cross-fetch": "^4.0.0", @@ -378,19 +382,6 @@ "pako": "^2.1.0" } }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -491,9 +482,9 @@ } }, "node_modules/jcampconverter": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.6.0.tgz", - "integrity": "sha512-rLkyJxnGM3e4KD5NfPfHtFuk4lMnvHgmpfxvUiRlJDLizIFgiNgsiFAgQTqey0OY6eJQAM381TmxSb3DkEPNSg==", + "version": "9.6.3", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.6.3.tgz", + "integrity": "sha512-o+VyI5kWHd3w//01FRpI0uKuZrfJq8x6ae15ImxnKgm+/ThVnvqSwcOSaKrvnEcRVh13BClpMrn+JCES9QATXA==", "dependencies": { "cheminfo-types": "^1.7.2", "dynamic-typing": "^1.0.0", @@ -535,14 +526,28 @@ } }, "node_modules/linear-sum-assignment": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.5.tgz", - "integrity": "sha512-JiyPEQM+Lb5K0BR9uBkLae9gNKMpici8hOwrWwNnOkABrNn8yWCOd4wwAaLGlu9HzfQFxHcs07zOaGgXgco5Kg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.7.tgz", + "integrity": "sha512-jfLoSGwZNyjfY8eK4ayhjfcIu3BfWvP6sWieYzYI3AWldwXVoWEz1gtrQL10v/8YltYLBunqNjeVFXPMUs+MJg==", "dependencies": { - "cheminfo-types": "^1.4.0", + "cheminfo-types": "^1.7.3", "install": "^0.13.0", - "ml-matrix": "^6.10.4", - "ml-spectra-processing": "^12.0.0" + "ml-matrix": "^6.11.0", + "ml-spectra-processing": "^14.2.2" + } + }, + "node_modules/linear-sum-assignment/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/lodash": { @@ -571,25 +576,6 @@ "resolved": "https://registry.npmjs.org/median-quickselect/-/median-quickselect-1.0.1.tgz", "integrity": "sha512-/QL9ptNuLsdA68qO+2o10TKCyu621zwwTFdLvtu8rzRNKsn8zvuGoq/vDxECPyELFG8wu+BpyoMR9BnsJqfVZQ==" }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/ml-airpls": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/ml-airpls/-/ml-airpls-1.0.3.tgz", @@ -649,13 +635,44 @@ "ml-regression-polynomial": "^2.2.0" } }, + "node_modules/ml-baseline-correction-regression/node_modules/ml-regression-base": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-2.1.6.tgz", + "integrity": "sha512-yTckvEc8szc6VrUTJSgAClShvCoPZdNt8pmyRe8aGsIWGjg6bYFotp9mDUwAB0snvKAbQWd6A4trL/PDCASLug==", + "dependencies": { + "is-any-array": "^2.0.0" + } + }, + "node_modules/ml-baseline-correction-regression/node_modules/ml-regression-polynomial": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-2.2.0.tgz", + "integrity": "sha512-WxFsEmi6oLxgq9TeaVoAA+vVUJFp1kGarX6WWClR8OmlanoIW5iLMnaeXfQcYuH8xNq4R1Cax2N9hYYmeWWkLg==", + "dependencies": { + "ml-matrix": "^6.8.0", + "ml-regression-base": "^2.1.3" + } + }, "node_modules/ml-direct": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/ml-direct/-/ml-direct-0.1.3.tgz", - "integrity": "sha512-3CFuHK4eJrBAiTK9bgwqN5rXr3X66ShC/Acx3+h26kk/aLpQxLRkZ5lPCC72HMG9hTtJIMoSlev8QYpXSBB3OA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ml-direct/-/ml-direct-1.0.0.tgz", + "integrity": "sha512-DyynbcLIHGCRYiJNRW6qeWpOyV/SCYwSzYDN0VP72ucIx0jn8H4GYKRTY94e0Gk+yKlOjdu3GSNY/j6nxdl9YA==", "dependencies": { - "ml-matrix": "^6.10.4", - "ml-spectra-processing": "^12.0.0" + "ml-matrix": "^6.11.0", + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/ml-direct/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/ml-disjoint-set": { @@ -687,16 +704,30 @@ } }, "node_modules/ml-gsd": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.3.tgz", - "integrity": "sha512-9qTIc3reKSifJ4EpxdFl+9C4pfvm/XKuM+JXBfHdd2hhfD1ZQ9CcrPxm5OBTcZVqJ4e9pKsUDvJnjePX2Yb5YA==", + "version": "12.1.6", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.6.tgz", + "integrity": "sha512-Jn1VLU9tD622R3naKDn1YuOYfh45QBkKQEVoU3X3G1+ZOtBvS8CvvBtxZ457l2/H2vXI+6HQcRV+CaWIfKyURA==", "dependencies": { - "@lukeed/uuid": "^2.0.0", - "cheminfo-types": "^1.4.0", + "@lukeed/uuid": "^2.0.1", + "cheminfo-types": "^1.7.2", "ml-peak-shape-generator": "^4.1.2", "ml-savitzky-golay-generalized": "^4.0.1", - "ml-spectra-fitting": "^4.2.1", - "ml-spectra-processing": "^12.0.0" + "ml-spectra-fitting": "^4.2.3", + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/ml-gsd/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/ml-hash-table": { @@ -763,29 +794,45 @@ } }, "node_modules/ml-regression-base": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-2.1.6.tgz", - "integrity": "sha512-yTckvEc8szc6VrUTJSgAClShvCoPZdNt8pmyRe8aGsIWGjg6bYFotp9mDUwAB0snvKAbQWd6A4trL/PDCASLug==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-3.0.0.tgz", + "integrity": "sha512-qkQWvNk8VU1LIytjid/+YHOSx8GnEU9dCUPsAQ8AzCh4saijrsni/XA6x7r+N1UrHMDHeSEUBtRZTsl2syyu/A==", "dependencies": { - "is-any-array": "^2.0.0" + "cheminfo-types": "^1.7.2", + "is-any-array": "^2.0.1" } }, "node_modules/ml-regression-polynomial": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-2.2.0.tgz", - "integrity": "sha512-WxFsEmi6oLxgq9TeaVoAA+vVUJFp1kGarX6WWClR8OmlanoIW5iLMnaeXfQcYuH8xNq4R1Cax2N9hYYmeWWkLg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.0.tgz", + "integrity": "sha512-8agLNJZzuVpdthMDUkaamiQnfHx7y1T9LrbCiAPHnhklVrg7O7tzClEZ7XMh48AZMNhKl1ewGvn2VLrI6AD+wA==", "dependencies": { - "ml-matrix": "^6.8.0", - "ml-regression-base": "^2.1.3" + "cheminfo-types": "^1.7.2", + "ml-matrix": "^6.10.5", + "ml-regression-base": "^3.0.0" } }, "node_modules/ml-rolling-ball-baseline": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ml-rolling-ball-baseline/-/ml-rolling-ball-baseline-2.0.2.tgz", - "integrity": "sha512-tZ8ZArQ2XIgkpjMeKUG7Q25Aj+CnMK1Kl0NzXHHvMz1AqtrIm9Y9UP435rRNdqgoGJFpLhzDsoMFa9FDTGOQRQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/ml-rolling-ball-baseline/-/ml-rolling-ball-baseline-2.0.3.tgz", + "integrity": "sha512-L7F+BfO4VsxEpPrAGUYWnupf6brodboU0fb3mK8P4k1MbtSDYJJtMGXfxY0PT3mQ+FgOpb6j+X49jzRT1hGShw==", "dependencies": { "is-any-array": "^2.0.1", - "ml-spectra-processing": "^12.5.0" + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/ml-rolling-ball-baseline/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/ml-savitzky-golay-generalized": { @@ -798,15 +845,29 @@ } }, "node_modules/ml-signal-processing": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.0.3.tgz", - "integrity": "sha512-fIRgMGmF3kbsW3iiGCVZviwC652nBn+m5CTnweKi8TIyi9X/iEB0njA/TG9whTefEivQL40dqAfVUVAkybgYMw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.0.4.tgz", + "integrity": "sha512-MYMyfhReCxJsbNu9pCbO7jVTQJXiDxyzm+ly1E7T2eS7dk048YLyLPxfTZFn9HDtNSTCnP7djac4Y7BRJC/JmQ==", "dependencies": { - "baselines": "^1.1.5", - "cheminfo-types": "^1.4.0", - "ml-gsd": "^12.1.3", + "baselines": "^1.1.7", + "cheminfo-types": "^1.7.2", + "ml-gsd": "^12.1.5", "ml-savitzky-golay-generalized": "^4.0.1", - "ml-spectra-processing": "^12.0.0" + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/ml-signal-processing/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/ml-simple-clustering": { @@ -823,16 +884,30 @@ } }, "node_modules/ml-spectra-fitting": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.1.tgz", - "integrity": "sha512-vZI98eSK5HKeZTgh8omskRHB8QdnDTaTw1rbMPWTkfBH+6FgEgPvMRqH18BAaSHtxJHrqE6c4tQq9L9J8iYebg==", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.3.tgz", + "integrity": "sha512-2SwlqbpUeqFZ490mEmOzIbWQK3lM049cx4tgIcrCrknlXdgTnNsCTmmpll8wac7GJOCJlq2QtjuT0IHHitoVXg==", "dependencies": { - "cheminfo-types": "^1.4.0", + "cheminfo-types": "^1.7.2", "ml-array-max": "^1.2.4", - "ml-direct": "^0.1.1", - "ml-levenberg-marquardt": "^4.1.0", + "ml-direct": "^1.0.0", + "ml-levenberg-marquardt": "^4.1.3", "ml-peak-shape-generator": "^4.1.2", - "ml-spectra-processing": "^12.0.0" + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/ml-spectra-fitting/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/ml-spectra-processing": { @@ -871,63 +946,89 @@ } }, "node_modules/nmr-load-save": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.24.0.tgz", - "integrity": "sha512-08Kouo4DjkJj6CPr4fgXO82oLZzexTqRqZOCtP2TDor+N7wae7yo8MtwotrPLY4VQDHoiRIy6A96KEuWviimZQ==", + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.28.0.tgz", + "integrity": "sha512-w6+34QISiOFMeWHr1aarqd4vlF0RjHH2CkAZSsjbIoOsTwMbDKprV+YjayE1QmraVnWUGUln58E1K1v5Bx2Xew==", "dependencies": { "@lukeed/uuid": "^2.0.1", - "@types/lodash.merge": "^4.6.7", - "brukerconverter": "^6.3.3", - "cheminfo-types": "^1.7.2", + "@types/lodash.merge": "^4.6.9", + "brukerconverter": "^6.3.6", + "cheminfo-types": "^1.7.3", "convert-to-jcamp": "^5.4.9", - "filelist-utils": "^1.10.2", - "gyromagnetic-ratio": "^1.1.0", + "filelist-utils": "^1.11.0", + "gyromagnetic-ratio": "^1.1.1", "is-any-array": "^2.0.1", - "jcampconverter": "^9.6.0", + "jcampconverter": "^9.6.3", "jeolconverter": "^1.0.2", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^12.8.0", + "ml-spectra-processing": "^14.2.2", "nmr-correlation": "^2.3.3", - "nmr-processing": "^11.7.0", + "nmr-processing": "^12.0.1", "nmredata": "^0.9.9", - "openchemlib": "^8.7.0", - "openchemlib-utils": "^5.6.0", + "openchemlib": "^8.9.0", + "openchemlib-utils": "^5.12.1", "sdf-parser": "^6.0.1", - "varian-converter": "^0.3.3" + "varian-converter": "^1.0.0" + } + }, + "node_modules/nmr-load-save/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/nmr-processing": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-11.7.0.tgz", - "integrity": "sha512-wws8YO5M9UOE+HFxLUtcRJR/nH8InrKCWvX2Hejo8xeuA1oODrkW4TauyfPzXDK1fmqJ82U9ou78H+55alqShw==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-12.0.1.tgz", + "integrity": "sha512-DqmYAw3hpIWFQlXLeWrOrxnn8VHT9jfMobOENuWhpAg/6MSnmOqkAqhLPFUDhP1mF3z4IXlNyRIWKYsYbisrzA==", "dependencies": { "@lukeed/uuid": "^2.0.1", "binary-search": "^1.3.6", - "cross-fetch": "^4.0.0", - "form-data": "^4.0.0", "gyromagnetic-ratio": "^1.1.1", "is-any-array": "^2.0.1", "linear-sum-assignment": "^1.0.5", "lodash.omit": "^4.5.0", "ml-airpls": "^1.0.3", - "ml-baseline-correction-regression": "^1.0.2", - "ml-direct": "^0.1.3", - "ml-gsd": "^12.1.3", + "ml-direct": "^1.0.0", + "ml-gsd": "^12.1.6", "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^4.1.3", "ml-matrix": "^6.11.0", "ml-matrix-convolution": "^1.0.0", "ml-matrix-peaks-finder": "^1.0.0", "ml-peak-shape-generator": "^4.1.2", - "ml-signal-processing": "^1.0.3", + "ml-regression-polynomial": "^3.0.0", + "ml-signal-processing": "^1.0.4", "ml-simple-clustering": "^0.1.0", "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^12.8.0", + "ml-spectra-processing": "^14.2.0", "ml-tree-set": "^0.1.1", "nmr-correlation": "^2.3.3", "numeral": "^2.0.6", - "openchemlib-utils": "^5.6.1", - "spectrum-generator": "^8.0.8" + "openchemlib-utils": "^5.12.0", + "spectrum-generator": "^8.0.11" + } + }, + "node_modules/nmr-processing/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/nmredata": { @@ -980,14 +1081,14 @@ } }, "node_modules/openchemlib": { - "version": "8.7.2", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.7.2.tgz", - "integrity": "sha512-k7LGea1GRLewzO9REarAVrP62hZgImxDZRIU6p29utmYiXL56OmlVMVoTG3FqEule+yx/p96yzv9qYladSC3SA==" + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.9.0.tgz", + "integrity": "sha512-8Bb7batm6XvNHg9SWBJDYrkJj5bsq72D5dClpN5yO6BnxxNxtRP1+e6egHwoMwGhd4dyb+eBX7Kr/hdUqMN1Dw==" }, "node_modules/openchemlib-utils": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-5.6.1.tgz", - "integrity": "sha512-69dYUKb/vclhxmRwmKdzn5b4CwoKMqnG/O5cA9n4ysJ0A70dv2YCtX5UcC95GD2c3DTS1ALlb32mnmUzcWOGBQ==", + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-5.12.1.tgz", + "integrity": "sha512-zqkr8eScv87qrKELV/i/C5IVxqDcPYq29Rm1KrV993aFcVXlCuBRpAtyQ7BRZlNh8D9SDHOn78V3I+ZyciF2cw==", "dependencies": { "atom-sorter": "^2.0.0", "ensure-string": "^1.2.0", @@ -1012,11 +1113,11 @@ "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, "node_modules/playwright": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.40.1.tgz", - "integrity": "sha512-2eHI7IioIpQ0bS1Ovg/HszsN/XKNwEG1kbzSDDmADpclKc7CyqkHw7Mg2JCz/bbCxg25QUPcjksoMW7JcIFQmw==", + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", + "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", "dependencies": { - "playwright-core": "1.40.1" + "playwright-core": "1.42.1" }, "bin": { "playwright": "cli.js" @@ -1029,9 +1130,9 @@ } }, "node_modules/playwright-core": { - "version": "1.40.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.40.1.tgz", - "integrity": "sha512-+hkOycxPiV534c4HhpfX6yrlawqVUzITRKwHAmYfmsVreltEl6fAZJ3DPfLMOODw0H3s1Itd6MDCWmP1fl/QvQ==", + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", + "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", "bin": { "playwright-core": "cli.js" }, @@ -1086,12 +1187,26 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/spectrum-generator": { - "version": "8.0.8", - "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.0.8.tgz", - "integrity": "sha512-CRCW/ByC9lyRqssRz+S84l/xHhU+p2BzAIQc2OwLqRpmt89bzzr2u8h3WT1GDtXtMnTyDQEH2Yhnpb3PJeZ79Q==", + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.0.11.tgz", + "integrity": "sha512-B68lrg7XFtt+bB6cYnxbiPiD7TrFl5zYKNkKXZcY3LqqShHXQHhq8RKpHi2coEsJQs4nrxmHJ9mfxP6p4QGmMw==", "dependencies": { "ml-peak-shape-generator": "^4.1.2", - "ml-spectra-processing": "^12.5.0" + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/spectrum-generator/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/spline-interpolator": { @@ -1183,9 +1298,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -1213,13 +1328,27 @@ "dev": true }, "node_modules/varian-converter": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/varian-converter/-/varian-converter-0.3.3.tgz", - "integrity": "sha512-pu2WVuXeqtoy/RC1XIga6E1A4/4m+XhQSVzFdPjxlX2ih53qpHV3fl/g/UVvvJ9m9GQdOExEGKIK3JG4up8Upg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/varian-converter/-/varian-converter-1.0.0.tgz", + "integrity": "sha512-dZrYLrN8llpfXC8EDKzgaeB0foCCTgTnsfjiIr1PH2GChRwkM0yjLzAgco+E+hTFoo6Da3Nvj9Zmud9i0YPlDg==", "dependencies": { - "filelist-utils": "^1.10.2", + "filelist-utils": "^1.11.0", "iobuffer": "^5.3.2", - "ml-spectra-processing": "^12.5.1" + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/varian-converter/node_modules/ml-spectra-processing": { + "version": "14.2.2", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", + "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "dependencies": { + "binary-search": "^1.3.6", + "cheminfo-types": "^1.7.3", + "fft.js": "^4.0.4", + "is-any-array": "^2.0.1", + "ml-matrix": "^6.11.0", + "ml-xsadd": "^2.0.0", + "spline-interpolator": "^1.0.0" } }, "node_modules/webidl-conversions": { diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 5b7df59..73bca57 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,16 +15,16 @@ "nmr-cli": "./build/index.js" }, "dependencies": { - "filelist-utils": "^1.10.2", - "nmr-load-save": "^0.24.0", - "nmr-processing": "^11.7.0", - "playwright": "^1.40.1", + "filelist-utils": "^1.11.0", + "nmr-load-save": "^0.28.0", + "nmr-processing": "^12.0.1", + "playwright": "^1.42.1", "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^20.11.5", + "@types/node": "^20.11.28", "@types/yargs": "^17.0.32", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.2" } } \ No newline at end of file From cf4618739e0373d088cb1c325ff7914af8731c2a Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 18 Mar 2024 14:49:27 +0100 Subject: [PATCH 17/44] chore: update dependencies --- app/scripts/nmr-cli/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index ea15b1f..986546f 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -1424,4 +1424,4 @@ } } } -} +} \ No newline at end of file From 72a3a3323396c866efac2adba06c6f02cd64003c Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 22 Apr 2024 10:52:48 +0200 Subject: [PATCH 18/44] chore: update dependencies --- app/scripts/nmr-cli/package-lock.json | 32 +++++++++++++-------------- app/scripts/nmr-cli/package.json | 6 ++--- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 986546f..62fdc55 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -12,17 +12,17 @@ "filelist-utils": "^1.11.0", "nmr-load-save": "^0.28.0", "nmr-processing": "^12.0.1", - "playwright": "^1.42.1", + "playwright": "^1.43.1", "yargs": "^17.7.2" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^20.11.28", + "@types/node": "^20.12.7", "@types/yargs": "^17.0.32", "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.5" } }, "node_modules/@cspotcode/source-map-support": { @@ -119,9 +119,9 @@ } }, "node_modules/@types/node": { - "version": "20.11.28", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.28.tgz", - "integrity": "sha512-M/GPWVS2wLkSkNHVeLkrF2fD5Lx5UC4PxA0uZcKc6QqbIQUJyW1jVjueJYi1z8n0I5PxYrtpnPnWglE+y9A0KA==", + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -1113,11 +1113,11 @@ "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, "node_modules/playwright": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.42.1.tgz", - "integrity": "sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg==", + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", + "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", "dependencies": { - "playwright-core": "1.42.1" + "playwright-core": "1.43.1" }, "bin": { "playwright": "cli.js" @@ -1130,9 +1130,9 @@ } }, "node_modules/playwright-core": { - "version": "1.42.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.42.1.tgz", - "integrity": "sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA==", + "version": "1.43.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", + "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", "bin": { "playwright-core": "cli.js" }, @@ -1298,9 +1298,9 @@ } }, "node_modules/typescript": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", - "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 73bca57..93ca88b 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -18,13 +18,13 @@ "filelist-utils": "^1.11.0", "nmr-load-save": "^0.28.0", "nmr-processing": "^12.0.1", - "playwright": "^1.42.1", + "playwright": "^1.43.1", "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^20.11.28", + "@types/node": "^20.12.7", "@types/yargs": "^17.0.32", "ts-node": "^10.9.2", - "typescript": "^5.4.2" + "typescript": "^5.4.5" } } \ No newline at end of file From bed41c14dd45897152eb17ad329474a07f7a87dc Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 22 Apr 2024 10:53:43 +0200 Subject: [PATCH 19/44] feat: update nmr-load-save to version 0.29.3 --- app/scripts/nmr-cli/package-lock.json | 248 +++--------------- app/scripts/nmr-cli/package.json | 4 +- app/scripts/nmr-cli/src/publication-string.ts | 2 +- 3 files changed, 43 insertions(+), 211 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 62fdc55..487215c 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -10,8 +10,8 @@ "license": "ISC", "dependencies": { "filelist-utils": "^1.11.0", - "nmr-load-save": "^0.28.0", - "nmr-processing": "^12.0.1", + "nmr-load-save": "^0.29.3", + "nmr-processing": "^12.2.0", "playwright": "^1.43.1", "yargs": "^17.7.2" }, @@ -208,29 +208,15 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/baselines/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/binary-search": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brukerconverter": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.6.tgz", - "integrity": "sha512-l995nNGSONWv2d4LxHf7qbG1z3vSe+5ksUGw4M5eUypedg2pycItdGeGIipEkP3JTsc+So8d8RshlNm4TbSYVQ==", + "version": "6.3.9", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.9.tgz", + "integrity": "sha512-rmzadrmIbBiv4Ihh4G4fTSqXAEM+Z2ai402hAt2KK/AQWRXl9hYzXPpKubYt1Z8qWaqcG2dkvoOmb/yuKGiVOg==", "dependencies": { "cheminfo-types": "^1.7.2", "filelist-utils": "^1.11.0", @@ -240,20 +226,6 @@ "ml-spectra-processing": "^14.1.1" } }, - "node_modules/brukerconverter/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/cheminfo-types": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.7.3.tgz", @@ -289,16 +261,16 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/convert-to-jcamp": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.9.tgz", - "integrity": "sha512-6WZ9Whrk7f4TSqepPbBRovnZ+IV+fjncZ8AYfX1OnnILlDQobciiJYFgxawvqpttwrKdmC3eh8shoAjW7CPKMQ==", + "version": "5.4.10", + "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.10.tgz", + "integrity": "sha512-noIRSe+cW1JATYaF0RSMDX6nCdjnzU7pFdDtalI6RA0g8I+3Rt3SV4uc1Pj5KUC1fP04dcemCNGTDdNusfHH0Q==", "dependencies": { - "cheminfo-types": "^1.7.2", + "cheminfo-types": "^1.7.3", "is-any-array": "^2.0.1", "ml-array-max": "^1.2.4", "ml-array-min": "^1.2.3", - "ml-matrix": "^6.10.4", - "ml-spectra-processing": "^12.5.0" + "ml-matrix": "^6.11.0", + "ml-spectra-processing": "^14.2.2" } }, "node_modules/core-util-is": { @@ -415,9 +387,9 @@ } }, "node_modules/gyromagnetic-ratio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-1.1.1.tgz", - "integrity": "sha512-M1y9bAhK11moqAPRZ5oUoDCEIQCogjKYXDMlkXJiSjkLFmOAp1qevrjThF+6KrtwkSpmT7Vgy8C/mgBlIdZPSg==" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-1.2.0.tgz", + "integrity": "sha512-Pgo5kU9Wd2WZ5KMChPyfFuimkfOq7CUPsmpmm/wcDBPJD2YOcAd7aCbZ0Xt+80h+yjqAhqVnXBxjQhoqIcAXJw==" }, "node_modules/heap": { "version": "0.2.7", @@ -482,9 +454,9 @@ } }, "node_modules/jcampconverter": { - "version": "9.6.3", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.6.3.tgz", - "integrity": "sha512-o+VyI5kWHd3w//01FRpI0uKuZrfJq8x6ae15ImxnKgm+/ThVnvqSwcOSaKrvnEcRVh13BClpMrn+JCES9QATXA==", + "version": "9.6.4", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.6.4.tgz", + "integrity": "sha512-6T8bPCImT2NQudVCBM5h47YFHMtpIAYFlcf6pCV3uP/AdceGtjGLA1iJVukhA2U2WPtzWax67aRvSfdknJEzFg==", "dependencies": { "cheminfo-types": "^1.7.2", "dynamic-typing": "^1.0.0", @@ -494,9 +466,9 @@ } }, "node_modules/jeolconverter": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jeolconverter/-/jeolconverter-1.0.2.tgz", - "integrity": "sha512-Oqp4VioharhRkQRSc6WkXc+s42DYLOdLWV7eNi16CJbiBvoaSrFf0KQwJJ5JfbpncYRMzrsjilBFYzYTbREC6g==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/jeolconverter/-/jeolconverter-1.0.3.tgz", + "integrity": "sha512-0ADCau6TYGgZvN3kK2PTKHk7enpgOAUvcHaNbeStGOciTUFyrtmaE53z6Blac9+GzGpT3kU0agfNA2COO+GsOw==", "dependencies": { "iobuffer": "^5.3.2" } @@ -536,20 +508,6 @@ "ml-spectra-processing": "^14.2.2" } }, - "node_modules/linear-sum-assignment/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -661,20 +619,6 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/ml-direct/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/ml-disjoint-set": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ml-disjoint-set/-/ml-disjoint-set-1.0.0.tgz", @@ -716,20 +660,6 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/ml-gsd/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/ml-hash-table": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ml-hash-table/-/ml-hash-table-1.0.0.tgz", @@ -821,27 +751,13 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/ml-rolling-ball-baseline/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/ml-savitzky-golay-generalized": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/ml-savitzky-golay-generalized/-/ml-savitzky-golay-generalized-4.0.1.tgz", - "integrity": "sha512-I3z6aEj9f+VaqoqWoTmyXOsIngOCW2JtpcZfoeqnLFFFuIyK4uXOEIRVft3XgQbbtivIvTBJKHpfxyN8sgB5vA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ml-savitzky-golay-generalized/-/ml-savitzky-golay-generalized-4.2.0.tgz", + "integrity": "sha512-Pcn0URPuFbmxNC75SvukByL1Ct+DYQuyo8O5EfmUcHacx+zeODbIoPRgrWwEWZGvZAJ03aS9avTwV0VUNdtAZQ==", "dependencies": { - "cheminfo-types": "^1.0.0", - "is-any-array": "^2.0.0" + "cheminfo-types": "^1.7.3", + "is-any-array": "^2.0.1" } }, "node_modules/ml-signal-processing": { @@ -856,20 +772,6 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/ml-signal-processing/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/ml-simple-clustering": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ml-simple-clustering/-/ml-simple-clustering-0.1.0.tgz", @@ -896,10 +798,10 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/ml-spectra-fitting/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", + "node_modules/ml-spectra-processing": { + "version": "14.3.0", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.3.0.tgz", + "integrity": "sha512-kY+vP8LMT/IXdyjltm1GG6lsm+FgshYuQkDbTAV6V0anO9VoBBDdJYiJYb4UmAS1AO8GTK5HGr8StODkas39pA==", "dependencies": { "binary-search": "^1.3.6", "cheminfo-types": "^1.7.3", @@ -910,20 +812,6 @@ "spline-interpolator": "^1.0.0" } }, - "node_modules/ml-spectra-processing": { - "version": "12.8.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-12.8.0.tgz", - "integrity": "sha512-vu8RiTDWmo9UHUTcaILhH0j61cdsUp2FYiHjvkJQ/JH2ArdOTRJ4KShsiHUgfS4MDLWevcN9kWSalDT5vnwx7g==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.2", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.10.5", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/ml-tree-set": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ml-tree-set/-/ml-tree-set-0.1.1.tgz", @@ -946,24 +834,24 @@ } }, "node_modules/nmr-load-save": { - "version": "0.28.0", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.28.0.tgz", - "integrity": "sha512-w6+34QISiOFMeWHr1aarqd4vlF0RjHH2CkAZSsjbIoOsTwMbDKprV+YjayE1QmraVnWUGUln58E1K1v5Bx2Xew==", + "version": "0.29.3", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.29.3.tgz", + "integrity": "sha512-5RKmXP5UQ0fL3JlBh3PYD4AGvTB/UEvf292tw6gi77nzPK/BPzpa+f4/78UR9QQk6qC3M5BYksD87fJMcwamfw==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", - "brukerconverter": "^6.3.6", + "brukerconverter": "^6.3.8", "cheminfo-types": "^1.7.3", - "convert-to-jcamp": "^5.4.9", + "convert-to-jcamp": "^5.4.10", "filelist-utils": "^1.11.0", "gyromagnetic-ratio": "^1.1.1", "is-any-array": "^2.0.1", - "jcampconverter": "^9.6.3", - "jeolconverter": "^1.0.2", + "jcampconverter": "^9.6.4", + "jeolconverter": "^1.0.3", "lodash.merge": "^4.6.2", "ml-spectra-processing": "^14.2.2", "nmr-correlation": "^2.3.3", - "nmr-processing": "^12.0.1", + "nmr-processing": "^12.2.0", "nmredata": "^0.9.9", "openchemlib": "^8.9.0", "openchemlib-utils": "^5.12.1", @@ -971,24 +859,10 @@ "varian-converter": "^1.0.0" } }, - "node_modules/nmr-load-save/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/nmr-processing": { - "version": "12.0.1", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-12.0.1.tgz", - "integrity": "sha512-DqmYAw3hpIWFQlXLeWrOrxnn8VHT9jfMobOENuWhpAg/6MSnmOqkAqhLPFUDhP1mF3z4IXlNyRIWKYsYbisrzA==", + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-12.2.0.tgz", + "integrity": "sha512-03EQxGh3JovKv1l6IXeSj0rm5vuw9iD9QE31cL7O1+NHXbPq/NBkCvSls0LjxIRM5C8hQyddg4/FuJANNlSHjQ==", "dependencies": { "@lukeed/uuid": "^2.0.1", "binary-search": "^1.3.6", @@ -1017,20 +891,6 @@ "spectrum-generator": "^8.0.11" } }, - "node_modules/nmr-processing/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/nmredata": { "version": "0.9.9", "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-0.9.9.tgz", @@ -1195,20 +1055,6 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/spectrum-generator/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/spline-interpolator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/spline-interpolator/-/spline-interpolator-1.0.0.tgz", @@ -1337,20 +1183,6 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/varian-converter/node_modules/ml-spectra-processing": { - "version": "14.2.2", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.2.2.tgz", - "integrity": "sha512-N4MFs5DW+H+Cu3txjwDNNFlKDTuVVYmrQJhs8qGBZ9KyMunwfBAHcoRS9M7minmxpUDJxJ8UgI72ZKB1SK4ysQ==", - "dependencies": { - "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", - "fft.js": "^4.0.4", - "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", - "spline-interpolator": "^1.0.0" - } - }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 93ca88b..a90c665 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -16,8 +16,8 @@ }, "dependencies": { "filelist-utils": "^1.11.0", - "nmr-load-save": "^0.28.0", - "nmr-processing": "^12.0.1", + "nmr-load-save": "^0.29.3", + "nmr-processing": "^12.2.0", "playwright": "^1.43.1", "yargs": "^17.7.2" }, diff --git a/app/scripts/nmr-cli/src/publication-string.ts b/app/scripts/nmr-cli/src/publication-string.ts index f423894..3bd994a 100644 --- a/app/scripts/nmr-cli/src/publication-string.ts +++ b/app/scripts/nmr-cli/src/publication-string.ts @@ -61,7 +61,7 @@ function generateSpectrumFromPublicationString( ) { const { ranges, - experiment: { nucleus, solvent }, + info: { nucleus, solvent = '' }, parts, } = resurrect(publicationString); return generateSpectrumFromRanges( From 913a4d5531245e9dfd7c49f1706be869cc3dc063 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 22 Apr 2024 12:52:34 +0200 Subject: [PATCH 20/44] feat: update docker image to playwright:v1.43.1-jammy --- app/scripts/nmr-cli/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index afc252d..c4f2afe 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.40.0-jammy +FROM mcr.microsoft.com/playwright:v1.43.1-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] From ab9ce575001f2481e87108dffcd57100a7bd7894 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 7 Jun 2024 10:54:58 +0200 Subject: [PATCH 21/44] chore: update playwright to version 1.44.1 --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/package-lock.json | 26 +++++++++++++------------- app/scripts/nmr-cli/package.json | 4 ++-- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index c4f2afe..cf1a1b8 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.43.1-jammy +FROM mcr.microsoft.com/playwright:v1.44.1-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 487215c..9bb6ce1 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -12,14 +12,14 @@ "filelist-utils": "^1.11.0", "nmr-load-save": "^0.29.3", "nmr-processing": "^12.2.0", - "playwright": "^1.43.1", + "playwright": "^1.44.1", "yargs": "^17.7.2" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^20.12.7", + "@types/node": "^20.14.2", "@types/yargs": "^17.0.32", "ts-node": "^10.9.2", "typescript": "^5.4.5" @@ -119,9 +119,9 @@ } }, "node_modules/@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -973,11 +973,11 @@ "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, "node_modules/playwright": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.1.tgz", - "integrity": "sha512-V7SoH0ai2kNt1Md9E3Gwas5B9m8KR2GVvwZnAI6Pg0m3sh7UvgiYhRrhsziCmqMJNouPckiOhk8T+9bSAK0VIA==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", "dependencies": { - "playwright-core": "1.43.1" + "playwright-core": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -990,9 +990,9 @@ } }, "node_modules/playwright-core": { - "version": "1.43.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.1.tgz", - "integrity": "sha512-EI36Mto2Vrx6VF7rm708qSnesVQKbxEWvPrfA1IPY6HgczBplDx7ENtx+K2n4kJ41sLLkuGfmb0ZLSSXlDhqPg==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", "bin": { "playwright-core": "cli.js" }, @@ -1256,4 +1256,4 @@ } } } -} \ No newline at end of file +} diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index a90c665..d695d2b 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -18,11 +18,11 @@ "filelist-utils": "^1.11.0", "nmr-load-save": "^0.29.3", "nmr-processing": "^12.2.0", - "playwright": "^1.43.1", + "playwright": "^1.44.1", "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^20.12.7", + "@types/node": "^20.14.2", "@types/yargs": "^17.0.32", "ts-node": "^10.9.2", "typescript": "^5.4.5" From eecf2e5df40b7639c68584bb8fe7b1031639070a Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 7 Jun 2024 10:57:05 +0200 Subject: [PATCH 22/44] feat: update to nmr-load-save version 0.33.1 --- app/scripts/nmr-cli/package-lock.json | 193 +++++++++++++++----------- app/scripts/nmr-cli/package.json | 4 +- 2 files changed, 116 insertions(+), 81 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 9bb6ce1..cc37305 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -10,8 +10,8 @@ "license": "ISC", "dependencies": { "filelist-utils": "^1.11.0", - "nmr-load-save": "^0.29.3", - "nmr-processing": "^12.2.0", + "nmr-load-save": "^0.33.1", + "nmr-processing": "^12.3.2", "playwright": "^1.44.1", "yargs": "^17.7.2" }, @@ -105,6 +105,19 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "dependencies": { + "@types/d3-color": "*" + } + }, "node_modules/@types/lodash": { "version": "4.17.0", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", @@ -192,20 +205,20 @@ "dev": true }, "node_modules/atom-sorter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.0.0.tgz", - "integrity": "sha512-30O3ccAH+lmysMykyEkBsfB65BU329GatBeYrgzKjDBhaURgvWT7B2+C9gmBFnVmbMO2HaqvyAuce3eMsICluw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.0.1.tgz", + "integrity": "sha512-xIM0KiDgCnPfw2ZE6uqIt2FZBCogIslJPtl5lRTpO9OHLRbohWfQYR4ipmqp12AyFWyAIptcnxCCA/aTcnCfYA==" }, "node_modules/baselines": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.7.tgz", - "integrity": "sha512-UaZbIovi2Ur0AiKl5lR3OZ8B/CxXhySd7BjDiuv8g9A/bEfstQjUASdjsDFQMBBHC6vzBfwXYGRhPEWX8VvcYQ==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.9.tgz", + "integrity": "sha512-dFqZSb0EwzmTUyjI3k0HSfsKMKMDHpCILPTsdysFgLf8roGq5f58KrSYAwa9vODk2dbE8NdKgNnKk8TBwXNWAw==", "dependencies": { - "ml-airpls": "^1.0.3", + "ml-airpls": "^2.0.0", "ml-array-sequential-fill": "^1.1.8", - "ml-baseline-correction-regression": "^1.0.2", + "ml-baseline-correction-regression": "^2.0.1", "ml-rolling-ball-baseline": "^2.0.3", - "ml-spectra-processing": "^14.2.0" + "ml-spectra-processing": "^14.5.0" } }, "node_modules/binary-search": { @@ -214,16 +227,16 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brukerconverter": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-6.3.9.tgz", - "integrity": "sha512-rmzadrmIbBiv4Ihh4G4fTSqXAEM+Z2ai402hAt2KK/AQWRXl9hYzXPpKubYt1Z8qWaqcG2dkvoOmb/yuKGiVOg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-7.0.0.tgz", + "integrity": "sha512-GJczqQleVXtJL7DSeNMvSXmE7JuTQdhSjs4Wc3qM78uJJNKn3pBD73YW2pbCyuf4aelTvnxFJq67F+9850JgUQ==", "dependencies": { - "cheminfo-types": "^1.7.2", + "cheminfo-types": "^1.7.3", "filelist-utils": "^1.11.0", "iobuffer": "^5.3.2", "is-any-array": "^2.0.1", - "jcampconverter": "^9.6.1", - "ml-spectra-processing": "^14.1.1" + "jcampconverter": "^9.6.4", + "ml-spectra-processing": "^14.3.0" } }, "node_modules/cheminfo-types": { @@ -302,6 +315,19 @@ "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-0.7.1.tgz", "integrity": "sha512-Ifi3fH46Bco+Lb1mOlTxbFEuF3NdyElEVVD+EmoK327I0JzKAP4x57cl+HoxHqFcVd8F/uXLC+wtY3n/R1uO2w==" }, + "node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -535,11 +561,12 @@ "integrity": "sha512-/QL9ptNuLsdA68qO+2o10TKCyu621zwwTFdLvtu8rzRNKsn8zvuGoq/vDxECPyELFG8wu+BpyoMR9BnsJqfVZQ==" }, "node_modules/ml-airpls": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/ml-airpls/-/ml-airpls-1.0.3.tgz", - "integrity": "sha512-U6D0ahNuCxgfu/bb415tJMAXdtC+5cysUNAS3bWZWQCwQR53vNjby9MJN+6muBiDz6XQk0lULkg+PsW1N+OG6g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-airpls/-/ml-airpls-2.0.0.tgz", + "integrity": "sha512-dCFbc2UNnzHkU6PAa1SFjdob/cVNZz//BlLh6BF2jHp56+Oahi02PLytrV4v+X3sW20v2l//8hXuqjZCuv88OQ==", "dependencies": { - "cuthill-mckee": "^1.0.0" + "cuthill-mckee": "^1.0.0", + "ml-spectra-processing": "^14.5.0" } }, "node_modules/ml-array-max": { @@ -586,28 +613,11 @@ } }, "node_modules/ml-baseline-correction-regression": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ml-baseline-correction-regression/-/ml-baseline-correction-regression-1.0.2.tgz", - "integrity": "sha512-dRKbGx49gXhHyvpb9/6OpqySY7cEm8rz0LaQWyAsaMALr3aKHXvtPsjADh5afkzsYRw53QPgwccCo0XTvT3M8w==", - "dependencies": { - "ml-regression-polynomial": "^2.2.0" - } - }, - "node_modules/ml-baseline-correction-regression/node_modules/ml-regression-base": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-2.1.6.tgz", - "integrity": "sha512-yTckvEc8szc6VrUTJSgAClShvCoPZdNt8pmyRe8aGsIWGjg6bYFotp9mDUwAB0snvKAbQWd6A4trL/PDCASLug==", - "dependencies": { - "is-any-array": "^2.0.0" - } - }, - "node_modules/ml-baseline-correction-regression/node_modules/ml-regression-polynomial": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-2.2.0.tgz", - "integrity": "sha512-WxFsEmi6oLxgq9TeaVoAA+vVUJFp1kGarX6WWClR8OmlanoIW5iLMnaeXfQcYuH8xNq4R1Cax2N9hYYmeWWkLg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ml-baseline-correction-regression/-/ml-baseline-correction-regression-2.0.1.tgz", + "integrity": "sha512-ZPdJogONI5/M7eFuJ4NCrr8NJ1XcSl7OVTUOvZkFr2yjT/o592nd3oqtj+ChyxAJLMO68eFlktNV0OHhvxy1KQ==", "dependencies": { - "ml-matrix": "^6.8.0", - "ml-regression-base": "^2.1.3" + "ml-regression-polynomial": "^3.0.1" } }, "node_modules/ml-direct": { @@ -724,22 +734,40 @@ } }, "node_modules/ml-regression-base": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-3.0.0.tgz", - "integrity": "sha512-qkQWvNk8VU1LIytjid/+YHOSx8GnEU9dCUPsAQ8AzCh4saijrsni/XA6x7r+N1UrHMDHeSEUBtRZTsl2syyu/A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-4.0.0.tgz", + "integrity": "sha512-V2VjB+K/BcgXaX450xvYw36TLOB+piD9G1pHU3VE+ggQUApsVGkYco6UMQykFOwBydHnDTbOiybH/lwrkqFT4g==", "dependencies": { - "cheminfo-types": "^1.7.2", + "cheminfo-types": "^1.7.3", "is-any-array": "^2.0.1" } }, + "node_modules/ml-regression-exponential": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ml-regression-exponential/-/ml-regression-exponential-3.0.1.tgz", + "integrity": "sha512-oCKda88AooF76M5ocdfl2YZbdU/TpiU/KQ9NSV6nr9r/5r9jCZkak4sH0quKUNnwZcgcdZdryGpmUT9yP8qHpQ==", + "dependencies": { + "ml-regression-base": "^4.0.0", + "ml-regression-simple-linear": "^3.0.0" + } + }, "node_modules/ml-regression-polynomial": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.0.tgz", - "integrity": "sha512-8agLNJZzuVpdthMDUkaamiQnfHx7y1T9LrbCiAPHnhklVrg7O7tzClEZ7XMh48AZMNhKl1ewGvn2VLrI6AD+wA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.1.tgz", + "integrity": "sha512-dNds0VK4nrMyZvwovy9bYo2WaHPstEztPly4EWB8mj+vPcNxyq4a2UiTueR1jwkgLo6/QWDzA+HBsHP7S/0z3A==", "dependencies": { - "cheminfo-types": "^1.7.2", - "ml-matrix": "^6.10.5", - "ml-regression-base": "^3.0.0" + "cheminfo-types": "^1.7.3", + "ml-matrix": "^6.11.0", + "ml-regression-base": "^4.0.0" + } + }, + "node_modules/ml-regression-simple-linear": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ml-regression-simple-linear/-/ml-regression-simple-linear-3.0.1.tgz", + "integrity": "sha512-SF2oxA+034Co9GVQSFuS3vtACaRAFrEwHi9oX6VTaSY/KtXxseL3d4GApj4jWXMoAgrP7VMoIO1PH0RoZaMR1g==", + "dependencies": { + "cheminfo-types": "^1.7.3", + "ml-regression-base": "^4.0.0" } }, "node_modules/ml-rolling-ball-baseline": { @@ -799,9 +827,9 @@ } }, "node_modules/ml-spectra-processing": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.3.0.tgz", - "integrity": "sha512-kY+vP8LMT/IXdyjltm1GG6lsm+FgshYuQkDbTAV6V0anO9VoBBDdJYiJYb4UmAS1AO8GTK5HGr8StODkas39pA==", + "version": "14.5.0", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.5.0.tgz", + "integrity": "sha512-ECXiyrXmWAZ2kndB0J232JdPbGThEnjlV47VNrFtVdRZoCCSsFhRFVvO/aFWbyXNa0MtPnnR3qn8e66vwTkdEw==", "dependencies": { "binary-search": "^1.3.6", "cheminfo-types": "^1.7.3", @@ -834,43 +862,47 @@ } }, "node_modules/nmr-load-save": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.29.3.tgz", - "integrity": "sha512-5RKmXP5UQ0fL3JlBh3PYD4AGvTB/UEvf292tw6gi77nzPK/BPzpa+f4/78UR9QQk6qC3M5BYksD87fJMcwamfw==", + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.33.1.tgz", + "integrity": "sha512-ksJBJt2/FQZ8l8pNsy6UP1McqJNGlpkpjbwpbeD8LoA7EYWuAHJMM21GLIe9SJT9Dx1pxlY8Gv9drlGDcykq3g==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", - "brukerconverter": "^6.3.8", + "brukerconverter": "^7.0.0", "cheminfo-types": "^1.7.3", "convert-to-jcamp": "^5.4.10", "filelist-utils": "^1.11.0", - "gyromagnetic-ratio": "^1.1.1", + "gyromagnetic-ratio": "^1.2.0", "is-any-array": "^2.0.1", "jcampconverter": "^9.6.4", "jeolconverter": "^1.0.3", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.2.2", + "ml-spectra-processing": "^14.5.0", "nmr-correlation": "^2.3.3", - "nmr-processing": "^12.2.0", + "nmr-processing": "^12.3.1", "nmredata": "^0.9.9", - "openchemlib": "^8.9.0", - "openchemlib-utils": "^5.12.1", + "openchemlib": "^8.10.0", + "openchemlib-utils": "^5.19.1", "sdf-parser": "^6.0.1", "varian-converter": "^1.0.0" } }, "node_modules/nmr-processing": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-12.2.0.tgz", - "integrity": "sha512-03EQxGh3JovKv1l6IXeSj0rm5vuw9iD9QE31cL7O1+NHXbPq/NBkCvSls0LjxIRM5C8hQyddg4/FuJANNlSHjQ==", + "version": "12.3.2", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-12.3.2.tgz", + "integrity": "sha512-dCKoFT+U/ASHCxryK6rfwzcv5u6Be78PLFm6+N4jBCL3uMqAU/gzZwHSBWYh0KM8qmmT7wkM+sqzutem+FDD7Q==", "dependencies": { "@lukeed/uuid": "^2.0.1", + "@types/d3-color": "^3.1.3", + "@types/d3-interpolate": "^3.0.4", "binary-search": "^1.3.6", - "gyromagnetic-ratio": "^1.1.1", + "d3-color": "^2.0.0", + "d3-interpolate": "^2.0.1", + "gyromagnetic-ratio": "^1.2.0", "is-any-array": "^2.0.1", - "linear-sum-assignment": "^1.0.5", + "linear-sum-assignment": "^1.0.7", "lodash.omit": "^4.5.0", - "ml-airpls": "^1.0.3", + "ml-airpls": "^2.0.0", "ml-direct": "^1.0.0", "ml-gsd": "^12.1.6", "ml-hclust": "^3.1.0", @@ -879,15 +911,17 @@ "ml-matrix-convolution": "^1.0.0", "ml-matrix-peaks-finder": "^1.0.0", "ml-peak-shape-generator": "^4.1.2", + "ml-regression-base": "^4.0.0", + "ml-regression-exponential": "^3.0.1", "ml-regression-polynomial": "^3.0.0", "ml-signal-processing": "^1.0.4", "ml-simple-clustering": "^0.1.0", "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.2.0", + "ml-spectra-processing": "^14.5.0", "ml-tree-set": "^0.1.1", "nmr-correlation": "^2.3.3", "numeral": "^2.0.6", - "openchemlib-utils": "^5.12.0", + "openchemlib-utils": "^5.19.1", "spectrum-generator": "^8.0.11" } }, @@ -941,16 +975,17 @@ } }, "node_modules/openchemlib": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.9.0.tgz", - "integrity": "sha512-8Bb7batm6XvNHg9SWBJDYrkJj5bsq72D5dClpN5yO6BnxxNxtRP1+e6egHwoMwGhd4dyb+eBX7Kr/hdUqMN1Dw==" + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.13.0.tgz", + "integrity": "sha512-CdE9mNFdiQaZbjThvpplKC2YObyg9w4cKbuZ8nn/dRuTvk35H7+LPl2xylm84OGW3062AanU61ms4HnNZOzoXA==" }, "node_modules/openchemlib-utils": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-5.12.1.tgz", - "integrity": "sha512-zqkr8eScv87qrKELV/i/C5IVxqDcPYq29Rm1KrV993aFcVXlCuBRpAtyQ7BRZlNh8D9SDHOn78V3I+ZyciF2cw==", + "version": "5.21.1", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-5.21.1.tgz", + "integrity": "sha512-4Y1O0aITXN9T2V6VsszV26K9WZnlg8OY0CmQ2hdLBQIEwueuroEziKSa0OShkFQNkUIk3qPBGZk2876jR6UqIQ==", "dependencies": { - "atom-sorter": "^2.0.0", + "@lukeed/uuid": "^2.0.1", + "atom-sorter": "^2.0.1", "ensure-string": "^1.2.0", "get-value": "^3.0.1", "ml-floyd-warshall": "^3.0.1", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index d695d2b..84c3ebb 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -16,8 +16,8 @@ }, "dependencies": { "filelist-utils": "^1.11.0", - "nmr-load-save": "^0.29.3", - "nmr-processing": "^12.2.0", + "nmr-load-save": "^0.33.1", + "nmr-processing": "^12.3.2", "playwright": "^1.44.1", "yargs": "^17.7.2" }, From aff2e8d1cd59420a1498db72bca16aa889a5763e Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Thu, 28 Nov 2024 09:30:43 +0100 Subject: [PATCH 23/44] chore: update dependencies --- app/scripts/nmr-cli/package-lock.json | 52 +++++++++++++-------------- app/scripts/nmr-cli/package.json | 8 ++--- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index cc37305..af51c1f 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -12,17 +12,17 @@ "filelist-utils": "^1.11.0", "nmr-load-save": "^0.33.1", "nmr-processing": "^12.3.2", - "playwright": "^1.44.1", + "playwright": "^1.49.0", "yargs": "^17.7.2" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^20.14.2", - "@types/yargs": "^17.0.32", + "@types/node": "^22.10.1", + "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "typescript": "^5.7.2" } }, "node_modules/@cspotcode/source-map-support": { @@ -132,18 +132,18 @@ } }, "node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -1008,31 +1008,31 @@ "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" }, "node_modules/playwright": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", - "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", + "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", "dependencies": { - "playwright-core": "1.44.1" + "playwright-core": "1.49.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.44.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", - "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", + "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/process-nextick-args": { @@ -1179,9 +1179,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -1192,9 +1192,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, "node_modules/util-deprecate": { diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 84c3ebb..231a932 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -18,13 +18,13 @@ "filelist-utils": "^1.11.0", "nmr-load-save": "^0.33.1", "nmr-processing": "^12.3.2", - "playwright": "^1.44.1", + "playwright": "^1.49.0", "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^20.14.2", - "@types/yargs": "^17.0.32", + "@types/node": "^22.10.1", + "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.4.5" + "typescript": "^5.7.2" } } \ No newline at end of file From 484f06017458d0b1469baf7ff09c0a3f60f859b8 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Thu, 28 Nov 2024 10:21:04 +0100 Subject: [PATCH 24/44] chore: update the playwright docker image --- app/scripts/nmr-cli/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index cf1a1b8..3f2c17a 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.44.1-jammy +FROM mcr.microsoft.com/playwright:v1.49.0-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] From f1df45db5994003c03c26aacab1dfed947d6cfe0 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Thu, 28 Nov 2024 10:21:35 +0100 Subject: [PATCH 25/44] feat: update nmr-load-save to version 2.1.0 --- app/scripts/nmr-cli/package-lock.json | 277 +++++++++++--------------- app/scripts/nmr-cli/package.json | 6 +- 2 files changed, 119 insertions(+), 164 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index af51c1f..15b098f 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "filelist-utils": "^1.11.0", - "nmr-load-save": "^0.33.1", - "nmr-processing": "^12.3.2", + "filelist-utils": "^1.11.2", + "nmr-load-save": "^2.1.0", + "nmr-processing": "^14.0.5", "playwright": "^1.49.0", "yargs": "^17.7.2" }, @@ -205,9 +205,9 @@ "dev": true }, "node_modules/atom-sorter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.0.1.tgz", - "integrity": "sha512-xIM0KiDgCnPfw2ZE6uqIt2FZBCogIslJPtl5lRTpO9OHLRbohWfQYR4ipmqp12AyFWyAIptcnxCCA/aTcnCfYA==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.1.3.tgz", + "integrity": "sha512-mfITb+18f/9C7xpWTVJVa0vlyak06JwW0XeqzUWpRxhbn5w1Mc4EbGg0vrjtTcNEzRRvp5o3oO16XJ8LhhpnGw==" }, "node_modules/baselines": { "version": "1.1.9", @@ -227,22 +227,22 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brukerconverter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-7.0.0.tgz", - "integrity": "sha512-GJczqQleVXtJL7DSeNMvSXmE7JuTQdhSjs4Wc3qM78uJJNKn3pBD73YW2pbCyuf4aelTvnxFJq67F+9850JgUQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-7.0.4.tgz", + "integrity": "sha512-G8Jx2f+hV02Zvkw+nXB1MpTFJaJhsuinrt+XQv/SFjA88rWYCrxw3WIMmHx06Bp19Zw03BYMdHy0YDMpyjplbw==", "dependencies": { "cheminfo-types": "^1.7.3", "filelist-utils": "^1.11.0", "iobuffer": "^5.3.2", "is-any-array": "^2.0.1", - "jcampconverter": "^9.6.4", - "ml-spectra-processing": "^14.3.0" + "jcampconverter": "^10.0.1", + "ml-spectra-processing": "^14.5.0" } }, "node_modules/cheminfo-types": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.7.3.tgz", - "integrity": "sha512-KIKBULfo+XwkSBwMfwjBmZCmY+RXisN2kRc33WikuWBsCQQy5alHWYVrMCO8//lDvy9h1giOzwsC9kgq0OahUw==" + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.8.1.tgz", + "integrity": "sha512-FRcpVkox+cRovffgqNdDFQ1eUav+i/Vq/CUd1hcfEl2bevntFlzznL+jE8g4twl6ElB7gZjCko6pYpXyMn+6dA==" }, "node_modules/cliui": { "version": "8.0.1", @@ -274,9 +274,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/convert-to-jcamp": { - "version": "5.4.10", - "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.10.tgz", - "integrity": "sha512-noIRSe+cW1JATYaF0RSMDX6nCdjnzU7pFdDtalI6RA0g8I+3Rt3SV4uc1Pj5KUC1fP04dcemCNGTDdNusfHH0Q==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.11.tgz", + "integrity": "sha512-UiUjrSLiBFp2FMnP+eapZL6gScBVKTROtZz8aKHRlNuPe4WiLP0tzlHfA9ZGhybsUwm5WcW9qwuWxX6Do+EP9w==", "dependencies": { "cheminfo-types": "^1.7.3", "is-any-array": "^2.0.1", @@ -297,14 +297,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/cuthill-mckee": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cuthill-mckee/-/cuthill-mckee-1.0.0.tgz", @@ -338,9 +330,9 @@ } }, "node_modules/dynamic-typing": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dynamic-typing/-/dynamic-typing-1.0.0.tgz", - "integrity": "sha512-Jjvr93gCn8+5q9AP+ilq8gInN5xYRaJakmuE11Un8vgCgt0zwWyRqU7lAdRgHEHnf4FwJp/ppymo1GE1+AKw+Q==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dynamic-typing/-/dynamic-typing-1.0.1.tgz", + "integrity": "sha512-KYvDeLd4kPxs5rn/GLDQ2FLrncVVqvUfQKkhbYYaM+51zXjQwyOejP5TuAnAjdX6o+PjdMgcfhr3M7h5hQv4yA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -370,12 +362,11 @@ "integrity": "sha512-f9c00hphOgeQTlDyavwTtu6RiK8AIFjD6+jvXkNkpeQ7rirK3uFWVpalkoS4LAwbdX7mfZ8aoBfFVQX1Re/8aw==" }, "node_modules/filelist-utils": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.11.0.tgz", - "integrity": "sha512-POCfHquP6jw2aPjfs7UWyywfWkSsLFsXquPNEchrFkc7ffxlz42IiJHeqc7SweMccSF4tV2Kgr1yzPAA/z/iPg==", + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.11.2.tgz", + "integrity": "sha512-e2bUWJLAjyMq+RZU0cEUhjGXQTFe2+TOE+qhHvBl8iPlSnb+iY6ibZaWUsLKRTuVtVVeAvqnJXCIUjXsSk1gKg==", "dependencies": { - "cheminfo-types": "^1.7.2", - "cross-fetch": "^4.0.0", + "cheminfo-types": "^1.7.3", "jszip": "^3.10.1", "pako": "^2.1.0" } @@ -413,9 +404,9 @@ } }, "node_modules/gyromagnetic-ratio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-1.2.0.tgz", - "integrity": "sha512-Pgo5kU9Wd2WZ5KMChPyfFuimkfOq7CUPsmpmm/wcDBPJD2YOcAd7aCbZ0Xt+80h+yjqAhqVnXBxjQhoqIcAXJw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-1.2.1.tgz", + "integrity": "sha512-cOkHEsIwHNKe8v/wED9NWa8wvzLx0rpBarUrEpvzdgECMpVQzrLJkaFYsdSxnhaUtWX4uNFxX01PJeFayDCpVA==" }, "node_modules/heap": { "version": "0.2.7", @@ -472,22 +463,22 @@ } }, "node_modules/isutf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-4.0.0.tgz", - "integrity": "sha512-mJtsQGFfAphKdVuRitEpc0eon4v5fuaB6v9ZJIrLnIyybh02sIIwJ2RQbLMp6UICVCfquezllupZIVcqzGzCPg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-4.0.1.tgz", + "integrity": "sha512-1pk2/2pE+G48eETnp4uOLxQ9WUCxD7oVauYwhFEAGREJPDxEO7iX9qstylrCcx3lNWa1RCS2DxGTxrHdWqS7/w==", "engines": { "node": ">= 12" } }, "node_modules/jcampconverter": { - "version": "9.6.4", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-9.6.4.tgz", - "integrity": "sha512-6T8bPCImT2NQudVCBM5h47YFHMtpIAYFlcf6pCV3uP/AdceGtjGLA1iJVukhA2U2WPtzWax67aRvSfdknJEzFg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-10.0.1.tgz", + "integrity": "sha512-1yQ9Q35K2A64Q5NQ7AN/w6KbooviQAQ33Yo6p4vMFAyntR09n/OzR65CubbCogp3bVCm+pdQ3RCkfrcKqTabRQ==", "dependencies": { - "cheminfo-types": "^1.7.2", - "dynamic-typing": "^1.0.0", + "cheminfo-types": "^1.8.0", + "dynamic-typing": "^1.0.1", "ensure-string": "^1.2.0", - "gyromagnetic-ratio": "^1.1.1", + "gyromagnetic-ratio": "^1.2.0", "ml-array-median": "^1.1.6" } }, @@ -658,16 +649,16 @@ } }, "node_modules/ml-gsd": { - "version": "12.1.6", - "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.6.tgz", - "integrity": "sha512-Jn1VLU9tD622R3naKDn1YuOYfh45QBkKQEVoU3X3G1+ZOtBvS8CvvBtxZ457l2/H2vXI+6HQcRV+CaWIfKyURA==", + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.8.tgz", + "integrity": "sha512-vcy8e1xPJ9fe2GFKMMpttzQUDxgPdo6KLTPU55lfPedL0WH9WRuIxRLbUwLbhYmB2/ZwAhzIspXcxjPCwhtsgA==", "dependencies": { "@lukeed/uuid": "^2.0.1", - "cheminfo-types": "^1.7.2", - "ml-peak-shape-generator": "^4.1.2", - "ml-savitzky-golay-generalized": "^4.0.1", - "ml-spectra-fitting": "^4.2.3", - "ml-spectra-processing": "^14.2.0" + "cheminfo-types": "^1.7.3", + "ml-peak-shape-generator": "^4.1.4", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-spectra-fitting": "^4.2.4", + "ml-spectra-processing": "^14.5.3" } }, "node_modules/ml-hash-table": { @@ -700,9 +691,9 @@ } }, "node_modules/ml-matrix": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.11.0.tgz", - "integrity": "sha512-7jr9NmFRkaUxbKslfRu3aZOjJd2LkSitCGv+QH9PF0eJoEG7jIpjXra1Vw8/kgao8+kHCSsJONG6vfWmXQ+/Eg==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.0.tgz", + "integrity": "sha512-AGfR+pWaC0GmzjUnB6BfwhndPEUGz0i7QUYdqNuw1zhTov/vSRJ9pP2hs6BoGpaSbtXgrKjZz2zjD1M0xuur6A==", "dependencies": { "is-any-array": "^2.0.1", "ml-array-rescale": "^1.3.7" @@ -726,9 +717,9 @@ } }, "node_modules/ml-peak-shape-generator": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/ml-peak-shape-generator/-/ml-peak-shape-generator-4.1.2.tgz", - "integrity": "sha512-SCVKGZ96JDyzEFgk0payEZKveakfbH7vA4Lysw3eRJEAm8hDnwip2pAFXjcC4jS78WDya4ghwAOSKDBUdHuMBw==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/ml-peak-shape-generator/-/ml-peak-shape-generator-4.1.4.tgz", + "integrity": "sha512-yzBXSHbCI4Gcq0A+CMMmztq9dlCwEQyWqKfUFn+g2CWuPGO7ISdb9BLNY08YY/zvZ4GMEmyOriZ2ypDfWD2t0g==", "dependencies": { "cheminfo-types": "^1.1.0" } @@ -743,9 +734,9 @@ } }, "node_modules/ml-regression-exponential": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ml-regression-exponential/-/ml-regression-exponential-3.0.1.tgz", - "integrity": "sha512-oCKda88AooF76M5ocdfl2YZbdU/TpiU/KQ9NSV6nr9r/5r9jCZkak4sH0quKUNnwZcgcdZdryGpmUT9yP8qHpQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ml-regression-exponential/-/ml-regression-exponential-3.0.2.tgz", + "integrity": "sha512-drV4ZSGKMMVNETVa7+/z15Uq9C0F69wNsJbhPvVbERgYRSmoGg+e0X7BYK75TzUvFY8IlYZmvVQOZK334slpbQ==", "dependencies": { "ml-regression-base": "^4.0.0", "ml-regression-simple-linear": "^3.0.0" @@ -789,15 +780,15 @@ } }, "node_modules/ml-signal-processing": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.0.4.tgz", - "integrity": "sha512-MYMyfhReCxJsbNu9pCbO7jVTQJXiDxyzm+ly1E7T2eS7dk048YLyLPxfTZFn9HDtNSTCnP7djac4Y7BRJC/JmQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.2.0.tgz", + "integrity": "sha512-hLJLrEq7a8Jx+VlXr1zZ8ApUb8EFwPgRacvNQL7LF7BH24uReJbRJVH8tL29ZGrQV4kJ9dxdmiZk+lbnvuhR1g==", "dependencies": { - "baselines": "^1.1.7", - "cheminfo-types": "^1.7.2", - "ml-gsd": "^12.1.5", - "ml-savitzky-golay-generalized": "^4.0.1", - "ml-spectra-processing": "^14.2.0" + "baselines": "^1.1.9", + "cheminfo-types": "^1.8.1", + "ml-gsd": "^12.1.8", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-spectra-processing": "^14.6.2" } }, "node_modules/ml-simple-clustering": { @@ -814,29 +805,29 @@ } }, "node_modules/ml-spectra-fitting": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.3.tgz", - "integrity": "sha512-2SwlqbpUeqFZ490mEmOzIbWQK3lM049cx4tgIcrCrknlXdgTnNsCTmmpll8wac7GJOCJlq2QtjuT0IHHitoVXg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.4.tgz", + "integrity": "sha512-iq6yHKqovLeBA1+Lwzhjz3fqDz6j9vR+p5MgNUyO9yfRUOC6YrMfuesopZv7Gj/SuvGGjNWgR3z8XCjjPonedg==", "dependencies": { "cheminfo-types": "^1.7.2", "ml-array-max": "^1.2.4", "ml-direct": "^1.0.0", "ml-levenberg-marquardt": "^4.1.3", - "ml-peak-shape-generator": "^4.1.2", + "ml-peak-shape-generator": "^4.1.4", "ml-spectra-processing": "^14.2.0" } }, "node_modules/ml-spectra-processing": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.5.0.tgz", - "integrity": "sha512-ECXiyrXmWAZ2kndB0J232JdPbGThEnjlV47VNrFtVdRZoCCSsFhRFVvO/aFWbyXNa0MtPnnR3qn8e66vwTkdEw==", + "version": "14.7.0", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.7.0.tgz", + "integrity": "sha512-O8ztoPhiKe6U2w7U+Lb7Ft9gE6/o6w4Y6x0QOQM74iP40t4tP7ZDMdTtCCEUuk8l/YWxSBsjXYvD1NL5OW+mBQ==", "dependencies": { "binary-search": "^1.3.6", - "cheminfo-types": "^1.7.3", + "cheminfo-types": "^1.8.1", "fft.js": "^4.0.4", "is-any-array": "^2.0.1", - "ml-matrix": "^6.11.0", - "ml-xsadd": "^2.0.0", + "ml-matrix": "^6.12.0", + "ml-xsadd": "^3.0.1", "spline-interpolator": "^1.0.0" } }, @@ -846,9 +837,9 @@ "integrity": "sha512-9XZv+/hSltnsN61Cgb7PCFGxmo1HZn2JxDugnNHZDh0ZryJp7qtmcnPZLw/KrQLgG1JqdkKlfhmAYajSukb8yg==" }, "node_modules/ml-xsadd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ml-xsadd/-/ml-xsadd-2.0.0.tgz", - "integrity": "sha512-VoAYUqmPRmzKbbqRejjqceGFp3VF81Qe8XXFGU0UXLxB7Mf4GGvyGq5Qn3k4AiQgDEV6WzobqlPOd+j0+m6IrA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ml-xsadd/-/ml-xsadd-3.0.1.tgz", + "integrity": "sha512-Fz2q6dwgzGM8wYKGArTUTZDGa4lQFA2Vi6orjGeTVRy22ZnQFKlJuwS9n8NRviqz1KHAHAzdKJwbnYhdo38uYg==" }, "node_modules/nmr-correlation": { "version": "2.3.3", @@ -862,35 +853,35 @@ } }, "node_modules/nmr-load-save": { - "version": "0.33.1", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-0.33.1.tgz", - "integrity": "sha512-ksJBJt2/FQZ8l8pNsy6UP1McqJNGlpkpjbwpbeD8LoA7EYWuAHJMM21GLIe9SJT9Dx1pxlY8Gv9drlGDcykq3g==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-2.1.0.tgz", + "integrity": "sha512-4QIjH/2W713uhLd4i417v1XuV+pknPDOJcYoeRiRHoFf4rev7/gx+QnYZ/f1g3PXzSvARFq6k70Wgwxckn2KBg==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", - "brukerconverter": "^7.0.0", - "cheminfo-types": "^1.7.3", - "convert-to-jcamp": "^5.4.10", - "filelist-utils": "^1.11.0", - "gyromagnetic-ratio": "^1.2.0", + "brukerconverter": "^7.0.4", + "cheminfo-types": "^1.8.1", + "convert-to-jcamp": "^5.4.11", + "filelist-utils": "^1.11.2", + "gyromagnetic-ratio": "^1.2.1", "is-any-array": "^2.0.1", - "jcampconverter": "^9.6.4", + "jcampconverter": "^10.0.1", "jeolconverter": "^1.0.3", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.5.0", + "ml-spectra-processing": "^14.6.2", "nmr-correlation": "^2.3.3", - "nmr-processing": "^12.3.1", - "nmredata": "^0.9.9", - "openchemlib": "^8.10.0", - "openchemlib-utils": "^5.19.1", + "nmr-processing": "^14.0.2", + "nmredata": "^0.9.11", + "openchemlib": "^8.17.0", + "openchemlib-utils": "^6.4.1", "sdf-parser": "^6.0.1", "varian-converter": "^1.0.0" } }, "node_modules/nmr-processing": { - "version": "12.3.2", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-12.3.2.tgz", - "integrity": "sha512-dCKoFT+U/ASHCxryK6rfwzcv5u6Be78PLFm6+N4jBCL3uMqAU/gzZwHSBWYh0KM8qmmT7wkM+sqzutem+FDD7Q==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-14.0.5.tgz", + "integrity": "sha512-172pG4vTvR1mRMGZX9xGNwopf/qJ2oUsq2gmozRMPnR9TpgeqJqYcUxEDAqPh4seVkoxNDCX0uS7TvOTuzudxQ==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/d3-color": "^3.1.3", @@ -898,61 +889,44 @@ "binary-search": "^1.3.6", "d3-color": "^2.0.0", "d3-interpolate": "^2.0.1", - "gyromagnetic-ratio": "^1.2.0", + "gyromagnetic-ratio": "^1.2.1", "is-any-array": "^2.0.1", "linear-sum-assignment": "^1.0.7", "lodash.omit": "^4.5.0", "ml-airpls": "^2.0.0", "ml-direct": "^1.0.0", - "ml-gsd": "^12.1.6", + "ml-gsd": "^12.1.8", "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^4.1.3", - "ml-matrix": "^6.11.0", + "ml-matrix": "^6.11.1", "ml-matrix-convolution": "^1.0.0", "ml-matrix-peaks-finder": "^1.0.0", - "ml-peak-shape-generator": "^4.1.2", + "ml-peak-shape-generator": "^4.1.4", "ml-regression-base": "^4.0.0", "ml-regression-exponential": "^3.0.1", - "ml-regression-polynomial": "^3.0.0", - "ml-signal-processing": "^1.0.4", + "ml-regression-polynomial": "^3.0.1", + "ml-regression-simple-linear": "^3.0.1", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-signal-processing": "^1.1.1", "ml-simple-clustering": "^0.1.0", "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.5.0", + "ml-spectra-processing": "^14.6.0", "ml-tree-set": "^0.1.1", "nmr-correlation": "^2.3.3", "numeral": "^2.0.6", - "openchemlib-utils": "^5.19.1", + "openchemlib-utils": "^6.4.1", "spectrum-generator": "^8.0.11" } }, "node_modules/nmredata": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-0.9.9.tgz", - "integrity": "sha512-FhqSIN3p37RE/e/8Lf8OG/bpAuT35WtKrhjo6W9YQ1ZvC6QV7xP/1IUYOfOjmMqafaMC8xdzED9aSgHnlE5VUA==", + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-0.9.11.tgz", + "integrity": "sha512-eaql8S2eGh22lrAungs3a7+PthuFHIs5Y6q6/oeg4fxRQiENVkdNXeJ+zFm/+BSX1z4nnmCCNl2MiRyB2ZxLEg==", "dependencies": { - "filelist-utils": "^1.2.0", + "filelist-utils": "^1.11.0", "jszip": "^3.10.1", - "openchemlib": "^8.0.1", - "openchemlib-utils": "^5.2.0" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } + "openchemlib": "^8.14.0", + "openchemlib-utils": "^6.1.0" } }, "node_modules/num-sort": { @@ -975,26 +949,26 @@ } }, "node_modules/openchemlib": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.13.0.tgz", - "integrity": "sha512-CdE9mNFdiQaZbjThvpplKC2YObyg9w4cKbuZ8nn/dRuTvk35H7+LPl2xylm84OGW3062AanU61ms4HnNZOzoXA==" + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.17.0.tgz", + "integrity": "sha512-oLtXP5EdD+TDbuKSL7bm5am6GiSK54hCPlrTD7Bq4A2L57aVDeqSY175mcN1Lxo6OJ3i53nKKlNEgQofxcICKg==" }, "node_modules/openchemlib-utils": { - "version": "5.21.1", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-5.21.1.tgz", - "integrity": "sha512-4Y1O0aITXN9T2V6VsszV26K9WZnlg8OY0CmQ2hdLBQIEwueuroEziKSa0OShkFQNkUIk3qPBGZk2876jR6UqIQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-6.4.1.tgz", + "integrity": "sha512-06MimP21cvX3rME/ZFqCaA0nPDuQoiWyfgRBbSHDmJSJJYMmrbTWPxrIXy/dQSZktcDdrh8L3VQF11HWRBwsOw==", "dependencies": { "@lukeed/uuid": "^2.0.1", - "atom-sorter": "^2.0.1", + "atom-sorter": "^2.1.1", "ensure-string": "^1.2.0", "get-value": "^3.0.1", "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.11.0", + "ml-matrix": "^6.11.1", "papaparse": "^5.4.1", "sdf-parser": "^6.0.1" }, "peerDependencies": { - "openchemlib": ">=8.6.2" + "openchemlib": ">=8.14.0" } }, "node_modules/pako": { @@ -1130,11 +1104,6 @@ "node": ">=8" } }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -1218,20 +1187,6 @@ "ml-spectra-processing": "^14.2.0" } }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 231a932..255d428 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,9 +15,9 @@ "nmr-cli": "./build/index.js" }, "dependencies": { - "filelist-utils": "^1.11.0", - "nmr-load-save": "^0.33.1", - "nmr-processing": "^12.3.2", + "filelist-utils": "^1.11.2", + "nmr-load-save": "^2.1.0", + "nmr-processing": "^14.0.5", "playwright": "^1.49.0", "yargs": "^17.7.2" }, From 1ab07e5507ff0dd96ded0f1666fa0ad80b6c4d23 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Wed, 12 Mar 2025 10:15:37 +0100 Subject: [PATCH 26/44] feat: update nmr-load-save to version 3.1.3 --- app/scripts/nmr-cli/package-lock.json | 240 ++++++++++++++------------ app/scripts/nmr-cli/package.json | 6 +- 2 files changed, 136 insertions(+), 110 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 15b098f..2869921 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,9 +9,9 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "filelist-utils": "^1.11.2", - "nmr-load-save": "^2.1.0", - "nmr-processing": "^14.0.5", + "filelist-utils": "^1.11.3", + "nmr-load-save": "^3.1.3", + "nmr-processing": "^17.0.0", "playwright": "^1.49.0", "yargs": "^17.7.2" }, @@ -205,9 +205,9 @@ "dev": true }, "node_modules/atom-sorter": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.1.3.tgz", - "integrity": "sha512-mfITb+18f/9C7xpWTVJVa0vlyak06JwW0XeqzUWpRxhbn5w1Mc4EbGg0vrjtTcNEzRRvp5o3oO16XJ8LhhpnGw==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.2.0.tgz", + "integrity": "sha512-ktg7pvTF22Ox/HPJZjUrw3L0dH1nOZg+CjGR0r1iyZO2LDbQX5GgIxOWq4YthifBrcVxfFMkdKVhp5YJ43g0Vw==" }, "node_modules/baselines": { "version": "1.1.9", @@ -227,16 +227,16 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, "node_modules/brukerconverter": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-7.0.4.tgz", - "integrity": "sha512-G8Jx2f+hV02Zvkw+nXB1MpTFJaJhsuinrt+XQv/SFjA88rWYCrxw3WIMmHx06Bp19Zw03BYMdHy0YDMpyjplbw==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-8.0.3.tgz", + "integrity": "sha512-SLDPH+fD5zTp9qb9NESTT1xWFI6mN4yWT5tdSROPbdCD6zgv6F8fb4VRbyWw0fHs//HH2/8PRFkPd5LejiXcwg==", "dependencies": { - "cheminfo-types": "^1.7.3", - "filelist-utils": "^1.11.0", + "cheminfo-types": "^1.8.1", + "filelist-utils": "^1.11.2", "iobuffer": "^5.3.2", "is-any-array": "^2.0.1", - "jcampconverter": "^10.0.1", - "ml-spectra-processing": "^14.5.0" + "jcampconverter": "^11.0.1", + "ml-spectra-processing": "^14.9.2" } }, "node_modules/cheminfo-types": { @@ -302,11 +302,6 @@ "resolved": "https://registry.npmjs.org/cuthill-mckee/-/cuthill-mckee-1.0.0.tgz", "integrity": "sha512-ehXCHYXZhZzDZmVQE/P9wQ7XPOn1G3e+pVqcqXvYykBL8Lg7HFm2ewD3TZseOMWiM9bNU0u4UWSV/dAzf+unug==" }, - "node_modules/d3-array": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-0.7.1.tgz", - "integrity": "sha512-Ifi3fH46Bco+Lb1mOlTxbFEuF3NdyElEVVD+EmoK327I0JzKAP4x57cl+HoxHqFcVd8F/uXLC+wtY3n/R1uO2w==" - }, "node_modules/d3-color": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", @@ -361,10 +356,19 @@ "resolved": "https://registry.npmjs.org/fft.js/-/fft.js-4.0.4.tgz", "integrity": "sha512-f9c00hphOgeQTlDyavwTtu6RiK8AIFjD6+jvXkNkpeQ7rirK3uFWVpalkoS4LAwbdX7mfZ8aoBfFVQX1Re/8aw==" }, + "node_modules/fifo-logger": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fifo-logger/-/fifo-logger-1.0.0.tgz", + "integrity": "sha512-QLwozqK3u0+8w+J9JPGBYxAvA0tAZhdnhE74OCHAhopGiRltJ7QDvobE15qORPty8qkDBdXhsMaGF35Ry0kwAA==", + "dependencies": { + "@lukeed/uuid": "^2.0.1", + "typescript-event-target": "^1.1.0" + } + }, "node_modules/filelist-utils": { - "version": "1.11.2", - "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.11.2.tgz", - "integrity": "sha512-e2bUWJLAjyMq+RZU0cEUhjGXQTFe2+TOE+qhHvBl8iPlSnb+iY6ibZaWUsLKRTuVtVVeAvqnJXCIUjXsSk1gKg==", + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.11.3.tgz", + "integrity": "sha512-KB3d9ruIVHSz53SL1FscfP+QXv1lkPDYE48JoKJ49N1b0AqI6Ux1LLG7ipVCuTlMpBMVW/I1sKEhdvBB4wgsiA==", "dependencies": { "cheminfo-types": "^1.7.3", "jszip": "^3.10.1", @@ -432,9 +436,9 @@ } }, "node_modules/iobuffer": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.3.2.tgz", - "integrity": "sha512-kO3CjNfLZ9t+tHxAMd+Xk4v3D/31E91rMs1dHrm7ikEQrlZ8mLDbQ4z3tZfDM48zOkReas2jx8MWSAmN9+c8Fw==" + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", + "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==" }, "node_modules/is-any-array": { "version": "2.0.1", @@ -471,21 +475,21 @@ } }, "node_modules/jcampconverter": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-10.0.1.tgz", - "integrity": "sha512-1yQ9Q35K2A64Q5NQ7AN/w6KbooviQAQ33Yo6p4vMFAyntR09n/OzR65CubbCogp3bVCm+pdQ3RCkfrcKqTabRQ==", + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-11.0.1.tgz", + "integrity": "sha512-8i01PC5WhUMH9H2AIssOhqSJpgjftJFQ2MUcYSgqKzy3QemQ8D7M960Ab+jba0wO4ThWYSp1xKMBmoL6zuEYQA==", "dependencies": { - "cheminfo-types": "^1.8.0", + "cheminfo-types": "^1.8.1", "dynamic-typing": "^1.0.1", "ensure-string": "^1.2.0", - "gyromagnetic-ratio": "^1.2.0", + "gyromagnetic-ratio": "^1.2.1", "ml-array-median": "^1.1.6" } }, "node_modules/jeolconverter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/jeolconverter/-/jeolconverter-1.0.3.tgz", - "integrity": "sha512-0ADCau6TYGgZvN3kK2PTKHk7enpgOAUvcHaNbeStGOciTUFyrtmaE53z6Blac9+GzGpT3kU0agfNA2COO+GsOw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/jeolconverter/-/jeolconverter-1.0.4.tgz", + "integrity": "sha512-p4MwOtP5QcBqvdr4jha0fQiOcArRf6K8CwwElpaG7chbmBuEf2FQpZj5QFP9VJQa3I1C3U3tzw5bM+QG388sWQ==", "dependencies": { "iobuffer": "^5.3.2" } @@ -525,21 +529,11 @@ "ml-spectra-processing": "^14.2.2" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==" - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -611,6 +605,15 @@ "ml-regression-polynomial": "^3.0.1" } }, + "node_modules/ml-convolution": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-convolution/-/ml-convolution-2.0.0.tgz", + "integrity": "sha512-ExW6zVmN2YGuyO3aBiS1ymybme3nVgv2ccCfynSdgtW5sNp4DOHnfow4K/ErTDMQ1s9tINjv7kvzjnVhQHXJBA==", + "dependencies": { + "fft.js": "^4.0.3", + "next-power-of-two": "^1.0.0" + } + }, "node_modules/ml-direct": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/ml-direct/-/ml-direct-1.0.0.tgz", @@ -818,17 +821,16 @@ } }, "node_modules/ml-spectra-processing": { - "version": "14.7.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.7.0.tgz", - "integrity": "sha512-O8ztoPhiKe6U2w7U+Lb7Ft9gE6/o6w4Y6x0QOQM74iP40t4tP7ZDMdTtCCEUuk8l/YWxSBsjXYvD1NL5OW+mBQ==", + "version": "14.10.0", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.10.0.tgz", + "integrity": "sha512-4fyF6tojgVgh6m9nmFvaIlGhrvHq+swn64IxQ44F4k4o7Qkl8xKOJWfQ4EsfoX66GqZn2PFfcn1xUGRNwB8+3w==", "dependencies": { "binary-search": "^1.3.6", "cheminfo-types": "^1.8.1", "fft.js": "^4.0.4", "is-any-array": "^2.0.1", "ml-matrix": "^6.12.0", - "ml-xsadd": "^3.0.1", - "spline-interpolator": "^1.0.0" + "ml-xsadd": "^3.0.1" } }, "node_modules/ml-tree-set": { @@ -841,47 +843,73 @@ "resolved": "https://registry.npmjs.org/ml-xsadd/-/ml-xsadd-3.0.1.tgz", "integrity": "sha512-Fz2q6dwgzGM8wYKGArTUTZDGa4lQFA2Vi6orjGeTVRy22ZnQFKlJuwS9n8NRviqz1KHAHAzdKJwbnYhdo38uYg==" }, + "node_modules/multiplet-analysis": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/multiplet-analysis/-/multiplet-analysis-2.1.5.tgz", + "integrity": "sha512-5+CF7qj/ccP+KZquYI2tDEjkGmRL6w1fciAs0OvTzSbAGsi5mEH7oruUipcXh2O6bgZhrY1TduBQkdFVXGJUwQ==", + "dependencies": { + "cheminfo-types": "^1.8.1", + "fft.js": "^4.0.4", + "ml-airpls": "^2.0.0", + "ml-spectra-processing": "^14.7.0" + } + }, + "node_modules/next-power-of-two": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-power-of-two/-/next-power-of-two-1.0.0.tgz", + "integrity": "sha512-+z6QY1SxkDk6CQJAeaIZKmcNubBCRP7J8DMQUBglz/sSkNsZoJ1kULjqk9skNPPplzs4i9PFhYrvNDdtQleF/A==" + }, "node_modules/nmr-correlation": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/nmr-correlation/-/nmr-correlation-2.3.3.tgz", - "integrity": "sha512-RSdzZGsE2HeitUEhA7Dc1048eu6Web/SH5UjrbFEpddVNwvPGKQUZfQ5uoygcaTpKfq2lTddi2Ln9MDYjfyOgg==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/nmr-correlation/-/nmr-correlation-2.3.5.tgz", + "integrity": "sha512-WmJXckcF+epK0u2DVv+LBahvtlbFiCbTtXQsYmq07fze6i6XLPHnFcE1q6HKtiYYbePd6ks2PMOmWQEDdU2XbA==", "dependencies": { - "cheminfo-types": "^1.4.0", - "lodash": "^4.17.21", + "cheminfo-types": "^1.8.1", "ml-matrix-peaks-finder": "^1.0.0", - "ml-peak-shape-generator": "^4.1.1" + "ml-peak-shape-generator": "^4.1.4" } }, "node_modules/nmr-load-save": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-2.1.0.tgz", - "integrity": "sha512-4QIjH/2W713uhLd4i417v1XuV+pknPDOJcYoeRiRHoFf4rev7/gx+QnYZ/f1g3PXzSvARFq6k70Wgwxckn2KBg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.1.3.tgz", + "integrity": "sha512-hkLzOZ2cK3leDs9d6r3rgb1FInDH9KRJ5frrrQUHVFT9NrCd54bJW0Ice6Vfd4tJmg5GJtGlFc+jw+YzxTppIw==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", - "brukerconverter": "^7.0.4", + "brukerconverter": "^8.0.3", "cheminfo-types": "^1.8.1", "convert-to-jcamp": "^5.4.11", - "filelist-utils": "^1.11.2", + "fifo-logger": "^1.0.0", + "filelist-utils": "^1.11.3", "gyromagnetic-ratio": "^1.2.1", "is-any-array": "^2.0.1", - "jcampconverter": "^10.0.1", - "jeolconverter": "^1.0.3", + "jcampconverter": "^11.0.1", + "jeolconverter": "^1.0.4", + "linear-sum-assignment": "^1.0.7", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.6.2", - "nmr-correlation": "^2.3.3", - "nmr-processing": "^14.0.2", + "ml-spectra-processing": "^14.10.0", + "nmr-correlation": "^2.3.5", + "nmr-processing": "^17.0.0", "nmredata": "^0.9.11", - "openchemlib": "^8.17.0", - "openchemlib-utils": "^6.4.1", - "sdf-parser": "^6.0.1", - "varian-converter": "^1.0.0" + "openchemlib": "^8.18.1", + "openchemlib-utils": "^6.5.3", + "sdf-parser": "^7.0.4", + "varian-converter": "^2.0.1" + } + }, + "node_modules/nmr-load-save/node_modules/sdf-parser": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-7.0.4.tgz", + "integrity": "sha512-j4VIBVTVJqs95Asz0lcIku1VjlVgKKWlwDV2JmCIq1exlI9WOSBT9rQvwvTPwl0v2TTgdQLfhYnBmiRg318LoQ==", + "dependencies": { + "dynamic-typing": "^1.0.1", + "ensure-string": "^1.2.0" } }, "node_modules/nmr-processing": { - "version": "14.0.5", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-14.0.5.tgz", - "integrity": "sha512-172pG4vTvR1mRMGZX9xGNwopf/qJ2oUsq2gmozRMPnR9TpgeqJqYcUxEDAqPh4seVkoxNDCX0uS7TvOTuzudxQ==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.0.0.tgz", + "integrity": "sha512-ZmqnxqNt1gEQkTSVfsSlH073peUvL83A6nWr81ktKixqmVgFn5nQ5Lr4TDKLjXJD08x+6StwZo5UeDVloXIdFA==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/d3-color": "^3.1.3", @@ -892,30 +920,31 @@ "gyromagnetic-ratio": "^1.2.1", "is-any-array": "^2.0.1", "linear-sum-assignment": "^1.0.7", - "lodash.omit": "^4.5.0", "ml-airpls": "^2.0.0", + "ml-convolution": "^2.0.0", "ml-direct": "^1.0.0", "ml-gsd": "^12.1.8", "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^4.1.3", - "ml-matrix": "^6.11.1", + "ml-matrix": "^6.12.0", "ml-matrix-convolution": "^1.0.0", "ml-matrix-peaks-finder": "^1.0.0", "ml-peak-shape-generator": "^4.1.4", "ml-regression-base": "^4.0.0", - "ml-regression-exponential": "^3.0.1", + "ml-regression-exponential": "^3.0.2", "ml-regression-polynomial": "^3.0.1", "ml-regression-simple-linear": "^3.0.1", "ml-savitzky-golay-generalized": "^4.2.0", - "ml-signal-processing": "^1.1.1", + "ml-signal-processing": "^1.2.0", "ml-simple-clustering": "^0.1.0", "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.6.0", + "ml-spectra-processing": "^14.10.0", "ml-tree-set": "^0.1.1", - "nmr-correlation": "^2.3.3", + "multiplet-analysis": "^2.1.5", + "nmr-correlation": "^2.3.5", "numeral": "^2.0.6", - "openchemlib-utils": "^6.4.1", - "spectrum-generator": "^8.0.11" + "openchemlib-utils": "^6.5.3", + "spectrum-generator": "^8.0.12" } }, "node_modules/nmredata": { @@ -949,26 +978,26 @@ } }, "node_modules/openchemlib": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.17.0.tgz", - "integrity": "sha512-oLtXP5EdD+TDbuKSL7bm5am6GiSK54hCPlrTD7Bq4A2L57aVDeqSY175mcN1Lxo6OJ3i53nKKlNEgQofxcICKg==" + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.18.1.tgz", + "integrity": "sha512-2v9aujHwhlIaCSkpzyDxUmYBtM08OP347aXNa0NwVaxIu2rAmTLHQCsz4FpooW2NZNweiVDp9g2AxZeakqTggA==" }, "node_modules/openchemlib-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-6.4.1.tgz", - "integrity": "sha512-06MimP21cvX3rME/ZFqCaA0nPDuQoiWyfgRBbSHDmJSJJYMmrbTWPxrIXy/dQSZktcDdrh8L3VQF11HWRBwsOw==", + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-6.6.0.tgz", + "integrity": "sha512-t8tsV0qAB28HE/mnE4F9YZjwlnnGaaqeYTPDjd1m5r2g5pGJEYY9Zt09MI1YWoLU/jNElYdb8LsGkO7zlwLoIQ==", "dependencies": { "@lukeed/uuid": "^2.0.1", - "atom-sorter": "^2.1.1", + "atom-sorter": "^2.2.0", "ensure-string": "^1.2.0", "get-value": "^3.0.1", "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.11.1", - "papaparse": "^5.4.1", + "ml-matrix": "^6.12.0", + "papaparse": "^5.5.2", "sdf-parser": "^6.0.1" }, "peerDependencies": { - "openchemlib": ">=8.14.0" + "openchemlib": ">=8.18.1" } }, "node_modules/pako": { @@ -977,9 +1006,9 @@ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, "node_modules/papaparse": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.4.1.tgz", - "integrity": "sha512-HipMsgJkZu8br23pW15uvo6sib6wne/4woLZPlFf3rpDyMe9ywEXUsuD7+6K9PRkJlVT51j/sCOYDKGGS3ZJrw==" + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.2.tgz", + "integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==" }, "node_modules/playwright": { "version": "1.49.0", @@ -1056,20 +1085,12 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/spectrum-generator": { - "version": "8.0.11", - "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.0.11.tgz", - "integrity": "sha512-B68lrg7XFtt+bB6cYnxbiPiD7TrFl5zYKNkKXZcY3LqqShHXQHhq8RKpHi2coEsJQs4nrxmHJ9mfxP6p4QGmMw==", + "version": "8.0.12", + "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.0.12.tgz", + "integrity": "sha512-7CG714g2yANDIqfFu8gj1EZk0qxqjL7L9IQtLMYR5ZybkG+O3TnQkMtXKu3tcm6B4oo2qBTNLgSUOh0NTXHYSw==", "dependencies": { - "ml-peak-shape-generator": "^4.1.2", - "ml-spectra-processing": "^14.2.0" - } - }, - "node_modules/spline-interpolator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spline-interpolator/-/spline-interpolator-1.0.0.tgz", - "integrity": "sha512-s8lowgsWE5wjHGEsk/4VADp7xAHw+pNy3OGp96fYjVTwLSx/83+BBmTFP2wZDRM0kj45q8zSyOV5fUcGn4hLEw==", - "dependencies": { - "d3-array": "^0.7.1" + "ml-peak-shape-generator": "^4.1.4", + "ml-spectra-processing": "^14.8.0" } }, "node_modules/string_decoder": { @@ -1160,6 +1181,11 @@ "node": ">=14.17" } }, + "node_modules/typescript-event-target": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/typescript-event-target/-/typescript-event-target-1.1.1.tgz", + "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==" + }, "node_modules/undici-types": { "version": "6.20.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", @@ -1178,9 +1204,9 @@ "dev": true }, "node_modules/varian-converter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/varian-converter/-/varian-converter-1.0.0.tgz", - "integrity": "sha512-dZrYLrN8llpfXC8EDKzgaeB0foCCTgTnsfjiIr1PH2GChRwkM0yjLzAgco+E+hTFoo6Da3Nvj9Zmud9i0YPlDg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/varian-converter/-/varian-converter-2.0.1.tgz", + "integrity": "sha512-bvOZ74Zs/Hbht7GDCC6Z/jQOrCyczjItfT5KOJsAG4Ty3MQBvjHf16GwuuWpBnmNRUezLjZ2v+bSS/wVyPXYQQ==", "dependencies": { "filelist-utils": "^1.11.0", "iobuffer": "^5.3.2", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 255d428..bf22158 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,9 +15,9 @@ "nmr-cli": "./build/index.js" }, "dependencies": { - "filelist-utils": "^1.11.2", - "nmr-load-save": "^2.1.0", - "nmr-processing": "^14.0.5", + "filelist-utils": "^1.11.3", + "nmr-load-save": "^3.1.3", + "nmr-processing": "^17.0.0", "playwright": "^1.49.0", "yargs": "^17.7.2" }, From 308d4c858ab19c743751be309888d12556c4eb00 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Wed, 12 Mar 2025 10:26:47 +0100 Subject: [PATCH 27/44] chore: update dependencies --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/package-lock.json | 113 +++++++++++++------------- app/scripts/nmr-cli/package.json | 10 +-- app/scripts/nmr-cli/tsconfig.json | 5 +- 4 files changed, 66 insertions(+), 64 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index 3f2c17a..af129be 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.49.0-jammy +FROM mcr.microsoft.com/playwright:v1.51.0-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 2869921..201606e 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -1,28 +1,28 @@ { - "name": "test-node", + "name": "nmr-cli", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "test-node", + "name": "nmr-cli", "version": "1.0.0", "license": "ISC", "dependencies": { "filelist-utils": "^1.11.3", "nmr-load-save": "^3.1.3", "nmr-processing": "^17.0.0", - "playwright": "^1.49.0", + "playwright": "^1.51.0", "yargs": "^17.7.2" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^22.10.1", + "@types/node": "^22.13.10", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.7.2" + "typescript": "^5.8.2" } }, "node_modules/@cspotcode/source-map-support": { @@ -38,18 +38,18 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -82,9 +82,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true }, "node_modules/@tsconfig/node12": { @@ -119,9 +119,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" + "version": "4.17.16", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", + "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==" }, "node_modules/@types/lodash.merge": { "version": "4.6.9", @@ -132,9 +132,9 @@ } }, "node_modules/@types/node": { - "version": "22.10.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", - "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", + "version": "22.13.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", + "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", "dev": true, "dependencies": { "undici-types": "~6.20.0" @@ -156,9 +156,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -168,10 +168,13 @@ } }, "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, "engines": { "node": ">=0.4.0" } @@ -344,9 +347,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "engines": { "node": ">=6" } @@ -694,9 +697,9 @@ } }, "node_modules/ml-matrix": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.0.tgz", - "integrity": "sha512-AGfR+pWaC0GmzjUnB6BfwhndPEUGz0i7QUYdqNuw1zhTov/vSRJ9pP2hs6BoGpaSbtXgrKjZz2zjD1M0xuur6A==", + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.1.tgz", + "integrity": "sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==", "dependencies": { "is-any-array": "^2.0.1", "ml-array-rescale": "^1.3.7" @@ -897,15 +900,6 @@ "varian-converter": "^2.0.1" } }, - "node_modules/nmr-load-save/node_modules/sdf-parser": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-7.0.4.tgz", - "integrity": "sha512-j4VIBVTVJqs95Asz0lcIku1VjlVgKKWlwDV2JmCIq1exlI9WOSBT9rQvwvTPwl0v2TTgdQLfhYnBmiRg318LoQ==", - "dependencies": { - "dynamic-typing": "^1.0.1", - "ensure-string": "^1.2.0" - } - }, "node_modules/nmr-processing": { "version": "17.0.0", "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.0.0.tgz", @@ -1000,6 +994,15 @@ "openchemlib": ">=8.18.1" } }, + "node_modules/openchemlib-utils/node_modules/sdf-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-6.0.1.tgz", + "integrity": "sha512-QorgjqiqTzodCMmYkWYkYJ9nBnOL3w3mWOE9BB1SATUfkFvLOSxHaeZAnJxrHlRkfI7+q3+FsvZOS2OTN74lNA==", + "dependencies": { + "dynamic-typing": "^1.0.0", + "ensure-string": "^1.2.0" + } + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -1011,11 +1014,11 @@ "integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==" }, "node_modules/playwright": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", - "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", + "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", "dependencies": { - "playwright-core": "1.49.0" + "playwright-core": "1.51.0" }, "bin": { "playwright": "cli.js" @@ -1028,9 +1031,9 @@ } }, "node_modules/playwright-core": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", - "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", + "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==", "bin": { "playwright-core": "cli.js" }, @@ -1071,11 +1074,11 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/sdf-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-6.0.1.tgz", - "integrity": "sha512-QorgjqiqTzodCMmYkWYkYJ9nBnOL3w3mWOE9BB1SATUfkFvLOSxHaeZAnJxrHlRkfI7+q3+FsvZOS2OTN74lNA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-7.0.4.tgz", + "integrity": "sha512-j4VIBVTVJqs95Asz0lcIku1VjlVgKKWlwDV2JmCIq1exlI9WOSBT9rQvwvTPwl0v2TTgdQLfhYnBmiRg318LoQ==", "dependencies": { - "dynamic-typing": "^1.0.0", + "dynamic-typing": "^1.0.1", "ensure-string": "^1.2.0" } }, @@ -1169,9 +1172,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", "dev": true, "bin": { "tsc": "bin/tsc", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index bf22158..2296c01 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -1,12 +1,12 @@ { - "name": "test-node", + "name": "nmr-cli", "version": "1.0.0", "description": "", "main": "./build/index.js", "scripts": { "build": "tsc", "start": "node build/index.js", - "dev": "ts-node src/index.ts" + "dev": "nmr-cli src/index.ts" }, "keywords": [], "author": "", @@ -18,13 +18,13 @@ "filelist-utils": "^1.11.3", "nmr-load-save": "^3.1.3", "nmr-processing": "^17.0.0", - "playwright": "^1.49.0", + "playwright": "^1.51.0", "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^22.10.1", + "@types/node": "^22.13.10", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.7.2" + "typescript": "^5.8.2" } } \ No newline at end of file diff --git a/app/scripts/nmr-cli/tsconfig.json b/app/scripts/nmr-cli/tsconfig.json index 0f9b561..3365620 100644 --- a/app/scripts/nmr-cli/tsconfig.json +++ b/app/scripts/nmr-cli/tsconfig.json @@ -1,10 +1,9 @@ { "compilerOptions": { - "target": "ES2020", - "module": "CommonJS", + "target": "ES2022", + "module": "NodeNext", "strict": true, "esModuleInterop": true, - "moduleResolution": "node", "outDir": "./build", "skipLibCheck": true, }, From d0dad50d0bc801b04bafbec0d952a189685173df Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Wed, 26 Mar 2025 09:58:06 +0100 Subject: [PATCH 28/44] chore: update dependencies --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/package-lock.json | 24 ++++++++++++------------ app/scripts/nmr-cli/package.json | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index af129be..c0f1fbf 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.51.0-jammy +FROM mcr.microsoft.com/playwright:v1.51.1-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 201606e..504d6fd 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -12,14 +12,14 @@ "filelist-utils": "^1.11.3", "nmr-load-save": "^3.1.3", "nmr-processing": "^17.0.0", - "playwright": "^1.51.0", + "playwright": "^1.51.1", "yargs": "^17.7.2" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^22.13.10", + "@types/node": "^22.13.13", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", "typescript": "^5.8.2" @@ -132,9 +132,9 @@ } }, "node_modules/@types/node": { - "version": "22.13.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.10.tgz", - "integrity": "sha512-I6LPUvlRH+O6VRUqYOcMudhaIdUVWfsjnZavnsraHvpBwaEyMN29ry+0UVJhImYL16xsscu0aske3yA+uPOWfw==", + "version": "22.13.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz", + "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==", "dev": true, "dependencies": { "undici-types": "~6.20.0" @@ -1014,11 +1014,11 @@ "integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==" }, "node_modules/playwright": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz", - "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", + "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", "dependencies": { - "playwright-core": "1.51.0" + "playwright-core": "1.51.1" }, "bin": { "playwright": "cli.js" @@ -1031,9 +1031,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz", - "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==", + "version": "1.51.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", + "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", "bin": { "playwright-core": "cli.js" }, diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 2296c01..3b4c361 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -18,11 +18,11 @@ "filelist-utils": "^1.11.3", "nmr-load-save": "^3.1.3", "nmr-processing": "^17.0.0", - "playwright": "^1.51.0", + "playwright": "^1.51.1", "yargs": "^17.7.2" }, "devDependencies": { - "@types/node": "^22.13.10", + "@types/node": "^22.13.13", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", "typescript": "^5.8.2" From 2be806730d9f5282f99453338caaf20aa4c2b40a Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Wed, 26 Mar 2025 09:59:22 +0100 Subject: [PATCH 29/44] feat: update nmr-load-save to version 3.3.0 --- app/scripts/nmr-cli/package-lock.json | 32 +++++++++++++-------------- app/scripts/nmr-cli/package.json | 4 ++-- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 504d6fd..d5c48fd 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -10,8 +10,8 @@ "license": "ISC", "dependencies": { "filelist-utils": "^1.11.3", - "nmr-load-save": "^3.1.3", - "nmr-processing": "^17.0.0", + "nmr-load-save": "^3.3.0", + "nmr-processing": "^17.1.3", "playwright": "^1.51.1", "yargs": "^17.7.2" }, @@ -873,9 +873,9 @@ } }, "node_modules/nmr-load-save": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.1.3.tgz", - "integrity": "sha512-hkLzOZ2cK3leDs9d6r3rgb1FInDH9KRJ5frrrQUHVFT9NrCd54bJW0Ice6Vfd4tJmg5GJtGlFc+jw+YzxTppIw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.3.0.tgz", + "integrity": "sha512-3sdS18ewAbIV6OaSDlVcq1jViKWHyHjfPm9+ofxFpAChDX+DKr05FEAHmqY21NlvsPDDplYfemTF6d3rnQ0+6A==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", @@ -892,18 +892,18 @@ "lodash.merge": "^4.6.2", "ml-spectra-processing": "^14.10.0", "nmr-correlation": "^2.3.5", - "nmr-processing": "^17.0.0", + "nmr-processing": "^17.1.1", "nmredata": "^0.9.11", - "openchemlib": "^8.18.1", - "openchemlib-utils": "^6.5.3", + "openchemlib": "^8.19.0", + "openchemlib-utils": "^6.6.0", "sdf-parser": "^7.0.4", "varian-converter": "^2.0.1" } }, "node_modules/nmr-processing": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.0.0.tgz", - "integrity": "sha512-ZmqnxqNt1gEQkTSVfsSlH073peUvL83A6nWr81ktKixqmVgFn5nQ5Lr4TDKLjXJD08x+6StwZo5UeDVloXIdFA==", + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.1.3.tgz", + "integrity": "sha512-ymzYbLRhqLywDOOIglY9UuCiyVqwue2DKqjaROHq8x9mR4GY9Uv+BMj4jM5CC71A4tR0SjJnK3Ha+meYkT/MEw==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/d3-color": "^3.1.3", @@ -920,7 +920,7 @@ "ml-gsd": "^12.1.8", "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^4.1.3", - "ml-matrix": "^6.12.0", + "ml-matrix": "^6.12.1", "ml-matrix-convolution": "^1.0.0", "ml-matrix-peaks-finder": "^1.0.0", "ml-peak-shape-generator": "^4.1.4", @@ -937,7 +937,7 @@ "multiplet-analysis": "^2.1.5", "nmr-correlation": "^2.3.5", "numeral": "^2.0.6", - "openchemlib-utils": "^6.5.3", + "openchemlib-utils": "^6.6.0", "spectrum-generator": "^8.0.12" } }, @@ -972,9 +972,9 @@ } }, "node_modules/openchemlib": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.18.1.tgz", - "integrity": "sha512-2v9aujHwhlIaCSkpzyDxUmYBtM08OP347aXNa0NwVaxIu2rAmTLHQCsz4FpooW2NZNweiVDp9g2AxZeakqTggA==" + "version": "8.19.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.19.0.tgz", + "integrity": "sha512-MLt6rFzVIcQ7MWBUu1htKlnA7SDIBkzYSXlIjZ4eVJ36RJBA81TIn7pkhSNoclWNVjVnMoIVXd1su1PbN25S/A==" }, "node_modules/openchemlib-utils": { "version": "6.6.0", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 3b4c361..ff48805 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -16,8 +16,8 @@ }, "dependencies": { "filelist-utils": "^1.11.3", - "nmr-load-save": "^3.1.3", - "nmr-processing": "^17.0.0", + "nmr-load-save": "^3.3.0", + "nmr-processing": "^17.1.3", "playwright": "^1.51.1", "yargs": "^17.7.2" }, From d5101310f0d160de4d6f1220898fe555f1075f70 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 13 Jun 2025 12:32:12 +0200 Subject: [PATCH 30/44] feat: predict spectrum from mol using NMRShiftDB --- app/scripts/nmr-cli/Dockerfile | 5 +- app/scripts/nmr-cli/package-lock.json | 257 ++++++++++++++++++ app/scripts/nmr-cli/package.json | 3 +- app/scripts/nmr-cli/src/index.ts | 79 ++++-- .../generatePredictedSpectrumData.ts | 131 +++++++++ .../src/prediction/parsePredictionCommand.ts | 247 +++++++++++++++++ 6 files changed, 690 insertions(+), 32 deletions(-) create mode 100644 app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts create mode 100644 app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index c0f1fbf..d267c31 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -3,13 +3,15 @@ FROM mcr.microsoft.com/playwright:v1.51.1-jammy + SHELL ["/bin/bash", "-o", "pipefail", "-c"] + WORKDIR /app #ENV BASE_NMRIUM_URL=https://nmrium.nmrxiv.org/ ENV BASE_NMRIUM_URL=https://nmriumdev.nmrxiv.org/ - +ENV NMR_PREDICTION_URL=https://nmrshiftdb.nmr.uni-koeln.de/NmrshiftdbServlet/nmrshiftdbaction/quickcheck COPY package.json ./ COPY package-lock.json ./ @@ -22,6 +24,7 @@ RUN npm run build #install the nmr-cli as a global package # for example, nmr-cli parse-spectra -u https://cheminfo.github.io/bruker-data-test/data/zipped/aspirin-1h.zip +# nmr-cli predict -n "1H" --id 1 --type "nmr;1H;1d" --shifts "1" --solvent "Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)" -m $"\n Ketcher 6122516162D 1 1.00000 0.00000 0\n\n 16 17 0 0 0 0 0 0 0 0999 V2000\n 1.1954 -4.6484 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.9258 -4.6479 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.0622 -4.1483 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.9258 -5.6488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 1.1954 -5.6533 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 2.0644 -6.1483 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 3.7902 -4.1495 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 4.6574 -4.6498 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 3.7964 -6.1512 0.0000 N 0 0 0 0 0 0 0 0 0 0 0 0\n 4.6596 -5.6458 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.5228 -4.1488 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 5.5277 -6.1421 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n 6.3895 -4.6477 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n 5.5216 -3.1488 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0\n 7.2548 -4.1466 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 8.1215 -4.6455 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0\n 3 1 2 0 0 0 0\n 1 5 1 0 0 0 0\n 5 6 2 0 0 0 0\n 6 4 1 0 0 0 0\n 4 2 1 0 0 0 0\n 2 3 1 0 0 0 0\n 4 9 1 0 0 0 0\n 9 10 2 0 0 0 0\n 10 8 1 0 0 0 0\n 8 7 2 0 0 0 0\n 7 2 1 0 0 0 0\n 8 11 1 0 0 0 0\n 10 12 1 0 0 0 0\n 11 13 1 0 0 0 0\n 11 14 2 0 0 0 0\n 13 15 1 0 0 0 0\n 15 16 1 0 0 0 0\nM END" RUN npm install . -g diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index d5c48fd..8cfb058 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "axios": "^1.9.0", "filelist-utils": "^1.11.3", "nmr-load-save": "^3.3.0", "nmr-processing": "^17.1.3", @@ -207,11 +208,26 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, "node_modules/atom-sorter": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.2.0.tgz", "integrity": "sha512-ktg7pvTF22Ox/HPJZjUrw3L0dH1nOZg+CjGR0r1iyZO2LDbQX5GgIxOWq4YthifBrcVxfFMkdKVhp5YJ43g0Vw==" }, + "node_modules/axios": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/baselines": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.9.tgz", @@ -242,6 +258,18 @@ "ml-spectra-processing": "^14.9.2" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/cheminfo-types": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.8.1.tgz", @@ -276,6 +304,17 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/convert-to-jcamp": { "version": "5.4.11", "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.11.tgz", @@ -318,6 +357,14 @@ "d3-color": "1 - 2" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -327,6 +374,19 @@ "node": ">=0.3.1" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/dynamic-typing": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dynamic-typing/-/dynamic-typing-1.0.1.tgz", @@ -346,6 +406,47 @@ "isutf8": "^4.0.0" } }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -378,6 +479,40 @@ "pako": "^2.1.0" } }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", + "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -391,6 +526,14 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -399,6 +542,41 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-value": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", @@ -410,11 +588,58 @@ "node": ">=6.0" } }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gyromagnetic-ratio": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-1.2.1.tgz", "integrity": "sha512-cOkHEsIwHNKe8v/wED9NWa8wvzLx0rpBarUrEpvzdgECMpVQzrLJkaFYsdSxnhaUtWX4uNFxX01PJeFayDCpVA==" }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", @@ -543,11 +768,38 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/median-quickselect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/median-quickselect/-/median-quickselect-1.0.1.tgz", "integrity": "sha512-/QL9ptNuLsdA68qO+2o10TKCyu621zwwTFdLvtu8rzRNKsn8zvuGoq/vDxECPyELFG8wu+BpyoMR9BnsJqfVZQ==" }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/ml-airpls": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-airpls/-/ml-airpls-2.0.0.tgz", @@ -1046,6 +1298,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index ff48805..20f1010 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,6 +15,7 @@ "nmr-cli": "./build/index.js" }, "dependencies": { + "axios": "^1.9.0", "filelist-utils": "^1.11.3", "nmr-load-save": "^3.3.0", "nmr-processing": "^17.1.3", @@ -27,4 +28,4 @@ "ts-node": "^10.9.2", "typescript": "^5.8.2" } -} \ No newline at end of file +} diff --git a/app/scripts/nmr-cli/src/index.ts b/app/scripts/nmr-cli/src/index.ts index a66dec1..cc63fce 100755 --- a/app/scripts/nmr-cli/src/index.ts +++ b/app/scripts/nmr-cli/src/index.ts @@ -1,8 +1,8 @@ #!/usr/bin/env node -import yargs, { type Argv, type CommandModule, type Options, } from "yargs"; -import { loadSpectrumFromURL, loadSpectrumFromFilePath } from "./prase-spectra"; -import { generateSpectrumFromPublicationString } from "./publication-string"; - +import yargs, { type Argv, type CommandModule, type Options } from 'yargs' +import { loadSpectrumFromURL, loadSpectrumFromFilePath } from './prase-spectra' +import { generateSpectrumFromPublicationString } from './publication-string' +import { parsePredictionCommand } from './prediction/parsePredictionCommand' const usageMessage = ` Usage: nmr-cli [options] @@ -10,6 +10,7 @@ Usage: nmr-cli [options] Commands: parse-spectra Parse a spectra file to NMRium file parse-publication-string resurrect spectrum from the publication string + predict Predict spectrum from Mol Options for 'parse-spectra' command: -u, --url File URL @@ -19,21 +20,42 @@ Options for 'parse-spectra' command: Arguments for 'parse-publication-string' command: publicationString Publication string +Options for 'parse-spectra' command: + -u, --url File URL + -p, --path Directory path + -s, --capture-snapshot Capture snapshot + + +Options for 'predict' command: + -n, --nucleus Predicted nucleus "1H" or "13C" (required) + -i, --id Input ID (default: 1) + -t, --type NMR type (default: "nmr;1H;1d") + -s, --shifts Chemical shifts (default: "1") + --solvent NMR solvent (default: "Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)") + -m, --molText MOL text (required) + --from From in (ppm) + --to To in (ppm) + --nbPoints Number of points (default: 128) + --lineWidth Line width (default: 1) + --frequency NMR frequency (MHz) (default: 400) + --tolerance Tolerance (default: 0.001) + + + Examples: nmr-cli parse-spectra -u file-url -s // Process spectra files from a URL and capture an image for the spectra nmr-cli parse-spectra -p directory-path -s // process a spectra files from a directory and capture an image for the spectra nmr-cli parse-spectra -u file-url // Process spectra files from a URL nmr-cli parse-spectra -p directory-path // Process spectra files from a directory nmr-cli parse-publication-string "your publication string" -`; +` interface FileOptionsArgs { - u?: string; - p?: string; - s?: boolean; + u?: string + p?: string + s?: boolean } - // Define options for parsing a spectra file const fileOptions: { [key in keyof FileOptionsArgs]: Options } = { u: { @@ -53,56 +75,53 @@ const fileOptions: { [key in keyof FileOptionsArgs]: Options } = { describe: 'Capture snapshot', type: 'boolean', }, -} as const; - +} as const const parseFileCommand: CommandModule<{}, FileOptionsArgs> = { command: ['parse-spectra', 'ps'], describe: 'Parse a spectra file to NMRium file', - builder: (yargs) => { - return yargs.options(fileOptions).conflicts('u', 'p') as Argv; + builder: yargs => { + return yargs + .options(fileOptions) + .conflicts('u', 'p') as Argv }, - handler: (argv) => { + handler: argv => { // Handle parsing the spectra file logic based on argv options if (argv?.u) { - loadSpectrumFromURL(argv.u, argv.s).then((result) => { + loadSpectrumFromURL(argv.u, argv.s).then(result => { console.log(JSON.stringify(result)) }) - } if (argv?.p) { - loadSpectrumFromFilePath(argv.p, argv.s).then((result) => { + loadSpectrumFromFilePath(argv.p, argv.s).then(result => { console.log(JSON.stringify(result)) }) } }, -}; +} // Define the parse publication string command const parsePublicationCommand: CommandModule = { command: ['parse-publication-string', 'pps'], describe: 'Parse a publication string', - handler: (argv) => { - const publicationString = argv._[1]; + handler: argv => { + const publicationString = argv._[1] // Handle parsing publication string - if (typeof publicationString == "string") { - const nmriumObject = generateSpectrumFromPublicationString(publicationString); - + if (typeof publicationString == 'string') { + const nmriumObject = + generateSpectrumFromPublicationString(publicationString) - console.log(JSON.stringify(nmriumObject)); + console.log(JSON.stringify(nmriumObject)) } }, -}; +} yargs .usage(usageMessage) .command(parseFileCommand) .command(parsePublicationCommand) + .command(parsePredictionCommand) .showHelpOnFail(true) .help() - .parse(); - - - - + .parse() diff --git a/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts b/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts new file mode 100644 index 0000000..ec8ca2c --- /dev/null +++ b/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts @@ -0,0 +1,131 @@ +export interface ShiftsItem { + atom: number + prediction: number + real: number + diff: number + status: 'accept' | 'missing' | string + hoseCode: string + spheres: number +} + +interface LorentzianOptions { + x: number + fwhm: number +} + +function lorentzian2(options: LorentzianOptions) { + const { x, fwhm } = options + return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2) +} + +interface GenerateSpectrumOptions { + from?: number + to?: number + nbPoints?: number + lineWidth?: number + frequency?: number + tolerance?: number +} + +interface GroupItem { + prediction: number + count: number + atoms: number[] +} + +interface Data1D { + x: number[] + re: number[] +} + +const getLorentzianFactor = (area = 0.9999) => { + if (area >= 1) { + throw new Error('area should be (0 - 1)') + } + const halfResidual = (1 - area) * 0.5 + const quantileFunction = (p: number) => Math.tan(Math.PI * (p - 0.5)) + return ( + (quantileFunction(1 - halfResidual) - quantileFunction(halfResidual)) / 2 + ) +} + +function groupEquivalentShifts(shifts: ShiftsItem[], tolerance = 0.001) { + const groups: GroupItem[] = [] + + for (const shift of shifts) { + const match = groups.find( + g => Math.abs(g.prediction - shift.prediction) < tolerance + ) + if (match) { + match.count += 1 + match.atoms.push(shift.atom) + } else { + groups.push({ + prediction: shift.prediction, + count: 1, + atoms: [shift.atom], + }) + } + } + + return groups +} + +export function generatePredictedSpectrumData( + shifts: ShiftsItem[], + options: GenerateSpectrumOptions = {} +) { + let { from, to } = options + const { + nbPoints = 10240, + frequency = 400, + lineWidth = 1, + tolerance = 0.001, + } = options + + if (!shifts || shifts.length === 0) return [] + + const sortedShifts = shifts + .slice(0) + .sort((a, b) => a.prediction - b.prediction) + + // const acceptedShifts = sortedShifts.filter(shift => + // shift.status === 'accept' + // ); + + const acceptedShifts = sortedShifts + + if (acceptedShifts.length === 0) return [] + from = from ?? acceptedShifts[0].prediction - 1 + to = to ?? (acceptedShifts.at(-1) as ShiftsItem).prediction + 1 + + if (from >= to) { + throw new Error("Invalid range: 'from' is greater or equal then 'to'") + } + + const data: Data1D = { x: [], re: [] } + const stepSize = (to - from) / (nbPoints - 1) + const groupedShifts = groupEquivalentShifts(acceptedShifts, tolerance) + + console.log(groupedShifts) + + const limit = (lineWidth * getLorentzianFactor(0.99)) / frequency + console.log(limit) + for (let i = 0; i < nbPoints; i++) { + const x = from + i * stepSize + let intensity = 0 + for (const { prediction, count } of groupedShifts) { + if (Math.abs(x - prediction) <= limit) { + intensity += + lorentzian2({ x: x - prediction, fwhm: lineWidth / frequency }) * + count + } + } + if (intensity > 0) { + data.x.push(x) + data.re.push(intensity) + } + } + + return data +} diff --git a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts new file mode 100644 index 0000000..7200a9e --- /dev/null +++ b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts @@ -0,0 +1,247 @@ +import { Argv, CommandModule, Options } from 'yargs' +import { + generatePredictedSpectrumData, + ShiftsItem, +} from './generatePredictedSpectrumData' +import { v4 } from '@lukeed/uuid' +import { CURRENT_EXPORT_VERSION } from 'nmr-load-save' +import https from 'https' +import axios from 'axios' + +interface PredictionOptions { + from?: number + to?: number + nbPoints?: number + lineWidth?: number + frequency?: number + tolerance?: number +} + +interface PredictionParameters { + molText: string + id: number + type: string + shifts: string + solvent: string + nucleus: string +} + +const predictionOptions: { [key in keyof PredictionOptions]: Options } = { + from: { + type: 'number', + description: 'From in (ppm)', + }, + to: { + type: 'number', + description: 'To in (ppm)', + }, + nbPoints: { + type: 'number', + description: 'Number of points', + default: 1024, + }, + lineWidth: { + type: 'number', + description: 'Line width', + default: 1, + }, + frequency: { + type: 'number', + description: 'NMR frequency (MHz)', + default: 400, + }, + tolerance: { + type: 'number', + description: 'Tolerance', + default: 0.001, + }, +} as const + +const nmrOptions: { [key in keyof PredictionParameters]: Options } = { + id: { + alias: 'i', + type: 'number', + description: 'Input ID', + default: 1, + }, + type: { + alias: 't', + type: 'string', + description: 'NMR type', + default: 'nmr;1H;1d', + choices: ['nmr;1H;1d', 'nmr;13C;1d'], + }, + shifts: { + alias: 's', + type: 'string', + description: 'Chemical shifts', + default: '1', + }, + solvent: { + type: 'string', + description: 'NMR solvent', + default: 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', + choices: [ + 'Any', + 'Chloroform-D1 (CDCl3)', + 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', + 'Methanol-D4 (CD3OD)', + 'Deuteriumoxide (D2O)', + 'Acetone-D6 ((CD3)2CO)', + 'TETRACHLORO-METHANE (CCl4)', + 'Pyridin-D5 (C5D5N)', + 'Benzene-D6 (C6D6)', + 'neat', + 'Tetrahydrofuran-D8 (THF-D8, C4D4O)', + ], + }, + molText: { + alias: 'm', + type: 'string', + description: 'MOL file content', + requiresArg: true, + }, + nucleus: { + alias: 'n', + type: 'string', + description: 'Predicted nucleus', + requiresArg: true, + choices: ['1H', '13C'], + }, +} as const + +interface PredictionResponseItem { + id: number + type: string + statistics: { + accept: number + warning: number + reject: number + missing: number + total: number + } + shifts: ShiftsItem[] +} +interface PredictionResponse { + result: PredictionResponseItem[] +} + +async function predictNMR(options: PredictionArgs): Promise { + const url = process.env['NMR_PREDICTION_URL'] + + if (!url) { + throw new Error('Environment variable NMR_PREDICTION_URL is not defined.') + } + + try { + new URL(url).toString() + } catch { + throw new Error(`Invalid URL in NMR_PREDICTION_URL: "${url}"`) + } + + try { + const { + id, + type, + shifts, + solvent, + from, + to, + nbPoints = 1024, + frequency = 400, + lineWidth = 1, + tolerance = 0.001, + molText, + nucleus, + } = options + + const payload: any = { + inputs: [ + { + id, + type, + shifts, + solvent, + }, + ], + moltxt: molText.replaceAll(/\\n/g, '\n'), + } + + const httpsAgent = new https.Agent({ + rejectUnauthorized: false, + }) + + // Axios POST request with httpsAgent + const response = await axios.post(url, payload, { + headers: { + 'Content-Type': 'application/json', + }, + httpsAgent, + }) + + const responseResult: PredictionResponse = response.data + const spectra = [] + + for (const result of responseResult.result) { + const name = v4() + const data = generatePredictedSpectrumData(result.shifts, { + from, + to, + nbPoints, + lineWidth, + frequency, + tolerance, + }) + + const info = { + isFid: false, + isComplex: false, + dimension: 1, + originFrequency: frequency, + baseFrequency: frequency, + pulseSequence: '', + solvent, + isFt: true, + name, + nucleus, + } + + spectra.push({ + id: v4(), + data, + info, + }) + } + + const nmrium = { data: { spectra }, version: CURRENT_EXPORT_VERSION } + console.log(JSON.stringify(nmrium, null, 2)) + } catch (error) { + console.error( + 'Error:', + error instanceof Error ? error.message : String(error) + ) + + if (axios.isAxiosError(error) && error.response) { + console.error('Response data:', error.response.data) + } else if (error instanceof Error && error.cause) { + console.error('Network Error:', error.cause) + } + } +} + +type PredictionArgs = PredictionParameters & PredictionOptions + +// Define the prediction string command +export const parsePredictionCommand: CommandModule<{}, PredictionArgs> = { + command: ['predict', 'p'], + describe: 'Predict NMR spectrum from mol text', + builder: (yargs: Argv<{}>): Argv => { + return yargs.options({ + ...nmrOptions, + ...predictionOptions, + }) as Argv + }, + handler: async argv => { + await predictNMR(argv) + }, +} From 67c17ac46faf69918d4bdce94e92818785713a68 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 13 Jun 2025 18:30:59 +0200 Subject: [PATCH 31/44] feat: add support for selecting peak shape algorithm (lorentzian or gaussian) --- app/scripts/nmr-cli/src/index.ts | 9 +- .../generatePredictedSpectrumData.ts | 79 +++- .../src/prediction/parsePredictionCommand.ts | 429 +++++++++--------- 3 files changed, 281 insertions(+), 236 deletions(-) diff --git a/app/scripts/nmr-cli/src/index.ts b/app/scripts/nmr-cli/src/index.ts index cc63fce..3d20466 100755 --- a/app/scripts/nmr-cli/src/index.ts +++ b/app/scripts/nmr-cli/src/index.ts @@ -25,9 +25,10 @@ Options for 'parse-spectra' command: -p, --path Directory path -s, --capture-snapshot Capture snapshot - + Options for 'predict' command: - -n, --nucleus Predicted nucleus "1H" or "13C" (required) + -ps,--peakShape Peak shape algorithm (default: "lorentzian") choices: ["gaussian", "lorentzian"] + -n, --nucleus Predicted nucleus, choices: ["1H","13C"] (required) -i, --id Input ID (default: 1) -t, --type NMR type (default: "nmr;1H;1d") -s, --shifts Chemical shifts (default: "1") @@ -35,10 +36,10 @@ Options for 'predict' command: -m, --molText MOL text (required) --from From in (ppm) --to To in (ppm) - --nbPoints Number of points (default: 128) + --nbPoints Number of points (default: 1024) --lineWidth Line width (default: 1) --frequency NMR frequency (MHz) (default: 400) - --tolerance Tolerance (default: 0.001) + --tolerance Tolerance to group peaks with close shift (default: 0.001) diff --git a/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts b/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts index ec8ca2c..78a8647 100644 --- a/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts +++ b/app/scripts/nmr-cli/src/prediction/generatePredictedSpectrumData.ts @@ -8,23 +8,21 @@ export interface ShiftsItem { spheres: number } -interface LorentzianOptions { +type PeakShape = 'gaussian' | 'lorentzian' + +interface PeakShapeOptions { x: number fwhm: number } -function lorentzian2(options: LorentzianOptions) { - const { x, fwhm } = options - return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2) -} - -interface GenerateSpectrumOptions { +export interface GenerateSpectrumOptions { from?: number to?: number nbPoints?: number lineWidth?: number frequency?: number tolerance?: number + peakShape?: PeakShape } interface GroupItem { @@ -38,7 +36,37 @@ interface Data1D { re: number[] } -const getLorentzianFactor = (area = 0.9999) => { +const GAUSSIAN_EXP_FACTOR = -4 * Math.LN2 + +function lorentzian(options: PeakShapeOptions) { + const { x, fwhm } = options + return fwhm ** 2 / (4 * x ** 2 + fwhm ** 2) +} + +function gaussian(options: PeakShapeOptions) { + const { x, fwhm } = options + return Math.exp(GAUSSIAN_EXP_FACTOR * Math.pow(x / fwhm, 2)) +} + +function erfinv(x: number): number { + let a = 0.147 + if (x === 0) return 0 + let ln1MinusXSqrd = Math.log(1 - x * x) + let lnEtcBy2Plus2 = ln1MinusXSqrd / 2 + 2 / (Math.PI * a) + let firstSqrt = Math.sqrt(lnEtcBy2Plus2 ** 2 - ln1MinusXSqrd / a) + let secondSqrt = Math.sqrt(firstSqrt - lnEtcBy2Plus2) + return secondSqrt * (x > 0 ? 1 : -1) +} + +function getGaussianFactor(area = 0.9999) { + if (area >= 1) { + throw new Error('area should be (0 - 1)') + } + + return Math.sqrt(2) * erfinv(area) +} + +function getLorentzianFactor(area = 0.9999) { if (area >= 1) { throw new Error('area should be (0 - 1)') } @@ -49,6 +77,22 @@ const getLorentzianFactor = (area = 0.9999) => { ) } +function peakShapeFunction(options: PeakShapeOptions, shape: PeakShape) { + if (shape === 'lorentzian') { + return lorentzian(options) + } + + return gaussian(options) +} + +function getPeakShapeFactor(area: number, shape: PeakShape) { + if (shape === 'lorentzian') { + return getLorentzianFactor(area) + } + + return getGaussianFactor(area) +} + function groupEquivalentShifts(shifts: ShiftsItem[], tolerance = 0.001) { const groups: GroupItem[] = [] @@ -81,6 +125,7 @@ export function generatePredictedSpectrumData( frequency = 400, lineWidth = 1, tolerance = 0.001, + peakShape = 'lorentzian', } = options if (!shifts || shifts.length === 0) return [] @@ -107,24 +152,22 @@ export function generatePredictedSpectrumData( const stepSize = (to - from) / (nbPoints - 1) const groupedShifts = groupEquivalentShifts(acceptedShifts, tolerance) - console.log(groupedShifts) - - const limit = (lineWidth * getLorentzianFactor(0.99)) / frequency - console.log(limit) + const limit = (lineWidth * getPeakShapeFactor(0.99, peakShape)) / frequency for (let i = 0; i < nbPoints; i++) { const x = from + i * stepSize let intensity = 0 for (const { prediction, count } of groupedShifts) { if (Math.abs(x - prediction) <= limit) { intensity += - lorentzian2({ x: x - prediction, fwhm: lineWidth / frequency }) * - count + peakShapeFunction( + { x: x - prediction, fwhm: lineWidth / frequency }, + peakShape + ) * count } } - if (intensity > 0) { - data.x.push(x) - data.re.push(intensity) - } + + data.x.push(x) + data.re.push(intensity) } return data diff --git a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts index 7200a9e..578c88c 100644 --- a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts +++ b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts @@ -1,247 +1,248 @@ import { Argv, CommandModule, Options } from 'yargs' import { - generatePredictedSpectrumData, - ShiftsItem, + generatePredictedSpectrumData, + GenerateSpectrumOptions, + ShiftsItem, } from './generatePredictedSpectrumData' import { v4 } from '@lukeed/uuid' import { CURRENT_EXPORT_VERSION } from 'nmr-load-save' import https from 'https' import axios from 'axios' -interface PredictionOptions { - from?: number - to?: number - nbPoints?: number - lineWidth?: number - frequency?: number - tolerance?: number -} - interface PredictionParameters { - molText: string - id: number - type: string - shifts: string - solvent: string - nucleus: string + molText: string + id: number + type: string + shifts: string + solvent: string + nucleus: string } -const predictionOptions: { [key in keyof PredictionOptions]: Options } = { - from: { - type: 'number', - description: 'From in (ppm)', - }, - to: { - type: 'number', - description: 'To in (ppm)', - }, - nbPoints: { - type: 'number', - description: 'Number of points', - default: 1024, - }, - lineWidth: { - type: 'number', - description: 'Line width', - default: 1, - }, - frequency: { - type: 'number', - description: 'NMR frequency (MHz)', - default: 400, - }, - tolerance: { - type: 'number', - description: 'Tolerance', - default: 0.001, - }, +const predictionOptions: { [key in keyof GenerateSpectrumOptions]: Options } = { + from: { + type: 'number', + description: 'From in (ppm)', + }, + to: { + type: 'number', + description: 'To in (ppm)', + }, + nbPoints: { + type: 'number', + description: 'Number of points', + default: 1024, + }, + lineWidth: { + type: 'number', + description: 'Line width', + default: 1, + }, + frequency: { + type: 'number', + description: 'NMR frequency (MHz)', + default: 400, + }, + tolerance: { + type: 'number', + description: 'Tolerance', + default: 0.001, + }, + peakShape: { + alias: 'ps', + type: 'string', + description: 'Peak shape algorithm', + default: 'lorentzian', + choices: ['gaussian', 'lorentzian'], + }, } as const const nmrOptions: { [key in keyof PredictionParameters]: Options } = { - id: { - alias: 'i', - type: 'number', - description: 'Input ID', - default: 1, - }, - type: { - alias: 't', - type: 'string', - description: 'NMR type', - default: 'nmr;1H;1d', - choices: ['nmr;1H;1d', 'nmr;13C;1d'], - }, - shifts: { - alias: 's', - type: 'string', - description: 'Chemical shifts', - default: '1', - }, - solvent: { - type: 'string', - description: 'NMR solvent', - default: 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', - choices: [ - 'Any', - 'Chloroform-D1 (CDCl3)', - 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', - 'Methanol-D4 (CD3OD)', - 'Deuteriumoxide (D2O)', - 'Acetone-D6 ((CD3)2CO)', - 'TETRACHLORO-METHANE (CCl4)', - 'Pyridin-D5 (C5D5N)', - 'Benzene-D6 (C6D6)', - 'neat', - 'Tetrahydrofuran-D8 (THF-D8, C4D4O)', - ], - }, - molText: { - alias: 'm', - type: 'string', - description: 'MOL file content', - requiresArg: true, - }, - nucleus: { - alias: 'n', - type: 'string', - description: 'Predicted nucleus', - requiresArg: true, - choices: ['1H', '13C'], - }, + id: { + alias: 'i', + type: 'number', + description: 'Input ID', + default: 1, + }, + type: { + alias: 't', + type: 'string', + description: 'NMR type', + default: 'nmr;1H;1d', + choices: ['nmr;1H;1d', 'nmr;13C;1d'], + }, + shifts: { + alias: 's', + type: 'string', + description: 'Chemical shifts', + default: '1', + }, + solvent: { + type: 'string', + description: 'NMR solvent', + default: 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', + choices: [ + 'Any', + 'Chloroform-D1 (CDCl3)', + 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', + 'Methanol-D4 (CD3OD)', + 'Deuteriumoxide (D2O)', + 'Acetone-D6 ((CD3)2CO)', + 'TETRACHLORO-METHANE (CCl4)', + 'Pyridin-D5 (C5D5N)', + 'Benzene-D6 (C6D6)', + 'neat', + 'Tetrahydrofuran-D8 (THF-D8, C4D4O)', + ], + }, + molText: { + alias: 'm', + type: 'string', + description: 'MOL file content', + requiresArg: true, + }, + nucleus: { + alias: 'n', + type: 'string', + description: 'Predicted nucleus', + requiresArg: true, + choices: ['1H', '13C'], + }, } as const interface PredictionResponseItem { - id: number - type: string - statistics: { - accept: number - warning: number - reject: number - missing: number - total: number - } - shifts: ShiftsItem[] + id: number + type: string + statistics: { + accept: number + warning: number + reject: number + missing: number + total: number + } + shifts: ShiftsItem[] } interface PredictionResponse { - result: PredictionResponseItem[] + result: PredictionResponseItem[] } async function predictNMR(options: PredictionArgs): Promise { - const url = process.env['NMR_PREDICTION_URL'] - - if (!url) { - throw new Error('Environment variable NMR_PREDICTION_URL is not defined.') - } - - try { - new URL(url).toString() - } catch { - throw new Error(`Invalid URL in NMR_PREDICTION_URL: "${url}"`) - } - - try { - const { - id, - type, - shifts, - solvent, - from, - to, - nbPoints = 1024, - frequency = 400, - lineWidth = 1, - tolerance = 0.001, - molText, - nucleus, - } = options - - const payload: any = { - inputs: [ - { - id, - type, - shifts, - solvent, - }, - ], - moltxt: molText.replaceAll(/\\n/g, '\n'), + const url = process.env['NMR_PREDICTION_URL'] + + if (!url) { + throw new Error('Environment variable NMR_PREDICTION_URL is not defined.') } - const httpsAgent = new https.Agent({ - rejectUnauthorized: false, - }) - - // Axios POST request with httpsAgent - const response = await axios.post(url, payload, { - headers: { - 'Content-Type': 'application/json', - }, - httpsAgent, - }) - - const responseResult: PredictionResponse = response.data - const spectra = [] - - for (const result of responseResult.result) { - const name = v4() - const data = generatePredictedSpectrumData(result.shifts, { - from, - to, - nbPoints, - lineWidth, - frequency, - tolerance, - }) - - const info = { - isFid: false, - isComplex: false, - dimension: 1, - originFrequency: frequency, - baseFrequency: frequency, - pulseSequence: '', - solvent, - isFt: true, - name, - nucleus, - } - - spectra.push({ - id: v4(), - data, - info, - }) + try { + new URL(url).toString() + } catch { + throw new Error(`Invalid URL in NMR_PREDICTION_URL: "${url}"`) } - const nmrium = { data: { spectra }, version: CURRENT_EXPORT_VERSION } - console.log(JSON.stringify(nmrium, null, 2)) - } catch (error) { - console.error( - 'Error:', - error instanceof Error ? error.message : String(error) - ) - - if (axios.isAxiosError(error) && error.response) { - console.error('Response data:', error.response.data) - } else if (error instanceof Error && error.cause) { - console.error('Network Error:', error.cause) + try { + const { + id, + type, + shifts, + solvent, + from, + to, + nbPoints = 1024, + frequency = 400, + lineWidth = 1, + tolerance = 0.001, + molText, + nucleus, + peakShape = "lorentzian", + } = options + + const payload: any = { + inputs: [ + { + id, + type, + shifts, + solvent, + }, + ], + moltxt: molText.replaceAll(/\\n/g, '\n'), + } + + const httpsAgent = new https.Agent({ + rejectUnauthorized: false, + }) + + // Axios POST request with httpsAgent + const response = await axios.post(url, payload, { + headers: { + 'Content-Type': 'application/json', + }, + httpsAgent, + }) + + const responseResult: PredictionResponse = response.data + const spectra = [] + + for (const result of responseResult.result) { + const name = v4() + const data = generatePredictedSpectrumData(result.shifts, { + from, + to, + nbPoints, + lineWidth, + frequency, + tolerance, + peakShape, + }) + + const info = { + isFid: false, + isComplex: false, + dimension: 1, + originFrequency: frequency, + baseFrequency: frequency, + pulseSequence: '', + solvent, + isFt: true, + name, + nucleus, + } + + spectra.push({ + id: v4(), + data, + info, + }) + } + + const nmrium = { data: { spectra }, version: CURRENT_EXPORT_VERSION } + console.log(JSON.stringify(nmrium, null, 2)) + } catch (error) { + console.error( + 'Error:', + error instanceof Error ? error.message : String(error) + ) + + if (axios.isAxiosError(error) && error.response) { + console.error('Response data:', error.response.data) + } else if (error instanceof Error && error.cause) { + console.error('Network Error:', error.cause) + } } - } } -type PredictionArgs = PredictionParameters & PredictionOptions +type PredictionArgs = PredictionParameters & GenerateSpectrumOptions // Define the prediction string command export const parsePredictionCommand: CommandModule<{}, PredictionArgs> = { - command: ['predict', 'p'], - describe: 'Predict NMR spectrum from mol text', - builder: (yargs: Argv<{}>): Argv => { - return yargs.options({ - ...nmrOptions, - ...predictionOptions, - }) as Argv - }, - handler: async argv => { - await predictNMR(argv) - }, + command: ['predict', 'p'], + describe: 'Predict NMR spectrum from mol text', + builder: (yargs: Argv<{}>): Argv => { + return yargs.options({ + ...nmrOptions, + ...predictionOptions, + }) as Argv + }, + handler: async argv => { + await predictNMR(argv) + }, } From 104a5d856c2756d7c69504a62729700126bd997f Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 16 Jun 2025 10:00:40 +0200 Subject: [PATCH 32/44] refactor: change prediction default 'nbPoints' value to 256k --- app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts index 578c88c..635fc39 100644 --- a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts +++ b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts @@ -30,7 +30,7 @@ const predictionOptions: { [key in keyof GenerateSpectrumOptions]: Options } = { nbPoints: { type: 'number', description: 'Number of points', - default: 1024, + default: 2 ** 18, // 256k points }, lineWidth: { type: 'number', @@ -146,7 +146,7 @@ async function predictNMR(options: PredictionArgs): Promise { solvent, from, to, - nbPoints = 1024, + nbPoints = 2 ** 18, // 256K frequency = 400, lineWidth = 1, tolerance = 0.001, From 6e352d5318f1f5d738ab558c654a3594efd66d57 Mon Sep 17 00:00:00 2001 From: hamed-musallam <35760236+hamed-musallam@users.noreply.github.com> Date: Thu, 17 Jul 2025 09:41:00 +0200 Subject: [PATCH 33/44] feat: update nmr-load-save to version 3.6.0 (#82) * feat: update nmr-load-save to version 3.6.0 * chore: update dependencies --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/package-lock.json | 474 ++++++++++++------ app/scripts/nmr-cli/package.json | 14 +- app/scripts/nmr-cli/src/index.ts | 5 +- app/scripts/nmr-cli/src/publication-string.ts | 4 +- 5 files changed, 321 insertions(+), 178 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index d267c31..fc31fb6 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.51.1-jammy +FROM mcr.microsoft.com/playwright:v1.53.0-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 8cfb058..91b878c 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,21 +9,21 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "axios": "^1.9.0", + "axios": "^1.10.0", "filelist-utils": "^1.11.3", - "nmr-load-save": "^3.3.0", - "nmr-processing": "^17.1.3", - "playwright": "^1.51.1", - "yargs": "^17.7.2" + "nmr-load-save": "^3.6.0", + "nmr-processing": "^19.0.0", + "playwright": "^1.53.0", + "yargs": "^18.0.0" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^22.13.13", + "@types/node": "^24.0.3", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.8.2" + "typescript": "^5.8.3" } }, "node_modules/@cspotcode/source-map-support": { @@ -133,12 +133,12 @@ } }, "node_modules/@types/node": { - "version": "22.13.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.13.tgz", - "integrity": "sha512-ClsL5nMwKaBRwPcCvH8E7+nU4GxHVx1axNvMZTFHMEfNI7oahimt26P5zjVCRrjiIWj6YFXfE1v3dEp94wLcGQ==", + "version": "24.0.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", + "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", "dev": true, "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~7.8.0" } }, "node_modules/@types/yargs": { @@ -181,22 +181,22 @@ } }, "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -219,9 +219,9 @@ "integrity": "sha512-ktg7pvTF22Ox/HPJZjUrw3L0dH1nOZg+CjGR0r1iyZO2LDbQX5GgIxOWq4YthifBrcVxfFMkdKVhp5YJ43g0Vw==" }, "node_modules/axios": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", - "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", + "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -276,34 +276,18 @@ "integrity": "sha512-FRcpVkox+cRovffgqNdDFQ1eUav+i/Vq/CUd1hcfEl2bevntFlzznL+jE8g4twl6ElB7gZjCko6pYpXyMn+6dA==" }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", "dependencies": { - "color-name": "~1.1.4" + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=7.0.0" + "node": ">=20" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -345,16 +329,22 @@ "integrity": "sha512-ehXCHYXZhZzDZmVQE/P9wQ7XPOn1G3e+pVqcqXvYykBL8Lg7HFm2ewD3TZseOMWiM9bNU0u4UWSV/dAzf+unug==" }, "node_modules/d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { - "d3-color": "1 - 2" + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/delayed-stream": { @@ -393,9 +383,9 @@ "integrity": "sha512-KYvDeLd4kPxs5rn/GLDQ2FLrncVVqvUfQKkhbYYaM+51zXjQwyOejP5TuAnAjdX6o+PjdMgcfhr3M7h5hQv4yA==" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" }, "node_modules/ensure-string": { "version": "1.2.0", @@ -542,6 +532,17 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-east-asian-width": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", + "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -673,14 +674,6 @@ "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -907,16 +900,15 @@ } }, "node_modules/ml-gsd": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.8.tgz", - "integrity": "sha512-vcy8e1xPJ9fe2GFKMMpttzQUDxgPdo6KLTPU55lfPedL0WH9WRuIxRLbUwLbhYmB2/ZwAhzIspXcxjPCwhtsgA==", + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.0.1.tgz", + "integrity": "sha512-Du0759hFmjz/LXYnbQcnUs7kP/3iczrczwEAax5W9GTVay9YtR6tZ019PJJK4Fw2aZvysUt3MwrnFZUemsHKCQ==", "dependencies": { - "@lukeed/uuid": "^2.0.1", - "cheminfo-types": "^1.7.3", + "cheminfo-types": "^1.8.1", "ml-peak-shape-generator": "^4.1.4", "ml-savitzky-golay-generalized": "^4.2.0", - "ml-spectra-fitting": "^4.2.4", - "ml-spectra-processing": "^14.5.3" + "ml-spectra-fitting": "^5.0.1", + "ml-spectra-processing": "^14.12.0" } }, "node_modules/ml-hash-table": { @@ -940,12 +932,12 @@ } }, "node_modules/ml-levenberg-marquardt": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-4.1.3.tgz", - "integrity": "sha512-CuR8mg1IIgb5IuDkdJBpnHmx+r6FpRDDPvYhAGq+4WVMLw/lu44P6PniyCrdvk1PNBmxVXN/LwBDMpQ/VaWhgA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-5.0.0.tgz", + "integrity": "sha512-vCFoO2DyYKGZFp+KxofN2cAvSc/3gufJHj/oaDHA2nV+NZH509fD7m35zQR2ZXA8fepxpVrwgCAQ0aAIsV2WtA==", "dependencies": { - "is-any-array": "^2.0.0", - "ml-matrix": "^6.10.4" + "is-any-array": "^2.0.1", + "ml-matrix": "^6.12.1" } }, "node_modules/ml-matrix": { @@ -1001,12 +993,11 @@ } }, "node_modules/ml-regression-polynomial": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.1.tgz", - "integrity": "sha512-dNds0VK4nrMyZvwovy9bYo2WaHPstEztPly4EWB8mj+vPcNxyq4a2UiTueR1jwkgLo6/QWDzA+HBsHP7S/0z3A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.2.tgz", + "integrity": "sha512-RkHQeviEi7q6d2npCeH9MiRTPsBBqqSeqiWV3yctTFXvYgavy5MkpnCqGElHDb62Y3cTXlNQpmD4T7LA7yfGvw==", "dependencies": { - "cheminfo-types": "^1.7.3", - "ml-matrix": "^6.11.0", + "ml-matrix": "^6.12.0", "ml-regression-base": "^4.0.0" } }, @@ -1038,15 +1029,15 @@ } }, "node_modules/ml-signal-processing": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.2.0.tgz", - "integrity": "sha512-hLJLrEq7a8Jx+VlXr1zZ8ApUb8EFwPgRacvNQL7LF7BH24uReJbRJVH8tL29ZGrQV4kJ9dxdmiZk+lbnvuhR1g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-2.0.0.tgz", + "integrity": "sha512-U7jY/QvTXKj2fDedOXNQf+hSXclQY+tVdVSsQzIQve6GL5a8W/kBHQ71dq80duNBB9bsv74Y4axOwD1AeMLyOA==", "dependencies": { "baselines": "^1.1.9", "cheminfo-types": "^1.8.1", - "ml-gsd": "^12.1.8", + "ml-gsd": "^13.0.1", "ml-savitzky-golay-generalized": "^4.2.0", - "ml-spectra-processing": "^14.6.2" + "ml-spectra-processing": "^14.12.0" } }, "node_modules/ml-simple-clustering": { @@ -1063,28 +1054,27 @@ } }, "node_modules/ml-spectra-fitting": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.4.tgz", - "integrity": "sha512-iq6yHKqovLeBA1+Lwzhjz3fqDz6j9vR+p5MgNUyO9yfRUOC6YrMfuesopZv7Gj/SuvGGjNWgR3z8XCjjPonedg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-5.0.1.tgz", + "integrity": "sha512-uqSc01tED7PNYYEvtPCAp7QGybZVi1K0HgHlqu5cAxjbpfnDS+XcOc2rTPprf8GoZ9Y3xL/fxyY4Gc5+Dh7e4A==", "dependencies": { "cheminfo-types": "^1.7.2", - "ml-array-max": "^1.2.4", "ml-direct": "^1.0.0", - "ml-levenberg-marquardt": "^4.1.3", + "ml-levenberg-marquardt": "^5.0.0", "ml-peak-shape-generator": "^4.1.4", "ml-spectra-processing": "^14.2.0" } }, "node_modules/ml-spectra-processing": { - "version": "14.10.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.10.0.tgz", - "integrity": "sha512-4fyF6tojgVgh6m9nmFvaIlGhrvHq+swn64IxQ44F4k4o7Qkl8xKOJWfQ4EsfoX66GqZn2PFfcn1xUGRNwB8+3w==", + "version": "14.12.0", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.12.0.tgz", + "integrity": "sha512-RoJj2r4tGElyPDwBzmoCa+j3rLomBzz+JHGVPxf1tASAE82NkjgvuCFZFay+g0DXTkxDGYFxor+zayqA4nQrng==", "dependencies": { "binary-search": "^1.3.6", "cheminfo-types": "^1.8.1", "fft.js": "^4.0.4", "is-any-array": "^2.0.1", - "ml-matrix": "^6.12.0", + "ml-matrix": "^6.12.1", "ml-xsadd": "^3.0.1" } }, @@ -1125,9 +1115,10 @@ } }, "node_modules/nmr-load-save": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.3.0.tgz", - "integrity": "sha512-3sdS18ewAbIV6OaSDlVcq1jViKWHyHjfPm9+ofxFpAChDX+DKr05FEAHmqY21NlvsPDDplYfemTF6d3rnQ0+6A==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.6.0.tgz", + "integrity": "sha512-qwZ54C9CqzZrGfzU6VX9FiaEKGYiXkOg5u3MXQk+4VY7/xDFwilh2EE7A7gIabP1Z7VU3GeOwBSLwjrtBZz4sA==", + "deprecated": "See @zakodium/nmrium-core and @zakodium/nmrium-core-plugins", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/lodash.merge": "^4.6.9", @@ -1152,10 +1143,75 @@ "varian-converter": "^2.0.1" } }, - "node_modules/nmr-processing": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.1.3.tgz", - "integrity": "sha512-ymzYbLRhqLywDOOIglY9UuCiyVqwue2DKqjaROHq8x9mR4GY9Uv+BMj4jM5CC71A4tR0SjJnK3Ha+meYkT/MEw==", + "node_modules/nmr-load-save/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/nmr-load-save/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/nmr-load-save/node_modules/get-value": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", + "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==" + }, + "node_modules/nmr-load-save/node_modules/ml-gsd": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.8.tgz", + "integrity": "sha512-vcy8e1xPJ9fe2GFKMMpttzQUDxgPdo6KLTPU55lfPedL0WH9WRuIxRLbUwLbhYmB2/ZwAhzIspXcxjPCwhtsgA==", + "dependencies": { + "@lukeed/uuid": "^2.0.1", + "cheminfo-types": "^1.7.3", + "ml-peak-shape-generator": "^4.1.4", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-spectra-fitting": "^4.2.4", + "ml-spectra-processing": "^14.5.3" + } + }, + "node_modules/nmr-load-save/node_modules/ml-levenberg-marquardt": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-4.1.3.tgz", + "integrity": "sha512-CuR8mg1IIgb5IuDkdJBpnHmx+r6FpRDDPvYhAGq+4WVMLw/lu44P6PniyCrdvk1PNBmxVXN/LwBDMpQ/VaWhgA==", + "dependencies": { + "is-any-array": "^2.0.0", + "ml-matrix": "^6.10.4" + } + }, + "node_modules/nmr-load-save/node_modules/ml-signal-processing": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.2.0.tgz", + "integrity": "sha512-hLJLrEq7a8Jx+VlXr1zZ8ApUb8EFwPgRacvNQL7LF7BH24uReJbRJVH8tL29ZGrQV4kJ9dxdmiZk+lbnvuhR1g==", + "dependencies": { + "baselines": "^1.1.9", + "cheminfo-types": "^1.8.1", + "ml-gsd": "^12.1.8", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-spectra-processing": "^14.6.2" + } + }, + "node_modules/nmr-load-save/node_modules/ml-spectra-fitting": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.4.tgz", + "integrity": "sha512-iq6yHKqovLeBA1+Lwzhjz3fqDz6j9vR+p5MgNUyO9yfRUOC6YrMfuesopZv7Gj/SuvGGjNWgR3z8XCjjPonedg==", + "dependencies": { + "cheminfo-types": "^1.7.2", + "ml-array-max": "^1.2.4", + "ml-direct": "^1.0.0", + "ml-levenberg-marquardt": "^4.1.3", + "ml-peak-shape-generator": "^4.1.4", + "ml-spectra-processing": "^14.2.0" + } + }, + "node_modules/nmr-load-save/node_modules/nmr-processing": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.3.1.tgz", + "integrity": "sha512-W2BDtxiPOTidZJfvKWfK/7S5vcP847Hj54oemhnXxY8kzETg9M9b1ndnqULGNECeeapEdSvwOAKlKEph8hjrcg==", "dependencies": { "@lukeed/uuid": "^2.0.1", "@types/d3-color": "^3.1.3", @@ -1184,13 +1240,102 @@ "ml-signal-processing": "^1.2.0", "ml-simple-clustering": "^0.1.0", "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.10.0", + "ml-spectra-processing": "^14.11.0", "ml-tree-set": "^0.1.1", "multiplet-analysis": "^2.1.5", "nmr-correlation": "^2.3.5", "numeral": "^2.0.6", - "openchemlib-utils": "^6.6.0", - "spectrum-generator": "^8.0.12" + "openchemlib-utils": "^6.7.0", + "spectrum-generator": "^8.1.0" + } + }, + "node_modules/nmr-load-save/node_modules/nmr-processing/node_modules/openchemlib-utils": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-6.7.0.tgz", + "integrity": "sha512-NxSNqnntIVBdBDKG0eAiqUsVE5N6xOeoif0EIktMRTjWtakRxFq5VR1CniBnwPA6J8MYY8D7wolRYWn/3Cu3+Q==", + "dependencies": { + "@lukeed/uuid": "^2.0.1", + "atom-sorter": "^2.2.0", + "ensure-string": "^1.2.0", + "get-value": "^4.0.1", + "ml-floyd-warshall": "^3.0.1", + "ml-matrix": "^6.12.1", + "papaparse": "^5.5.2", + "sdf-parser": "^7.0.4" + }, + "peerDependencies": { + "openchemlib": ">=8.18.1" + } + }, + "node_modules/nmr-processing": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-19.0.0.tgz", + "integrity": "sha512-Yjq1LKPx0iVODqo/hNpsNqIGFUI3dJK50ZIKSd3iuXgKuX9Eh0NxHvvfnO4YcRHplojnvK/5F0IldfY5+LLGfA==", + "dependencies": { + "binary-search": "^1.3.6", + "d3-color": "3.1.0", + "d3-interpolate": "^3.0.1", + "gyromagnetic-ratio": "^2.0.0", + "is-any-array": "^2.0.1", + "linear-sum-assignment": "^1.0.7", + "ml-airpls": "^2.0.0", + "ml-convolution": "^2.0.0", + "ml-direct": "^1.0.0", + "ml-gsd": "^13.0.1", + "ml-hclust": "^3.1.0", + "ml-levenberg-marquardt": "^5.0.0", + "ml-matrix": "^6.12.1", + "ml-matrix-convolution": "^1.0.0", + "ml-matrix-peaks-finder": "^1.0.0", + "ml-peak-shape-generator": "^4.1.4", + "ml-regression-base": "^4.0.0", + "ml-regression-exponential": "^3.0.2", + "ml-regression-polynomial": "^3.0.2", + "ml-regression-simple-linear": "^3.0.1", + "ml-savitzky-golay-generalized": "^4.2.0", + "ml-signal-processing": "^2.0.0", + "ml-simple-clustering": "^0.1.0", + "ml-sparse-matrix": "^2.1.0", + "ml-spectra-processing": "^14.12.0", + "ml-tree-set": "^0.1.1", + "multiplet-analysis": "^2.1.5", + "nmr-correlation": "^2.3.5", + "numeral": "^2.0.6", + "openchemlib-utils": "^8.1.1", + "spectrum-generator": "^8.1.0" + } + }, + "node_modules/nmr-processing/node_modules/get-value": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", + "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==" + }, + "node_modules/nmr-processing/node_modules/gyromagnetic-ratio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", + "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==" + }, + "node_modules/nmr-processing/node_modules/openchemlib": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.2.0.tgz", + "integrity": "sha512-MM5GcbYNBzWpsVDYJP4TNMftvA/+sYigLihKl/T3Qn2tZZFNXEPbiUbfBM39HQalpEpb5oFWhbjW+T4TydFbhg==", + "peer": true + }, + "node_modules/nmr-processing/node_modules/openchemlib-utils": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.1.2.tgz", + "integrity": "sha512-j/kEkI0D0JfiRCUXCPt+Vn1ZY9gzC2K05+sXoF++xH8lymIuBECQOOdU4yxZ/7yfXTyGxYfKzMXUJLHCKZrjzQ==", + "dependencies": { + "atom-sorter": "^2.2.0", + "ensure-string": "^1.2.0", + "get-value": "^4.0.1", + "ml-floyd-warshall": "^3.0.1", + "ml-matrix": "^6.12.1", + "papaparse": "^5.5.3", + "sdf-parser": "^7.0.4" + }, + "peerDependencies": { + "openchemlib": ">=9.0.0" } }, "node_modules/nmredata": { @@ -1261,16 +1406,16 @@ "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" }, "node_modules/papaparse": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.2.tgz", - "integrity": "sha512-PZXg8UuAc4PcVwLosEEDYjPyfWnTEhOrUfdv+3Bx+NuAb+5NhDmXzg5fHWmdCh1mP5p7JAZfFr3IMQfcntNAdA==" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", + "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==" }, "node_modules/playwright": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz", - "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", + "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", "dependencies": { - "playwright-core": "1.51.1" + "playwright-core": "1.53.0" }, "bin": { "playwright": "cli.js" @@ -1283,9 +1428,9 @@ } }, "node_modules/playwright-core": { - "version": "1.51.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz", - "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==", + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", + "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", "bin": { "playwright-core": "cli.js" }, @@ -1317,14 +1462,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -1345,12 +1482,12 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/spectrum-generator": { - "version": "8.0.12", - "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.0.12.tgz", - "integrity": "sha512-7CG714g2yANDIqfFu8gj1EZk0qxqjL7L9IQtLMYR5ZybkG+O3TnQkMtXKu3tcm6B4oo2qBTNLgSUOh0NTXHYSw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.1.0.tgz", + "integrity": "sha512-OJxJ7fGR+cJ9AyQegeaKaZtjGh+lxk/9A6UFBoeodduI82VIKpm0bjjSd2Q6t5BIFLsYicbMztY1hcx+55Oe2w==", "dependencies": { "ml-peak-shape-generator": "^4.1.4", - "ml-spectra-processing": "^14.8.0" + "ml-spectra-processing": "^14.10.0" } }, "node_modules/string_decoder": { @@ -1362,27 +1499,33 @@ } }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "ansi-regex": "^5.0.1" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/ts-node": { @@ -1429,9 +1572,9 @@ } }, "node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -1447,9 +1590,9 @@ "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==" }, "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", "dev": true }, "node_modules/util-deprecate": { @@ -1474,16 +1617,16 @@ } }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=10" + "node": ">=18" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -1498,28 +1641,27 @@ } }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^9.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^7.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^22.0.0" }, "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", "engines": { - "node": ">=12" + "node": "^20.19.0 || ^22.12.0 || >=23" } }, "node_modules/yn": { diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 20f1010..71d0510 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,17 +15,17 @@ "nmr-cli": "./build/index.js" }, "dependencies": { - "axios": "^1.9.0", + "axios": "^1.10.0", "filelist-utils": "^1.11.3", - "nmr-load-save": "^3.3.0", - "nmr-processing": "^17.1.3", - "playwright": "^1.51.1", - "yargs": "^17.7.2" + "nmr-load-save": "^3.6.0", + "nmr-processing": "^19.0.0", + "playwright": "^1.53.0", + "yargs": "^18.0.0" }, "devDependencies": { - "@types/node": "^22.13.13", + "@types/node": "^24.0.3", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.8.2" + "typescript": "^5.8.3" } } diff --git a/app/scripts/nmr-cli/src/index.ts b/app/scripts/nmr-cli/src/index.ts index 3d20466..4d85eda 100755 --- a/app/scripts/nmr-cli/src/index.ts +++ b/app/scripts/nmr-cli/src/index.ts @@ -3,6 +3,7 @@ import yargs, { type Argv, type CommandModule, type Options } from 'yargs' import { loadSpectrumFromURL, loadSpectrumFromFilePath } from './prase-spectra' import { generateSpectrumFromPublicationString } from './publication-string' import { parsePredictionCommand } from './prediction/parsePredictionCommand' +import { hideBin } from 'yargs/helpers'; const usageMessage = ` Usage: nmr-cli [options] @@ -118,11 +119,11 @@ const parsePublicationCommand: CommandModule = { }, } -yargs +yargs(hideBin(process.argv)) .usage(usageMessage) .command(parseFileCommand) .command(parsePublicationCommand) .command(parsePredictionCommand) .showHelpOnFail(true) .help() - .parse() + .parse() \ No newline at end of file diff --git a/app/scripts/nmr-cli/src/publication-string.ts b/app/scripts/nmr-cli/src/publication-string.ts index 3bd994a..4251843 100644 --- a/app/scripts/nmr-cli/src/publication-string.ts +++ b/app/scripts/nmr-cli/src/publication-string.ts @@ -1,4 +1,4 @@ -import { resurrect, rangesToXY, type NMRRange } from 'nmr-processing'; +import { resurrect, rangesToXY, type NMRRangeWithIntegration } from 'nmr-processing'; import { v4 } from '@lukeed/uuid'; import { CURRENT_EXPORT_VERSION } from 'nmr-load-save'; import { castToArray } from './utilities/castToArray' @@ -9,7 +9,7 @@ interface Info { } function generateSpectrumFromRanges( - ranges: NMRRange[], + ranges: NMRRangeWithIntegration[], info: Info, ) { const { nucleus, solvent, name = null } = info; From 3e1cc624b81e99945d4817d9535a083e6ef9e8d5 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Thu, 17 Jul 2025 10:00:24 +0200 Subject: [PATCH 34/44] feat: migrate to nmrium-core and nmrium-core-plugins --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/package-lock.json | 421 +++++------------ app/scripts/nmr-cli/package.json | 7 +- app/scripts/nmr-cli/src/index.ts | 4 +- app/scripts/nmr-cli/src/prase-spectra.ts | 191 ++++---- .../src/prediction/parsePredictionCommand.ts | 429 +++++++++--------- app/scripts/nmr-cli/src/publication-string.ts | 117 ++--- .../nmr-cli/src/utilities/castToArray.ts | 4 +- app/scripts/nmr-cli/tsconfig.json | 13 +- 9 files changed, 506 insertions(+), 682 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index fc31fb6..1b19de7 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.53.0-jammy +FROM mcr.microsoft.com/playwright:v1.54.1-jammy SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 91b878c..f3447c7 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,18 +9,19 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@zakodium/nmrium-core": "^0.1.3", + "@zakodium/nmrium-core-plugins": "^0.1.4", "axios": "^1.10.0", "filelist-utils": "^1.11.3", - "nmr-load-save": "^3.6.0", "nmr-processing": "^19.0.0", - "playwright": "^1.53.0", + "playwright": "^1.54.1", "yargs": "^18.0.0" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^24.0.3", + "@types/node": "^24.0.14", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", "typescript": "^5.8.3" @@ -106,37 +107,12 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@types/d3-color": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", - "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==" - }, - "node_modules/@types/d3-interpolate": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", - "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", - "dependencies": { - "@types/d3-color": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.17.16", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.16.tgz", - "integrity": "sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==" - }, - "node_modules/@types/lodash.merge": { - "version": "4.6.9", - "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz", - "integrity": "sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==", - "dependencies": { - "@types/lodash": "*" - } - }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "version": "24.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", + "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~7.8.0" } @@ -156,6 +132,92 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@zakodium/nmrium-core": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core/-/nmrium-core-0.1.3.tgz", + "integrity": "sha512-bizm794rvhRdyxSvu6hbRbPo3XkvvVr8/gl8eIXzMjfjBJ7dQYDJxECzSxt1dqSosAXEImXaQPH6VgzlOgv5Og==", + "license": "CC-BY-NC-SA-4.0", + "dependencies": { + "cheminfo-types": "^1.8.1", + "fifo-logger": "^1.0.0", + "filelist-utils": "^1.11.3", + "is-any-array": "^2.0.1", + "lodash.merge": "^4.6.2", + "ml-spectra-processing": "^14.12.0", + "nmr-correlation": "^2.3.5" + } + }, + "node_modules/@zakodium/nmrium-core-plugins": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core-plugins/-/nmrium-core-plugins-0.1.4.tgz", + "integrity": "sha512-OwfMGkSNIAslXSBAOjHIZGdgxKakJZk+xiMYTQuODMCGJyR9OnKceM7XqZJ6Kz6HeTzZTDrRt3E40Wis2JGkVw==", + "license": "CC-BY-NC-SA-4.0", + "dependencies": { + "@zakodium/nmrium-core": "^0.1.3", + "cheminfo-types": "^1.8.1", + "convert-to-jcamp": "^5.4.11", + "filelist-utils": "^1.11.3", + "gyromagnetic-ratio": "^2.0.0", + "is-any-array": "^2.0.1", + "jcampconverter": "^11.0.3", + "linear-sum-assignment": "^1.0.7", + "lodash.merge": "^4.6.2", + "ml-spectra-processing": "^14.12.0", + "nmr-processing": "^19.0.0", + "nmredata": "^1.0.1", + "openchemlib": "^9.2.0", + "openchemlib-utils": "^8.1.1", + "sdf-parser": "^7.0.4" + } + }, + "node_modules/@zakodium/nmrium-core-plugins/node_modules/get-value": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", + "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==", + "license": "MIT" + }, + "node_modules/@zakodium/nmrium-core-plugins/node_modules/gyromagnetic-ratio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", + "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==", + "license": "MIT" + }, + "node_modules/@zakodium/nmrium-core-plugins/node_modules/nmredata": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-1.0.1.tgz", + "integrity": "sha512-vw4cuMj6hr6q73TGf83E4hcZ8UEr+VIFigKvhju+R4v1Z2m+K7oNrxp80ImN917ZGqFQ4gHOub842iFaGhoLJg==", + "license": "MIT", + "dependencies": { + "filelist-utils": "^1.11.3", + "jszip": "^3.10.1", + "openchemlib": "^9.1.1", + "openchemlib-utils": "^8.1.1" + } + }, + "node_modules/@zakodium/nmrium-core-plugins/node_modules/openchemlib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.6.0.tgz", + "integrity": "sha512-SAMLSwOQTCDNpfNu/WTQpzLMYTRj/xwetMPRoAGHeR2J162RP/OI6vHpVcC7L4V7ThMW3ZhMf7GdH04yndmHtw==", + "license": "BSD-3-Clause" + }, + "node_modules/@zakodium/nmrium-core-plugins/node_modules/openchemlib-utils": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.2.0.tgz", + "integrity": "sha512-QrF/9gCNQ0uB4WTku9N3mvorCyt6fuAI9e73BaXfd6h4+uz9nbqvJNQpM39Z5m8Cz9Zd0geq7o7zRneX6BEXMA==", + "license": "MIT", + "dependencies": { + "atom-sorter": "^2.2.0", + "ensure-string": "^1.2.0", + "get-value": "^4.0.1", + "ml-floyd-warshall": "^3.0.1", + "ml-matrix": "^6.12.1", + "papaparse": "^5.5.3", + "sdf-parser": "^7.0.4" + }, + "peerDependencies": { + "openchemlib": ">=9.3.0" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -245,19 +307,6 @@ "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" }, - "node_modules/brukerconverter": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/brukerconverter/-/brukerconverter-8.0.3.tgz", - "integrity": "sha512-SLDPH+fD5zTp9qb9NESTT1xWFI6mN4yWT5tdSROPbdCD6zgv6F8fb4VRbyWw0fHs//HH2/8PRFkPd5LejiXcwg==", - "dependencies": { - "cheminfo-types": "^1.8.1", - "filelist-utils": "^1.11.2", - "iobuffer": "^5.3.2", - "is-any-array": "^2.0.1", - "jcampconverter": "^11.0.1", - "ml-spectra-processing": "^14.9.2" - } - }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -578,17 +627,6 @@ "node": ">= 0.4" } }, - "node_modules/get-value": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-3.0.1.tgz", - "integrity": "sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=6.0" - } - }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -600,11 +638,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gyromagnetic-ratio": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-1.2.1.tgz", - "integrity": "sha512-cOkHEsIwHNKe8v/wED9NWa8wvzLx0rpBarUrEpvzdgECMpVQzrLJkaFYsdSxnhaUtWX4uNFxX01PJeFayDCpVA==" - }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -664,11 +697,6 @@ "node": ">= 0.10" } }, - "node_modules/iobuffer": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz", - "integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==" - }, "node_modules/is-any-array": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", @@ -679,14 +707,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isutf8": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-4.0.1.tgz", @@ -696,24 +716,30 @@ } }, "node_modules/jcampconverter": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-11.0.1.tgz", - "integrity": "sha512-8i01PC5WhUMH9H2AIssOhqSJpgjftJFQ2MUcYSgqKzy3QemQ8D7M960Ab+jba0wO4ThWYSp1xKMBmoL6zuEYQA==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-11.0.3.tgz", + "integrity": "sha512-vnm7QjVb5RMf8BFmGa0XzHW+fbI2ESpIPiZc+9brB4XVteYoZOwp2Mprx0vZfJYitK8CEHOY2aLAwDr9XV72Yw==", + "license": "CC-BY-NC-SA-4.0", "dependencies": { "cheminfo-types": "^1.8.1", "dynamic-typing": "^1.0.1", "ensure-string": "^1.2.0", - "gyromagnetic-ratio": "^1.2.1", - "ml-array-median": "^1.1.6" + "gyromagnetic-ratio": "^2.0.0", + "ml-array-median": "^1.1.6", + "openchemlib": "^9.2.0" } }, - "node_modules/jeolconverter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/jeolconverter/-/jeolconverter-1.0.4.tgz", - "integrity": "sha512-p4MwOtP5QcBqvdr4jha0fQiOcArRf6K8CwwElpaG7chbmBuEf2FQpZj5QFP9VJQa3I1C3U3tzw5bM+QG388sWQ==", - "dependencies": { - "iobuffer": "^5.3.2" - } + "node_modules/jcampconverter/node_modules/gyromagnetic-ratio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", + "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==", + "license": "MIT" + }, + "node_modules/jcampconverter/node_modules/openchemlib": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.6.0.tgz", + "integrity": "sha512-SAMLSwOQTCDNpfNu/WTQpzLMYTRj/xwetMPRoAGHeR2J162RP/OI6vHpVcC7L4V7ThMW3ZhMf7GdH04yndmHtw==", + "license": "BSD-3-Clause" }, "node_modules/jszip": { "version": "3.10.1", @@ -1114,159 +1140,6 @@ "ml-peak-shape-generator": "^4.1.4" } }, - "node_modules/nmr-load-save": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/nmr-load-save/-/nmr-load-save-3.6.0.tgz", - "integrity": "sha512-qwZ54C9CqzZrGfzU6VX9FiaEKGYiXkOg5u3MXQk+4VY7/xDFwilh2EE7A7gIabP1Z7VU3GeOwBSLwjrtBZz4sA==", - "deprecated": "See @zakodium/nmrium-core and @zakodium/nmrium-core-plugins", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "@types/lodash.merge": "^4.6.9", - "brukerconverter": "^8.0.3", - "cheminfo-types": "^1.8.1", - "convert-to-jcamp": "^5.4.11", - "fifo-logger": "^1.0.0", - "filelist-utils": "^1.11.3", - "gyromagnetic-ratio": "^1.2.1", - "is-any-array": "^2.0.1", - "jcampconverter": "^11.0.1", - "jeolconverter": "^1.0.4", - "linear-sum-assignment": "^1.0.7", - "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.10.0", - "nmr-correlation": "^2.3.5", - "nmr-processing": "^17.1.1", - "nmredata": "^0.9.11", - "openchemlib": "^8.19.0", - "openchemlib-utils": "^6.6.0", - "sdf-parser": "^7.0.4", - "varian-converter": "^2.0.1" - } - }, - "node_modules/nmr-load-save/node_modules/d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" - }, - "node_modules/nmr-load-save/node_modules/d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", - "dependencies": { - "d3-color": "1 - 2" - } - }, - "node_modules/nmr-load-save/node_modules/get-value": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", - "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==" - }, - "node_modules/nmr-load-save/node_modules/ml-gsd": { - "version": "12.1.8", - "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-12.1.8.tgz", - "integrity": "sha512-vcy8e1xPJ9fe2GFKMMpttzQUDxgPdo6KLTPU55lfPedL0WH9WRuIxRLbUwLbhYmB2/ZwAhzIspXcxjPCwhtsgA==", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "cheminfo-types": "^1.7.3", - "ml-peak-shape-generator": "^4.1.4", - "ml-savitzky-golay-generalized": "^4.2.0", - "ml-spectra-fitting": "^4.2.4", - "ml-spectra-processing": "^14.5.3" - } - }, - "node_modules/nmr-load-save/node_modules/ml-levenberg-marquardt": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-4.1.3.tgz", - "integrity": "sha512-CuR8mg1IIgb5IuDkdJBpnHmx+r6FpRDDPvYhAGq+4WVMLw/lu44P6PniyCrdvk1PNBmxVXN/LwBDMpQ/VaWhgA==", - "dependencies": { - "is-any-array": "^2.0.0", - "ml-matrix": "^6.10.4" - } - }, - "node_modules/nmr-load-save/node_modules/ml-signal-processing": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-1.2.0.tgz", - "integrity": "sha512-hLJLrEq7a8Jx+VlXr1zZ8ApUb8EFwPgRacvNQL7LF7BH24uReJbRJVH8tL29ZGrQV4kJ9dxdmiZk+lbnvuhR1g==", - "dependencies": { - "baselines": "^1.1.9", - "cheminfo-types": "^1.8.1", - "ml-gsd": "^12.1.8", - "ml-savitzky-golay-generalized": "^4.2.0", - "ml-spectra-processing": "^14.6.2" - } - }, - "node_modules/nmr-load-save/node_modules/ml-spectra-fitting": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-4.2.4.tgz", - "integrity": "sha512-iq6yHKqovLeBA1+Lwzhjz3fqDz6j9vR+p5MgNUyO9yfRUOC6YrMfuesopZv7Gj/SuvGGjNWgR3z8XCjjPonedg==", - "dependencies": { - "cheminfo-types": "^1.7.2", - "ml-array-max": "^1.2.4", - "ml-direct": "^1.0.0", - "ml-levenberg-marquardt": "^4.1.3", - "ml-peak-shape-generator": "^4.1.4", - "ml-spectra-processing": "^14.2.0" - } - }, - "node_modules/nmr-load-save/node_modules/nmr-processing": { - "version": "17.3.1", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-17.3.1.tgz", - "integrity": "sha512-W2BDtxiPOTidZJfvKWfK/7S5vcP847Hj54oemhnXxY8kzETg9M9b1ndnqULGNECeeapEdSvwOAKlKEph8hjrcg==", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "@types/d3-color": "^3.1.3", - "@types/d3-interpolate": "^3.0.4", - "binary-search": "^1.3.6", - "d3-color": "^2.0.0", - "d3-interpolate": "^2.0.1", - "gyromagnetic-ratio": "^1.2.1", - "is-any-array": "^2.0.1", - "linear-sum-assignment": "^1.0.7", - "ml-airpls": "^2.0.0", - "ml-convolution": "^2.0.0", - "ml-direct": "^1.0.0", - "ml-gsd": "^12.1.8", - "ml-hclust": "^3.1.0", - "ml-levenberg-marquardt": "^4.1.3", - "ml-matrix": "^6.12.1", - "ml-matrix-convolution": "^1.0.0", - "ml-matrix-peaks-finder": "^1.0.0", - "ml-peak-shape-generator": "^4.1.4", - "ml-regression-base": "^4.0.0", - "ml-regression-exponential": "^3.0.2", - "ml-regression-polynomial": "^3.0.1", - "ml-regression-simple-linear": "^3.0.1", - "ml-savitzky-golay-generalized": "^4.2.0", - "ml-signal-processing": "^1.2.0", - "ml-simple-clustering": "^0.1.0", - "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.11.0", - "ml-tree-set": "^0.1.1", - "multiplet-analysis": "^2.1.5", - "nmr-correlation": "^2.3.5", - "numeral": "^2.0.6", - "openchemlib-utils": "^6.7.0", - "spectrum-generator": "^8.1.0" - } - }, - "node_modules/nmr-load-save/node_modules/nmr-processing/node_modules/openchemlib-utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-6.7.0.tgz", - "integrity": "sha512-NxSNqnntIVBdBDKG0eAiqUsVE5N6xOeoif0EIktMRTjWtakRxFq5VR1CniBnwPA6J8MYY8D7wolRYWn/3Cu3+Q==", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "atom-sorter": "^2.2.0", - "ensure-string": "^1.2.0", - "get-value": "^4.0.1", - "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.12.1", - "papaparse": "^5.5.2", - "sdf-parser": "^7.0.4" - }, - "peerDependencies": { - "openchemlib": ">=8.18.1" - } - }, "node_modules/nmr-processing": { "version": "19.0.0", "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-19.0.0.tgz", @@ -1338,17 +1211,6 @@ "openchemlib": ">=9.0.0" } }, - "node_modules/nmredata": { - "version": "0.9.11", - "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-0.9.11.tgz", - "integrity": "sha512-eaql8S2eGh22lrAungs3a7+PthuFHIs5Y6q6/oeg4fxRQiENVkdNXeJ+zFm/+BSX1z4nnmCCNl2MiRyB2ZxLEg==", - "dependencies": { - "filelist-utils": "^1.11.0", - "jszip": "^3.10.1", - "openchemlib": "^8.14.0", - "openchemlib-utils": "^6.1.0" - } - }, "node_modules/num-sort": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz", @@ -1368,38 +1230,6 @@ "node": "*" } }, - "node_modules/openchemlib": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-8.19.0.tgz", - "integrity": "sha512-MLt6rFzVIcQ7MWBUu1htKlnA7SDIBkzYSXlIjZ4eVJ36RJBA81TIn7pkhSNoclWNVjVnMoIVXd1su1PbN25S/A==" - }, - "node_modules/openchemlib-utils": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-6.6.0.tgz", - "integrity": "sha512-t8tsV0qAB28HE/mnE4F9YZjwlnnGaaqeYTPDjd1m5r2g5pGJEYY9Zt09MI1YWoLU/jNElYdb8LsGkO7zlwLoIQ==", - "dependencies": { - "@lukeed/uuid": "^2.0.1", - "atom-sorter": "^2.2.0", - "ensure-string": "^1.2.0", - "get-value": "^3.0.1", - "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.12.0", - "papaparse": "^5.5.2", - "sdf-parser": "^6.0.1" - }, - "peerDependencies": { - "openchemlib": ">=8.18.1" - } - }, - "node_modules/openchemlib-utils/node_modules/sdf-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-6.0.1.tgz", - "integrity": "sha512-QorgjqiqTzodCMmYkWYkYJ9nBnOL3w3mWOE9BB1SATUfkFvLOSxHaeZAnJxrHlRkfI7+q3+FsvZOS2OTN74lNA==", - "dependencies": { - "dynamic-typing": "^1.0.0", - "ensure-string": "^1.2.0" - } - }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -1411,11 +1241,12 @@ "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==" }, "node_modules/playwright": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", - "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", + "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.0" + "playwright-core": "1.54.1" }, "bin": { "playwright": "cli.js" @@ -1428,9 +1259,10 @@ } }, "node_modules/playwright-core": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", - "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", + "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, @@ -1576,6 +1408,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1606,16 +1439,6 @@ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, - "node_modules/varian-converter": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/varian-converter/-/varian-converter-2.0.1.tgz", - "integrity": "sha512-bvOZ74Zs/Hbht7GDCC6Z/jQOrCyczjItfT5KOJsAG4Ty3MQBvjHf16GwuuWpBnmNRUezLjZ2v+bSS/wVyPXYQQ==", - "dependencies": { - "filelist-utils": "^1.11.0", - "iobuffer": "^5.3.2", - "ml-spectra-processing": "^14.2.0" - } - }, "node_modules/wrap-ansi": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 71d0510..b63a679 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,15 +15,16 @@ "nmr-cli": "./build/index.js" }, "dependencies": { + "@zakodium/nmrium-core": "^0.1.3", + "@zakodium/nmrium-core-plugins": "^0.1.4", "axios": "^1.10.0", "filelist-utils": "^1.11.3", - "nmr-load-save": "^3.6.0", "nmr-processing": "^19.0.0", - "playwright": "^1.53.0", + "playwright": "^1.54.1", "yargs": "^18.0.0" }, "devDependencies": { - "@types/node": "^24.0.3", + "@types/node": "^24.0.14", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", "typescript": "^5.8.3" diff --git a/app/scripts/nmr-cli/src/index.ts b/app/scripts/nmr-cli/src/index.ts index 4d85eda..95b810d 100755 --- a/app/scripts/nmr-cli/src/index.ts +++ b/app/scripts/nmr-cli/src/index.ts @@ -3,7 +3,7 @@ import yargs, { type Argv, type CommandModule, type Options } from 'yargs' import { loadSpectrumFromURL, loadSpectrumFromFilePath } from './prase-spectra' import { generateSpectrumFromPublicationString } from './publication-string' import { parsePredictionCommand } from './prediction/parsePredictionCommand' -import { hideBin } from 'yargs/helpers'; +import { hideBin } from 'yargs/helpers' const usageMessage = ` Usage: nmr-cli [options] @@ -126,4 +126,4 @@ yargs(hideBin(process.argv)) .command(parsePredictionCommand) .showHelpOnFail(true) .help() - .parse() \ No newline at end of file + .parse() diff --git a/app/scripts/nmr-cli/src/prase-spectra.ts b/app/scripts/nmr-cli/src/prase-spectra.ts index b107ecc..39937b1 100644 --- a/app/scripts/nmr-cli/src/prase-spectra.ts +++ b/app/scripts/nmr-cli/src/prase-spectra.ts @@ -1,129 +1,130 @@ -import { join, isAbsolute } from "path"; -import { type NmriumState, read } from "nmr-load-save"; -import { fileCollectionFromWebSource, fileCollectionFromPath } from "filelist-utils"; -import playwright from 'playwright'; - +import { join, isAbsolute } from 'path' +import { type NmriumState } from '@zakodium/nmrium-core' +import init from '@zakodium/nmrium-core-plugins' +import { + fileCollectionFromWebSource, + fileCollectionFromPath, +} from 'filelist-utils' +import playwright from 'playwright' interface Snapshot { - image: string, - id: string; + image: string + id: string } +const core = init() function generateNMRiumURL() { - const baseURL = process.env['BASE_NMRIUM_URL'] || ''; - const url = new URL(baseURL) - url.searchParams.append('workspace', "embedded") - return url.toString() + const baseURL = process.env['BASE_NMRIUM_URL'] || '' + const url = new URL(baseURL) + url.searchParams.append('workspace', 'embedded') + return url.toString() } - async function captureSpectraViewAsBase64(nmriumState: Partial) { - const { data: { spectra } = { spectra: [] }, version } = nmriumState; - const browser = await playwright.chromium.launch() - const context = await browser.newContext(playwright.devices['Desktop Chrome HiDPI']) - const page = await context.newPage() - - const url = generateNMRiumURL() - - await page.goto(url) + const { data: { spectra } = { spectra: [] }, version } = nmriumState + const browser = await playwright.chromium.launch() + const context = await browser.newContext( + playwright.devices['Desktop Chrome HiDPI'] + ) + const page = await context.newPage() - await page.locator('text=Loading').waitFor({ state: 'hidden' }); + const url = generateNMRiumURL() - let snapshots: Snapshot[] = [] + await page.goto(url) - for (const spectrum of spectra || []) { - const spectrumObject = { - version, - data: { - spectra: [{ ...spectrum }], - } + await page.locator('text=Loading').waitFor({ state: 'hidden' }) - } + let snapshots: Snapshot[] = [] - // convert typed array to array - const stringObject = JSON.stringify(spectrumObject, (key, value: unknown) => { - return ArrayBuffer.isView(value) ? Array.from(value as unknown as Iterable) : value - }) + for (const spectrum of spectra || []) { + const spectrumObject = { + version, + data: { + spectra: [{ ...spectrum }], + }, + } - // load the spectrum into NMRium using the custom event - await page.evaluate( - ` + // convert typed array to array + const stringObject = JSON.stringify( + spectrumObject, + (key, value: unknown) => { + return ArrayBuffer.isView(value) + ? Array.from(value as unknown as Iterable) + : value + } + ) + + // load the spectrum into NMRium using the custom event + await page.evaluate( + ` window.postMessage({ type: "nmr-wrapper:load", data:{data: ${stringObject},type:"nmrium"}}, '*'); ` - ) - - //wait for NMRium process and load spectra - await page.locator('text=Loading').waitFor({ state: 'hidden' }); - - // take a snapshot for the spectrum - try { - const snapshot = await page.locator('#nmrSVG .container').screenshot() - - snapshots.push({ - image: snapshot.toString('base64'), - id: spectrum.id, - }) - } catch (e) { - console.log(e) - } - } + ) - await context.close() - await browser.close() + //wait for NMRium process and load spectra + await page.locator('text=Loading').waitFor({ state: 'hidden' }) - return snapshots; -} + // take a snapshot for the spectrum + try { + const snapshot = await page.locator('#nmrSVG .container').screenshot() -async function loadSpectrumFromURL(url: string, enableSnapshot = false) { - const { pathname: relativePath, origin: baseURL } = new URL(url); - const source = { - entries: [ - { - relativePath, - } - ], - baseURL - }; - const fileCollection = await fileCollectionFromWebSource(source, {}); - - const { - nmriumState: { data, version }, - } = await read(fileCollection); - - let images: Snapshot[] = [] - - if (enableSnapshot) { - images = await captureSpectraViewAsBase64({ data, version }); + snapshots.push({ + image: snapshot.toString('base64'), + id: spectrum.id, + }) + } catch (e) { + console.log(e) } + } + await context.close() + await browser.close() - return { data, version, images }; + return snapshots } +async function loadSpectrumFromURL(url: string, enableSnapshot = false) { + const { pathname: relativePath, origin: baseURL } = new URL(url) + const source = { + entries: [ + { + relativePath, + }, + ], + baseURL, + } + const fileCollection = await fileCollectionFromWebSource(source, {}) + + const { + nmriumState: { data, version }, + } = await core.read(fileCollection) + + let images: Snapshot[] = [] + + if (enableSnapshot) { + images = await captureSpectraViewAsBase64({ data, version }) + } + + return { data, version, images } +} async function loadSpectrumFromFilePath(path: string, enableSnapshot = false) { - const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) + const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) - const fileCollection = await fileCollectionFromPath(dirPath, {}); + const fileCollection = await fileCollectionFromPath(dirPath, {}) - const { - nmriumState: { data, version } - } = await read(fileCollection); + const { + nmriumState: { data, version }, + } = await core.read(fileCollection) - let images: Snapshot[] = [] + let images: Snapshot[] = [] - if (enableSnapshot) { - images = await captureSpectraViewAsBase64({ data, version }); - } + if (enableSnapshot) { + images = await captureSpectraViewAsBase64({ data, version }) + } - - return { data, version, images }; + return { data, version, images } } - -export { - loadSpectrumFromFilePath, - loadSpectrumFromURL -}; - +export { loadSpectrumFromFilePath, loadSpectrumFromURL } diff --git a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts index 635fc39..d8160b3 100644 --- a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts +++ b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts @@ -1,248 +1,249 @@ import { Argv, CommandModule, Options } from 'yargs' import { - generatePredictedSpectrumData, - GenerateSpectrumOptions, - ShiftsItem, + generatePredictedSpectrumData, + GenerateSpectrumOptions, + ShiftsItem, } from './generatePredictedSpectrumData' import { v4 } from '@lukeed/uuid' -import { CURRENT_EXPORT_VERSION } from 'nmr-load-save' +import { CURRENT_EXPORT_VERSION } from '@zakodium/nmrium-core' + import https from 'https' import axios from 'axios' interface PredictionParameters { - molText: string - id: number - type: string - shifts: string - solvent: string - nucleus: string + molText: string + id: number + type: string + shifts: string + solvent: string + nucleus: string } const predictionOptions: { [key in keyof GenerateSpectrumOptions]: Options } = { - from: { - type: 'number', - description: 'From in (ppm)', - }, - to: { - type: 'number', - description: 'To in (ppm)', - }, - nbPoints: { - type: 'number', - description: 'Number of points', - default: 2 ** 18, // 256k points - }, - lineWidth: { - type: 'number', - description: 'Line width', - default: 1, - }, - frequency: { - type: 'number', - description: 'NMR frequency (MHz)', - default: 400, - }, - tolerance: { - type: 'number', - description: 'Tolerance', - default: 0.001, - }, - peakShape: { - alias: 'ps', - type: 'string', - description: 'Peak shape algorithm', - default: 'lorentzian', - choices: ['gaussian', 'lorentzian'], - }, + from: { + type: 'number', + description: 'From in (ppm)', + }, + to: { + type: 'number', + description: 'To in (ppm)', + }, + nbPoints: { + type: 'number', + description: 'Number of points', + default: 2 ** 18, // 256k points + }, + lineWidth: { + type: 'number', + description: 'Line width', + default: 1, + }, + frequency: { + type: 'number', + description: 'NMR frequency (MHz)', + default: 400, + }, + tolerance: { + type: 'number', + description: 'Tolerance', + default: 0.001, + }, + peakShape: { + alias: 'ps', + type: 'string', + description: 'Peak shape algorithm', + default: 'lorentzian', + choices: ['gaussian', 'lorentzian'], + }, } as const const nmrOptions: { [key in keyof PredictionParameters]: Options } = { - id: { - alias: 'i', - type: 'number', - description: 'Input ID', - default: 1, - }, - type: { - alias: 't', - type: 'string', - description: 'NMR type', - default: 'nmr;1H;1d', - choices: ['nmr;1H;1d', 'nmr;13C;1d'], - }, - shifts: { - alias: 's', - type: 'string', - description: 'Chemical shifts', - default: '1', - }, - solvent: { - type: 'string', - description: 'NMR solvent', - default: 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', - choices: [ - 'Any', - 'Chloroform-D1 (CDCl3)', - 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', - 'Methanol-D4 (CD3OD)', - 'Deuteriumoxide (D2O)', - 'Acetone-D6 ((CD3)2CO)', - 'TETRACHLORO-METHANE (CCl4)', - 'Pyridin-D5 (C5D5N)', - 'Benzene-D6 (C6D6)', - 'neat', - 'Tetrahydrofuran-D8 (THF-D8, C4D4O)', - ], - }, - molText: { - alias: 'm', - type: 'string', - description: 'MOL file content', - requiresArg: true, - }, - nucleus: { - alias: 'n', - type: 'string', - description: 'Predicted nucleus', - requiresArg: true, - choices: ['1H', '13C'], - }, + id: { + alias: 'i', + type: 'number', + description: 'Input ID', + default: 1, + }, + type: { + alias: 't', + type: 'string', + description: 'NMR type', + default: 'nmr;1H;1d', + choices: ['nmr;1H;1d', 'nmr;13C;1d'], + }, + shifts: { + alias: 's', + type: 'string', + description: 'Chemical shifts', + default: '1', + }, + solvent: { + type: 'string', + description: 'NMR solvent', + default: 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', + choices: [ + 'Any', + 'Chloroform-D1 (CDCl3)', + 'Dimethylsulphoxide-D6 (DMSO-D6, C2D6SO)', + 'Methanol-D4 (CD3OD)', + 'Deuteriumoxide (D2O)', + 'Acetone-D6 ((CD3)2CO)', + 'TETRACHLORO-METHANE (CCl4)', + 'Pyridin-D5 (C5D5N)', + 'Benzene-D6 (C6D6)', + 'neat', + 'Tetrahydrofuran-D8 (THF-D8, C4D4O)', + ], + }, + molText: { + alias: 'm', + type: 'string', + description: 'MOL file content', + requiresArg: true, + }, + nucleus: { + alias: 'n', + type: 'string', + description: 'Predicted nucleus', + requiresArg: true, + choices: ['1H', '13C'], + }, } as const interface PredictionResponseItem { - id: number - type: string - statistics: { - accept: number - warning: number - reject: number - missing: number - total: number - } - shifts: ShiftsItem[] + id: number + type: string + statistics: { + accept: number + warning: number + reject: number + missing: number + total: number + } + shifts: ShiftsItem[] } interface PredictionResponse { - result: PredictionResponseItem[] + result: PredictionResponseItem[] } async function predictNMR(options: PredictionArgs): Promise { - const url = process.env['NMR_PREDICTION_URL'] - - if (!url) { - throw new Error('Environment variable NMR_PREDICTION_URL is not defined.') + const url = process.env['NMR_PREDICTION_URL'] + + if (!url) { + throw new Error('Environment variable NMR_PREDICTION_URL is not defined.') + } + + try { + new URL(url).toString() + } catch { + throw new Error(`Invalid URL in NMR_PREDICTION_URL: "${url}"`) + } + + try { + const { + id, + type, + shifts, + solvent, + from, + to, + nbPoints = 2 ** 18, // 256K + frequency = 400, + lineWidth = 1, + tolerance = 0.001, + molText, + nucleus, + peakShape = 'lorentzian', + } = options + + const payload: any = { + inputs: [ + { + id, + type, + shifts, + solvent, + }, + ], + moltxt: molText.replaceAll(/\\n/g, '\n'), } - try { - new URL(url).toString() - } catch { - throw new Error(`Invalid URL in NMR_PREDICTION_URL: "${url}"`) + const httpsAgent = new https.Agent({ + rejectUnauthorized: false, + }) + + // Axios POST request with httpsAgent + const response = await axios.post(url, payload, { + headers: { + 'Content-Type': 'application/json', + }, + httpsAgent, + }) + + const responseResult: PredictionResponse = response.data + const spectra = [] + + for (const result of responseResult.result) { + const name = v4() + const data = generatePredictedSpectrumData(result.shifts, { + from, + to, + nbPoints, + lineWidth, + frequency, + tolerance, + peakShape, + }) + + const info = { + isFid: false, + isComplex: false, + dimension: 1, + originFrequency: frequency, + baseFrequency: frequency, + pulseSequence: '', + solvent, + isFt: true, + name, + nucleus, + } + + spectra.push({ + id: v4(), + data, + info, + }) } - try { - const { - id, - type, - shifts, - solvent, - from, - to, - nbPoints = 2 ** 18, // 256K - frequency = 400, - lineWidth = 1, - tolerance = 0.001, - molText, - nucleus, - peakShape = "lorentzian", - } = options - - const payload: any = { - inputs: [ - { - id, - type, - shifts, - solvent, - }, - ], - moltxt: molText.replaceAll(/\\n/g, '\n'), - } - - const httpsAgent = new https.Agent({ - rejectUnauthorized: false, - }) - - // Axios POST request with httpsAgent - const response = await axios.post(url, payload, { - headers: { - 'Content-Type': 'application/json', - }, - httpsAgent, - }) - - const responseResult: PredictionResponse = response.data - const spectra = [] - - for (const result of responseResult.result) { - const name = v4() - const data = generatePredictedSpectrumData(result.shifts, { - from, - to, - nbPoints, - lineWidth, - frequency, - tolerance, - peakShape, - }) - - const info = { - isFid: false, - isComplex: false, - dimension: 1, - originFrequency: frequency, - baseFrequency: frequency, - pulseSequence: '', - solvent, - isFt: true, - name, - nucleus, - } - - spectra.push({ - id: v4(), - data, - info, - }) - } - - const nmrium = { data: { spectra }, version: CURRENT_EXPORT_VERSION } - console.log(JSON.stringify(nmrium, null, 2)) - } catch (error) { - console.error( - 'Error:', - error instanceof Error ? error.message : String(error) - ) - - if (axios.isAxiosError(error) && error.response) { - console.error('Response data:', error.response.data) - } else if (error instanceof Error && error.cause) { - console.error('Network Error:', error.cause) - } + const nmrium = { data: { spectra }, version: CURRENT_EXPORT_VERSION } + console.log(JSON.stringify(nmrium, null, 2)) + } catch (error) { + console.error( + 'Error:', + error instanceof Error ? error.message : String(error) + ) + + if (axios.isAxiosError(error) && error.response) { + console.error('Response data:', error.response.data) + } else if (error instanceof Error && error.cause) { + console.error('Network Error:', error.cause) } + } } type PredictionArgs = PredictionParameters & GenerateSpectrumOptions // Define the prediction string command export const parsePredictionCommand: CommandModule<{}, PredictionArgs> = { - command: ['predict', 'p'], - describe: 'Predict NMR spectrum from mol text', - builder: (yargs: Argv<{}>): Argv => { - return yargs.options({ - ...nmrOptions, - ...predictionOptions, - }) as Argv - }, - handler: async argv => { - await predictNMR(argv) - }, + command: ['predict', 'p'], + describe: 'Predict NMR spectrum from mol text', + builder: (yargs: Argv<{}>): Argv => { + return yargs.options({ + ...nmrOptions, + ...predictionOptions, + }) as Argv + }, + handler: async argv => { + await predictNMR(argv) + }, } diff --git a/app/scripts/nmr-cli/src/publication-string.ts b/app/scripts/nmr-cli/src/publication-string.ts index 4251843..3133a53 100644 --- a/app/scripts/nmr-cli/src/publication-string.ts +++ b/app/scripts/nmr-cli/src/publication-string.ts @@ -1,73 +1,76 @@ -import { resurrect, rangesToXY, type NMRRangeWithIntegration } from 'nmr-processing'; -import { v4 } from '@lukeed/uuid'; -import { CURRENT_EXPORT_VERSION } from 'nmr-load-save'; +import { + resurrect, + rangesToXY, + type NMRRangeWithIntegration, +} from 'nmr-processing' +import { v4 } from '@lukeed/uuid' +import { CURRENT_EXPORT_VERSION } from '@zakodium/nmrium-core' import { castToArray } from './utilities/castToArray' - interface Info { - nucleus: string; solvent: string; name: string + nucleus: string + solvent: string + name: string } function generateSpectrumFromRanges( - ranges: NMRRangeWithIntegration[], - info: Info, + ranges: NMRRangeWithIntegration[], + info: Info ) { - const { nucleus, solvent, name = null } = info; - - const frequency = 400; - try { - const { x, y } = rangesToXY(ranges, { - nucleus, - frequency, - nbPoints: 2 ** 17, - }); + const { nucleus, solvent, name = null } = info - const info = { - isFid: false, - isComplex: false, - dimension: 1, - nucleus, - originFrequency: frequency, - baseFrequency: frequency, - pulseSequence: '', - solvent, - isFt: true, - name, - }; + const frequency = 400 + try { + const { x, y } = rangesToXY(ranges, { + nucleus, + frequency, + nbPoints: 2 ** 17, + }) - const spectrum = - { - id: v4(), - data: { x: castToArray(x), im: undefined, re: castToArray(y) }, - info, - ranges: { - values: ranges, options: { - sum: 100, - isSumConstant: false, - sumAuto: false - } - }, - }; + const info = { + isFid: false, + isComplex: false, + dimension: 1, + nucleus, + originFrequency: frequency, + baseFrequency: frequency, + pulseSequence: '', + solvent, + isFt: true, + name, + } - return { data: { spectra: [spectrum] }, version: CURRENT_EXPORT_VERSION }; - } catch (error) { - console.log(error); + const spectrum = { + id: v4(), + data: { x: castToArray(x), im: undefined, re: castToArray(y) }, + info, + ranges: { + values: ranges, + options: { + sum: 100, + isSumConstant: false, + sumAuto: false, + }, + }, } -} + return { data: { spectra: [spectrum] }, version: CURRENT_EXPORT_VERSION } + } catch (error) { + console.log(error) + } +} -function generateSpectrumFromPublicationString( - publicationString: string -) { - const { - ranges, - info: { nucleus, solvent = '' }, - parts, - } = resurrect(publicationString); - return generateSpectrumFromRanges( - ranges, - { nucleus, solvent, name: parts[0] }, - ); +function generateSpectrumFromPublicationString(publicationString: string) { + const { + ranges, + info: { nucleus, solvent = '' }, + parts, + } = resurrect(publicationString) + return generateSpectrumFromRanges(ranges, { + nucleus, + solvent, + name: parts[0], + }) } export { generateSpectrumFromPublicationString } diff --git a/app/scripts/nmr-cli/src/utilities/castToArray.ts b/app/scripts/nmr-cli/src/utilities/castToArray.ts index 6cd3a48..bb2482e 100644 --- a/app/scripts/nmr-cli/src/utilities/castToArray.ts +++ b/app/scripts/nmr-cli/src/utilities/castToArray.ts @@ -1,3 +1,3 @@ export function castToArray(value: Float64Array | number[]): number[] { - return ArrayBuffer.isView(value) ? Array.from(value) : value -} \ No newline at end of file + return ArrayBuffer.isView(value) ? Array.from(value) : value +} diff --git a/app/scripts/nmr-cli/tsconfig.json b/app/scripts/nmr-cli/tsconfig.json index 3365620..45db58d 100644 --- a/app/scripts/nmr-cli/tsconfig.json +++ b/app/scripts/nmr-cli/tsconfig.json @@ -5,13 +5,8 @@ "strict": true, "esModuleInterop": true, "outDir": "./build", - "skipLibCheck": true, + "skipLibCheck": true }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "node_modules", - "dist" - ] -} \ No newline at end of file + "include": ["src/**/*.ts"], + "exclude": ["node_modules", "dist"] +} From 9c91ea1aaacfee549fb81c2ffe8e57aae63cb885 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 5 Sep 2025 11:52:28 +0200 Subject: [PATCH 35/44] chore: update dependencies --- app/scripts/nmr-cli/Dockerfile | 3 +- app/scripts/nmr-cli/package-lock.json | 82 +++++++++++++++++---------- app/scripts/nmr-cli/package.json | 8 +-- 3 files changed, 57 insertions(+), 36 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index 1b19de7..207c4d3 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,8 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.54.1-jammy - +FROM mcr.microsoft.com/playwright:v1.55.0-noble SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index f3447c7..284f69f 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -11,20 +11,20 @@ "dependencies": { "@zakodium/nmrium-core": "^0.1.3", "@zakodium/nmrium-core-plugins": "^0.1.4", - "axios": "^1.10.0", + "axios": "^1.11.0", "filelist-utils": "^1.11.3", "nmr-processing": "^19.0.0", - "playwright": "^1.54.1", + "playwright": "^1.55.0", "yargs": "^18.0.0" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^24.0.14", + "@types/node": "^24.3.1", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.8.3" + "typescript": "^5.9.2" } }, "node_modules/@cspotcode/source-map-support": { @@ -108,13 +108,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "24.0.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", - "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", + "version": "24.3.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", + "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "node_modules/@types/yargs": { @@ -273,7 +273,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/atom-sorter": { "version": "2.2.0", @@ -281,12 +282,13 @@ "integrity": "sha512-ktg7pvTF22Ox/HPJZjUrw3L0dH1nOZg+CjGR0r1iyZO2LDbQX5GgIxOWq4YthifBrcVxfFMkdKVhp5YJ43g0Vw==" }, "node_modules/axios": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz", - "integrity": "sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, @@ -311,6 +313,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -341,6 +344,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", "dependencies": { "delayed-stream": "~1.0.0" }, @@ -400,6 +404,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", "engines": { "node": ">=0.4.0" } @@ -417,6 +422,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -449,6 +455,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -457,6 +464,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -465,6 +473,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -476,6 +485,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", @@ -538,9 +548,10 @@ } }, "node_modules/form-data": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", - "integrity": "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -569,6 +580,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -596,6 +608,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", @@ -619,6 +632,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -631,6 +645,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -642,6 +657,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -653,6 +669,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -667,6 +684,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -791,6 +809,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -804,6 +823,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -812,6 +832,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, @@ -1241,12 +1262,12 @@ "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==" }, "node_modules/playwright": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", - "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", + "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.54.1" + "playwright-core": "1.55.0" }, "bin": { "playwright": "cli.js" @@ -1259,9 +1280,9 @@ } }, "node_modules/playwright-core": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", - "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "version": "1.55.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", + "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -1404,9 +1425,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", + "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1423,10 +1444,11 @@ "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==" }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", - "dev": true + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "dev": true, + "license": "MIT" }, "node_modules/util-deprecate": { "version": "1.0.2", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index b63a679..3b8d98a 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -17,16 +17,16 @@ "dependencies": { "@zakodium/nmrium-core": "^0.1.3", "@zakodium/nmrium-core-plugins": "^0.1.4", - "axios": "^1.10.0", + "axios": "^1.11.0", "filelist-utils": "^1.11.3", "nmr-processing": "^19.0.0", - "playwright": "^1.54.1", + "playwright": "^1.55.0", "yargs": "^18.0.0" }, "devDependencies": { - "@types/node": "^24.0.14", + "@types/node": "^24.3.1", "@types/yargs": "^17.0.33", "ts-node": "^10.9.2", - "typescript": "^5.8.3" + "typescript": "^5.9.2" } } From 806dae0d4c9a974c74b60b437b5a0da85ddd7d34 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 5 Sep 2025 11:53:19 +0200 Subject: [PATCH 36/44] feat: update NMRium core packages --- app/scripts/nmr-cli/package-lock.json | 411 ++++++++++++++------------ app/scripts/nmr-cli/package.json | 6 +- 2 files changed, 232 insertions(+), 185 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 284f69f..56a1a7a 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,11 +9,11 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@zakodium/nmrium-core": "^0.1.3", - "@zakodium/nmrium-core-plugins": "^0.1.4", + "@zakodium/nmrium-core": "^0.1.7", + "@zakodium/nmrium-core-plugins": "^0.1.10", "axios": "^1.11.0", "filelist-utils": "^1.11.3", - "nmr-processing": "^19.0.0", + "nmr-processing": "^19.1.0", "playwright": "^1.55.0", "yargs": "^18.0.0" }, @@ -39,6 +39,12 @@ "node": ">=12" } }, + "node_modules/@date-fns/utc": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.1.tgz", + "integrity": "sha512-SlJDfG6RPeEX8wEVv6ZB3kak4MmbtyiI2qX/5zuKdordbrhB/iaJ58GVMZgJ6P1sJaM1gMgENFYYeg1JWrCFrA==", + "license": "MIT" + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -64,25 +70,6 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@lukeed/csprng": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", - "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@lukeed/uuid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@lukeed/uuid/-/uuid-2.0.1.tgz", - "integrity": "sha512-qC72D4+CDdjGqJvkFMMEAtancHUQ7/d/tAiHf64z8MopFDmcrtbcJuerDtFceuAfQJ2pDSfCKCtbqoGBNnwg0w==", - "dependencies": { - "@lukeed/csprng": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", @@ -133,89 +120,53 @@ "dev": true }, "node_modules/@zakodium/nmrium-core": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core/-/nmrium-core-0.1.3.tgz", - "integrity": "sha512-bizm794rvhRdyxSvu6hbRbPo3XkvvVr8/gl8eIXzMjfjBJ7dQYDJxECzSxt1dqSosAXEImXaQPH6VgzlOgv5Og==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core/-/nmrium-core-0.1.7.tgz", + "integrity": "sha512-aKSXINlAcNyXjo2gs1/ePgfB6SbW2SRYle8/zjg0My8nvsZozbsjW+VtM/QXGEfYthgyw3HcsIr489AhUyEH9A==", "license": "CC-BY-NC-SA-4.0", "dependencies": { "cheminfo-types": "^1.8.1", - "fifo-logger": "^1.0.0", - "filelist-utils": "^1.11.3", + "fifo-logger": "^2.0.1", + "file-collection": "^5.1.1", "is-any-array": "^2.0.1", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.12.0", + "ml-spectra-processing": "^14.17.1", "nmr-correlation": "^2.3.5" } }, "node_modules/@zakodium/nmrium-core-plugins": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core-plugins/-/nmrium-core-plugins-0.1.4.tgz", - "integrity": "sha512-OwfMGkSNIAslXSBAOjHIZGdgxKakJZk+xiMYTQuODMCGJyR9OnKceM7XqZJ6Kz6HeTzZTDrRt3E40Wis2JGkVw==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core-plugins/-/nmrium-core-plugins-0.1.10.tgz", + "integrity": "sha512-f6y6n2bCoN4pUTAbaKl9NNZO1vd86ZFzyeZ8eSAYpyp4z29Pu4r8qBsgKSrJwW7VY916bCZmk++pw25cXyGSuQ==", "license": "CC-BY-NC-SA-4.0", "dependencies": { - "@zakodium/nmrium-core": "^0.1.3", + "@date-fns/utc": "^2.1.1", + "@zakodium/nmrium-core": "^0.1.7", "cheminfo-types": "^1.8.1", - "convert-to-jcamp": "^5.4.11", - "filelist-utils": "^1.11.3", + "convert-to-jcamp": "^6.0.0", + "date-fns": "^4.1.0", + "file-collection": "^5.1.1", "gyromagnetic-ratio": "^2.0.0", "is-any-array": "^2.0.1", - "jcampconverter": "^11.0.3", + "jcampconverter": "^11.0.5", "linear-sum-assignment": "^1.0.7", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.12.0", - "nmr-processing": "^19.0.0", - "nmredata": "^1.0.1", - "openchemlib": "^9.2.0", - "openchemlib-utils": "^8.1.1", + "ml-spectra-processing": "^14.17.1", + "nmr-processing": "^19.1.0", + "openchemlib": "^9.7.0", + "openchemlib-utils": "^8.3.1", "sdf-parser": "^7.0.4" } }, - "node_modules/@zakodium/nmrium-core-plugins/node_modules/get-value": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", - "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==", - "license": "MIT" - }, - "node_modules/@zakodium/nmrium-core-plugins/node_modules/gyromagnetic-ratio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", - "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==", - "license": "MIT" - }, - "node_modules/@zakodium/nmrium-core-plugins/node_modules/nmredata": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nmredata/-/nmredata-1.0.1.tgz", - "integrity": "sha512-vw4cuMj6hr6q73TGf83E4hcZ8UEr+VIFigKvhju+R4v1Z2m+K7oNrxp80ImN917ZGqFQ4gHOub842iFaGhoLJg==", - "license": "MIT", - "dependencies": { - "filelist-utils": "^1.11.3", - "jszip": "^3.10.1", - "openchemlib": "^9.1.1", - "openchemlib-utils": "^8.1.1" - } - }, - "node_modules/@zakodium/nmrium-core-plugins/node_modules/openchemlib": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.6.0.tgz", - "integrity": "sha512-SAMLSwOQTCDNpfNu/WTQpzLMYTRj/xwetMPRoAGHeR2J162RP/OI6vHpVcC7L4V7ThMW3ZhMf7GdH04yndmHtw==", - "license": "BSD-3-Clause" - }, - "node_modules/@zakodium/nmrium-core-plugins/node_modules/openchemlib-utils": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.2.0.tgz", - "integrity": "sha512-QrF/9gCNQ0uB4WTku9N3mvorCyt6fuAI9e73BaXfd6h4+uz9nbqvJNQpM39Z5m8Cz9Zd0geq7o7zRneX6BEXMA==", - "license": "MIT", - "dependencies": { - "atom-sorter": "^2.2.0", - "ensure-string": "^1.2.0", - "get-value": "^4.0.1", - "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.12.1", - "papaparse": "^5.5.3", - "sdf-parser": "^7.0.4" - }, - "peerDependencies": { - "openchemlib": ">=9.3.0" + "node_modules/@zip.js/zip.js": { + "version": "2.7.73", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.73.tgz", + "integrity": "sha512-I2UP8/rdQE5hTtVVL08B7P8XuwXiKuuMUPjNuFOVL/9b+8IsExR9S5jz2H58u0rJjU4M1BikLgqEMG8gZJZVBw==", + "license": "BSD-3-Clause", + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=16.5.0" } }, "node_modules/acorn": { @@ -277,9 +228,10 @@ "license": "MIT" }, "node_modules/atom-sorter": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.2.0.tgz", - "integrity": "sha512-ktg7pvTF22Ox/HPJZjUrw3L0dH1nOZg+CjGR0r1iyZO2LDbQX5GgIxOWq4YthifBrcVxfFMkdKVhp5YJ43g0Vw==" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/atom-sorter/-/atom-sorter-2.2.1.tgz", + "integrity": "sha512-+Lyyb6iXLHEb/ZYkpuvdEUgZ62+oA96p3rJG5lsttwl9vig1UqD8sAUnGQjrDFcVNUywFBhiW57Nns65M7TXEA==", + "license": "MIT" }, "node_modules/axios": { "version": "1.11.0", @@ -296,6 +248,7 @@ "version": "1.1.9", "resolved": "https://registry.npmjs.org/baselines/-/baselines-1.1.9.tgz", "integrity": "sha512-dFqZSb0EwzmTUyjI3k0HSfsKMKMDHpCILPTsdysFgLf8roGq5f58KrSYAwa9vODk2dbE8NdKgNnKk8TBwXNWAw==", + "license": "MIT", "dependencies": { "ml-airpls": "^2.0.0", "ml-array-sequential-fill": "^1.1.8", @@ -307,7 +260,8 @@ "node_modules/binary-search": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz", - "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==" + "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==", + "license": "CC0-1.0" }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", @@ -353,9 +307,10 @@ } }, "node_modules/convert-to-jcamp": { - "version": "5.4.11", - "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-5.4.11.tgz", - "integrity": "sha512-UiUjrSLiBFp2FMnP+eapZL6gScBVKTROtZz8aKHRlNuPe4WiLP0tzlHfA9ZGhybsUwm5WcW9qwuWxX6Do+EP9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/convert-to-jcamp/-/convert-to-jcamp-6.0.0.tgz", + "integrity": "sha512-RktJranOLNxLR9Ef3+aHYgOYf4W3sOysTJKXTN9/SKxmKzkFRPIqfPaPhTPq8u6r+3uQeM2WttDIvg9QEPq9Hg==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.3", "is-any-array": "^2.0.1", @@ -379,12 +334,14 @@ "node_modules/cuthill-mckee": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cuthill-mckee/-/cuthill-mckee-1.0.0.tgz", - "integrity": "sha512-ehXCHYXZhZzDZmVQE/P9wQ7XPOn1G3e+pVqcqXvYykBL8Lg7HFm2ewD3TZseOMWiM9bNU0u4UWSV/dAzf+unug==" + "integrity": "sha512-ehXCHYXZhZzDZmVQE/P9wQ7XPOn1G3e+pVqcqXvYykBL8Lg7HFm2ewD3TZseOMWiM9bNU0u4UWSV/dAzf+unug==", + "license": "MIT" }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", "engines": { "node": ">=12" } @@ -393,6 +350,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", "dependencies": { "d3-color": "1 - 3" }, @@ -400,6 +358,16 @@ "node": ">=12" } }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -435,7 +403,8 @@ "node_modules/dynamic-typing": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dynamic-typing/-/dynamic-typing-1.0.1.tgz", - "integrity": "sha512-KYvDeLd4kPxs5rn/GLDQ2FLrncVVqvUfQKkhbYYaM+51zXjQwyOejP5TuAnAjdX6o+PjdMgcfhr3M7h5hQv4yA==" + "integrity": "sha512-KYvDeLd4kPxs5rn/GLDQ2FLrncVVqvUfQKkhbYYaM+51zXjQwyOejP5TuAnAjdX6o+PjdMgcfhr3M7h5hQv4yA==", + "license": "MIT" }, "node_modules/emoji-regex": { "version": "10.4.0", @@ -446,6 +415,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/ensure-string/-/ensure-string-1.2.0.tgz", "integrity": "sha512-Hvv2Xocfn6CSvCWgIGNzf0D5bgE6fAa65cayGOWsEXz03ej3aDpsogP3zstuLKt43zVuojQFST4XHPt9+PtuGQ==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.1.0", "isutf8": "^4.0.0" @@ -507,15 +477,26 @@ "node_modules/fft.js": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/fft.js/-/fft.js-4.0.4.tgz", - "integrity": "sha512-f9c00hphOgeQTlDyavwTtu6RiK8AIFjD6+jvXkNkpeQ7rirK3uFWVpalkoS4LAwbdX7mfZ8aoBfFVQX1Re/8aw==" + "integrity": "sha512-f9c00hphOgeQTlDyavwTtu6RiK8AIFjD6+jvXkNkpeQ7rirK3uFWVpalkoS4LAwbdX7mfZ8aoBfFVQX1Re/8aw==", + "license": "MIT" }, "node_modules/fifo-logger": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fifo-logger/-/fifo-logger-1.0.0.tgz", - "integrity": "sha512-QLwozqK3u0+8w+J9JPGBYxAvA0tAZhdnhE74OCHAhopGiRltJ7QDvobE15qORPty8qkDBdXhsMaGF35Ry0kwAA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fifo-logger/-/fifo-logger-2.0.1.tgz", + "integrity": "sha512-AwCaBK389hl67z4AJ5+8uOsxU07olw0DzowzA6Znr/eaItMCsXXxzA1DjY/KCABWu/4Bq+wrBhn1p7hsjNDv4g==", + "license": "MIT", "dependencies": { - "@lukeed/uuid": "^2.0.1", - "typescript-event-target": "^1.1.0" + "typescript-event-target": "^1.1.1" + } + }, + "node_modules/file-collection": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/file-collection/-/file-collection-5.1.1.tgz", + "integrity": "sha512-zaMg3tvTVZWLQk6TtNcV/iwxm+kJ7HbPGdqWaUzKNXYUH2iPLe3TaGzJDhlCmOg84j7tetf9Bc7i4BQsaEONYA==", + "license": "MIT", + "dependencies": { + "@zip.js/zip.js": "^2.7.72", + "cheminfo-types": "^1.8.1" } }, "node_modules/filelist-utils": { @@ -641,6 +622,12 @@ "node": ">= 0.4" } }, + "node_modules/get-value": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", + "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==", + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -653,6 +640,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gyromagnetic-ratio": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", + "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==", + "license": "MIT" + }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", @@ -695,7 +688,8 @@ "node_modules/heap": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", - "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", + "license": "MIT" }, "node_modules/immediate": { "version": "3.0.6", @@ -711,6 +705,7 @@ "version": "0.13.0", "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -729,14 +724,15 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-4.0.1.tgz", "integrity": "sha512-1pk2/2pE+G48eETnp4uOLxQ9WUCxD7oVauYwhFEAGREJPDxEO7iX9qstylrCcx3lNWa1RCS2DxGTxrHdWqS7/w==", + "license": "MIT", "engines": { "node": ">= 12" } }, "node_modules/jcampconverter": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-11.0.3.tgz", - "integrity": "sha512-vnm7QjVb5RMf8BFmGa0XzHW+fbI2ESpIPiZc+9brB4XVteYoZOwp2Mprx0vZfJYitK8CEHOY2aLAwDr9XV72Yw==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-11.0.5.tgz", + "integrity": "sha512-/FOcPmKqe7Mac7JYsYZv5vdFKNbg3NxXL9Mi2v9mYf2Tr8l57nKsdkJQjFToNZP827g7IOKmgXBTlOGnaHmmNg==", "license": "CC-BY-NC-SA-4.0", "dependencies": { "cheminfo-types": "^1.8.1", @@ -744,21 +740,9 @@ "ensure-string": "^1.2.0", "gyromagnetic-ratio": "^2.0.0", "ml-array-median": "^1.1.6", - "openchemlib": "^9.2.0" + "openchemlib": "^9.6.0" } }, - "node_modules/jcampconverter/node_modules/gyromagnetic-ratio": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", - "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==", - "license": "MIT" - }, - "node_modules/jcampconverter/node_modules/openchemlib": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.6.0.tgz", - "integrity": "sha512-SAMLSwOQTCDNpfNu/WTQpzLMYTRj/xwetMPRoAGHeR2J162RP/OI6vHpVcC7L4V7ThMW3ZhMf7GdH04yndmHtw==", - "license": "BSD-3-Clause" - }, "node_modules/jszip": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", @@ -787,6 +771,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.7.tgz", "integrity": "sha512-jfLoSGwZNyjfY8eK4ayhjfcIu3BfWvP6sWieYzYI3AWldwXVoWEz1gtrQL10v/8YltYLBunqNjeVFXPMUs+MJg==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.3", "install": "^0.13.0", @@ -817,7 +802,8 @@ "node_modules/median-quickselect": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/median-quickselect/-/median-quickselect-1.0.1.tgz", - "integrity": "sha512-/QL9ptNuLsdA68qO+2o10TKCyu621zwwTFdLvtu8rzRNKsn8zvuGoq/vDxECPyELFG8wu+BpyoMR9BnsJqfVZQ==" + "integrity": "sha512-/QL9ptNuLsdA68qO+2o10TKCyu621zwwTFdLvtu8rzRNKsn8zvuGoq/vDxECPyELFG8wu+BpyoMR9BnsJqfVZQ==", + "license": "ISC" }, "node_modules/mime-db": { "version": "1.52.0", @@ -844,6 +830,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-airpls/-/ml-airpls-2.0.0.tgz", "integrity": "sha512-dCFbc2UNnzHkU6PAa1SFjdob/cVNZz//BlLh6BF2jHp56+Oahi02PLytrV4v+X3sW20v2l//8hXuqjZCuv88OQ==", + "license": "MIT", "dependencies": { "cuthill-mckee": "^1.0.0", "ml-spectra-processing": "^14.5.0" @@ -853,6 +840,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/ml-array-max/-/ml-array-max-1.2.4.tgz", "integrity": "sha512-BlEeg80jI0tW6WaPyGxf5Sa4sqvcyY6lbSn5Vcv44lp1I2GR6AWojfUvLnGTNsIXrZ8uqWmo8VcG1WpkI2ONMQ==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.0" } @@ -861,6 +849,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/ml-array-median/-/ml-array-median-1.1.6.tgz", "integrity": "sha512-V6bV6bTPFRX8v5CaAx/7fuRXC39LLTHfPSVZZafdNaqNz2PFL5zEA7gesjv8dMXh+gwPeUMtB5QPovlTBaa4sw==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.0", "median-quickselect": "^1.0.1" @@ -870,6 +859,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/ml-array-min/-/ml-array-min-1.2.3.tgz", "integrity": "sha512-VcZ5f3VZ1iihtrGvgfh/q0XlMobG6GQ8FsNyQXD3T+IlstDv85g8kfV0xUG1QPRO/t21aukaJowDzMTc7j5V6Q==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.0" } @@ -878,6 +868,7 @@ "version": "1.3.7", "resolved": "https://registry.npmjs.org/ml-array-rescale/-/ml-array-rescale-1.3.7.tgz", "integrity": "sha512-48NGChTouvEo9KBctDfHC3udWnQKNKEWN0ziELvY3KG25GR5cA8K8wNVzracsqSW1QEkAXjTNx+ycgAv06/1mQ==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.0", "ml-array-max": "^1.2.4", @@ -888,6 +879,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/ml-array-sequential-fill/-/ml-array-sequential-fill-1.1.8.tgz", "integrity": "sha512-8oS9fYn61r61Lo4N0ueXBqjsrraxXMz0oTfKW/waNHOabvKhLMB7hjixUa2Hp5vnVBJHHHNWHqRUm/T00zRhLg==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.0" } @@ -896,6 +888,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ml-baseline-correction-regression/-/ml-baseline-correction-regression-2.0.1.tgz", "integrity": "sha512-ZPdJogONI5/M7eFuJ4NCrr8NJ1XcSl7OVTUOvZkFr2yjT/o592nd3oqtj+ChyxAJLMO68eFlktNV0OHhvxy1KQ==", + "license": "MIT", "dependencies": { "ml-regression-polynomial": "^3.0.1" } @@ -904,6 +897,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-convolution/-/ml-convolution-2.0.0.tgz", "integrity": "sha512-ExW6zVmN2YGuyO3aBiS1ymybme3nVgv2ccCfynSdgtW5sNp4DOHnfow4K/ErTDMQ1s9tINjv7kvzjnVhQHXJBA==", + "license": "MIT", "dependencies": { "fft.js": "^4.0.3", "next-power-of-two": "^1.0.0" @@ -913,6 +907,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/ml-direct/-/ml-direct-1.0.0.tgz", "integrity": "sha512-DyynbcLIHGCRYiJNRW6qeWpOyV/SCYwSzYDN0VP72ucIx0jn8H4GYKRTY94e0Gk+yKlOjdu3GSNY/j6nxdl9YA==", + "license": "MIT", "dependencies": { "ml-matrix": "^6.11.0", "ml-spectra-processing": "^14.2.0" @@ -926,12 +921,14 @@ "node_modules/ml-distance-euclidean": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz", - "integrity": "sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==" + "integrity": "sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q==", + "license": "MIT" }, "node_modules/ml-distance-matrix": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ml-distance-matrix/-/ml-distance-matrix-2.0.1.tgz", - "integrity": "sha512-6wt3bvK8WzAjyuBt9+wnyGanphrAZyqJGwiEEfuknfu8IQBtHYWpyLhjtQ8R7rjiPyXlF9eP7GcI5L7OA1NLEQ==" + "integrity": "sha512-6wt3bvK8WzAjyuBt9+wnyGanphrAZyqJGwiEEfuknfu8IQBtHYWpyLhjtQ8R7rjiPyXlF9eP7GcI5L7OA1NLEQ==", + "license": "MIT" }, "node_modules/ml-fft": { "version": "1.3.5", @@ -942,6 +939,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ml-floyd-warshall/-/ml-floyd-warshall-3.0.1.tgz", "integrity": "sha512-GrUdw/QuENlOp1HnCNzjaqZJXdXyrOG8YYK7lSvq3fzgOFoaZPY5gUFFmHDSo/T0ZCBLkka9IjcSpEbRGqi/fw==", + "license": "MIT", "dependencies": { "ml-matrix": "^6.10.4" } @@ -950,6 +948,7 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.0.1.tgz", "integrity": "sha512-Du0759hFmjz/LXYnbQcnUs7kP/3iczrczwEAax5W9GTVay9YtR6tZ019PJJK4Fw2aZvysUt3MwrnFZUemsHKCQ==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.8.1", "ml-peak-shape-generator": "^4.1.4", @@ -962,6 +961,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/ml-hash-table/-/ml-hash-table-1.0.0.tgz", "integrity": "sha512-KV2uRIUbox0xuJ5Gkmr3udX0eNqr+c2HiSqz+sqAtQOnSm46zBmzDJvZX9t4hhcqqyEmGPvxFzx5SnwCfGhXNw==", + "license": "MIT", "dependencies": { "binary-search": "^1.3.5", "num-sort": "^2.0.0" @@ -971,6 +971,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/ml-hclust/-/ml-hclust-3.1.0.tgz", "integrity": "sha512-EI6VCHrPHOsPsgZ1a/auhdxzHpEZ+kV7yjCGGIU+EWtb/XV1ZWSg5GlU32Qt4T05m98wCSQykPBhIg5aW6JjuQ==", + "license": "MIT", "dependencies": { "heap": "^0.2.6", "ml-distance-euclidean": "^2.0.0", @@ -982,6 +983,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/ml-levenberg-marquardt/-/ml-levenberg-marquardt-5.0.0.tgz", "integrity": "sha512-vCFoO2DyYKGZFp+KxofN2cAvSc/3gufJHj/oaDHA2nV+NZH509fD7m35zQR2ZXA8fepxpVrwgCAQ0aAIsV2WtA==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.1", "ml-matrix": "^6.12.1" @@ -991,6 +993,7 @@ "version": "6.12.1", "resolved": "https://registry.npmjs.org/ml-matrix/-/ml-matrix-6.12.1.tgz", "integrity": "sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.1", "ml-array-rescale": "^1.3.7" @@ -1014,9 +1017,10 @@ } }, "node_modules/ml-peak-shape-generator": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/ml-peak-shape-generator/-/ml-peak-shape-generator-4.1.4.tgz", - "integrity": "sha512-yzBXSHbCI4Gcq0A+CMMmztq9dlCwEQyWqKfUFn+g2CWuPGO7ISdb9BLNY08YY/zvZ4GMEmyOriZ2ypDfWD2t0g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/ml-peak-shape-generator/-/ml-peak-shape-generator-4.2.0.tgz", + "integrity": "sha512-BDtR0rhUor5/4J9pJOEMRnD+QQ5v6ohx+o6MfRRg2e2IOTeZfp/uJcy5Y852v5CsNec1GmYMkd5PYrY0245qlQ==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.1.0" } @@ -1025,6 +1029,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/ml-regression-base/-/ml-regression-base-4.0.0.tgz", "integrity": "sha512-V2VjB+K/BcgXaX450xvYw36TLOB+piD9G1pHU3VE+ggQUApsVGkYco6UMQykFOwBydHnDTbOiybH/lwrkqFT4g==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.3", "is-any-array": "^2.0.1" @@ -1034,6 +1039,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/ml-regression-exponential/-/ml-regression-exponential-3.0.2.tgz", "integrity": "sha512-drV4ZSGKMMVNETVa7+/z15Uq9C0F69wNsJbhPvVbERgYRSmoGg+e0X7BYK75TzUvFY8IlYZmvVQOZK334slpbQ==", + "license": "MIT", "dependencies": { "ml-regression-base": "^4.0.0", "ml-regression-simple-linear": "^3.0.0" @@ -1043,6 +1049,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/ml-regression-polynomial/-/ml-regression-polynomial-3.0.2.tgz", "integrity": "sha512-RkHQeviEi7q6d2npCeH9MiRTPsBBqqSeqiWV3yctTFXvYgavy5MkpnCqGElHDb62Y3cTXlNQpmD4T7LA7yfGvw==", + "license": "MIT", "dependencies": { "ml-matrix": "^6.12.0", "ml-regression-base": "^4.0.0" @@ -1052,6 +1059,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/ml-regression-simple-linear/-/ml-regression-simple-linear-3.0.1.tgz", "integrity": "sha512-SF2oxA+034Co9GVQSFuS3vtACaRAFrEwHi9oX6VTaSY/KtXxseL3d4GApj4jWXMoAgrP7VMoIO1PH0RoZaMR1g==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.3", "ml-regression-base": "^4.0.0" @@ -1061,6 +1069,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/ml-rolling-ball-baseline/-/ml-rolling-ball-baseline-2.0.3.tgz", "integrity": "sha512-L7F+BfO4VsxEpPrAGUYWnupf6brodboU0fb3mK8P4k1MbtSDYJJtMGXfxY0PT3mQ+FgOpb6j+X49jzRT1hGShw==", + "license": "MIT", "dependencies": { "is-any-array": "^2.0.1", "ml-spectra-processing": "^14.2.0" @@ -1070,6 +1079,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/ml-savitzky-golay-generalized/-/ml-savitzky-golay-generalized-4.2.0.tgz", "integrity": "sha512-Pcn0URPuFbmxNC75SvukByL1Ct+DYQuyo8O5EfmUcHacx+zeODbIoPRgrWwEWZGvZAJ03aS9avTwV0VUNdtAZQ==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.3", "is-any-array": "^2.0.1" @@ -1079,6 +1089,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-2.0.0.tgz", "integrity": "sha512-U7jY/QvTXKj2fDedOXNQf+hSXclQY+tVdVSsQzIQve6GL5a8W/kBHQ71dq80duNBB9bsv74Y4axOwD1AeMLyOA==", + "license": "MIT", "dependencies": { "baselines": "^1.1.9", "cheminfo-types": "^1.8.1", @@ -1088,14 +1099,16 @@ } }, "node_modules/ml-simple-clustering": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ml-simple-clustering/-/ml-simple-clustering-0.1.0.tgz", - "integrity": "sha512-t1jLL5nzUsNXBcAjcHTkCK2E7i2pEO1qrGzZmzS4BHWWMFxi2OUzBLTpK4MgwxLt0oQLkNGLr6NL4vcDxC2ePw==" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ml-simple-clustering/-/ml-simple-clustering-1.0.0.tgz", + "integrity": "sha512-YTTSKfVHiALLU8NOaaU7J6UhyiUoaroNk3InfLefU7LyQBrctpYcSrAU3tBeE+bVe53w1TxRJqW8JIyDPEnSfg==", + "license": "MIT" }, "node_modules/ml-sparse-matrix": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ml-sparse-matrix/-/ml-sparse-matrix-2.1.0.tgz", - "integrity": "sha512-ukJGbyGv+Zc0llNLVRpegMhRFW14O+i9ZhSEGBxuuSX8g5rA1S+Q+0r2JMKDM9cNM8QsvgtOPG7z/7pbjpoqzg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ml-sparse-matrix/-/ml-sparse-matrix-3.1.0.tgz", + "integrity": "sha512-oTO38aQ2KeeCzw7u8MTJkI3j5Irn+h9KMc7j7Qi2Dg0AADGWwwhCwrx5BWoYGN3x5b+AfsJ6CKuUOBQnNk9YgA==", + "license": "MIT", "dependencies": { "ml-hash-table": "^1.0.0" } @@ -1104,6 +1117,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ml-spectra-fitting/-/ml-spectra-fitting-5.0.1.tgz", "integrity": "sha512-uqSc01tED7PNYYEvtPCAp7QGybZVi1K0HgHlqu5cAxjbpfnDS+XcOc2rTPprf8GoZ9Y3xL/fxyY4Gc5+Dh7e4A==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.7.2", "ml-direct": "^1.0.0", @@ -1113,9 +1127,10 @@ } }, "node_modules/ml-spectra-processing": { - "version": "14.12.0", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.12.0.tgz", - "integrity": "sha512-RoJj2r4tGElyPDwBzmoCa+j3rLomBzz+JHGVPxf1tASAE82NkjgvuCFZFay+g0DXTkxDGYFxor+zayqA4nQrng==", + "version": "14.17.1", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.17.1.tgz", + "integrity": "sha512-ff2K8Nb91I5fSYcRRiHH0RvUIX1nC4TGg/ctbbyf6R7SUR5MgKF5Kicj+w1HACCK4DQ1HvSc2ZHVE2Z1NDvCRQ==", + "license": "MIT", "dependencies": { "binary-search": "^1.3.6", "cheminfo-types": "^1.8.1", @@ -1126,19 +1141,22 @@ } }, "node_modules/ml-tree-set": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ml-tree-set/-/ml-tree-set-0.1.1.tgz", - "integrity": "sha512-9XZv+/hSltnsN61Cgb7PCFGxmo1HZn2JxDugnNHZDh0ZryJp7qtmcnPZLw/KrQLgG1JqdkKlfhmAYajSukb8yg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ml-tree-set/-/ml-tree-set-1.0.1.tgz", + "integrity": "sha512-AoN65YFeZuFTwwu3LUePD3f1IaI3FZ8n6YBgDs3SP9m6XqrtZhxYc/N8mLswLL1lMa6ZeWdzRiq2A5jurD0sgA==", + "license": "MIT" }, "node_modules/ml-xsadd": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ml-xsadd/-/ml-xsadd-3.0.1.tgz", - "integrity": "sha512-Fz2q6dwgzGM8wYKGArTUTZDGa4lQFA2Vi6orjGeTVRy22ZnQFKlJuwS9n8NRviqz1KHAHAzdKJwbnYhdo38uYg==" + "integrity": "sha512-Fz2q6dwgzGM8wYKGArTUTZDGa4lQFA2Vi6orjGeTVRy22ZnQFKlJuwS9n8NRviqz1KHAHAzdKJwbnYhdo38uYg==", + "license": "MIT" }, "node_modules/multiplet-analysis": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/multiplet-analysis/-/multiplet-analysis-2.1.5.tgz", "integrity": "sha512-5+CF7qj/ccP+KZquYI2tDEjkGmRL6w1fciAs0OvTzSbAGsi5mEH7oruUipcXh2O6bgZhrY1TduBQkdFVXGJUwQ==", + "license": "MIT", "dependencies": { "cheminfo-types": "^1.8.1", "fft.js": "^4.0.4", @@ -1149,7 +1167,8 @@ "node_modules/next-power-of-two": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/next-power-of-two/-/next-power-of-two-1.0.0.tgz", - "integrity": "sha512-+z6QY1SxkDk6CQJAeaIZKmcNubBCRP7J8DMQUBglz/sSkNsZoJ1kULjqk9skNPPplzs4i9PFhYrvNDdtQleF/A==" + "integrity": "sha512-+z6QY1SxkDk6CQJAeaIZKmcNubBCRP7J8DMQUBglz/sSkNsZoJ1kULjqk9skNPPplzs4i9PFhYrvNDdtQleF/A==", + "license": "MIT" }, "node_modules/nmr-correlation": { "version": "2.3.5", @@ -1162,9 +1181,10 @@ } }, "node_modules/nmr-processing": { - "version": "19.0.0", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-19.0.0.tgz", - "integrity": "sha512-Yjq1LKPx0iVODqo/hNpsNqIGFUI3dJK50ZIKSd3iuXgKuX9Eh0NxHvvfnO4YcRHplojnvK/5F0IldfY5+LLGfA==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-19.1.0.tgz", + "integrity": "sha512-Yu1iIITUiR63VrmE0SeGYcNWidYP4oldkD3V2AqQ15oDHBtmIxJkWV7q+MD/x9l44/6zpET8KNS/mdETfPAeUg==", + "license": "CC-BY-NC-SA-4.0", "dependencies": { "binary-search": "^1.3.6", "d3-color": "3.1.0", @@ -1179,63 +1199,61 @@ "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^5.0.0", "ml-matrix": "^6.12.1", - "ml-matrix-convolution": "^1.0.0", - "ml-matrix-peaks-finder": "^1.0.0", - "ml-peak-shape-generator": "^4.1.4", + "ml-matrix-convolution": "^2.0.0", + "ml-matrix-peaks-finder": "^2.0.0", + "ml-peak-shape-generator": "^4.2.0", "ml-regression-base": "^4.0.0", "ml-regression-exponential": "^3.0.2", "ml-regression-polynomial": "^3.0.2", "ml-regression-simple-linear": "^3.0.1", "ml-savitzky-golay-generalized": "^4.2.0", "ml-signal-processing": "^2.0.0", - "ml-simple-clustering": "^0.1.0", - "ml-sparse-matrix": "^2.1.0", - "ml-spectra-processing": "^14.12.0", - "ml-tree-set": "^0.1.1", + "ml-simple-clustering": "^1.0.0", + "ml-sparse-matrix": "^3.1.0", + "ml-spectra-processing": "^14.14.1", + "ml-tree-set": "^1.0.1", "multiplet-analysis": "^2.1.5", - "nmr-correlation": "^2.3.5", + "nmr-correlation": "^3.0.0", "numeral": "^2.0.6", - "openchemlib-utils": "^8.1.1", + "openchemlib-utils": "^8.2.0", "spectrum-generator": "^8.1.0" } }, - "node_modules/nmr-processing/node_modules/get-value": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-4.0.1.tgz", - "integrity": "sha512-QTDzwunK3V+VlJJlL0BlCzebAaE8OSlUC+UVd80PiekTw1gpzQSb3cfEQB2LYFWr1lbWfbdqL4pjAoJDPCLxhQ==" - }, - "node_modules/nmr-processing/node_modules/gyromagnetic-ratio": { + "node_modules/nmr-processing/node_modules/ml-matrix-convolution": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gyromagnetic-ratio/-/gyromagnetic-ratio-2.0.0.tgz", - "integrity": "sha512-LrpOHxgnxo0+yqtmA+1FUyl9RkvhTCiIiIPGzo8Yn6TXz6OiY5CJ5k5IqThF61qnkbC+fe6q3kF67OI6d0HyjQ==" + "resolved": "https://registry.npmjs.org/ml-matrix-convolution/-/ml-matrix-convolution-2.0.0.tgz", + "integrity": "sha512-XuEZf4ZTffAz7oDMG4olkh9aZmsIMr343gPTY+ZvnLWTlMiG+TegRbP4fpA1ju7/IK9q8u3TcC2cxf/N3ydtRA==", + "license": "MIT", + "dependencies": { + "ml-fft": "^1.3.5" + } }, - "node_modules/nmr-processing/node_modules/openchemlib": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.2.0.tgz", - "integrity": "sha512-MM5GcbYNBzWpsVDYJP4TNMftvA/+sYigLihKl/T3Qn2tZZFNXEPbiUbfBM39HQalpEpb5oFWhbjW+T4TydFbhg==", - "peer": true + "node_modules/nmr-processing/node_modules/ml-matrix-peaks-finder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ml-matrix-peaks-finder/-/ml-matrix-peaks-finder-2.0.0.tgz", + "integrity": "sha512-dbXMpiWFZEMRP4XgD53+vuLJpa/fDXyJDL0A9SXHG0GRZUwq+B+BUYx1OhYrdoCkAROe+b554VCoH1wpQINTiQ==", + "license": "MIT", + "dependencies": { + "ml-disjoint-set": "^1.0.0", + "ml-matrix-convolution": "^2.0.0" + } }, - "node_modules/nmr-processing/node_modules/openchemlib-utils": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.1.2.tgz", - "integrity": "sha512-j/kEkI0D0JfiRCUXCPt+Vn1ZY9gzC2K05+sXoF++xH8lymIuBECQOOdU4yxZ/7yfXTyGxYfKzMXUJLHCKZrjzQ==", + "node_modules/nmr-processing/node_modules/nmr-correlation": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/nmr-correlation/-/nmr-correlation-3.0.1.tgz", + "integrity": "sha512-0iuce3dLBpdcHn0Q/SX3gHvshRCUyN8X6iL6Y97VcK7JS3g8yZSQCIKjft8jsAOUzWP1rX8c1aCxw3BnCjrBEQ==", + "license": "MIT", "dependencies": { - "atom-sorter": "^2.2.0", - "ensure-string": "^1.2.0", - "get-value": "^4.0.1", - "ml-floyd-warshall": "^3.0.1", - "ml-matrix": "^6.12.1", - "papaparse": "^5.5.3", - "sdf-parser": "^7.0.4" - }, - "peerDependencies": { - "openchemlib": ">=9.0.0" + "cheminfo-types": "^1.8.1", + "ml-matrix-peaks-finder": "^2.0.0", + "ml-peak-shape-generator": "^4.2.0" } }, "node_modules/num-sort": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz", "integrity": "sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==", + "license": "MIT", "engines": { "node": ">=8" }, @@ -1247,10 +1265,35 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/numeral/-/numeral-2.0.6.tgz", "integrity": "sha512-qaKRmtYPZ5qdw4jWJD6bxEf1FJEqllJrwxCLIm0sQU/A7v2/czigzOb+C2uSiFsa9lBUzeH7M1oK+Q+OLxL3kA==", + "license": "MIT", "engines": { "node": "*" } }, + "node_modules/openchemlib": { + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.7.0.tgz", + "integrity": "sha512-IMO5O+151rrfakuTkEpCsZvMXFqfCGWrXarlEBukiAqDYhxqSG0LtyzZdtTn0ETSY8Nz+oTLGs1iJ2tRRUK7lA==", + "license": "BSD-3-Clause" + }, + "node_modules/openchemlib-utils": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.3.1.tgz", + "integrity": "sha512-Fzgw80e/W7G5CT6DZknaIkL0DlzBPU9ocu1UL1zIEuYQ7vdpSq9u0rEQcvrlMOj4mNKNagNBIzmO99se39HoVg==", + "license": "MIT", + "dependencies": { + "atom-sorter": "^2.2.1", + "ensure-string": "^1.2.0", + "get-value": "^4.0.1", + "ml-floyd-warshall": "^3.0.1", + "ml-matrix": "^6.12.1", + "papaparse": "^5.5.3", + "sdf-parser": "^7.0.4" + }, + "peerDependencies": { + "openchemlib": ">=9.3.0" + } + }, "node_modules/pako": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", @@ -1259,7 +1302,8 @@ "node_modules/papaparse": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", - "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==" + "integrity": "sha512-5QvjGxYVjxO59MGU2lHVYpRWBBtKHnlIAcSe1uNFCkkptUh63NFRj0FJQm7nR67puEruUci/ZkjmEFrjCAyP4A==", + "license": "MIT" }, "node_modules/playwright": { "version": "1.55.0", @@ -1324,6 +1368,7 @@ "version": "7.0.4", "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-7.0.4.tgz", "integrity": "sha512-j4VIBVTVJqs95Asz0lcIku1VjlVgKKWlwDV2JmCIq1exlI9WOSBT9rQvwvTPwl0v2TTgdQLfhYnBmiRg318LoQ==", + "license": "MIT", "dependencies": { "dynamic-typing": "^1.0.1", "ensure-string": "^1.2.0" @@ -1335,9 +1380,10 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "node_modules/spectrum-generator": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.1.0.tgz", - "integrity": "sha512-OJxJ7fGR+cJ9AyQegeaKaZtjGh+lxk/9A6UFBoeodduI82VIKpm0bjjSd2Q6t5BIFLsYicbMztY1hcx+55Oe2w==", + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.1.1.tgz", + "integrity": "sha512-u5xXYVKV/cZ4gNjFjwcJ4eqMui+XVKEoRWqxdI/Bu0hEx1gRTHzBL4dlJwnhaad+J887X77k03bVAigRXOwKxA==", + "license": "MIT", "dependencies": { "ml-peak-shape-generator": "^4.1.4", "ml-spectra-processing": "^14.10.0" @@ -1441,7 +1487,8 @@ "node_modules/typescript-event-target": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/typescript-event-target/-/typescript-event-target-1.1.1.tgz", - "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==" + "integrity": "sha512-dFSOFBKV6uwaloBCCUhxlD3Pr/P1a/tJdcmPrTXCHlEFD3faj0mztjcGn6VBAhQ0/Bdy8K3VWrrqwbt/ffsYsg==", + "license": "MIT" }, "node_modules/undici-types": { "version": "7.10.0", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 3b8d98a..57f68dd 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,11 +15,11 @@ "nmr-cli": "./build/index.js" }, "dependencies": { - "@zakodium/nmrium-core": "^0.1.3", - "@zakodium/nmrium-core-plugins": "^0.1.4", + "@zakodium/nmrium-core": "^0.1.7", + "@zakodium/nmrium-core-plugins": "^0.1.10", "axios": "^1.11.0", "filelist-utils": "^1.11.3", - "nmr-processing": "^19.0.0", + "nmr-processing": "^19.1.0", "playwright": "^1.55.0", "yargs": "^18.0.0" }, From 9c0e0d4b043d545f68215d250e2c7caeec077984 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 27 Oct 2025 13:27:47 +0100 Subject: [PATCH 37/44] chore(nmr-cli): update dependencies chore: update playwright docker image chore: update dependencies --- app/scripts/nmr-cli/Dockerfile | 2 +- app/scripts/nmr-cli/package-lock.json | 57 ++++++++++++++------------- app/scripts/nmr-cli/package.json | 20 +++++----- 3 files changed, 40 insertions(+), 39 deletions(-) diff --git a/app/scripts/nmr-cli/Dockerfile b/app/scripts/nmr-cli/Dockerfile index 207c4d3..6b0c237 100644 --- a/app/scripts/nmr-cli/Dockerfile +++ b/app/scripts/nmr-cli/Dockerfile @@ -1,7 +1,7 @@ # build the image ` docker build --tag nmr-cli . ` # run the container ` docker run -it nmr-cli bash ` -FROM mcr.microsoft.com/playwright:v1.55.0-noble +FROM mcr.microsoft.com/playwright:v1.56.1-noble SHELL ["/bin/bash", "-o", "pipefail", "-c"] diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 56a1a7a..f93f2a9 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -11,20 +11,20 @@ "dependencies": { "@zakodium/nmrium-core": "^0.1.7", "@zakodium/nmrium-core-plugins": "^0.1.10", - "axios": "^1.11.0", + "axios": "^1.12.2", "filelist-utils": "^1.11.3", "nmr-processing": "^19.1.0", - "playwright": "^1.55.0", + "playwright": "^1.56.1", "yargs": "^18.0.0" }, "bin": { "nmr-cli": "build/index.js" }, "devDependencies": { - "@types/node": "^24.3.1", - "@types/yargs": "^17.0.33", + "@types/node": "^24.9.1", + "@types/yargs": "^17.0.34", "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "typescript": "^5.9.3" } }, "node_modules/@cspotcode/source-map-support": { @@ -95,20 +95,21 @@ "dev": true }, "node_modules/@types/node": { - "version": "24.3.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.1.tgz", - "integrity": "sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.10.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "version": "17.0.34", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz", + "integrity": "sha512-KExbHVa92aJpw9WDQvzBaGVE2/Pz+pLZQloT2hjL8IqsZnV62rlPOYvNnLmf/L2dyllfVUOVBj64M0z/46eR2A==", "dev": true, + "license": "MIT", "dependencies": { "@types/yargs-parser": "*" } @@ -234,9 +235,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -1306,12 +1307,12 @@ "license": "MIT" }, "node_modules/playwright": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.0.tgz", - "integrity": "sha512-sdCWStblvV1YU909Xqx0DhOjPZE4/5lJsIS84IfN9dAZfcl/CIZ5O8l3o0j7hPMjDvqoTF8ZUcc+i/GL5erstA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.0" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -1324,9 +1325,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.0.tgz", - "integrity": "sha512-GvZs4vU3U5ro2nZpeiwyb0zuFaqb9sUiAJuyrWpcGouD8y9/HLgGbNRjIph7zU9D3hnPaisMl9zG9CgFi/biIg==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" @@ -1471,9 +1472,9 @@ } }, "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1491,9 +1492,9 @@ "license": "MIT" }, "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 57f68dd..5f8dc57 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,18 +15,18 @@ "nmr-cli": "./build/index.js" }, "dependencies": { - "@zakodium/nmrium-core": "^0.1.7", - "@zakodium/nmrium-core-plugins": "^0.1.10", - "axios": "^1.11.0", - "filelist-utils": "^1.11.3", - "nmr-processing": "^19.1.0", - "playwright": "^1.55.0", + "@zakodium/nmrium-core": "^0.4.2", + "@zakodium/nmrium-core-plugins": "^0.5.3", + "axios": "^1.13.0", + "file-collection": "^5.4.0", + "nmr-processing": "^20.1.0", + "playwright": "^1.56.1", "yargs": "^18.0.0" }, "devDependencies": { - "@types/node": "^24.3.1", - "@types/yargs": "^17.0.33", + "@types/node": "^24.9.1", + "@types/yargs": "^17.0.34", "ts-node": "^10.9.2", - "typescript": "^5.9.2" + "typescript": "^5.9.3" } -} +} \ No newline at end of file From b9b2cbb5c40c6a9a135cd6b7c11bdfc9c01ee39c Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Tue, 28 Oct 2025 14:09:19 +0100 Subject: [PATCH 38/44] feat(nmr-cli): update NMRium core packages --- app/scripts/nmr-cli/package-lock.json | 240 +++++------------- app/scripts/nmr-cli/src/prase-spectra.ts | 15 +- .../src/prediction/parsePredictionCommand.ts | 5 +- app/scripts/nmr-cli/src/publication-string.ts | 3 +- 4 files changed, 75 insertions(+), 188 deletions(-) diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index f93f2a9..76095cb 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,11 +9,11 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@zakodium/nmrium-core": "^0.1.7", - "@zakodium/nmrium-core-plugins": "^0.1.10", + "@zakodium/nmrium-core": "^0.4.2", + "@zakodium/nmrium-core-plugins": "^0.5.3", "axios": "^1.12.2", - "filelist-utils": "^1.11.3", - "nmr-processing": "^19.1.0", + "file-collection": "^5.4.0", + "nmr-processing": "^20.1.0", "playwright": "^1.56.1", "yargs": "^18.0.0" }, @@ -121,53 +121,53 @@ "dev": true }, "node_modules/@zakodium/nmrium-core": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core/-/nmrium-core-0.1.7.tgz", - "integrity": "sha512-aKSXINlAcNyXjo2gs1/ePgfB6SbW2SRYle8/zjg0My8nvsZozbsjW+VtM/QXGEfYthgyw3HcsIr489AhUyEH9A==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core/-/nmrium-core-0.4.2.tgz", + "integrity": "sha512-Hattb65cahl5o7rJmqI1ZMJsJQCLXNkhAyUYYXqai0Awf0iV1HujlXn5+hmDSpZmKqAIEBlKENqP6aUxLPZq3A==", "license": "CC-BY-NC-SA-4.0", "dependencies": { "cheminfo-types": "^1.8.1", "fifo-logger": "^2.0.1", - "file-collection": "^5.1.1", + "file-collection": "^5.4.0", "is-any-array": "^2.0.1", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.17.1", + "ml-spectra-processing": "^14.18.0", "nmr-correlation": "^2.3.5" } }, "node_modules/@zakodium/nmrium-core-plugins": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core-plugins/-/nmrium-core-plugins-0.1.10.tgz", - "integrity": "sha512-f6y6n2bCoN4pUTAbaKl9NNZO1vd86ZFzyeZ8eSAYpyp4z29Pu4r8qBsgKSrJwW7VY916bCZmk++pw25cXyGSuQ==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core-plugins/-/nmrium-core-plugins-0.5.3.tgz", + "integrity": "sha512-tbOSouDdwXnvCI39iNQhDo4+cFJnPVPDhSY3B5k4TIzxBi34WYsXpMGM6d35uy9/MIvek+vJ09W/1FsoIcLFhA==", "license": "CC-BY-NC-SA-4.0", "dependencies": { "@date-fns/utc": "^2.1.1", - "@zakodium/nmrium-core": "^0.1.7", + "@zakodium/nmrium-core": "^0.4.2", "cheminfo-types": "^1.8.1", "convert-to-jcamp": "^6.0.0", "date-fns": "^4.1.0", - "file-collection": "^5.1.1", + "file-collection": "^5.4.0", "gyromagnetic-ratio": "^2.0.0", "is-any-array": "^2.0.1", - "jcampconverter": "^11.0.5", - "linear-sum-assignment": "^1.0.7", + "jcampconverter": "^12.0.1", + "linear-sum-assignment": "^1.0.9", "lodash.merge": "^4.6.2", - "ml-spectra-processing": "^14.17.1", - "nmr-processing": "^19.1.0", - "openchemlib": "^9.7.0", - "openchemlib-utils": "^8.3.1", + "ml-spectra-processing": "^14.18.0", + "nmr-processing": "^20.1.0", + "openchemlib": "^9.12.1", + "openchemlib-utils": "^8.7.0", "sdf-parser": "^7.0.4" } }, "node_modules/@zip.js/zip.js": { - "version": "2.7.73", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.7.73.tgz", - "integrity": "sha512-I2UP8/rdQE5hTtVVL08B7P8XuwXiKuuMUPjNuFOVL/9b+8IsExR9S5jz2H58u0rJjU4M1BikLgqEMG8gZJZVBw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.8.tgz", + "integrity": "sha512-v0KutehhSAuaoFAFGLp+V4+UiZ1mIxQ8vNOYMD7k9ZJaBbtQV49MYlg568oRLiuwWDg2Di58Iw3Q0ESNWR+5JA==", "license": "BSD-3-Clause", "engines": { "bun": ">=0.7.0", "deno": ">=1.0.0", - "node": ">=16.5.0" + "node": ">=18.0.0" } }, "node_modules/acorn": { @@ -321,11 +321,6 @@ "ml-spectra-processing": "^14.2.2" } }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -491,25 +486,15 @@ } }, "node_modules/file-collection": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/file-collection/-/file-collection-5.1.1.tgz", - "integrity": "sha512-zaMg3tvTVZWLQk6TtNcV/iwxm+kJ7HbPGdqWaUzKNXYUH2iPLe3TaGzJDhlCmOg84j7tetf9Bc7i4BQsaEONYA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/file-collection/-/file-collection-5.4.0.tgz", + "integrity": "sha512-xYp3gp244nHg3vccpQjZyxZVIJUGdUbEvDPq/IuFDgx6P0xkU+Zskoc+cOehvJqgo2KZwMaPnVQHnywRHuXJnA==", "license": "MIT", "dependencies": { - "@zip.js/zip.js": "^2.7.72", + "@zip.js/zip.js": "^2.8.8", "cheminfo-types": "^1.8.1" } }, - "node_modules/filelist-utils": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/filelist-utils/-/filelist-utils-1.11.3.tgz", - "integrity": "sha512-KB3d9ruIVHSz53SL1FscfP+QXv1lkPDYE48JoKJ49N1b0AqI6Ux1LLG7ipVCuTlMpBMVW/I1sKEhdvBB4wgsiA==", - "dependencies": { - "cheminfo-types": "^1.7.3", - "jszip": "^3.10.1", - "pako": "^2.1.0" - } - }, "node_modules/follow-redirects": { "version": "1.15.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", @@ -692,35 +677,11 @@ "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==", "license": "MIT" }, - "node_modules/immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/install": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/install/-/install-0.13.0.tgz", - "integrity": "sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/is-any-array": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz", "integrity": "sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ==" }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, "node_modules/isutf8": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-4.0.1.tgz", @@ -731,9 +692,9 @@ } }, "node_modules/jcampconverter": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-11.0.5.tgz", - "integrity": "sha512-/FOcPmKqe7Mac7JYsYZv5vdFKNbg3NxXL9Mi2v9mYf2Tr8l57nKsdkJQjFToNZP827g7IOKmgXBTlOGnaHmmNg==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/jcampconverter/-/jcampconverter-12.0.1.tgz", + "integrity": "sha512-CbUP4uFdYXS+K8H0Zuhs9YPhMQnu2xsZ4yo4TIFrymtlH5bW8xrR9JjNn5ehSBWKgYYYbLtnwoH5QnvrvRVJEg==", "license": "CC-BY-NC-SA-4.0", "dependencies": { "cheminfo-types": "^1.8.1", @@ -741,43 +702,18 @@ "ensure-string": "^1.2.0", "gyromagnetic-ratio": "^2.0.0", "ml-array-median": "^1.1.6", - "openchemlib": "^9.6.0" - } - }, - "node_modules/jszip": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", - "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", - "dependencies": { - "lie": "~3.3.0", - "pako": "~1.0.2", - "readable-stream": "~2.3.6", - "setimmediate": "^1.0.5" - } - }, - "node_modules/jszip/node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, - "node_modules/lie": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", - "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", - "dependencies": { - "immediate": "~3.0.5" + "openchemlib": "^9.12.1" } }, "node_modules/linear-sum-assignment": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.7.tgz", - "integrity": "sha512-jfLoSGwZNyjfY8eK4ayhjfcIu3BfWvP6sWieYzYI3AWldwXVoWEz1gtrQL10v/8YltYLBunqNjeVFXPMUs+MJg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/linear-sum-assignment/-/linear-sum-assignment-1.0.9.tgz", + "integrity": "sha512-1T2Ek3sxpt2mBHeBFMRJEikiIK/yIOwf+mrxv/DkAU/5ddnCMndZL//hFH7QuHa1tbaQADzsf9t7rkGZKqoFfQ==", "license": "MIT", "dependencies": { - "cheminfo-types": "^1.7.3", - "install": "^0.13.0", - "ml-matrix": "^6.11.0", - "ml-spectra-processing": "^14.2.2" + "cheminfo-types": "^1.8.1", + "ml-matrix": "^6.12.1", + "ml-spectra-processing": "^14.18.0" } }, "node_modules/lodash.merge": { @@ -946,9 +882,9 @@ } }, "node_modules/ml-gsd": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.0.1.tgz", - "integrity": "sha512-Du0759hFmjz/LXYnbQcnUs7kP/3iczrczwEAax5W9GTVay9YtR6tZ019PJJK4Fw2aZvysUt3MwrnFZUemsHKCQ==", + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/ml-gsd/-/ml-gsd-13.1.0.tgz", + "integrity": "sha512-CmUZ/hCPCb6L089Xon1U8xSxTR35DMh3ICfaBuP16mKm7HA8XoonAnjnVOjM4ayewDjgMM3KVqPS/+ti3tFYhA==", "license": "MIT", "dependencies": { "cheminfo-types": "^1.8.1", @@ -1087,16 +1023,16 @@ } }, "node_modules/ml-signal-processing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-2.0.0.tgz", - "integrity": "sha512-U7jY/QvTXKj2fDedOXNQf+hSXclQY+tVdVSsQzIQve6GL5a8W/kBHQ71dq80duNBB9bsv74Y4axOwD1AeMLyOA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ml-signal-processing/-/ml-signal-processing-2.1.0.tgz", + "integrity": "sha512-FgZKMMgslSnnT+WKpKwJrInKs0xYmCZb+pz/1Bcr8ks6KQrdNA2xI9jjkr74O5ZSA9RVGjGWt7gG2Ra8UhtrIw==", "license": "MIT", "dependencies": { "baselines": "^1.1.9", "cheminfo-types": "^1.8.1", "ml-gsd": "^13.0.1", "ml-savitzky-golay-generalized": "^4.2.0", - "ml-spectra-processing": "^14.12.0" + "ml-spectra-processing": "^14.17.1" } }, "node_modules/ml-simple-clustering": { @@ -1128,9 +1064,9 @@ } }, "node_modules/ml-spectra-processing": { - "version": "14.17.1", - "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.17.1.tgz", - "integrity": "sha512-ff2K8Nb91I5fSYcRRiHH0RvUIX1nC4TGg/ctbbyf6R7SUR5MgKF5Kicj+w1HACCK4DQ1HvSc2ZHVE2Z1NDvCRQ==", + "version": "14.18.0", + "resolved": "https://registry.npmjs.org/ml-spectra-processing/-/ml-spectra-processing-14.18.0.tgz", + "integrity": "sha512-vzk7Lf/21mm9Otjn13xDFsFL4reDViU6GbtAxQfkXtprARxRRoQScbnlDNE11UhOKXy88/FTnR4vf2osMkT4fA==", "license": "MIT", "dependencies": { "binary-search": "^1.3.6", @@ -1182,9 +1118,9 @@ } }, "node_modules/nmr-processing": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-19.1.0.tgz", - "integrity": "sha512-Yu1iIITUiR63VrmE0SeGYcNWidYP4oldkD3V2AqQ15oDHBtmIxJkWV7q+MD/x9l44/6zpET8KNS/mdETfPAeUg==", + "version": "20.1.0", + "resolved": "https://registry.npmjs.org/nmr-processing/-/nmr-processing-20.1.0.tgz", + "integrity": "sha512-KxNe4JnUB/Rixsl2TmAgxUh9Dqd4PB9FCNiDz7NQFmaC7g6G0IcmdiaDV+rYFf2NhLkDeLIlX6kN3vfW+vSMBw==", "license": "CC-BY-NC-SA-4.0", "dependencies": { "binary-search": "^1.3.6", @@ -1192,11 +1128,11 @@ "d3-interpolate": "^3.0.1", "gyromagnetic-ratio": "^2.0.0", "is-any-array": "^2.0.1", - "linear-sum-assignment": "^1.0.7", + "linear-sum-assignment": "^1.0.9", "ml-airpls": "^2.0.0", "ml-convolution": "^2.0.0", "ml-direct": "^1.0.0", - "ml-gsd": "^13.0.1", + "ml-gsd": "^13.1.0", "ml-hclust": "^3.1.0", "ml-levenberg-marquardt": "^5.0.0", "ml-matrix": "^6.12.1", @@ -1208,16 +1144,17 @@ "ml-regression-polynomial": "^3.0.2", "ml-regression-simple-linear": "^3.0.1", "ml-savitzky-golay-generalized": "^4.2.0", - "ml-signal-processing": "^2.0.0", + "ml-signal-processing": "^2.1.0", "ml-simple-clustering": "^1.0.0", "ml-sparse-matrix": "^3.1.0", - "ml-spectra-processing": "^14.14.1", + "ml-spectra-processing": "^14.18.0", "ml-tree-set": "^1.0.1", "multiplet-analysis": "^2.1.5", "nmr-correlation": "^3.0.0", "numeral": "^2.0.6", - "openchemlib-utils": "^8.2.0", - "spectrum-generator": "^8.1.0" + "openchemlib": "^9.12.1", + "openchemlib-utils": "^8.7.0", + "spectrum-generator": "^8.1.1" } }, "node_modules/nmr-processing/node_modules/ml-matrix-convolution": { @@ -1272,15 +1209,15 @@ } }, "node_modules/openchemlib": { - "version": "9.7.0", - "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.7.0.tgz", - "integrity": "sha512-IMO5O+151rrfakuTkEpCsZvMXFqfCGWrXarlEBukiAqDYhxqSG0LtyzZdtTn0ETSY8Nz+oTLGs1iJ2tRRUK7lA==", + "version": "9.12.1", + "resolved": "https://registry.npmjs.org/openchemlib/-/openchemlib-9.12.1.tgz", + "integrity": "sha512-cODgYX/SMOsT/PkGzw7+DRy//6sZOowkpFyIQYA3dQyNXZU6MXjIvaLMkk5c9j+JTIAiA1JsyARPbKh0AnEcGw==", "license": "BSD-3-Clause" }, "node_modules/openchemlib-utils": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.3.1.tgz", - "integrity": "sha512-Fzgw80e/W7G5CT6DZknaIkL0DlzBPU9ocu1UL1zIEuYQ7vdpSq9u0rEQcvrlMOj4mNKNagNBIzmO99se39HoVg==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/openchemlib-utils/-/openchemlib-utils-8.7.0.tgz", + "integrity": "sha512-UTQnWsxHbSqxor6enmsZUhbh8MGO3ImlilYY2zP+hXo0HGuuSn7B8XkHMRAXHDgURNFM56ezVBtg/RdxX1k9Mg==", "license": "MIT", "dependencies": { "atom-sorter": "^2.2.1", @@ -1292,14 +1229,9 @@ "sdf-parser": "^7.0.4" }, "peerDependencies": { - "openchemlib": ">=9.3.0" + "openchemlib": ">=9.12.0" } }, - "node_modules/pako": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", - "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" - }, "node_modules/papaparse": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.5.3.tgz", @@ -1336,35 +1268,11 @@ "node": ">=18" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, "node_modules/sdf-parser": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/sdf-parser/-/sdf-parser-7.0.4.tgz", @@ -1375,11 +1283,6 @@ "ensure-string": "^1.2.0" } }, - "node_modules/setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" - }, "node_modules/spectrum-generator": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/spectrum-generator/-/spectrum-generator-8.1.1.tgz", @@ -1390,14 +1293,6 @@ "ml-spectra-processing": "^14.10.0" } }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/string-width": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", @@ -1498,11 +1393,6 @@ "dev": true, "license": "MIT" }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", diff --git a/app/scripts/nmr-cli/src/prase-spectra.ts b/app/scripts/nmr-cli/src/prase-spectra.ts index 39937b1..2044e4c 100644 --- a/app/scripts/nmr-cli/src/prase-spectra.ts +++ b/app/scripts/nmr-cli/src/prase-spectra.ts @@ -1,11 +1,8 @@ import { join, isAbsolute } from 'path' import { type NmriumState } from '@zakodium/nmrium-core' import init from '@zakodium/nmrium-core-plugins' -import { - fileCollectionFromWebSource, - fileCollectionFromPath, -} from 'filelist-utils' import playwright from 'playwright' +import { FileCollection } from 'file-collection' interface Snapshot { image: string @@ -94,11 +91,11 @@ async function loadSpectrumFromURL(url: string, enableSnapshot = false) { ], baseURL, } - const fileCollection = await fileCollectionFromWebSource(source, {}) + const [nmriumState] = await core.readFromWebSource(source); const { - nmriumState: { data, version }, - } = await core.read(fileCollection) + data, version + } = nmriumState; let images: Snapshot[] = [] @@ -112,7 +109,9 @@ async function loadSpectrumFromURL(url: string, enableSnapshot = false) { async function loadSpectrumFromFilePath(path: string, enableSnapshot = false) { const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) - const fileCollection = await fileCollectionFromPath(dirPath, {}) + const fileCollection = await FileCollection.fromPath(dirPath, { + unzip: { zipExtensions: ['zip', 'nmredata'] }, + }) const { nmriumState: { data, version }, diff --git a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts index d8160b3..4387a18 100644 --- a/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts +++ b/app/scripts/nmr-cli/src/prediction/parsePredictionCommand.ts @@ -4,7 +4,6 @@ import { GenerateSpectrumOptions, ShiftsItem, } from './generatePredictedSpectrumData' -import { v4 } from '@lukeed/uuid' import { CURRENT_EXPORT_VERSION } from '@zakodium/nmrium-core' import https from 'https' @@ -184,7 +183,7 @@ async function predictNMR(options: PredictionArgs): Promise { const spectra = [] for (const result of responseResult.result) { - const name = v4() + const name = crypto.randomUUID() const data = generatePredictedSpectrumData(result.shifts, { from, to, @@ -209,7 +208,7 @@ async function predictNMR(options: PredictionArgs): Promise { } spectra.push({ - id: v4(), + id: crypto.randomUUID(), data, info, }) diff --git a/app/scripts/nmr-cli/src/publication-string.ts b/app/scripts/nmr-cli/src/publication-string.ts index 3133a53..8f0d288 100644 --- a/app/scripts/nmr-cli/src/publication-string.ts +++ b/app/scripts/nmr-cli/src/publication-string.ts @@ -3,7 +3,6 @@ import { rangesToXY, type NMRRangeWithIntegration, } from 'nmr-processing' -import { v4 } from '@lukeed/uuid' import { CURRENT_EXPORT_VERSION } from '@zakodium/nmrium-core' import { castToArray } from './utilities/castToArray' @@ -41,7 +40,7 @@ function generateSpectrumFromRanges( } const spectrum = { - id: v4(), + id: crypto.randomUUID(), data: { x: castToArray(x), im: undefined, re: castToArray(y) }, info, ranges: { From 481441ce3278d077b944453705d1f3c9225a7946 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 31 Oct 2025 11:30:32 +0100 Subject: [PATCH 39/44] feat: auto processing 1d core functions --- app/scripts/nmr-cli/package-lock.json | 67 ++++++++++++++-- app/scripts/nmr-cli/package.json | 7 +- .../data/data1D/convertDataToFloat64Array.ts | 13 ++++ .../src/parse/data/data1D/initSumOptions.ts | 56 ++++++++++++++ .../src/parse/data/data1D/initiateDatum1D.ts | 77 +++++++++++++++++++ .../parse/data/data1D/initiateIntegrals.ts | 20 +++++ .../src/parse/data/data1D/initiatePeaks.ts | 13 ++++ .../src/parse/data/data1D/initiateRanges.ts | 20 +++++ .../nmr-cli/src/parse/data/initiateFilters.ts | 8 ++ .../nmr-cli/src/{ => parse}/prase-spectra.ts | 0 .../src/parse/type/MoleculeExtended.ts | 11 +++ .../nmr-cli/src/parse/utility/getAtom.ts | 3 + .../nmr-cli/src/parse/utility/isProton.ts | 3 + 13 files changed, 292 insertions(+), 6 deletions(-) create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/convertDataToFloat64Array.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/initSumOptions.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/initiateDatum1D.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/initiateIntegrals.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/initiatePeaks.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/initiateRanges.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/initiateFilters.ts rename app/scripts/nmr-cli/src/{ => parse}/prase-spectra.ts (100%) create mode 100644 app/scripts/nmr-cli/src/parse/type/MoleculeExtended.ts create mode 100644 app/scripts/nmr-cli/src/parse/utility/getAtom.ts create mode 100644 app/scripts/nmr-cli/src/parse/utility/isProton.ts diff --git a/app/scripts/nmr-cli/package-lock.json b/app/scripts/nmr-cli/package-lock.json index 76095cb..37ab0fb 100644 --- a/app/scripts/nmr-cli/package-lock.json +++ b/app/scripts/nmr-cli/package-lock.json @@ -9,10 +9,14 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "@zakodium/nmr-types": "^0.4.0", "@zakodium/nmrium-core": "^0.4.2", "@zakodium/nmrium-core-plugins": "^0.5.3", - "axios": "^1.12.2", + "axios": "^1.13.0", "file-collection": "^5.4.0", + "lodash.merge": "^4.6.2", + "mf-parser": "^3.6.0", + "ml-spectra-processing": "^14.18.0", "nmr-processing": "^20.1.0", "playwright": "^1.56.1", "yargs": "^18.0.0" @@ -21,6 +25,7 @@ "nmr-cli": "build/index.js" }, "devDependencies": { + "@types/lodash.merge": "^4.6.9", "@types/node": "^24.9.1", "@types/yargs": "^17.0.34", "ts-node": "^10.9.2", @@ -94,6 +99,23 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash.merge": { + "version": "4.6.9", + "resolved": "https://registry.npmjs.org/@types/lodash.merge/-/lodash.merge-4.6.9.tgz", + "integrity": "sha512-23sHDPmzd59kUgWyKGiOMO2Qb9YtqRO/x4IhkgNUiPQ1+5MUVqi6bCZeq9nBJ17msjIMbEIO5u+XW4Kz6aGUhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, "node_modules/@types/node": { "version": "24.9.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", @@ -120,6 +142,17 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, + "node_modules/@zakodium/nmr-types": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@zakodium/nmr-types/-/nmr-types-0.4.0.tgz", + "integrity": "sha512-teWfqqfvgI5zhWv9FObbmedrbHWEyau84/NCQk4ykbJ1uVEHU6srmKJFOGngkWTY3/Dbr0sJp2MRm7eBaNlvdA==", + "license": "CC-BY-NC-SA-4.0", + "dependencies": { + "ml-peak-shape-generator": "^4.2.0", + "ml-signal-processing": "^2.1.0", + "ml-spectra-processing": "^14.18.0" + } + }, "node_modules/@zakodium/nmrium-core": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@zakodium/nmrium-core/-/nmrium-core-0.4.2.tgz", @@ -235,9 +268,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", - "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", + "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", @@ -277,6 +310,18 @@ "node": ">= 0.4" } }, + "node_modules/chemical-elements": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/chemical-elements/-/chemical-elements-2.2.1.tgz", + "integrity": "sha512-Khr3m8RhBbNwDb2MSo9Zb9O+dcUuFourUC0hK+YxNhAtEhOwJPVTMDQeDi1vUwH44tUeNRNKriUs2QQFNQvxgg==", + "license": "MIT" + }, + "node_modules/chemical-groups": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/chemical-groups/-/chemical-groups-2.2.3.tgz", + "integrity": "sha512-rIhA7dC2OJNbQeEFM6+3u81hItYWkaYbWh7awn3hy9RI1qCvhQgdTkrvt7zlLCmcp2nuMzJZUXSju6etBsf6lA==", + "license": "MIT" + }, "node_modules/cheminfo-types": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/cheminfo-types/-/cheminfo-types-1.8.1.tgz", @@ -719,7 +764,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "license": "MIT" }, "node_modules/make-error": { "version": "1.3.6", @@ -742,6 +788,17 @@ "integrity": "sha512-/QL9ptNuLsdA68qO+2o10TKCyu621zwwTFdLvtu8rzRNKsn8zvuGoq/vDxECPyELFG8wu+BpyoMR9BnsJqfVZQ==", "license": "ISC" }, + "node_modules/mf-parser": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/mf-parser/-/mf-parser-3.6.0.tgz", + "integrity": "sha512-vBE7hE8ZB2rtMPxJZHgfuMQIF98ebqXUDTtG/EzapRJ/CDurI/bEo8ZEyQI+ZKznGXr6HGcnBdoE2+U52v/JtA==", + "license": "MIT", + "dependencies": { + "atom-sorter": "^2.2.1", + "chemical-elements": "^2.2.1", + "chemical-groups": "^2.2.3" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", diff --git a/app/scripts/nmr-cli/package.json b/app/scripts/nmr-cli/package.json index 5f8dc57..53c95a6 100644 --- a/app/scripts/nmr-cli/package.json +++ b/app/scripts/nmr-cli/package.json @@ -15,18 +15,23 @@ "nmr-cli": "./build/index.js" }, "dependencies": { + "@zakodium/nmr-types": "^0.4.0", "@zakodium/nmrium-core": "^0.4.2", "@zakodium/nmrium-core-plugins": "^0.5.3", "axios": "^1.13.0", "file-collection": "^5.4.0", + "lodash.merge": "^4.6.2", + "mf-parser": "^3.6.0", + "ml-spectra-processing": "^14.18.0", "nmr-processing": "^20.1.0", "playwright": "^1.56.1", "yargs": "^18.0.0" }, "devDependencies": { + "@types/lodash.merge": "^4.6.9", "@types/node": "^24.9.1", "@types/yargs": "^17.0.34", "ts-node": "^10.9.2", "typescript": "^5.9.3" } -} \ No newline at end of file +} diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/convertDataToFloat64Array.ts b/app/scripts/nmr-cli/src/parse/data/data1D/convertDataToFloat64Array.ts new file mode 100644 index 0000000..b0c39d4 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/convertDataToFloat64Array.ts @@ -0,0 +1,13 @@ +import type { NmrData1D } from 'cheminfo-types'; + +function convert(value: Float64Array | number[] = []): Float64Array { + return !ArrayBuffer.isView(value) && value ? Float64Array.from(value) : value; +} + +export function convertDataToFloat64Array(data: NmrData1D): NmrData1D { + return { + x: convert(data.x), + re: convert(data.re), + im: convert(data?.im), + }; +} diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/initSumOptions.ts b/app/scripts/nmr-cli/src/parse/data/data1D/initSumOptions.ts new file mode 100644 index 0000000..d02e573 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/initSumOptions.ts @@ -0,0 +1,56 @@ +import type { SumOptions } from '@zakodium/nmr-types'; +import { MF } from 'mf-parser'; +import getAtom from '../../utility/getAtom'; +import { MoleculeExtended } from '../../type/MoleculeExtended'; + +export { + updateIntegralsRelativeValues, + updateRangesRelativeValues, +} from 'nmr-processing'; + + +export interface SumParams { + nucleus: string; + molecules: MoleculeExtended[]; +} + +export type SetSumOptions = Omit; + +export function initSumOptions( + options: Partial, + params: SumParams, +) { + let newOptions: SumOptions = { + sum: undefined, + isSumConstant: true, + sumAuto: true, + ...options, + }; + const { molecules, nucleus } = params; + + if (options.sumAuto && Array.isArray(molecules) && molecules.length > 0) { + const { mf, id } = molecules[0]; + newOptions = { ...newOptions, sumAuto: true, mf, moleculeId: id }; + } else { + const { mf, moleculeId, ...resOptions } = newOptions; + newOptions = { ...resOptions, sumAuto: false }; + } + if (!newOptions.sum) { + newOptions.sum = getSum(newOptions.mf || null, nucleus); + } + + return newOptions; +} + +export function getSum(mf: string | null | undefined, nucleus: string) { + const defaultSum = 100; + + if (!mf || !nucleus) return defaultSum; + + const atom = getAtom(nucleus); + const atoms = new MF(mf).getInfo().atoms; + + return atoms[atom] || defaultSum; +} + + diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/initiateDatum1D.ts b/app/scripts/nmr-cli/src/parse/data/data1D/initiateDatum1D.ts new file mode 100644 index 0000000..b8cd347 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/initiateDatum1D.ts @@ -0,0 +1,77 @@ +import type { + Spectrum1D, +} from '@zakodium/nmrium-core'; +import { Filters1DManager } from 'nmr-processing'; + +import { initSumOptions } from './initSumOptions.js'; +import { initiateRanges } from './initiateRanges.js'; +import { convertDataToFloat64Array } from './convertDataToFloat64Array.js'; +import { initiateFilters } from '../initiateFilters.js'; +import { MoleculeExtended } from '../../type/MoleculeExtended.js'; +import { initiatePeaks } from './initiatePeaks.js'; +import { initiateIntegrals } from './initiateIntegrals.js'; + + +interface InitiateDatum1DOptions { + molecules?: MoleculeExtended[]; +} + +export function initiateDatum1D( + spectrum: any, + options: InitiateDatum1DOptions = {}, +): Spectrum1D { + const { molecules = [] } = options; + + const { integrals, ranges, ...restSpectrum } = spectrum; + const spectrumObj: Spectrum1D = { ...restSpectrum }; + spectrumObj.id = spectrum.id || crypto.randomUUID(); + + spectrumObj.display = { + isVisible: true, + isRealSpectrumVisible: true, + ...spectrum.display, + }; + + spectrumObj.info = { + nucleus: '1H', // 1H, 13C, 19F, ... + isFid: false, + isComplex: false, // if isComplex is true that mean it contains real/ imaginary x set, if not hid re/im button . + dimension: 1, + ...spectrum.info, + }; + + spectrumObj.originalInfo = spectrumObj.info; + + spectrumObj.meta = { ...spectrum.meta }; + + spectrumObj.customInfo = { ...spectrum.customInfo }; + + spectrumObj.data = convertDataToFloat64Array(spectrum.data); + + spectrumObj.originalData = spectrumObj.data; + + spectrumObj.filters = initiateFilters(spectrum?.filters); //array of object {name: "FilterName", options: FilterOptions = {value | object} } + + const { nucleus } = spectrumObj.info; + + spectrumObj.peaks = initiatePeaks(spectrum, spectrumObj); + + const integralsOptions = initSumOptions(integrals?.options || {}, { + nucleus, + molecules, + }); + spectrumObj.integrals = initiateIntegrals( + spectrum, + spectrumObj, + integralsOptions, + ); + + const rangesOptions = initSumOptions(ranges?.options || {}, { + nucleus, + molecules, + }); + spectrumObj.ranges = initiateRanges(spectrum, spectrumObj, rangesOptions); + + + return spectrumObj; +} diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/initiateIntegrals.ts b/app/scripts/nmr-cli/src/parse/data/data1D/initiateIntegrals.ts new file mode 100644 index 0000000..f5953a6 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/initiateIntegrals.ts @@ -0,0 +1,20 @@ +import type { Integrals } from '@zakodium/nmr-types'; +import type { Spectrum1D } from '@zakodium/nmrium-core'; +import merge from 'lodash.merge'; +import { mapIntegrals } from 'nmr-processing'; + +export function initiateIntegrals( + inputSpectrum: Partial, + spectrum: Spectrum1D, + options: Integrals['options'], +) { + return merge( + { + values: [], + options, + }, + { + values: mapIntegrals(inputSpectrum?.integrals?.values || [], spectrum), + }, + ); +} diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/initiatePeaks.ts b/app/scripts/nmr-cli/src/parse/data/data1D/initiatePeaks.ts new file mode 100644 index 0000000..c998297 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/initiatePeaks.ts @@ -0,0 +1,13 @@ +import type { Peaks } from '@zakodium/nmr-types'; +import type { Spectrum1D } from '@zakodium/nmrium-core'; +import merge from 'lodash.merge'; +import { mapPeaks } from 'nmr-processing'; + +export function initiatePeaks( + inputSpectrum: Partial, + spectrum: Spectrum1D, +): Peaks { + return merge({ values: [], options: {} }, inputSpectrum.peaks, { + values: mapPeaks(inputSpectrum?.peaks?.values || [], spectrum), + }); +} diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/initiateRanges.ts b/app/scripts/nmr-cli/src/parse/data/data1D/initiateRanges.ts new file mode 100644 index 0000000..529eefe --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/initiateRanges.ts @@ -0,0 +1,20 @@ +import type { Ranges } from '@zakodium/nmr-types'; +import type { Spectrum1D } from '@zakodium/nmrium-core'; +import merge from 'lodash.merge'; +import { mapRanges } from 'nmr-processing'; + +export function initiateRanges( + inputSpectrum: Partial, + spectrum: Spectrum1D, + options: Ranges['options'], +) { + return merge( + { + values: [], + options, + }, + { + values: mapRanges(inputSpectrum?.ranges?.values || [], spectrum), + }, + ); +} diff --git a/app/scripts/nmr-cli/src/parse/data/initiateFilters.ts b/app/scripts/nmr-cli/src/parse/data/initiateFilters.ts new file mode 100644 index 0000000..53e1e79 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/initiateFilters.ts @@ -0,0 +1,8 @@ +export function initiateFilters(inputFilters: any): any { + if (!inputFilters || !Array.isArray(inputFilters)) return []; + + return inputFilters.map((filter) => ({ + ...filter, + id: filter?.id || crypto.randomUUID(), + })); +} diff --git a/app/scripts/nmr-cli/src/prase-spectra.ts b/app/scripts/nmr-cli/src/parse/prase-spectra.ts similarity index 100% rename from app/scripts/nmr-cli/src/prase-spectra.ts rename to app/scripts/nmr-cli/src/parse/prase-spectra.ts diff --git a/app/scripts/nmr-cli/src/parse/type/MoleculeExtended.ts b/app/scripts/nmr-cli/src/parse/type/MoleculeExtended.ts new file mode 100644 index 0000000..7e71a00 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/type/MoleculeExtended.ts @@ -0,0 +1,11 @@ +import { StateMolecule } from "@zakodium/nmrium-core"; + +export interface MoleculeExtended + extends Required>, + Omit { + mf: string; + em: number; + mw: number; + svg: string; + atoms: Record; +} \ No newline at end of file diff --git a/app/scripts/nmr-cli/src/parse/utility/getAtom.ts b/app/scripts/nmr-cli/src/parse/utility/getAtom.ts new file mode 100644 index 0000000..68e66ec --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/utility/getAtom.ts @@ -0,0 +1,3 @@ +export default function getAtom(nucleus: string): string { + return nucleus?.replaceAll(/\d/g, '') || ''; +} diff --git a/app/scripts/nmr-cli/src/parse/utility/isProton.ts b/app/scripts/nmr-cli/src/parse/utility/isProton.ts new file mode 100644 index 0000000..85f6e6e --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/utility/isProton.ts @@ -0,0 +1,3 @@ +export function isProton(nucleus: string) { + return nucleus === '1H'; +} From d152538c34e192995b0492879b6e35e27e56dcc4 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 31 Oct 2025 11:31:04 +0100 Subject: [PATCH 40/44] feat: auto ranges detection core function --- .../src/parse/data/data1D/detectRanges.ts | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 app/scripts/nmr-cli/src/parse/data/data1D/detectRanges.ts diff --git a/app/scripts/nmr-cli/src/parse/data/data1D/detectRanges.ts b/app/scripts/nmr-cli/src/parse/data/data1D/detectRanges.ts new file mode 100644 index 0000000..dd8ddd7 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data1D/detectRanges.ts @@ -0,0 +1,145 @@ +import { xFindClosestIndex } from "ml-spectra-processing"; +import { isProton } from "../../utility/isProton"; +import { Spectrum1D } from "@zakodium/nmrium-core"; +import { mapRanges, OptionsXYAutoPeaksPicking, updateRangesRelativeValues, xyAutoRangesPicking } from "nmr-processing"; + + +//TODO expose OptionsPeaksToRanges from nmr-processing +interface OptionsPeaksToRanges { + /** + * Number of hydrogens or some number to normalize the integration data. If it's zero return the absolute integration value + * @default 100 + */ + integrationSum?: number; + /** + * if it is true, it will join any overlaped ranges. + * @default true + */ + joinOverlapRanges?: boolean; + /** + * If exits it remove all the signals with integration < clean value + * @default 0.4 + */ + clean?: number; + /** + * If true, the Janalyzer function is run over signals to compile the patterns. + * @default true + */ + compile?: boolean; + /** + * option to chose between approx area with peaks or the sum of the points of given range ('sum', 'peaks') + * @default 'sum' + */ + integralType?: string; + /** + * Observed frequency + * @default 400 + */ + frequency?: number; + /** + * distance limit to clustering peaks. + * @default 16 + */ + frequencyCluster?: number; + /** + * If true, it will keep the peaks for each signal + */ + keepPeaks?: boolean; + /** + * Nucleus + * @default '1H' + */ + nucleus?: string; + /** + * ratio of heights between the extreme peaks + * @default 1.5 + */ + symRatio?: number; +} + + +interface AutoDetectOptions { + from?: number; + to?: number; + minMaxRatio?: number; + lookNegative?: number; +} + + + +export function detectRanges( + spectrum: Spectrum1D, + options: AutoDetectOptions = {}, +) { + + + const { from, to, minMaxRatio = 0.05, lookNegative = false } = options + const { info: { nucleus, solvent, originFrequency }, data } = spectrum; + let { x, re } = data + const windowFromIndex = from ? xFindClosestIndex(x, from) : undefined; + const windowToIndex = to ? xFindClosestIndex(x, to) : undefined; + + const isProtonic = isProton(nucleus); + + const peakPickingOptions: OptionsXYAutoPeaksPicking = { + ...defaultPeakPickingOptions, + smoothY: undefined, + sensitivity: 100, + broadWidth: 0.05, + thresholdFactor: 8, + minMaxRatio, + direction: lookNegative ? 'both' : 'positive', + frequency: originFrequency, + sgOptions: undefined, + + }; + + const rangesOptions: OptionsPeaksToRanges = { + nucleus, + compile: isProtonic, + frequency: originFrequency, + integrationSum: isProtonic ? spectrum.ranges.options.sum : 100, + frequencyCluster: isProtonic ? 16 : 0, + clean: 0.5, + keepPeaks: true, + joinOverlapRanges: isProtonic, + }; + + if (windowFromIndex !== undefined && windowToIndex !== undefined) { + x = x.slice(windowFromIndex, windowToIndex); + re = re.slice(windowFromIndex, windowToIndex); + } + + + const ranges = xyAutoRangesPicking( + { x, y: re }, + { + impurities: nucleus === '13C' ? { solvent: solvent || '' } : undefined, + peakPicking: peakPickingOptions, + ranges: rangesOptions, + }, + ); + + + spectrum.ranges.values = spectrum.ranges.values.concat( + mapRanges(ranges, spectrum), + ); + + updateRangesRelativeValues(spectrum); +} + + +const defaultPeakPickingOptions: OptionsXYAutoPeaksPicking = { + minMaxRatio: 1, + shape: { kind: 'lorentzian' }, + realTopDetection: true, + maxCriteria: true, + smoothY: true, + sensitivity: 100, + broadWidth: 0.25, + broadRatio: 0.0025, + thresholdFactor: 5, + sgOptions: { windowSize: 7, polynomial: 3 }, + frequency: 0 +}; + From a445d85a59678165617d1fb0fb3e51b3809e60f7 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 31 Oct 2025 11:46:51 +0100 Subject: [PATCH 41/44] feat: auto processing 2d core functions --- .../src/parse/data/data2d/initiateDatum2D.ts | 69 +++++++++++++++++++ .../src/parse/data/data2d/initiateZones.ts | 24 +++++++ .../src/parse/data/data2d/isSpectrum2D.ts | 36 ++++++++++ 3 files changed, 129 insertions(+) create mode 100644 app/scripts/nmr-cli/src/parse/data/data2d/initiateDatum2D.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data2d/initiateZones.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data2d/isSpectrum2D.ts diff --git a/app/scripts/nmr-cli/src/parse/data/data2d/initiateDatum2D.ts b/app/scripts/nmr-cli/src/parse/data/data2d/initiateDatum2D.ts new file mode 100644 index 0000000..3676f1e --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data2d/initiateDatum2D.ts @@ -0,0 +1,69 @@ +import type { + Spectrum2D, +} from '@zakodium/nmrium-core'; +import { Filters2DManager } from 'nmr-processing'; + + +import { initiateZones } from './initiateZones.js'; +import { initiateFilters } from '../initiateFilters.js'; + +const defaultMinMax = { z: [], minX: 0, minY: 0, maxX: 0, maxY: 0 }; + + +function initiateDisplay(spectrum: any) { + return { + isPositiveVisible: true, + isNegativeVisible: true, + isVisible: true, + dimension: 2, + ...spectrum.display, + }; +} + +function initiateInfo(spectrum: any) { + return { + nucleus: ['1H', '1H'], + isFt: true, + isFid: false, + isComplex: false, // if isComplex is true that mean it contains real/ imaginary x set, if not hid re/im button . + dimension: 2, + ...spectrum.info, + }; +} + + +export function initiateDatum2D( + spectrum: any, +): Spectrum2D { + const datum: any = { ...spectrum }; + + datum.id = spectrum.id || crypto.randomUUID(); + + datum.display = initiateDisplay(spectrum); + + datum.info = initiateInfo(spectrum); + + datum.originalInfo = datum.info; + + datum.meta = { ...spectrum.meta }; + + datum.customInfo = { ...spectrum.customInfo }; + + datum.data = getData(datum, spectrum); + datum.originalData = datum.data; + datum.filters = initiateFilters(spectrum?.filters); + + datum.zones = initiateZones(spectrum, datum as Spectrum2D); + + //reapply filters after load the original data + + return datum; +} + +function getData(datum: any, options: any) { + if (datum.info.isFid) { + const { re = defaultMinMax, im = defaultMinMax } = options.data; + return { re, im }; + } + return { rr: defaultMinMax, ...options.data }; +} diff --git a/app/scripts/nmr-cli/src/parse/data/data2d/initiateZones.ts b/app/scripts/nmr-cli/src/parse/data/data2d/initiateZones.ts new file mode 100644 index 0000000..cc16095 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data2d/initiateZones.ts @@ -0,0 +1,24 @@ +import type { Zones } from '@zakodium/nmr-types'; +import type { Spectrum2D } from '@zakodium/nmrium-core'; +import merge from 'lodash.merge'; +import { mapZones } from 'nmr-processing'; + +export function initiateZones( + options: Partial<{ zones: Zones }>, + spectrum: Spectrum2D, +) { + return merge( + { + values: [], + options: { + sum: undefined, + isSumConstant: true, + sumAuto: true, + }, + }, + options.zones, + { + values: mapZones(options?.zones?.values || [], spectrum), + }, + ); +} diff --git a/app/scripts/nmr-cli/src/parse/data/data2d/isSpectrum2D.ts b/app/scripts/nmr-cli/src/parse/data/data2d/isSpectrum2D.ts new file mode 100644 index 0000000..480309b --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data2d/isSpectrum2D.ts @@ -0,0 +1,36 @@ +import type { Spectrum2D, Spectrum } from '@zakodium/nmrium-core'; +import type { NmrData2D, NmrData2DFid, NmrData2DFt } from 'cheminfo-types'; + +export function isSpectrum2D( + spectrum: Spectrum | undefined, +): spectrum is Spectrum2D { + return spectrum?.info.dimension === 2; +} + +function isQuadrantsData(data: NmrData2D): data is NmrData2DFt { + return 'rr' in data && 'ri' in data && 'ir' in data && 'ii' in data; +} +function isFt2DData(data: NmrData2D): data is NmrData2DFt { + return 'rr' in data; +} + +export function isFid2DData(data: NmrData2D): data is NmrData2DFid { + return 're' in data; +} + +export function isFid2DSpectrum( + spectrum: Spectrum, +): spectrum is Spectrum2D & { data: NmrData2DFid } { + return isSpectrum2D(spectrum) && isFid2DData(spectrum.data); +} + +export function isFt2DSpectrum( + spectrum: Spectrum, +): spectrum is Spectrum2D & { data: NmrData2DFt } { + return isSpectrum2D(spectrum) && isFt2DData(spectrum.data); +} +export function isQuadrants2DSpectrum( + spectrum: Spectrum, +): spectrum is Spectrum2D & { data: NmrData2DFt } { + return isSpectrum2D(spectrum) && isQuadrantsData(spectrum.data); +} From 376d8c3cf9542e707f77bb5bc5e9d4cd8e3ab9fc Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Fri, 31 Oct 2025 11:47:18 +0100 Subject: [PATCH 42/44] feat: auto zones detection core function --- .../src/parse/data/data2d/detectZones.ts | 24 ++++ .../parse/data/data2d/getDetectionZones.ts | 121 ++++++++++++++++++ 2 files changed, 145 insertions(+) create mode 100644 app/scripts/nmr-cli/src/parse/data/data2d/detectZones.ts create mode 100644 app/scripts/nmr-cli/src/parse/data/data2d/getDetectionZones.ts diff --git a/app/scripts/nmr-cli/src/parse/data/data2d/detectZones.ts b/app/scripts/nmr-cli/src/parse/data/data2d/detectZones.ts new file mode 100644 index 0000000..62cfe28 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data2d/detectZones.ts @@ -0,0 +1,24 @@ +import { Spectrum2D } from "@zakodium/nmrium-core"; +import { isFt2DSpectrum } from "./isSpectrum2D"; +import { mapZones } from "nmr-processing"; +import { getDetectionZones } from "./getDetectionZones"; +import { Zone } from "@zakodium/nmr-types"; + +export function detectZones(spectrum: Spectrum2D) { + + if (!isFt2DSpectrum(spectrum)) return; + + const { data } = spectrum; + + const { rr: { minX, maxX, minY, maxY } } = data; + const detectionOptions = { + selectedZone: { fromX: minX, toX: maxX, fromY: minY, toY: maxY }, + thresholdFactor: 1, + maxPercentCutOff: 0.03, + }; + + const zones = getDetectionZones(spectrum, detectionOptions); + spectrum.zones.values = mapZones(zones as Zone[], spectrum); + + +} \ No newline at end of file diff --git a/app/scripts/nmr-cli/src/parse/data/data2d/getDetectionZones.ts b/app/scripts/nmr-cli/src/parse/data/data2d/getDetectionZones.ts new file mode 100644 index 0000000..03c62a4 --- /dev/null +++ b/app/scripts/nmr-cli/src/parse/data/data2d/getDetectionZones.ts @@ -0,0 +1,121 @@ +import type { Spectrum2D } from '@zakodium/nmrium-core'; +import { xyzAutoZonesPicking } from 'nmr-processing'; + +export interface DetectionZonesOptions { + selectedZone: { + fromX: number; + fromY: number; + toX: number; + toY: number; + }; + thresholdFactor: number; + maxPercentCutOff: number; + tolerances?: number[]; + convolutionByFFT?: boolean; + enhanceSymmetry?: boolean; +} + +/** + * + * @param {object} options + * @param {object} options.selectedZone + * @param {number} options.selectedZone.fromX + * @param {number} options.selectedZone.fromY + * @param {number} options.selectedZone.toX + * @param {number} options.selectedZone.toY + * @param {number} options.thresholdFactor + * @param {boolean} options.convolutionByFFT + */ +export function getDetectionZones( + spectrum: Spectrum2D, + options: DetectionZonesOptions, +) { + let dataMatrix = {}; + const { selectedZone } = options; + if (selectedZone) { + options.enhanceSymmetry = false; + dataMatrix = getSubMatrix(spectrum, selectedZone); + } else { + dataMatrix = spectrum.data; + } + + return autoZonesDetection(dataMatrix, { + ...options, + info: spectrum.info, + }); +} + +function autoZonesDetection(data: any, options: any) { + const { + clean, + tolerances, + thresholdFactor, + maxPercentCutOff, + convolutionByFFT, + info: { nucleus: nuclei, originFrequency }, + } = options; + + const { enhanceSymmetry = nuclei[0] === nuclei[1] } = options; + + const zones = xyzAutoZonesPicking(data, { + nuclei, + tolerances, + observedFrequencies: originFrequency, + thresholdFactor, + realTopDetection: true, + clean, + maxPercentCutOff, + enhanceSymmetry, + convolutionByFFT, + }); + + return zones; +} + +function getSubMatrix(datum: any, selectedZone: any) { + const { fromX, toX, fromY, toY } = selectedZone; + const data = datum.data.rr; + const xStep = (data.maxX - data.minX) / (data.z[0].length - 1); + const yStep = (data.maxY - data.minY) / (data.z.length - 1); + let xIndexFrom = Math.max(Math.floor((fromX - data.minX) / xStep), 0); + let yIndexFrom = Math.max(Math.floor((fromY - data.minY) / yStep), 0); + let xIndexTo = Math.min( + Math.floor((toX - data.minX) / xStep), + data.z[0].length - 1, + ); + let yIndexTo = Math.min( + Math.floor((toY - data.minY) / yStep), + data.z.length - 1, + ); + + if (xIndexFrom > xIndexTo) [xIndexFrom, xIndexTo] = [xIndexTo, xIndexFrom]; + if (yIndexFrom > yIndexTo) [yIndexFrom, yIndexTo] = [yIndexTo, yIndexFrom]; + + const dataMatrix: any = { + z: [], + maxX: data.minX + xIndexTo * xStep, + minX: data.minX + xIndexFrom * xStep, + maxY: data.minY + yIndexTo * yStep, + minY: data.minY + yIndexFrom * yStep, + }; + let maxZ = Number.MIN_SAFE_INTEGER; + let minZ = Number.MAX_SAFE_INTEGER; + + const nbXPoints = xIndexTo - xIndexFrom + 1; + + for (let j = yIndexFrom; j < yIndexTo; j++) { + const row = new Float32Array(nbXPoints); + let xIndex = xIndexFrom; + for (let i = 0; i < nbXPoints; i++) { + row[i] = data.z[j][xIndex++]; + } + for (const rowValue of row) { + if (maxZ < rowValue) maxZ = rowValue; + if (minZ > rowValue) minZ = rowValue; + } + dataMatrix.z.push(Array.from(row)); + } + dataMatrix.minZ = minZ; + dataMatrix.maxZ = maxZ; + return dataMatrix; +} From 13754e643fc85a2afb6409e9fb8186ee70e572fc Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 3 Nov 2025 13:51:03 +0100 Subject: [PATCH 43/44] refator: generateSpectrumFromRanges ranges type --- app/scripts/nmr-cli/src/publication-string.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/scripts/nmr-cli/src/publication-string.ts b/app/scripts/nmr-cli/src/publication-string.ts index 8f0d288..e8a719a 100644 --- a/app/scripts/nmr-cli/src/publication-string.ts +++ b/app/scripts/nmr-cli/src/publication-string.ts @@ -1,10 +1,10 @@ import { resurrect, rangesToXY, - type NMRRangeWithIntegration, } from 'nmr-processing' import { CURRENT_EXPORT_VERSION } from '@zakodium/nmrium-core' import { castToArray } from './utilities/castToArray' +import { NMRRange } from '@zakodium/nmr-types' interface Info { nucleus: string @@ -13,7 +13,7 @@ interface Info { } function generateSpectrumFromRanges( - ranges: NMRRangeWithIntegration[], + ranges: NMRRange[], info: Info ) { const { nucleus, solvent, name = null } = info From 2d84e7e9e3b16eebcecffbfad61e2f1e6dba5927 Mon Sep 17 00:00:00 2001 From: hamed musallam Date: Mon, 3 Nov 2025 13:52:43 +0100 Subject: [PATCH 44/44] feat: expose options for automatic processing and range/zone detection --- app/scripts/nmr-cli/src/index.ts | 83 ++++++++++++++----- .../nmr-cli/src/parse/prase-spectra.ts | 67 +++++++++++++-- 2 files changed, 122 insertions(+), 28 deletions(-) diff --git a/app/scripts/nmr-cli/src/index.ts b/app/scripts/nmr-cli/src/index.ts index 95b810d..4368b21 100755 --- a/app/scripts/nmr-cli/src/index.ts +++ b/app/scripts/nmr-cli/src/index.ts @@ -1,6 +1,6 @@ #!/usr/bin/env node import yargs, { type Argv, type CommandModule, type Options } from 'yargs' -import { loadSpectrumFromURL, loadSpectrumFromFilePath } from './prase-spectra' +import { loadSpectrumFromURL, loadSpectrumFromFilePath } from './parse/prase-spectra' import { generateSpectrumFromPublicationString } from './publication-string' import { parsePredictionCommand } from './prediction/parsePredictionCommand' import { hideBin } from 'yargs/helpers' @@ -14,18 +14,14 @@ Commands: predict Predict spectrum from Mol Options for 'parse-spectra' command: - -u, --url File URL - -p, --path Directory path - -s, --capture-snapshot Capture snapshot + -u, --url File URL + -dir, --dir-path Directory path + -s, --capture-snapshot Capture snapshot + -p, --auto-processing Automatic processing of spectrum (FID → FT spectra). + -d, --auto-detection Enable ranges and zones automatic detection. Arguments for 'parse-publication-string' command: publicationString Publication string - -Options for 'parse-spectra' command: - -u, --url File URL - -p, --path Directory path - -s, --capture-snapshot Capture snapshot - Options for 'predict' command: -ps,--peakShape Peak shape algorithm (default: "lorentzian") choices: ["gaussian", "lorentzian"] @@ -46,16 +42,43 @@ Options for 'predict' command: Examples: nmr-cli parse-spectra -u file-url -s // Process spectra files from a URL and capture an image for the spectra - nmr-cli parse-spectra -p directory-path -s // process a spectra files from a directory and capture an image for the spectra + nmr-cli parse-spectra -dir directory-path -s // process a spectra files from a directory and capture an image for the spectra nmr-cli parse-spectra -u file-url // Process spectra files from a URL - nmr-cli parse-spectra -p directory-path // Process spectra files from a directory + nmr-cli parse-spectra -dir directory-path // Process spectra files from a directory nmr-cli parse-publication-string "your publication string" ` -interface FileOptionsArgs { - u?: string - p?: string - s?: boolean +export interface FileOptionsArgs { + /** + * -u, --url + * File URL to load remote spectra or data. + */ + u?: string; + + /** + * -dir, --dir-path + * Local directory path for file input or output. + */ + dir?: string; + + /** + * -s, --capture-snapshot + * Capture a visual snapshot of the current state or spectrum. + */ + s?: boolean; + + /** + * -p, --auto-processing + * Automatically process spectrum from FID to FT spectra. + * Mandatory when automatic detection (`--auto-detection`) is enabled. + */ + p?: boolean; + + /** + * -d, --auto-detection + * Perform automatic ranges and zones detection. + */ + d?: boolean; } // Define options for parsing a spectra file @@ -66,8 +89,8 @@ const fileOptions: { [key in keyof FileOptionsArgs]: Options } = { type: 'string', nargs: 1, }, - p: { - alias: 'path', + dir: { + alias: 'dir-path', describe: 'Directory path', type: 'string', nargs: 1, @@ -77,6 +100,16 @@ const fileOptions: { [key in keyof FileOptionsArgs]: Options } = { describe: 'Capture snapshot', type: 'boolean', }, + p: { + alias: 'auto-processing', + describe: 'Auto processing', + type: 'boolean', + }, + d: { + alias: 'auto-detection', + describe: 'Ranges and zones auto detection', + type: 'boolean', + }, } as const const parseFileCommand: CommandModule<{}, FileOptionsArgs> = { @@ -85,21 +118,25 @@ const parseFileCommand: CommandModule<{}, FileOptionsArgs> = { builder: yargs => { return yargs .options(fileOptions) - .conflicts('u', 'p') as Argv + .conflicts('u', 'dir') as Argv }, handler: argv => { + + const { u, dir } = argv; // Handle parsing the spectra file logic based on argv options - if (argv?.u) { - loadSpectrumFromURL(argv.u, argv.s).then(result => { + if (u) { + loadSpectrumFromURL({ u, ...argv }).then(result => { console.log(JSON.stringify(result)) }) } - if (argv?.p) { - loadSpectrumFromFilePath(argv.p, argv.s).then(result => { + + if (dir) { + loadSpectrumFromFilePath({ dir, ...argv }).then(result => { console.log(JSON.stringify(result)) }) } + }, } diff --git a/app/scripts/nmr-cli/src/parse/prase-spectra.ts b/app/scripts/nmr-cli/src/parse/prase-spectra.ts index 2044e4c..36953e9 100644 --- a/app/scripts/nmr-cli/src/parse/prase-spectra.ts +++ b/app/scripts/nmr-cli/src/parse/prase-spectra.ts @@ -1,8 +1,23 @@ import { join, isAbsolute } from 'path' -import { type NmriumState } from '@zakodium/nmrium-core' +import { NmriumData, ParsingOptions, type NmriumState } from '@zakodium/nmrium-core' import init from '@zakodium/nmrium-core-plugins' import playwright from 'playwright' import { FileCollection } from 'file-collection' +import { FileOptionsArgs } from '..' +import { isSpectrum2D } from './data/data2d/isSpectrum2D' +import { initiateDatum2D } from './data/data2d/initiateDatum2D' +import { initiateDatum1D } from './data/data1D/initiateDatum1D' +import { detectZones } from './data/data2d/detectZones' +import { detectRanges } from './data/data1D/detectRanges' +import { Filters1DManager, Filters2DManager } from 'nmr-processing' + +type RequiredKey = Omit & Required>; + +const parsingOptions: ParsingOptions = { + onLoadProcessing: { autoProcessing: true }, + sourceSelector: { general: { dataSelection: 'preferFT' } }, + experimentalFeatures: true +}; interface Snapshot { image: string @@ -79,9 +94,39 @@ async function captureSpectraViewAsBase64(nmriumState: Partial) { await browser.close() return snapshots + +} + +interface ProcessSpectraOptions { + autoDetection: boolean; autoProcessing: boolean; } -async function loadSpectrumFromURL(url: string, enableSnapshot = false) { +function processSpectra(data: NmriumData, options: ProcessSpectraOptions) { + + const { autoDetection = false, autoProcessing = false } = options + + for (let index = 0; index < data.spectra.length; index++) { + const inputSpectrum = data.spectra[index] + const is2D = isSpectrum2D(inputSpectrum); + const spectrum = is2D ? initiateDatum2D(inputSpectrum) : initiateDatum1D(inputSpectrum); + + if (autoProcessing) { + isSpectrum2D(spectrum) ? Filters2DManager.reapplyFilters(spectrum) : Filters1DManager.reapplyFilters(spectrum) + } + + if (autoDetection && spectrum.info.isFt) { + isSpectrum2D(spectrum) ? detectZones(spectrum) : detectRanges(spectrum); + } + + data.spectra[index] = spectrum; + } + + +} + +async function loadSpectrumFromURL(options: RequiredKey) { + const { u: url, s: enableSnapshot = false, p: autoProcessing = false, d: autoDetection = false } = options; + const { pathname: relativePath, origin: baseURL } = new URL(url) const source = { entries: [ @@ -92,11 +137,16 @@ async function loadSpectrumFromURL(url: string, enableSnapshot = false) { baseURL, } - const [nmriumState] = await core.readFromWebSource(source); + const [nmriumState] = await core.readFromWebSource(source, parsingOptions); const { data, version } = nmriumState; + + if (data) { + processSpectra(data, { autoDetection, autoProcessing }); + } + let images: Snapshot[] = [] if (enableSnapshot) { @@ -106,7 +156,9 @@ async function loadSpectrumFromURL(url: string, enableSnapshot = false) { return { data, version, images } } -async function loadSpectrumFromFilePath(path: string, enableSnapshot = false) { +async function loadSpectrumFromFilePath(options: RequiredKey) { + const { dir: path, s: enableSnapshot = false, p: autoProcessing = false, d: autoDetection = false } = options; + const dirPath = isAbsolute(path) ? path : join(process.cwd(), path) const fileCollection = await FileCollection.fromPath(dirPath, { @@ -115,7 +167,12 @@ async function loadSpectrumFromFilePath(path: string, enableSnapshot = false) { const { nmriumState: { data, version }, - } = await core.read(fileCollection) + } = await core.read(fileCollection, parsingOptions) + + + if (data) { + processSpectra(data, { autoDetection, autoProcessing }) + } let images: Snapshot[] = []