mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 13:39:24 +08:00
Merge branch 'main' into next
This commit is contained in:
commit
fa887c4ad4
619
.github/workflows/manual-npm-publish-license-kit.yml
vendored
Normal file
619
.github/workflows/manual-npm-publish-license-kit.yml
vendored
Normal file
@ -0,0 +1,619 @@
|
|||||||
|
name: Manual npm publish license-kit
|
||||||
|
env:
|
||||||
|
DEBUG: napi:*
|
||||||
|
APP_NAME: license-kit
|
||||||
|
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
id-token: write
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# 'on':
|
||||||
|
# push:
|
||||||
|
# branches:
|
||||||
|
# - main
|
||||||
|
# tags-ignore:
|
||||||
|
# - '**'
|
||||||
|
# paths-ignore:
|
||||||
|
# - '**/*.md'
|
||||||
|
# - LICENSE
|
||||||
|
# - '**/*.gitignore'
|
||||||
|
# - .editorconfig
|
||||||
|
# - docs/**
|
||||||
|
# pull_request: null
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
settings:
|
||||||
|
- host: macos-latest
|
||||||
|
target: x86_64-apple-darwin
|
||||||
|
build: yarn build --target x86_64-apple-darwin
|
||||||
|
- host: windows-latest
|
||||||
|
build: yarn build --target x86_64-pc-windows-msvc
|
||||||
|
target: x86_64-pc-windows-msvc
|
||||||
|
- host: windows-latest
|
||||||
|
build: yarn build --target i686-pc-windows-msvc
|
||||||
|
target: i686-pc-windows-msvc
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: x86_64-unknown-linux-gnu
|
||||||
|
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian
|
||||||
|
build: yarn build --target x86_64-unknown-linux-gnu
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: x86_64-unknown-linux-musl
|
||||||
|
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
|
||||||
|
build: yarn build --target x86_64-unknown-linux-musl
|
||||||
|
- host: macos-latest
|
||||||
|
target: aarch64-apple-darwin
|
||||||
|
build: yarn build --target aarch64-apple-darwin
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: aarch64-unknown-linux-gnu
|
||||||
|
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-debian-aarch64
|
||||||
|
build: yarn build --target aarch64-unknown-linux-gnu
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: armv7-unknown-linux-gnueabihf
|
||||||
|
setup: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install gcc-arm-linux-gnueabihf -y
|
||||||
|
build: yarn build --target armv7-unknown-linux-gnueabihf
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: armv7-unknown-linux-musleabihf
|
||||||
|
build: yarn build --target armv7-unknown-linux-musleabihf
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: aarch64-linux-android
|
||||||
|
build: yarn build --target aarch64-linux-android
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: armv7-linux-androideabi
|
||||||
|
build: yarn build --target armv7-linux-androideabi
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: aarch64-unknown-linux-musl
|
||||||
|
docker: ghcr.io/napi-rs/napi-rs/nodejs-rust:lts-alpine
|
||||||
|
build: |-
|
||||||
|
set -e &&
|
||||||
|
rustup target add aarch64-unknown-linux-musl &&
|
||||||
|
yarn build --target aarch64-unknown-linux-musl
|
||||||
|
- host: windows-latest
|
||||||
|
target: aarch64-pc-windows-msvc
|
||||||
|
build: yarn build --target aarch64-pc-windows-msvc
|
||||||
|
- host: ubuntu-latest
|
||||||
|
target: riscv64gc-unknown-linux-gnu
|
||||||
|
setup: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install gcc-riscv64-linux-gnu -y
|
||||||
|
build: yarn build --target riscv64gc-unknown-linux-gnu
|
||||||
|
name: stable - ${{ matrix.settings.target }} - node@20
|
||||||
|
runs-on: ${{ matrix.settings.host }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
if: ${{ !matrix.settings.docker }}
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: yarn
|
||||||
|
- name: Install
|
||||||
|
uses: dtolnay/rust-toolchain@stable
|
||||||
|
if: ${{ !matrix.settings.docker }}
|
||||||
|
with:
|
||||||
|
toolchain: stable
|
||||||
|
targets: ${{ matrix.settings.target }}
|
||||||
|
- name: Cache cargo
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/registry/index/
|
||||||
|
~/.cargo/registry/cache/
|
||||||
|
~/.cargo/git/db/
|
||||||
|
.cargo-cache
|
||||||
|
target/
|
||||||
|
key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }}
|
||||||
|
- uses: goto-bus-stop/setup-zig@v2
|
||||||
|
if: ${{ matrix.settings.target == 'armv7-unknown-linux-gnueabihf' || matrix.settings.target == 'armv7-unknown-linux-musleabihf' }}
|
||||||
|
with:
|
||||||
|
version: 0.13.0
|
||||||
|
- name: Setup toolchain
|
||||||
|
run: ${{ matrix.settings.setup }}
|
||||||
|
if: ${{ matrix.settings.setup }}
|
||||||
|
shell: bash
|
||||||
|
- name: Setup node x86
|
||||||
|
if: matrix.settings.target == 'i686-pc-windows-msvc'
|
||||||
|
run: yarn config set supportedArchitectures.cpu "ia32"
|
||||||
|
shell: bash
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Setup node x86
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
if: matrix.settings.target == 'i686-pc-windows-msvc'
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: yarn
|
||||||
|
architecture: x86
|
||||||
|
- name: Install OpenSSL dev
|
||||||
|
if: ${{ matrix.settings.host == 'ubuntu-latest' }}
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y pkg-config libssl-dev
|
||||||
|
- name: Build in docker
|
||||||
|
uses: addnab/docker-run-action@v3
|
||||||
|
if: ${{ matrix.settings.docker }}
|
||||||
|
with:
|
||||||
|
image: ${{ matrix.settings.docker }}
|
||||||
|
options: '--user 0:0 -v ${{ github.workspace }}/.cargo-cache/git/db:/usr/local/cargo/git/db -v ${{ github.workspace }}/.cargo/registry/cache:/usr/local/cargo/registry/cache -v ${{ github.workspace }}/.cargo/registry/index:/usr/local/cargo/registry/index -v ${{ github.workspace }}:/build -w /build'
|
||||||
|
run: ${{ matrix.settings.build }}
|
||||||
|
- name: Build
|
||||||
|
run: ${{ matrix.settings.build }}
|
||||||
|
if: ${{ !matrix.settings.docker }}
|
||||||
|
shell: bash
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-${{ matrix.settings.target }}
|
||||||
|
path: ${{ env.APP_NAME }}.*.node
|
||||||
|
if-no-files-found: error
|
||||||
|
build-freebsd:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: Build FreeBSD
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Build
|
||||||
|
id: build
|
||||||
|
uses: cross-platform-actions/action@v0.27.0
|
||||||
|
env:
|
||||||
|
DEBUG: napi:*
|
||||||
|
RUSTUP_IO_THREADS: 1
|
||||||
|
with:
|
||||||
|
operating_system: freebsd
|
||||||
|
version: '14.2'
|
||||||
|
memory: 8G
|
||||||
|
cpu_count: 3
|
||||||
|
environment_variables: 'DEBUG RUSTUP_IO_THREADS'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
sudo pkg install -y -f curl node libnghttp2 npm openssl
|
||||||
|
sudo npm install -g yarn --ignore-scripts
|
||||||
|
curl https://sh.rustup.rs -sSf --output rustup.sh
|
||||||
|
sh rustup.sh -y --profile minimal --default-toolchain beta
|
||||||
|
source "$HOME/.cargo/env"
|
||||||
|
echo "~~~~ rustc --version ~~~~"
|
||||||
|
rustc --version
|
||||||
|
echo "~~~~ node -v ~~~~"
|
||||||
|
node -v
|
||||||
|
echo "~~~~ yarn --version ~~~~"
|
||||||
|
yarn --version
|
||||||
|
pwd
|
||||||
|
ls -lah
|
||||||
|
whoami
|
||||||
|
env
|
||||||
|
freebsd-version
|
||||||
|
yarn install
|
||||||
|
yarn build
|
||||||
|
rm -rf node_modules
|
||||||
|
rm -rf target
|
||||||
|
rm -rf .yarn/cache
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-freebsd
|
||||||
|
path: ${{ env.APP_NAME }}.*.node
|
||||||
|
if-no-files-found: error
|
||||||
|
test-macOS-windows-binding:
|
||||||
|
name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
settings:
|
||||||
|
- host: macos-latest
|
||||||
|
target: x86_64-apple-darwin
|
||||||
|
- host: windows-latest
|
||||||
|
target: x86_64-pc-windows-msvc
|
||||||
|
node:
|
||||||
|
- '18'
|
||||||
|
- '20'
|
||||||
|
runs-on: ${{ matrix.settings.host }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node }}
|
||||||
|
cache: yarn
|
||||||
|
architecture: x64
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-${{ matrix.settings.target }}
|
||||||
|
path: .
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R .
|
||||||
|
shell: bash
|
||||||
|
- name: Test bindings
|
||||||
|
run: yarn test
|
||||||
|
test-linux-x64-gnu-binding:
|
||||||
|
name: Test bindings on Linux-x64-gnu - node@${{ matrix.node }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
node:
|
||||||
|
- '18'
|
||||||
|
- '20'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node }}
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-x86_64-unknown-linux-gnu
|
||||||
|
path: .
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R .
|
||||||
|
shell: bash
|
||||||
|
- name: Test bindings
|
||||||
|
run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-slim yarn test
|
||||||
|
test-linux-x64-musl-binding:
|
||||||
|
name: Test bindings on x86_64-unknown-linux-musl - node@${{ matrix.node }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
node:
|
||||||
|
- '18'
|
||||||
|
- '20'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node }}
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
yarn config set supportedArchitectures.libc "musl"
|
||||||
|
yarn install
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-x86_64-unknown-linux-musl
|
||||||
|
path: .
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R .
|
||||||
|
shell: bash
|
||||||
|
- name: Test bindings
|
||||||
|
run: docker run --rm -v $(pwd):/build -w /build node:${{ matrix.node }}-alpine yarn test
|
||||||
|
test-linux-aarch64-gnu-binding:
|
||||||
|
name: Test bindings on aarch64-unknown-linux-gnu - node@${{ matrix.node }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
node:
|
||||||
|
- '18'
|
||||||
|
- '20'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-aarch64-unknown-linux-gnu
|
||||||
|
path: .
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R .
|
||||||
|
shell: bash
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
yarn config set supportedArchitectures.cpu "arm64"
|
||||||
|
yarn config set supportedArchitectures.libc "glibc"
|
||||||
|
yarn install
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
with:
|
||||||
|
platforms: arm64
|
||||||
|
- run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||||
|
- name: Setup and run tests
|
||||||
|
uses: addnab/docker-run-action@v3
|
||||||
|
with:
|
||||||
|
image: node:${{ matrix.node }}-slim
|
||||||
|
options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build'
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
yarn test
|
||||||
|
ls -la
|
||||||
|
test-linux-aarch64-musl-binding:
|
||||||
|
name: Test bindings on aarch64-unknown-linux-musl - node@${{ matrix.node }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-aarch64-unknown-linux-musl
|
||||||
|
path: .
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R .
|
||||||
|
shell: bash
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
yarn config set supportedArchitectures.cpu "arm64"
|
||||||
|
yarn config set supportedArchitectures.libc "musl"
|
||||||
|
yarn install
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
with:
|
||||||
|
platforms: arm64
|
||||||
|
- run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||||
|
- name: Setup and run tests
|
||||||
|
uses: addnab/docker-run-action@v3
|
||||||
|
with:
|
||||||
|
image: node:lts-alpine
|
||||||
|
options: '--platform linux/arm64 -v ${{ github.workspace }}:/build -w /build'
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
yarn test
|
||||||
|
test-linux-arm-gnueabihf-binding:
|
||||||
|
name: Test bindings on armv7-unknown-linux-gnueabihf - node@${{ matrix.node }}
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
node:
|
||||||
|
- '18'
|
||||||
|
- '20'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-armv7-unknown-linux-gnueabihf
|
||||||
|
path: .
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R .
|
||||||
|
shell: bash
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
yarn config set supportedArchitectures.cpu "arm"
|
||||||
|
yarn install
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v3
|
||||||
|
with:
|
||||||
|
platforms: arm
|
||||||
|
- run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
|
||||||
|
- name: Setup and run tests
|
||||||
|
uses: addnab/docker-run-action@v3
|
||||||
|
with:
|
||||||
|
image: node:${{ matrix.node }}-bullseye-slim
|
||||||
|
options: '--platform linux/arm/v7 -v ${{ github.workspace }}:/build -w /build'
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
yarn test
|
||||||
|
ls -la
|
||||||
|
universal-macOS:
|
||||||
|
name: Build universal macOS binary
|
||||||
|
needs:
|
||||||
|
- build
|
||||||
|
runs-on: macos-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Download macOS x64 artifact
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-x86_64-apple-darwin
|
||||||
|
path: artifacts
|
||||||
|
- name: Download macOS arm64 artifact
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-aarch64-apple-darwin
|
||||||
|
path: artifacts
|
||||||
|
- name: Combine binaries
|
||||||
|
run: yarn universal
|
||||||
|
- name: Upload artifact
|
||||||
|
uses: actions/upload-artifact@v4
|
||||||
|
with:
|
||||||
|
name: bindings-universal-apple-darwin
|
||||||
|
path: ${{ env.APP_NAME }}.*.node
|
||||||
|
if-no-files-found: error
|
||||||
|
publish:
|
||||||
|
name: Publish
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- build-freebsd
|
||||||
|
- test-macOS-windows-binding
|
||||||
|
- test-linux-x64-gnu-binding
|
||||||
|
- test-linux-x64-musl-binding
|
||||||
|
- test-linux-aarch64-gnu-binding
|
||||||
|
- test-linux-aarch64-musl-binding
|
||||||
|
- test-linux-arm-gnueabihf-binding
|
||||||
|
- universal-macOS
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@v1
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
app-id: ${{ vars.NOCOBASE_APP_ID }}
|
||||||
|
private-key: ${{ secrets.NOCOBASE_APP_PRIVATE_KEY }}
|
||||||
|
repositories: license-kit
|
||||||
|
skip-token-revoke: true
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: nocobase/license-kit
|
||||||
|
token: ${{ steps.app-token.outputs.token }}
|
||||||
|
persist-credentials: true
|
||||||
|
ref: main
|
||||||
|
- name: Setup node
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Download all artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
path: artifacts
|
||||||
|
- name: Move artifacts
|
||||||
|
run: yarn artifacts
|
||||||
|
- name: List packages
|
||||||
|
run: ls -R ./npm
|
||||||
|
shell: bash
|
||||||
|
- name: Publish
|
||||||
|
run: |
|
||||||
|
npm config set provenance true
|
||||||
|
if git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+$";
|
||||||
|
then
|
||||||
|
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
|
||||||
|
npm publish --access public
|
||||||
|
elif git log -1 --pretty=%B | grep "^[0-9]\+\.[0-9]\+\.[0-9]\+";
|
||||||
|
then
|
||||||
|
echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc
|
||||||
|
npm publish --tag next --access public
|
||||||
|
else
|
||||||
|
echo "Not a release, skipping publish"
|
||||||
|
fi
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
30
packages/core/client/src/common/AppNotFound.tsx
Normal file
30
packages/core/client/src/common/AppNotFound.tsx
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* This file is part of the NocoBase (R) project.
|
||||||
|
* Copyright (c) 2020-2024 NocoBase Co., Ltd.
|
||||||
|
* Authors: NocoBase Team.
|
||||||
|
*
|
||||||
|
* This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
|
||||||
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { Button, Result } from 'antd';
|
||||||
|
import React from 'react';
|
||||||
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
|
export const AppNotFound = () => {
|
||||||
|
const navigate = useNavigate();
|
||||||
|
const { t } = useTranslation();
|
||||||
|
return (
|
||||||
|
<Result
|
||||||
|
status="404"
|
||||||
|
title="404"
|
||||||
|
subTitle={t('Sorry, the page you visited does not exist.')}
|
||||||
|
extra={
|
||||||
|
<Button onClick={() => navigate('/', { replace: true })} type="primary">
|
||||||
|
Back Home
|
||||||
|
</Button>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
};
|
@ -7,5 +7,6 @@
|
|||||||
* For more information, please refer to: https://www.nocobase.com/agreement.
|
* For more information, please refer to: https://www.nocobase.com/agreement.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
export * from './AppNotFound';
|
||||||
export * from './SelectWithTitle';
|
export * from './SelectWithTitle';
|
||||||
export * from './useFieldComponentName';
|
export * from './useFieldComponentName';
|
||||||
|
@ -28,7 +28,7 @@ test.describe('where grid card block can be added', () => {
|
|||||||
await expect(page.getByLabel('block-item-BlockItem-users-grid-card')).toBeVisible();
|
await expect(page.getByLabel('block-item-BlockItem-users-grid-card')).toBeVisible();
|
||||||
});
|
});
|
||||||
|
|
||||||
test('popup', async ({ page, mockPage }) => {
|
test.skip('popup', async ({ page, mockPage }) => {
|
||||||
await mockPage(oneEmptyTableWithUsers).goto();
|
await mockPage(oneEmptyTableWithUsers).goto();
|
||||||
|
|
||||||
// 1. 打开弹窗,通过 Associated records 创建一个列表区块
|
// 1. 打开弹窗,通过 Associated records 创建一个列表区块
|
||||||
|
@ -17,14 +17,14 @@ test('action linkage by row data', async ({ page, mockPage }) => {
|
|||||||
.getByLabel('action-Action.Link-Edit-update-roles-table-admin')
|
.getByLabel('action-Action.Link-Edit-update-roles-table-admin')
|
||||||
.locator('.nb-action-title');
|
.locator('.nb-action-title');
|
||||||
const adminEditActionStyle = await adminEditAction.evaluate((element) => {
|
const adminEditActionStyle = await adminEditAction.evaluate((element) => {
|
||||||
const computedStyle = window.getComputedStyle(element);
|
const computedStyle = window.getComputedStyle(element.querySelector('.nb-action-title'));
|
||||||
return {
|
return {
|
||||||
opacity: computedStyle.opacity,
|
opacity: computedStyle.opacity,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
const rootEditAction = page.getByLabel('action-Action.Link-Edit-update-roles-table-root').locator('.nb-action-title');
|
const rootEditAction = page.getByLabel('action-Action.Link-Edit-update-roles-table-root').locator('.nb-action-title');
|
||||||
const rootEditActionStyle = await rootEditAction.evaluate((element) => {
|
const rootEditActionStyle = await rootEditAction.evaluate((element) => {
|
||||||
const computedStyle = window.getComputedStyle(element);
|
const computedStyle = window.getComputedStyle(element.querySelector('.nb-action-title'));
|
||||||
return {
|
return {
|
||||||
opacity: computedStyle.opacity,
|
opacity: computedStyle.opacity,
|
||||||
// 添加其他你需要的样式属性
|
// 添加其他你需要的样式属性
|
||||||
|
@ -14,12 +14,13 @@ import { getSubAppName } from '@nocobase/sdk';
|
|||||||
import { tval } from '@nocobase/utils/client';
|
import { tval } from '@nocobase/utils/client';
|
||||||
import { Button, Modal, Result, Spin } from 'antd';
|
import { Button, Modal, Result, Spin } from 'antd';
|
||||||
import React, { FC } from 'react';
|
import React, { FC } from 'react';
|
||||||
import { Navigate, useNavigate } from 'react-router-dom';
|
import { Navigate } from 'react-router-dom';
|
||||||
import { ACLPlugin } from '../acl';
|
import { ACLPlugin } from '../acl';
|
||||||
import { Application } from '../application';
|
import { Application } from '../application';
|
||||||
import { Plugin } from '../application/Plugin';
|
import { Plugin } from '../application/Plugin';
|
||||||
import { BlockSchemaComponentPlugin } from '../block-provider';
|
import { BlockSchemaComponentPlugin } from '../block-provider';
|
||||||
import { CollectionPlugin } from '../collection-manager';
|
import { CollectionPlugin } from '../collection-manager';
|
||||||
|
import { AppNotFound } from '../common/AppNotFound';
|
||||||
import { RemoteDocumentTitlePlugin } from '../document-title';
|
import { RemoteDocumentTitlePlugin } from '../document-title';
|
||||||
import { PinnedListPlugin } from '../plugin-manager';
|
import { PinnedListPlugin } from '../plugin-manager';
|
||||||
import { PMPlugin } from '../pm';
|
import { PMPlugin } from '../pm';
|
||||||
@ -260,22 +261,6 @@ const AppMaintainingDialog: FC<{ app: Application; error: Error }> = observer(
|
|||||||
{ displayName: 'AppMaintainingDialog' },
|
{ displayName: 'AppMaintainingDialog' },
|
||||||
);
|
);
|
||||||
|
|
||||||
export const AppNotFound = () => {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
return (
|
|
||||||
<Result
|
|
||||||
status="404"
|
|
||||||
title="404"
|
|
||||||
subTitle="Sorry, the page you visited does not exist."
|
|
||||||
extra={
|
|
||||||
<Button onClick={() => navigate('/', { replace: true })} type="primary">
|
|
||||||
Back Home
|
|
||||||
</Button>
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export class NocoBaseBuildInPlugin extends Plugin {
|
export class NocoBaseBuildInPlugin extends Plugin {
|
||||||
async afterAdd() {
|
async afterAdd() {
|
||||||
this.app.addComponents({
|
this.app.addComponents({
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
export * from './PluginManagerLink';
|
export * from './PluginManagerLink';
|
||||||
import { PageHeader } from '@ant-design/pro-layout';
|
import { PageHeader } from '@ant-design/pro-layout';
|
||||||
import { useDebounce } from 'ahooks';
|
import { useDebounce } from 'ahooks';
|
||||||
import { Button, Col, Divider, Input, List, Modal, Result, Row, Space, Spin, Table, Tabs, TableProps } from 'antd';
|
import { Button, Col, Divider, Input, List, Modal, Row, Space, Spin, Table, TableProps, Tabs } from 'antd';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import React, { useEffect, useMemo, useState } from 'react';
|
import React, { useEffect, useMemo, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
@ -19,6 +19,7 @@ import { useNavigate, useParams } from 'react-router-dom';
|
|||||||
import { css } from '@emotion/css';
|
import { css } from '@emotion/css';
|
||||||
import { useACLRoleContext } from '../acl/ACLProvider';
|
import { useACLRoleContext } from '../acl/ACLProvider';
|
||||||
import { useAPIClient, useRequest } from '../api-client';
|
import { useAPIClient, useRequest } from '../api-client';
|
||||||
|
import { AppNotFound } from '../common/AppNotFound';
|
||||||
import { useDocumentTitle } from '../document-title';
|
import { useDocumentTitle } from '../document-title';
|
||||||
import { useToken } from '../style';
|
import { useToken } from '../style';
|
||||||
import { PluginCard } from './PluginCard';
|
import { PluginCard } from './PluginCard';
|
||||||
@ -146,7 +147,7 @@ function BulkEnableButton({ plugins = [] }) {
|
|||||||
width: 300,
|
width: 300,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
},
|
},
|
||||||
] as TableProps['columns']
|
] as TableProps<any>['columns']
|
||||||
}
|
}
|
||||||
dataSource={items}
|
dataSource={items}
|
||||||
/>
|
/>
|
||||||
@ -409,6 +410,6 @@ export const PluginManager = () => {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<Result status="404" title="404" subTitle="Sorry, the page you visited does not exist." />
|
<AppNotFound />
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
@ -9,11 +9,12 @@
|
|||||||
|
|
||||||
import { PageHeader } from '@ant-design/pro-layout';
|
import { PageHeader } from '@ant-design/pro-layout';
|
||||||
import { css } from '@emotion/css';
|
import { css } from '@emotion/css';
|
||||||
import { Layout, Menu, Result } from 'antd';
|
import { Layout, Menu } from 'antd';
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import React, { createContext, useCallback, useEffect, useMemo } from 'react';
|
import React, { createContext, useCallback, useEffect, useMemo } from 'react';
|
||||||
import { Navigate, Outlet, useLocation, useNavigate, useParams } from 'react-router-dom';
|
import { Navigate, Outlet, useLocation, useNavigate, useParams } from 'react-router-dom';
|
||||||
import { ADMIN_SETTINGS_PATH, PluginSettingsPageType, useApp } from '../application';
|
import { ADMIN_SETTINGS_PATH, PluginSettingsPageType, useApp } from '../application';
|
||||||
|
import { AppNotFound } from '../common/AppNotFound';
|
||||||
import { useDocumentTitle } from '../document-title';
|
import { useDocumentTitle } from '../document-title';
|
||||||
import { useCompile } from '../schema-component';
|
import { useCompile } from '../schema-component';
|
||||||
import { useStyles } from './style';
|
import { useStyles } from './style';
|
||||||
@ -223,13 +224,7 @@ export const AdminSettingsLayout = () => {
|
|||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
<div className={styles.pageContent}>
|
<div className={styles.pageContent}>{currentSetting ? <Outlet /> : <AppNotFound />}</div>
|
||||||
{currentSetting ? (
|
|
||||||
<Outlet />
|
|
||||||
) : (
|
|
||||||
<Result status="404" title="404" subTitle="Sorry, the page you visited does not exist." />
|
|
||||||
)}
|
|
||||||
</div>
|
|
||||||
</Layout.Content>
|
</Layout.Content>
|
||||||
</Layout>
|
</Layout>
|
||||||
</div>
|
</div>
|
||||||
|
@ -18,7 +18,6 @@ import { useTranslation } from 'react-i18next';
|
|||||||
import { Link, Navigate, Outlet, useLocation, useNavigate } from 'react-router-dom';
|
import { Link, Navigate, Outlet, useLocation, useNavigate } from 'react-router-dom';
|
||||||
import {
|
import {
|
||||||
ACLRolesCheckProvider,
|
ACLRolesCheckProvider,
|
||||||
AppNotFound,
|
|
||||||
CurrentAppInfoProvider,
|
CurrentAppInfoProvider,
|
||||||
DndContext,
|
DndContext,
|
||||||
Icon,
|
Icon,
|
||||||
@ -46,6 +45,7 @@ import {
|
|||||||
useLocationNoUpdate,
|
useLocationNoUpdate,
|
||||||
} from '../../../application/CustomRouterContextProvider';
|
} from '../../../application/CustomRouterContextProvider';
|
||||||
import { Plugin } from '../../../application/Plugin';
|
import { Plugin } from '../../../application/Plugin';
|
||||||
|
import { AppNotFound } from '../../../common/AppNotFound';
|
||||||
import { withTooltipComponent } from '../../../hoc/withTooltipComponent';
|
import { withTooltipComponent } from '../../../hoc/withTooltipComponent';
|
||||||
import { menuItemInitializer } from '../../../modules/menu/menuItemInitializer';
|
import { menuItemInitializer } from '../../../modules/menu/menuItemInitializer';
|
||||||
import { useMenuTranslation } from '../../../schema-component/antd/menu/locale';
|
import { useMenuTranslation } from '../../../schema-component/antd/menu/locale';
|
||||||
|
@ -47,6 +47,11 @@ const components = { TreeSelect };
|
|||||||
const toItems = (routes: NocoBaseDesktopRoute[], { t, compile }) => {
|
const toItems = (routes: NocoBaseDesktopRoute[], { t, compile }) => {
|
||||||
const items = [];
|
const items = [];
|
||||||
for (const route of routes) {
|
for (const route of routes) {
|
||||||
|
// filter out the tabs
|
||||||
|
if (route.type === NocoBaseDesktopRouteType.tabs) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const item = {
|
const item = {
|
||||||
label: isVariable(route.title) ? compile(route.title) : t(route.title),
|
label: isVariable(route.title) ? compile(route.title) : t(route.title),
|
||||||
value: `${route.id}||${route.type}`,
|
value: `${route.id}||${route.type}`,
|
||||||
|
@ -30,10 +30,10 @@ import {
|
|||||||
useNavigateNoUpdate,
|
useNavigateNoUpdate,
|
||||||
useRouterBasename,
|
useRouterBasename,
|
||||||
} from '../../../application/CustomRouterContextProvider';
|
} from '../../../application/CustomRouterContextProvider';
|
||||||
|
import { AppNotFound } from '../../../common/AppNotFound';
|
||||||
import { useDocumentTitle } from '../../../document-title';
|
import { useDocumentTitle } from '../../../document-title';
|
||||||
import { useGlobalTheme } from '../../../global-theme';
|
import { useGlobalTheme } from '../../../global-theme';
|
||||||
import { Icon } from '../../../icon';
|
import { Icon } from '../../../icon';
|
||||||
import { AppNotFound } from '../../../nocobase-buildin-plugin';
|
|
||||||
import {
|
import {
|
||||||
NocoBaseDesktopRouteType,
|
NocoBaseDesktopRouteType,
|
||||||
NocoBaseRouteContext,
|
NocoBaseRouteContext,
|
||||||
@ -234,7 +234,10 @@ const InternalPageContent = (props: PageContentProps) => {
|
|||||||
// Create a clean search string or empty string if only '?' remains
|
// Create a clean search string or empty string if only '?' remains
|
||||||
const searchString = searchParams.toString() ? `?${searchParams.toString()}` : '';
|
const searchString = searchParams.toString() ? `?${searchParams.toString()}` : '';
|
||||||
|
|
||||||
navigate(location.pathname.replace(activeKey, oldTab.schemaUid) + searchString);
|
const newPath =
|
||||||
|
location.pathname + (location.pathname.endsWith('/') ? `tabs/${oldTab.schemaUid}` : `/tabs/${oldTab.schemaUid}`);
|
||||||
|
navigate(newPath + searchString);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,12 +10,11 @@
|
|||||||
import { ISchema, Schema } from '@formily/json-schema';
|
import { ISchema, Schema } from '@formily/json-schema';
|
||||||
import { useFieldSchema } from '@formily/react';
|
import { useFieldSchema } from '@formily/react';
|
||||||
import { uid } from '@formily/shared';
|
import { uid } from '@formily/shared';
|
||||||
import { Result } from 'antd';
|
|
||||||
import _ from 'lodash';
|
import _ from 'lodash';
|
||||||
import { FC, default as React, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
import { FC, default as React, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
import { useTranslation } from 'react-i18next';
|
|
||||||
import { Location, useLocation } from 'react-router-dom';
|
import { Location, useLocation } from 'react-router-dom';
|
||||||
import { useAPIClient } from '../../../api-client';
|
import { useAPIClient } from '../../../api-client';
|
||||||
|
import { AppNotFound } from '../../../common/AppNotFound';
|
||||||
import { DataBlockProvider } from '../../../data-source/data-block/DataBlockProvider';
|
import { DataBlockProvider } from '../../../data-source/data-block/DataBlockProvider';
|
||||||
import { BlockRequestContextProvider } from '../../../data-source/data-block/DataBlockRequestProvider';
|
import { BlockRequestContextProvider } from '../../../data-source/data-block/DataBlockRequestProvider';
|
||||||
import { useKeepAlive } from '../../../route-switch/antd/admin-layout/KeepAlive';
|
import { useKeepAlive } from '../../../route-switch/antd/admin-layout/KeepAlive';
|
||||||
@ -475,10 +474,7 @@ function get404Schema() {
|
|||||||
version: '2.0',
|
version: '2.0',
|
||||||
type: 'void',
|
type: 'void',
|
||||||
'x-component': function Com() {
|
'x-component': function Com() {
|
||||||
const { t } = useTranslation();
|
return <AppNotFound />;
|
||||||
return (
|
|
||||||
<Result status="404" title="404" subTitle={t('Sorry, the page you visited does not exist.')} />
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
'x-uid': uid(),
|
'x-uid': uid(),
|
||||||
'x-async': false,
|
'x-async': false,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user