diff --git a/.changeset/thick-bags-grab.md b/.changeset/thick-bags-grab.md new file mode 100644 index 000000000..5ffa2ebd8 --- /dev/null +++ b/.changeset/thick-bags-grab.md @@ -0,0 +1,5 @@ +--- +"@xata.io/cli": patch +--- + +CLI: Allow binaries to autoupdate diff --git a/.github/workflows/release-cli-assets.yml b/.github/workflows/release-cli-assets.yml index 891bd27b9..82211e164 100644 --- a/.github/workflows/release-cli-assets.yml +++ b/.github/workflows/release-cli-assets.yml @@ -7,6 +7,10 @@ on: description: 'Published packages' required: true type: string + commitSha: + description: 'Commit SHA' + required: true + type: string workflow_dispatch: inputs: publishedPackages: @@ -14,10 +18,27 @@ on: required: true default: '[{"name": "@xata.io/cli", "version": "1.2.0"}]' type: string + commitSha: + description: 'Commit SHA' + required: true + type: string + +permissions: + id-token: write + contents: write + packages: write + pages: write + pull-requests: write jobs: release-cli-assets: name: Release CLI assets + outputs: + version: ${{ steps.capture-version.outputs.version }} + mac_intel_sha: ${{steps.sha-macos.outputs.sha-macos-intel}} + mac_arm_sha: ${{ steps.sha-macos.outputs.sha-macos-arm }} + linux_sha: ${{ steps.sha-ubuntu.outputs.sha-linux }} + linux_arm_sha: ${{ steps.sha-ubuntu.outputs.sha-linux-arm }} strategy: matrix: os: [ubuntu-latest, macos-latest] @@ -81,14 +102,178 @@ jobs: sudo apt-get install -y nsis sudo apt-get install -y p7zip - - name: Release CLI Assets - run: pnpm run release:cli + - name: Configure AWS Credentials for production + uses: aws-actions/configure-aws-credentials@v4 + with: + role-to-assume: ${{ secrets.CLI_ASSETS_UPLOAD_ROLE }} + aws-region: us-east-1 + mask-aws-account-id: 'no' + + - name: Pack + run: pnpm run release:cli:pack env: PUBLISHED_PACKAGES: ${{ inputs.publishedPackages }} MATRIX_OS: ${{ matrix.os }} + + - name: Upload CLI Assets to GitHub Releases + run: pnpm run release:cli:upload:gh + env: + MATRIX_OS: ${{ matrix.os }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Debian cert + if: matrix.os == 'ubuntu-latest' + working-directory: /home/runner/work/client-ts/client-ts/cli/dist/deb + run: | + echo "$DEBIAN_GPG_KEY_PRIVATE" | gpg --import --batch --passphrase "$DEBIAN_GPG_KEY_PASS" + gpg --digest-algo SHA512 --clearsign --pinentry-mode loopback --passphrase "$DEBIAN_GPG_KEY_PASS" -u $DEBIAN_GPG_KEY_ID -o InRelease Release + gpg --digest-algo SHA512 -abs --pinentry-mode loopback --passphrase "$DEBIAN_GPG_KEY_PASS" -u $DEBIAN_GPG_KEY_ID -o Release.gpg Release + echo "Signed debian packages successfully" + echo "sha256 sums:" + sha256sum *Release* + + mkdir -p /home/runner/work/client-ts/client-ts/cli/dist/apt + echo "$DEBIAN_GPG_KEY_PUBLIC" > /home/runner/work/client-ts/client-ts/cli/dist/apt/release.key + env: + DEBIAN_GPG_KEY_PRIVATE: ${{ secrets.DEBIAN_GPG_KEY_PRIVATE }} + DEBIAN_GPG_KEY_PASS: ${{ secrets.DEBIAN_GPG_KEY_PASS }} + DEBIAN_GPG_KEY_PUBLIC: ${{ secrets.DEBIAN_GPG_KEY_PUBLIC }} + DEBIAN_GPG_KEY_ID: ${{ secrets.DEBIAN_GPG_KEY_ID }} + + - name: Capture version + id: capture-version + working-directory: ./cli + run: echo "version=$(cat package.json | jq -r '.version')" >> $GITHUB_OUTPUT + + - name: Create SHA outputs macos + if: matrix.os == 'macos-latest' + working-directory: ./cli/dist + id: sha-macos + run: | + ls -l + VER="${{steps.capture-version.outputs.version}}" + COMMITSHA="${{inputs.commitSha}}" + COM="$(echo $COMMITSHA | head -c8)" + echo "sha-macos-arm=$(shasum --algorithm 256 xata-v${VER}-${COM}-darwin-arm64.tar.xz | cut -d" " -f1)" >> "$GITHUB_OUTPUT" + echo "sha-macos-intel=$(shasum --algorithm 256 xata-v${VER}-${COM}-darwin-x64.tar.xz | cut -d" " -f1)" >> "$GITHUB_OUTPUT" + + - name: Create SHA outputs ubuntu + if: matrix.os == 'ubuntu-latest' + working-directory: ./cli/dist + id: sha-ubuntu + run: | + ls -l + VER="${{steps.capture-version.outputs.version}}" + COMMITSHA="${{inputs.commitSha}}" + COM="$(echo $COMMITSHA | head -c8)" + echo "sha-linux=$(sha256sum xata-v${VER}-${COM}-linux-arm.tar.xz | cut -d " " -f1)" >> "$GITHUB_OUTPUT" + echo "sha-linux-arm=$(sha256sum xata-v${VER}-${COM}-linux-arm64.tar.xz | cut -d " " -f1)" >> "$GITHUB_OUTPUT" + + - name: Upload and Promote CLI Assets to S3 + run: pnpm run release:cli:upload:s3 + env: + MATRIX_OS: ${{ matrix.os }} + COMMIT_SHA: ${{ inputs.commitSha }} + + - name: Pack (Windows only) + if: matrix.os == 'ubuntu-latest' + run: pnpm run release:cli:pack + env: + PUBLISHED_PACKAGES: ${{ inputs.publishedPackages }} + MATRIX_OS: ${{ matrix.os }} + OS_OVERRIDE: windows-latest + - name: Upload CLI Assets to GitHub Releases (Windows only) + run: pnpm run release:cli:upload:gh + if: matrix.os == 'ubuntu-latest' + env: + MATRIX_OS: ${{ matrix.os }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OS_OVERRIDE: windows-latest + - name: Upload and Promote CLI Assets to S3 (Windows only) + if: matrix.os == 'ubuntu-latest' + run: pnpm run release:cli:upload:s3 + env: + MATRIX_OS: ${{ matrix.os }} + COMMIT_SHA: ${{ inputs.commitSha }} + OS_OVERRIDE: windows-latest + - name: Clean up keychain if: matrix.os == 'macos-latest' run: | security delete-keychain $RUNNER_TEMP/app-signing.keychain-db + + update-homebrew: + needs: [release-cli-assets] + name: Update Homebrew Formula + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }} + steps: + - uses: actions/checkout@v3 + with: + repository: xataio/homebrew-brew + ref: 'main' + token: ${{ secrets.GIT_TOKEN }} + fetch-depth: 0 + + - name: setup git config + run: | + git config user.email "system@xata.io" + git config user.name "Xata" + + - name: Read template file + id: gettemplate + run: | + { + echo 'template<> "$GITHUB_OUTPUT" + + - name: Update Homebrew Formula using template variables + id: updateformula + env: + TEMPLATE_CONTENTS: ${{ steps.gettemplate.outputs.template }} + run: | + echo "$TEMPLATE_CONTENTS" > ./Formula/xata.rb + sed -i 's/__CLI_VERSION__/${{ needs.release-cli-assets.outputs.version }}/g' ./Formula/xata.rb + sed -i 's/__CLI_MAC_INTEL_SHA256__/${{ needs.release-cli-assets.outputs.mac_intel_sha }}/g' ./Formula/xata.rb + sed -i 's/__CLI_MAC_ARM_SHA256__/${{ needs.release-cli-assets.outputs.mac_arm_sha }}/g' ./Formula/xata.rb + sed -i 's/__CLI_LINUX_SHA256__/${{ needs.release-cli-assets.outputs.linux_sha }}/g' ./Formula/xata.rb + sed -i 's/__CLI_LINUX_ARM_SHA256__/${{ needs.release-cli-assets.outputs.linux_arm_sha }}/g' ./Formula/xata.rb + + VER="${{needs.release-cli-assets.outputs.version}}" + COMMITSHA="${{inputs.commitSha}}" + COM="$(echo $COMMITSHA | head -c8)" + BASE_URL="https://xata-cli-assets.s3.us-east-1.amazonaws.com/versions/${VER}/${COM}/xata-v${VER}-${COM}" + + CLI_MAC_INTEL_DOWNLOAD_URL="${BASE_URL}-darwin-x64.tar.xz" + CLI_MAC_ARM_DOWNLOAD_URL="${BASE_URL}-darwin-arm64.tar.xz" + CLI_LINUX_DOWNLOAD_URL="${BASE_URL}-linux-x64.tar.xz" + CLI_LINUX_ARM_DOWNLOAD_URL="${BASE_URL}-linux-arm64.tar.xz" + + sed -i "s|__CLI_MAC_INTEL_DOWNLOAD_URL__|${CLI_MAC_INTEL_DOWNLOAD_URL}|g" ./Formula/xata.rb + sed -i "s|__CLI_MAC_ARM_DOWNLOAD_URL__|${CLI_MAC_ARM_DOWNLOAD_URL}|g" ./Formula/xata.rb + sed -i "s|__CLI_LINUX_DOWNLOAD_URL__|${CLI_LINUX_DOWNLOAD_URL}|g" ./Formula/xata.rb + sed -i "s|__CLI_LINUX_ARM_DOWNLOAD_URL__|${CLI_LINUX_ARM_DOWNLOAD_URL}|g" ./Formula/xata.rb + + - name: Read formula file + id: getformula + run: | + { + echo 'formula<> "$GITHUB_OUTPUT" + + - name: commit changes + run: git commit -a -m "Update dependencies to version ${{ needs.release-cli-assets.outputs.version }}" + + - name: Push changes + uses: ad-m/github-push-action@master + with: + github_token: ${{ secrets.GIT_TOKEN }} + branch: main + repository: xataio/homebrew-brew diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 1cbc1c41d..cefd8d8be 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -68,11 +68,12 @@ jobs: GITHUB_TOKEN: ${{ secrets.GIT_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - publish-cli-assets: - name: Publish CLI assets + release-assets: + name: Release CLI assets needs: [release] - if: needs.release.outputs.published == 'true' + if: needs.release.outputs.published == 'true' && github.ref_name == 'main' uses: ./.github/workflows/release-cli-assets.yml with: publishedPackages: ${{ needs.release.outputs.publishedPackages }} + commitSha: ${{ github.sha }} secrets: inherit diff --git a/cli/package.json b/cli/package.json index b54d30d3c..0253cbeb4 100644 --- a/cli/package.json +++ b/cli/package.json @@ -18,11 +18,15 @@ "/npm-shrinkwrap.json", "/oclif.manifest.json" ], + "engines": { + "node": ">=18" + }, "dependencies": { "@oclif/core": "^4.0.8", "@oclif/plugin-help": "^6.2.5", "@oclif/plugin-not-found": "^3.2.10", "@oclif/plugin-plugins": "^5.3.4", + "@oclif/plugin-update": "^4.4.9", "@types/ini": "^4.1.1", "@types/prompts": "^2.4.9", "@types/semver": "^7.5.8", @@ -40,9 +44,9 @@ "enquirer": "^2.4.1", "env-editor": "^1.1.0", "ini": "^4.1.3", - "lodash.keyby": "^4.6.0", "lodash.compact": "^3.0.1", "lodash.get": "^4.4.2", + "lodash.keyby": "^4.6.0", "lodash.set": "^4.3.2", "node-fetch": "^3.3.2", "open": "^10.1.0", @@ -50,8 +54,8 @@ "relaxed-json": "^1.0.3", "semver": "^7.6.2", "text-table": "^0.2.0", - "tslib": "^2.6.3", "tmp": "^0.2.3", + "tslib": "^2.6.3", "type-fest": "^4.21.0", "which": "^4.0.0", "zod": "^3.23.8" @@ -77,6 +81,12 @@ }, "oclif": { "bin": "xata", + "update": { + "s3": { + "host": "https://xata-cli-assets.s3.us-east-1.amazonaws.com", + "bucket": "xata-cli-assets" + } + }, "hooks": { "init": "./dist/hooks/init/compatibility" }, @@ -95,7 +105,8 @@ "plugins": [ "@oclif/plugin-help", "@oclif/plugin-plugins", - "@oclif/plugin-not-found" + "@oclif/plugin-not-found", + "@oclif/plugin-update" ], "topicSeparator": " ", "topics": { diff --git a/package.json b/package.json index 360ceec0b..9acbb89da 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "scripts": { "test": "vitest", "test:canary": "tsx ./scripts/test-canary.ts", - "release:cli": "tsx ./scripts/release-cli.ts", + "release:cli:pack": "tsx ./scripts/release-cli-pack.ts", + "release:cli:upload:gh": "tsx ./scripts/release-cli-upload-gh.ts", + "release:cli:upload:s3": "tsx ./scripts/release-cli-upload-s3.ts", "lint": "eslint .", "lint:fix": "eslint . --fix", "prepare": "husky install", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19bf7a4dd..51fd9a39d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -170,6 +170,9 @@ importers: '@oclif/plugin-plugins': specifier: ^5.3.4 version: 5.3.4 + '@oclif/plugin-update': + specifier: ^4.4.9 + version: 4.4.9 '@types/ini': specifier: ^4.1.1 version: 4.1.1 @@ -4002,7 +4005,6 @@ packages: '@inquirer/type': 1.4.0 ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 - dev: true /@inquirer/type@1.3.2: resolution: @@ -4805,6 +4807,24 @@ packages: - supports-color dev: false + /@oclif/plugin-update@4.4.9: + resolution: + { integrity: sha512-aATUqfHI/mxMGm2DqPs27J7IglI3plSBf/WPXaa3wC5kBYGNnz7d13x+/t0Vljz2yKhhh6BjdnsSAKBfQtOAbQ== } + engines: { node: '>=18.0.0' } + dependencies: + '@inquirer/select': 2.3.10 + '@oclif/core': 4.0.8 + ansis: 3.3.0 + debug: 4.3.5(supports-color@9.4.0) + filesize: 6.4.0 + got: 13.0.0 + semver: 7.6.2 + tar-fs: 2.1.1 + tty-table: 4.2.3 + transitivePeerDependencies: + - supports-color + dev: false + /@oclif/plugin-warn-if-update-available@3.0.19: resolution: { integrity: sha512-CauYLxNuPtK9ig1ZlzFiCqxzGJJd73CKyJDiSzGkg3QRooyZkE9G+l1Lz18fHzj+TEeXUZ74t6RWWPC5p0TL4w== } @@ -7555,6 +7575,12 @@ packages: { integrity: sha512-Yk3BkHH9U7oPyCN3gL5Tc7CpahG/+UFv/6UG03C311Vy9lzRmA5uoxDTpU9CO3rGHL6KzJz/pdDeXZCZ5Mu/Sg== } engines: { node: '>=15' } + /ansis@3.3.0: + resolution: + { integrity: sha512-RQTFlI2DOTJS00S3jQ5vAnryYKsiU6dBuR0yztid2HQKKN2a1ZZDOLIBfBqCfs3tnvtLpAeubNYtEK7a8zriLg== } + engines: { node: '>=15' } + dev: false + /any-date-parser@1.5.4: resolution: { integrity: sha512-S4gl9UmXNk9XXSQxp5w5harUD6aM0fepyL3dZM/B3znX57sWf792hS2UvvCFIHECfpsqfKbQ+cqWBky4AKyRIg== } @@ -7684,7 +7710,6 @@ packages: dependencies: call-bind: 1.0.2 is-array-buffer: 3.0.2 - dev: true /array-includes@3.1.7: resolution: @@ -7724,7 +7749,6 @@ packages: define-properties: 1.2.1 es-abstract: 1.22.2 es-shim-unscopables: 1.0.0 - dev: true /array.prototype.flatmap@1.3.2: resolution: @@ -7749,7 +7773,6 @@ packages: get-intrinsic: 1.2.1 is-array-buffer: 3.0.2 is-shared-array-buffer: 1.0.2 - dev: true /arrify@3.0.0: resolution: @@ -7821,7 +7844,6 @@ packages: resolution: { integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== } engines: { node: '>= 0.4' } - dev: true /axios@1.5.0: resolution: @@ -7991,6 +8013,13 @@ packages: dependencies: fill-range: 7.1.1 + /breakword@1.0.6: + resolution: + { integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw== } + dependencies: + wcwidth: 1.0.1 + dev: false + /brorand@1.1.0: resolution: { integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== } @@ -8196,6 +8225,12 @@ packages: tslib: 2.6.3 dev: true + /camelcase@5.3.1: + resolution: + { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== } + engines: { node: '>=6' } + dev: false + /camelcase@6.3.0: resolution: { integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== } @@ -8331,6 +8366,11 @@ packages: fsevents: 2.3.3 dev: true + /chownr@1.1.4: + resolution: + { integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== } + dev: false + /chownr@2.0.0: resolution: { integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== } @@ -8465,6 +8505,15 @@ packages: typanion: 3.14.0 dev: true + /cliui@6.0.0: + resolution: + { integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== } + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: false + /cliui@7.0.4: resolution: { integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== } @@ -8488,6 +8537,12 @@ packages: { integrity: sha512-IO78I0y6JcSpEPHzK4obKdsL7E7oLdRVDVOLwr2Hkbjsb+Eoz0dxW6tef0WizoKu0gLC4oZSZuEF4U2K6w1WQw== } dev: true + /clone@1.0.4: + resolution: + { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } + engines: { node: '>=0.8' } + dev: false + /code-block-writer@13.0.1: resolution: { integrity: sha512-c5or4P6erEA69TxaxTNcHUNcIn+oyxSRTOWV+pSYF+z4epXqNvwvJ70XPGjPNgue83oAFAPBRQYwpAJ/Hpe/Sg== } @@ -8841,6 +8896,32 @@ packages: randomfill: 1.0.4 dev: true + /csv-generate@3.4.3: + resolution: + { integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw== } + dev: false + + /csv-parse@4.16.3: + resolution: + { integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== } + dev: false + + /csv-stringify@5.6.5: + resolution: + { integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A== } + dev: false + + /csv@5.5.3: + resolution: + { integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g== } + engines: { node: '>= 0.1.90' } + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: false + /data-uri-to-buffer@4.0.1: resolution: { integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== } @@ -8902,6 +8983,12 @@ packages: ms: 2.1.2 supports-color: 9.4.0 + /decamelize@1.2.0: + resolution: + { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== } + engines: { node: '>=0.10.0' } + dev: false + /decompress-response@6.0.0: resolution: { integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== } @@ -8943,6 +9030,13 @@ packages: default-browser-id: 5.0.0 dev: false + /defaults@1.0.4: + resolution: + { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } + dependencies: + clone: 1.0.4 + dev: false + /defer-to-connect@2.0.1: resolution: { integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== } @@ -8963,7 +9057,6 @@ packages: get-intrinsic: 1.2.1 gopd: 1.0.1 has-property-descriptors: 1.0.0 - dev: true /define-lazy-prop@3.0.0: resolution: @@ -8979,7 +9072,6 @@ packages: define-data-property: 1.1.0 has-property-descriptors: 1.0.0 object-keys: 1.1.1 - dev: true /delayed-stream@1.0.0: resolution: @@ -9497,7 +9589,6 @@ packages: typed-array-length: 1.0.4 unbox-primitive: 1.0.2 which-typed-array: 1.1.11 - dev: true /es-module-lexer@1.3.1: resolution: @@ -9511,14 +9602,12 @@ packages: get-intrinsic: 1.2.1 has: 1.0.3 has-tostringtag: 1.0.0 - dev: true /es-shim-unscopables@1.0.0: resolution: { integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== } dependencies: has: 1.0.3 - dev: true /es-to-primitive@1.2.1: resolution: @@ -9528,7 +9617,6 @@ packages: is-callable: 1.2.7 is-date-object: 1.0.5 is-symbol: 1.0.4 - dev: true /es6-promise@3.3.1: resolution: @@ -10397,6 +10485,12 @@ packages: dependencies: minimatch: 5.1.6 + /filesize@6.4.0: + resolution: + { integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== } + engines: { node: '>= 0.4.0' } + dev: false + /fill-range@7.0.1: resolution: { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } @@ -10430,7 +10524,6 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - dev: true /find-up@5.0.0: resolution: @@ -10495,7 +10588,6 @@ packages: { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } dependencies: is-callable: 1.2.7 - dev: true /foreach@2.0.6: resolution: @@ -10609,12 +10701,10 @@ packages: define-properties: 1.2.1 es-abstract: 1.22.2 functions-have-names: 1.2.3 - dev: true /functions-have-names@1.2.3: resolution: { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } - dev: true /fwd-stream@1.0.4: resolution: @@ -10713,7 +10803,6 @@ packages: dependencies: call-bind: 1.0.2 get-intrinsic: 1.2.1 - dev: true /get-tsconfig@4.7.2: resolution: @@ -10821,7 +10910,6 @@ packages: engines: { node: '>= 0.4' } dependencies: define-properties: 1.2.1 - dev: true /globby@11.1.0: resolution: @@ -10873,7 +10961,6 @@ packages: { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== } dependencies: get-intrinsic: 1.2.1 - dev: true /got-fetch@5.1.6(got@12.6.1): resolution: @@ -10918,12 +11005,16 @@ packages: lowercase-keys: 3.0.0 p-cancelable: 3.0.0 responselike: 3.0.0 - dev: true /graceful-fs@4.2.11: resolution: { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } + /grapheme-splitter@1.0.4: + resolution: + { integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== } + dev: false + /graphemer@1.4.0: resolution: { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } @@ -10955,7 +11046,6 @@ packages: /has-bigints@1.0.2: resolution: { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } - dev: true /has-flag@3.0.0: resolution: @@ -10972,7 +11062,6 @@ packages: { integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== } dependencies: get-intrinsic: 1.2.1 - dev: true /has-proto@1.0.1: resolution: @@ -10990,7 +11079,6 @@ packages: engines: { node: '>= 0.4' } dependencies: has-symbols: 1.0.3 - dev: true /has-unicode@2.0.1: resolution: @@ -11319,7 +11407,6 @@ packages: get-intrinsic: 1.2.1 has: 1.0.3 side-channel: 1.0.4 - dev: true /interpret@1.4.0: resolution: @@ -11347,7 +11434,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - dev: true /is-arrayish@0.2.1: resolution: @@ -11363,7 +11449,6 @@ packages: { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } dependencies: has-bigints: 1.0.2 - dev: true /is-binary-path@2.1.0: resolution: @@ -11380,7 +11465,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-buffer@2.0.5: resolution: @@ -11399,7 +11483,6 @@ packages: resolution: { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } engines: { node: '>= 0.4' } - dev: true /is-ci@2.0.0: resolution: @@ -11428,7 +11511,6 @@ packages: engines: { node: '>= 0.4' } dependencies: has-tostringtag: 1.0.0 - dev: true /is-decimal@1.0.4: resolution: @@ -11497,7 +11579,6 @@ packages: resolution: { integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== } engines: { node: '>= 0.4' } - dev: true /is-node-process@1.2.0: resolution: @@ -11510,7 +11591,6 @@ packages: engines: { node: '>= 0.4' } dependencies: has-tostringtag: 1.0.0 - dev: true /is-number@7.0.0: resolution: @@ -11551,7 +11631,6 @@ packages: dependencies: call-bind: 1.0.2 has-tostringtag: 1.0.0 - dev: true /is-retry-allowed@1.2.0: resolution: @@ -11564,7 +11643,6 @@ packages: { integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== } dependencies: call-bind: 1.0.2 - dev: true /is-stream@2.0.1: resolution: @@ -11582,7 +11660,6 @@ packages: engines: { node: '>= 0.4' } dependencies: has-tostringtag: 1.0.0 - dev: true /is-subdir@1.2.0: resolution: @@ -11598,7 +11675,6 @@ packages: engines: { node: '>= 0.4' } dependencies: has-symbols: 1.0.3 - dev: true /is-typed-array@1.1.12: resolution: @@ -11606,7 +11682,6 @@ packages: engines: { node: '>= 0.4' } dependencies: which-typed-array: 1.1.11 - dev: true /is-unicode-supported@1.3.0: resolution: @@ -11630,7 +11705,6 @@ packages: { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== } dependencies: call-bind: 1.0.2 - dev: true /is-windows@1.0.2: resolution: @@ -11669,7 +11743,6 @@ packages: /isarray@2.0.5: resolution: { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } - dev: true /isbuffer@0.0.0: resolution: @@ -11894,6 +11967,12 @@ packages: engines: { node: '>=6' } dev: false + /kleur@4.1.5: + resolution: + { integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== } + engines: { node: '>=6' } + dev: false + /kysely@0.27.4: resolution: { integrity: sha512-dyNKv2KRvYOQPLCAOCjjQuCk4YFd33BvGdf/o5bC7FiW+BB6snA81Zt+2wT9QDFzKqxKa5rrOmvlK/anehCcgA== } @@ -12093,7 +12172,6 @@ packages: engines: { node: '>=8' } dependencies: p-locate: 4.1.0 - dev: true /locate-path@6.0.0: resolution: @@ -12738,6 +12816,17 @@ packages: yallist: 4.0.0 dev: false + /mixme@0.5.10: + resolution: + { integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q== } + engines: { node: '>= 8.0.0' } + dev: false + + /mkdirp-classic@0.5.3: + resolution: + { integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== } + dev: false + /mkdirp@1.0.4: resolution: { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } @@ -13271,7 +13360,6 @@ packages: resolution: { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } engines: { node: '>= 0.4' } - dev: true /object-treeify@1.1.33: resolution: @@ -13294,7 +13382,6 @@ packages: define-properties: 1.2.1 has-symbols: 1.0.3 object-keys: 1.1.1 - dev: true /object.fromentries@2.0.7: resolution: @@ -13524,7 +13611,6 @@ packages: engines: { node: '>=6' } dependencies: p-try: 2.2.0 - dev: true /p-limit@3.1.0: resolution: @@ -13556,7 +13642,6 @@ packages: engines: { node: '>=8' } dependencies: p-limit: 2.3.0 - dev: true /p-locate@5.0.0: resolution: @@ -13641,7 +13726,6 @@ packages: resolution: { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } engines: { node: '>=6' } - dev: true /p-wait-for@4.1.0: resolution: @@ -13780,7 +13864,6 @@ packages: resolution: { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } engines: { node: '>=8' } - dev: true /path-exists@5.0.0: resolution: @@ -14608,7 +14691,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.1 set-function-name: 2.0.1 - dev: true /regexpp@3.2.0: resolution: @@ -14738,6 +14820,11 @@ packages: - supports-color dev: true + /require-main-filename@2.0.0: + resolution: + { integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== } + dev: false + /require-package-name@2.0.1: resolution: { integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q== } @@ -15010,7 +15097,6 @@ packages: get-intrinsic: 1.2.1 has-symbols: 1.0.3 isarray: 2.0.5 - dev: true /safe-buffer@5.1.2: resolution: @@ -15032,7 +15118,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-regex: 1.1.4 - dev: true /safe-resolve@1.0.0: resolution: @@ -15097,7 +15182,6 @@ packages: define-data-property: 1.1.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.0 - dev: true /sha.js@2.4.11: resolution: @@ -15317,6 +15401,20 @@ packages: is-fullwidth-code-point: 5.0.0 dev: true + /smartwrap@2.0.2: + resolution: + { integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA== } + engines: { node: '>=6' } + hasBin: true + dependencies: + array.prototype.flat: 1.3.2 + breakword: 1.0.6 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + dev: false + /snake-case@3.0.4: resolution: { integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== } @@ -15449,6 +15547,13 @@ packages: { integrity: sha512-aFZ19IgVmhdB2uX599ve2kE6BIE3YMnQ6Gp6BURhW/oIzpXGKr878TQfAQZn1+i0Flcc/UKUy1gOlcfaUBCryg== } dev: true + /stream-transform@2.1.3: + resolution: + { integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ== } + dependencies: + mixme: 0.5.10 + dev: false + /streamx@2.15.1: resolution: { integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA== } @@ -15514,7 +15619,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true /string.prototype.trimend@1.0.7: resolution: @@ -15523,7 +15627,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true /string.prototype.trimstart@1.0.7: resolution: @@ -15532,7 +15635,6 @@ packages: call-bind: 1.0.2 define-properties: 1.2.1 es-abstract: 1.22.2 - dev: true /string_decoder@0.10.31: resolution: @@ -15690,6 +15792,16 @@ packages: engines: { node: '>=6' } dev: true + /tar-fs@2.1.1: + resolution: + { integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== } + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + /tar-stream@2.2.0: resolution: { integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== } @@ -15969,6 +16081,21 @@ packages: fsevents: 2.3.3 dev: true + /tty-table@4.2.3: + resolution: + { integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA== } + engines: { node: '>=8.0.0' } + hasBin: true + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.7.2 + dev: false + /tunnel-agent@0.6.0: resolution: { integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== } @@ -16128,7 +16255,6 @@ packages: call-bind: 1.0.2 get-intrinsic: 1.2.1 is-typed-array: 1.1.12 - dev: true /typed-array-byte-length@1.0.0: resolution: @@ -16139,7 +16265,6 @@ packages: for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true /typed-array-byte-offset@1.0.0: resolution: @@ -16151,7 +16276,6 @@ packages: for-each: 0.3.3 has-proto: 1.0.1 is-typed-array: 1.1.12 - dev: true /typed-array-length@1.0.4: resolution: @@ -16160,7 +16284,6 @@ packages: call-bind: 1.0.2 for-each: 0.3.3 is-typed-array: 1.1.12 - dev: true /typedarray-to-buffer@1.0.4: resolution: @@ -16225,7 +16348,6 @@ packages: has-bigints: 1.0.2 has-symbols: 1.0.3 which-boxed-primitive: 1.0.2 - dev: true /underscore@1.13.6: resolution: @@ -16557,6 +16679,13 @@ packages: { integrity: sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow== } dev: true + /wcwidth@1.0.1: + resolution: + { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } + dependencies: + defaults: 1.0.4 + dev: false + /web-streams-polyfill@3.2.1: resolution: { integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== } @@ -16583,7 +16712,11 @@ packages: is-number-object: 1.0.7 is-string: 1.0.7 is-symbol: 1.0.4 - dev: true + + /which-module@2.0.1: + resolution: + { integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== } + dev: false /which-pm@2.0.0: resolution: @@ -16604,7 +16737,6 @@ packages: for-each: 0.3.3 gopd: 1.0.1 has-tostringtag: 1.0.0 - dev: true /which@1.3.1: resolution: @@ -16780,6 +16912,11 @@ packages: { integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== } engines: { node: '>=0.4' } + /y18n@4.0.3: + resolution: + { integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== } + dev: false + /y18n@5.0.8: resolution: { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } @@ -16812,6 +16949,15 @@ packages: hasBin: true dev: true + /yargs-parser@18.1.3: + resolution: + { integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== } + engines: { node: '>=6' } + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: false + /yargs-parser@20.2.9: resolution: { integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== } @@ -16823,6 +16969,24 @@ packages: { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } engines: { node: '>=12' } + /yargs@15.4.1: + resolution: + { integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== } + engines: { node: '>=8' } + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: false + /yargs@16.2.0: resolution: { integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== } diff --git a/scripts/release-cli-pack.ts b/scripts/release-cli-pack.ts new file mode 100644 index 000000000..0192fc674 --- /dev/null +++ b/scripts/release-cli-pack.ts @@ -0,0 +1,80 @@ +import { createExportableManifest } from '@pnpm/exportable-manifest'; +import { readProjectManifest } from '@pnpm/read-project-manifest'; +import { writeProjectManifest } from '@pnpm/write-project-manifest'; +import { execFile, exec as execRaw } from 'child_process'; +import * as util from 'util'; +import { matrixToOclif, platformDistributions, publishedPackagesContains } from './utils'; +const exec = util.promisify(execRaw); + +const PATH_TO_CLI = process.cwd() + '/cli'; +const PATH_TO_CLIENT = process.cwd() + '/packages/client'; +const PATH_TO_CODEGEN = process.cwd() + '/packages/codegen'; +const PATH_TO_IMPORTER = process.cwd() + '/packages/importer'; +const PATH_TO_PGROLL = process.cwd() + '/packages/pgroll'; + +async function main() { + if (!process.env.MATRIX_OS) throw new Error('MATRIX_OS is not set'); + if (!process.env.PUBLISHED_PACKAGES) throw new Error('PUBLISHED_PACKAGES is not set'); + + if (!publishedPackagesContains(process.env.PUBLISHED_PACKAGES, '@xata.io/cli')) return; + + const operatingSystem = matrixToOclif(process.env.OS_OVERRIDE ?? process.env.MATRIX_OS); + + // Assume changeset version has been called and all the + // versions in package jsons are up to date + const { manifest, fileName } = await readProjectManifest(PATH_TO_CLI); + const { + manifest: { version: clientVersion } + } = await readProjectManifest(PATH_TO_CLIENT); + const { + manifest: { version: codegenVersion } + } = await readProjectManifest(PATH_TO_CODEGEN); + const { + manifest: { version: importerVersion } + } = await readProjectManifest(PATH_TO_IMPORTER); + const { + manifest: { version: pgrollVersion } + } = await readProjectManifest(PATH_TO_PGROLL); + + if (!clientVersion || !codegenVersion || !importerVersion || !pgrollVersion) + throw new Error('Missing package versions.'); + + if (!manifest.version) throw new Error('Missing package version.'); + + const workspaceProtocolPackageManifest = await createExportableManifest( + PATH_TO_CLI, + { + ...manifest, + dependencies: { + ...manifest.dependencies, + '@xata.io/client': clientVersion, + '@xata.io/codegen': codegenVersion, + '@xata.io/importer': importerVersion, + '@xata.io/pgroll': pgrollVersion + } + }, + { + catalogs: {} + } + ); + + await writeProjectManifest(`${PATH_TO_CLI}/${fileName}`, workspaceProtocolPackageManifest); + + process.chdir(PATH_TO_CLI); + + // Oclif pack expects a npm-shrinkwrap.json file and errors if it is not present. + execFile('rm', ['-rf', `${PATH_TO_CLI}/npm-shrinkwrap.json`]); + execFile('touch', [`${PATH_TO_CLI}/npm-shrinkwrap.json`]); + + // Clean up any old /dist directories if there are some + for (const subdir of ['macos', 'deb', 'win32']) { + await exec(`rm -rf ${PATH_TO_CLI}/dist/${subdir}`); + } + + // Tarballs + await exec(`pnpm oclif pack tarballs --targets=${platformDistributions(operatingSystem)}`); + // Installers + await exec(`pnpm oclif pack ${operatingSystem}`); +} + +main(); diff --git a/scripts/release-cli-upload-gh.ts b/scripts/release-cli-upload-gh.ts new file mode 100644 index 000000000..5635a5a99 --- /dev/null +++ b/scripts/release-cli-upload-gh.ts @@ -0,0 +1,78 @@ +import { readProjectManifest } from '@pnpm/read-project-manifest'; +import { Octokit } from '@octokit/core'; +import fs from 'fs'; +import { matrixToOclif } from './utils'; + +const PATH_TO_CLI = process.cwd() + '/cli'; + +const base = { + owner: 'xataio', + repo: 'client-ts', + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } +}; + +async function main() { + if (!process.env.MATRIX_OS) throw new Error('MATRIX_OS is not set'); + if (!process.env.GITHUB_TOKEN) throw new Error('GITHUB_TOKEN is not set'); + + const operatingSystem = matrixToOclif(process.env.OS_OVERRIDE ?? process.env.MATRIX_OS); + + const { + manifest: { version } + } = await readProjectManifest(PATH_TO_CLI); + + if (!version) throw new Error('Missing package version.'); + + process.chdir(PATH_TO_CLI); + + const octokit = new Octokit({ + auth: process.env.GITHUB_TOKEN + }); + + const tag = `@xata.io/cli@${version}`; + + const release = await octokit.request('GET /repos/{owner}/{repo}/releases/tags/{tag}', { + ...base, + tag + }); + + if (!release.data) throw new Error('Release not found'); + + // Windows packs files under "win32" directory + const pathToAssets = + operatingSystem === 'win' ? `${PATH_TO_CLI}/dist/win32` : `${PATH_TO_CLI}/dist/${operatingSystem}`; + // Debian pack results in redundant installer files. Only upload .deb files + const files = fs + .readdirSync(pathToAssets) + .filter((file) => (operatingSystem === 'deb' ? file.endsWith('.deb') : true)); + for (const file of files) { + await uploadFiles({ pathToFile: pathToAssets + `/${file}`, fileName: file, octokit, releaseId: release.data.id }); + } +} + +const uploadFiles = async ({ + pathToFile, + fileName, + octokit, + releaseId +}: { + pathToFile: string; + fileName: string; + octokit: Octokit; + releaseId: number; +}) => { + const data = fs.readFileSync(pathToFile); + const upload = await octokit.request('POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}', { + ...base, + name: fileName, + label: fileName, + release_id: releaseId, + data: data, + baseUrl: 'https://uploads.github.com' + }); + console.log('Finished uploading asset', upload.status); +}; + +main(); diff --git a/scripts/release-cli-upload-s3.ts b/scripts/release-cli-upload-s3.ts new file mode 100644 index 000000000..8b49f2a8c --- /dev/null +++ b/scripts/release-cli-upload-s3.ts @@ -0,0 +1,47 @@ +import { readProjectManifest } from '@pnpm/read-project-manifest'; +import { exec as execRaw } from 'child_process'; +import * as util from 'util'; +import { matrixToOclif, platformDistributions } from './utils'; +const exec = util.promisify(execRaw); + +async function main() { + if (!process.env.MATRIX_OS) throw new Error('MATRIX_OS is not set'); + if (!process.env.COMMIT_SHA) throw new Error('COMMIT_SHA is not set'); + + const operatingSystem = matrixToOclif(process.env.OS_OVERRIDE ?? process.env.MATRIX_OS); + + const PATH_TO_CLI = process.cwd() + '/cli'; + + const { + manifest: { version } + } = await readProjectManifest(PATH_TO_CLI); + + if (!version) throw new Error('Missing package version.'); + + process.chdir(PATH_TO_CLI); + + // Upload tarballs + await uploadS3(operatingSystem); + // Upload installers + await uploadS3(operatingSystem, { pkg: true }); + // Promote to stable + await promoteS3(operatingSystem, version); +} +main(); + +const uploadS3 = async (platform: 'macos' | 'deb' | 'win', options?: { pkg: boolean }) => { + const uploadRes = options?.pkg + ? await exec(`pnpm oclif upload ${platform}`) + : await exec(`pnpm oclif upload tarballs --targets=${platformDistributions(platform)}`); + console.log('Uploaded release', uploadRes.stdout); +}; + +const promoteS3 = async (platform: 'macos' | 'deb' | 'win', version: string) => { + const promoteRes = await exec( + `pnpm oclif promote --${platform} --sha=${process.env.COMMIT_SHA?.slice( + 0, + 8 + )} --indexes --version=${version} --channel=stable --targets=${platformDistributions(platform)}` + ); + console.log('Promoted release', promoteRes.stdout); +}; diff --git a/scripts/release-cli.ts b/scripts/release-cli.ts deleted file mode 100644 index e5bfaf3b7..000000000 --- a/scripts/release-cli.ts +++ /dev/null @@ -1,155 +0,0 @@ -import { createExportableManifest } from '@pnpm/exportable-manifest'; -import { readProjectManifest } from '@pnpm/read-project-manifest'; -import { writeProjectManifest } from '@pnpm/write-project-manifest'; -import { execFile, exec as execRaw } from 'child_process'; -import { Octokit } from '@octokit/core'; -import fs from 'fs'; -import * as util from 'util'; -const exec = util.promisify(execRaw); - -const PATH_TO_CLI = process.cwd() + '/cli'; -const PATH_TO_CLIENT = process.cwd() + '/packages/client'; -const PATH_TO_CODEGEN = process.cwd() + '/packages/codegen'; -const PATH_TO_IMPORTER = process.cwd() + '/packages/importer'; -const PATH_TO_PGROLL = process.cwd() + '/packages/pgroll'; - -const base = { - owner: 'xataio', - repo: 'client-ts', - headers: { - 'X-GitHub-Api-Version': '2022-11-28' - } -}; - -const matrixToOclif = (os: string) => { - switch (os) { - case 'macos-latest': - return 'macos'; - case 'ubuntu-latest': - return 'deb'; - default: - throw new Error('Unsupported OS'); - } -}; - -async function main() { - if (!process.env.MATRIX_OS) throw new Error('MATRIX_OS is not set'); - if (!process.env.GITHUB_TOKEN) throw new Error('GITHUB_TOKEN is not set'); - if (!process.env.PUBLISHED_PACKAGES) throw new Error('PUBLISHED_PACKAGES is not set'); - - if ( - process.env.PUBLISHED_PACKAGES === '' || - !(JSON.parse(process.env.PUBLISHED_PACKAGES) as Array<{ name: string; version: string }>).find( - (change) => change.name === '@xata.io/cli' - ) - ) { - console.log('No changes in cli. Skipping asset release.'); - return; - } - - const operatingSystem = matrixToOclif(process.env.MATRIX_OS); - - const { manifest, fileName } = await readProjectManifest(PATH_TO_CLI); - const { - manifest: { version: clientVersion } - } = await readProjectManifest(PATH_TO_CLIENT); - const { - manifest: { version: codegenVersion } - } = await readProjectManifest(PATH_TO_CODEGEN); - const { - manifest: { version: importerVersion } - } = await readProjectManifest(PATH_TO_IMPORTER); - const { - manifest: { version: pgrollVersion } - } = await readProjectManifest(PATH_TO_PGROLL); - - if (!clientVersion || !codegenVersion || !importerVersion || !pgrollVersion) - throw new Error('Missing package versions.'); - - // Assume changeset version has been called and all the - // versions in package jsons are up to date - - const workspaceProtocolPackageManifest = await createExportableManifest(PATH_TO_CLI, { - ...manifest, - dependencies: { - ...manifest.dependencies, - '@xata.io/client': clientVersion, - '@xata.io/codegen': codegenVersion, - '@xata.io/importer': importerVersion, - '@xata.io/pgroll': pgrollVersion - } - }); - - await writeProjectManifest(`${PATH_TO_CLI}/${fileName}`, workspaceProtocolPackageManifest); - - process.chdir(PATH_TO_CLI); - - // Oclif pack expects a npm-shrinkwrap.json file and errors if it is not present. - execFile('rm', ['-rf', `${PATH_TO_CLI}/npm-shrinkwrap.json`]); - execFile('touch', [`${PATH_TO_CLI}/npm-shrinkwrap.json`]); - - await exec(`pnpm oclif pack ${operatingSystem}`); - - const octokit = new Octokit({ - auth: process.env.GITHUB_TOKEN - }); - - const tag = `@xata.io/cli@${manifest.version}`; - - const release = await octokit.request('GET /repos/{owner}/{repo}/releases/tags/{tag}', { - ...base, - tag - }); - - if (!release.data) throw new Error('Release not found'); - - const pathToAsset = `${PATH_TO_CLI}/dist/${operatingSystem}`; - // Debian pack results in redundant files. Only upload .deb files - const files = fs - .readdirSync(pathToAsset) - .filter((file) => (operatingSystem === 'deb' ? file.endsWith('.deb') : true)); - for (const file of files) { - await uploadFiles({ pathToFile: pathToAsset + `/${file}`, fileName: file, octokit, releaseId: release.data.id }); - } - - // Pack windows on linux - if (operatingSystem === 'deb') { - await exec(`pnpm oclif pack win`); - // Windows packs files under "win32" directory - const pathToAssetWindows = `${PATH_TO_CLI}/dist/win32`; - const files = fs.readdirSync(pathToAssetWindows); - for (const file of files) { - await uploadFiles({ - pathToFile: pathToAssetWindows + `/${file}`, - fileName: file, - octokit, - releaseId: release.data.id - }); - } - } -} - -const uploadFiles = async ({ - pathToFile, - fileName, - octokit, - releaseId -}: { - pathToFile: string; - fileName: string; - octokit: Octokit; - releaseId: number; -}) => { - const data = fs.readFileSync(pathToFile); - const upload = await octokit.request('POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}', { - ...base, - name: fileName, - label: fileName, - release_id: releaseId, - data: data, - baseUrl: 'https://uploads.github.com' - }); - console.log('Finished uploading asset', upload.status); -}; - -main(); diff --git a/scripts/utils.ts b/scripts/utils.ts new file mode 100644 index 000000000..18de07178 --- /dev/null +++ b/scripts/utils.ts @@ -0,0 +1,38 @@ +export const matrixToOclif = (os: string) => { + switch (os) { + case 'macos-latest': + return 'macos'; + case 'ubuntu-latest': + return 'deb'; + case 'windows-latest': + return 'win'; + default: + throw new Error('Unsupported OS'); + } +}; + +export const platformDistributions = (os: string) => { + switch (os) { + case 'macos': + return 'darwin-arm64,darwin-x64'; + case 'deb': + return 'linux-arm,linux-arm64,linux-x64'; + case 'win': + return 'win32-x64,win32-x86'; + default: + throw new Error('Unsupported Platform'); + } +}; + +export const publishedPackagesContains = (publishedPackages: string, packageName: string) => { + if ( + publishedPackages === '' || + !(JSON.parse(publishedPackages) as Array<{ name: string; version: string }>).find( + (change) => change.name === packageName + ) + ) { + console.log('No changes in cli. Skipping asset release.'); + return false; + } + return true; +};