├── .gitignore ├── .rustfmt.toml ├── rust-toolchain.toml ├── tests ├── registry_data │ ├── @b__pkg@2.0.5.json │ ├── @a__pkg@2.1.5.json │ └── @aa__pkg@2.1.5.json ├── specs │ ├── transforms │ │ ├── upgrades_v3_empty.txt │ │ ├── upgrades_v3_npm_dep_different_key_name.txt │ │ ├── upgrades_v3_npm_dep_multiple_versions.txt │ │ ├── upgrades_v3_jsr_same_dep_different_specifiers.txt │ │ └── upgrades_v3_https_only.txt │ └── config_changes │ │ ├── CircularJsrDep01.txt │ │ ├── CircularJsrDep03.txt │ │ ├── links │ │ ├── changing_different_deps_removes_added_links.txt │ │ ├── changing_same_deps_removes_added_links.txt │ │ ├── adding_with_different_npm_deps_clears.txt │ │ ├── adding_with_same_npm_deps_maintains.txt │ │ ├── not_changing_keeps_npm_deps.txt │ │ ├── not_changing_keeps_npm_deps_deprecatedPatches.txt │ │ ├── changing_removes_npm_deps.txt │ │ └── changing_removes_npm_deps2.txt │ │ ├── CircularJsrDep02.txt │ │ ├── remove_jsr_dep_with_npm_dep_shared_with_other_jsr_dep.txt │ │ ├── ShiftingDepsDifferentWorkspaceMember.txt │ │ ├── RemovingWorkspaceMember.txt │ │ ├── RemovingWorkspaceDep.txt │ │ ├── RemovingOakThenDax.txt │ │ ├── RemovingNpmDepsDenoJson.txt │ │ ├── NoConfigMaintains_v4.txt │ │ ├── RemovedConfigRemoves.txt │ │ ├── NoNpmMaintainsNpm.txt │ │ ├── RemovedDenoJsonRemoves.txt │ │ └── RemovedPackageJsonRemoves.txt ├── helpers │ └── mod.rs ├── integration_test.rs └── spec_test.rs ├── README.md ├── .github └── workflows │ ├── publish.yml │ ├── ci.yml │ └── release.yml ├── Cargo.toml ├── LICENSE └── src ├── error.rs └── graphs.rs /.gitignore: -------------------------------------------------------------------------------- 1 | .vscode/ 2 | /target -------------------------------------------------------------------------------- /.rustfmt.toml: -------------------------------------------------------------------------------- 1 | max_width = 80 2 | tab_spaces = 2 3 | edition = "2024" -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "1.89.0" 3 | components = ["clippy", "rustfmt"] 4 | profile = "minimal" 5 | -------------------------------------------------------------------------------- /tests/registry_data/@b__pkg@2.0.5.json: -------------------------------------------------------------------------------- 1 | { 2 | "tarballUrl": "https://fake-registry.com/b/pkg-2.0.5.tgz", 3 | "deprecated": true 4 | } 5 | -------------------------------------------------------------------------------- /tests/specs/transforms/upgrades_v3_empty.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "remote": {} 5 | } 6 | 7 | # output 8 | { 9 | "version": "5" 10 | } 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `deno_lockfile` 2 | 3 | [![](https://img.shields.io/crates/v/deno_lockfile.svg)](https://crates.io/crates/deno_lockfile) 4 | 5 | This crate implements the lockfile format used by Deno. 6 | -------------------------------------------------------------------------------- /tests/registry_data/@a__pkg@2.1.5.json: -------------------------------------------------------------------------------- 1 | { 2 | "cpu": ["x86_64"], 3 | "os": ["darwin", "linux", "win32"], 4 | "tarballUrl": "https://fake-registry.com/a/pkg-2.1.5.tgz", 5 | "optionalDependencies": { "@b/pkg": "2.0.5" } 6 | } 7 | -------------------------------------------------------------------------------- /tests/registry_data/@aa__pkg@2.1.5.json: -------------------------------------------------------------------------------- 1 | { 2 | "cpu": ["x86_64"], 3 | "os": ["darwin", "linux", "win32"], 4 | "tarballUrl": "https://fake-registry.com/a/pkg-2.1.5.tgz", 5 | "optionalDependencies": { "othername": "npm:@b/pkg@2.0.5" }, 6 | "bin": true, 7 | "scripts": true, 8 | "optionalPeers": { "optionalpeerdep": "npm:@z/pkg@1.0.0" } 9 | } 10 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: publish 2 | 3 | on: 4 | push: 5 | tags: 6 | - "*" 7 | 8 | jobs: 9 | publish: 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: read 13 | id-token: write 14 | steps: 15 | - name: Clone repository 16 | uses: actions/checkout@v5 17 | - uses: rust-lang/crates-io-auth-action@v1 18 | id: auth 19 | - run: cargo publish 20 | env: 21 | CARGO_REGISTRY_TOKEN: ${{ steps.auth.outputs.token }} 22 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | # Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. 2 | 3 | [package] 4 | name = "deno_lockfile" 5 | version = "0.32.2" 6 | edition = "2024" 7 | license = "MIT" 8 | description = "An implementation of a lockfile used in Deno" 9 | repository = "https://github.com/denoland/deno_lockfile" 10 | 11 | [[test]] 12 | name = "specs" 13 | path = "tests/spec_test.rs" 14 | harness = false 15 | 16 | [dependencies] 17 | async-trait = "0.1.88" 18 | deno_semver = "0.9.0" 19 | serde = { version = "1.0.149", features = ["derive"] } 20 | serde_json = "1.0.85" 21 | thiserror = "2.0.3" 22 | 23 | [dev-dependencies] 24 | async-executor = "1.13.1" 25 | file_test_runner = "0.7.4" 26 | futures = { version = "0.3.31", default-features = false, features = ["std"] } 27 | futures-lite = "2.6.0" 28 | pretty_assertions = "1.4.0" 29 | -------------------------------------------------------------------------------- /tests/specs/config_changes/CircularJsrDep01.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a": "jsr:@scope/package_a@0.0.1", 7 | "jsr:@scope/package_b": "jsr:@scope/package_b@0.0.1" 8 | }, 9 | "jsr": { 10 | "@scope/package_a@0.0.1": { 11 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 12 | "dependencies": [ 13 | "jsr:@scope/package_b" 14 | ] 15 | }, 16 | "@scope/package_b@0.0.1": { 17 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 18 | "dependencies": [ 19 | "jsr:@scope/package_a" 20 | ] 21 | } 22 | } 23 | }, 24 | "remote": { 25 | }, 26 | "workspace": { 27 | "dependencies": [ 28 | "jsr:@scope/package_a" 29 | ] 30 | } 31 | } 32 | 33 | # remove dependency 34 | { 35 | "dependencies": [ 36 | ] 37 | } 38 | 39 | # output 40 | { 41 | "version": "5" 42 | } 43 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | on: 4 | pull_request: 5 | branches: [main] 6 | push: 7 | branches: [main] 8 | workflow_dispatch: 9 | 10 | jobs: 11 | rust: 12 | name: ubuntu-latest-release 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 30 15 | 16 | env: 17 | CARGO_INCREMENTAL: 0 18 | GH_ACTIONS: 1 19 | RUST_BACKTRACE: full 20 | RUSTFLAGS: -D warnings 21 | 22 | steps: 23 | - name: Clone repository 24 | uses: actions/checkout@v5 25 | 26 | - uses: dsherret/rust-toolchain-file@v1 27 | 28 | - name: Cache 29 | uses: Swatinem/rust-cache@v2 30 | with: 31 | save-if: ${{ github.ref == 'refs/heads/main' }} 32 | 33 | - name: Format 34 | run: cargo fmt --all -- --check 35 | 36 | - name: Lint 37 | run: cargo clippy --all-targets --all-features --release 38 | 39 | - name: Build 40 | run: cargo build --all-targets --all-features --release 41 | - name: Test 42 | run: cargo test --all-targets --all-features --release 43 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | releaseKind: 7 | description: 'Kind of release' 8 | default: 'minor' 9 | type: choice 10 | options: 11 | - patch 12 | - minor 13 | required: true 14 | 15 | jobs: 16 | rust: 17 | name: release 18 | runs-on: ubuntu-latest 19 | timeout-minutes: 30 20 | 21 | steps: 22 | - name: Clone repository 23 | uses: actions/checkout@v5 24 | with: 25 | token: ${{ secrets.DENOBOT_PAT }} 26 | 27 | - uses: denoland/setup-deno@v2 28 | - uses: dsherret/rust-toolchain-file@v1 29 | 30 | - name: Tag and release 31 | env: 32 | GITHUB_TOKEN: ${{ secrets.DENOBOT_PAT }} 33 | GH_WORKFLOW_ACTOR: ${{ github.actor }} 34 | run: | 35 | git config user.email "denobot@users.noreply.github.com" 36 | git config user.name "denobot" 37 | deno run -A jsr:@deno/rust-automation@0.22.0/tasks/publish-release --${{github.event.inputs.releaseKind}} 38 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018-2025 the Deno authors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /tests/specs/transforms/upgrades_v3_npm_dep_different_key_name.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "npm": { 6 | "@aa/pkg@2.1.5": { 7 | "integrity": "sha512-a1", 8 | "dependencies": { 9 | "othername": "@b/pkg@2.0.5" 10 | } 11 | }, 12 | "@b/pkg@2.0.5": { 13 | "integrity": "sha512-b1", 14 | "dependencies": {} 15 | } 16 | } 17 | }, 18 | "remote": {} 19 | } 20 | 21 | # output 22 | { 23 | "version": "5", 24 | "npm": { 25 | "@aa/pkg@2.1.5": { 26 | "integrity": "sha512-a1", 27 | "optionalDependencies": [ 28 | "othername@npm:@b/pkg@2.0.5" 29 | ], 30 | "optionalPeers": [ 31 | "optionalpeerdep@npm:@z/pkg@1.0.0" 32 | ], 33 | "os": ["darwin", "linux", "win32"], 34 | "cpu": ["x86_64"], 35 | "scripts": true, 36 | "bin": true, 37 | "tarball": "https://fake-registry.com/a/pkg-2.1.5.tgz" 38 | }, 39 | "@b/pkg@2.0.5": { 40 | "integrity": "sha512-b1", 41 | "deprecated": true, 42 | "tarball": "https://fake-registry.com/b/pkg-2.0.5.tgz" 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/specs/config_changes/CircularJsrDep03.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a@1": "jsr:@scope/package_a@1.0.1", 7 | "jsr:@scope/package_b@1": "jsr:@scope/package_b@1.0.1", 8 | "jsr:@scope/package_c@^2.1": "jsr:@scope/package_c@2.1.2" 9 | }, 10 | "jsr": { 11 | "@scope/package_a@1.0.1": { 12 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 13 | "dependencies": [ 14 | "jsr:@scope/package_b@1", 15 | "jsr:@scope/package_c@^2.1" 16 | ] 17 | }, 18 | "@scope/package_b@1.0.1": { 19 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 20 | "dependencies": [ 21 | "jsr:@scope/package_a@1" 22 | ] 23 | }, 24 | "@scope/package_c@2.1.2": { 25 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 26 | } 27 | } 28 | }, 29 | "remote": { 30 | }, 31 | "workspace": { 32 | "dependencies": [ 33 | "jsr:@scope/package_a@1" 34 | ] 35 | } 36 | } 37 | 38 | # change 39 | { 40 | "dependencies": [] 41 | } 42 | 43 | # output 44 | { 45 | "version": "5" 46 | } 47 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/changing_different_deps_removes_added_links.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "5", 4 | "specifiers": { 5 | "jsr:@scope/package_a@*": "0.0.1", 6 | "npm:code-block-writer@*": "12.0.0" 7 | }, 8 | "jsr": { 9 | "@scope/package_a@0.0.1": { 10 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 11 | } 12 | }, 13 | "npm": { 14 | "code-block-writer@12.0.0": { 15 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 16 | } 17 | } 18 | } 19 | 20 | # adds link 21 | { 22 | "links": { 23 | "jsr:@scope/package_a@*": { 24 | "dependencies": [ 25 | "npm:code-block-writer@*" 26 | ] 27 | } 28 | } 29 | } 30 | 31 | # output 32 | { 33 | "version": "5", 34 | "specifiers": { 35 | "npm:code-block-writer@*": "12.0.0" 36 | }, 37 | "npm": { 38 | "code-block-writer@12.0.0": { 39 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 40 | } 41 | }, 42 | "workspace": { 43 | "links": { 44 | "jsr:@scope/package_a@*": { 45 | "dependencies": [ 46 | "npm:code-block-writer@*" 47 | ] 48 | } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /tests/specs/config_changes/CircularJsrDep02.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a": "jsr:@scope/package_a@0.0.1", 7 | "jsr:@scope/package_b": "jsr:@scope/package_b@0.0.1", 8 | "jsr:@scope/package_c": "jsr:@scope/package_c@0.0.1" 9 | }, 10 | "jsr": { 11 | "@scope/package_a@0.0.1": { 12 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 13 | "dependencies": [ 14 | "jsr:@scope/package_b" 15 | ] 16 | }, 17 | "@scope/package_b@0.0.1": { 18 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 19 | "dependencies": [ 20 | "jsr:@scope/package_c" 21 | ] 22 | }, 23 | "@scope/package_c@0.0.1": { 24 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 25 | "dependencies": [ 26 | "jsr:@scope/package_a" 27 | ] 28 | } 29 | } 30 | }, 31 | "remote": { 32 | }, 33 | "workspace": { 34 | "dependencies": [ 35 | "jsr:@scope/package_a", 36 | "jsr:@scope/package_c" 37 | ] 38 | } 39 | } 40 | 41 | # remove dependency 42 | { 43 | "dependencies": [ 44 | ] 45 | } 46 | 47 | # output 48 | { 49 | "version": "5" 50 | } 51 | -------------------------------------------------------------------------------- /tests/specs/transforms/upgrades_v3_npm_dep_multiple_versions.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "npm": { 6 | "@a/pkg@2.1.5": { 7 | "integrity": "sha512-a1", 8 | "dependencies": { 9 | "@b/pkg": "@b/pkg@2.0.5", 10 | "@c/pkg": "@c/pkg@1.0.0" 11 | } 12 | }, 13 | "@b/pkg@2.0.5": { 14 | "integrity": "sha512-b1", 15 | "dependencies": { 16 | "@c/pkg": "@c/pkg@2.0.0" 17 | } 18 | }, 19 | "@c/pkg@1.0.0": { 20 | "integrity": "sha512-c1", 21 | "dependencies": {} 22 | }, 23 | "@c/pkg@2.0.0": { 24 | "integrity": "sha512-c2", 25 | "dependencies": {} 26 | } 27 | } 28 | }, 29 | "remote": {} 30 | } 31 | 32 | # output 33 | { 34 | "version": "5", 35 | "npm": { 36 | "@a/pkg@2.1.5": { 37 | "integrity": "sha512-a1", 38 | "dependencies": [ 39 | "@c/pkg@1.0.0" 40 | ], 41 | "optionalDependencies": [ 42 | "@b/pkg" 43 | ], 44 | "os": ["darwin", "linux", "win32"], 45 | "cpu": ["x86_64"], 46 | "tarball": "https://fake-registry.com/a/pkg-2.1.5.tgz" 47 | }, 48 | "@b/pkg@2.0.5": { 49 | "integrity": "sha512-b1", 50 | "dependencies": [ 51 | "@c/pkg@2.0.0" 52 | ], 53 | "deprecated": true, 54 | "tarball": "https://fake-registry.com/b/pkg-2.0.5.tgz" 55 | }, 56 | "@c/pkg@1.0.0": { 57 | "integrity": "sha512-c1" 58 | }, 59 | "@c/pkg@2.0.0": { 60 | "integrity": "sha512-c2" 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /tests/specs/config_changes/remove_jsr_dep_with_npm_dep_shared_with_other_jsr_dep.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "5", 4 | "specifiers": { 5 | "jsr:@pkg/a@1": "1.0.0", 6 | "jsr:@pkg/b@1": "1.0.0", 7 | "npm:dep@1": "1" 8 | }, 9 | "jsr": { 10 | "@pkg/a@1.0.0": { 11 | "integrity": "8c7df175465d994c0e3568e3eb91102768c2f1c86d2a513d7fc4cab13f9cb328", 12 | "dependencies": [ 13 | "npm:dep@1" 14 | ] 15 | }, 16 | "@pkg/b@1.0.0": { 17 | "integrity": "8c7df175465d994c0e3568e3eb91102768c2f1c86d2a513d7fc4cab13f9cb328", 18 | "dependencies": [ 19 | "npm:dep@1" 20 | ] 21 | } 22 | }, 23 | "npm": { 24 | "dep@1.0.0": { 25 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==" 26 | } 27 | }, 28 | "workspace": { 29 | "dependencies": [ 30 | "jsr:@pkg/a@1", 31 | "jsr:@pkg/b@1" 32 | ] 33 | } 34 | } 35 | 36 | 37 | # remove @pkg/a 38 | { 39 | "dependencies": [ 40 | "jsr:@pkg/b@1" 41 | ] 42 | } 43 | 44 | # output 45 | { 46 | "version": "5", 47 | "specifiers": { 48 | "jsr:@pkg/b@1": "1.0.0" 49 | }, 50 | "jsr": { 51 | "@pkg/b@1.0.0": { 52 | "integrity": "8c7df175465d994c0e3568e3eb91102768c2f1c86d2a513d7fc4cab13f9cb328" 53 | } 54 | }, 55 | "npm": { 56 | "dep@1.0.0": { 57 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==" 58 | } 59 | }, 60 | "workspace": { 61 | "dependencies": [ 62 | "jsr:@pkg/b@1" 63 | ] 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/changing_same_deps_removes_added_links.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "5", 4 | "specifiers": { 5 | "jsr:@scope/package_a@*": "0.0.1", 6 | "npm:code-block-writer@*": "12.0.0" 7 | }, 8 | "jsr": { 9 | "@scope/package_a@0.0.1": { 10 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 11 | "dependencies": [ 12 | "npm:code-block-writer" 13 | ] 14 | } 15 | }, 16 | "npm": { 17 | "code-block-writer@12.0.0": { 18 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 19 | } 20 | } 21 | } 22 | 23 | # adds link 24 | { 25 | "links": { 26 | "jsr:@scope/package_a@*": { 27 | "dependencies": [ 28 | "npm:code-block-writer@*" 29 | ] 30 | } 31 | } 32 | } 33 | 34 | # output 35 | { 36 | "version": "5", 37 | "specifiers": { 38 | "jsr:@scope/package_a@*": "0.0.1", 39 | "npm:code-block-writer@*": "12.0.0" 40 | }, 41 | "jsr": { 42 | "@scope/package_a@0.0.1": { 43 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 44 | "dependencies": [ 45 | "npm:code-block-writer" 46 | ] 47 | } 48 | }, 49 | "npm": { 50 | "code-block-writer@12.0.0": { 51 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 52 | } 53 | }, 54 | "workspace": { 55 | "links": { 56 | "jsr:@scope/package_a@*": { 57 | "dependencies": [ 58 | "npm:code-block-writer@*" 59 | ] 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /tests/specs/transforms/upgrades_v3_jsr_same_dep_different_specifiers.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@std/assert@^0.218.2": "jsr:@std/assert@0.218.2", 7 | "jsr:@std/assert@^0.218": "jsr:@std/assert@0.218.2", 8 | "jsr:@std/assert@0.218": "jsr:@std/assert@0.218.2", 9 | "jsr:@std/assert@~0.218": "jsr:@std/assert@0.218.2", 10 | "jsr:@std/assert@~0.218.2": "jsr:@std/assert@0.218.2", 11 | "jsr:@std/path@^0.218.2": "jsr:@std/path@0.218.2" 12 | }, 13 | "jsr": { 14 | "@std/assert@0.218.2": { 15 | "integrity": "7f0a5a1a8cf86607cd6c2c030584096e1ffad27fc9271429a8cb48cfbdee5eaf" 16 | }, 17 | "@std/path@0.218.2": { 18 | "integrity": "abcd", 19 | "dependencies": [ 20 | "jsr:@std/assert@^0.218" 21 | ] 22 | } 23 | } 24 | }, 25 | "remote": {}, 26 | "workspace": { 27 | "dependencies": [ 28 | "jsr:@std/assert@^0.218.2", 29 | "jsr:@std/path@^0.218.2" 30 | ] 31 | } 32 | } 33 | 34 | # output 35 | { 36 | "version": "5", 37 | "specifiers": { 38 | "jsr:@std/assert@0.218": "0.218.2", 39 | "jsr:@std/assert@~0.218.2": "0.218.2", 40 | "jsr:@std/path@~0.218.2": "0.218.2" 41 | }, 42 | "jsr": { 43 | "@std/assert@0.218.2": { 44 | "integrity": "7f0a5a1a8cf86607cd6c2c030584096e1ffad27fc9271429a8cb48cfbdee5eaf" 45 | }, 46 | "@std/path@0.218.2": { 47 | "integrity": "abcd", 48 | "dependencies": [ 49 | "jsr:@std/assert@0.218" 50 | ] 51 | } 52 | }, 53 | "workspace": { 54 | "dependencies": [ 55 | "jsr:@std/assert@~0.218.2", 56 | "jsr:@std/path@~0.218.2" 57 | ] 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/error.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2018-2024 the Deno authors. MIT license. 2 | 3 | use deno_semver::StackString; 4 | use deno_semver::jsr::JsrDepPackageReqParseError; 5 | use deno_semver::package::PackageNv; 6 | use thiserror::Error; 7 | 8 | use crate::transforms::TransformError; 9 | 10 | #[derive(Debug, Error)] 11 | #[error("Failed reading lockfile at '{file_path}'")] 12 | pub struct LockfileError { 13 | pub file_path: String, 14 | #[source] 15 | pub source: LockfileErrorReason, 16 | } 17 | 18 | #[derive(Debug, Error)] 19 | pub enum LockfileErrorReason { 20 | #[error("Lockfile was empty")] 21 | Empty, 22 | #[error("Failed parsing. Lockfile may be corrupt")] 23 | ParseError(serde_json::Error), 24 | #[error("Failed deserializing. Lockfile may be corrupt")] 25 | DeserializationError(#[source] DeserializationError), 26 | #[error( 27 | "Unsupported lockfile version '{version}'. Try upgrading Deno or recreating the lockfile" 28 | )] 29 | UnsupportedVersion { version: String }, 30 | #[error( 31 | "Failed upgrading lockfile to latest version. Lockfile may be corrupt" 32 | )] 33 | TransformError(#[source] TransformError), 34 | } 35 | 36 | impl From for LockfileErrorReason { 37 | fn from(e: TransformError) -> Self { 38 | LockfileErrorReason::TransformError(e) 39 | } 40 | } 41 | 42 | #[derive(Debug, Error)] 43 | pub enum DeserializationError { 44 | #[error("Invalid {0} section: {1:#}")] 45 | FailedDeserializing(&'static str, serde_json::Error), 46 | #[error("Invalid npm package '{0}'")] 47 | InvalidNpmPackageId(StackString), 48 | #[error("Invalid npm package dependency '{0}'")] 49 | InvalidNpmPackageDependency(StackString), 50 | #[error(transparent)] 51 | InvalidPackageSpecifier(#[from] JsrDepPackageReqParseError), 52 | #[error("Invalid package specifier version '{version}' for '{specifier}'")] 53 | InvalidPackageSpecifierVersion { 54 | specifier: String, 55 | version: StackString, 56 | }, 57 | #[error("Invalid jsr dependency '{dependency}' for '{package}'")] 58 | InvalidJsrDependency { 59 | package: PackageNv, 60 | dependency: StackString, 61 | }, 62 | #[error( 63 | "npm package '{0}' was not found and could not have its version resolved" 64 | )] 65 | MissingPackage(StackString), 66 | } 67 | -------------------------------------------------------------------------------- /tests/specs/transforms/upgrades_v3_https_only.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "redirects": { 5 | "https://esm.sh/v135/@types/babel__helper-validator-identifier@~7/index.d.ts": "https://esm.sh/v135/@types/babel__helper-validator-identifier@7.15.2/index.d.ts" 6 | }, 7 | "remote": { 8 | "https://deno.land/std@0.120.0/async/deadline.ts": "1d6ac7aeaee22f75eb86e4e105d6161118aad7b41ae2dd14f4cfd3bf97472b93", 9 | "https://deno.land/std@0.120.0/async/debounce.ts": "b2f693e4baa16b62793fd618de6c003b63228db50ecfe3bd51fc5f6dc0bc264b", 10 | "https://deno.land/std@0.120.0/async/deferred.ts": "ab60d46ba561abb3b13c0c8085d05797a384b9f182935f051dc67136817acdee", 11 | "https://deno.land/std@0.120.0/async/delay.ts": "f2d8ccaa8ebc26594bd8b0989edfd8a96257a714c1dee2fb54d986e5bdd840ac", 12 | "https://deno.land/std@0.120.0/async/mod.ts": "78425176fabea7bd1046ce3819fd69ce40da85c83e0f174d17e8e224a91f7d10", 13 | "https://deno.land/std@0.120.0/async/mux_async_iterator.ts": "62abff3af9ff619e8f2adc96fc70d4ca020fa48a50c23c13f12d02ed2b760dbe", 14 | "https://deno.land/std@0.120.0/async/pool.ts": "353ce4f91865da203a097aa6f33de8966340c91b6f4a055611c8c5d534afd12f", 15 | "https://deno.land/std@0.120.0/async/tee.ts": "3e9f2ef6b36e55188de16a667c702ace4ad0cf84e3720379160e062bf27348ad" 16 | } 17 | } 18 | 19 | # output 20 | { 21 | "version": "5", 22 | "redirects": { 23 | "https://esm.sh/v135/@types/babel__helper-validator-identifier@~7/index.d.ts": "https://esm.sh/v135/@types/babel__helper-validator-identifier@7.15.2/index.d.ts" 24 | }, 25 | "remote": { 26 | "https://deno.land/std@0.120.0/async/deadline.ts": "1d6ac7aeaee22f75eb86e4e105d6161118aad7b41ae2dd14f4cfd3bf97472b93", 27 | "https://deno.land/std@0.120.0/async/debounce.ts": "b2f693e4baa16b62793fd618de6c003b63228db50ecfe3bd51fc5f6dc0bc264b", 28 | "https://deno.land/std@0.120.0/async/deferred.ts": "ab60d46ba561abb3b13c0c8085d05797a384b9f182935f051dc67136817acdee", 29 | "https://deno.land/std@0.120.0/async/delay.ts": "f2d8ccaa8ebc26594bd8b0989edfd8a96257a714c1dee2fb54d986e5bdd840ac", 30 | "https://deno.land/std@0.120.0/async/mod.ts": "78425176fabea7bd1046ce3819fd69ce40da85c83e0f174d17e8e224a91f7d10", 31 | "https://deno.land/std@0.120.0/async/mux_async_iterator.ts": "62abff3af9ff619e8f2adc96fc70d4ca020fa48a50c23c13f12d02ed2b760dbe", 32 | "https://deno.land/std@0.120.0/async/pool.ts": "353ce4f91865da203a097aa6f33de8966340c91b6f4a055611c8c5d534afd12f", 33 | "https://deno.land/std@0.120.0/async/tee.ts": "3e9f2ef6b36e55188de16a667c702ace4ad0cf84e3720379160e062bf27348ad" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /tests/helpers/mod.rs: -------------------------------------------------------------------------------- 1 | use std::iter::Peekable; 2 | 3 | pub struct ChangeAndOutput { 4 | pub change: SpecSection, 5 | pub output: SpecSection, 6 | } 7 | 8 | pub struct ConfigChangeSpec { 9 | pub original_text: SpecSection, 10 | pub change_and_outputs: Vec, 11 | } 12 | 13 | impl ConfigChangeSpec { 14 | pub fn parse(text: &str) -> Self { 15 | let mut sections = SpecSection::parse_many(text); 16 | let original_text = sections.remove(0); 17 | let mut change_and_outputs = Vec::new(); 18 | let mut sections = sections.into_iter().peekable(); 19 | while sections.peek().is_some() { 20 | change_and_outputs.push(ChangeAndOutput { 21 | change: sections.next().unwrap(), 22 | output: sections.next().unwrap(), 23 | }); 24 | } 25 | Self { 26 | original_text, 27 | change_and_outputs, 28 | } 29 | } 30 | 31 | pub fn emit(&self) -> String { 32 | let mut text = String::new(); 33 | text.push_str(&self.original_text.emit()); 34 | for (i, change_and_output) in self.change_and_outputs.iter().enumerate() { 35 | if i > 0 { 36 | text.push('\n'); 37 | } 38 | text.push_str(&change_and_output.change.emit()); 39 | text.push_str(&change_and_output.output.emit()); 40 | } 41 | text 42 | } 43 | } 44 | 45 | pub struct SpecSection { 46 | pub title: String, 47 | pub text: String, 48 | } 49 | 50 | impl SpecSection { 51 | pub fn parse_many(text: &str) -> Vec { 52 | fn take_header<'a>(lines: &mut impl Iterator) -> String { 53 | lines 54 | .next() 55 | .unwrap() 56 | .strip_prefix("# ") 57 | .unwrap() 58 | .to_string() 59 | } 60 | 61 | fn take_next<'a>( 62 | lines: &mut Peekable>, 63 | ) -> String { 64 | let mut result = String::new(); 65 | while let Some(line) = lines.next() { 66 | result.push_str(line); 67 | result.push('\n'); 68 | if let Some(next_line) = lines.peek() 69 | && next_line.starts_with('#') 70 | { 71 | break; 72 | } 73 | } 74 | result 75 | } 76 | 77 | let mut lines = text.split('\n').peekable(); 78 | let mut sections = Vec::new(); 79 | while lines.peek().is_some() { 80 | sections.push(SpecSection { 81 | title: take_header(&mut lines), 82 | text: take_next(&mut lines), 83 | }); 84 | } 85 | sections 86 | } 87 | 88 | pub fn emit(&self) -> String { 89 | format!("# {}\n{}", self.title, self.text) 90 | } 91 | } 92 | -------------------------------------------------------------------------------- /tests/specs/config_changes/ShiftingDepsDifferentWorkspaceMember.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@dsherret/dax": "jsr:@dsherret/dax@0.0.1", 7 | "jsr:@dsherret/which@0.0.1": "jsr:@dsherret/which@0.0.1" 8 | }, 9 | "jsr": { 10 | "@dsherret/dax@0.0.1": { 11 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 12 | "dependencies": [ 13 | "jsr:@dsherret/which@0.0.1" 14 | ] 15 | }, 16 | "@dsherret/which@0.0.1": { 17 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 18 | } 19 | } 20 | }, 21 | "remote": { 22 | }, 23 | "workspace": { 24 | "dependencies": [ 25 | "jsr:@dsherret/dax" 26 | ] 27 | } 28 | } 29 | 30 | # move to workspace member 31 | { 32 | "dependencies": [], 33 | "members": { 34 | "package_a": { 35 | "dependencies": [ 36 | "jsr:@dsherret/dax" 37 | ] 38 | } 39 | } 40 | } 41 | 42 | # output 43 | { 44 | "version": "5", 45 | "specifiers": { 46 | "jsr:@dsherret/dax@*": "0.0.1", 47 | "jsr:@dsherret/which@0.0.1": "0.0.1" 48 | }, 49 | "jsr": { 50 | "@dsherret/dax@0.0.1": { 51 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 52 | "dependencies": [ 53 | "jsr:@dsherret/which" 54 | ] 55 | }, 56 | "@dsherret/which@0.0.1": { 57 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 58 | } 59 | }, 60 | "workspace": { 61 | "members": { 62 | "package_a": { 63 | "dependencies": [ 64 | "jsr:@dsherret/dax@*" 65 | ] 66 | } 67 | } 68 | } 69 | } 70 | 71 | # change to be in a different package 72 | { 73 | "dependencies": [], 74 | "members": { 75 | "package_b": { 76 | "dependencies": [ 77 | "jsr:@dsherret/dax" 78 | ] 79 | } 80 | } 81 | } 82 | 83 | # output 84 | { 85 | "version": "5", 86 | "specifiers": { 87 | "jsr:@dsherret/dax@*": "0.0.1", 88 | "jsr:@dsherret/which@0.0.1": "0.0.1" 89 | }, 90 | "jsr": { 91 | "@dsherret/dax@0.0.1": { 92 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 93 | "dependencies": [ 94 | "jsr:@dsherret/which" 95 | ] 96 | }, 97 | "@dsherret/which@0.0.1": { 98 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 99 | } 100 | }, 101 | "workspace": { 102 | "members": { 103 | "package_b": { 104 | "dependencies": [ 105 | "jsr:@dsherret/dax@*" 106 | ] 107 | } 108 | } 109 | } 110 | } 111 | -------------------------------------------------------------------------------- /tests/integration_test.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2018-2024 the Deno authors. MIT license. 2 | 3 | use std::collections::HashSet; 4 | use std::path::PathBuf; 5 | 6 | use deno_lockfile::WorkspaceConfig; 7 | use deno_lockfile::WorkspaceMemberConfig; 8 | 9 | use deno_lockfile::Lockfile; 10 | use deno_lockfile::SetWorkspaceConfigOptions; 11 | use deno_semver::jsr::JsrDepPackageReq; 12 | 13 | #[test] 14 | fn adding_workspace_does_not_cause_content_changes() { 15 | // should maintain the has_content_changed flag when lockfile empty 16 | { 17 | let mut lockfile = Lockfile::new_empty(PathBuf::from("./deno.lock"), true); 18 | 19 | assert!(!lockfile.has_content_changed); 20 | lockfile.set_workspace_config(SetWorkspaceConfigOptions { 21 | no_config: false, 22 | no_npm: false, 23 | config: WorkspaceConfig { 24 | root: WorkspaceMemberConfig { 25 | dependencies: HashSet::from([JsrDepPackageReq::from_str( 26 | "jsr:@scope/package", 27 | ) 28 | .unwrap()]), 29 | package_json_deps: Default::default(), 30 | }, 31 | members: Default::default(), 32 | links: Default::default(), 33 | }, 34 | }); 35 | assert!(!lockfile.has_content_changed); // should not have changed 36 | } 37 | 38 | // should maintain has_content_changed flag when true and lockfile is empty 39 | { 40 | let mut lockfile = Lockfile::new_empty(PathBuf::from("./deno.lock"), true); 41 | lockfile.has_content_changed = true; 42 | lockfile.set_workspace_config(SetWorkspaceConfigOptions { 43 | no_config: false, 44 | no_npm: false, 45 | config: WorkspaceConfig { 46 | root: WorkspaceMemberConfig { 47 | dependencies: HashSet::from([JsrDepPackageReq::from_str( 48 | "jsr:@scope/package2", 49 | ) 50 | .unwrap()]), 51 | package_json_deps: Default::default(), 52 | }, 53 | members: Default::default(), 54 | links: Default::default(), 55 | }, 56 | }); 57 | assert!(lockfile.has_content_changed); 58 | } 59 | 60 | // should not maintain the has_content_changed flag when lockfile is not empty 61 | { 62 | let mut lockfile = Lockfile::new_empty(PathBuf::from("./deno.lock"), true); 63 | lockfile 64 | .content 65 | .redirects 66 | .insert("a".to_string(), "b".to_string()); 67 | 68 | assert!(!lockfile.has_content_changed); 69 | lockfile.set_workspace_config(SetWorkspaceConfigOptions { 70 | no_config: false, 71 | no_npm: false, 72 | config: WorkspaceConfig { 73 | root: WorkspaceMemberConfig { 74 | dependencies: HashSet::from([JsrDepPackageReq::from_str( 75 | "jsr:@scope/package", 76 | ) 77 | .unwrap()]), 78 | package_json_deps: Default::default(), 79 | }, 80 | members: Default::default(), 81 | links: Default::default(), 82 | }, 83 | }); 84 | assert!(lockfile.has_content_changed); // should have changed since lockfile was not empty 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/adding_with_different_npm_deps_clears.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "5", 4 | "specifiers": { 5 | "npm:package@*": "1.0.0" 6 | }, 7 | "npm": { 8 | "package-a@1.0.0": { 9 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 10 | }, 11 | "package-optional-peer@1.0.0": { 12 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 13 | }, 14 | "package-optional@1.0.0": { 15 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 16 | }, 17 | "package@1.0.0": { 18 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 19 | "dependencies": [ 20 | "package-a", 21 | "package-optional-peer" 22 | ], 23 | "optionalDependencies": [ 24 | "package-optional" 25 | ], 26 | "optionalPeers": [ 27 | "package-optional-peer" 28 | ] 29 | } 30 | } 31 | } 32 | 33 | # non-matching constraint, should clear specifier 34 | { 35 | "links": { 36 | "npm:package@1.0.0": { 37 | "dependencies": [ 38 | "npm:package-a@*" 39 | ], 40 | "optionalDependencies": [ 41 | "npm:package-optional@1.0.0" 42 | ], 43 | "peerDependencies": [ 44 | "npm:package-optional-peer@2" 45 | ], 46 | "peerDependenciesMeta": { 47 | "npm:package-optional-peer": { 48 | "optional": true 49 | } 50 | } 51 | } 52 | } 53 | } 54 | 55 | # output 56 | { 57 | "version": "5", 58 | "npm": { 59 | "package-a@1.0.0": { 60 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 61 | }, 62 | "package-optional-peer@1.0.0": { 63 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 64 | }, 65 | "package-optional@1.0.0": { 66 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 67 | }, 68 | "package@1.0.0": { 69 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 70 | "dependencies": [ 71 | "package-a", 72 | "package-optional-peer" 73 | ], 74 | "optionalDependencies": [ 75 | "package-optional" 76 | ], 77 | "optionalPeers": [ 78 | "package-optional-peer" 79 | ] 80 | } 81 | }, 82 | "workspace": { 83 | "links": { 84 | "npm:package@1.0.0": { 85 | "dependencies": [ 86 | "npm:package-a@*" 87 | ], 88 | "optionalDependencies": [ 89 | "npm:package-optional@1.0.0" 90 | ], 91 | "peerDependencies": [ 92 | "npm:package-optional-peer@2" 93 | ], 94 | "peerDependenciesMeta": { 95 | "npm:package-optional-peer": { 96 | "optional": true 97 | } 98 | } 99 | } 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/adding_with_same_npm_deps_maintains.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "5", 4 | "specifiers": { 5 | "npm:package@*": "1.0.0" 6 | }, 7 | "npm": { 8 | "package-a@1.0.0": { 9 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 10 | }, 11 | "package-optional-peer@1.0.0": { 12 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 13 | }, 14 | "package-optional@1.0.0": { 15 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 16 | }, 17 | "package@1.0.0": { 18 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 19 | "dependencies": [ 20 | "package-a", 21 | "package-optional-peer" 22 | ], 23 | "optionalDependencies": [ 24 | "package-optional" 25 | ], 26 | "optionalPeers": [ 27 | "package-optional-peer" 28 | ] 29 | } 30 | } 31 | } 32 | 33 | # set with the same structure should maintain 34 | { 35 | "links": { 36 | "npm:package@1.0.0": { 37 | "dependencies": [ 38 | "npm:package-a@*" 39 | ], 40 | "optionalDependencies": [ 41 | "npm:package-optional@1.0.0" 42 | ], 43 | "peerDependencies": [ 44 | "npm:package-optional-peer@1" 45 | ], 46 | "peerDependenciesMeta": { 47 | "npm:package-optional-peer": { 48 | "optional": true 49 | } 50 | } 51 | } 52 | } 53 | } 54 | 55 | # output 56 | { 57 | "version": "5", 58 | "specifiers": { 59 | "npm:package@*": "1.0.0" 60 | }, 61 | "npm": { 62 | "package-a@1.0.0": { 63 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 64 | }, 65 | "package-optional-peer@1.0.0": { 66 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 67 | }, 68 | "package-optional@1.0.0": { 69 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==" 70 | }, 71 | "package@1.0.0": { 72 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 73 | "dependencies": [ 74 | "package-a", 75 | "package-optional-peer" 76 | ], 77 | "optionalDependencies": [ 78 | "package-optional" 79 | ], 80 | "optionalPeers": [ 81 | "package-optional-peer" 82 | ] 83 | } 84 | }, 85 | "workspace": { 86 | "links": { 87 | "npm:package@1.0.0": { 88 | "dependencies": [ 89 | "npm:package-a@*" 90 | ], 91 | "optionalDependencies": [ 92 | "npm:package-optional@1.0.0" 93 | ], 94 | "peerDependencies": [ 95 | "npm:package-optional-peer@1" 96 | ], 97 | "peerDependenciesMeta": { 98 | "npm:package-optional-peer": { 99 | "optional": true 100 | } 101 | } 102 | } 103 | } 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovingWorkspaceMember.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@dsherret/dax": "jsr:@dsherret/dax@0.0.1", 7 | "jsr:@dsherret/which@0.0.1": "jsr:@dsherret/which@0.0.1", 8 | "jsr:@oak/commons@0.4": "jsr:@oak/commons@0.4.0", 9 | "jsr:@oak/oak": "jsr:@oak/oak@12.6.3", 10 | "jsr:@std/assert@0.210": "jsr:@std/assert@0.210.0", 11 | "jsr:@std/assert@^0.210.0": "jsr:@std/assert@0.210.0", 12 | "jsr:@std/bytes@0.210": "jsr:@std/bytes@0.210.0", 13 | "jsr:@std/bytes@^0.210.0": "jsr:@std/bytes@0.210.0", 14 | "jsr:@std/crypto@0.210": "jsr:@std/crypto@0.210.0", 15 | "jsr:@std/encoding@0.210": "jsr:@std/encoding@0.210.0", 16 | "jsr:@std/encoding@^0.210.0": "jsr:@std/encoding@0.210.0", 17 | "jsr:@std/fmt@0.210.0": "jsr:@std/fmt@0.210.0", 18 | "jsr:@std/fs@0.210.0": "jsr:@std/fs@0.210.0", 19 | "jsr:@std/http@0.210": "jsr:@std/http@0.210.0", 20 | "jsr:@std/io@0.210": "jsr:@std/io@0.210.0", 21 | "jsr:@std/io@0.210.0": "jsr:@std/io@0.210.0", 22 | "jsr:@std/io@^0.210.0": "jsr:@std/io@0.210.0", 23 | "jsr:@std/media_types@0.210": "jsr:@std/media_types@0.210.0", 24 | "jsr:@std/path@0.210": "jsr:@std/path@0.210.0", 25 | "jsr:@std/path@0.210.0": "jsr:@std/path@0.210.0", 26 | "jsr:@std/path@^0.210.0": "jsr:@std/path@0.210.0", 27 | "jsr:@std/streams@0.210": "jsr:@std/streams@0.210.0", 28 | "jsr:@std/streams@0.210.0": "jsr:@std/streams@0.210.0", 29 | "jsr:@zome_unreferenced/package": "jsr:@zome_unreferenced/package@0.1.0", 30 | "jsr:@zome_unreferenced/package_b": "jsr:@zome_unreferenced/package_b@0.1.0", 31 | "npm:path-to-regexp@6.2.1": "npm:path-to-regexp@6.2.1" 32 | }, 33 | "npm": { 34 | "path-to-regexp@6.2.1": { 35 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", 36 | "dependencies": {} 37 | } 38 | }, 39 | "jsr": { 40 | "@dsherret/dax@0.0.1": { 41 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 42 | "dependencies": [ 43 | "jsr:@dsherret/which@0.0.1", 44 | "jsr:@std/fmt@0.210.0", 45 | "jsr:@std/fs@0.210.0", 46 | "jsr:@std/io@0.210.0", 47 | "jsr:@std/path@0.210.0", 48 | "jsr:@std/streams@0.210.0" 49 | ] 50 | }, 51 | "@dsherret/which@0.0.1": { 52 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 53 | }, 54 | "@oak/commons@0.4.0": { 55 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 56 | "dependencies": [ 57 | "jsr:@std/assert@0.210" 58 | ] 59 | }, 60 | "@oak/oak@12.6.3": { 61 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 62 | "dependencies": [ 63 | "jsr:@oak/commons@0.4", 64 | "jsr:@std/bytes@0.210", 65 | "jsr:@std/crypto@0.210", 66 | "jsr:@std/encoding@0.210", 67 | "jsr:@std/http@0.210", 68 | "jsr:@std/io@0.210", 69 | "jsr:@std/media_types@0.210", 70 | "jsr:@std/path@0.210", 71 | "jsr:@std/streams@0.210", 72 | "npm:path-to-regexp@6.2.1" 73 | ] 74 | }, 75 | "@std/assert@0.210.0": { 76 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 77 | }, 78 | "@std/bytes@0.210.0": { 79 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 80 | }, 81 | "@std/crypto@0.210.0": { 82 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 83 | "dependencies": [ 84 | "jsr:@std/assert@^0.210.0", 85 | "jsr:@std/encoding@^0.210.0" 86 | ] 87 | }, 88 | "@std/encoding@0.210.0": { 89 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 90 | }, 91 | "@std/fmt@0.210.0": { 92 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 93 | }, 94 | "@std/fs@0.210.0": { 95 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 96 | "dependencies": [ 97 | "jsr:@std/assert@^0.210.0", 98 | "jsr:@std/path@^0.210.0" 99 | ] 100 | }, 101 | "@std/http@0.210.0": { 102 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 103 | "dependencies": [ 104 | "jsr:@std/assert@^0.210.0", 105 | "jsr:@std/encoding@^0.210.0" 106 | ] 107 | }, 108 | "@std/io@0.210.0": { 109 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 110 | "dependencies": [ 111 | "jsr:@std/assert@^0.210.0", 112 | "jsr:@std/bytes@^0.210.0" 113 | ] 114 | }, 115 | "@std/media_types@0.210.0": { 116 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 117 | }, 118 | "@std/path@0.210.0": { 119 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 120 | "dependencies": [ 121 | "jsr:@std/assert@^0.210.0" 122 | ] 123 | }, 124 | "@std/streams@0.210.0": { 125 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 126 | "dependencies": [ 127 | "jsr:@std/assert@^0.210.0", 128 | "jsr:@std/bytes@^0.210.0", 129 | "jsr:@std/io@^0.210.0" 130 | ] 131 | }, 132 | "@zome_unreferenced/package@0.1.0": { 133 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 134 | "dependencies": [ 135 | "jsr:@zome_unreferenced/package_b" 136 | ] 137 | }, 138 | "@zome_unreferenced/package_b@0.1.0": { 139 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 140 | } 141 | } 142 | }, 143 | "remote": { 144 | }, 145 | "workspace": { 146 | "dependencies": [ 147 | "jsr:@dsherret/dax" 148 | ], 149 | "members": { 150 | "package_a": { 151 | "dependencies": [ 152 | "jsr:@oak/oak" 153 | ] 154 | } 155 | } 156 | } 157 | } 158 | 159 | # remove package_a member 160 | { 161 | "dependencies": [ 162 | "jsr:@dsherret/dax" 163 | ] 164 | } 165 | 166 | # output 167 | { 168 | "version": "5", 169 | "specifiers": { 170 | "jsr:@zome_unreferenced/package@*": "0.1.0", 171 | "jsr:@zome_unreferenced/package_b@*": "0.1.0" 172 | }, 173 | "jsr": { 174 | "@zome_unreferenced/package@0.1.0": { 175 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 176 | "dependencies": [ 177 | "jsr:@zome_unreferenced/package_b" 178 | ] 179 | }, 180 | "@zome_unreferenced/package_b@0.1.0": { 181 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 182 | } 183 | }, 184 | "npm": { 185 | "path-to-regexp@6.2.1": { 186 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 187 | } 188 | }, 189 | "workspace": { 190 | "dependencies": [ 191 | "jsr:@dsherret/dax@*" 192 | ] 193 | } 194 | } 195 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovingWorkspaceDep.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@dsherret/dax": "jsr:@dsherret/dax@0.0.1", 7 | "jsr:@dsherret/which@0.0.1": "jsr:@dsherret/which@0.0.1", 8 | "jsr:@oak/commons@0.4": "jsr:@oak/commons@0.4.0", 9 | "jsr:@oak/oak": "jsr:@oak/oak@12.6.3", 10 | "jsr:@std/assert@0.210": "jsr:@std/assert@0.210.0", 11 | "jsr:@std/assert@^0.210.0": "jsr:@std/assert@0.210.0", 12 | "jsr:@std/bytes@0.210": "jsr:@std/bytes@0.210.0", 13 | "jsr:@std/bytes@^0.210.0": "jsr:@std/bytes@0.210.0", 14 | "jsr:@std/crypto@0.210": "jsr:@std/crypto@0.210.0", 15 | "jsr:@std/encoding@0.210": "jsr:@std/encoding@0.210.0", 16 | "jsr:@std/encoding@^0.210.0": "jsr:@std/encoding@0.210.0", 17 | "jsr:@std/fmt@0.210.0": "jsr:@std/fmt@0.210.0", 18 | "jsr:@std/fs@0.210.0": "jsr:@std/fs@0.210.0", 19 | "jsr:@std/http@0.210": "jsr:@std/http@0.210.0", 20 | "jsr:@std/io@0.210": "jsr:@std/io@0.210.0", 21 | "jsr:@std/io@0.210.0": "jsr:@std/io@0.210.0", 22 | "jsr:@std/io@^0.210.0": "jsr:@std/io@0.210.0", 23 | "jsr:@std/media_types@0.210": "jsr:@std/media_types@0.210.0", 24 | "jsr:@std/path@0.210": "jsr:@std/path@0.210.0", 25 | "jsr:@std/path@0.210.0": "jsr:@std/path@0.210.0", 26 | "jsr:@std/path@^0.210.0": "jsr:@std/path@0.210.0", 27 | "jsr:@std/streams@0.210": "jsr:@std/streams@0.210.0", 28 | "jsr:@std/streams@0.210.0": "jsr:@std/streams@0.210.0", 29 | "jsr:@zome_unreferenced/package": "jsr:@zome_unreferenced/package@0.1.0", 30 | "jsr:@zome_unreferenced/package_b": "jsr:@zome_unreferenced/package_b@0.1.0", 31 | "npm:path-to-regexp@6.2.1": "npm:path-to-regexp@6.2.1" 32 | }, 33 | "npm": { 34 | "path-to-regexp@6.2.1": { 35 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", 36 | "dependencies": {} 37 | } 38 | }, 39 | "jsr": { 40 | "@dsherret/dax@0.0.1": { 41 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 42 | "dependencies": [ 43 | "jsr:@dsherret/which@0.0.1", 44 | "jsr:@std/fmt@0.210.0", 45 | "jsr:@std/fs@0.210.0", 46 | "jsr:@std/io@0.210.0", 47 | "jsr:@std/path@0.210.0", 48 | "jsr:@std/streams@0.210.0" 49 | ] 50 | }, 51 | "@dsherret/which@0.0.1": { 52 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 53 | }, 54 | "@oak/commons@0.4.0": { 55 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 56 | "dependencies": [ 57 | "jsr:@std/assert@0.210" 58 | ] 59 | }, 60 | "@oak/oak@12.6.3": { 61 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 62 | "dependencies": [ 63 | "jsr:@oak/commons@0.4", 64 | "jsr:@std/bytes@0.210", 65 | "jsr:@std/crypto@0.210", 66 | "jsr:@std/encoding@0.210", 67 | "jsr:@std/http@0.210", 68 | "jsr:@std/io@0.210", 69 | "jsr:@std/media_types@0.210", 70 | "jsr:@std/path@0.210", 71 | "jsr:@std/streams@0.210", 72 | "npm:path-to-regexp@6.2.1" 73 | ] 74 | }, 75 | "@std/assert@0.210.0": { 76 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 77 | }, 78 | "@std/bytes@0.210.0": { 79 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 80 | }, 81 | "@std/crypto@0.210.0": { 82 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 83 | "dependencies": [ 84 | "jsr:@std/assert@^0.210.0", 85 | "jsr:@std/encoding@^0.210.0" 86 | ] 87 | }, 88 | "@std/encoding@0.210.0": { 89 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 90 | }, 91 | "@std/fmt@0.210.0": { 92 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 93 | }, 94 | "@std/fs@0.210.0": { 95 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 96 | "dependencies": [ 97 | "jsr:@std/assert@^0.210.0", 98 | "jsr:@std/path@^0.210.0" 99 | ] 100 | }, 101 | "@std/http@0.210.0": { 102 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 103 | "dependencies": [ 104 | "jsr:@std/assert@^0.210.0", 105 | "jsr:@std/encoding@^0.210.0" 106 | ] 107 | }, 108 | "@std/io@0.210.0": { 109 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 110 | "dependencies": [ 111 | "jsr:@std/assert@^0.210.0", 112 | "jsr:@std/bytes@^0.210.0" 113 | ] 114 | }, 115 | "@std/media_types@0.210.0": { 116 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 117 | }, 118 | "@std/path@0.210.0": { 119 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 120 | "dependencies": [ 121 | "jsr:@std/assert@^0.210.0" 122 | ] 123 | }, 124 | "@std/streams@0.210.0": { 125 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 126 | "dependencies": [ 127 | "jsr:@std/assert@^0.210.0", 128 | "jsr:@std/bytes@^0.210.0", 129 | "jsr:@std/io@^0.210.0" 130 | ] 131 | }, 132 | "@zome_unreferenced/package@0.1.0": { 133 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 134 | "dependencies": [ 135 | "jsr:@zome_unreferenced/package_b" 136 | ] 137 | }, 138 | "@zome_unreferenced/package_b@0.1.0": { 139 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 140 | } 141 | } 142 | }, 143 | "remote": { 144 | }, 145 | "workspace": { 146 | "dependencies": [ 147 | "jsr:@dsherret/dax" 148 | ], 149 | "members": { 150 | "package_a": { 151 | "dependencies": [ 152 | "jsr:@oak/oak" 153 | ] 154 | } 155 | } 156 | } 157 | } 158 | 159 | # remove oak 160 | { 161 | "dependencies": [ 162 | "jsr:@dsherret/dax" 163 | ], 164 | "members": { 165 | "package_a": { 166 | "dependencies": [ 167 | ] 168 | } 169 | } 170 | } 171 | 172 | # output 173 | { 174 | "version": "5", 175 | "specifiers": { 176 | "jsr:@zome_unreferenced/package@*": "0.1.0", 177 | "jsr:@zome_unreferenced/package_b@*": "0.1.0" 178 | }, 179 | "jsr": { 180 | "@zome_unreferenced/package@0.1.0": { 181 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 182 | "dependencies": [ 183 | "jsr:@zome_unreferenced/package_b" 184 | ] 185 | }, 186 | "@zome_unreferenced/package_b@0.1.0": { 187 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 188 | } 189 | }, 190 | "npm": { 191 | "path-to-regexp@6.2.1": { 192 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 193 | } 194 | }, 195 | "workspace": { 196 | "dependencies": [ 197 | "jsr:@dsherret/dax@*" 198 | ], 199 | "members": { 200 | "package_a": {} 201 | } 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovingOakThenDax.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@dsherret/dax": "jsr:@dsherret/dax@0.0.1", 7 | "jsr:@dsherret/which@0.0.1": "jsr:@dsherret/which@0.0.1", 8 | "jsr:@oak/commons@0.4": "jsr:@oak/commons@0.4.0", 9 | "jsr:@oak/oak": "jsr:@oak/oak@12.6.3", 10 | "jsr:@std/assert@0.210": "jsr:@std/assert@0.210.0", 11 | "jsr:@std/assert@^0.210.0": "jsr:@std/assert@0.210.0", 12 | "jsr:@std/bytes@0.210": "jsr:@std/bytes@0.210.0", 13 | "jsr:@std/bytes@^0.210.0": "jsr:@std/bytes@0.210.0", 14 | "jsr:@std/crypto@0.210": "jsr:@std/crypto@0.210.0", 15 | "jsr:@std/encoding@0.210": "jsr:@std/encoding@0.210.0", 16 | "jsr:@std/encoding@^0.210.0": "jsr:@std/encoding@0.210.0", 17 | "jsr:@std/fmt@0.210.0": "jsr:@std/fmt@0.210.0", 18 | "jsr:@std/fs@0.210.0": "jsr:@std/fs@0.210.0", 19 | "jsr:@std/http@0.210": "jsr:@std/http@0.210.0", 20 | "jsr:@std/io@0.210": "jsr:@std/io@0.210.0", 21 | "jsr:@std/io@0.210.0": "jsr:@std/io@0.210.0", 22 | "jsr:@std/io@^0.210.0": "jsr:@std/io@0.210.0", 23 | "jsr:@std/media_types@0.210": "jsr:@std/media_types@0.210.0", 24 | "jsr:@std/path@0.210": "jsr:@std/path@0.210.0", 25 | "jsr:@std/path@0.210.0": "jsr:@std/path@0.210.0", 26 | "jsr:@std/path@^0.210.0": "jsr:@std/path@0.210.0", 27 | "jsr:@std/streams@0.210": "jsr:@std/streams@0.210.0", 28 | "jsr:@std/streams@0.210.0": "jsr:@std/streams@0.210.0", 29 | "jsr:@zome_unreferenced/package": "jsr:@zome_unreferenced/package@0.1.0", 30 | "jsr:@zome_unreferenced/package_b": "jsr:@zome_unreferenced/package_b@0.1.0", 31 | "npm:path-to-regexp@6.2.1": "npm:path-to-regexp@6.2.1" 32 | }, 33 | "npm": { 34 | "path-to-regexp@6.2.1": { 35 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", 36 | "dependencies": {} 37 | } 38 | }, 39 | "jsr": { 40 | "@dsherret/dax@0.0.1": { 41 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 42 | "dependencies": [ 43 | "jsr:@dsherret/which@0.0.1", 44 | "jsr:@std/fmt@0.210.0", 45 | "jsr:@std/fs@0.210.0", 46 | "jsr:@std/io@0.210.0", 47 | "jsr:@std/path@0.210.0", 48 | "jsr:@std/streams@0.210.0" 49 | ] 50 | }, 51 | "@dsherret/which@0.0.1": { 52 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 53 | }, 54 | "@oak/commons@0.4.0": { 55 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 56 | "dependencies": [ 57 | "jsr:@std/assert@0.210" 58 | ] 59 | }, 60 | "@oak/oak@12.6.3": { 61 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 62 | "dependencies": [ 63 | "jsr:@oak/commons@0.4", 64 | "jsr:@std/bytes@0.210", 65 | "jsr:@std/crypto@0.210", 66 | "jsr:@std/encoding@0.210", 67 | "jsr:@std/http@0.210", 68 | "jsr:@std/io@0.210", 69 | "jsr:@std/media_types@0.210", 70 | "jsr:@std/path@0.210", 71 | "jsr:@std/streams@0.210", 72 | "npm:path-to-regexp@6.2.1" 73 | ] 74 | }, 75 | "@std/assert@0.210.0": { 76 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 77 | }, 78 | "@std/bytes@0.210.0": { 79 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 80 | }, 81 | "@std/crypto@0.210.0": { 82 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 83 | "dependencies": [ 84 | "jsr:@std/assert@^0.210.0", 85 | "jsr:@std/encoding@^0.210.0" 86 | ] 87 | }, 88 | "@std/encoding@0.210.0": { 89 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 90 | }, 91 | "@std/fmt@0.210.0": { 92 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 93 | }, 94 | "@std/fs@0.210.0": { 95 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 96 | "dependencies": [ 97 | "jsr:@std/assert@^0.210.0", 98 | "jsr:@std/path@^0.210.0" 99 | ] 100 | }, 101 | "@std/http@0.210.0": { 102 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 103 | "dependencies": [ 104 | "jsr:@std/assert@^0.210.0", 105 | "jsr:@std/encoding@^0.210.0" 106 | ] 107 | }, 108 | "@std/io@0.210.0": { 109 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 110 | "dependencies": [ 111 | "jsr:@std/assert@^0.210.0", 112 | "jsr:@std/bytes@^0.210.0" 113 | ] 114 | }, 115 | "@std/media_types@0.210.0": { 116 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 117 | }, 118 | "@std/path@0.210.0": { 119 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 120 | "dependencies": [ 121 | "jsr:@std/assert@^0.210.0" 122 | ] 123 | }, 124 | "@std/streams@0.210.0": { 125 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 126 | "dependencies": [ 127 | "jsr:@std/assert@^0.210.0", 128 | "jsr:@std/bytes@^0.210.0", 129 | "jsr:@std/io@^0.210.0" 130 | ] 131 | }, 132 | "@zome_unreferenced/package@0.1.0": { 133 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 134 | "dependencies": [ 135 | "jsr:@zome_unreferenced/package_b" 136 | ] 137 | }, 138 | "@zome_unreferenced/package_b@0.1.0": { 139 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 140 | } 141 | } 142 | }, 143 | "remote": { 144 | }, 145 | "workspace": { 146 | "dependencies": [ 147 | "jsr:@dsherret/dax", 148 | "jsr:@oak/oak" 149 | ] 150 | } 151 | } 152 | 153 | # remove oak 154 | { 155 | "dependencies": [ 156 | "jsr:@dsherret/dax" 157 | ] 158 | } 159 | 160 | # output 161 | { 162 | "version": "5", 163 | "specifiers": { 164 | "jsr:@zome_unreferenced/package@*": "0.1.0", 165 | "jsr:@zome_unreferenced/package_b@*": "0.1.0" 166 | }, 167 | "jsr": { 168 | "@zome_unreferenced/package@0.1.0": { 169 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 170 | "dependencies": [ 171 | "jsr:@zome_unreferenced/package_b" 172 | ] 173 | }, 174 | "@zome_unreferenced/package_b@0.1.0": { 175 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 176 | } 177 | }, 178 | "npm": { 179 | "path-to-regexp@6.2.1": { 180 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 181 | } 182 | }, 183 | "workspace": { 184 | "dependencies": [ 185 | "jsr:@dsherret/dax@*" 186 | ] 187 | } 188 | } 189 | 190 | # remove dax 191 | { 192 | "dependencies": [ 193 | ] 194 | } 195 | 196 | # output 197 | { 198 | "version": "5", 199 | "specifiers": { 200 | "jsr:@zome_unreferenced/package@*": "0.1.0", 201 | "jsr:@zome_unreferenced/package_b@*": "0.1.0" 202 | }, 203 | "jsr": { 204 | "@zome_unreferenced/package@0.1.0": { 205 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 206 | "dependencies": [ 207 | "jsr:@zome_unreferenced/package_b" 208 | ] 209 | }, 210 | "@zome_unreferenced/package_b@0.1.0": { 211 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 212 | } 213 | }, 214 | "npm": { 215 | "path-to-regexp@6.2.1": { 216 | "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==" 217 | } 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/not_changing_keeps_npm_deps.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "4", 4 | "specifiers": { 5 | "jsr:@scope/package_a@*": "0.0.1", 6 | "npm:ts-morph@*": "21.0.1" 7 | }, 8 | "jsr": { 9 | "@scope/package_a@0.0.1": { 10 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 11 | } 12 | }, 13 | "npm": { 14 | "@nodelib/fs.scandir@2.1.5": { 15 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 16 | "dependencies": [ 17 | "@nodelib/fs.stat", 18 | "run-parallel" 19 | ] 20 | }, 21 | "@nodelib/fs.stat@2.0.5": { 22 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 23 | }, 24 | "@nodelib/fs.walk@1.2.8": { 25 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 26 | "dependencies": [ 27 | "@nodelib/fs.scandir", 28 | "fastq" 29 | ] 30 | }, 31 | "@ts-morph/common@0.22.0": { 32 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 33 | "dependencies": [ 34 | "fast-glob", 35 | "minimatch", 36 | "mkdirp", 37 | "path-browserify" 38 | ] 39 | }, 40 | "balanced-match@1.0.2": { 41 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 42 | }, 43 | "brace-expansion@2.0.1": { 44 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 45 | "dependencies": [ 46 | "balanced-match" 47 | ] 48 | }, 49 | "braces@3.0.2": { 50 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 51 | "dependencies": [ 52 | "fill-range" 53 | ] 54 | }, 55 | "code-block-writer@12.0.0": { 56 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 57 | }, 58 | "fast-glob@3.3.2": { 59 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 60 | "dependencies": [ 61 | "@nodelib/fs.stat", 62 | "@nodelib/fs.walk", 63 | "glob-parent", 64 | "merge2", 65 | "micromatch" 66 | ] 67 | }, 68 | "fastq@1.16.0": { 69 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 70 | "dependencies": [ 71 | "reusify" 72 | ] 73 | }, 74 | "fill-range@7.0.1": { 75 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 76 | "dependencies": [ 77 | "to-regex-range" 78 | ] 79 | }, 80 | "glob-parent@5.1.2": { 81 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 82 | "dependencies": [ 83 | "is-glob" 84 | ] 85 | }, 86 | "is-extglob@2.1.1": { 87 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 88 | }, 89 | "is-glob@4.0.3": { 90 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 91 | "dependencies": [ 92 | "is-extglob" 93 | ] 94 | }, 95 | "is-number@7.0.0": { 96 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 97 | }, 98 | "merge2@1.4.1": { 99 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 100 | }, 101 | "micromatch@4.0.5": { 102 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 103 | "dependencies": [ 104 | "braces", 105 | "picomatch" 106 | ] 107 | }, 108 | "minimatch@9.0.3": { 109 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 110 | "dependencies": [ 111 | "brace-expansion" 112 | ] 113 | }, 114 | "mkdirp@3.0.1": { 115 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 116 | }, 117 | "path-browserify@1.0.1": { 118 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 119 | }, 120 | "picomatch@2.3.1": { 121 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 122 | }, 123 | "queue-microtask@1.2.3": { 124 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 125 | }, 126 | "reusify@1.0.4": { 127 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 128 | }, 129 | "run-parallel@1.2.0": { 130 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 131 | "dependencies": [ 132 | "queue-microtask" 133 | ] 134 | }, 135 | "to-regex-range@5.0.1": { 136 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 137 | "dependencies": [ 138 | "is-number" 139 | ] 140 | }, 141 | "ts-morph@21.0.1": { 142 | "dependencies": [ 143 | "@ts-morph/common", 144 | "code-block-writer" 145 | ] 146 | } 147 | }, 148 | "workspace": { 149 | "links": { 150 | "npm:ts-morph@21.0.1": { 151 | "dependencies": [ 152 | "npm:code-block-writer@12" 153 | ] 154 | } 155 | } 156 | } 157 | } 158 | 159 | # keep same (no change) 160 | { 161 | "links": { 162 | "npm:ts-morph@21.0.1": { 163 | "dependencies": [ 164 | "npm:code-block-writer@12" 165 | ] 166 | } 167 | } 168 | } 169 | 170 | # output 171 | { 172 | "version": "5", 173 | "specifiers": { 174 | "jsr:@scope/package_a@*": "0.0.1", 175 | "npm:ts-morph@*": "21.0.1" 176 | }, 177 | "jsr": { 178 | "@scope/package_a@0.0.1": { 179 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 180 | } 181 | }, 182 | "npm": { 183 | "@nodelib/fs.scandir@2.1.5": { 184 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 185 | "dependencies": [ 186 | "@nodelib/fs.stat", 187 | "run-parallel" 188 | ] 189 | }, 190 | "@nodelib/fs.stat@2.0.5": { 191 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 192 | }, 193 | "@nodelib/fs.walk@1.2.8": { 194 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 195 | "dependencies": [ 196 | "@nodelib/fs.scandir", 197 | "fastq" 198 | ] 199 | }, 200 | "@ts-morph/common@0.22.0": { 201 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 202 | "dependencies": [ 203 | "fast-glob", 204 | "minimatch", 205 | "mkdirp", 206 | "path-browserify" 207 | ] 208 | }, 209 | "balanced-match@1.0.2": { 210 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 211 | }, 212 | "brace-expansion@2.0.1": { 213 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 214 | "dependencies": [ 215 | "balanced-match" 216 | ] 217 | }, 218 | "braces@3.0.2": { 219 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 220 | "dependencies": [ 221 | "fill-range" 222 | ] 223 | }, 224 | "code-block-writer@12.0.0": { 225 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 226 | }, 227 | "fast-glob@3.3.2": { 228 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 229 | "dependencies": [ 230 | "@nodelib/fs.stat", 231 | "@nodelib/fs.walk", 232 | "glob-parent", 233 | "merge2", 234 | "micromatch" 235 | ] 236 | }, 237 | "fastq@1.16.0": { 238 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 239 | "dependencies": [ 240 | "reusify" 241 | ] 242 | }, 243 | "fill-range@7.0.1": { 244 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 245 | "dependencies": [ 246 | "to-regex-range" 247 | ] 248 | }, 249 | "glob-parent@5.1.2": { 250 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 251 | "dependencies": [ 252 | "is-glob" 253 | ] 254 | }, 255 | "is-extglob@2.1.1": { 256 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 257 | }, 258 | "is-glob@4.0.3": { 259 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 260 | "dependencies": [ 261 | "is-extglob" 262 | ] 263 | }, 264 | "is-number@7.0.0": { 265 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 266 | }, 267 | "merge2@1.4.1": { 268 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 269 | }, 270 | "micromatch@4.0.5": { 271 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 272 | "dependencies": [ 273 | "braces", 274 | "picomatch" 275 | ] 276 | }, 277 | "minimatch@9.0.3": { 278 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 279 | "dependencies": [ 280 | "brace-expansion" 281 | ] 282 | }, 283 | "mkdirp@3.0.1": { 284 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 285 | }, 286 | "path-browserify@1.0.1": { 287 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 288 | }, 289 | "picomatch@2.3.1": { 290 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 291 | }, 292 | "queue-microtask@1.2.3": { 293 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 294 | }, 295 | "reusify@1.0.4": { 296 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 297 | }, 298 | "run-parallel@1.2.0": { 299 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 300 | "dependencies": [ 301 | "queue-microtask" 302 | ] 303 | }, 304 | "to-regex-range@5.0.1": { 305 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 306 | "dependencies": [ 307 | "is-number" 308 | ] 309 | }, 310 | "ts-morph@21.0.1": { 311 | "dependencies": [ 312 | "@ts-morph/common", 313 | "code-block-writer" 314 | ] 315 | } 316 | }, 317 | "workspace": { 318 | "links": { 319 | "npm:ts-morph@21.0.1": { 320 | "dependencies": [ 321 | "npm:code-block-writer@12" 322 | ] 323 | } 324 | } 325 | } 326 | } 327 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/not_changing_keeps_npm_deps_deprecatedPatches.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "5", 4 | "specifiers": { 5 | "jsr:@scope/package_a@*": "0.0.1", 6 | "npm:ts-morph@*": "21.0.1" 7 | }, 8 | "jsr": { 9 | "@scope/package_a@0.0.1": { 10 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 11 | } 12 | }, 13 | "npm": { 14 | "@nodelib/fs.scandir@2.1.5": { 15 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 16 | "dependencies": [ 17 | "@nodelib/fs.stat", 18 | "run-parallel" 19 | ] 20 | }, 21 | "@nodelib/fs.stat@2.0.5": { 22 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 23 | }, 24 | "@nodelib/fs.walk@1.2.8": { 25 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 26 | "dependencies": [ 27 | "@nodelib/fs.scandir", 28 | "fastq" 29 | ] 30 | }, 31 | "@ts-morph/common@0.22.0": { 32 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 33 | "dependencies": [ 34 | "fast-glob", 35 | "minimatch", 36 | "mkdirp", 37 | "path-browserify" 38 | ] 39 | }, 40 | "balanced-match@1.0.2": { 41 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 42 | }, 43 | "brace-expansion@2.0.1": { 44 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 45 | "dependencies": [ 46 | "balanced-match" 47 | ] 48 | }, 49 | "braces@3.0.2": { 50 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 51 | "dependencies": [ 52 | "fill-range" 53 | ] 54 | }, 55 | "code-block-writer@12.0.0": { 56 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 57 | }, 58 | "fast-glob@3.3.2": { 59 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 60 | "dependencies": [ 61 | "@nodelib/fs.stat", 62 | "@nodelib/fs.walk", 63 | "glob-parent", 64 | "merge2", 65 | "micromatch" 66 | ] 67 | }, 68 | "fastq@1.16.0": { 69 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 70 | "dependencies": [ 71 | "reusify" 72 | ] 73 | }, 74 | "fill-range@7.0.1": { 75 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 76 | "dependencies": [ 77 | "to-regex-range" 78 | ] 79 | }, 80 | "glob-parent@5.1.2": { 81 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 82 | "dependencies": [ 83 | "is-glob" 84 | ] 85 | }, 86 | "is-extglob@2.1.1": { 87 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 88 | }, 89 | "is-glob@4.0.3": { 90 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 91 | "dependencies": [ 92 | "is-extglob" 93 | ] 94 | }, 95 | "is-number@7.0.0": { 96 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 97 | }, 98 | "merge2@1.4.1": { 99 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 100 | }, 101 | "micromatch@4.0.5": { 102 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 103 | "dependencies": [ 104 | "braces", 105 | "picomatch" 106 | ] 107 | }, 108 | "minimatch@9.0.3": { 109 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 110 | "dependencies": [ 111 | "brace-expansion" 112 | ] 113 | }, 114 | "mkdirp@3.0.1": { 115 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 116 | }, 117 | "path-browserify@1.0.1": { 118 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 119 | }, 120 | "picomatch@2.3.1": { 121 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 122 | }, 123 | "queue-microtask@1.2.3": { 124 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 125 | }, 126 | "reusify@1.0.4": { 127 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 128 | }, 129 | "run-parallel@1.2.0": { 130 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 131 | "dependencies": [ 132 | "queue-microtask" 133 | ] 134 | }, 135 | "to-regex-range@5.0.1": { 136 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 137 | "dependencies": [ 138 | "is-number" 139 | ] 140 | }, 141 | "ts-morph@21.0.1": { 142 | "dependencies": [ 143 | "@ts-morph/common", 144 | "code-block-writer" 145 | ] 146 | } 147 | }, 148 | "workspace": { 149 | "patches": { 150 | "npm:ts-morph@21.0.1": { 151 | "dependencies": [ 152 | "npm:code-block-writer@12" 153 | ] 154 | } 155 | } 156 | } 157 | } 158 | 159 | # keep same (no change) 160 | { 161 | "links": { 162 | "npm:ts-morph@21.0.1": { 163 | "dependencies": [ 164 | "npm:code-block-writer@12" 165 | ] 166 | } 167 | } 168 | } 169 | 170 | # output 171 | { 172 | "version": "5", 173 | "specifiers": { 174 | "jsr:@scope/package_a@*": "0.0.1", 175 | "npm:ts-morph@*": "21.0.1" 176 | }, 177 | "jsr": { 178 | "@scope/package_a@0.0.1": { 179 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 180 | } 181 | }, 182 | "npm": { 183 | "@nodelib/fs.scandir@2.1.5": { 184 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 185 | "dependencies": [ 186 | "@nodelib/fs.stat", 187 | "run-parallel" 188 | ] 189 | }, 190 | "@nodelib/fs.stat@2.0.5": { 191 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 192 | }, 193 | "@nodelib/fs.walk@1.2.8": { 194 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 195 | "dependencies": [ 196 | "@nodelib/fs.scandir", 197 | "fastq" 198 | ] 199 | }, 200 | "@ts-morph/common@0.22.0": { 201 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 202 | "dependencies": [ 203 | "fast-glob", 204 | "minimatch", 205 | "mkdirp", 206 | "path-browserify" 207 | ] 208 | }, 209 | "balanced-match@1.0.2": { 210 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 211 | }, 212 | "brace-expansion@2.0.1": { 213 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 214 | "dependencies": [ 215 | "balanced-match" 216 | ] 217 | }, 218 | "braces@3.0.2": { 219 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 220 | "dependencies": [ 221 | "fill-range" 222 | ] 223 | }, 224 | "code-block-writer@12.0.0": { 225 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 226 | }, 227 | "fast-glob@3.3.2": { 228 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 229 | "dependencies": [ 230 | "@nodelib/fs.stat", 231 | "@nodelib/fs.walk", 232 | "glob-parent", 233 | "merge2", 234 | "micromatch" 235 | ] 236 | }, 237 | "fastq@1.16.0": { 238 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 239 | "dependencies": [ 240 | "reusify" 241 | ] 242 | }, 243 | "fill-range@7.0.1": { 244 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 245 | "dependencies": [ 246 | "to-regex-range" 247 | ] 248 | }, 249 | "glob-parent@5.1.2": { 250 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 251 | "dependencies": [ 252 | "is-glob" 253 | ] 254 | }, 255 | "is-extglob@2.1.1": { 256 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 257 | }, 258 | "is-glob@4.0.3": { 259 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 260 | "dependencies": [ 261 | "is-extglob" 262 | ] 263 | }, 264 | "is-number@7.0.0": { 265 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 266 | }, 267 | "merge2@1.4.1": { 268 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 269 | }, 270 | "micromatch@4.0.5": { 271 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 272 | "dependencies": [ 273 | "braces", 274 | "picomatch" 275 | ] 276 | }, 277 | "minimatch@9.0.3": { 278 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 279 | "dependencies": [ 280 | "brace-expansion" 281 | ] 282 | }, 283 | "mkdirp@3.0.1": { 284 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 285 | }, 286 | "path-browserify@1.0.1": { 287 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 288 | }, 289 | "picomatch@2.3.1": { 290 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 291 | }, 292 | "queue-microtask@1.2.3": { 293 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 294 | }, 295 | "reusify@1.0.4": { 296 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 297 | }, 298 | "run-parallel@1.2.0": { 299 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 300 | "dependencies": [ 301 | "queue-microtask" 302 | ] 303 | }, 304 | "to-regex-range@5.0.1": { 305 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 306 | "dependencies": [ 307 | "is-number" 308 | ] 309 | }, 310 | "ts-morph@21.0.1": { 311 | "dependencies": [ 312 | "@ts-morph/common", 313 | "code-block-writer" 314 | ] 315 | } 316 | }, 317 | "workspace": { 318 | "links": { 319 | "npm:ts-morph@21.0.1": { 320 | "dependencies": [ 321 | "npm:code-block-writer@12" 322 | ] 323 | } 324 | } 325 | } 326 | } 327 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/changing_removes_npm_deps.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "4", 4 | "specifiers": { 5 | "jsr:@scope/package_a@*": "0.0.1", 6 | "npm:ts-morph@*": "21.0.1" 7 | }, 8 | "jsr": { 9 | "@scope/package_a@0.0.1": { 10 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 11 | } 12 | }, 13 | "npm": { 14 | "@nodelib/fs.scandir@2.1.5": { 15 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 16 | "dependencies": [ 17 | "@nodelib/fs.stat", 18 | "run-parallel" 19 | ] 20 | }, 21 | "@nodelib/fs.stat@2.0.5": { 22 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 23 | }, 24 | "@nodelib/fs.walk@1.2.8": { 25 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 26 | "dependencies": [ 27 | "@nodelib/fs.scandir", 28 | "fastq" 29 | ] 30 | }, 31 | "@ts-morph/common@0.22.0": { 32 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 33 | "dependencies": [ 34 | "fast-glob", 35 | "minimatch", 36 | "mkdirp", 37 | "path-browserify" 38 | ] 39 | }, 40 | "balanced-match@1.0.2": { 41 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 42 | }, 43 | "brace-expansion@2.0.1": { 44 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 45 | "dependencies": [ 46 | "balanced-match" 47 | ] 48 | }, 49 | "braces@3.0.2": { 50 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 51 | "dependencies": [ 52 | "fill-range" 53 | ] 54 | }, 55 | "code-block-writer@12.0.0": { 56 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 57 | }, 58 | "fast-glob@3.3.2": { 59 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 60 | "dependencies": [ 61 | "@nodelib/fs.stat", 62 | "@nodelib/fs.walk", 63 | "glob-parent", 64 | "merge2", 65 | "micromatch" 66 | ] 67 | }, 68 | "fastq@1.16.0": { 69 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 70 | "dependencies": [ 71 | "reusify" 72 | ] 73 | }, 74 | "fill-range@7.0.1": { 75 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 76 | "dependencies": [ 77 | "to-regex-range" 78 | ] 79 | }, 80 | "glob-parent@5.1.2": { 81 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 82 | "dependencies": [ 83 | "is-glob" 84 | ] 85 | }, 86 | "is-extglob@2.1.1": { 87 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 88 | }, 89 | "is-glob@4.0.3": { 90 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 91 | "dependencies": [ 92 | "is-extglob" 93 | ] 94 | }, 95 | "is-number@7.0.0": { 96 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 97 | }, 98 | "merge2@1.4.1": { 99 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 100 | }, 101 | "micromatch@4.0.5": { 102 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 103 | "dependencies": [ 104 | "braces", 105 | "picomatch" 106 | ] 107 | }, 108 | "minimatch@9.0.3": { 109 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 110 | "dependencies": [ 111 | "brace-expansion" 112 | ] 113 | }, 114 | "mkdirp@3.0.1": { 115 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 116 | }, 117 | "path-browserify@1.0.1": { 118 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 119 | }, 120 | "picomatch@2.3.1": { 121 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 122 | }, 123 | "queue-microtask@1.2.3": { 124 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 125 | }, 126 | "reusify@1.0.4": { 127 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 128 | }, 129 | "run-parallel@1.2.0": { 130 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 131 | "dependencies": [ 132 | "queue-microtask" 133 | ] 134 | }, 135 | "to-regex-range@5.0.1": { 136 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 137 | "dependencies": [ 138 | "is-number" 139 | ] 140 | }, 141 | "ts-morph@21.0.1": { 142 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 143 | "dependencies": [ 144 | "@ts-morph/common", 145 | "code-block-writer" 146 | ] 147 | } 148 | }, 149 | "workspace": { 150 | "links": { 151 | "npm:ts-morph@21.0.1": { 152 | "dependencies": [ 153 | "npm:code-block-writer@12" 154 | ] 155 | } 156 | } 157 | } 158 | } 159 | 160 | # remove 161 | { 162 | "links": { 163 | "npm:ts-morph@21.0.1": { 164 | "dependencies": [ 165 | ] 166 | } 167 | } 168 | } 169 | 170 | # output 171 | { 172 | "version": "5", 173 | "specifiers": { 174 | "jsr:@scope/package_a@*": "0.0.1" 175 | }, 176 | "jsr": { 177 | "@scope/package_a@0.0.1": { 178 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 179 | } 180 | }, 181 | "npm": { 182 | "@nodelib/fs.scandir@2.1.5": { 183 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 184 | "dependencies": [ 185 | "@nodelib/fs.stat", 186 | "run-parallel" 187 | ] 188 | }, 189 | "@nodelib/fs.stat@2.0.5": { 190 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 191 | }, 192 | "@nodelib/fs.walk@1.2.8": { 193 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 194 | "dependencies": [ 195 | "@nodelib/fs.scandir", 196 | "fastq" 197 | ] 198 | }, 199 | "@ts-morph/common@0.22.0": { 200 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 201 | "dependencies": [ 202 | "fast-glob", 203 | "minimatch", 204 | "mkdirp", 205 | "path-browserify" 206 | ] 207 | }, 208 | "balanced-match@1.0.2": { 209 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 210 | }, 211 | "brace-expansion@2.0.1": { 212 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 213 | "dependencies": [ 214 | "balanced-match" 215 | ] 216 | }, 217 | "braces@3.0.2": { 218 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 219 | "dependencies": [ 220 | "fill-range" 221 | ] 222 | }, 223 | "code-block-writer@12.0.0": { 224 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 225 | }, 226 | "fast-glob@3.3.2": { 227 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 228 | "dependencies": [ 229 | "@nodelib/fs.stat", 230 | "@nodelib/fs.walk", 231 | "glob-parent", 232 | "merge2", 233 | "micromatch" 234 | ] 235 | }, 236 | "fastq@1.16.0": { 237 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 238 | "dependencies": [ 239 | "reusify" 240 | ] 241 | }, 242 | "fill-range@7.0.1": { 243 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 244 | "dependencies": [ 245 | "to-regex-range" 246 | ] 247 | }, 248 | "glob-parent@5.1.2": { 249 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 250 | "dependencies": [ 251 | "is-glob" 252 | ] 253 | }, 254 | "is-extglob@2.1.1": { 255 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 256 | }, 257 | "is-glob@4.0.3": { 258 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 259 | "dependencies": [ 260 | "is-extglob" 261 | ] 262 | }, 263 | "is-number@7.0.0": { 264 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 265 | }, 266 | "merge2@1.4.1": { 267 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 268 | }, 269 | "micromatch@4.0.5": { 270 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 271 | "dependencies": [ 272 | "braces", 273 | "picomatch" 274 | ] 275 | }, 276 | "minimatch@9.0.3": { 277 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 278 | "dependencies": [ 279 | "brace-expansion" 280 | ] 281 | }, 282 | "mkdirp@3.0.1": { 283 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 284 | }, 285 | "path-browserify@1.0.1": { 286 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 287 | }, 288 | "picomatch@2.3.1": { 289 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 290 | }, 291 | "queue-microtask@1.2.3": { 292 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 293 | }, 294 | "reusify@1.0.4": { 295 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 296 | }, 297 | "run-parallel@1.2.0": { 298 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 299 | "dependencies": [ 300 | "queue-microtask" 301 | ] 302 | }, 303 | "to-regex-range@5.0.1": { 304 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 305 | "dependencies": [ 306 | "is-number" 307 | ] 308 | }, 309 | "ts-morph@21.0.1": { 310 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 311 | "dependencies": [ 312 | "@ts-morph/common", 313 | "code-block-writer" 314 | ] 315 | } 316 | }, 317 | "workspace": { 318 | "links": { 319 | "npm:ts-morph@21.0.1": {} 320 | } 321 | } 322 | } 323 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovingNpmDepsDenoJson.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "npm:ts-morph": "npm:ts-morph@21.0.1" 7 | }, 8 | "npm": { 9 | "@nodelib/fs.scandir@2.1.5": { 10 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 11 | "dependencies": { 12 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 13 | "run-parallel": "run-parallel@1.2.0" 14 | } 15 | }, 16 | "@nodelib/fs.stat@2.0.5": { 17 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 18 | "dependencies": {} 19 | }, 20 | "@nodelib/fs.walk@1.2.8": { 21 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 22 | "dependencies": { 23 | "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", 24 | "fastq": "fastq@1.16.0" 25 | } 26 | }, 27 | "@ts-morph/common@0.22.0": { 28 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 29 | "dependencies": { 30 | "fast-glob": "fast-glob@3.3.2", 31 | "minimatch": "minimatch@9.0.3", 32 | "mkdirp": "mkdirp@3.0.1", 33 | "path-browserify": "path-browserify@1.0.1" 34 | } 35 | }, 36 | "balanced-match@1.0.2": { 37 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 38 | "dependencies": {} 39 | }, 40 | "brace-expansion@2.0.1": { 41 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 42 | "dependencies": { 43 | "balanced-match": "balanced-match@1.0.2" 44 | } 45 | }, 46 | "braces@3.0.2": { 47 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 48 | "dependencies": { 49 | "fill-range": "fill-range@7.0.1" 50 | } 51 | }, 52 | "code-block-writer@12.0.0": { 53 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", 54 | "dependencies": {} 55 | }, 56 | "fast-glob@3.3.2": { 57 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 58 | "dependencies": { 59 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 60 | "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", 61 | "glob-parent": "glob-parent@5.1.2", 62 | "merge2": "merge2@1.4.1", 63 | "micromatch": "micromatch@4.0.5" 64 | } 65 | }, 66 | "fastq@1.16.0": { 67 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 68 | "dependencies": { 69 | "reusify": "reusify@1.0.4" 70 | } 71 | }, 72 | "fill-range@7.0.1": { 73 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 74 | "dependencies": { 75 | "to-regex-range": "to-regex-range@5.0.1" 76 | } 77 | }, 78 | "glob-parent@5.1.2": { 79 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 80 | "dependencies": { 81 | "is-glob": "is-glob@4.0.3" 82 | } 83 | }, 84 | "is-extglob@2.1.1": { 85 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 86 | "dependencies": {} 87 | }, 88 | "is-glob@4.0.3": { 89 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 90 | "dependencies": { 91 | "is-extglob": "is-extglob@2.1.1" 92 | } 93 | }, 94 | "is-number@7.0.0": { 95 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 96 | "dependencies": {} 97 | }, 98 | "merge2@1.4.1": { 99 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 100 | "dependencies": {} 101 | }, 102 | "micromatch@4.0.5": { 103 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 104 | "dependencies": { 105 | "braces": "braces@3.0.2", 106 | "picomatch": "picomatch@2.3.1" 107 | } 108 | }, 109 | "minimatch@9.0.3": { 110 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 111 | "dependencies": { 112 | "brace-expansion": "brace-expansion@2.0.1" 113 | } 114 | }, 115 | "mkdirp@3.0.1": { 116 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 117 | "dependencies": {} 118 | }, 119 | "path-browserify@1.0.1": { 120 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 121 | "dependencies": {} 122 | }, 123 | "picomatch@2.3.1": { 124 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 125 | "dependencies": {} 126 | }, 127 | "queue-microtask@1.2.3": { 128 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 129 | "dependencies": {} 130 | }, 131 | "reusify@1.0.4": { 132 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 133 | "dependencies": {} 134 | }, 135 | "run-parallel@1.2.0": { 136 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 137 | "dependencies": { 138 | "queue-microtask": "queue-microtask@1.2.3" 139 | } 140 | }, 141 | "to-regex-range@5.0.1": { 142 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 143 | "dependencies": { 144 | "is-number": "is-number@7.0.0" 145 | } 146 | }, 147 | "ts-morph@21.0.1": { 148 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 149 | "dependencies": { 150 | "@ts-morph/common": "@ts-morph/common@0.22.0", 151 | "code-block-writer": "code-block-writer@12.0.0" 152 | } 153 | } 154 | } 155 | }, 156 | "remote": {}, 157 | "workspace": { 158 | "dependencies": [ 159 | "npm:ts-morph" 160 | ] 161 | } 162 | } 163 | 164 | # remove 165 | { 166 | "dependencies": [ 167 | ] 168 | } 169 | 170 | # output 171 | { 172 | "version": "5", 173 | "npm": { 174 | "@nodelib/fs.scandir@2.1.5": { 175 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 176 | "dependencies": [ 177 | "@nodelib/fs.stat", 178 | "run-parallel" 179 | ] 180 | }, 181 | "@nodelib/fs.stat@2.0.5": { 182 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 183 | }, 184 | "@nodelib/fs.walk@1.2.8": { 185 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 186 | "dependencies": [ 187 | "@nodelib/fs.scandir", 188 | "fastq" 189 | ] 190 | }, 191 | "@ts-morph/common@0.22.0": { 192 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 193 | "dependencies": [ 194 | "fast-glob", 195 | "minimatch", 196 | "mkdirp", 197 | "path-browserify" 198 | ] 199 | }, 200 | "balanced-match@1.0.2": { 201 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 202 | }, 203 | "brace-expansion@2.0.1": { 204 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 205 | "dependencies": [ 206 | "balanced-match" 207 | ] 208 | }, 209 | "braces@3.0.2": { 210 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 211 | "dependencies": [ 212 | "fill-range" 213 | ] 214 | }, 215 | "code-block-writer@12.0.0": { 216 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 217 | }, 218 | "fast-glob@3.3.2": { 219 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 220 | "dependencies": [ 221 | "@nodelib/fs.stat", 222 | "@nodelib/fs.walk", 223 | "glob-parent", 224 | "merge2", 225 | "micromatch" 226 | ] 227 | }, 228 | "fastq@1.16.0": { 229 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 230 | "dependencies": [ 231 | "reusify" 232 | ] 233 | }, 234 | "fill-range@7.0.1": { 235 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 236 | "dependencies": [ 237 | "to-regex-range" 238 | ] 239 | }, 240 | "glob-parent@5.1.2": { 241 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 242 | "dependencies": [ 243 | "is-glob" 244 | ] 245 | }, 246 | "is-extglob@2.1.1": { 247 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 248 | }, 249 | "is-glob@4.0.3": { 250 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 251 | "dependencies": [ 252 | "is-extglob" 253 | ] 254 | }, 255 | "is-number@7.0.0": { 256 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 257 | }, 258 | "merge2@1.4.1": { 259 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 260 | }, 261 | "micromatch@4.0.5": { 262 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 263 | "dependencies": [ 264 | "braces", 265 | "picomatch" 266 | ] 267 | }, 268 | "minimatch@9.0.3": { 269 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 270 | "dependencies": [ 271 | "brace-expansion" 272 | ] 273 | }, 274 | "mkdirp@3.0.1": { 275 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 276 | }, 277 | "path-browserify@1.0.1": { 278 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 279 | }, 280 | "picomatch@2.3.1": { 281 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 282 | }, 283 | "queue-microtask@1.2.3": { 284 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 285 | }, 286 | "reusify@1.0.4": { 287 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 288 | }, 289 | "run-parallel@1.2.0": { 290 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 291 | "dependencies": [ 292 | "queue-microtask" 293 | ] 294 | }, 295 | "to-regex-range@5.0.1": { 296 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 297 | "dependencies": [ 298 | "is-number" 299 | ] 300 | }, 301 | "ts-morph@21.0.1": { 302 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 303 | "dependencies": [ 304 | "@ts-morph/common", 305 | "code-block-writer" 306 | ] 307 | } 308 | } 309 | } 310 | -------------------------------------------------------------------------------- /tests/specs/config_changes/links/changing_removes_npm_deps2.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "4", 4 | "specifiers": { 5 | "jsr:@scope/package_a@*": "0.0.1", 6 | "npm:ts-morph@*": "21.0.1" 7 | }, 8 | "jsr": { 9 | "@scope/package_a@0.0.1": { 10 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 11 | } 12 | }, 13 | "npm": { 14 | "@nodelib/fs.scandir@2.1.5": { 15 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 16 | "dependencies": [ 17 | "@nodelib/fs.stat", 18 | "run-parallel" 19 | ] 20 | }, 21 | "@nodelib/fs.stat@2.0.5": { 22 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 23 | }, 24 | "@nodelib/fs.walk@1.2.8": { 25 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 26 | "dependencies": [ 27 | "@nodelib/fs.scandir", 28 | "fastq" 29 | ] 30 | }, 31 | "@ts-morph/common@0.22.0": { 32 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 33 | "dependencies": [ 34 | "fast-glob", 35 | "minimatch", 36 | "mkdirp", 37 | "path-browserify" 38 | ] 39 | }, 40 | "balanced-match@1.0.2": { 41 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 42 | }, 43 | "brace-expansion@2.0.1": { 44 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 45 | "dependencies": [ 46 | "balanced-match" 47 | ] 48 | }, 49 | "braces@3.0.2": { 50 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 51 | "dependencies": [ 52 | "fill-range" 53 | ] 54 | }, 55 | "code-block-writer@12.0.0": { 56 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 57 | }, 58 | "fast-glob@3.3.2": { 59 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 60 | "dependencies": [ 61 | "@nodelib/fs.stat", 62 | "@nodelib/fs.walk", 63 | "glob-parent", 64 | "merge2", 65 | "micromatch" 66 | ] 67 | }, 68 | "fastq@1.16.0": { 69 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 70 | "dependencies": [ 71 | "reusify" 72 | ] 73 | }, 74 | "fill-range@7.0.1": { 75 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 76 | "dependencies": [ 77 | "to-regex-range" 78 | ] 79 | }, 80 | "glob-parent@5.1.2": { 81 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 82 | "dependencies": [ 83 | "is-glob" 84 | ] 85 | }, 86 | "is-extglob@2.1.1": { 87 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 88 | }, 89 | "is-glob@4.0.3": { 90 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 91 | "dependencies": [ 92 | "is-extglob" 93 | ] 94 | }, 95 | "is-number@7.0.0": { 96 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 97 | }, 98 | "merge2@1.4.1": { 99 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 100 | }, 101 | "micromatch@4.0.5": { 102 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 103 | "dependencies": [ 104 | "braces", 105 | "picomatch" 106 | ] 107 | }, 108 | "minimatch@9.0.3": { 109 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 110 | "dependencies": [ 111 | "brace-expansion" 112 | ] 113 | }, 114 | "mkdirp@3.0.1": { 115 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 116 | }, 117 | "path-browserify@1.0.1": { 118 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 119 | }, 120 | "picomatch@2.3.1": { 121 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 122 | }, 123 | "queue-microtask@1.2.3": { 124 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 125 | }, 126 | "reusify@1.0.4": { 127 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 128 | }, 129 | "run-parallel@1.2.0": { 130 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 131 | "dependencies": [ 132 | "queue-microtask" 133 | ] 134 | }, 135 | "to-regex-range@5.0.1": { 136 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 137 | "dependencies": [ 138 | "is-number" 139 | ] 140 | }, 141 | "ts-morph@21.0.1": { 142 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 143 | "dependencies": [ 144 | "@ts-morph/common", 145 | "code-block-writer" 146 | ] 147 | } 148 | }, 149 | "workspace": { 150 | "links": { 151 | "npm:ts-morph@21.0.1": { 152 | "dependencies": [ 153 | "npm:code-block-writer@12" 154 | ], 155 | "peerDependencies": [ 156 | "npm:code-block-writer@12" 157 | ], 158 | "peerDependenciesMeta": { 159 | "code-block-writer": { 160 | "optional": true 161 | } 162 | } 163 | } 164 | } 165 | } 166 | } 167 | 168 | # remove 169 | { 170 | "links": { 171 | "npm:ts-morph@21.0.1": { 172 | "dependencies": [ 173 | "npm:code-block-writer@12" 174 | ], 175 | "peerDependencies": [ 176 | "npm:code-block-writer@12" 177 | ], 178 | "peerDependenciesMeta": { 179 | "code-block-writer": { 180 | "optional": false 181 | } 182 | } 183 | } 184 | } 185 | } 186 | 187 | # output 188 | { 189 | "version": "5", 190 | "specifiers": { 191 | "jsr:@scope/package_a@*": "0.0.1" 192 | }, 193 | "jsr": { 194 | "@scope/package_a@0.0.1": { 195 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 196 | } 197 | }, 198 | "npm": { 199 | "@nodelib/fs.scandir@2.1.5": { 200 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 201 | "dependencies": [ 202 | "@nodelib/fs.stat", 203 | "run-parallel" 204 | ] 205 | }, 206 | "@nodelib/fs.stat@2.0.5": { 207 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 208 | }, 209 | "@nodelib/fs.walk@1.2.8": { 210 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 211 | "dependencies": [ 212 | "@nodelib/fs.scandir", 213 | "fastq" 214 | ] 215 | }, 216 | "@ts-morph/common@0.22.0": { 217 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 218 | "dependencies": [ 219 | "fast-glob", 220 | "minimatch", 221 | "mkdirp", 222 | "path-browserify" 223 | ] 224 | }, 225 | "balanced-match@1.0.2": { 226 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 227 | }, 228 | "brace-expansion@2.0.1": { 229 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 230 | "dependencies": [ 231 | "balanced-match" 232 | ] 233 | }, 234 | "braces@3.0.2": { 235 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 236 | "dependencies": [ 237 | "fill-range" 238 | ] 239 | }, 240 | "code-block-writer@12.0.0": { 241 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 242 | }, 243 | "fast-glob@3.3.2": { 244 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 245 | "dependencies": [ 246 | "@nodelib/fs.stat", 247 | "@nodelib/fs.walk", 248 | "glob-parent", 249 | "merge2", 250 | "micromatch" 251 | ] 252 | }, 253 | "fastq@1.16.0": { 254 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 255 | "dependencies": [ 256 | "reusify" 257 | ] 258 | }, 259 | "fill-range@7.0.1": { 260 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 261 | "dependencies": [ 262 | "to-regex-range" 263 | ] 264 | }, 265 | "glob-parent@5.1.2": { 266 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 267 | "dependencies": [ 268 | "is-glob" 269 | ] 270 | }, 271 | "is-extglob@2.1.1": { 272 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 273 | }, 274 | "is-glob@4.0.3": { 275 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 276 | "dependencies": [ 277 | "is-extglob" 278 | ] 279 | }, 280 | "is-number@7.0.0": { 281 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 282 | }, 283 | "merge2@1.4.1": { 284 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 285 | }, 286 | "micromatch@4.0.5": { 287 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 288 | "dependencies": [ 289 | "braces", 290 | "picomatch" 291 | ] 292 | }, 293 | "minimatch@9.0.3": { 294 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 295 | "dependencies": [ 296 | "brace-expansion" 297 | ] 298 | }, 299 | "mkdirp@3.0.1": { 300 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 301 | }, 302 | "path-browserify@1.0.1": { 303 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 304 | }, 305 | "picomatch@2.3.1": { 306 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 307 | }, 308 | "queue-microtask@1.2.3": { 309 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 310 | }, 311 | "reusify@1.0.4": { 312 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 313 | }, 314 | "run-parallel@1.2.0": { 315 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 316 | "dependencies": [ 317 | "queue-microtask" 318 | ] 319 | }, 320 | "to-regex-range@5.0.1": { 321 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 322 | "dependencies": [ 323 | "is-number" 324 | ] 325 | }, 326 | "ts-morph@21.0.1": { 327 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 328 | "dependencies": [ 329 | "@ts-morph/common", 330 | "code-block-writer" 331 | ] 332 | } 333 | }, 334 | "workspace": { 335 | "links": { 336 | "npm:ts-morph@21.0.1": { 337 | "dependencies": [ 338 | "npm:code-block-writer@12" 339 | ], 340 | "peerDependencies": [ 341 | "npm:code-block-writer@12" 342 | ], 343 | "peerDependenciesMeta": { 344 | "code-block-writer": { 345 | "optional": false 346 | } 347 | } 348 | } 349 | } 350 | } 351 | } 352 | -------------------------------------------------------------------------------- /src/graphs.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2018-2024 the Deno authors. MIT license. 2 | 3 | use std::collections::BTreeMap; 4 | use std::collections::BTreeSet; 5 | use std::collections::HashMap; 6 | use std::collections::HashSet; 7 | 8 | use deno_semver::SmallStackString; 9 | use deno_semver::StackString; 10 | use deno_semver::Version; 11 | use deno_semver::jsr::JsrDepPackageReq; 12 | use deno_semver::package::PackageKind; 13 | use deno_semver::package::PackageNv; 14 | use deno_semver::package::PackageReq; 15 | 16 | use crate::NpmPackageInfo; 17 | use crate::PackagesContent; 18 | 19 | #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] 20 | enum LockfilePkgId { 21 | Npm(LockfileNpmPackageId), 22 | Jsr(LockfileJsrPkgNv), 23 | } 24 | 25 | #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] 26 | struct LockfileJsrPkgNv(PackageNv); 27 | 28 | #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] 29 | struct LockfileNpmPackageId(StackString); 30 | 31 | #[derive(Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)] 32 | enum LockfilePkgReq { 33 | Jsr(PackageReq), 34 | Npm(PackageReq), 35 | } 36 | 37 | impl LockfilePkgReq { 38 | pub fn from_jsr_dep(dep: JsrDepPackageReq) -> Self { 39 | match dep.kind { 40 | deno_semver::package::PackageKind::Jsr => LockfilePkgReq::Jsr(dep.req), 41 | deno_semver::package::PackageKind::Npm => LockfilePkgReq::Npm(dep.req), 42 | } 43 | } 44 | 45 | pub fn into_jsr_dep(self) -> JsrDepPackageReq { 46 | match self { 47 | LockfilePkgReq::Jsr(req) => JsrDepPackageReq::jsr(req), 48 | LockfilePkgReq::Npm(req) => JsrDepPackageReq::npm(req), 49 | } 50 | } 51 | 52 | pub fn req(&self) -> &PackageReq { 53 | match self { 54 | LockfilePkgReq::Jsr(req) => req, 55 | LockfilePkgReq::Npm(req) => req, 56 | } 57 | } 58 | 59 | pub fn kind(&self) -> PackageKind { 60 | match self { 61 | LockfilePkgReq::Jsr(_) => PackageKind::Jsr, 62 | LockfilePkgReq::Npm(_) => PackageKind::Npm, 63 | } 64 | } 65 | } 66 | 67 | #[derive(Debug)] 68 | enum LockfileGraphPackage { 69 | Jsr(LockfileJsrGraphPackage), 70 | Npm(LockfileNpmGraphPackage), 71 | } 72 | 73 | #[derive(Debug)] 74 | struct LockfileNpmGraphPackage { 75 | dependents: HashSet, 76 | integrity: Option, 77 | dependencies: BTreeMap, 78 | optional_dependencies: BTreeMap, 79 | optional_peers: BTreeMap, 80 | os: Vec, 81 | cpu: Vec, 82 | tarball: Option, 83 | deprecated: bool, 84 | scripts: bool, 85 | bin: bool, 86 | } 87 | 88 | impl LockfileNpmGraphPackage { 89 | pub fn all_dependency_ids( 90 | &self, 91 | ) -> impl Iterator { 92 | self 93 | .dependencies 94 | .values() 95 | .chain(self.optional_dependencies.values()) 96 | .chain(self.optional_peers.values()) 97 | } 98 | } 99 | 100 | #[derive(Debug)] 101 | struct LockfileJsrGraphPackage { 102 | dependents: HashSet, 103 | integrity: String, 104 | dependencies: BTreeSet, 105 | } 106 | 107 | /// Graph used to analyze a lockfile to determine which packages 108 | /// and remotes can be removed based on config file changes. 109 | pub struct LockfilePackageGraph { 110 | root_packages: HashMap, 111 | packages: HashMap, 112 | remotes: BTreeMap, 113 | } 114 | 115 | impl LockfilePackageGraph { 116 | pub fn from_lockfile( 117 | content: PackagesContent, 118 | remotes: BTreeMap, 119 | ) -> Self { 120 | let mut root_packages = 121 | HashMap::::with_capacity( 122 | content.specifiers.len(), 123 | ); 124 | // collect the specifiers to version mappings 125 | let package_count = 126 | content.specifiers.len() + content.jsr.len() + content.npm.len(); 127 | let mut packages = HashMap::with_capacity(package_count); 128 | for (dep, value) in content.specifiers { 129 | match dep.kind { 130 | deno_semver::package::PackageKind::Jsr => { 131 | let Ok(version) = Version::parse_standard(&value) else { 132 | continue; 133 | }; 134 | let nv = LockfilePkgId::Jsr(LockfileJsrPkgNv(PackageNv { 135 | name: dep.req.name.clone(), 136 | version, 137 | })); 138 | root_packages.insert(LockfilePkgReq::Jsr(dep.req), nv); 139 | } 140 | deno_semver::package::PackageKind::Npm => { 141 | let id = LockfileNpmPackageId({ 142 | let mut text = 143 | StackString::with_capacity(dep.req.name.len() + 1 + value.len()); 144 | text.push_str(&dep.req.name); 145 | text.push('@'); 146 | text.push_str(&value); 147 | text 148 | }); 149 | root_packages 150 | .insert(LockfilePkgReq::Npm(dep.req), LockfilePkgId::Npm(id)); 151 | } 152 | } 153 | } 154 | 155 | for (nv, content_package) in content.jsr { 156 | packages.insert( 157 | LockfilePkgId::Jsr(LockfileJsrPkgNv(nv.clone())), 158 | LockfileGraphPackage::Jsr(LockfileJsrGraphPackage { 159 | dependents: HashSet::new(), 160 | integrity: content_package.integrity.clone(), 161 | dependencies: content_package 162 | .dependencies 163 | .into_iter() 164 | .map(LockfilePkgReq::from_jsr_dep) 165 | .collect(), 166 | }), 167 | ); 168 | } 169 | 170 | for (id, package) in content.npm { 171 | packages.insert( 172 | LockfilePkgId::Npm(LockfileNpmPackageId(id.clone())), 173 | LockfileGraphPackage::Npm(LockfileNpmGraphPackage { 174 | dependents: HashSet::new(), 175 | integrity: package.integrity.clone(), 176 | dependencies: package 177 | .dependencies 178 | .iter() 179 | .map(|(key, dep_id)| { 180 | (key.clone(), LockfileNpmPackageId(dep_id.clone())) 181 | }) 182 | .collect(), 183 | optional_dependencies: package 184 | .optional_dependencies 185 | .iter() 186 | .map(|(name, dep_id)| { 187 | (name.clone(), LockfileNpmPackageId(dep_id.clone())) 188 | }) 189 | .collect(), 190 | cpu: package.cpu.clone(), 191 | os: package.os.clone(), 192 | tarball: package.tarball.clone(), 193 | deprecated: package.deprecated, 194 | scripts: package.scripts, 195 | bin: package.bin, 196 | optional_peers: package 197 | .optional_peers 198 | .iter() 199 | .map(|(name, dep_id)| { 200 | (name.clone(), LockfileNpmPackageId(dep_id.clone())) 201 | }) 202 | .collect(), 203 | }), 204 | ); 205 | } 206 | 207 | let pkg_ids = packages.keys().cloned().collect::>(); 208 | for pkg_id in pkg_ids { 209 | if let Some(pkg) = packages.get(&pkg_id) { 210 | let dependency_ids = match pkg { 211 | LockfileGraphPackage::Jsr(pkg) => pkg 212 | .dependencies 213 | .iter() 214 | .filter_map(|req| root_packages.get(req)) 215 | .cloned() 216 | .collect::>(), 217 | LockfileGraphPackage::Npm(pkg) => pkg 218 | .all_dependency_ids() 219 | .cloned() 220 | .map(LockfilePkgId::Npm) 221 | .collect::>(), 222 | }; 223 | 224 | for dep_id in dependency_ids { 225 | if let Some(pkg) = packages.get_mut(&dep_id) { 226 | match pkg { 227 | LockfileGraphPackage::Jsr(pkg) => { 228 | pkg.dependents.insert(pkg_id.clone()); 229 | } 230 | LockfileGraphPackage::Npm(pkg) => { 231 | pkg.dependents.insert(pkg_id.clone()); 232 | } 233 | } 234 | } 235 | } 236 | } 237 | } 238 | 239 | Self { 240 | root_packages, 241 | packages, 242 | remotes, 243 | } 244 | } 245 | 246 | pub fn remove_links( 247 | &mut self, 248 | package_reqs: impl Iterator, 249 | ) { 250 | let mut pending_ids = Vec::new(); 251 | for pkg_req in package_reqs { 252 | for (root_pkg, id) in &self.root_packages { 253 | if pkg_req.kind == root_pkg.kind() 254 | && pkg_req.req.name == root_pkg.req().name 255 | { 256 | pending_ids.push(id.clone()); 257 | } 258 | } 259 | } 260 | for id in &pending_ids { 261 | self.remove_root_pkg_by_id(id); 262 | } 263 | } 264 | 265 | pub fn remove_root_packages( 266 | &mut self, 267 | package_reqs: impl Iterator, 268 | ) { 269 | let package_reqs = package_reqs.map(LockfilePkgReq::from_jsr_dep); 270 | for req in package_reqs { 271 | if let Some(id) = self.root_packages.get(&req).cloned() { 272 | self.remove_root_pkg_by_id(&id); 273 | } 274 | } 275 | } 276 | 277 | fn remove_root_pkg_by_id(&mut self, id: &LockfilePkgId) { 278 | // The ideal goal here is to only disassociate the package 279 | // from the root so that the the current dependencies can be 280 | // reused in the new dependency resolution thereby causing 281 | // minimal changes in the lockfile. After we let deno_npm or 282 | // deno_graph clean up any stragglers. 283 | // 284 | // We're currently achieving this goal with npm packages, but 285 | // jsr packages are still lacking deduplication functionality 286 | // in deno_graph. So, we've taken a halfway step where npm deps 287 | // disassociate from the root only, but jsr deps and all their 288 | // jsr connections need to be purged from the lockfile. 289 | match id { 290 | LockfilePkgId::Jsr(_) => { 291 | let mut root_ids_to_remove = Vec::with_capacity(self.packages.len()); 292 | let mut pending_ids = Vec::with_capacity(self.packages.len()); 293 | pending_ids.push(id.clone()); 294 | while let Some(id) = pending_ids.pop() { 295 | root_ids_to_remove.push(id.clone()); 296 | let Some(pkg) = self.packages.get_mut(&id) else { 297 | continue; 298 | }; 299 | match pkg { 300 | LockfileGraphPackage::Jsr(pkg) => { 301 | pending_ids.extend( 302 | pkg 303 | .dependencies 304 | .iter() 305 | .filter_map(|req| self.root_packages.get(req)) 306 | .cloned(), 307 | ); 308 | pending_ids.extend(pkg.dependents.drain()); 309 | self.packages.remove(&id); 310 | } 311 | LockfileGraphPackage::Npm(_) => {} 312 | } 313 | } 314 | 315 | // sort and dedup for binary search 316 | root_ids_to_remove.sort(); 317 | root_ids_to_remove.dedup(); 318 | self.root_packages.retain(|_, pkg_id| { 319 | root_ids_to_remove.binary_search(pkg_id).is_err() 320 | }); 321 | } 322 | LockfilePkgId::Npm(_) => { 323 | self.root_packages.retain(|_, pkg_id| pkg_id != id); 324 | } 325 | } 326 | } 327 | 328 | pub fn populate_packages( 329 | self, 330 | packages: &mut PackagesContent, 331 | remotes: &mut BTreeMap, 332 | ) { 333 | *remotes = self.remotes; 334 | 335 | for (id, package) in self.packages { 336 | match package { 337 | LockfileGraphPackage::Jsr(package) => { 338 | packages.jsr.insert( 339 | match id { 340 | LockfilePkgId::Jsr(nv) => nv.0, 341 | LockfilePkgId::Npm(_) => unreachable!(), 342 | }, 343 | crate::JsrPackageInfo { 344 | integrity: package.integrity, 345 | dependencies: package 346 | .dependencies 347 | .into_iter() 348 | .filter(|dep| self.root_packages.contains_key(dep)) 349 | .map(|req| req.into_jsr_dep()) 350 | .collect(), 351 | }, 352 | ); 353 | } 354 | LockfileGraphPackage::Npm(package) => { 355 | packages.npm.insert( 356 | match id { 357 | LockfilePkgId::Jsr(_) => unreachable!(), 358 | LockfilePkgId::Npm(id) => id.0, 359 | }, 360 | NpmPackageInfo { 361 | integrity: package.integrity, 362 | dependencies: package 363 | .dependencies 364 | .into_iter() 365 | .map(|(name, id)| (name, id.0)) 366 | .collect(), 367 | cpu: package.cpu, 368 | os: package.os, 369 | tarball: package.tarball.clone(), 370 | optional_dependencies: package 371 | .optional_dependencies 372 | .into_iter() 373 | .map(|(name, id)| (name, id.0)) 374 | .collect(), 375 | deprecated: package.deprecated, 376 | scripts: package.scripts, 377 | bin: package.bin, 378 | optional_peers: package 379 | .optional_peers 380 | .into_iter() 381 | .map(|(name, id)| (name, id.0)) 382 | .collect(), 383 | }, 384 | ); 385 | } 386 | } 387 | } 388 | 389 | for (req, id) in self.root_packages { 390 | let value = match &id { 391 | LockfilePkgId::Jsr(nv) => { 392 | nv.0.version.to_custom_string::() 393 | } 394 | LockfilePkgId::Npm(id) => id 395 | .0 396 | .as_str() 397 | .strip_prefix(req.req().name.as_str()) 398 | .unwrap() 399 | .strip_prefix("@") 400 | .unwrap() 401 | .into(), 402 | }; 403 | packages.specifiers.insert(req.into_jsr_dep(), value); 404 | } 405 | } 406 | } 407 | -------------------------------------------------------------------------------- /tests/specs/config_changes/NoConfigMaintains_v4.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "4", 4 | "specifiers": { 5 | "jsr:@scope/package_a@^0.0": "0.0.1", 6 | "jsr:@scope/package_b": "0.0.1", 7 | "jsr:@scope/package_c": "0.0.1", 8 | "jsr:@scope/package_orphan": "0.0.1", 9 | "npm:ts-morph": "21.0.1" 10 | }, 11 | "jsr": { 12 | "@scope/package_a@0.0.1": { 13 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 14 | "dependencies": [ 15 | "jsr:@scope/package_b" 16 | ] 17 | }, 18 | "@scope/package_b@0.0.1": { 19 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 20 | "dependencies": [ 21 | "jsr:@scope/package_c" 22 | ] 23 | }, 24 | "@scope/package_c@0.0.1": { 25 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 26 | "dependencies": [ 27 | "jsr:@scope/package_a" 28 | ] 29 | }, 30 | "@scope/package_orphan@0.0.1": { 31 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 32 | } 33 | }, 34 | "npm": { 35 | "@example/orphan@0.0.1": { 36 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 37 | }, 38 | "@nodelib/fs.scandir@2.1.5": { 39 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 40 | "dependencies": [ 41 | "@nodelib/fs.stat", 42 | "run-parallel" 43 | ] 44 | }, 45 | "@nodelib/fs.stat@2.0.5": { 46 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 47 | }, 48 | "@nodelib/fs.walk@1.2.8": { 49 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 50 | "dependencies": [ 51 | "@nodelib/fs.scandir", 52 | "fastq" 53 | ] 54 | }, 55 | "@ts-morph/common@0.22.0": { 56 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 57 | "dependencies": [ 58 | "fast-glob", 59 | "minimatch", 60 | "mkdirp", 61 | "path-browserify" 62 | ] 63 | }, 64 | "balanced-match@1.0.2": { 65 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 66 | }, 67 | "brace-expansion@2.0.1": { 68 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 69 | "dependencies": [ 70 | "balanced-match" 71 | ] 72 | }, 73 | "braces@3.0.2": { 74 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 75 | "dependencies": [ 76 | "fill-range" 77 | ] 78 | }, 79 | "code-block-writer@12.0.0": { 80 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 81 | }, 82 | "fast-glob@3.3.2": { 83 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 84 | "dependencies": [ 85 | "@nodelib/fs.stat", 86 | "@nodelib/fs.walk", 87 | "glob-parent", 88 | "merge2", 89 | "micromatch" 90 | ] 91 | }, 92 | "fastq@1.16.0": { 93 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 94 | "dependencies": [ 95 | "reusify" 96 | ] 97 | }, 98 | "fill-range@7.0.1": { 99 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 100 | "dependencies": [ 101 | "to-regex-range" 102 | ] 103 | }, 104 | "glob-parent@5.1.2": { 105 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 106 | "dependencies": [ 107 | "is-glob" 108 | ] 109 | }, 110 | "is-extglob@2.1.1": { 111 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 112 | }, 113 | "is-glob@4.0.3": { 114 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 115 | "dependencies": [ 116 | "is-extglob" 117 | ] 118 | }, 119 | "is-number@7.0.0": { 120 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 121 | }, 122 | "merge2@1.4.1": { 123 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 124 | }, 125 | "micromatch@4.0.5": { 126 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 127 | "dependencies": [ 128 | "braces", 129 | "picomatch" 130 | ] 131 | }, 132 | "minimatch@9.0.3": { 133 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 134 | "dependencies": [ 135 | "brace-expansion" 136 | ] 137 | }, 138 | "mkdirp@3.0.1": { 139 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 140 | }, 141 | "path-browserify@1.0.1": { 142 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 143 | }, 144 | "picomatch@2.3.1": { 145 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 146 | }, 147 | "queue-microtask@1.2.3": { 148 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 149 | }, 150 | "reusify@1.0.4": { 151 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 152 | }, 153 | "run-parallel@1.2.0": { 154 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 155 | "dependencies": [ 156 | "queue-microtask" 157 | ] 158 | }, 159 | "to-regex-range@5.0.1": { 160 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 161 | "dependencies": [ 162 | "is-number" 163 | ] 164 | }, 165 | "ts-morph@21.0.1": { 166 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 167 | "dependencies": [ 168 | "@ts-morph/common", 169 | "code-block-writer" 170 | ] 171 | } 172 | }, 173 | "workspace": { 174 | "dependencies": [ 175 | "jsr:@scope/package_a" 176 | ], 177 | "packageJson": { 178 | "dependencies": [ 179 | "npm:ts-morph" 180 | ] 181 | } 182 | } 183 | } 184 | 185 | # --no-config (no change) 186 | { 187 | } 188 | 189 | # will maintain the contents because --no-config was specified 190 | { 191 | "version": "5", 192 | "specifiers": { 193 | "jsr:@scope/package_a@0.0": "0.0.1", 194 | "jsr:@scope/package_b@*": "0.0.1", 195 | "jsr:@scope/package_c@*": "0.0.1", 196 | "jsr:@scope/package_orphan@*": "0.0.1", 197 | "npm:ts-morph@*": "21.0.1" 198 | }, 199 | "jsr": { 200 | "@scope/package_a@0.0.1": { 201 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 202 | "dependencies": [ 203 | "jsr:@scope/package_b" 204 | ] 205 | }, 206 | "@scope/package_b@0.0.1": { 207 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 208 | "dependencies": [ 209 | "jsr:@scope/package_c" 210 | ] 211 | }, 212 | "@scope/package_c@0.0.1": { 213 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 214 | "dependencies": [ 215 | "jsr:@scope/package_a" 216 | ] 217 | }, 218 | "@scope/package_orphan@0.0.1": { 219 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 220 | } 221 | }, 222 | "npm": { 223 | "@example/orphan@0.0.1": { 224 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 225 | }, 226 | "@nodelib/fs.scandir@2.1.5": { 227 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 228 | "dependencies": [ 229 | "@nodelib/fs.stat", 230 | "run-parallel" 231 | ] 232 | }, 233 | "@nodelib/fs.stat@2.0.5": { 234 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 235 | }, 236 | "@nodelib/fs.walk@1.2.8": { 237 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 238 | "dependencies": [ 239 | "@nodelib/fs.scandir", 240 | "fastq" 241 | ] 242 | }, 243 | "@ts-morph/common@0.22.0": { 244 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 245 | "dependencies": [ 246 | "fast-glob", 247 | "minimatch", 248 | "mkdirp", 249 | "path-browserify" 250 | ] 251 | }, 252 | "balanced-match@1.0.2": { 253 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 254 | }, 255 | "brace-expansion@2.0.1": { 256 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 257 | "dependencies": [ 258 | "balanced-match" 259 | ] 260 | }, 261 | "braces@3.0.2": { 262 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 263 | "dependencies": [ 264 | "fill-range" 265 | ] 266 | }, 267 | "code-block-writer@12.0.0": { 268 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 269 | }, 270 | "fast-glob@3.3.2": { 271 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 272 | "dependencies": [ 273 | "@nodelib/fs.stat", 274 | "@nodelib/fs.walk", 275 | "glob-parent", 276 | "merge2", 277 | "micromatch" 278 | ] 279 | }, 280 | "fastq@1.16.0": { 281 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 282 | "dependencies": [ 283 | "reusify" 284 | ] 285 | }, 286 | "fill-range@7.0.1": { 287 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 288 | "dependencies": [ 289 | "to-regex-range" 290 | ] 291 | }, 292 | "glob-parent@5.1.2": { 293 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 294 | "dependencies": [ 295 | "is-glob" 296 | ] 297 | }, 298 | "is-extglob@2.1.1": { 299 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 300 | }, 301 | "is-glob@4.0.3": { 302 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 303 | "dependencies": [ 304 | "is-extglob" 305 | ] 306 | }, 307 | "is-number@7.0.0": { 308 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 309 | }, 310 | "merge2@1.4.1": { 311 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 312 | }, 313 | "micromatch@4.0.5": { 314 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 315 | "dependencies": [ 316 | "braces", 317 | "picomatch" 318 | ] 319 | }, 320 | "minimatch@9.0.3": { 321 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 322 | "dependencies": [ 323 | "brace-expansion" 324 | ] 325 | }, 326 | "mkdirp@3.0.1": { 327 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 328 | }, 329 | "path-browserify@1.0.1": { 330 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 331 | }, 332 | "picomatch@2.3.1": { 333 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 334 | }, 335 | "queue-microtask@1.2.3": { 336 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 337 | }, 338 | "reusify@1.0.4": { 339 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 340 | }, 341 | "run-parallel@1.2.0": { 342 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 343 | "dependencies": [ 344 | "queue-microtask" 345 | ] 346 | }, 347 | "to-regex-range@5.0.1": { 348 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 349 | "dependencies": [ 350 | "is-number" 351 | ] 352 | }, 353 | "ts-morph@21.0.1": { 354 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 355 | "dependencies": [ 356 | "@ts-morph/common", 357 | "code-block-writer" 358 | ] 359 | } 360 | }, 361 | "workspace": { 362 | "dependencies": [ 363 | "jsr:@scope/package_a@*" 364 | ], 365 | "packageJson": { 366 | "dependencies": [ 367 | "npm:ts-morph@*" 368 | ] 369 | } 370 | } 371 | } 372 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovedConfigRemoves.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a": "jsr:@scope/package_a@0.0.1", 7 | "jsr:@scope/package_b": "jsr:@scope/package_b@0.0.1", 8 | "jsr:@scope/package_c": "jsr:@scope/package_c@0.0.1", 9 | "jsr:@scope/package_orphan": "jsr:@scope/package_orphan@0.0.1", 10 | "npm:ts-morph": "npm:ts-morph@21.0.1" 11 | }, 12 | "jsr": { 13 | "@scope/package_a@0.0.1": { 14 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 15 | "dependencies": [ 16 | "jsr:@scope/package_b" 17 | ] 18 | }, 19 | "@scope/package_b@0.0.1": { 20 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 21 | "dependencies": [ 22 | "jsr:@scope/package_c" 23 | ] 24 | }, 25 | "@scope/package_c@0.0.1": { 26 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 27 | "dependencies": [ 28 | "jsr:@scope/package_a" 29 | ] 30 | }, 31 | "@scope/package_orphan@0.0.1": { 32 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 33 | } 34 | }, 35 | "npm": { 36 | "@example/orphan@0.0.1": { 37 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 38 | "dependencies": {} 39 | }, 40 | "@nodelib/fs.scandir@2.1.5": { 41 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 42 | "dependencies": { 43 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 44 | "run-parallel": "run-parallel@1.2.0" 45 | } 46 | }, 47 | "@nodelib/fs.stat@2.0.5": { 48 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 49 | "dependencies": {} 50 | }, 51 | "@nodelib/fs.walk@1.2.8": { 52 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 53 | "dependencies": { 54 | "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", 55 | "fastq": "fastq@1.16.0" 56 | } 57 | }, 58 | "@ts-morph/common@0.22.0": { 59 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 60 | "dependencies": { 61 | "fast-glob": "fast-glob@3.3.2", 62 | "minimatch": "minimatch@9.0.3", 63 | "mkdirp": "mkdirp@3.0.1", 64 | "path-browserify": "path-browserify@1.0.1" 65 | } 66 | }, 67 | "balanced-match@1.0.2": { 68 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 69 | "dependencies": {} 70 | }, 71 | "brace-expansion@2.0.1": { 72 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 73 | "dependencies": { 74 | "balanced-match": "balanced-match@1.0.2" 75 | } 76 | }, 77 | "braces@3.0.2": { 78 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 79 | "dependencies": { 80 | "fill-range": "fill-range@7.0.1" 81 | } 82 | }, 83 | "code-block-writer@12.0.0": { 84 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", 85 | "dependencies": {} 86 | }, 87 | "fast-glob@3.3.2": { 88 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 89 | "dependencies": { 90 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 91 | "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", 92 | "glob-parent": "glob-parent@5.1.2", 93 | "merge2": "merge2@1.4.1", 94 | "micromatch": "micromatch@4.0.5" 95 | } 96 | }, 97 | "fastq@1.16.0": { 98 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 99 | "dependencies": { 100 | "reusify": "reusify@1.0.4" 101 | } 102 | }, 103 | "fill-range@7.0.1": { 104 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 105 | "dependencies": { 106 | "to-regex-range": "to-regex-range@5.0.1" 107 | } 108 | }, 109 | "glob-parent@5.1.2": { 110 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 111 | "dependencies": { 112 | "is-glob": "is-glob@4.0.3" 113 | } 114 | }, 115 | "is-extglob@2.1.1": { 116 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 117 | "dependencies": {} 118 | }, 119 | "is-glob@4.0.3": { 120 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 121 | "dependencies": { 122 | "is-extglob": "is-extglob@2.1.1" 123 | } 124 | }, 125 | "is-number@7.0.0": { 126 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 127 | "dependencies": {} 128 | }, 129 | "merge2@1.4.1": { 130 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 131 | "dependencies": {} 132 | }, 133 | "micromatch@4.0.5": { 134 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 135 | "dependencies": { 136 | "braces": "braces@3.0.2", 137 | "picomatch": "picomatch@2.3.1" 138 | } 139 | }, 140 | "minimatch@9.0.3": { 141 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 142 | "dependencies": { 143 | "brace-expansion": "brace-expansion@2.0.1" 144 | } 145 | }, 146 | "mkdirp@3.0.1": { 147 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 148 | "dependencies": {} 149 | }, 150 | "path-browserify@1.0.1": { 151 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 152 | "dependencies": {} 153 | }, 154 | "picomatch@2.3.1": { 155 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 156 | "dependencies": {} 157 | }, 158 | "queue-microtask@1.2.3": { 159 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 160 | "dependencies": {} 161 | }, 162 | "reusify@1.0.4": { 163 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 164 | "dependencies": {} 165 | }, 166 | "run-parallel@1.2.0": { 167 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 168 | "dependencies": { 169 | "queue-microtask": "queue-microtask@1.2.3" 170 | } 171 | }, 172 | "to-regex-range@5.0.1": { 173 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 174 | "dependencies": { 175 | "is-number": "is-number@7.0.0" 176 | } 177 | }, 178 | "ts-morph@21.0.1": { 179 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 180 | "dependencies": { 181 | "@ts-morph/common": "@ts-morph/common@0.22.0", 182 | "code-block-writer": "code-block-writer@12.0.0" 183 | } 184 | } 185 | } 186 | }, 187 | "remote": { 188 | }, 189 | "workspace": { 190 | "dependencies": [ 191 | "jsr:@scope/package_a" 192 | ], 193 | "packageJson": { 194 | "dependencies": [ 195 | "npm:ts-morph" 196 | ] 197 | } 198 | } 199 | } 200 | 201 | # no config 202 | { 203 | } 204 | 205 | # will remove jsr packages only due to no JSR dedup/cleanup feature 206 | { 207 | "version": "5", 208 | "specifiers": { 209 | "jsr:@scope/package_orphan@*": "0.0.1" 210 | }, 211 | "jsr": { 212 | "@scope/package_orphan@0.0.1": { 213 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 214 | } 215 | }, 216 | "npm": { 217 | "@example/orphan@0.0.1": { 218 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 219 | }, 220 | "@nodelib/fs.scandir@2.1.5": { 221 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 222 | "dependencies": [ 223 | "@nodelib/fs.stat", 224 | "run-parallel" 225 | ] 226 | }, 227 | "@nodelib/fs.stat@2.0.5": { 228 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 229 | }, 230 | "@nodelib/fs.walk@1.2.8": { 231 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 232 | "dependencies": [ 233 | "@nodelib/fs.scandir", 234 | "fastq" 235 | ] 236 | }, 237 | "@ts-morph/common@0.22.0": { 238 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 239 | "dependencies": [ 240 | "fast-glob", 241 | "minimatch", 242 | "mkdirp", 243 | "path-browserify" 244 | ] 245 | }, 246 | "balanced-match@1.0.2": { 247 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 248 | }, 249 | "brace-expansion@2.0.1": { 250 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 251 | "dependencies": [ 252 | "balanced-match" 253 | ] 254 | }, 255 | "braces@3.0.2": { 256 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 257 | "dependencies": [ 258 | "fill-range" 259 | ] 260 | }, 261 | "code-block-writer@12.0.0": { 262 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 263 | }, 264 | "fast-glob@3.3.2": { 265 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 266 | "dependencies": [ 267 | "@nodelib/fs.stat", 268 | "@nodelib/fs.walk", 269 | "glob-parent", 270 | "merge2", 271 | "micromatch" 272 | ] 273 | }, 274 | "fastq@1.16.0": { 275 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 276 | "dependencies": [ 277 | "reusify" 278 | ] 279 | }, 280 | "fill-range@7.0.1": { 281 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 282 | "dependencies": [ 283 | "to-regex-range" 284 | ] 285 | }, 286 | "glob-parent@5.1.2": { 287 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 288 | "dependencies": [ 289 | "is-glob" 290 | ] 291 | }, 292 | "is-extglob@2.1.1": { 293 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 294 | }, 295 | "is-glob@4.0.3": { 296 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 297 | "dependencies": [ 298 | "is-extglob" 299 | ] 300 | }, 301 | "is-number@7.0.0": { 302 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 303 | }, 304 | "merge2@1.4.1": { 305 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 306 | }, 307 | "micromatch@4.0.5": { 308 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 309 | "dependencies": [ 310 | "braces", 311 | "picomatch" 312 | ] 313 | }, 314 | "minimatch@9.0.3": { 315 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 316 | "dependencies": [ 317 | "brace-expansion" 318 | ] 319 | }, 320 | "mkdirp@3.0.1": { 321 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 322 | }, 323 | "path-browserify@1.0.1": { 324 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 325 | }, 326 | "picomatch@2.3.1": { 327 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 328 | }, 329 | "queue-microtask@1.2.3": { 330 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 331 | }, 332 | "reusify@1.0.4": { 333 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 334 | }, 335 | "run-parallel@1.2.0": { 336 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 337 | "dependencies": [ 338 | "queue-microtask" 339 | ] 340 | }, 341 | "to-regex-range@5.0.1": { 342 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 343 | "dependencies": [ 344 | "is-number" 345 | ] 346 | }, 347 | "ts-morph@21.0.1": { 348 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 349 | "dependencies": [ 350 | "@ts-morph/common", 351 | "code-block-writer" 352 | ] 353 | } 354 | } 355 | } 356 | -------------------------------------------------------------------------------- /tests/specs/config_changes/NoNpmMaintainsNpm.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a": "jsr:@scope/package_a@0.0.1", 7 | "jsr:@scope/package_b": "jsr:@scope/package_b@0.0.1", 8 | "jsr:@scope/package_c": "jsr:@scope/package_c@0.0.1", 9 | "jsr:@scope/package_orphan": "jsr:@scope/package_orphan@0.0.1", 10 | "npm:ts-morph": "npm:ts-morph@21.0.1" 11 | }, 12 | "jsr": { 13 | "@scope/package_a@0.0.1": { 14 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 15 | "dependencies": [ 16 | "jsr:@scope/package_b" 17 | ] 18 | }, 19 | "@scope/package_b@0.0.1": { 20 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 21 | "dependencies": [ 22 | "jsr:@scope/package_c" 23 | ] 24 | }, 25 | "@scope/package_c@0.0.1": { 26 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 27 | "dependencies": [ 28 | "jsr:@scope/package_a" 29 | ] 30 | }, 31 | "@scope/package_orphan@0.0.1": { 32 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 33 | } 34 | }, 35 | "npm": { 36 | "@example/orphan@0.0.1": { 37 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 38 | "dependencies": {} 39 | }, 40 | "@nodelib/fs.scandir@2.1.5": { 41 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 42 | "dependencies": { 43 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 44 | "run-parallel": "run-parallel@1.2.0" 45 | } 46 | }, 47 | "@nodelib/fs.stat@2.0.5": { 48 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 49 | "dependencies": {} 50 | }, 51 | "@nodelib/fs.walk@1.2.8": { 52 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 53 | "dependencies": { 54 | "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", 55 | "fastq": "fastq@1.16.0" 56 | } 57 | }, 58 | "@ts-morph/common@0.22.0": { 59 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 60 | "dependencies": { 61 | "fast-glob": "fast-glob@3.3.2", 62 | "minimatch": "minimatch@9.0.3", 63 | "mkdirp": "mkdirp@3.0.1", 64 | "path-browserify": "path-browserify@1.0.1" 65 | } 66 | }, 67 | "balanced-match@1.0.2": { 68 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 69 | "dependencies": {} 70 | }, 71 | "brace-expansion@2.0.1": { 72 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 73 | "dependencies": { 74 | "balanced-match": "balanced-match@1.0.2" 75 | } 76 | }, 77 | "braces@3.0.2": { 78 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 79 | "dependencies": { 80 | "fill-range": "fill-range@7.0.1" 81 | } 82 | }, 83 | "code-block-writer@12.0.0": { 84 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", 85 | "dependencies": {} 86 | }, 87 | "fast-glob@3.3.2": { 88 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 89 | "dependencies": { 90 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 91 | "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", 92 | "glob-parent": "glob-parent@5.1.2", 93 | "merge2": "merge2@1.4.1", 94 | "micromatch": "micromatch@4.0.5" 95 | } 96 | }, 97 | "fastq@1.16.0": { 98 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 99 | "dependencies": { 100 | "reusify": "reusify@1.0.4" 101 | } 102 | }, 103 | "fill-range@7.0.1": { 104 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 105 | "dependencies": { 106 | "to-regex-range": "to-regex-range@5.0.1" 107 | } 108 | }, 109 | "glob-parent@5.1.2": { 110 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 111 | "dependencies": { 112 | "is-glob": "is-glob@4.0.3" 113 | } 114 | }, 115 | "is-extglob@2.1.1": { 116 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 117 | "dependencies": {} 118 | }, 119 | "is-glob@4.0.3": { 120 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 121 | "dependencies": { 122 | "is-extglob": "is-extglob@2.1.1" 123 | } 124 | }, 125 | "is-number@7.0.0": { 126 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 127 | "dependencies": {} 128 | }, 129 | "merge2@1.4.1": { 130 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 131 | "dependencies": {} 132 | }, 133 | "micromatch@4.0.5": { 134 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 135 | "dependencies": { 136 | "braces": "braces@3.0.2", 137 | "picomatch": "picomatch@2.3.1" 138 | } 139 | }, 140 | "minimatch@9.0.3": { 141 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 142 | "dependencies": { 143 | "brace-expansion": "brace-expansion@2.0.1" 144 | } 145 | }, 146 | "mkdirp@3.0.1": { 147 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 148 | "dependencies": {} 149 | }, 150 | "path-browserify@1.0.1": { 151 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 152 | "dependencies": {} 153 | }, 154 | "picomatch@2.3.1": { 155 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 156 | "dependencies": {} 157 | }, 158 | "queue-microtask@1.2.3": { 159 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 160 | "dependencies": {} 161 | }, 162 | "reusify@1.0.4": { 163 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 164 | "dependencies": {} 165 | }, 166 | "run-parallel@1.2.0": { 167 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 168 | "dependencies": { 169 | "queue-microtask": "queue-microtask@1.2.3" 170 | } 171 | }, 172 | "to-regex-range@5.0.1": { 173 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 174 | "dependencies": { 175 | "is-number": "is-number@7.0.0" 176 | } 177 | }, 178 | "ts-morph@21.0.1": { 179 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 180 | "dependencies": { 181 | "@ts-morph/common": "@ts-morph/common@0.22.0", 182 | "code-block-writer": "code-block-writer@12.0.0" 183 | } 184 | } 185 | } 186 | }, 187 | "remote": { 188 | }, 189 | "workspace": { 190 | "dependencies": [ 191 | "jsr:@scope/package_a" 192 | ], 193 | "packageJson": { 194 | "dependencies": [ 195 | "npm:ts-morph" 196 | ] 197 | } 198 | } 199 | } 200 | 201 | # --no-npm 202 | { 203 | } 204 | 205 | # will maintain npm because --no-npm was specified 206 | { 207 | "version": "5", 208 | "specifiers": { 209 | "jsr:@scope/package_orphan@*": "0.0.1", 210 | "npm:ts-morph@*": "21.0.1" 211 | }, 212 | "jsr": { 213 | "@scope/package_orphan@0.0.1": { 214 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 215 | } 216 | }, 217 | "npm": { 218 | "@example/orphan@0.0.1": { 219 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 220 | }, 221 | "@nodelib/fs.scandir@2.1.5": { 222 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 223 | "dependencies": [ 224 | "@nodelib/fs.stat", 225 | "run-parallel" 226 | ] 227 | }, 228 | "@nodelib/fs.stat@2.0.5": { 229 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 230 | }, 231 | "@nodelib/fs.walk@1.2.8": { 232 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 233 | "dependencies": [ 234 | "@nodelib/fs.scandir", 235 | "fastq" 236 | ] 237 | }, 238 | "@ts-morph/common@0.22.0": { 239 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 240 | "dependencies": [ 241 | "fast-glob", 242 | "minimatch", 243 | "mkdirp", 244 | "path-browserify" 245 | ] 246 | }, 247 | "balanced-match@1.0.2": { 248 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 249 | }, 250 | "brace-expansion@2.0.1": { 251 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 252 | "dependencies": [ 253 | "balanced-match" 254 | ] 255 | }, 256 | "braces@3.0.2": { 257 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 258 | "dependencies": [ 259 | "fill-range" 260 | ] 261 | }, 262 | "code-block-writer@12.0.0": { 263 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 264 | }, 265 | "fast-glob@3.3.2": { 266 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 267 | "dependencies": [ 268 | "@nodelib/fs.stat", 269 | "@nodelib/fs.walk", 270 | "glob-parent", 271 | "merge2", 272 | "micromatch" 273 | ] 274 | }, 275 | "fastq@1.16.0": { 276 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 277 | "dependencies": [ 278 | "reusify" 279 | ] 280 | }, 281 | "fill-range@7.0.1": { 282 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 283 | "dependencies": [ 284 | "to-regex-range" 285 | ] 286 | }, 287 | "glob-parent@5.1.2": { 288 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 289 | "dependencies": [ 290 | "is-glob" 291 | ] 292 | }, 293 | "is-extglob@2.1.1": { 294 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 295 | }, 296 | "is-glob@4.0.3": { 297 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 298 | "dependencies": [ 299 | "is-extglob" 300 | ] 301 | }, 302 | "is-number@7.0.0": { 303 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 304 | }, 305 | "merge2@1.4.1": { 306 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 307 | }, 308 | "micromatch@4.0.5": { 309 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 310 | "dependencies": [ 311 | "braces", 312 | "picomatch" 313 | ] 314 | }, 315 | "minimatch@9.0.3": { 316 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 317 | "dependencies": [ 318 | "brace-expansion" 319 | ] 320 | }, 321 | "mkdirp@3.0.1": { 322 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 323 | }, 324 | "path-browserify@1.0.1": { 325 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 326 | }, 327 | "picomatch@2.3.1": { 328 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 329 | }, 330 | "queue-microtask@1.2.3": { 331 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 332 | }, 333 | "reusify@1.0.4": { 334 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 335 | }, 336 | "run-parallel@1.2.0": { 337 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 338 | "dependencies": [ 339 | "queue-microtask" 340 | ] 341 | }, 342 | "to-regex-range@5.0.1": { 343 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 344 | "dependencies": [ 345 | "is-number" 346 | ] 347 | }, 348 | "ts-morph@21.0.1": { 349 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 350 | "dependencies": [ 351 | "@ts-morph/common", 352 | "code-block-writer" 353 | ] 354 | } 355 | }, 356 | "workspace": { 357 | "packageJson": { 358 | "dependencies": [ 359 | "npm:ts-morph@*" 360 | ] 361 | } 362 | } 363 | } 364 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovedDenoJsonRemoves.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a": "jsr:@scope/package_a@0.0.1", 7 | "jsr:@scope/package_b": "jsr:@scope/package_b@0.0.1", 8 | "jsr:@scope/package_c": "jsr:@scope/package_c@0.0.1", 9 | "jsr:@scope/package_orphan": "jsr:@scope/package_orphan@0.0.1", 10 | "npm:ts-morph": "npm:ts-morph@21.0.1" 11 | }, 12 | "jsr": { 13 | "@scope/package_a@0.0.1": { 14 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 15 | "dependencies": [ 16 | "jsr:@scope/package_b" 17 | ] 18 | }, 19 | "@scope/package_b@0.0.1": { 20 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 21 | "dependencies": [ 22 | "jsr:@scope/package_c" 23 | ] 24 | }, 25 | "@scope/package_c@0.0.1": { 26 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 27 | "dependencies": [ 28 | "jsr:@scope/package_a" 29 | ] 30 | }, 31 | "@scope/package_orphan@0.0.1": { 32 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 33 | } 34 | }, 35 | "npm": { 36 | "@example/orphan@0.0.1": { 37 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 38 | "dependencies": {} 39 | }, 40 | "@nodelib/fs.scandir@2.1.5": { 41 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 42 | "dependencies": { 43 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 44 | "run-parallel": "run-parallel@1.2.0" 45 | } 46 | }, 47 | "@nodelib/fs.stat@2.0.5": { 48 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 49 | "dependencies": {} 50 | }, 51 | "@nodelib/fs.walk@1.2.8": { 52 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 53 | "dependencies": { 54 | "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", 55 | "fastq": "fastq@1.16.0" 56 | } 57 | }, 58 | "@ts-morph/common@0.22.0": { 59 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 60 | "dependencies": { 61 | "fast-glob": "fast-glob@3.3.2", 62 | "minimatch": "minimatch@9.0.3", 63 | "mkdirp": "mkdirp@3.0.1", 64 | "path-browserify": "path-browserify@1.0.1" 65 | } 66 | }, 67 | "balanced-match@1.0.2": { 68 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 69 | "dependencies": {} 70 | }, 71 | "brace-expansion@2.0.1": { 72 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 73 | "dependencies": { 74 | "balanced-match": "balanced-match@1.0.2" 75 | } 76 | }, 77 | "braces@3.0.2": { 78 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 79 | "dependencies": { 80 | "fill-range": "fill-range@7.0.1" 81 | } 82 | }, 83 | "code-block-writer@12.0.0": { 84 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", 85 | "dependencies": {} 86 | }, 87 | "fast-glob@3.3.2": { 88 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 89 | "dependencies": { 90 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 91 | "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", 92 | "glob-parent": "glob-parent@5.1.2", 93 | "merge2": "merge2@1.4.1", 94 | "micromatch": "micromatch@4.0.5" 95 | } 96 | }, 97 | "fastq@1.16.0": { 98 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 99 | "dependencies": { 100 | "reusify": "reusify@1.0.4" 101 | } 102 | }, 103 | "fill-range@7.0.1": { 104 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 105 | "dependencies": { 106 | "to-regex-range": "to-regex-range@5.0.1" 107 | } 108 | }, 109 | "glob-parent@5.1.2": { 110 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 111 | "dependencies": { 112 | "is-glob": "is-glob@4.0.3" 113 | } 114 | }, 115 | "is-extglob@2.1.1": { 116 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 117 | "dependencies": {} 118 | }, 119 | "is-glob@4.0.3": { 120 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 121 | "dependencies": { 122 | "is-extglob": "is-extglob@2.1.1" 123 | } 124 | }, 125 | "is-number@7.0.0": { 126 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 127 | "dependencies": {} 128 | }, 129 | "merge2@1.4.1": { 130 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 131 | "dependencies": {} 132 | }, 133 | "micromatch@4.0.5": { 134 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 135 | "dependencies": { 136 | "braces": "braces@3.0.2", 137 | "picomatch": "picomatch@2.3.1" 138 | } 139 | }, 140 | "minimatch@9.0.3": { 141 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 142 | "dependencies": { 143 | "brace-expansion": "brace-expansion@2.0.1" 144 | } 145 | }, 146 | "mkdirp@3.0.1": { 147 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 148 | "dependencies": {} 149 | }, 150 | "path-browserify@1.0.1": { 151 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 152 | "dependencies": {} 153 | }, 154 | "picomatch@2.3.1": { 155 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 156 | "dependencies": {} 157 | }, 158 | "queue-microtask@1.2.3": { 159 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 160 | "dependencies": {} 161 | }, 162 | "reusify@1.0.4": { 163 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 164 | "dependencies": {} 165 | }, 166 | "run-parallel@1.2.0": { 167 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 168 | "dependencies": { 169 | "queue-microtask": "queue-microtask@1.2.3" 170 | } 171 | }, 172 | "to-regex-range@5.0.1": { 173 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 174 | "dependencies": { 175 | "is-number": "is-number@7.0.0" 176 | } 177 | }, 178 | "ts-morph@21.0.1": { 179 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 180 | "dependencies": { 181 | "@ts-morph/common": "@ts-morph/common@0.22.0", 182 | "code-block-writer": "code-block-writer@12.0.0" 183 | } 184 | } 185 | } 186 | }, 187 | "remote": { 188 | }, 189 | "workspace": { 190 | "dependencies": [ 191 | "jsr:@scope/package_a" 192 | ], 193 | "packageJson": { 194 | "dependencies": [ 195 | "npm:ts-morph" 196 | ] 197 | } 198 | } 199 | } 200 | 201 | # no deno.json 202 | { 203 | "packageJson": { 204 | "dependencies": [ 205 | "npm:ts-morph" 206 | ] 207 | } 208 | } 209 | 210 | # will remove the deno.json deps 211 | { 212 | "version": "5", 213 | "specifiers": { 214 | "jsr:@scope/package_orphan@*": "0.0.1", 215 | "npm:ts-morph@*": "21.0.1" 216 | }, 217 | "jsr": { 218 | "@scope/package_orphan@0.0.1": { 219 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 220 | } 221 | }, 222 | "npm": { 223 | "@example/orphan@0.0.1": { 224 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 225 | }, 226 | "@nodelib/fs.scandir@2.1.5": { 227 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 228 | "dependencies": [ 229 | "@nodelib/fs.stat", 230 | "run-parallel" 231 | ] 232 | }, 233 | "@nodelib/fs.stat@2.0.5": { 234 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 235 | }, 236 | "@nodelib/fs.walk@1.2.8": { 237 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 238 | "dependencies": [ 239 | "@nodelib/fs.scandir", 240 | "fastq" 241 | ] 242 | }, 243 | "@ts-morph/common@0.22.0": { 244 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 245 | "dependencies": [ 246 | "fast-glob", 247 | "minimatch", 248 | "mkdirp", 249 | "path-browserify" 250 | ] 251 | }, 252 | "balanced-match@1.0.2": { 253 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 254 | }, 255 | "brace-expansion@2.0.1": { 256 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 257 | "dependencies": [ 258 | "balanced-match" 259 | ] 260 | }, 261 | "braces@3.0.2": { 262 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 263 | "dependencies": [ 264 | "fill-range" 265 | ] 266 | }, 267 | "code-block-writer@12.0.0": { 268 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 269 | }, 270 | "fast-glob@3.3.2": { 271 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 272 | "dependencies": [ 273 | "@nodelib/fs.stat", 274 | "@nodelib/fs.walk", 275 | "glob-parent", 276 | "merge2", 277 | "micromatch" 278 | ] 279 | }, 280 | "fastq@1.16.0": { 281 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 282 | "dependencies": [ 283 | "reusify" 284 | ] 285 | }, 286 | "fill-range@7.0.1": { 287 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 288 | "dependencies": [ 289 | "to-regex-range" 290 | ] 291 | }, 292 | "glob-parent@5.1.2": { 293 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 294 | "dependencies": [ 295 | "is-glob" 296 | ] 297 | }, 298 | "is-extglob@2.1.1": { 299 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 300 | }, 301 | "is-glob@4.0.3": { 302 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 303 | "dependencies": [ 304 | "is-extglob" 305 | ] 306 | }, 307 | "is-number@7.0.0": { 308 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 309 | }, 310 | "merge2@1.4.1": { 311 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 312 | }, 313 | "micromatch@4.0.5": { 314 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 315 | "dependencies": [ 316 | "braces", 317 | "picomatch" 318 | ] 319 | }, 320 | "minimatch@9.0.3": { 321 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 322 | "dependencies": [ 323 | "brace-expansion" 324 | ] 325 | }, 326 | "mkdirp@3.0.1": { 327 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 328 | }, 329 | "path-browserify@1.0.1": { 330 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 331 | }, 332 | "picomatch@2.3.1": { 333 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 334 | }, 335 | "queue-microtask@1.2.3": { 336 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 337 | }, 338 | "reusify@1.0.4": { 339 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 340 | }, 341 | "run-parallel@1.2.0": { 342 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 343 | "dependencies": [ 344 | "queue-microtask" 345 | ] 346 | }, 347 | "to-regex-range@5.0.1": { 348 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 349 | "dependencies": [ 350 | "is-number" 351 | ] 352 | }, 353 | "ts-morph@21.0.1": { 354 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 355 | "dependencies": [ 356 | "@ts-morph/common", 357 | "code-block-writer" 358 | ] 359 | } 360 | }, 361 | "workspace": { 362 | "packageJson": { 363 | "dependencies": [ 364 | "npm:ts-morph@*" 365 | ] 366 | } 367 | } 368 | } 369 | -------------------------------------------------------------------------------- /tests/spec_test.rs: -------------------------------------------------------------------------------- 1 | // Copyright 2018-2024 the Deno authors. MIT license. 2 | 3 | use std::cell::RefCell; 4 | use std::collections::BTreeMap; 5 | use std::collections::BTreeSet; 6 | use std::collections::HashMap; 7 | use std::future::Future; 8 | use std::panic::AssertUnwindSafe; 9 | use std::panic::UnwindSafe; 10 | use std::path::PathBuf; 11 | 12 | use deno_lockfile::Lockfile; 13 | use deno_lockfile::Lockfile5NpmInfo; 14 | use deno_lockfile::LockfileLinkContent; 15 | use deno_lockfile::NewLockfileOptions; 16 | use deno_lockfile::NpmPackageInfoProvider; 17 | use deno_lockfile::PackagesContent; 18 | use deno_lockfile::SetWorkspaceConfigOptions; 19 | use deno_lockfile::WorkspaceConfig; 20 | use deno_lockfile::WorkspaceMemberConfig; 21 | use deno_semver::jsr::JsrDepPackageReq; 22 | use deno_semver::package::PackageNv; 23 | use file_test_runner::RunOptions; 24 | use file_test_runner::SubTestResult; 25 | use file_test_runner::TestResult; 26 | use file_test_runner::collect_and_run_tests; 27 | use file_test_runner::collection::CollectOptions; 28 | use file_test_runner::collection::CollectedTest; 29 | use file_test_runner::collection::strategies::TestPerFileCollectionStrategy; 30 | use helpers::ConfigChangeSpec; 31 | use helpers::SpecSection; 32 | use pretty_assertions::assert_eq; 33 | use serde::Deserialize; 34 | use serde::Serialize; 35 | 36 | mod helpers; 37 | 38 | fn main() { 39 | collect_and_run_tests( 40 | CollectOptions { 41 | base: "tests/specs".into(), 42 | strategy: Box::::default(), 43 | filter_override: None, 44 | }, 45 | RunOptions { parallel: true }, 46 | run_test, 47 | ) 48 | } 49 | 50 | fn run_test(test: &CollectedTest) -> TestResult { 51 | TestResult::from_maybe_panic_or_result(AssertUnwindSafe(|| { 52 | futures_lite::future::block_on(async_executor::Executor::new().run( 53 | async move { 54 | if test.name.starts_with("specs::config_changes::") { 55 | config_changes_test(test).await; 56 | TestResult::Passed 57 | } else if test.name.starts_with("specs::transforms::") { 58 | transforms_test(test).await 59 | } else { 60 | panic!("Unknown test: {}", test.name); 61 | } 62 | }, 63 | )) 64 | })) 65 | } 66 | 67 | fn from_maybe_panic_async( 68 | f: impl Future + UnwindSafe, 69 | ) -> TestResult { 70 | TestResult::from_maybe_panic(|| { 71 | futures_lite::future::block_on(async_executor::Executor::new().run(f)); 72 | }) 73 | } 74 | 75 | async fn config_changes_test(test: &CollectedTest) { 76 | #[derive(Debug, Default, Clone, Serialize, Deserialize, Hash)] 77 | #[serde(rename_all = "camelCase")] 78 | struct LockfilePackageJsonContent { 79 | #[serde(default)] 80 | dependencies: BTreeSet, 81 | } 82 | 83 | #[derive(Debug, Default, Clone, Deserialize, Hash)] 84 | #[serde(rename_all = "camelCase")] 85 | struct WorkspaceMemberConfigContent { 86 | #[serde(default)] 87 | dependencies: BTreeSet, 88 | #[serde(default)] 89 | package_json: LockfilePackageJsonContent, 90 | } 91 | 92 | #[derive(Debug, Default, Clone, Deserialize, Hash)] 93 | #[serde(rename_all = "camelCase")] 94 | struct LinkConfigContent { 95 | #[serde(default)] 96 | dependencies: BTreeSet, 97 | #[serde(default)] 98 | optional_dependencies: BTreeSet, 99 | #[serde(default)] 100 | peer_dependencies: BTreeSet, 101 | #[serde(default)] 102 | peer_dependencies_meta: BTreeMap, 103 | } 104 | 105 | #[derive(Debug, Default, Clone, Serialize, Deserialize, Hash)] 106 | #[serde(rename_all = "camelCase")] 107 | struct PeerDependenciesMetaValue { 108 | optional: bool, 109 | } 110 | 111 | #[derive(Debug, Default, Clone, Deserialize, Hash)] 112 | #[serde(rename_all = "camelCase")] 113 | struct WorkspaceConfigContent { 114 | #[serde(default, flatten)] 115 | root: WorkspaceMemberConfigContent, 116 | #[serde(skip_serializing_if = "BTreeMap::is_empty")] 117 | #[serde(default)] 118 | members: BTreeMap, 119 | #[serde(skip_serializing_if = "BTreeMap::is_empty")] 120 | #[serde(default)] 121 | links: BTreeMap, 122 | } 123 | 124 | impl WorkspaceConfigContent { 125 | fn into_workspace_config(self) -> WorkspaceConfig { 126 | WorkspaceConfig { 127 | root: WorkspaceMemberConfig { 128 | dependencies: self.root.dependencies.into_iter().collect(), 129 | package_json_deps: self 130 | .root 131 | .package_json 132 | .dependencies 133 | .into_iter() 134 | .collect(), 135 | }, 136 | members: self 137 | .members 138 | .into_iter() 139 | .map(|(k, v)| { 140 | ( 141 | k, 142 | WorkspaceMemberConfig { 143 | dependencies: v.dependencies.into_iter().collect(), 144 | package_json_deps: v 145 | .package_json 146 | .dependencies 147 | .into_iter() 148 | .collect(), 149 | }, 150 | ) 151 | }) 152 | .collect(), 153 | links: self 154 | .links 155 | .into_iter() 156 | .map(|(k, v)| { 157 | ( 158 | k, 159 | LockfileLinkContent { 160 | dependencies: v.dependencies.into_iter().collect(), 161 | optional_dependencies: v 162 | .optional_dependencies 163 | .into_iter() 164 | .collect(), 165 | peer_dependencies: v.peer_dependencies.into_iter().collect(), 166 | peer_dependencies_meta: v 167 | .peer_dependencies_meta 168 | .into_iter() 169 | .map(|(k, v)| (k, serde_json::to_value(v).unwrap())) 170 | .collect(), 171 | }, 172 | ) 173 | }) 174 | .collect(), 175 | } 176 | } 177 | } 178 | 179 | let is_update = std::env::var("UPDATE") == Ok("1".to_string()); 180 | let mut spec = ConfigChangeSpec::parse(&test.read_to_string().unwrap()); 181 | let mut lockfile = Lockfile::new( 182 | NewLockfileOptions { 183 | file_path: test.path.with_extension("lock"), 184 | content: &spec.original_text.text, 185 | overwrite: false, 186 | }, 187 | &TestNpmPackageInfoProvider::default(), 188 | ) 189 | .await 190 | .unwrap(); 191 | for change_and_output in &mut spec.change_and_outputs { 192 | // setting the new workspace config should change the has_content_changed flag 193 | lockfile.has_content_changed = false; 194 | let config = serde_json::from_str::( 195 | &change_and_output.change.text, 196 | ) 197 | .unwrap() 198 | .into_workspace_config(); 199 | let no_npm = change_and_output.change.title.contains("--no-npm"); 200 | let no_config = change_and_output.change.title.contains("--no-config"); 201 | lockfile.set_workspace_config(SetWorkspaceConfigOptions { 202 | no_config, 203 | no_npm, 204 | config: config.clone(), 205 | }); 206 | assert_eq!( 207 | lockfile.has_content_changed, 208 | !change_and_output.change.title.contains("no change"), 209 | "Failed for {}", 210 | change_and_output.change.title, 211 | ); 212 | 213 | // now try resetting it and the flag should remain the same 214 | lockfile.has_content_changed = false; 215 | lockfile.set_workspace_config(SetWorkspaceConfigOptions { 216 | no_config, 217 | no_npm, 218 | config: config.clone(), 219 | }); 220 | assert!(!lockfile.has_content_changed); 221 | 222 | let expected_text = change_and_output.output.text.clone(); 223 | let actual_text = lockfile.as_json_string(); 224 | if is_update { 225 | change_and_output.output.text = actual_text; 226 | } else { 227 | assert_eq!( 228 | actual_text.trim(), 229 | expected_text.trim(), 230 | "Failed for: {}", 231 | change_and_output.change.title, 232 | ); 233 | } 234 | verify_packages_content(&lockfile.content.packages); 235 | } 236 | if is_update { 237 | std::fs::write(&test.path, spec.emit()).unwrap(); 238 | } 239 | } 240 | 241 | struct TestNpmPackageInfoProvider { 242 | cache: RefCell>, 243 | } 244 | 245 | impl Default for TestNpmPackageInfoProvider { 246 | fn default() -> Self { 247 | Self { 248 | cache: RefCell::new(HashMap::new()), 249 | } 250 | } 251 | } 252 | 253 | #[derive(Debug, Clone, Serialize, Deserialize)] 254 | struct Dist { 255 | tarball: String, 256 | } 257 | 258 | #[derive(Debug, Clone, Serialize, Deserialize)] 259 | #[serde(rename_all = "camelCase")] 260 | struct VersionInfo { 261 | dist: Dist, 262 | #[serde(default)] 263 | cpu: Vec, 264 | #[serde(default)] 265 | os: Vec, 266 | #[serde(default)] 267 | optional_dependencies: HashMap, 268 | } 269 | 270 | #[derive(Debug, Clone, Serialize, Deserialize)] 271 | #[serde(rename_all = "camelCase")] 272 | struct PackageInfo { 273 | versions: HashMap, 274 | #[serde(rename = "dist-tags")] 275 | dist_tags: HashMap, 276 | } 277 | 278 | #[async_trait::async_trait(?Send)] 279 | impl NpmPackageInfoProvider for TestNpmPackageInfoProvider { 280 | async fn get_npm_package_info( 281 | &self, 282 | packages: &[PackageNv], 283 | ) -> Result, Box> 284 | { 285 | let mut infos = Vec::with_capacity(packages.len()); 286 | for package in packages { 287 | let info = { self.cache.borrow().get(package).cloned() }; 288 | if let Some(info) = info { 289 | infos.push(info); 290 | } else { 291 | let path = package_file_path(package); 292 | if path.exists() { 293 | let text = std::fs::read_to_string(path).unwrap(); 294 | let info: Lockfile5NpmInfo = serde_json::from_str(&text).unwrap(); 295 | self 296 | .cache 297 | .borrow_mut() 298 | .insert(package.clone(), info.clone()); 299 | infos.push(info); 300 | } else { 301 | infos.push(Default::default()); 302 | } 303 | } 304 | } 305 | Ok(infos) 306 | } 307 | } 308 | 309 | fn package_file_path(package: &PackageNv) -> PathBuf { 310 | PathBuf::from(env!("CARGO_MANIFEST_DIR")) 311 | .join("tests/registry_data/") 312 | .join(package_file_name(package)) 313 | } 314 | 315 | fn package_file_name(package: &PackageNv) -> String { 316 | format!( 317 | "{}@{}.json", 318 | package.name.replace("/", "__"), 319 | package.version 320 | ) 321 | } 322 | 323 | async fn transforms_test(test: &CollectedTest) -> TestResult { 324 | let text = test.read_to_string().unwrap(); 325 | let mut sections = SpecSection::parse_many(&text); 326 | assert_eq!(sections.len(), 2); 327 | let original_section = sections.remove(0); 328 | let mut expected_section = sections.remove(0); 329 | let lockfile = Lockfile::new( 330 | NewLockfileOptions { 331 | file_path: test.path.with_extension("lock"), 332 | content: &original_section.text, 333 | overwrite: false, 334 | }, 335 | &TestNpmPackageInfoProvider::default(), 336 | ) 337 | .await 338 | .unwrap(); 339 | let actual_text = lockfile.as_json_string(); 340 | let is_update = std::env::var("UPDATE") == Ok("1".to_string()); 341 | if is_update { 342 | expected_section.text = actual_text; 343 | std::fs::write( 344 | &test.path, 345 | format!("{}{}", original_section.emit(), expected_section.emit()), 346 | ) 347 | .unwrap(); 348 | TestResult::Passed 349 | } else { 350 | let mut sub_tests = Vec::with_capacity(2); 351 | sub_tests.push(SubTestResult { 352 | name: "v4_upgrade".to_string(), 353 | result: TestResult::from_maybe_panic(|| { 354 | assert_eq!(actual_text.trim(), expected_section.text.trim()); 355 | }), 356 | }); 357 | // now try parsing the lockfile v4 output, then reserialize it and ensure it matches 358 | sub_tests.push(SubTestResult { 359 | name: "v4_reparse_and_emit".to_string(), 360 | result: from_maybe_panic_async(AssertUnwindSafe(async { 361 | let lockfile: Lockfile = Lockfile::new( 362 | NewLockfileOptions { 363 | file_path: test.path.with_extension("lock"), 364 | content: &actual_text, 365 | overwrite: false, 366 | }, 367 | &TestNpmPackageInfoProvider::default(), 368 | ) 369 | .await 370 | .unwrap(); 371 | assert_eq!(lockfile.as_json_string().trim(), actual_text.trim()); 372 | })), 373 | }); 374 | TestResult::SubTests(sub_tests) 375 | } 376 | } 377 | 378 | fn verify_packages_content(packages: &PackagesContent) { 379 | // verify the specifiers 380 | for (req, id_suffix_or_nv) in &packages.specifiers { 381 | let id = format!( 382 | "{}{}@{}", 383 | req.kind.scheme_with_colon(), 384 | req.req.name, 385 | id_suffix_or_nv 386 | ); 387 | if let Some(npm_id) = id.strip_prefix("npm:") { 388 | assert!(packages.npm.contains_key(npm_id), "Missing: {}", id); 389 | } else if let Some(jsr_nv) = id.strip_prefix("jsr:") { 390 | let nv = PackageNv::from_str(jsr_nv).unwrap(); 391 | assert!(packages.jsr.contains_key(&nv), "Missing: {}", id); 392 | } else { 393 | panic!("Invalid package id: {}", id); 394 | } 395 | } 396 | for (pkg_id, package) in &packages.npm { 397 | for dep_id in package.dependencies.values() { 398 | assert!( 399 | packages.npm.contains_key(dep_id), 400 | "Missing '{}' dep in '{}'", 401 | dep_id, 402 | pkg_id, 403 | ); 404 | } 405 | } 406 | for (pkg_id, package) in &packages.jsr { 407 | for req in &package.dependencies { 408 | let Some((req, id_suffix_or_nv)) = packages.specifiers.get_key_value(req) 409 | else { 410 | panic!("Missing specifier for '{}' in '{}'", req, pkg_id); 411 | }; 412 | let dep_id = format!( 413 | "{}{}@{}", 414 | req.kind.scheme_with_colon(), 415 | req.req.name, 416 | id_suffix_or_nv 417 | ); 418 | if let Some(npm_id) = dep_id.strip_prefix("npm:") { 419 | assert!( 420 | packages.npm.contains_key(npm_id), 421 | "Missing: '{}' dep in '{}'", 422 | dep_id, 423 | pkg_id, 424 | ); 425 | } else if let Some(jsr_nv) = dep_id.strip_prefix("jsr:") { 426 | let nv = PackageNv::from_str(jsr_nv).unwrap(); 427 | assert!( 428 | packages.jsr.contains_key(&nv), 429 | "Missing: '{}' dep in '{}'", 430 | dep_id, 431 | pkg_id, 432 | ); 433 | } else { 434 | panic!("Invalid package id: {}", dep_id); 435 | } 436 | } 437 | } 438 | } 439 | -------------------------------------------------------------------------------- /tests/specs/config_changes/RemovedPackageJsonRemoves.txt: -------------------------------------------------------------------------------- 1 | # original 2 | { 3 | "version": "3", 4 | "packages": { 5 | "specifiers": { 6 | "jsr:@scope/package_a": "jsr:@scope/package_a@0.0.1", 7 | "jsr:@scope/package_b": "jsr:@scope/package_b@0.0.1", 8 | "jsr:@scope/package_c": "jsr:@scope/package_c@0.0.1", 9 | "jsr:@scope/package_orphan": "jsr:@scope/package_orphan@0.0.1", 10 | "npm:ts-morph": "npm:ts-morph@21.0.1" 11 | }, 12 | "jsr": { 13 | "@scope/package_a@0.0.1": { 14 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 15 | "dependencies": [ 16 | "jsr:@scope/package_b" 17 | ] 18 | }, 19 | "@scope/package_b@0.0.1": { 20 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 21 | "dependencies": [ 22 | "jsr:@scope/package_c" 23 | ] 24 | }, 25 | "@scope/package_c@0.0.1": { 26 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 27 | "dependencies": [ 28 | "jsr:@scope/package_a" 29 | ] 30 | }, 31 | "@scope/package_orphan@0.0.1": { 32 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 33 | } 34 | }, 35 | "npm": { 36 | "@example/orphan@0.0.1": { 37 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 38 | "dependencies": {} 39 | }, 40 | "@nodelib/fs.scandir@2.1.5": { 41 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 42 | "dependencies": { 43 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 44 | "run-parallel": "run-parallel@1.2.0" 45 | } 46 | }, 47 | "@nodelib/fs.stat@2.0.5": { 48 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 49 | "dependencies": {} 50 | }, 51 | "@nodelib/fs.walk@1.2.8": { 52 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 53 | "dependencies": { 54 | "@nodelib/fs.scandir": "@nodelib/fs.scandir@2.1.5", 55 | "fastq": "fastq@1.16.0" 56 | } 57 | }, 58 | "@ts-morph/common@0.22.0": { 59 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 60 | "dependencies": { 61 | "fast-glob": "fast-glob@3.3.2", 62 | "minimatch": "minimatch@9.0.3", 63 | "mkdirp": "mkdirp@3.0.1", 64 | "path-browserify": "path-browserify@1.0.1" 65 | } 66 | }, 67 | "balanced-match@1.0.2": { 68 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 69 | "dependencies": {} 70 | }, 71 | "brace-expansion@2.0.1": { 72 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 73 | "dependencies": { 74 | "balanced-match": "balanced-match@1.0.2" 75 | } 76 | }, 77 | "braces@3.0.2": { 78 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 79 | "dependencies": { 80 | "fill-range": "fill-range@7.0.1" 81 | } 82 | }, 83 | "code-block-writer@12.0.0": { 84 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==", 85 | "dependencies": {} 86 | }, 87 | "fast-glob@3.3.2": { 88 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 89 | "dependencies": { 90 | "@nodelib/fs.stat": "@nodelib/fs.stat@2.0.5", 91 | "@nodelib/fs.walk": "@nodelib/fs.walk@1.2.8", 92 | "glob-parent": "glob-parent@5.1.2", 93 | "merge2": "merge2@1.4.1", 94 | "micromatch": "micromatch@4.0.5" 95 | } 96 | }, 97 | "fastq@1.16.0": { 98 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 99 | "dependencies": { 100 | "reusify": "reusify@1.0.4" 101 | } 102 | }, 103 | "fill-range@7.0.1": { 104 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 105 | "dependencies": { 106 | "to-regex-range": "to-regex-range@5.0.1" 107 | } 108 | }, 109 | "glob-parent@5.1.2": { 110 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 111 | "dependencies": { 112 | "is-glob": "is-glob@4.0.3" 113 | } 114 | }, 115 | "is-extglob@2.1.1": { 116 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 117 | "dependencies": {} 118 | }, 119 | "is-glob@4.0.3": { 120 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 121 | "dependencies": { 122 | "is-extglob": "is-extglob@2.1.1" 123 | } 124 | }, 125 | "is-number@7.0.0": { 126 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 127 | "dependencies": {} 128 | }, 129 | "merge2@1.4.1": { 130 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 131 | "dependencies": {} 132 | }, 133 | "micromatch@4.0.5": { 134 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 135 | "dependencies": { 136 | "braces": "braces@3.0.2", 137 | "picomatch": "picomatch@2.3.1" 138 | } 139 | }, 140 | "minimatch@9.0.3": { 141 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 142 | "dependencies": { 143 | "brace-expansion": "brace-expansion@2.0.1" 144 | } 145 | }, 146 | "mkdirp@3.0.1": { 147 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", 148 | "dependencies": {} 149 | }, 150 | "path-browserify@1.0.1": { 151 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 152 | "dependencies": {} 153 | }, 154 | "picomatch@2.3.1": { 155 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 156 | "dependencies": {} 157 | }, 158 | "queue-microtask@1.2.3": { 159 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 160 | "dependencies": {} 161 | }, 162 | "reusify@1.0.4": { 163 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 164 | "dependencies": {} 165 | }, 166 | "run-parallel@1.2.0": { 167 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 168 | "dependencies": { 169 | "queue-microtask": "queue-microtask@1.2.3" 170 | } 171 | }, 172 | "to-regex-range@5.0.1": { 173 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 174 | "dependencies": { 175 | "is-number": "is-number@7.0.0" 176 | } 177 | }, 178 | "ts-morph@21.0.1": { 179 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 180 | "dependencies": { 181 | "@ts-morph/common": "@ts-morph/common@0.22.0", 182 | "code-block-writer": "code-block-writer@12.0.0" 183 | } 184 | } 185 | } 186 | }, 187 | "remote": { 188 | }, 189 | "workspace": { 190 | "dependencies": [ 191 | "jsr:@scope/package_a" 192 | ], 193 | "packageJson": { 194 | "dependencies": [ 195 | "npm:ts-morph" 196 | ] 197 | } 198 | } 199 | } 200 | 201 | # no package.json 202 | { 203 | "dependencies": [ 204 | "jsr:@scope/package_a" 205 | ] 206 | } 207 | 208 | # will remove the package.json deps 209 | { 210 | "version": "5", 211 | "specifiers": { 212 | "jsr:@scope/package_a@*": "0.0.1", 213 | "jsr:@scope/package_b@*": "0.0.1", 214 | "jsr:@scope/package_c@*": "0.0.1", 215 | "jsr:@scope/package_orphan@*": "0.0.1" 216 | }, 217 | "jsr": { 218 | "@scope/package_a@0.0.1": { 219 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 220 | "dependencies": [ 221 | "jsr:@scope/package_b" 222 | ] 223 | }, 224 | "@scope/package_b@0.0.1": { 225 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 226 | "dependencies": [ 227 | "jsr:@scope/package_c" 228 | ] 229 | }, 230 | "@scope/package_c@0.0.1": { 231 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045", 232 | "dependencies": [ 233 | "jsr:@scope/package_a" 234 | ] 235 | }, 236 | "@scope/package_orphan@0.0.1": { 237 | "integrity": "09154a97e18c4d6a1692e3b3c8a3b1ec2934f00b7c1caf7491d762d963ada045" 238 | } 239 | }, 240 | "npm": { 241 | "@example/orphan@0.0.1": { 242 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==" 243 | }, 244 | "@nodelib/fs.scandir@2.1.5": { 245 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 246 | "dependencies": [ 247 | "@nodelib/fs.stat", 248 | "run-parallel" 249 | ] 250 | }, 251 | "@nodelib/fs.stat@2.0.5": { 252 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" 253 | }, 254 | "@nodelib/fs.walk@1.2.8": { 255 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 256 | "dependencies": [ 257 | "@nodelib/fs.scandir", 258 | "fastq" 259 | ] 260 | }, 261 | "@ts-morph/common@0.22.0": { 262 | "integrity": "sha512-HqNBuV/oIlMKdkLshXd1zKBqNQCsuPEsgQOkfFQ/eUKjRlwndXW1AjN9LVkBEIukm00gGXSRmfkl0Wv5VXLnlw==", 263 | "dependencies": [ 264 | "fast-glob", 265 | "minimatch", 266 | "mkdirp", 267 | "path-browserify" 268 | ] 269 | }, 270 | "balanced-match@1.0.2": { 271 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 272 | }, 273 | "brace-expansion@2.0.1": { 274 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 275 | "dependencies": [ 276 | "balanced-match" 277 | ] 278 | }, 279 | "braces@3.0.2": { 280 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 281 | "dependencies": [ 282 | "fill-range" 283 | ] 284 | }, 285 | "code-block-writer@12.0.0": { 286 | "integrity": "sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==" 287 | }, 288 | "fast-glob@3.3.2": { 289 | "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", 290 | "dependencies": [ 291 | "@nodelib/fs.stat", 292 | "@nodelib/fs.walk", 293 | "glob-parent", 294 | "merge2", 295 | "micromatch" 296 | ] 297 | }, 298 | "fastq@1.16.0": { 299 | "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==", 300 | "dependencies": [ 301 | "reusify" 302 | ] 303 | }, 304 | "fill-range@7.0.1": { 305 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 306 | "dependencies": [ 307 | "to-regex-range" 308 | ] 309 | }, 310 | "glob-parent@5.1.2": { 311 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 312 | "dependencies": [ 313 | "is-glob" 314 | ] 315 | }, 316 | "is-extglob@2.1.1": { 317 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" 318 | }, 319 | "is-glob@4.0.3": { 320 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 321 | "dependencies": [ 322 | "is-extglob" 323 | ] 324 | }, 325 | "is-number@7.0.0": { 326 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" 327 | }, 328 | "merge2@1.4.1": { 329 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" 330 | }, 331 | "micromatch@4.0.5": { 332 | "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", 333 | "dependencies": [ 334 | "braces", 335 | "picomatch" 336 | ] 337 | }, 338 | "minimatch@9.0.3": { 339 | "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", 340 | "dependencies": [ 341 | "brace-expansion" 342 | ] 343 | }, 344 | "mkdirp@3.0.1": { 345 | "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==" 346 | }, 347 | "path-browserify@1.0.1": { 348 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" 349 | }, 350 | "picomatch@2.3.1": { 351 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" 352 | }, 353 | "queue-microtask@1.2.3": { 354 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" 355 | }, 356 | "reusify@1.0.4": { 357 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" 358 | }, 359 | "run-parallel@1.2.0": { 360 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 361 | "dependencies": [ 362 | "queue-microtask" 363 | ] 364 | }, 365 | "to-regex-range@5.0.1": { 366 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 367 | "dependencies": [ 368 | "is-number" 369 | ] 370 | }, 371 | "ts-morph@21.0.1": { 372 | "integrity": "sha512-dbDtVdEAncKctzrVZ+Nr7kHpHkv+0JDJb2MjjpBaj8bFeCkePU9rHfMklmhuLFnpeq/EJZk2IhStY6NzqgjOkg==", 373 | "dependencies": [ 374 | "@ts-morph/common", 375 | "code-block-writer" 376 | ] 377 | } 378 | }, 379 | "workspace": { 380 | "dependencies": [ 381 | "jsr:@scope/package_a@*" 382 | ] 383 | } 384 | } 385 | --------------------------------------------------------------------------------