diff --git a/.github/workflows/build_native.yml b/.github/workflows/build_native.yml index e542dd2a2645e4f..ad179aacb34afea 100644 --- a/.github/workflows/build_native.yml +++ b/.github/workflows/build_native.yml @@ -1,154 +1,82 @@ -on: - workflow_dispatch: - pull_request: - types: [opened, synchronize] - paths: - - 'packages/next/build/swc/**' +on: workflow_dispatch name: Build next-swc native binaries jobs: - build: + build-native: strategy: matrix: os: [ubuntu-18.04, macos-latest, windows-latest] - - name: stable - ${{ matrix.os }} - node@14 + description: [default] + include: + - os: ubuntu-18.04 + target: x86_64-unknown-linux-gnu + - os: windows-latest + target: x86_64-pc-windows-msvc + - os: macos-latest + target: x86_64-apple-darwin + - os: macos-latest + target: aarch64-apple-darwin + description: m1 + + name: next-swc - ${{ matrix.os }} - ${{ matrix.target }} - node@14 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 - - name: Setup node uses: actions/setup-node@v2 with: node-version: 14 check-latest: true - - name: Install uses: actions-rs/toolchain@v1 with: - toolchain: stable profile: minimal - + toolchain: nightly-2021-03-25 + target: ${{ matrix.target }} - name: Cache cargo registry uses: actions/cache@v1 with: path: ~/.cargo/registry key: stable-${{ matrix.os }}-node@14-cargo-registry-trimmed-${{ hashFiles('**/Cargo.lock') }} - - name: Cache cargo index uses: actions/cache@v1 with: path: ~/.cargo/git key: stable-${{ matrix.os }}-node@14-cargo-index-trimmed-${{ hashFiles('**/Cargo.lock') }} - - - name: Cache NPM dependencies - uses: actions/cache@v1 + - name: Cache native binary + id: binary-cache + uses: actions/cache@v2 with: - path: node_modules - key: npm-cache-${{ matrix.os }}-node@14-${{ hashFiles('yarn.lock') }} - - - name: 'Install dependencies' - run: yarn install --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 - + path: packages/next/native/** + key: next-swc-nightly-2021-03-25-${{ matrix.target }}-${{ hashFiles('packages/next/build/swc/**') }} - name: 'Build' - run: yarn --cwd packages/next build-native + if: steps.binary-cache.outputs.cache-hit != true + run: yarn build-native --target ${{ matrix.target }} env: MACOSX_DEPLOYMENT_TARGET: '10.13' - - - name: Upload artifact - uses: actions/upload-artifact@v2 - with: - name: next-swc-binaries - path: packages/next/native - - - name: Clear the cargo caches - run: | - cargo install cargo-cache --no-default-features --features ci-autoclean - cargo-cache - - build-apple-silicon: - name: stable - aarch64-apple-darwin - node@14 - runs-on: macos-latest - - steps: - - uses: actions/checkout@v2 - - - name: Setup node - uses: actions/setup-node@v2 - with: - node-version: 14 - - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - profile: minimal - override: true - toolchain: nightly-2021-03-25 - target: aarch64-apple-darwin - - - name: Install dependencies - run: yarn install --frozen-lockfile --registry https://registry.npmjs.org --network-timeout 300000 - - - name: Cross build aarch64 - run: yarn --cwd packages/next build-native --target aarch64-apple-darwin - + working-directory: packages/next - name: Upload artifact uses: actions/upload-artifact@v2 with: name: next-swc-binaries - path: packages/next/native - + path: packages/next/native/next-swc.*.node - name: Clear the cargo caches run: | cargo install cargo-cache --no-default-features --features ci-autoclean cargo-cache - commit: - needs: [build, build-apple-silicon] + needs: build-native runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 - if: ${{ github.event_name == 'workflow_dispatch' }} - uses: actions/download-artifact@v2 with: name: next-swc-binaries path: packages/next/native - if: ${{ github.event_name == 'workflow_dispatch' }} - uses: EndBug/add-and-commit@v7 with: add: 'packages/next/native --force' message: 'Build next-swc binaries' - if: ${{ github.event_name == 'workflow_dispatch' }} - - check: - needs: [build, build-apple-silicon] - runs-on: ubuntu-18.04 - - steps: - - uses: actions/checkout@v2 - if: ${{ github.event_name == 'pull_request' }} - - uses: actions/download-artifact@v2 - with: - name: next-swc-binaries - path: packages/next/native - if: ${{ github.event_name == 'pull_request' }} - - run: git diff --exit-code - if: ${{ github.event_name == 'pull_request' }} - - test: - runs-on: ubuntu-18.04 - - steps: - - uses: actions/checkout@v2 - if: ${{ github.event_name == 'pull_request' }} - - name: Install - if: ${{ github.event_name == 'pull_request' }} - uses: actions-rs/toolchain@v1 - with: - toolchain: nightly-2021-03-25 - profile: minimal - - run: cd packages/next/build/swc && cargo test - if: ${{ github.event_name == 'pull_request' }} diff --git a/.github/workflows/build_test_deploy.yml b/.github/workflows/build_test_deploy.yml index 210e35757150011..5f633e11c01048a 100644 --- a/.github/workflows/build_test_deploy.yml +++ b/.github/workflows/build_test_deploy.yml @@ -1,6 +1,7 @@ on: push: branches: [canary] + tags: [v*] pull_request: types: [opened, synchronize] @@ -45,7 +46,7 @@ jobs: checkPrecompiled: name: Check Pre-compiled runs-on: ubuntu-latest - needs: build + needs: [build, build-native] env: NEXT_TELEMETRY_DISABLED: 1 steps: @@ -55,6 +56,10 @@ jobs: with: path: ./* key: ${{ github.sha }} + - uses: actions/download-artifact@v2 + with: + name: next-swc-binaries + path: packages/next/native - run: ./scripts/check-pre-compiled.sh if: ${{needs.build.outputs.docsChange != 'docs only change'}} @@ -239,9 +244,10 @@ jobs: if: ${{needs.build.outputs.docsChange != 'docs only change'}} publishRelease: + if: ${{ startsWith(github.ref, 'refs/tags/v') }} name: Potentially publish release runs-on: ubuntu-latest - needs: build + needs: [build, build-native] env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} steps: @@ -250,7 +256,11 @@ jobs: with: path: ./* key: ${{ github.sha }} - + - uses: actions/download-artifact@v2 + with: + name: next-swc-binaries + path: packages/next/native + - run: ./scripts/prepublish-native.js - run: ./scripts/publish-release.sh releaseStats: @@ -267,3 +277,80 @@ jobs: - uses: ./.github/actions/next-stats-action env: PR_STATS_COMMENT_TOKEN: ${{ secrets.PR_STATS_COMMENT_TOKEN }} + + build-native: + strategy: + matrix: + os: [ubuntu-18.04, macos-latest, windows-latest] + description: [default] + include: + - os: ubuntu-18.04 + target: x86_64-unknown-linux-gnu + - os: windows-latest + target: x86_64-pc-windows-msvc + - os: macos-latest + target: x86_64-apple-darwin + - os: macos-latest + target: aarch64-apple-darwin + description: m1 + + name: next-swc - ${{ matrix.os }} - ${{ matrix.target }} - node@14 + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + - name: Setup node + uses: actions/setup-node@v2 + with: + node-version: 14 + check-latest: true + - name: Install + uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: nightly-2021-03-25 + target: ${{ matrix.target }} + - name: Cache cargo registry + uses: actions/cache@v1 + with: + path: ~/.cargo/registry + key: stable-${{ matrix.os }}-node@14-cargo-registry-trimmed-${{ hashFiles('**/Cargo.lock') }} + - name: Cache cargo index + uses: actions/cache@v1 + with: + path: ~/.cargo/git + key: stable-${{ matrix.os }}-node@14-cargo-index-trimmed-${{ hashFiles('**/Cargo.lock') }} + - name: Cache native binary + id: binary-cache + uses: actions/cache@v2 + with: + path: packages/next/native/** + key: next-swc-nightly-2021-03-25-${{ matrix.target }}-${{ hashFiles('packages/next/build/swc/**') }} + - name: 'Build' + if: steps.binary-cache.outputs.cache-hit != true + run: yarn build-native --target ${{ matrix.target }} + env: + MACOSX_DEPLOYMENT_TARGET: '10.13' + working-directory: packages/next + - name: Upload artifact + uses: actions/upload-artifact@v2 + with: + name: next-swc-binaries + path: packages/next/native/next-swc.*.node + - name: Clear the cargo caches + run: | + cargo install cargo-cache --no-default-features --features ci-autoclean + cargo-cache + + test-native: + name: Unit Test Native Code + runs-on: ubuntu-18.04 + + steps: + - uses: actions/checkout@v2 + - name: Install + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly-2021-03-25 + profile: minimal + - run: cd packages/next/build/swc && cargo test diff --git a/packages/next/build/swc/npm/next-swc-darwin-arm64/README.md b/packages/next/build/swc/npm/next-swc-darwin-arm64/README.md new file mode 100644 index 000000000000000..8a616700ad72555 --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-darwin-arm64/README.md @@ -0,0 +1,3 @@ +# `next-swc-darwin-arm64` + +This is the **aarch64-apple-darwin** binary for `next-swc` diff --git a/packages/next/build/swc/npm/next-swc-darwin-arm64/package.json b/packages/next/build/swc/npm/next-swc-darwin-arm64/package.json new file mode 100644 index 000000000000000..d40a7a93885ec64 --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-darwin-arm64/package.json @@ -0,0 +1,18 @@ +{ + "name": "next-swc-darwin-arm64", + "version": "0.0.0", + "os": [ + "darwin" + ], + "cpu": [ + "arm64" + ], + "main": "next-swc.darwin-arm64.node", + "files": [ + "next-swc.darwin-arm64.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/packages/next/build/swc/npm/next-swc-darwin-x64/README.md b/packages/next/build/swc/npm/next-swc-darwin-x64/README.md new file mode 100644 index 000000000000000..e456065a5f41b61 --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-darwin-x64/README.md @@ -0,0 +1,3 @@ +# `next-swc-darwin-x64` + +This is the **x86_64-apple-darwin** binary for `next-swc` diff --git a/packages/next/build/swc/npm/next-swc-darwin-x64/package.json b/packages/next/build/swc/npm/next-swc-darwin-x64/package.json new file mode 100644 index 000000000000000..841f101bc3ed0df --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-darwin-x64/package.json @@ -0,0 +1,18 @@ +{ + "name": "next-swc-darwin-x64", + "version": "0.0.0", + "os": [ + "darwin" + ], + "cpu": [ + "x64" + ], + "main": "next-swc.darwin-x64.node", + "files": [ + "next-swc.darwin-x64.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/packages/next/build/swc/npm/next-swc-linux-x64-gnu/README.md b/packages/next/build/swc/npm/next-swc-linux-x64-gnu/README.md new file mode 100644 index 000000000000000..ab0dd023d410dc5 --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-linux-x64-gnu/README.md @@ -0,0 +1,3 @@ +# `next-swc-linux-x64-gnu` + +This is the **x86_64-unknown-linux-gnu** binary for `next-swc` diff --git a/packages/next/build/swc/npm/next-swc-linux-x64-gnu/package.json b/packages/next/build/swc/npm/next-swc-linux-x64-gnu/package.json new file mode 100644 index 000000000000000..46d6a065dc47514 --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-linux-x64-gnu/package.json @@ -0,0 +1,18 @@ +{ + "name": "next-swc-linux-x64-gnu", + "version": "0.0.0", + "os": [ + "linux" + ], + "cpu": [ + "x64" + ], + "main": "next-swc.linux-x64-gnu.node", + "files": [ + "next-swc.linux-x64-gnu.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/packages/next/build/swc/npm/next-swc-win32-x64-msvc/README.md b/packages/next/build/swc/npm/next-swc-win32-x64-msvc/README.md new file mode 100644 index 000000000000000..043a268252d559e --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-win32-x64-msvc/README.md @@ -0,0 +1,3 @@ +# `next-swc-win32-x64-msvc` + +This is the **x86_64-pc-windows-msvc** binary for `next-swc` diff --git a/packages/next/build/swc/npm/next-swc-win32-x64-msvc/package.json b/packages/next/build/swc/npm/next-swc-win32-x64-msvc/package.json new file mode 100644 index 000000000000000..d5ea85b6c5e7df9 --- /dev/null +++ b/packages/next/build/swc/npm/next-swc-win32-x64-msvc/package.json @@ -0,0 +1,18 @@ +{ + "name": "next-swc-win32-x64-msvc", + "version": "0.0.0", + "os": [ + "win32" + ], + "cpu": [ + "x64" + ], + "main": "next-swc.win32-x64-msvc.node", + "files": [ + "next-swc.win32-x64-msvc.node" + ], + "license": "MIT", + "engines": { + "node": ">= 10" + } +} diff --git a/packages/next/native/next-swc.darwin-arm64.node b/packages/next/native/next-swc.darwin-arm64.node index 0b6644ec65ec4a3..4a219ab9b44c404 100644 Binary files a/packages/next/native/next-swc.darwin-arm64.node and b/packages/next/native/next-swc.darwin-arm64.node differ diff --git a/packages/next/native/next-swc.darwin-x64.node b/packages/next/native/next-swc.darwin-x64.node index d54ee4958e7b629..a5376a57a4f6515 100644 Binary files a/packages/next/native/next-swc.darwin-x64.node and b/packages/next/native/next-swc.darwin-x64.node differ diff --git a/packages/next/package.json b/packages/next/package.json index 7746a906adcbef8..e8d28cf5be8081b 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -54,7 +54,7 @@ "types": "tsc --declaration --emitDeclarationOnly --declarationDir dist", "typescript": "tsc --noEmit --declaration", "ncc-compiled": "ncc cache clean && taskr ncc", - "build-native": "napi build --platform --release --cargo-cwd build/swc native" + "build-native": "npx -p @napi-rs/cli napi build --platform --release --cargo-cwd build/swc native" }, "taskr": { "requires": [ diff --git a/scripts/prepublish-native.js b/scripts/prepublish-native.js new file mode 100755 index 000000000000000..803c45ba3d653cb --- /dev/null +++ b/scripts/prepublish-native.js @@ -0,0 +1,50 @@ +#!/usr/bin/env node + +const path = require('path') +const { readFile, readdir, writeFile } = require('fs/promises') +const { copy } = require('fs-extra') + +const cwd = process.cwd() + +;(async function () { + let version = JSON.parse(await readFile(path.join(cwd, 'lerna.json'))).version + + // Copy binaries to package folders, update version, and copy package folders to packages directory + let nativePackagesDir = path.join(cwd, 'packages/next/build/swc/npm') + let nativePackages = await readdir(nativePackagesDir) + for (let nativePackage of nativePackages) { + let binaryName = `next-swc.${nativePackage.substr(9)}.node` + await copy( + path.join(cwd, 'packages/next/native', binaryName), + path.join(nativePackagesDir, nativePackage, binaryName) + ) + let pkg = JSON.parse( + await readFile( + path.join(nativePackagesDir, nativePackage, 'package.json') + ) + ) + pkg.version = version + await writeFile( + path.join(nativePackagesDir, nativePackage, 'package.json'), + JSON.stringify(pkg, null, 2) + ) + } + await copy( + path.join(cwd, 'packages/next/build/swc/npm'), + path.join(cwd, 'packages') + ) + + // Update optional dependencies versions + let nextPkg = JSON.parse( + await readFile(path.join(cwd, 'packages/next/package.json')) + ) + for (let name of nativePackages) { + let optionalDependencies = nextPkg.optionalDependencies || {} + optionalDependencies[name] = version + nextPkg.optionalDependencies = optionalDependencies + } + await writeFile( + path.join(path.join(cwd, 'packages/next/package.json')), + JSON.stringify(nextPkg, null, 2) + ) +})()