diff --git a/.github/actions/build-server/action.yml b/.github/actions/build-server/action.yml index d296838a2..13984e2ce 100644 --- a/.github/actions/build-server/action.yml +++ b/.github/actions/build-server/action.yml @@ -28,4 +28,5 @@ runs: run: | mkdir -p upload file=$(find dist -name '*.tar.xz' -print -quit) - cp "$file" "upload/TriliumNextNotes-Server-${{ github.ref_name }}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz" + name=${{ github.ref_name }} + cp "$file" "upload/TriliumNextNotes-Server-${name//\//-}-${{ inputs.os }}-${{ inputs.arch }}.tar.xz" diff --git a/.github/actions/report-size/action.yml b/.github/actions/report-size/action.yml new file mode 100644 index 000000000..e39b8bab3 --- /dev/null +++ b/.github/actions/report-size/action.yml @@ -0,0 +1,79 @@ +name: 'Bundle size reporter' +description: 'Post bundle size difference compared to another branch' +inputs: + branch: + description: 'Branch to compare to' + required: true + default: 'main' + paths: + description: + 'Paths to json file bundle size report or folder containing bundles' + required: true + default: '/' + onlyDiff: + description: 'Report only different sizes' + required: false + default: 'false' + filter: + description: 'Regex filter based on file path' + required: false + unit: + description: 'Size unit' + required: false + default: 'KB' + + # Comment inputs + comment: + description: 'Post comment' + required: false + default: 'true' + header: + description: 'Comment header' + required: false + default: 'Bundle size report' + append: + description: 'Append comment' + required: false + default: 'false' + ghToken: + description: 'Github token' + required: false + +runs: + using: 'composite' + steps: + # Checkout branch to compare to [required] + - name: Checkout base branch + uses: actions/checkout@v3 + with: + ref: ${{ inputs.branch }} + path: br-base + token: ${{ inputs.ghToken }} + + # Generate the bundle size difference report [required] + - name: Generate report + id: bundleSize + uses: nejcm/bundle-size-reporter-action@v1.4.1 + with: + paths: ${{ inputs.paths }} + onlyDiff: ${{ inputs.onlyDiff }} + filter: ${{ inputs.filter }} + unit: ${{ inputs.unit }} + + # Post github action summary + - name: Post summary + if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes + run: | + echo '${{ steps.bundleSize.outputs.summary }}' >> $GITHUB_STEP_SUMMARY + shell: bash + + # Post github action comment + - name: Post comment + uses: marocchino/sticky-pull-request-comment@v2 + if: ${{ steps.bundleSize.outputs.hasDifferences == 'true' }} # post only in case of changes + with: + number: ${{ github.event.pull_request.number }} + header: ${{ inputs.header }} + append: ${{ inputs.append }} + message: '${{ steps.bundleSize.outputs.summary }}' + GITHUB_TOKEN: ${{ inputs.ghToken }} diff --git a/.github/workflows/dev.yml b/.github/workflows/dev.yml index e7bff39e9..3dffa01c2 100644 --- a/.github/workflows/dev.yml +++ b/.github/workflows/dev.yml @@ -15,7 +15,73 @@ env: IMAGE_NAME: ${{ github.repository_owner }}/notes TEST_TAG: ${{ github.repository_owner }}/notes:test +permissions: + pull-requests: write # for PR comments + jobs: + report-electron-size: + name: Report Electron size + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Set up node & dependencies + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "npm" + + - run: npm ci + + - name: Run the build + uses: ./.github/actions/build-electron + with: + os: linux + arch: x64 + shell: bash + forge_platform: linux + + - name: Run the Electron size report + uses: ./.github/actions/report-size + with: + paths: 'upload/**/*' + onlyDiff: 'true' + branch: 'develop' + header: 'Electron size report' + unit: "MB" + ghToken: ${{ secrets.GITHUB_TOKEN }} + report-server-size: + name: Report server size + runs-on: ubuntu-latest + steps: + - name: Checkout the repository + uses: actions/checkout@v4 + + - name: Set up node & dependencies + uses: actions/setup-node@v4 + with: + node-version: 22 + cache: "npm" + + - run: npm ci + + - name: Run the build + uses: ./.github/actions/build-server + with: + os: linux + arch: x64 + + - name: Run the server size report + uses: ./.github/actions/report-size + with: + paths: 'upload/**/*' + onlyDiff: 'true' + branch: 'develop' + header: 'Server size report' + unit: "MB" + ghToken: ${{ secrets.GITHUB_TOKEN }} + test_dev: name: Test development runs-on: ubuntu-latest @@ -44,6 +110,9 @@ jobs: - test_dev steps: - uses: actions/checkout@v4 + - name: Update build info + shell: ${{ inputs.shell }} + run: npm run chore:update-build-info - uses: docker/setup-buildx-action@v3 - uses: docker/build-push-action@v6 with: @@ -64,6 +133,10 @@ jobs: - name: Checkout the repository uses: actions/checkout@v4 + - name: Update build info + shell: ${{ inputs.shell }} + run: npm run chore:update-build-info + - name: Set IMAGE_NAME to lowercase run: echo "IMAGE_NAME=${IMAGE_NAME,,}" >> $GITHUB_ENV - name: Set TEST_TAG to lowercase diff --git a/.github/workflows/main-docker.yml b/.github/workflows/main-docker.yml index 25277d30a..2989ffa58 100644 --- a/.github/workflows/main-docker.yml +++ b/.github/workflows/main-docker.yml @@ -131,6 +131,11 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + + - name: Update build info + shell: ${{ inputs.shell }} + run: npm run chore:update-build-info + - name: Docker meta id: meta uses: docker/metadata-action@v5 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 6c14f83bd..83b9c436c 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -83,3 +83,36 @@ jobs: with: name: TriliumNextNotes ${{ matrix.os.name }} ${{ matrix.arch }} path: upload + + nightly-server: + name: Deploy server nightly + strategy: + fail-fast: false + matrix: + arch: [x64, arm64] + include: + - arch: x64 + runs-on: ubuntu-latest + - arch: arm64 + runs-on: ubuntu-24.04-arm + runs-on: ${{ matrix.runs-on }} + steps: + - uses: actions/checkout@v4 + + - name: Run the build + uses: ./.github/actions/build-server + with: + os: linux + arch: ${{ matrix.arch }} + + - name: Publish release + uses: softprops/action-gh-release@v2 + if: ${{ github.event_name != 'pull_request' }} + with: + make_latest: false + prerelease: true + draft: false + fail_on_unmatched_files: true + files: upload/*.* + tag_name: nightly + name: Nightly Build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b3f334ec8..e473a4a7f 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -3,7 +3,6 @@ on: push: tags: - "v*" - workflow_dispatch: permissions: contents: write concurrency: diff --git a/.gitignore b/.gitignore index 672bffee8..438043e86 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store node_modules/ dist/ +upload/ build/ coverage/ src/public/app-dist/ diff --git a/electron.ts b/electron.ts index 938440947..8f6611c2d 100644 --- a/electron.ts +++ b/electron.ts @@ -25,8 +25,6 @@ electronDl({ saveAs: true }); electron.app.commandLine.appendSwitch("enable-experimental-web-platform-features"); electron.app.commandLine.appendSwitch("lang", options.getOptionOrNull("formattingLocale") ?? "en"); -electron.app.userAgentFallback = `${electron.app.getName()} ${electron.app.getVersion()}`; - // Quit when all windows are closed, except on macOS. There, it's common // for applications and their menu bar to stay active until the user quits // explicitly with Cmd + Q. diff --git a/package-lock.json b/package-lock.json index 77e8afeaa..0923cf97c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,6 @@ "@braintree/sanitize-url": "7.1.1", "@electron/remote": "2.1.2", "@highlightjs/cdn-assets": "11.11.1", - "@mermaid-js/layout-elk": "0.1.7", "@triliumnext/express-partial-content": "1.0.1", "archiver": "7.0.1", "async-mutex": "0.5.0", @@ -62,17 +61,12 @@ "jquery.fancytree": "2.38.4", "js-yaml": "4.1.0", "jsdom": "26.0.0", - "jsplumb": "2.15.6", "katex": "0.16.21", - "leaflet": "1.9.4", - "leaflet-gpx": "2.1.2", "marked": "15.0.7", - "mermaid": "11.6.0", "mime-types": "3.0.1", "multer": "1.4.5-lts.2", "normalize-strings": "1.1.1", "normalize.css": "8.0.1", - "panzoom": "9.4.3", "rand-token": "1.0.1", "safe-compare": "1.1.4", "sanitize-filename": "1.6.3", @@ -114,6 +108,7 @@ "@fullcalendar/list": "6.1.15", "@fullcalendar/multimonth": "6.1.15", "@fullcalendar/timegrid": "6.1.15", + "@mermaid-js/layout-elk": "0.1.7", "@mind-elixir/node-menu": "1.0.5", "@playwright/test": "1.51.1", "@popperjs/core": "2.11.8", @@ -141,9 +136,9 @@ "@types/leaflet-gpx": "1.3.7", "@types/mime-types": "2.1.4", "@types/multer": "1.4.12", - "@types/node": "22.13.17", + "@types/node": "22.14.0", "@types/react": "18.3.20", - "@types/react-dom": "18.3.5", + "@types/react-dom": "18.3.6", "@types/safe-compare": "1.1.2", "@types/sanitize-html": "2.15.0", "@types/sax": "1.2.7", @@ -164,25 +159,30 @@ "copy-webpack-plugin": "13.0.0", "cross-env": "7.0.3", "css-loader": "7.1.2", - "electron": "35.1.2", + "electron": "35.1.3", "eslint": "9.23.0", "esm": "3.2.25", "globals": "16.0.0", "happy-dom": "17.4.4", "i18next-http-backend": "3.0.2", "jsdoc": "4.0.4", + "jsplumb": "2.15.6", "knockout": "3.5.1", + "leaflet": "1.9.4", + "leaflet-gpx": "2.1.2", "lorem-ipsum": "2.0.8", "mark.js": "8.11.1", + "mermaid": "11.6.0", "mind-elixir": "4.5.0", "mini-css-extract-plugin": "2.9.2", "nodemon": "3.1.9", + "panzoom": "9.4.3", "postcss-loader": "8.1.1", "rcedit": "4.0.1", "react": "18.3.1", "react-dom": "18.3.1", "rimraf": "6.0.1", - "sass": "1.86.1", + "sass": "1.86.2", "sass-loader": "16.0.5", "script-loader": "0.7.2", "split.js": "1.6.5", @@ -234,6 +234,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.4.1.tgz", "integrity": "sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==", + "dev": true, "license": "MIT", "dependencies": { "package-manager-detector": "^0.2.0", @@ -247,6 +248,7 @@ "version": "0.7.10", "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/antfu" @@ -419,6 +421,7 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/cst-dts-gen/-/cst-dts-gen-11.0.3.tgz", "integrity": "sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@chevrotain/gast": "11.0.3", @@ -430,6 +433,7 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/gast/-/gast-11.0.3.tgz", "integrity": "sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@chevrotain/types": "11.0.3", @@ -440,18 +444,21 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/regexp-to-ast/-/regexp-to-ast-11.0.3.tgz", "integrity": "sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==", + "dev": true, "license": "Apache-2.0" }, "node_modules/@chevrotain/types": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-11.0.3.tgz", "integrity": "sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/@chevrotain/utils": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-11.0.3.tgz", "integrity": "sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==", + "dev": true, "license": "Apache-2.0" }, "node_modules/@csstools/color-helpers": { @@ -2732,12 +2739,14 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==", + "dev": true, "license": "MIT" }, "node_modules/@iconify/utils": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.2.1.tgz", "integrity": "sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==", + "dev": true, "license": "MIT", "dependencies": { "@antfu/install-pkg": "^0.4.1", @@ -2754,6 +2763,7 @@ "version": "15.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.13.0.tgz", "integrity": "sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=18" @@ -3641,6 +3651,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/@mermaid-js/layout-elk/-/layout-elk-0.1.7.tgz", "integrity": "sha512-G3AJ2jMaCAqky2CT3z/sf3pK5UuS3tne98GsXDl3PkKByCmPmOYmJPf+6oX5PUlV3HNWWHuSgtZ9NU/CZDSuHQ==", + "dev": true, "license": "MIT", "dependencies": { "d3": "^7.9.0", @@ -3654,6 +3665,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/@mermaid-js/parser/-/parser-0.4.0.tgz", "integrity": "sha512-wla8XOWvQAwuqy+gxiZqY+c7FokraOTHRWMsbB4AgRx9Sy7zKslNyejy7E+a77qHfey5GXw/ik3IXv/NHMJgaA==", + "dev": true, "license": "MIT", "dependencies": { "langium": "3.3.1" @@ -4638,6 +4650,7 @@ "version": "7.4.3", "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-array": "*", @@ -4676,12 +4689,14 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-axis": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -4691,6 +4706,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -4700,18 +4716,21 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "dev": true, "license": "MIT" }, "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==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-contour": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-array": "*", @@ -4722,18 +4741,21 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-dispatch": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz", "integrity": "sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-drag": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -4743,18 +4765,21 @@ "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-ease": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-fetch": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-dsv": "*" @@ -4764,18 +4789,21 @@ "version": "3.0.10", "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-format": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.4.tgz", "integrity": "sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-geo": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/geojson": "*" @@ -4785,12 +4813,14 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz", "integrity": "sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==", + "dev": true, "license": "MIT" }, "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==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-color": "*" @@ -4800,30 +4830,35 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-polygon": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-quadtree": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-random": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-scale": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.8.tgz", "integrity": "sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-time": "*" @@ -4833,18 +4868,21 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-selection": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-shape": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.6.tgz", "integrity": "sha512-5KKk5aKGu2I+O6SONMYSNflgiP0WfZIQvVUMan50wHsLG1G94JlxEVnCpQARfTtzytuY0p/9PXXZb3I7giofIA==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-path": "*" @@ -4854,24 +4892,28 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-time-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-4.0.3.tgz", "integrity": "sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-timer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "dev": true, "license": "MIT" }, "node_modules/@types/d3-transition": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-selection": "*" @@ -4881,6 +4923,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "dev": true, "license": "MIT", "dependencies": { "@types/d3-interpolate": "*", @@ -5004,6 +5047,7 @@ "version": "7946.0.15", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.15.tgz", "integrity": "sha512-9oSxFzDCT2Rj6DfcHF8G++jxBKS7mBqXl5xrRW+Kbvjry6Uduya2iiwqHPhVXpasAVMBYKkEPGgKhd3+/HZ6xA==", + "dev": true, "license": "MIT" }, "node_modules/@types/glob": { @@ -5219,12 +5263,12 @@ } }, "node_modules/@types/node": { - "version": "22.13.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.17.tgz", - "integrity": "sha512-nAJuQXoyPj04uLgu+obZcSmsfOenUg6DxPKogeUy6yNCFwWaj5sBF8/G/pNo8EtBJjAfSVgfIlugR/BCOleO+g==", + "version": "22.14.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.14.0.tgz", + "integrity": "sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==", "license": "MIT", "dependencies": { - "undici-types": "~6.20.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/prop-types": { @@ -5260,9 +5304,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.3.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.5.tgz", - "integrity": "sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==", + "version": "18.3.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.6.tgz", + "integrity": "sha512-nf22//wEbKXusP6E9pfOCDwFdHAX4u172eaJI4YkDRQEZiorm6KfYnSC2SWLDMVWUOWPERmJnN0ujeAfTBLvrw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -5439,6 +5483,7 @@ "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "dev": true, "license": "MIT", "optional": true }, @@ -6182,6 +6227,7 @@ "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -6287,6 +6333,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/amator/-/amator-1.1.0.tgz", "integrity": "sha512-V5+aH8pe+Z3u/UG3L3pG3BaFQGXAyXHVQDroRwjPHdh08bcUEchAVsU1MCuJSCaU5o60wTK6KaE6te5memzgYw==", + "dev": true, "license": "MIT", "dependencies": { "bezier-easing": "^2.0.3" @@ -6774,6 +6821,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/bezier-easing/-/bezier-easing-2.1.0.tgz", "integrity": "sha512-gbIqZ/eslnUFC1tjEvtz0sgx+xTK20wDnYMIA27VA04R7w6xxXQPZDbibjA9DTWZRA2CXtwHykkVzlCaAJAZig==", + "dev": true, "license": "MIT" }, "node_modules/bezier-js": { @@ -7586,6 +7634,7 @@ "version": "11.0.3", "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-11.0.3.tgz", "integrity": "sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==", + "dev": true, "license": "Apache-2.0", "dependencies": { "@chevrotain/cst-dts-gen": "11.0.3", @@ -7600,6 +7649,7 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/chevrotain-allstar/-/chevrotain-allstar-0.3.1.tgz", "integrity": "sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==", + "dev": true, "license": "MIT", "dependencies": { "lodash-es": "^4.17.21" @@ -8066,6 +8116,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, "license": "MIT" }, "node_modules/content-disposition": { @@ -8158,6 +8209,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dev": true, "license": "MIT", "dependencies": { "layout-base": "^1.0.0" @@ -8482,6 +8534,7 @@ "version": "3.30.4", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.30.4.tgz", "integrity": "sha512-OxtlZwQl1WbwMmLiyPSEBuzeTIQnwZhJYYWFzZ2PhEHVFwpeaqNIkUzSiso00D98qk60l8Gwon2RP304d3BJ1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10" @@ -8491,6 +8544,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dev": true, "license": "MIT", "dependencies": { "cose-base": "^1.0.0" @@ -8503,6 +8557,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dev": true, "license": "MIT", "dependencies": { "cose-base": "^2.2.0" @@ -8515,6 +8570,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dev": true, "license": "MIT", "dependencies": { "layout-base": "^2.0.0" @@ -8524,12 +8580,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==", + "dev": true, "license": "MIT" }, "node_modules/d3": { "version": "7.9.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "3", @@ -8583,6 +8641,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8598,6 +8657,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "dev": true, "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -8614,6 +8674,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "dev": true, "license": "ISC", "dependencies": { "d3-path": "1 - 3" @@ -8635,6 +8696,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "^3.2.0" @@ -8647,6 +8709,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "dev": true, "license": "ISC", "dependencies": { "delaunator": "5" @@ -8681,6 +8744,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "dev": true, "license": "ISC", "dependencies": { "commander": "7", @@ -8706,6 +8770,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, "license": "MIT", "engines": { "node": ">= 10" @@ -8724,6 +8789,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "dev": true, "license": "ISC", "dependencies": { "d3-dsv": "1 - 3" @@ -8736,6 +8802,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "dev": true, "license": "ISC", "dependencies": { "d3-dispatch": "1 - 3", @@ -8775,6 +8842,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "dev": true, "license": "ISC", "dependencies": { "d3-array": "2.5.0 - 3" @@ -8787,6 +8855,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8814,6 +8883,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8823,6 +8893,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8841,6 +8912,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "dev": true, "license": "ISC", "engines": { "node": ">=12" @@ -8850,6 +8922,7 @@ "version": "0.12.3", "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-array": "1 - 2", @@ -8860,6 +8933,7 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "internmap": "^1.0.0" @@ -8869,12 +8943,14 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/d3-sankey/node_modules/d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "dev": true, "license": "BSD-3-Clause", "dependencies": { "d3-path": "1" @@ -8884,6 +8960,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "dev": true, "license": "ISC" }, "node_modules/d3-scale": { @@ -8928,6 +9005,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dev": true, "license": "ISC", "dependencies": { "d3-path": "^3.1.0" @@ -9008,6 +9086,7 @@ "version": "7.0.11", "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.11.tgz", "integrity": "sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==", + "dev": true, "license": "MIT", "dependencies": { "d3": "^7.9.0", @@ -9212,6 +9291,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "dev": true, "license": "ISC", "dependencies": { "robust-predicates": "^3.0.2" @@ -9404,6 +9484,7 @@ "version": "3.2.4", "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.2.4.tgz", "integrity": "sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==", + "dev": true, "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -9487,9 +9568,9 @@ } }, "node_modules/electron": { - "version": "35.1.2", - "resolved": "https://registry.npmjs.org/electron/-/electron-35.1.2.tgz", - "integrity": "sha512-ipYSDZEV3+PpHfJ8/oWlpMCvxwutX6xLvBz2HRPgEzSFzgLmGO7YXTjEow4DhDtCpGE+b95NTGoJaRAVQi5n7A==", + "version": "35.1.3", + "resolved": "https://registry.npmjs.org/electron/-/electron-35.1.3.tgz", + "integrity": "sha512-z7zZtvoK40ynKmgZ5dfD5xhsAXHxNShWgx9vIpC/ZMawBB93sBTWU83gHrjSzAcY9n0Io1WJCyUt/UIQHzlDXA==", "hasInstallScript": true, "license": "MIT", "dependencies": { @@ -10244,6 +10325,7 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.9.3.tgz", "integrity": "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==", + "dev": true, "license": "EPL-2.0" }, "node_modules/emitter-listener": { @@ -12227,6 +12309,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/hachure-fill/-/hachure-fill-0.5.2.tgz", "integrity": "sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==", + "dev": true, "license": "MIT" }, "node_modules/happy-dom": { @@ -13725,6 +13808,7 @@ "version": "2.15.6", "resolved": "https://registry.npmjs.org/jsplumb/-/jsplumb-2.15.6.tgz", "integrity": "sha512-sIpbpz5eMVM+vV+MQzFCidlaa1RsknrQs6LOTKYDjYUDdTAi2AN2bFi94TxB33TifcIsRNV1jebcaxg0tCoPzg==", + "dev": true, "license": "(MIT OR GPL-2.0)" }, "node_modules/junk": { @@ -13798,7 +13882,8 @@ "node_modules/khroma": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz", - "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==" + "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==", + "dev": true }, "node_modules/kind-of": { "version": "6.0.3", @@ -13841,6 +13926,7 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, "license": "MIT" }, "node_modules/kruptein": { @@ -13859,6 +13945,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/langium/-/langium-3.3.1.tgz", "integrity": "sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==", + "dev": true, "license": "MIT", "dependencies": { "chevrotain": "~11.0.3", @@ -13875,6 +13962,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==", + "dev": true, "license": "MIT" }, "node_modules/lazystream": { @@ -13923,12 +14011,14 @@ "version": "1.9.4", "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/leaflet-gpx": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/leaflet-gpx/-/leaflet-gpx-2.1.2.tgz", "integrity": "sha512-lKoEPlAWel9KXn9keg6Dmyt7gmj5IYyD8CKuxivN+77GpZr2bpKliwFvZJxLUHmNu4fICmCySyxhm5qjZuvvQg==", + "dev": true, "license": "BSD-2-Clause" }, "node_modules/levn": { @@ -14025,6 +14115,7 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, "license": "MIT", "dependencies": { "mlly": "^1.7.3", @@ -14556,6 +14647,7 @@ "version": "11.6.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.6.0.tgz", "integrity": "sha512-PE8hGUy1LDlWIHWBP05SFdqUHGmRcCcK4IzpOKPE35eOw+G9zZgcnMpyunJVUEOgb//KBORPjysKndw8bFLuRg==", + "dev": true, "license": "MIT", "dependencies": { "@braintree/sanitize-url": "^7.0.4", @@ -14584,6 +14676,7 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" @@ -15314,6 +15407,7 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.3.tgz", "integrity": "sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==", + "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.14.0", @@ -15437,6 +15531,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/ngraph.events/-/ngraph.events-1.2.2.tgz", "integrity": "sha512-JsUbEOzANskax+WSYiAPETemLWYXmixuPAlmZmhIbIj6FH/WDgEGCGnRwUQBK0GjOnVm8Ui+e5IJ+5VZ4e32eQ==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/nice-try": { @@ -16098,6 +16193,7 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.7.tgz", "integrity": "sha512-g4+387DXDKlZzHkP+9FLt8yKj8+/3tOkPv7DVTJGGRm00RkEWgqbFstX1mXJ4M0VDYhUqsTOiISqNOJnhAu3PQ==", + "dev": true, "license": "MIT" }, "node_modules/pako": { @@ -16110,6 +16206,7 @@ "version": "9.4.3", "resolved": "https://registry.npmjs.org/panzoom/-/panzoom-9.4.3.tgz", "integrity": "sha512-xaxCpElcRbQsUtIdwlrZA90P90+BHip4Vda2BC8MEb4tkI05PmR6cKECdqUCZ85ZvBHjpI9htJrZBxV5Gp/q/w==", + "dev": true, "license": "MIT", "dependencies": { "amator": "^1.1.0", @@ -16272,6 +16369,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/path-data-parser/-/path-data-parser-0.1.0.tgz", "integrity": "sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==", + "dev": true, "license": "MIT" }, "node_modules/path-exists": { @@ -16364,6 +16462,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true, "license": "MIT" }, "node_modules/pathval": { @@ -16554,6 +16653,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz", "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==", + "dev": true, "license": "MIT", "dependencies": { "confbox": "^0.1.8", @@ -16675,12 +16775,14 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/points-on-curve/-/points-on-curve-0.2.0.tgz", "integrity": "sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==", + "dev": true, "license": "MIT" }, "node_modules/points-on-path": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/points-on-path/-/points-on-path-0.2.1.tgz", "integrity": "sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==", + "dev": true, "license": "MIT", "dependencies": { "path-data-parser": "0.1.0", @@ -17999,6 +18101,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "dev": true, "license": "Unlicense" }, "node_modules/rollup": { @@ -18044,6 +18147,7 @@ "version": "4.6.6", "resolved": "https://registry.npmjs.org/roughjs/-/roughjs-4.6.6.tgz", "integrity": "sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==", + "dev": true, "license": "MIT", "dependencies": { "hachure-fill": "^0.5.2", @@ -18086,6 +18190,7 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "dev": true, "license": "BSD-3-Clause" }, "node_modules/sade": { @@ -18160,9 +18265,9 @@ } }, "node_modules/sass": { - "version": "1.86.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.1.tgz", - "integrity": "sha512-Yaok4XELL1L9Im/ZUClKu//D2OP1rOljKj0Gf34a+GzLbMveOzL7CfqYo+JUa5Xt1nhTCW+OcKp/FtR7/iqj1w==", + "version": "1.86.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.2.tgz", + "integrity": "sha512-Rpfn0zAIDqvnSb2DihJTDFjbhqLHu91Wqac9rxontWk7R+2txcPjuujMqu1eeoezh5kAblVCS5EdFdyr0Jmu+w==", "dev": true, "license": "MIT", "dependencies": { @@ -19188,6 +19293,7 @@ "version": "4.3.6", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "dev": true, "license": "MIT" }, "node_modules/sudo-prompt": { @@ -19743,6 +19849,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, "license": "MIT" }, "node_modules/tinyglobby": { @@ -20017,6 +20124,7 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6.10" @@ -20298,6 +20406,7 @@ "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==", + "dev": true, "license": "MIT" }, "node_modules/uid-safe": { @@ -20336,9 +20445,9 @@ } }, "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": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unescape": { @@ -20894,6 +21003,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.2.0.tgz", "integrity": "sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==", + "dev": true, "license": "MIT", "engines": { "node": ">=14.0.0" @@ -20903,6 +21013,7 @@ "version": "9.0.1", "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-9.0.1.tgz", "integrity": "sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==", + "dev": true, "license": "MIT", "dependencies": { "vscode-languageserver-protocol": "3.17.5" @@ -20915,6 +21026,7 @@ "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.5.tgz", "integrity": "sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==", + "dev": true, "license": "MIT", "dependencies": { "vscode-jsonrpc": "8.2.0", @@ -20925,18 +21037,21 @@ "version": "1.0.12", "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==", + "dev": true, "license": "MIT" }, "node_modules/vscode-languageserver-types": { "version": "3.17.5", "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz", "integrity": "sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==", + "dev": true, "license": "MIT" }, "node_modules/vscode-uri": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==", + "dev": true, "license": "MIT" }, "node_modules/w3c-xmlserializer": { @@ -21246,6 +21361,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/wheel/-/wheel-1.0.0.tgz", "integrity": "sha512-XiCMHibOiqalCQ+BaNSwRoZ9FDTAvOsXxGHXChBugewDj7HC8VBIER71dEOiRH1fSdLbRCQzngKTSiZ06ZQzeA==", + "dev": true, "license": "MIT" }, "node_modules/which": { diff --git a/package.json b/package.json index 95ab4e8fe..fae40b07a 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,6 @@ "@braintree/sanitize-url": "7.1.1", "@electron/remote": "2.1.2", "@highlightjs/cdn-assets": "11.11.1", - "@mermaid-js/layout-elk": "0.1.7", "@triliumnext/express-partial-content": "1.0.1", "archiver": "7.0.1", "async-mutex": "0.5.0", @@ -122,17 +121,12 @@ "jquery.fancytree": "2.38.4", "js-yaml": "4.1.0", "jsdom": "26.0.0", - "jsplumb": "2.15.6", "katex": "0.16.21", - "leaflet": "1.9.4", - "leaflet-gpx": "2.1.2", "marked": "15.0.7", - "mermaid": "11.6.0", "mime-types": "3.0.1", "multer": "1.4.5-lts.2", "normalize-strings": "1.1.1", "normalize.css": "8.0.1", - "panzoom": "9.4.3", "rand-token": "1.0.1", "safe-compare": "1.1.4", "sanitize-filename": "1.6.3", @@ -171,6 +165,7 @@ "@fullcalendar/list": "6.1.15", "@fullcalendar/multimonth": "6.1.15", "@fullcalendar/timegrid": "6.1.15", + "@mermaid-js/layout-elk": "0.1.7", "@mind-elixir/node-menu": "1.0.5", "@playwright/test": "1.51.1", "@popperjs/core": "2.11.8", @@ -198,9 +193,9 @@ "@types/leaflet-gpx": "1.3.7", "@types/mime-types": "2.1.4", "@types/multer": "1.4.12", - "@types/node": "22.13.17", + "@types/node": "22.14.0", "@types/react": "18.3.20", - "@types/react-dom": "18.3.5", + "@types/react-dom": "18.3.6", "@types/safe-compare": "1.1.2", "@types/sanitize-html": "2.15.0", "@types/sax": "1.2.7", @@ -221,25 +216,30 @@ "copy-webpack-plugin": "13.0.0", "cross-env": "7.0.3", "css-loader": "7.1.2", - "electron": "35.1.2", + "electron": "35.1.3", "eslint": "9.23.0", "esm": "3.2.25", "globals": "16.0.0", "happy-dom": "17.4.4", "i18next-http-backend": "3.0.2", "jsdoc": "4.0.4", + "jsplumb": "2.15.6", "knockout": "3.5.1", + "leaflet": "1.9.4", + "leaflet-gpx": "2.1.2", "lorem-ipsum": "2.0.8", "mark.js": "8.11.1", + "mermaid": "11.6.0", "mind-elixir": "4.5.0", "mini-css-extract-plugin": "2.9.2", "nodemon": "3.1.9", + "panzoom": "9.4.3", "postcss-loader": "8.1.1", "rcedit": "4.0.1", "react": "18.3.1", "react-dom": "18.3.1", "rimraf": "6.0.1", - "sass": "1.86.1", + "sass": "1.86.2", "sass-loader": "16.0.5", "script-loader": "0.7.2", "split.js": "1.6.5", diff --git a/packages/turndown-plugin-gfm/package-lock.json b/packages/turndown-plugin-gfm/package-lock.json index 9981a3023..cd5cbc883 100644 --- a/packages/turndown-plugin-gfm/package-lock.json +++ b/packages/turndown-plugin-gfm/package-lock.json @@ -163,9 +163,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", - "integrity": "sha512-ldomqc4/jDZu/xpYU+aRxo3V4mGCV9HeTgUBANI3oIQMOL+SsxB+S2lxMpkFp5UamSS3XuTMQVbsS24R4J4Qjg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.39.0.tgz", + "integrity": "sha512-lGVys55Qb00Wvh8DMAocp5kIcaNzEFTmGhfFd88LfaogYTRKrdxgtlO5H6S49v2Nd8R2C6wLOal0qv6/kCkOwA==", "cpu": [ "arm" ], @@ -177,9 +177,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.38.0.tgz", - "integrity": "sha512-VUsgcy4GhhT7rokwzYQP+aV9XnSLkkhlEJ0St8pbasuWO/vwphhZQxYEKUP3ayeCYLhk6gEtacRpYP/cj3GjyQ==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.39.0.tgz", + "integrity": "sha512-It9+M1zE31KWfqh/0cJLrrsCPiF72PoJjIChLX+rEcujVRCb4NLQ5QzFkzIZW8Kn8FTbvGQBY5TkKBau3S8cCQ==", "cpu": [ "arm64" ], @@ -191,9 +191,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.38.0.tgz", - "integrity": "sha512-buA17AYXlW9Rn091sWMq1xGUvWQFOH4N1rqUxGJtEQzhChxWjldGCCup7r/wUnaI6Au8sKXpoh0xg58a7cgcpg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.39.0.tgz", + "integrity": "sha512-lXQnhpFDOKDXiGxsU9/l8UEGGM65comrQuZ+lDcGUx+9YQ9dKpF3rSEGepyeR5AHZ0b5RgiligsBhWZfSSQh8Q==", "cpu": [ "arm64" ], @@ -205,9 +205,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", - "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.39.0.tgz", + "integrity": "sha512-mKXpNZLvtEbgu6WCkNij7CGycdw9cJi2k9v0noMb++Vab12GZjFgUXD69ilAbBh034Zwn95c2PNSz9xM7KYEAQ==", "cpu": [ "x64" ], @@ -219,9 +219,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.38.0.tgz", - "integrity": "sha512-zzJACgjLbQTsscxWqvrEQAEh28hqhebpRz5q/uUd1T7VTwUNZ4VIXQt5hE7ncs0GrF+s7d3S4on4TiXUY8KoQA==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.39.0.tgz", + "integrity": "sha512-jivRRlh2Lod/KvDZx2zUR+I4iBfHcu2V/BA2vasUtdtTN2Uk3jfcZczLa81ESHZHPHy4ih3T/W5rPFZ/hX7RtQ==", "cpu": [ "arm64" ], @@ -233,9 +233,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.38.0.tgz", - "integrity": "sha512-hCY/KAeYMCyDpEE4pTETam0XZS4/5GXzlLgpi5f0IaPExw9kuB+PDTOTLuPtM10TlRG0U9OSmXJ+Wq9J39LvAg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.39.0.tgz", + "integrity": "sha512-8RXIWvYIRK9nO+bhVz8DwLBepcptw633gv/QT4015CpJ0Ht8punmoHU/DuEd3iw9Hr8UwUV+t+VNNuZIWYeY7Q==", "cpu": [ "x64" ], @@ -247,9 +247,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.38.0.tgz", - "integrity": "sha512-mimPH43mHl4JdOTD7bUMFhBdrg6f9HzMTOEnzRmXbOZqjijCw8LA5z8uL6LCjxSa67H2xiLFvvO67PT05PRKGg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.39.0.tgz", + "integrity": "sha512-mz5POx5Zu58f2xAG5RaRRhp3IZDK7zXGk5sdEDj4o96HeaXhlUwmLFzNlc4hCQi5sGdR12VDgEUqVSHer0lI9g==", "cpu": [ "arm" ], @@ -261,9 +261,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.38.0.tgz", - "integrity": "sha512-tPiJtiOoNuIH8XGG8sWoMMkAMm98PUwlriOFCCbZGc9WCax+GLeVRhmaxjJtz6WxrPKACgrwoZ5ia/uapq3ZVg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.39.0.tgz", + "integrity": "sha512-+YDwhM6gUAyakl0CD+bMFpdmwIoRDzZYaTWV3SDRBGkMU/VpIBYXXEvkEcTagw/7VVkL2vA29zU4UVy1mP0/Yw==", "cpu": [ "arm" ], @@ -275,9 +275,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.38.0.tgz", - "integrity": "sha512-wZco59rIVuB0tjQS0CSHTTUcEde+pXQWugZVxWaQFdQQ1VYub/sTrNdY76D1MKdN2NB48JDuGABP6o6fqos8mA==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.39.0.tgz", + "integrity": "sha512-EKf7iF7aK36eEChvlgxGnk7pdJfzfQbNvGV/+l98iiMwU23MwvmV0Ty3pJ0p5WQfm3JRHOytSIqD9LB7Bq7xdQ==", "cpu": [ "arm64" ], @@ -289,9 +289,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.38.0.tgz", - "integrity": "sha512-fQgqwKmW0REM4LomQ+87PP8w8xvU9LZfeLBKybeli+0yHT7VKILINzFEuggvnV9M3x1Ed4gUBmGUzCo/ikmFbQ==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.39.0.tgz", + "integrity": "sha512-vYanR6MtqC7Z2SNr8gzVnzUul09Wi1kZqJaek3KcIlI/wq5Xtq4ZPIZ0Mr/st/sv/NnaPwy/D4yXg5x0B3aUUA==", "cpu": [ "arm64" ], @@ -303,9 +303,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.38.0.tgz", - "integrity": "sha512-hz5oqQLXTB3SbXpfkKHKXLdIp02/w3M+ajp8p4yWOWwQRtHWiEOCKtc9U+YXahrwdk+3qHdFMDWR5k+4dIlddg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.39.0.tgz", + "integrity": "sha512-NMRUT40+h0FBa5fb+cpxtZoGAggRem16ocVKIv5gDB5uLDgBIwrIsXlGqYbLwW8YyO3WVTk1FkFDjMETYlDqiw==", "cpu": [ "loong64" ], @@ -317,9 +317,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.38.0.tgz", - "integrity": "sha512-NXqygK/dTSibQ+0pzxsL3r4Xl8oPqVoWbZV9niqOnIHV/J92fe65pOir0xjkUZDRSPyFRvu+4YOpJF9BZHQImw==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.39.0.tgz", + "integrity": "sha512-0pCNnmxgduJ3YRt+D+kJ6Ai/r+TaePu9ZLENl+ZDV/CdVczXl95CbIiwwswu4L+K7uOIGf6tMo2vm8uadRaICQ==", "cpu": [ "ppc64" ], @@ -331,9 +331,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.38.0.tgz", - "integrity": "sha512-GEAIabR1uFyvf/jW/5jfu8gjM06/4kZ1W+j1nWTSSB3w6moZEBm7iBtzwQ3a1Pxos2F7Gz+58aVEnZHU295QTg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.39.0.tgz", + "integrity": "sha512-t7j5Zhr7S4bBtksT73bO6c3Qa2AV/HqiGlj9+KB3gNF5upcVkx+HLgxTm8DK4OkzsOYqbdqbLKwvGMhylJCPhQ==", "cpu": [ "riscv64" ], @@ -345,9 +345,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.38.0.tgz", - "integrity": "sha512-9EYTX+Gus2EGPbfs+fh7l95wVADtSQyYw4DfSBcYdUEAmP2lqSZY0Y17yX/3m5VKGGJ4UmIH5LHLkMJft3bYoA==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.39.0.tgz", + "integrity": "sha512-m6cwI86IvQ7M93MQ2RF5SP8tUjD39Y7rjb1qjHgYh28uAPVU8+k/xYWvxRO3/tBN2pZkSMa5RjnPuUIbrwVxeA==", "cpu": [ "riscv64" ], @@ -359,9 +359,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.38.0.tgz", - "integrity": "sha512-Mpp6+Z5VhB9VDk7RwZXoG2qMdERm3Jw07RNlXHE0bOnEeX+l7Fy4bg+NxfyN15ruuY3/7Vrbpm75J9QHFqj5+Q==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.39.0.tgz", + "integrity": "sha512-iRDJd2ebMunnk2rsSBYlsptCyuINvxUfGwOUldjv5M4tpa93K8tFMeYGpNk2+Nxl+OBJnBzy2/JCscGeO507kA==", "cpu": [ "s390x" ], @@ -373,9 +373,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", - "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.39.0.tgz", + "integrity": "sha512-t9jqYw27R6Lx0XKfEFe5vUeEJ5pF3SGIM6gTfONSMb7DuG6z6wfj2yjcoZxHg129veTqU7+wOhY6GX8wmf90dA==", "cpu": [ "x64" ], @@ -387,9 +387,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.38.0.tgz", - "integrity": "sha512-q5Zv+goWvQUGCaL7fU8NuTw8aydIL/C9abAVGCzRReuj5h30TPx4LumBtAidrVOtXnlB+RZkBtExMsfqkMfb8g==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.39.0.tgz", + "integrity": "sha512-ThFdkrFDP55AIsIZDKSBWEt/JcWlCzydbZHinZ0F/r1h83qbGeenCt/G/wG2O0reuENDD2tawfAj2s8VK7Bugg==", "cpu": [ "x64" ], @@ -401,9 +401,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.38.0.tgz", - "integrity": "sha512-u/Jbm1BU89Vftqyqbmxdq14nBaQjQX1HhmsdBWqSdGClNaKwhjsg5TpW+5Ibs1mb8Es9wJiMdl86BcmtUVXNZg==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.39.0.tgz", + "integrity": "sha512-jDrLm6yUtbOg2TYB3sBF3acUnAwsIksEYjLeHL+TJv9jg+TmTwdyjnDex27jqEMakNKf3RwwPahDIt7QXCSqRQ==", "cpu": [ "arm64" ], @@ -415,9 +415,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.38.0.tgz", - "integrity": "sha512-mqu4PzTrlpNHHbu5qleGvXJoGgHpChBlrBx/mEhTPpnAL1ZAYFlvHD7rLK839LLKQzqEQMFJfGrrOHItN4ZQqA==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.39.0.tgz", + "integrity": "sha512-6w9uMuza+LbLCVoNKL5FSLE7yvYkq9laSd09bwS0tMjkwXrmib/4KmoJcrKhLWHvw19mwU+33ndC69T7weNNjQ==", "cpu": [ "ia32" ], @@ -429,9 +429,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.38.0.tgz", - "integrity": "sha512-jjqy3uWlecfB98Psxb5cD6Fny9Fupv9LrDSPTQZUROqjvZmcCqNu4UMl7qqhlUUGpwiAkotj6GYu4SZdcr/nLw==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.39.0.tgz", + "integrity": "sha512-yAkUOkIKZlK5dl7u6dg897doBgLXmUHhIINM2c+sND3DZwnrdQkkSiDh7N75Ll4mM4dxSkYfXqU9fW3lLkMFug==", "cpu": [ "x64" ], @@ -4958,9 +4958,9 @@ } }, "node_modules/rollup": { - "version": "4.38.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.38.0.tgz", - "integrity": "sha512-5SsIRtJy9bf1ErAOiFMFzl64Ex9X5V7bnJ+WlFMb+zmP459OSWCEG7b0ERZ+PEU7xPt4OG3RHbrp1LJlXxYTrw==", + "version": "4.39.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.39.0.tgz", + "integrity": "sha512-thI8kNc02yNvnmJp8dr3fNWJ9tCONDhp6TV35X6HkKGGs9E6q7YWCHbe5vKiTa7TAiNcFEmXKj3X/pG2b3ci0g==", "dev": true, "license": "MIT", "dependencies": { @@ -4974,26 +4974,26 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.38.0", - "@rollup/rollup-android-arm64": "4.38.0", - "@rollup/rollup-darwin-arm64": "4.38.0", - "@rollup/rollup-darwin-x64": "4.38.0", - "@rollup/rollup-freebsd-arm64": "4.38.0", - "@rollup/rollup-freebsd-x64": "4.38.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.38.0", - "@rollup/rollup-linux-arm-musleabihf": "4.38.0", - "@rollup/rollup-linux-arm64-gnu": "4.38.0", - "@rollup/rollup-linux-arm64-musl": "4.38.0", - "@rollup/rollup-linux-loongarch64-gnu": "4.38.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.38.0", - "@rollup/rollup-linux-riscv64-gnu": "4.38.0", - "@rollup/rollup-linux-riscv64-musl": "4.38.0", - "@rollup/rollup-linux-s390x-gnu": "4.38.0", - "@rollup/rollup-linux-x64-gnu": "4.38.0", - "@rollup/rollup-linux-x64-musl": "4.38.0", - "@rollup/rollup-win32-arm64-msvc": "4.38.0", - "@rollup/rollup-win32-ia32-msvc": "4.38.0", - "@rollup/rollup-win32-x64-msvc": "4.38.0", + "@rollup/rollup-android-arm-eabi": "4.39.0", + "@rollup/rollup-android-arm64": "4.39.0", + "@rollup/rollup-darwin-arm64": "4.39.0", + "@rollup/rollup-darwin-x64": "4.39.0", + "@rollup/rollup-freebsd-arm64": "4.39.0", + "@rollup/rollup-freebsd-x64": "4.39.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.39.0", + "@rollup/rollup-linux-arm-musleabihf": "4.39.0", + "@rollup/rollup-linux-arm64-gnu": "4.39.0", + "@rollup/rollup-linux-arm64-musl": "4.39.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.39.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-gnu": "4.39.0", + "@rollup/rollup-linux-riscv64-musl": "4.39.0", + "@rollup/rollup-linux-s390x-gnu": "4.39.0", + "@rollup/rollup-linux-x64-gnu": "4.39.0", + "@rollup/rollup-linux-x64-musl": "4.39.0", + "@rollup/rollup-win32-arm64-msvc": "4.39.0", + "@rollup/rollup-win32-ia32-msvc": "4.39.0", + "@rollup/rollup-win32-x64-msvc": "4.39.0", "fsevents": "~2.3.2" } }, diff --git a/src/public/stylesheets/style.css b/src/public/stylesheets/style.css index c20edef76..47a2bbba4 100644 --- a/src/public/stylesheets/style.css +++ b/src/public/stylesheets/style.css @@ -1474,6 +1474,11 @@ body:not(.mobile) #launcher-pane.horizontal .dropdown-submenu > .dropdown-menu { #launcher-pane { color: var(--launcher-pane-text-color); background-color: var(--launcher-pane-background-color); + position: relative; +} + +#launcher-pane .right-dropdown-widget { + position: static; } #right-pane { diff --git a/src/services/data_dir.spec.ts b/src/services/data_dir.spec.ts index 24315a5ff..f04f16ca0 100644 --- a/src/services/data_dir.spec.ts +++ b/src/services/data_dir.spec.ts @@ -64,17 +64,17 @@ describe("data_dir.ts unit tests", async () => { type TestCaseGetPlatformAppDataDir = [description: string, fnValue: Parameters, expectedValue: string | null, osHomedirMockValue: string | null]; const testCases: TestCaseGetPlatformAppDataDir[] = [ - ["w/ unsupported OS it should return 'null'", ["aix", undefined], null, null], + [ "w/ unsupported OS it should return 'null'", [ "aix", undefined ], null, null ], - ["w/ win32 and no APPDATA set it should return 'null'", ["win32", undefined], null, null], + [ "w/ win32 and no APPDATA set it should return 'null'", [ "win32", undefined ], null, null ], - ["w/ win32 and set APPDATA it should return set 'APPDATA'", ["win32", "AppData"], "AppData", null], + [ "w/ win32 and set APPDATA it should return set 'APPDATA'", [ "win32", "AppData" ], "AppData", null ], - ["w/ linux it should return '~/.local/share'", ["linux", undefined], "/home/mock/.local/share", "/home/mock"], + [ "w/ linux it should return '~/.local/share'", [ "linux", undefined ], "/home/mock/.local/share", "/home/mock" ], - ["w/ linux and wrongly set APPDATA it should ignore APPDATA and return '~/.local/share'", ["linux", "FakeAppData"], "/home/mock/.local/share", "/home/mock"], + [ "w/ linux and wrongly set APPDATA it should ignore APPDATA and return '~/.local/share'", [ "linux", "FakeAppData" ], "/home/mock/.local/share", "/home/mock" ], - ["w/ darwin it should return '~/Library/Application Support'", ["darwin", undefined], "/Users/mock/Library/Application Support", "/Users/mock"] + [ "w/ darwin it should return '~/Library/Application Support'", [ "darwin", undefined ], "/Users/mock/Library/Application Support", "/Users/mock" ] ]; beforeEach(() => { @@ -83,7 +83,7 @@ describe("data_dir.ts unit tests", async () => { }); testCases.forEach((testCase) => { - const [testDescription, fnValues, expected, osHomedirMockValue] = testCase; + const [ testDescription, fnValues, expected, osHomedirMockValue ] = testCase; return it(testDescription, () => { mockFn.osHomedirMock.mockReturnValue(osHomedirMockValue); const actual = getPlatformAppDataDir(...fnValues); @@ -272,7 +272,7 @@ describe("data_dir.ts unit tests", async () => { }); describe("#getDataDirs()", () => { - const envKeys: Omit, "TRILIUM_DATA_DIR">[] = ["DOCUMENT_PATH", "BACKUP_DIR", "LOG_DIR", "ANONYMIZED_DB_DIR", "CONFIG_INI_PATH", "TMP_DIR"]; + const envKeys: Omit, "TRILIUM_DATA_DIR">[] = [ "DOCUMENT_PATH", "BACKUP_DIR", "LOG_DIR", "ANONYMIZED_DB_DIR", "CONFIG_INI_PATH", "TMP_DIR" ]; const setMockedEnv = (prefix: string | null) => { envKeys.forEach((key) => { diff --git a/src/services/in_app_help.spec.ts b/src/services/in_app_help.spec.ts index 2871fc16b..a9df31c1a 100644 --- a/src/services/in_app_help.spec.ts +++ b/src/services/in_app_help.spec.ts @@ -7,7 +7,7 @@ describe("In-app help", () => { const meta: NoteMeta = { isClone: false, noteId: "yoAe4jV2yzbd", - notePath: ["OkOZllzB3fqN", "yoAe4jV2yzbd"], + notePath: [ "OkOZllzB3fqN", "yoAe4jV2yzbd" ], title: "Features", notePosition: 40, prefix: null, @@ -38,7 +38,7 @@ describe("In-app help", () => { const meta: NoteMeta = { isClone: false, noteId: "yoAe4jV2yzbd", - notePath: ["OkOZllzB3fqN", "yoAe4jV2yzbd"], + notePath: [ "OkOZllzB3fqN", "yoAe4jV2yzbd" ], title: "Features", notePosition: 40, prefix: null, diff --git a/src/services/sanitize_attribute_name.spec.ts b/src/services/sanitize_attribute_name.spec.ts index 7688e3548..3755da5a7 100644 --- a/src/services/sanitize_attribute_name.spec.ts +++ b/src/services/sanitize_attribute_name.spec.ts @@ -3,33 +3,33 @@ import sanitizeAttributeName from "./sanitize_attribute_name.js"; // fn value, expected value const testCases: [fnValue: string, expectedValue: string][] = [ - ["testName", "testName"], - ["test_name", "test_name"], - ["test with space", "test_with_space"], - ["test:with:colon", "test:with:colon"], + [ "testName", "testName" ], + [ "test_name", "test_name" ], + [ "test with space", "test_with_space" ], + [ "test:with:colon", "test:with:colon" ], // numbers - ["123456", "123456"], - ["123:456", "123:456"], - ["123456 abc", "123456_abc"], + [ "123456", "123456" ], + [ "123:456", "123:456" ], + [ "123456 abc", "123456_abc" ], // non-latin characters - ["ε", "ε"], - ["attribute ε", "attribute_ε"], + [ "ε", "ε" ], + [ "attribute ε", "attribute_ε" ], // special characters - ["test/name", "test_name"], - ["test%name", "test_name"], - ["\/", "_"], + [ "test/name", "test_name" ], + [ "test%name", "test_name" ], + [ "\/", "_" ], // empty string - ["", "unnamed"] + [ "", "unnamed" ] ]; describe("sanitizeAttributeName unit tests", () => { testCases.forEach((testCase) => { return it(`'${testCase[0]}' should return '${testCase[1]}'`, () => { - const [value, expected] = testCase; + const [ value, expected ] = testCase; const actual = sanitizeAttributeName(value); expect(actual).toStrictEqual(expected); }); diff --git a/src/services/tree.spec.ts b/src/services/tree.spec.ts index bf17ce9d7..c7082eae9 100644 --- a/src/services/tree.spec.ts +++ b/src/services/tree.spec.ts @@ -61,7 +61,7 @@ describe("Tree", () => { rootNote.child(note(String(i))); } - const expectedOrder = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]; + const expectedOrder = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" ]; // Sort a few times to ensure that the resulting order is the same. for (let i = 0; i < 5; i++) { diff --git a/src/services/utils.spec.ts b/src/services/utils.spec.ts index afa1ba4e7..f6b21a8cd 100644 --- a/src/services/utils.spec.ts +++ b/src/services/utils.spec.ts @@ -61,17 +61,17 @@ describe.todo("#hash", () => {}); describe("#isEmptyOrWhitespace", () => { const testCases: TestCase[] = [ - ["w/ 'null' it should return true", [null], true], - ["w/ 'null' it should return true", [null], true], - ["w/ undefined it should return true", [undefined], true], - ["w/ empty string '' it should return true", [""], true], - ["w/ single whitespace string ' ' it should return true", [" "], true], - ["w/ multiple whitespace string ' ' it should return true", [" "], true], - ["w/ non-empty string ' t ' it should return false", [" t "], false] + [ "w/ 'null' it should return true", [ null ], true ], + [ "w/ 'null' it should return true", [ null ], true ], + [ "w/ undefined it should return true", [ undefined ], true ], + [ "w/ empty string '' it should return true", [ "" ], true ], + [ "w/ single whitespace string ' ' it should return true", [ " " ], true ], + [ "w/ multiple whitespace string ' ' it should return true", [ " " ], true ], + [ "w/ non-empty string ' t ' it should return false", [ " t " ], false ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.isEmptyOrWhitespace(...fnParams); expect(result).toStrictEqual(expected); @@ -81,18 +81,18 @@ describe("#isEmptyOrWhitespace", () => { describe("#sanitizeSqlIdentifier", () => { const testCases: TestCase[] = [ - ["w/ 'test' it should not strip anything", ["test"], "test"], - ["w/ 'test123' it should not strip anything", ["test123"], "test123"], - ["w/ 'tEst_TeSt' it should not strip anything", ["tEst_TeSt"], "tEst_TeSt"], - ["w/ 'test_test' it should not strip '_'", ["test_test"], "test_test"], - ["w/ 'test-' it should strip the '-'", ["test-"], "test"], - ["w/ 'test-test' it should strip the '-'", ["test-test"], "testtest"], - ["w/ 'test; --test' it should strip the '; --'", ["test; --test"], "testtest"], - ["w/ 'test test' it should strip the ' '", ["test test"], "testtest"] + [ "w/ 'test' it should not strip anything", [ "test" ], "test" ], + [ "w/ 'test123' it should not strip anything", [ "test123" ], "test123" ], + [ "w/ 'tEst_TeSt' it should not strip anything", [ "tEst_TeSt" ], "tEst_TeSt" ], + [ "w/ 'test_test' it should not strip '_'", [ "test_test" ], "test_test" ], + [ "w/ 'test-' it should strip the '-'", [ "test-" ], "test" ], + [ "w/ 'test-test' it should strip the '-'", [ "test-test" ], "testtest" ], + [ "w/ 'test; --test' it should strip the '; --'", [ "test; --test" ], "testtest" ], + [ "w/ 'test test' it should strip the ' '", [ "test test" ], "testtest" ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.sanitizeSqlIdentifier(...fnParams); expect(result).toStrictEqual(expected); @@ -120,7 +120,7 @@ describe("#toObject", () => { { testPropA: "keyA", testPropB: "valueA" }, { testPropA: "keyB", testPropB: "valueB" } ]; - const fn: TestListFn = (testListEntry: TestListEntry) => [testListEntry.testPropA + "_fn", testListEntry.testPropB + "_fn"]; + const fn: TestListFn = (testListEntry: TestListEntry) => [ testListEntry.testPropA + "_fn", testListEntry.testPropB + "_fn" ]; const result = utils.toObject(testList, fn); expect(result).toStrictEqual({ @@ -138,13 +138,13 @@ def

ghi

`; const testCases: TestCase[] = [ - ["should strip all tags and only return the content, leaving new lines and spaces in tact", [htmlWithNewlines], "abc\ndef\nghi"], + [ "should strip all tags and only return the content, leaving new lines and spaces in tact", [ htmlWithNewlines ], "abc\ndef\nghi" ], //TriliumNextTODO: should this actually insert a space between content to prevent concatenated text? - ["should strip all tags and only return the content", ["

abc

def

"], "abcdef"] + [ "should strip all tags and only return the content", [ "

abc

def

" ], "abcdef" ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.stripTags(...fnParams); expect(result).toStrictEqual(expected); @@ -162,33 +162,33 @@ describe("#getContentDisposition", () => { const testCases: TestCase[] = [ [ "when passed filename is empty, it should fallback to default value 'file'", - [" "], + [ " " ], defaultFallBackDisposition ], [ "when passed filename '..' would cause sanitized filename to be empty, it should fallback to default value 'file'", - [".."], + [ ".." ], defaultFallBackDisposition ], // COM1 is a Windows specific "illegal filename" that sanitize filename strips away [ "when passed filename 'COM1' would cause sanitized filename to be empty, it should fallback to default value 'file'", - ["COM1"], + [ "COM1" ], defaultFallBackDisposition ], [ "sanitized passed filename should be returned URIEncoded", - ["test file.csv"], + [ "test file.csv" ], `file; filename="test%20file.csv"; filename*=UTF-8''test%20file.csv` ] - ] + ]; testCases.forEach(testCase => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.getContentDisposition(...fnParams); expect(result).toStrictEqual(expected); - }) + }); }); }); @@ -197,38 +197,38 @@ describe("#isStringNote", () => { const testCases: TestCase[] = [ [ "w/ 'undefined' note type, but a string mime type, it should return true", - [undefined, "application/javascript"], + [ undefined, "application/javascript" ], true ], [ "w/ non-string note type, it should return false", - ["image", "image/jpeg"], + [ "image", "image/jpeg" ], false ], [ "w/ string note type (text), it should return true", - ["text", "text/html"], + [ "text", "text/html" ], true ], [ "w/ string note type (code), it should return true", - ["code", "application/json"], + [ "code", "application/json" ], true ], [ "w/ non-string note type (file), but string mime type, it should return true", - ["file", "application/json"], + [ "file", "application/json" ], true ], [ "w/ non-string note type (file), but mime type starting with 'text/', it should return true", - ["file", "text/html"], + [ "file", "text/html" ], true - ], + ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.isStringNote(...fnParams); expect(result).toStrictEqual(expected); @@ -242,15 +242,15 @@ describe.todo("#replaceAll", () => {}); describe("#removeTextFileExtension", () => { const testCases: TestCase[] = [ - ["w/ 'test.md' it should strip '.md'", ["test.md"], "test"], - ["w/ 'test.markdown' it should strip '.markdown'", ["test.markdown"], "test"], - ["w/ 'test.html' it should strip '.html'", ["test.html"], "test"], - ["w/ 'test.htm' it should strip '.htm'", ["test.htm"], "test"], - ["w/ 'test.zip' it should NOT strip '.zip'", ["test.zip"], "test.zip"] + [ "w/ 'test.md' it should strip '.md'", [ "test.md" ], "test" ], + [ "w/ 'test.markdown' it should strip '.markdown'", [ "test.markdown" ], "test" ], + [ "w/ 'test.html' it should strip '.html'", [ "test.html" ], "test" ], + [ "w/ 'test.htm' it should strip '.htm'", [ "test.htm" ], "test" ], + [ "w/ 'test.zip' it should NOT strip '.zip'", [ "test.zip" ], "test.zip" ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.removeTextFileExtension(...fnParams); expect(result).toStrictEqual(expected); @@ -261,63 +261,63 @@ describe("#removeTextFileExtension", () => { describe("#getNoteTitle", () => { const testCases: TestCase[] = [ [ - "when file has no spaces, and no special file extension, it should return the filename unaltered", - ["test.json", true, undefined], - "test.json" + "when file has no spaces, and no special file extension, it should return the filename unaltered", + [ "test.json", true, undefined ], + "test.json" ], [ - "when replaceUnderscoresWithSpaces is false, it should keep the underscores in the title", - ["test_file.json", false, undefined], - "test_file.json" + "when replaceUnderscoresWithSpaces is false, it should keep the underscores in the title", + [ "test_file.json", false, undefined ], + "test_file.json" ], [ - "when replaceUnderscoresWithSpaces is true, it should replace the underscores in the title", - ["test_file.json", true, undefined], - "test file.json" + "when replaceUnderscoresWithSpaces is true, it should replace the underscores in the title", + [ "test_file.json", true, undefined ], + "test file.json" ], [ - "when filePath ends with one of the extra handled endings (.md), it should strip the file extension from the title", - ["test_file.md", false, undefined], - "test_file" + "when filePath ends with one of the extra handled endings (.md), it should strip the file extension from the title", + [ "test_file.md", false, undefined ], + "test_file" ], [ - "when filePath ends with one of the extra handled endings (.md) and replaceUnderscoresWithSpaces is true, it should strip the file extension from the title and replace underscores", - ["test_file.md", true, undefined], - "test file" + "when filePath ends with one of the extra handled endings (.md) and replaceUnderscoresWithSpaces is true, it should strip the file extension from the title and replace underscores", + [ "test_file.md", true, undefined ], + "test file" ], [ - "when filepath contains a full path, it should only return the basename of the file", - ["Trilium Demo/Scripting examples/Statistics/Most cloned notes/template.zip", true, undefined], - "template.zip" + "when filepath contains a full path, it should only return the basename of the file", + [ "Trilium Demo/Scripting examples/Statistics/Most cloned notes/template.zip", true, undefined ], + "template.zip" ], [ - "when filepath contains a full path and has extra handled ending (.html), it should only return the basename of the file and strip the file extension", - ["Trilium Demo/Scripting examples/Statistics/Most cloned notes/template.html", true, undefined], - "template" + "when filepath contains a full path and has extra handled ending (.html), it should only return the basename of the file and strip the file extension", + [ "Trilium Demo/Scripting examples/Statistics/Most cloned notes/template.html", true, undefined ], + "template" ], [ - "when a noteMeta object is passed, it should use the title from the noteMeta, if present", - ["test_file.md", true, { title: "some other title"}], - "some other title" - ], - [ - "when a noteMeta object is passed, but the title prop is empty, it should try to handle the filename as if no noteMeta was passed", - ["test_file.md", true, { title: ""}], - "test file" + "when a noteMeta object is passed, it should use the title from the noteMeta, if present", + [ "test_file.md", true, { title: "some other title" } ], + "some other title" ], [ "when a noteMeta object is passed, but the title prop is empty, it should try to handle the filename as if no noteMeta was passed", - ["test_file.json", false, { title: " "}], + [ "test_file.md", true, { title: "" } ], + "test file" + ], + [ + "when a noteMeta object is passed, but the title prop is empty, it should try to handle the filename as if no noteMeta was passed", + [ "test_file.json", false, { title: " " } ], "test_file.json" ] ]; testCases.forEach(testCase => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.getNoteTitle(...fnParams); expect(result).toStrictEqual(expected); - }); + }); }); }); @@ -389,15 +389,15 @@ describe("#deferred", () => { describe("#removeDiacritic", () => { const testCases: TestCase[] = [ - ["w/ 'Äpfel' it should replace the 'Ä'", ["Äpfel"], "Apfel"], - ["w/ 'Été' it should replace the 'É' and 'é'", ["Été"], "Ete"], - ["w/ 'Fête' it should replace the 'ê'", ["Fête"], "Fete"], - ["w/ 'Αλφαβήτα' it should replace the 'ή'", ["Αλφαβήτα"], "Αλφαβητα"], - ["w/ '' (empty string) it should return empty string", [""], ""] + [ "w/ 'Äpfel' it should replace the 'Ä'", [ "Äpfel" ], "Apfel" ], + [ "w/ 'Été' it should replace the 'É' and 'é'", [ "Été" ], "Ete" ], + [ "w/ 'Fête' it should replace the 'ê'", [ "Fête" ], "Fete" ], + [ "w/ 'Αλφαβήτα' it should replace the 'ή'", [ "Αλφαβήτα" ], "Αλφαβητα" ], + [ "w/ '' (empty string) it should return empty string", [ "" ], "" ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.removeDiacritic(...fnParams); expect(result).toStrictEqual(expected); @@ -407,15 +407,15 @@ describe("#removeDiacritic", () => { describe("#normalize", () => { const testCases: TestCase[] = [ - ["w/ 'Äpfel' it should replace the 'Ä' and return lowercased", ["Äpfel"], "apfel"], - ["w/ 'Été' it should replace the 'É' and 'é' and return lowercased", ["Été"], "ete"], - ["w/ 'FêTe' it should replace the 'ê' and return lowercased", ["FêTe"], "fete"], - ["w/ 'ΑλΦαβήΤα' it should replace the 'ή' and return lowercased", ["ΑλΦαβήΤα"], "αλφαβητα"], - ["w/ '' (empty string) it should return empty string", [""], ""] + [ "w/ 'Äpfel' it should replace the 'Ä' and return lowercased", [ "Äpfel" ], "apfel" ], + [ "w/ 'Été' it should replace the 'É' and 'é' and return lowercased", [ "Été" ], "ete" ], + [ "w/ 'FêTe' it should replace the 'ê' and return lowercased", [ "FêTe" ], "fete" ], + [ "w/ 'ΑλΦαβήΤα' it should replace the 'ή' and return lowercased", [ "ΑλΦαβήΤα" ], "αλφαβητα" ], + [ "w/ '' (empty string) it should return empty string", [ "" ], "" ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.normalize(...fnParams); expect(result).toStrictEqual(expected); @@ -425,21 +425,21 @@ describe("#normalize", () => { describe("#toMap", () => { it("should return an instace of Map, with the correct size and keys, when supplied with a list and existing keys", () => { - const testList = [{title: "test", propA: "text", propB: 123 }, {title: "test2", propA: "prop2", propB: 456 }]; + const testList = [ { title: "test", propA: "text", propB: 123 }, { title: "test2", propA: "prop2", propB: 456 } ]; const result = utils.toMap(testList, "title"); expect(result).toBeInstanceOf(Map); expect(result.size).toBe(2); - expect(Array.from(result.keys())).toStrictEqual(["test", "test2"]); + expect(Array.from(result.keys())).toStrictEqual([ "test", "test2" ]); }); it("should return an instace of Map, with an empty size, when the supplied list does not contain the supplied key", () => { - const testList = [{title: "test", propA: "text", propB: 123 }, {title: "test2", propA: "prop2", propB: 456 }]; + const testList = [ { title: "test", propA: "text", propB: 123 }, { title: "test2", propA: "prop2", propB: 456 } ]; //@ts-expect-error - key is non-existing on supplied list type const result = utils.toMap(testList, "nonExistingKey"); expect(result).toBeInstanceOf(Map); expect(result.size).toBe(0); }); it.fails("should correctly handle duplicate keys? (currently it will overwrite the entry, so returned size will be 1 instead of 2)", () => { - const testList = [{title: "testDupeTitle", propA: "text", propB: 123 }, {title: "testDupeTitle", propA: "prop2", propB: 456 }]; + const testList = [ { title: "testDupeTitle", propA: "text", propB: 123 }, { title: "testDupeTitle", propA: "prop2", propB: 456 } ]; const result = utils.toMap(testList, "title"); expect(result).toBeInstanceOf(Map); expect(result.size).toBe(2); @@ -448,25 +448,25 @@ describe("#toMap", () => { describe("#envToBoolean", () => { const testCases: TestCase[] = [ - ["w/ 'true' it should return boolean 'true'", ["true"], true], - ["w/ 'True' it should return boolean 'true'", ["True"], true], - ["w/ 'TRUE' it should return boolean 'true'", ["TRUE"], true], - ["w/ 'true ' it should return boolean 'true'", ["true "], true], - ["w/ 'false' it should return boolean 'false'", ["false"], false], - ["w/ 'False' it should return boolean 'false'", ["False"], false], - ["w/ 'FALSE' it should return boolean 'false'", ["FALSE"], false], - ["w/ 'false ' it should return boolean 'false'", ["false "], false], - ["w/ 'whatever' (non-boolean string) it should return undefined", ["whatever"], undefined], - ["w/ '-' (non-boolean string) it should return undefined", ["-"], undefined], - ["w/ '' (empty string) it should return undefined", [""], undefined], - ["w/ ' ' (white space string) it should return undefined", [" "], undefined], - ["w/ undefined it should return undefined", [undefined], undefined], + [ "w/ 'true' it should return boolean 'true'", [ "true" ], true ], + [ "w/ 'True' it should return boolean 'true'", [ "True" ], true ], + [ "w/ 'TRUE' it should return boolean 'true'", [ "TRUE" ], true ], + [ "w/ 'true ' it should return boolean 'true'", [ "true " ], true ], + [ "w/ 'false' it should return boolean 'false'", [ "false" ], false ], + [ "w/ 'False' it should return boolean 'false'", [ "False" ], false ], + [ "w/ 'FALSE' it should return boolean 'false'", [ "FALSE" ], false ], + [ "w/ 'false ' it should return boolean 'false'", [ "false " ], false ], + [ "w/ 'whatever' (non-boolean string) it should return undefined", [ "whatever" ], undefined ], + [ "w/ '-' (non-boolean string) it should return undefined", [ "-" ], undefined ], + [ "w/ '' (empty string) it should return undefined", [ "" ], undefined ], + [ "w/ ' ' (white space string) it should return undefined", [ " " ], undefined ], + [ "w/ undefined it should return undefined", [ undefined ], undefined ], //@ts-expect-error - pass wrong type as param - ["w/ number 1 it should return undefined", [1], undefined] + [ "w/ number 1 it should return undefined", [ 1 ], undefined ] ]; testCases.forEach((testCase) => { - const [desc, fnParams, expected] = testCase; + const [ desc, fnParams, expected ] = testCase; it(desc, () => { const result = utils.envToBoolean(...fnParams); expect(result).toStrictEqual(expected); @@ -515,7 +515,7 @@ describe("#safeExtractMessageAndStackFromError", () => { expect(actual[0]).toBe("Unknown Error"); expect(actual[1]).toBeUndefined(); }); -}) +}); describe("#formatDownloadTitle", () => { //prettier-ignore @@ -523,105 +523,105 @@ describe("#formatDownloadTitle", () => { // empty fileName tests [ - ["", "text", ""], + [ "", "text", "" ], "untitled.html" ], [ - ["", "canvas", ""], + [ "", "canvas", "" ], "untitled.json" ], [ - ["", null, ""], + [ "", null, "" ], "untitled" ], // json extension from type tests [ - ["test_file", "canvas", ""], + [ "test_file", "canvas", "" ], "test_file.json" ], [ - ["test_file", "relationMap", ""], + [ "test_file", "relationMap", "" ], "test_file.json" ], [ - ["test_file", "search", ""], + [ "test_file", "search", "" ], "test_file.json" ], // extension based on mime type [ - ["test_file", null, "text/csv"], + [ "test_file", null, "text/csv" ], "test_file.csv" ], [ - ["test_file_wo_ext", "image", "image/svg+xml"], + [ "test_file_wo_ext", "image", "image/svg+xml" ], "test_file_wo_ext.svg" ], [ - ["test_file_wo_ext", "file", "application/json"], + [ "test_file_wo_ext", "file", "application/json" ], "test_file_wo_ext.json" ], [ - ["test_file_w_fake_ext.ext", "image", "image/svg+xml"], + [ "test_file_w_fake_ext.ext", "image", "image/svg+xml" ], "test_file_w_fake_ext.ext.svg" ], [ - ["test_file_w_correct_ext.svg", "image", "image/svg+xml"], + [ "test_file_w_correct_ext.svg", "image", "image/svg+xml" ], "test_file_w_correct_ext.svg" ], [ - ["test_file_w_correct_ext.svgz", "image", "image/svg+xml"], + [ "test_file_w_correct_ext.svgz", "image", "image/svg+xml" ], "test_file_w_correct_ext.svgz" ], [ - ["test_file.zip", "file", "application/zip"], + [ "test_file.zip", "file", "application/zip" ], "test_file.zip" ], [ - ["test_file", "file", "application/zip"], + [ "test_file", "file", "application/zip" ], "test_file.zip" ], // application/octet-stream tests [ - ["test_file", "file", "application/octet-stream"], + [ "test_file", "file", "application/octet-stream" ], "test_file" ], [ - ["test_file.zip", "file", "application/octet-stream"], + [ "test_file.zip", "file", "application/octet-stream" ], "test_file.zip" ], [ - ["test_file.unknown", null, "application/octet-stream"], + [ "test_file.unknown", null, "application/octet-stream" ], "test_file.unknown" ], // sanitized filename tests [ - ["test/file", null, "application/octet-stream"], + [ "test/file", null, "application/octet-stream" ], "testfile" ], [ - ["test:file.zip", "file", "application/zip"], + [ "test:file.zip", "file", "application/zip" ], "testfile.zip" ], [ - [":::", "file", "application/zip"], + [ ":::", "file", "application/zip" ], ".zip" ], [ - [":::a", "file", "application/zip"], + [ ":::a", "file", "application/zip" ], "a.zip" ] ]; testCases.forEach((testCase) => { - const [fnParams, expected] = testCase; + const [ fnParams, expected ] = testCase; return it(`With args '${JSON.stringify(fnParams)}', it should return '${expected}'`, () => { const actual = utils.formatDownloadTitle(...fnParams); expect(actual).toStrictEqual(expected); diff --git a/src/share/routes.spec.ts b/src/share/routes.spec.ts index 425fcbaed..ba2af2b81 100644 --- a/src/share/routes.spec.ts +++ b/src/share/routes.spec.ts @@ -13,7 +13,7 @@ describe("Share API test", () => { initializeTranslations(); app = (await import("../app.js")).default; app.use((err: unknown, req: Request, res: Response, next: NextFunction) => { - const [errMessage] = safeExtractMessageAndStackFromError(err) + const [ errMessage ] = safeExtractMessageAndStackFromError(err); if (errMessage.includes("Cannot set headers after they are sent to the client")) { cannotSetHeadersCount++; }