diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 4dd1639..7f7fcbd 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -55,12 +55,12 @@ jobs: GITHUB_TOKEN: ${{ secrets.REPO_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - - name: Release to @dev tag + - name: Release to @next tag if: steps.changesets.outputs.published != 'true' run: | git checkout main - pnpm changeset version --snapshot dev - pnpm changeset publish --tag dev + pnpm changeset version --snapshot next + pnpm changeset publish --tag next env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/unpublish-npm.yaml b/.github/workflows/unpublish-npm.yaml new file mode 100644 index 0000000..b03ab1d --- /dev/null +++ b/.github/workflows/unpublish-npm.yaml @@ -0,0 +1,28 @@ +name: "Unpublish old versions" + +on: + workflow_dispatch: + inputs: + delete_packages: + type: boolean + description: Delete packages? otherwise dry-run mode will be used + default: false + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + clean-npm-versions: + name: Unpublish versions next, preview, main... + runs-on: buildjet-4vcpu-ubuntu-2204 + steps: + - uses: actions/checkout@v3 + - uses: FuelLabs/github-actions/setups/node@master + - uses: FuelLabs/github-actions/setups/npm@master + with: + npm-token: ${{ secrets.NPM_TOKEN }} + - run: | + node ./scripts/unpublish.js + env: + DELETE_PACKAGES: ${{ github.event.inputs.delete_packages }} diff --git a/package.json b/package.json index 57419a1..88fd0d2 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@types/react": "^18.2.21", "@types/react-dom": "^18.2.7", "@xstate/cli": "^0.5.2", + "compare-versions": "6.1.0", "dotenv": "^16.3.1", "eslint": "^8.48.0", "husky": "^8.0.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b360eb9..d7c558b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -48,6 +48,9 @@ importers: '@xstate/cli': specifier: ^0.5.2 version: 0.5.2 + compare-versions: + specifier: 6.1.0 + version: 6.1.0 dotenv: specifier: ^16.3.1 version: 16.3.1 @@ -262,7 +265,7 @@ importers: dependencies: '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21) + version: 1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) events: specifier: ^3.3.0 version: 3.3.0 @@ -278,7 +281,7 @@ importers: version: link:../tsup-config '@tanstack/react-query': specifier: 5.28.4 - version: 5.28.4 + version: 5.28.4(react@18.2.0) compare-versions: specifier: ^6.1.0 version: 6.1.0 @@ -287,7 +290,7 @@ importers: version: 0.74.0(dexie@3.2.6) styled-components: specifier: ^6.1.1 - version: 6.1.8 + version: 6.1.8(react@18.2.0) tsup: specifier: ^7.2.0 version: 7.2.0(ts-node@10.9.1)(typescript@5.4.2) @@ -2146,7 +2149,7 @@ packages: '@babel/runtime': 7.22.5 dev: false - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -2159,9 +2162,10 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.1(@types/react@18.2.21): + /@radix-ui/react-context@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -2174,9 +2178,10 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21): + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -2195,24 +2200,25 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 aria-hidden: 1.2.3 - react-remove-scroll: 2.5.5(@types/react@18.2.21) + react: 18.2.0 + react-remove-scroll: 2.5.5(@types/react@18.2.21)(react@18.2.0) dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -2231,15 +2237,16 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 + react: 18.2.0 dev: false - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -2252,9 +2259,10 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -2272,14 +2280,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 + react: 18.2.0 dev: false - /@radix-ui/react-id@1.0.1(@types/react@18.2.21): + /@radix-ui/react-id@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -2291,11 +2300,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -2313,12 +2323,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 + react: 18.2.0 dev: false - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -2336,13 +2347,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 + react: 18.2.0 dev: false - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.7)(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -2360,12 +2372,13 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 '@types/react-dom': 18.2.7 + react: 18.2.0 dev: false - /@radix-ui/react-slot@1.0.2(@types/react@18.2.21): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -2377,11 +2390,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -2394,9 +2408,10 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -2408,11 +2423,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -2424,11 +2440,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.22.5 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.21)(react@18.2.0) '@types/react': 18.2.21 + react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -2441,6 +2458,7 @@ packages: dependencies: '@babel/runtime': 7.22.5 '@types/react': 18.2.21 + react: 18.2.0 dev: false /@scure/base@1.1.5: @@ -2612,7 +2630,7 @@ packages: resolution: {integrity: sha512-uQZqOFqLWUvXNIQZ63XdKzg22NtHzgCBUfDmjDHi3BoF+nUYeBNvMi/xFPtFrMhqRzG2Ir4mYaGsWZzmiEjXpA==} dev: true - /@tanstack/react-query@5.28.4: + /@tanstack/react-query@5.28.4(react@18.2.0): resolution: {integrity: sha512-BErcoB/QQG6YwLSUKnaGxF+lSc270RH2w3kMBpG0i4YzDCsFs2pdxPX1WVknQvFk9bNgukMb158hc2Zb4SdwSA==} peerDependencies: react: '*' @@ -2621,6 +2639,7 @@ packages: optional: true dependencies: '@tanstack/query-core': 5.28.4 + react: 18.2.0 dev: true /@testing-library/dom@9.3.1: @@ -7756,7 +7775,7 @@ packages: /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - /react-remove-scroll-bar@2.3.4(@types/react@18.2.21): + /react-remove-scroll-bar@2.3.4(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==} engines: {node: '>=10'} peerDependencies: @@ -7769,11 +7788,12 @@ packages: optional: true dependencies: '@types/react': 18.2.21 - react-style-singleton: 2.2.1(@types/react@18.2.21) + react: 18.2.0 + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) tslib: 2.6.0 dev: false - /react-remove-scroll@2.5.5(@types/react@18.2.21): + /react-remove-scroll@2.5.5(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -7786,14 +7806,15 @@ packages: optional: true dependencies: '@types/react': 18.2.21 - react-remove-scroll-bar: 2.3.4(@types/react@18.2.21) - react-style-singleton: 2.2.1(@types/react@18.2.21) + react: 18.2.0 + react-remove-scroll-bar: 2.3.4(@types/react@18.2.21)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.21)(react@18.2.0) tslib: 2.6.0 - use-callback-ref: 1.3.1(@types/react@18.2.21) - use-sidecar: 1.1.2(@types/react@18.2.21) + use-callback-ref: 1.3.1(@types/react@18.2.21)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.21)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.21): + /react-style-singleton@2.2.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -7808,6 +7829,7 @@ packages: '@types/react': 18.2.21 get-nonce: 1.0.1 invariant: 2.2.4 + react: 18.2.0 tslib: 2.6.0 dev: false @@ -8401,7 +8423,7 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /styled-components@6.1.8: + /styled-components@6.1.8(react@18.2.0): resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} engines: {node: '>= 16'} peerDependencies: @@ -8419,6 +8441,7 @@ packages: css-to-react-native: 3.2.0 csstype: 3.1.2 postcss: 8.4.31 + react: 18.2.0 shallowequal: 1.1.0 stylis: 4.3.1 tslib: 2.5.0 @@ -8951,7 +8974,7 @@ packages: requires-port: 1.0.0 dev: false - /use-callback-ref@1.3.1(@types/react@18.2.21): + /use-callback-ref@1.3.1(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} engines: {node: '>=10'} peerDependencies: @@ -8964,6 +8987,7 @@ packages: optional: true dependencies: '@types/react': 18.2.21 + react: 18.2.0 tslib: 2.6.0 dev: false @@ -8982,7 +9006,7 @@ packages: react: 18.2.0 dev: false - /use-sidecar@1.1.2(@types/react@18.2.21): + /use-sidecar@1.1.2(@types/react@18.2.21)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -8996,6 +9020,7 @@ packages: dependencies: '@types/react': 18.2.21 detect-node-es: 1.1.0 + react: 18.2.0 tslib: 2.6.0 dev: false diff --git a/scripts/unpublish.js b/scripts/unpublish.js new file mode 100644 index 0000000..17baf9a --- /dev/null +++ b/scripts/unpublish.js @@ -0,0 +1,88 @@ +const { readFile, readdir } = require('node:fs').promises; +const { join } = require('node:path'); +const util = require('node:util'); +const { compare } = require('compare-versions'); +const exec = util.promisify(require('node:child_process').exec); +const { version } = require('../packages/react/package.json'); + +const DELETE_TAGS = /next|dev|rc|main/; +const CURRENT_VERSION = version; +const DELETE_PACKAGES = process.env.DELETE_PACKAGES === 'true'; +const dryRun = DELETE_PACKAGES ? '' : '--dry-run'; + +async function getPublicPackages() { + const base = join(__dirname, '../packages'); + const packages = await readdir(base, { + withFileTypes: true, + }); + const packagesNames = await Promise.all( + packages.map(async (p) => { + try { + const packageContent = await readFile( + join(base, p.name, 'package.json'), + 'utf8', + ); + const pkg = JSON.parse(packageContent.toString()); + + if (pkg.private) return null; + return pkg.name; + } catch (_err) { + return null; + } + }), + ); + return packagesNames.filter((p) => !!p); +} + +async function main() { + console.log('Get public packages'); + const packages = await getPublicPackages(); + + for (const packageName of packages) { + console.log( + [ + '\n', + '##############################################', + `āž”ļø ${packageName}`, + '##############################################', + '\n', + ].join('\n'), + ); + console.log(`šŸ“¦ Fetching ${packageName} versions`); + const { versions } = await fetch( + `https://registry.npmjs.org/${packageName}`, + ).then((resp) => resp.json()); + const versionsToDelete = Object.keys(versions).filter((version) => { + // Filter all versions that have tags like next, master, preview but are not related to the current version. + // This avoids for current WIP versions to be deleted during test. + return ( + version.search(DELETE_TAGS) > -1 && + !compare(version, CURRENT_VERSION, '>=') + ); + }); + console.log('The following versions will be deleted:'); + console.log(versionsToDelete.map((v) => ` - ${v}`).join('\n')); + for (const versionDelete of versionsToDelete) { + console.log(`\nšŸ—‘ļø Deleting ${packageName}@${versionDelete}...`); + console.log(dryRun); + const { stderr } = await exec( + `npm unpublish ${packageName}@${versionDelete} ${dryRun}`, + ); + if (stderr) { + console.log(`āŒ Error ${packageName}@${versionDelete} not deleted!\n`); + console.log(stderr); + } else { + console.log(`āœ… Package ${packageName}@${versionDelete} deleted!\n`); + } + } + } +} + +main() + .then(() => { + console.log('āœ… Packages versions removed successfully'); + }) + .catch((err) => { + console.error(err); + process.exit(1); + });