Simplify build scripts
This commit is contained in:
parent
47479896d5
commit
03856fe868
19 changed files with 300 additions and 634 deletions
|
|
@ -1,14 +1,20 @@
|
||||||
name: Check
|
name: Check and publish
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: ['main']
|
branches: ["main"]
|
||||||
|
tags: ["*"]
|
||||||
|
workflow_dispatch:
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: ['main']
|
branches: ["main"]
|
||||||
|
|
||||||
env:
|
env:
|
||||||
CARGO_TERM_COLOR: always
|
CARGO_TERM_COLOR: always
|
||||||
RUSTFLAGS: '-Dwarnings'
|
RUSTFLAGS: "-Dwarnings"
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: reconcile-${{ github.ref }}
|
||||||
|
cancel-in-progress: false
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|
@ -20,8 +26,9 @@ jobs:
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '22.x'
|
node-version: "22.x"
|
||||||
check-latest: true
|
check-latest: true
|
||||||
|
registry-url: https://registry.npmjs.org
|
||||||
|
|
||||||
- name: Cache Rust dependencies
|
- name: Cache Rust dependencies
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
|
|
@ -40,8 +47,6 @@ jobs:
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
reconcile-js/node_modules
|
|
||||||
examples/website/node_modules
|
|
||||||
~/.npm
|
~/.npm
|
||||||
key: >-
|
key: >-
|
||||||
${{ runner.os }}-npm-${{
|
${{ runner.os }}-npm-${{
|
||||||
|
|
@ -64,6 +69,12 @@ jobs:
|
||||||
curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh
|
curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: scripts/setup.sh
|
||||||
|
|
||||||
|
- name: Build bindings
|
||||||
|
run: scripts/build.sh
|
||||||
|
|
||||||
- name: Lint
|
- name: Lint
|
||||||
run: scripts/lint.sh
|
run: scripts/lint.sh
|
||||||
|
|
||||||
|
|
@ -77,3 +88,183 @@ jobs:
|
||||||
|
|
||||||
- name: Build website
|
- name: Build website
|
||||||
run: scripts/build-website.sh
|
run: scripts/build-website.sh
|
||||||
|
|
||||||
|
- name: Pack verified npm package
|
||||||
|
working-directory: reconcile-js
|
||||||
|
run: |
|
||||||
|
mkdir -p ../dist/npm
|
||||||
|
npm pack --pack-destination ../dist/npm
|
||||||
|
|
||||||
|
- name: Publish to npm
|
||||||
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
run: npm publish dist/npm/*.tgz
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
|
- name: Deploy to pages mount
|
||||||
|
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
||||||
|
uses: http://forgejo:3000/andras/ci-actions/deploy-pages@main
|
||||||
|
with:
|
||||||
|
source: examples/website/dist
|
||||||
|
target: reconcile
|
||||||
|
|
||||||
|
publish-crate:
|
||||||
|
needs: build
|
||||||
|
runs-on: docker
|
||||||
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Cache Rust dependencies
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/bin/
|
||||||
|
~/.cargo/registry/index/
|
||||||
|
~/.cargo/registry/cache/
|
||||||
|
~/.cargo/git/db/
|
||||||
|
target/
|
||||||
|
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-cargo-
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
||||||
|
| sh -s -- -y --default-toolchain none --profile minimal
|
||||||
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Publish to crates.io
|
||||||
|
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
|
||||||
|
|
||||||
|
publish-pypi:
|
||||||
|
needs: build
|
||||||
|
runs-on: docker
|
||||||
|
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Cache Rust dependencies
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/bin/
|
||||||
|
~/.cargo/registry/index/
|
||||||
|
~/.cargo/registry/cache/
|
||||||
|
~/.cargo/git/db/
|
||||||
|
target/
|
||||||
|
key: ${{ runner.os }}-cargo-pypi-${{ hashFiles('**/Cargo.lock') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-cargo-pypi-
|
||||||
|
${{ runner.os }}-cargo-
|
||||||
|
|
||||||
|
# clang/lld/llvm provide clang-cl, lld-link and llvm-lib, which cargo-xwin
|
||||||
|
# uses to cross-compile the Windows wheel from this Linux runner.
|
||||||
|
- name: Install cross-compilation system dependencies
|
||||||
|
run: |
|
||||||
|
apt-get update
|
||||||
|
apt-get install -y clang lld llvm
|
||||||
|
|
||||||
|
- name: Install Rust toolchain
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
||||||
|
| sh -s -- -y --default-toolchain none --profile minimal
|
||||||
|
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
# The x86_64 Linux targets ship in rust-toolchain.toml; add the cross targets.
|
||||||
|
- name: Add cross-compilation Rust targets
|
||||||
|
run: |
|
||||||
|
rustup target add aarch64-unknown-linux-gnu aarch64-unknown-linux-musl \
|
||||||
|
aarch64-apple-darwin x86_64-apple-darwin x86_64-pc-windows-msvc
|
||||||
|
|
||||||
|
# zig is the C toolchain maturin's `--zig` uses to produce manylinux2014
|
||||||
|
# wheels with a pinned (old) glibc, independent of the runner's glibc.
|
||||||
|
# It also links the musllinux and macOS wheels, without a macOS SDK.
|
||||||
|
- name: Install zig
|
||||||
|
run: |
|
||||||
|
ZIG_VERSION=0.13.0
|
||||||
|
ZIG_INSTALL_DIR=$(mktemp -d "${RUNNER_TEMP:-/tmp}/reconcile-zig.XXXXXX")
|
||||||
|
curl --proto '=https' --tlsv1.2 -fLsS \
|
||||||
|
"https://ziglang.org/download/${ZIG_VERSION}/zig-linux-x86_64-${ZIG_VERSION}.tar.xz" \
|
||||||
|
| tar -xJ -C "$ZIG_INSTALL_DIR"
|
||||||
|
echo "$ZIG_INSTALL_DIR/zig-linux-x86_64-${ZIG_VERSION}" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Install cargo-xwin
|
||||||
|
run: command -v cargo-xwin || cargo install --locked cargo-xwin
|
||||||
|
|
||||||
|
- name: Install uv
|
||||||
|
run: |
|
||||||
|
curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh
|
||||||
|
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
||||||
|
|
||||||
|
- name: Copy README and license
|
||||||
|
run: cp README.md LICENSE reconcile-python/
|
||||||
|
|
||||||
|
- name: Install Python build dependencies
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: uv sync --frozen --no-install-project
|
||||||
|
|
||||||
|
- name: Build sdist
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: uv run --no-sync maturin sdist --out dist
|
||||||
|
|
||||||
|
- name: Check sdist size
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: |
|
||||||
|
size=$(stat -c %s dist/*.tar.gz)
|
||||||
|
echo "sdist is $size bytes"
|
||||||
|
test "$size" -lt 5000000
|
||||||
|
|
||||||
|
- name: Build Linux x86_64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--compatibility manylinux2014
|
||||||
|
--target x86_64-unknown-linux-gnu --zig
|
||||||
|
|
||||||
|
- name: Build Linux aarch64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--compatibility manylinux2014
|
||||||
|
--target aarch64-unknown-linux-gnu --zig
|
||||||
|
|
||||||
|
- name: Build musllinux x86_64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--compatibility musllinux_1_2
|
||||||
|
--target x86_64-unknown-linux-musl --zig
|
||||||
|
|
||||||
|
- name: Build musllinux aarch64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--compatibility musllinux_1_2
|
||||||
|
--target aarch64-unknown-linux-musl --zig
|
||||||
|
|
||||||
|
- name: Build macOS x86_64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--target x86_64-apple-darwin --zig
|
||||||
|
|
||||||
|
- name: Build macOS arm64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--target aarch64-apple-darwin --zig
|
||||||
|
|
||||||
|
- name: Build Windows x86_64 wheel
|
||||||
|
working-directory: reconcile-python
|
||||||
|
run: >-
|
||||||
|
uv run --no-sync maturin build --release --out dist
|
||||||
|
--target x86_64-pc-windows-msvc
|
||||||
|
|
||||||
|
- name: Publish to PyPI
|
||||||
|
working-directory: reconcile-python
|
||||||
|
env:
|
||||||
|
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
||||||
|
run: uv run --no-sync maturin upload --skip-existing dist/*
|
||||||
|
|
|
||||||
|
|
@ -1,307 +0,0 @@
|
||||||
name: Publish
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: ["main"]
|
|
||||||
tags: ["*"]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
env:
|
|
||||||
CARGO_TERM_COLOR: always
|
|
||||||
RUSTFLAGS: "-Dwarnings"
|
|
||||||
|
|
||||||
concurrency:
|
|
||||||
group: "pages"
|
|
||||||
cancel-in-progress: false
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: docker
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: "22.x"
|
|
||||||
check-latest: true
|
|
||||||
|
|
||||||
- name: Cache Rust dependencies
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-cargo-
|
|
||||||
|
|
||||||
- name: Cache npm dependencies
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
reconcile-js/node_modules
|
|
||||||
examples/website/node_modules
|
|
||||||
~/.npm
|
|
||||||
key: >-
|
|
||||||
${{ runner.os }}-npm-${{
|
|
||||||
hashFiles(
|
|
||||||
'reconcile-js/package-lock.json',
|
|
||||||
'examples/website/package-lock.json'
|
|
||||||
)
|
|
||||||
}}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-npm-
|
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
|
||||||
| sh -s -- -y --default-toolchain none --profile minimal
|
|
||||||
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Install uv
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh
|
|
||||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Lint
|
|
||||||
run: scripts/lint.sh
|
|
||||||
|
|
||||||
- name: Verify checkout is clean
|
|
||||||
run: |
|
|
||||||
git status --short
|
|
||||||
test -z "$(git status --porcelain)"
|
|
||||||
|
|
||||||
- name: Test
|
|
||||||
run: scripts/test.sh
|
|
||||||
|
|
||||||
- name: Build website
|
|
||||||
run: scripts/build-website.sh
|
|
||||||
|
|
||||||
- name: Deploy to pages mount
|
|
||||||
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
|
|
||||||
uses: http://forgejo:3000/andras/ci-actions/deploy-pages@main
|
|
||||||
with:
|
|
||||||
source: examples/website/dist
|
|
||||||
target: reconcile
|
|
||||||
|
|
||||||
publish-crate:
|
|
||||||
needs: build
|
|
||||||
runs-on: docker
|
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache Rust dependencies
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-cargo-
|
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
|
||||||
| sh -s -- -y --default-toolchain none --profile minimal
|
|
||||||
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Publish to crates.io
|
|
||||||
run: cargo publish --token ${{ secrets.CRATES_IO_TOKEN }}
|
|
||||||
|
|
||||||
publish-npm:
|
|
||||||
needs: build
|
|
||||||
runs-on: docker
|
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: "22.x"
|
|
||||||
check-latest: true
|
|
||||||
registry-url: "https://registry.npmjs.org"
|
|
||||||
|
|
||||||
- name: Cache Rust dependencies
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-cargo-
|
|
||||||
|
|
||||||
- name: Cache npm dependencies
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
reconcile-js/node_modules
|
|
||||||
~/.npm
|
|
||||||
key: >-
|
|
||||||
${{ runner.os }}-npm-${{
|
|
||||||
hashFiles('reconcile-js/package-lock.json')
|
|
||||||
}}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-npm-
|
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
|
||||||
| sh -s -- -y --default-toolchain none --profile minimal
|
|
||||||
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Build website
|
|
||||||
run: scripts/build-website.sh
|
|
||||||
|
|
||||||
- name: Publish reconcile-js to NPM
|
|
||||||
run: |
|
|
||||||
cd reconcile-js
|
|
||||||
cp ../README.md .
|
|
||||||
npm publish
|
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
||||||
|
|
||||||
publish-pypi:
|
|
||||||
needs: build
|
|
||||||
runs-on: docker
|
|
||||||
if: startsWith(github.ref, 'refs/tags/')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache Rust dependencies
|
|
||||||
uses: actions/cache@v4
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.cargo/bin/
|
|
||||||
~/.cargo/registry/index/
|
|
||||||
~/.cargo/registry/cache/
|
|
||||||
~/.cargo/git/db/
|
|
||||||
target/
|
|
||||||
key: ${{ runner.os }}-cargo-pypi-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-cargo-pypi-
|
|
||||||
${{ runner.os }}-cargo-
|
|
||||||
|
|
||||||
# clang/lld/llvm provide clang-cl, lld-link and llvm-lib, which cargo-xwin
|
|
||||||
# uses to cross-compile the Windows wheel from this Linux runner.
|
|
||||||
- name: Install cross-compilation system dependencies
|
|
||||||
run: |
|
|
||||||
apt-get update
|
|
||||||
apt-get install -y clang lld llvm
|
|
||||||
|
|
||||||
- name: Install Rust toolchain
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \
|
|
||||||
| sh -s -- -y --default-toolchain none --profile minimal
|
|
||||||
echo "$HOME/.cargo/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
# The x86_64 Linux targets ship in rust-toolchain.toml; add the cross targets.
|
|
||||||
- name: Add cross-compilation Rust targets
|
|
||||||
run: |
|
|
||||||
rustup target add aarch64-unknown-linux-gnu aarch64-unknown-linux-musl \
|
|
||||||
aarch64-apple-darwin x86_64-apple-darwin x86_64-pc-windows-msvc
|
|
||||||
|
|
||||||
# zig is the C toolchain maturin's `--zig` uses to produce manylinux2014
|
|
||||||
# wheels with a pinned (old) glibc, independent of the runner's glibc.
|
|
||||||
# It also links the musllinux and macOS wheels, without a macOS SDK.
|
|
||||||
- name: Install zig
|
|
||||||
run: |
|
|
||||||
ZIG_VERSION=0.13.0
|
|
||||||
ZIG_INSTALL_DIR=$(mktemp -d "${RUNNER_TEMP:-/tmp}/reconcile-zig.XXXXXX")
|
|
||||||
curl --proto '=https' --tlsv1.2 -fLsS \
|
|
||||||
"https://ziglang.org/download/${ZIG_VERSION}/zig-linux-x86_64-${ZIG_VERSION}.tar.xz" \
|
|
||||||
| tar -xJ -C "$ZIG_INSTALL_DIR"
|
|
||||||
echo "$ZIG_INSTALL_DIR/zig-linux-x86_64-${ZIG_VERSION}" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Install cargo-xwin
|
|
||||||
run: command -v cargo-xwin || cargo install --locked cargo-xwin
|
|
||||||
|
|
||||||
- name: Install uv
|
|
||||||
run: |
|
|
||||||
curl --proto '=https' --tlsv1.2 -LsSf https://astral.sh/uv/install.sh | sh
|
|
||||||
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
|
|
||||||
|
|
||||||
- name: Copy README and license
|
|
||||||
run: cp README.md LICENSE reconcile-python/
|
|
||||||
|
|
||||||
- name: Build sdist
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: uv run maturin sdist --out dist
|
|
||||||
|
|
||||||
- name: Check sdist size
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: |
|
|
||||||
size=$(stat -c %s dist/*.tar.gz)
|
|
||||||
echo "sdist is $size bytes"
|
|
||||||
test "$size" -lt 5000000
|
|
||||||
|
|
||||||
- name: Build Linux x86_64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--compatibility manylinux2014
|
|
||||||
--target x86_64-unknown-linux-gnu --zig
|
|
||||||
|
|
||||||
- name: Build Linux aarch64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--compatibility manylinux2014
|
|
||||||
--target aarch64-unknown-linux-gnu --zig
|
|
||||||
|
|
||||||
- name: Build musllinux x86_64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--compatibility musllinux_1_2
|
|
||||||
--target x86_64-unknown-linux-musl --zig
|
|
||||||
|
|
||||||
- name: Build musllinux aarch64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--compatibility musllinux_1_2
|
|
||||||
--target aarch64-unknown-linux-musl --zig
|
|
||||||
|
|
||||||
- name: Build macOS x86_64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--target x86_64-apple-darwin --zig
|
|
||||||
|
|
||||||
- name: Build macOS arm64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--target aarch64-apple-darwin --zig
|
|
||||||
|
|
||||||
- name: Build Windows x86_64 wheel
|
|
||||||
working-directory: reconcile-python
|
|
||||||
run: >-
|
|
||||||
uv run maturin build --release --out dist
|
|
||||||
--target x86_64-pc-windows-msvc
|
|
||||||
|
|
||||||
# Forgejo cannot use PyPI trusted publishing (OIDC), so authenticate with
|
|
||||||
# an API token. --skip-existing makes re-runs of a tag idempotent.
|
|
||||||
- name: Publish to PyPI
|
|
||||||
working-directory: reconcile-python
|
|
||||||
env:
|
|
||||||
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
|
|
||||||
run: uv run maturin upload --skip-existing dist/*
|
|
||||||
13
README.md
13
README.md
|
|
@ -134,9 +134,10 @@ Contributions are welcome!
|
||||||
|
|
||||||
### Python setup
|
### Python setup
|
||||||
|
|
||||||
Install [uv][uv] and build the extension for development:
|
Install [uv][uv], then build the extension for Python-only development:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
|
cp README.md LICENSE reconcile-python/
|
||||||
cd reconcile-python
|
cd reconcile-python
|
||||||
uv run maturin develop
|
uv run maturin develop
|
||||||
```
|
```
|
||||||
|
|
@ -166,6 +167,16 @@ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||||
|
|
||||||
### Scripts
|
### Scripts
|
||||||
|
|
||||||
|
After installing Node 22, rustup, and uv, run `scripts/check.sh` for the full
|
||||||
|
install, build, lint, test, and demo build sequence.
|
||||||
|
|
||||||
|
For individual steps, run `scripts/setup.sh` once to install dependencies and
|
||||||
|
`scripts/build.sh` to build the JS and Python bindings. Run the build again after
|
||||||
|
changing Rust or binding code. The lint, test, and website scripts use those
|
||||||
|
existing dependencies and build outputs.
|
||||||
|
|
||||||
|
- **Install dependencies**: `scripts/setup.sh`
|
||||||
|
- **Build bindings**: `scripts/build.sh` (or `scripts/build-js.sh` for JS only)
|
||||||
- **Run tests**: `scripts/test.sh`
|
- **Run tests**: `scripts/test.sh`
|
||||||
- **Check lint and formatting**: `scripts/lint.sh`
|
- **Check lint and formatting**: `scripts/lint.sh`
|
||||||
- **Run the demo locally**: `scripts/dev-website.sh`
|
- **Run the demo locally**: `scripts/dev-website.sh`
|
||||||
|
|
|
||||||
137
examples/website/package-lock.json
generated
137
examples/website/package-lock.json
generated
|
|
@ -14,10 +14,8 @@
|
||||||
"mini-css-extract-plugin": "^2.10.1",
|
"mini-css-extract-plugin": "^2.10.1",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"reconcile-text": "file:../../reconcile-js",
|
"reconcile-text": "file:../../reconcile-js",
|
||||||
"resolve-url-loader": "^5.0.0",
|
|
||||||
"sass": "^1.98.0",
|
"sass": "^1.98.0",
|
||||||
"sass-loader": "^16.0.7",
|
"sass-loader": "^16.0.7",
|
||||||
"svg-inline-loader": "^0.8.2",
|
|
||||||
"terser-webpack-plugin": "^5.4.0",
|
"terser-webpack-plugin": "^5.4.0",
|
||||||
"ts-loader": "^9.5.4",
|
"ts-loader": "^9.5.4",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
|
|
@ -48,8 +46,7 @@
|
||||||
"tslib": "2.8.1",
|
"tslib": "2.8.1",
|
||||||
"typescript": "5.9.3",
|
"typescript": "5.9.3",
|
||||||
"webpack": "^5.105.4",
|
"webpack": "^5.105.4",
|
||||||
"webpack-cli": "^6.0.1",
|
"webpack-cli": "^6.0.1"
|
||||||
"webpack-merge": "^6.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"../../reconcile-js/node_modules/@babel/code-frame": {
|
"../../reconcile-js/node_modules/@babel/code-frame": {
|
||||||
|
|
@ -6041,18 +6038,6 @@
|
||||||
"acorn": "^8.14.0"
|
"acorn": "^8.14.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/adjust-sourcemap-loader": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"loader-utils": "^2.0.0",
|
|
||||||
"regex-parser": "^2.2.11"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8.9"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ajv": {
|
"node_modules/ajv": {
|
||||||
"version": "8.18.0",
|
"version": "8.18.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
@ -6151,14 +6136,6 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/big.js": {
|
|
||||||
"version": "5.2.2",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": "*"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/body-parser": {
|
"node_modules/body-parser": {
|
||||||
"version": "2.4.0",
|
"version": "2.4.0",
|
||||||
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.4.0.tgz",
|
||||||
|
|
@ -6539,11 +6516,6 @@
|
||||||
"url": "https://opencollective.com/express"
|
"url": "https://opencollective.com/express"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/convert-source-map": {
|
|
||||||
"version": "1.9.0",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/cookie": {
|
"node_modules/cookie": {
|
||||||
"version": "0.7.2",
|
"version": "0.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
|
||||||
|
|
@ -6952,14 +6924,6 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "ISC"
|
"license": "ISC"
|
||||||
},
|
},
|
||||||
"node_modules/emojis-list": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/encodeurl": {
|
"node_modules/encodeurl": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
|
||||||
|
|
@ -7957,17 +7921,6 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/json5": {
|
|
||||||
"version": "2.2.3",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"bin": {
|
|
||||||
"json5": "lib/cli.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/kind-of": {
|
"node_modules/kind-of": {
|
||||||
"version": "6.0.3",
|
"version": "6.0.3",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
@ -7999,19 +7952,6 @@
|
||||||
"url": "https://opencollective.com/webpack"
|
"url": "https://opencollective.com/webpack"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/loader-utils": {
|
|
||||||
"version": "2.0.4",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"big.js": "^5.2.2",
|
|
||||||
"emojis-list": "^3.0.0",
|
|
||||||
"json5": "^2.1.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8.9.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/locate-path": {
|
"node_modules/locate-path": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
@ -8162,14 +8102,6 @@
|
||||||
"webpack": "^5.0.0"
|
"webpack": "^5.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/minimist": {
|
|
||||||
"version": "1.2.8",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/ms": {
|
"node_modules/ms": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
@ -8298,14 +8230,6 @@
|
||||||
"url": "https://github.com/fb55/nth-check?sponsor=1"
|
"url": "https://github.com/fb55/nth-check?sponsor=1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/object-assign": {
|
|
||||||
"version": "4.1.1",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/object-inspect": {
|
"node_modules/object-inspect": {
|
||||||
"version": "1.13.4",
|
"version": "1.13.4",
|
||||||
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
|
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
|
||||||
|
|
@ -8792,11 +8716,6 @@
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
},
|
},
|
||||||
"node_modules/regex-parser": {
|
|
||||||
"version": "2.3.1",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/relateurl": {
|
"node_modules/relateurl": {
|
||||||
"version": "0.2.7",
|
"version": "0.2.7",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
@ -8929,21 +8848,6 @@
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/resolve-url-loader": {
|
|
||||||
"version": "5.0.0",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"adjust-sourcemap-loader": "^4.0.0",
|
|
||||||
"convert-source-map": "^1.7.0",
|
|
||||||
"loader-utils": "^2.0.0",
|
|
||||||
"postcss": "^8.2.14",
|
|
||||||
"source-map": "0.6.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=12"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/router": {
|
"node_modules/router": {
|
||||||
"version": "2.2.0",
|
"version": "2.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
|
||||||
|
|
@ -9452,11 +9356,6 @@
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/simple-html-tokenizer": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/source-map": {
|
"node_modules/source-map": {
|
||||||
"version": "0.6.1",
|
"version": "0.6.1",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
|
@ -9530,40 +9429,6 @@
|
||||||
"url": "https://github.com/sponsors/ljharb"
|
"url": "https://github.com/sponsors/ljharb"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svg-inline-loader": {
|
|
||||||
"version": "0.8.2",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"loader-utils": "^1.1.0",
|
|
||||||
"object-assign": "^4.0.1",
|
|
||||||
"simple-html-tokenizer": "^0.1.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/svg-inline-loader/node_modules/json5": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"minimist": "^1.2.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"json5": "lib/cli.js"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/svg-inline-loader/node_modules/loader-utils": {
|
|
||||||
"version": "1.4.2",
|
|
||||||
"dev": true,
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"big.js": "^5.2.2",
|
|
||||||
"emojis-list": "^3.0.0",
|
|
||||||
"json5": "^1.0.1"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/svgo": {
|
"node_modules/svgo": {
|
||||||
"version": "3.3.5",
|
"version": "3.3.5",
|
||||||
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.5.tgz",
|
"resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.5.tgz",
|
||||||
|
|
|
||||||
|
|
@ -30,10 +30,8 @@
|
||||||
"mini-css-extract-plugin": "^2.10.1",
|
"mini-css-extract-plugin": "^2.10.1",
|
||||||
"prettier": "^3.8.1",
|
"prettier": "^3.8.1",
|
||||||
"reconcile-text": "file:../../reconcile-js",
|
"reconcile-text": "file:../../reconcile-js",
|
||||||
"resolve-url-loader": "^5.0.0",
|
|
||||||
"sass": "^1.98.0",
|
"sass": "^1.98.0",
|
||||||
"sass-loader": "^16.0.7",
|
"sass-loader": "^16.0.7",
|
||||||
"svg-inline-loader": "^0.8.2",
|
|
||||||
"terser-webpack-plugin": "^5.4.0",
|
"terser-webpack-plugin": "^5.4.0",
|
||||||
"ts-loader": "^9.5.4",
|
"ts-loader": "^9.5.4",
|
||||||
"typescript": "^5.9.3",
|
"typescript": "^5.9.3",
|
||||||
|
|
|
||||||
|
|
@ -55,21 +55,13 @@ module.exports = (_env, argv) => ({
|
||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
|
||||||
test: /\.svg$/i,
|
|
||||||
use: 'svg-inline-loader',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
test: /\.scss$/i,
|
test: /\.scss$/i,
|
||||||
use: [
|
use: [
|
||||||
MiniCssExtractPlugin.loader,
|
MiniCssExtractPlugin.loader,
|
||||||
'css-loader',
|
'css-loader',
|
||||||
'resolve-url-loader',
|
|
||||||
{
|
{
|
||||||
loader: 'sass-loader',
|
loader: 'sass-loader',
|
||||||
options: {
|
|
||||||
sourceMap: true, // required by resolve-url-loader
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
|
||||||
3
reconcile-js/package-lock.json
generated
3
reconcile-js/package-lock.json
generated
|
|
@ -19,8 +19,7 @@
|
||||||
"tslib": "2.8.1",
|
"tslib": "2.8.1",
|
||||||
"typescript": "5.9.3",
|
"typescript": "5.9.3",
|
||||||
"webpack": "^5.105.4",
|
"webpack": "^5.105.4",
|
||||||
"webpack-cli": "^6.0.1",
|
"webpack-cli": "^6.0.1"
|
||||||
"webpack-merge": "^6.0.1"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"../pkg": {
|
"../pkg": {
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,6 @@
|
||||||
],
|
],
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "node scripts/build-rn.mjs && webpack --mode production",
|
"build": "node scripts/build-rn.mjs && webpack --mode production",
|
||||||
"prepack": "node -e \"require('node:fs').copyFileSync('../LICENSE', 'LICENSE')\"",
|
|
||||||
"format": "prettier --write \"./**/*.(ts|mjs|scss|json|html)\"",
|
"format": "prettier --write \"./**/*.(ts|mjs|scss|json|html)\"",
|
||||||
"format:check": "prettier --check --ignore-path ../.gitignore \"./**/*.(ts|mjs|scss|json|html)\"",
|
"format:check": "prettier --check --ignore-path ../.gitignore \"./**/*.(ts|mjs|scss|json|html)\"",
|
||||||
"test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest"
|
"test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest"
|
||||||
|
|
@ -50,7 +49,6 @@
|
||||||
"tslib": "2.8.1",
|
"tslib": "2.8.1",
|
||||||
"typescript": "5.9.3",
|
"typescript": "5.9.3",
|
||||||
"webpack": "^5.105.4",
|
"webpack": "^5.105.4",
|
||||||
"webpack-cli": "^6.0.1",
|
"webpack-cli": "^6.0.1"
|
||||||
"webpack-merge": "^6.0.1"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,14 @@
|
||||||
// wasm2js (pure-JS) translation.
|
// wasm2js (pure-JS) translation.
|
||||||
|
|
||||||
import { execFileSync } from 'node:child_process';
|
import { execFileSync } from 'node:child_process';
|
||||||
import { existsSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
import { readFileSync, rmSync, writeFileSync } from 'node:fs';
|
||||||
import { dirname, resolve } from 'node:path';
|
import { dirname, resolve } from 'node:path';
|
||||||
import { fileURLToPath, pathToFileURL } from 'node:url';
|
import { fileURLToPath, pathToFileURL } from 'node:url';
|
||||||
import { homedir } from 'node:os';
|
|
||||||
|
|
||||||
const here = dirname(fileURLToPath(import.meta.url));
|
const here = dirname(fileURLToPath(import.meta.url));
|
||||||
const reconcileJsDir = resolve(here, '..');
|
const reconcileJsDir = resolve(here, '..');
|
||||||
const repoRoot = resolve(reconcileJsDir, '..');
|
const repoRoot = resolve(reconcileJsDir, '..');
|
||||||
|
|
||||||
const releaseWasm = resolve(
|
|
||||||
repoRoot,
|
|
||||||
'target/wasm32-unknown-unknown/release/reconcile_text.wasm'
|
|
||||||
);
|
|
||||||
const outDir = resolve(reconcileJsDir, 'pkg-rn');
|
const outDir = resolve(reconcileJsDir, 'pkg-rn');
|
||||||
const bgWasm = resolve(outDir, 'reconcile_text_bg.wasm');
|
const bgWasm = resolve(outDir, 'reconcile_text_bg.wasm');
|
||||||
const bgWasmJs = resolve(outDir, 'reconcile_text_bg.wasm.js');
|
const bgWasmJs = resolve(outDir, 'reconcile_text_bg.wasm.js');
|
||||||
|
|
@ -29,87 +24,19 @@ function run(cmd, args) {
|
||||||
execFileSync(cmd, args, { stdio: 'inherit' });
|
execFileSync(cmd, args, { stdio: 'inherit' });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Locate the wasm-bindgen CLI. It MUST match the `wasm-bindgen` crate version pinned
|
console.log('[build-rn] generating bundler-target bindings with wasm-pack');
|
||||||
// in Cargo.toml: a mismatched CLI emits bindings the runtime can't use. So we resolve
|
|
||||||
// the required version first and verify every candidate against it, failing loudly
|
|
||||||
// rather than silently falling back to whatever other version happens to be around.
|
|
||||||
function findWasmBindgen() {
|
|
||||||
const cargoToml = readFileSync(resolve(repoRoot, 'Cargo.toml'), 'utf8');
|
|
||||||
const wanted = cargoToml.match(
|
|
||||||
/wasm-bindgen\s*=\s*\{[^}]*version\s*=\s*"([^"]+)"/
|
|
||||||
)?.[1];
|
|
||||||
if (!wanted) {
|
|
||||||
throw new Error(
|
|
||||||
'[build-rn] Could not parse the pinned wasm-bindgen version from Cargo.toml, so ' +
|
|
||||||
'the required CLI version is unknown. Has the dependency declaration changed?'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 1. On PATH: accept it only if its version matches the pin.
|
|
||||||
let onPath = null;
|
|
||||||
try {
|
|
||||||
onPath = execFileSync('which', ['wasm-bindgen'], { encoding: 'utf8' }).trim();
|
|
||||||
} catch {
|
|
||||||
/* not on PATH; try the wasm-pack cache next */
|
|
||||||
}
|
|
||||||
if (onPath) {
|
|
||||||
const version = execFileSync(onPath, ['--version'], { encoding: 'utf8' }).match(
|
|
||||||
/\d+\.\d+\.\d+/
|
|
||||||
)?.[0];
|
|
||||||
if (version !== wanted) {
|
|
||||||
throw new Error(
|
|
||||||
`[build-rn] wasm-bindgen on PATH (${onPath}) is ${version ?? 'an unknown version'}, ` +
|
|
||||||
`but Cargo.toml pins ${wanted}. Install the matching CLI ` +
|
|
||||||
`(\`cargo install wasm-bindgen-cli --version ${wanted}\`) or remove the mismatched one.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return onPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
const cacheRoots = [
|
|
||||||
resolve(homedir(), 'Library/Caches/.wasm-pack'),
|
|
||||||
resolve(homedir(), '.cache/.wasm-pack'),
|
|
||||||
];
|
|
||||||
for (const root of cacheRoots) {
|
|
||||||
if (!existsSync(root)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (const entry of readdirSync(root)) {
|
|
||||||
const candidate = resolve(root, entry, 'wasm-bindgen');
|
|
||||||
if (!existsSync(candidate)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let version;
|
|
||||||
try {
|
|
||||||
version = execFileSync(candidate, ['--version'], { encoding: 'utf8' }).match(
|
|
||||||
/\d+\.\d+\.\d+/
|
|
||||||
)?.[0];
|
|
||||||
} catch {
|
|
||||||
continue; // not an invokable wasm-bindgen; ignore
|
|
||||||
}
|
|
||||||
if (version === wanted) {
|
|
||||||
return candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
`[build-rn] No wasm-bindgen ${wanted} found on PATH or in the wasm-pack cache. ` +
|
|
||||||
'Run `wasm-pack build --target web --features wasm` first (it caches the matching ' +
|
|
||||||
`wasm-bindgen), or \`cargo install wasm-bindgen-cli --version ${wanted}\`.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!existsSync(releaseWasm)) {
|
|
||||||
throw new Error(
|
|
||||||
`Missing ${releaseWasm}.\nRun \`wasm-pack build --target web --features wasm\` from the repo root first.`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('[build-rn] generating bundler-target bindings with wasm-bindgen');
|
|
||||||
rmSync(outDir, { recursive: true, force: true });
|
rmSync(outDir, { recursive: true, force: true });
|
||||||
const wasmBindgen = findWasmBindgen();
|
run('wasm-pack', [
|
||||||
run(wasmBindgen, ['--target', 'bundler', '--out-dir', outDir, releaseWasm]);
|
'build',
|
||||||
|
repoRoot,
|
||||||
|
'--target',
|
||||||
|
'bundler',
|
||||||
|
'--out-dir',
|
||||||
|
outDir,
|
||||||
|
'--no-opt',
|
||||||
|
'--features',
|
||||||
|
'wasm',
|
||||||
|
]);
|
||||||
|
|
||||||
// --- Patch wasm-bindgen's cached-memory getters for wasm2js -----------------
|
// --- Patch wasm-bindgen's cached-memory getters for wasm2js -----------------
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
const { merge } = require('webpack-merge');
|
|
||||||
|
|
||||||
const common = {
|
const common = {
|
||||||
optimization: {
|
optimization: {
|
||||||
|
|
@ -16,9 +15,6 @@ const common = {
|
||||||
performance: {
|
performance: {
|
||||||
hints: false,
|
hints: false,
|
||||||
},
|
},
|
||||||
experiments: {
|
|
||||||
asyncWebAssembly: true,
|
|
||||||
},
|
|
||||||
module: {
|
module: {
|
||||||
rules: [
|
rules: [
|
||||||
{
|
{
|
||||||
|
|
@ -38,7 +34,8 @@ const common = {
|
||||||
|
|
||||||
module.exports = [
|
module.exports = [
|
||||||
// Web build: real WebAssembly, instantiated synchronously from inlined base64.
|
// Web build: real WebAssembly, instantiated synchronously from inlined base64.
|
||||||
merge(common, {
|
{
|
||||||
|
...common,
|
||||||
target: 'web',
|
target: 'web',
|
||||||
entry: './src/index.ts',
|
entry: './src/index.ts',
|
||||||
output: {
|
output: {
|
||||||
|
|
@ -50,10 +47,11 @@ module.exports = [
|
||||||
},
|
},
|
||||||
globalObject: 'this',
|
globalObject: 'this',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
|
|
||||||
// Node build: real WebAssembly.
|
// Node build: real WebAssembly.
|
||||||
merge(common, {
|
{
|
||||||
|
...common,
|
||||||
target: 'node',
|
target: 'node',
|
||||||
entry: './src/index.ts',
|
entry: './src/index.ts',
|
||||||
output: {
|
output: {
|
||||||
|
|
@ -61,11 +59,12 @@ module.exports = [
|
||||||
filename: 'reconcile.node.js',
|
filename: 'reconcile.node.js',
|
||||||
libraryTarget: 'commonjs2',
|
libraryTarget: 'commonjs2',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
|
|
||||||
// React Native build: wasm2js (pure JS), for Hermes which has no
|
// React Native build: wasm2js (pure JS), for Hermes which has no
|
||||||
// `WebAssembly` global. Sources come from `pkg-rn/`
|
// `WebAssembly` global. Sources come from `pkg-rn/`
|
||||||
merge(common, {
|
{
|
||||||
|
...common,
|
||||||
target: 'web',
|
target: 'web',
|
||||||
entry: './src/index.rn.ts',
|
entry: './src/index.rn.ts',
|
||||||
output: {
|
output: {
|
||||||
|
|
@ -77,5 +76,5 @@ module.exports = [
|
||||||
},
|
},
|
||||||
globalObject: 'this',
|
globalObject: 'this',
|
||||||
},
|
},
|
||||||
}),
|
},
|
||||||
];
|
];
|
||||||
|
|
|
||||||
7
scripts/build-js.sh
Executable file
7
scripts/build-js.sh
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
wasm-pack build --target web --features wasm,console_error_panic_hook
|
||||||
|
npm run build --prefix reconcile-js
|
||||||
|
|
@ -1,14 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
which wasm-pack || cargo install wasm-pack
|
npm run build --prefix examples/website
|
||||||
wasm-pack build --target web --features wasm
|
|
||||||
|
|
||||||
cd reconcile-js
|
|
||||||
npm ci
|
|
||||||
npm run build
|
|
||||||
cd ../examples/website
|
|
||||||
npm ci
|
|
||||||
npm run build
|
|
||||||
cd -
|
|
||||||
|
|
|
||||||
7
scripts/build.sh
Executable file
7
scripts/build.sh
Executable file
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
scripts/build-js.sh
|
||||||
|
uv run --directory reconcile-python --no-sync maturin develop -q
|
||||||
|
|
@ -36,7 +36,7 @@ sed_inplace() {
|
||||||
echo "Bumping versions"
|
echo "Bumping versions"
|
||||||
|
|
||||||
which cargo-set-version || cargo install cargo-edit
|
which cargo-set-version || cargo install cargo-edit
|
||||||
cargo set-version --bump $1
|
cargo set-version --bump "$1"
|
||||||
|
|
||||||
NEWVER=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
|
NEWVER=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
|
||||||
|
|
||||||
|
|
@ -45,7 +45,7 @@ which wasm-pack || cargo install wasm-pack
|
||||||
wasm-pack build --target web --features wasm
|
wasm-pack build --target web --features wasm
|
||||||
|
|
||||||
cd reconcile-js
|
cd reconcile-js
|
||||||
npm version $1
|
npm version "$NEWVER" --no-git-tag-version
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
cd ../reconcile-python
|
cd ../reconcile-python
|
||||||
|
|
@ -60,12 +60,11 @@ npm install
|
||||||
cd ../..
|
cd ../..
|
||||||
|
|
||||||
git add .
|
git add .
|
||||||
TAG=$(node -p "require('./reconcile-js/package.json').version")
|
|
||||||
|
|
||||||
git commit -m "Bump versions to $TAG"
|
git commit -m "Bump versions to $NEWVER"
|
||||||
|
|
||||||
git push
|
git push
|
||||||
echo "Tagging $TAG"
|
echo "Tagging $NEWVER"
|
||||||
git tag -a $TAG -m "Release $TAG"
|
git tag -a $NEWVER -m "Release $NEWVER"
|
||||||
git push origin $TAG
|
git push origin $NEWVER
|
||||||
echo "Done"
|
echo "Done"
|
||||||
|
|
|
||||||
10
scripts/check.sh
Executable file
10
scripts/check.sh
Executable file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
scripts/setup.sh
|
||||||
|
scripts/build.sh
|
||||||
|
scripts/lint.sh
|
||||||
|
scripts/test.sh
|
||||||
|
scripts/build-website.sh
|
||||||
|
|
@ -1,13 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
wasm-pack build --target web --features wasm
|
scripts/build-js.sh
|
||||||
|
npm start --prefix examples/website
|
||||||
cd reconcile-js
|
|
||||||
npm install
|
|
||||||
npm run build
|
|
||||||
|
|
||||||
cd ../examples/website
|
|
||||||
npm install
|
|
||||||
npm run start
|
|
||||||
|
|
|
||||||
|
|
@ -1,27 +1,15 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
which cargo-machete || cargo install cargo-machete
|
|
||||||
cargo machete
|
cargo machete
|
||||||
|
|
||||||
cargo clippy --all-targets --all-features -- -D warnings
|
cargo clippy --all-targets --all-features -- -D warnings
|
||||||
cargo fmt --all -- --check
|
cargo fmt --all -- --check
|
||||||
|
|
||||||
cd reconcile-js
|
npm run format:check --prefix reconcile-js
|
||||||
npm ci
|
npm run format:check --prefix examples/website
|
||||||
npm run format:check
|
|
||||||
|
|
||||||
cd ../examples/website
|
uv run --directory reconcile-python --no-sync ruff check python/ tests/
|
||||||
npm ci
|
uv run --directory reconcile-python --no-sync ruff format --check python/ tests/
|
||||||
npm run format:check
|
uv run --directory reconcile-python --no-sync pyright python/ tests/
|
||||||
|
|
||||||
cd ../../reconcile-python
|
|
||||||
cp ../README.md ../LICENSE .
|
|
||||||
uv run maturin develop -q
|
|
||||||
uv run ruff check python/ tests/
|
|
||||||
uv run ruff format --check python/ tests/
|
|
||||||
uv run pyright python/ tests/
|
|
||||||
cd -
|
|
||||||
|
|
||||||
echo "Success!"
|
|
||||||
|
|
|
||||||
19
scripts/setup.sh
Executable file
19
scripts/setup.sh
Executable file
|
|
@ -0,0 +1,19 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
|
node_version=$(node --version | cut -d'.' -f1 | tr -d 'v')
|
||||||
|
if [ "$node_version" != "22" ]; then
|
||||||
|
echo "Error: Node.js version 22 is required, but found version $node_version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
command -v wasm-pack || cargo install --locked wasm-pack
|
||||||
|
command -v cargo-machete || cargo install --locked cargo-machete
|
||||||
|
|
||||||
|
npm ci --prefix reconcile-js
|
||||||
|
npm ci --prefix examples/website
|
||||||
|
cp README.md LICENSE reconcile-js/
|
||||||
|
cp README.md LICENSE reconcile-python/
|
||||||
|
uv sync --directory reconcile-python --frozen --no-install-project
|
||||||
|
|
@ -1,36 +1,13 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
cd "$(dirname "$0")/.."
|
||||||
|
|
||||||
which cargo-insta || cargo install cargo-insta
|
cargo test --features serde -- --include-ignored
|
||||||
which wasm-pack || cargo install wasm-pack
|
|
||||||
|
|
||||||
node_version=$(node --version | cut -d'.' -f1 | tr -d 'v')
|
|
||||||
if [ "$node_version" != "22" ]; then
|
|
||||||
echo "Error: Node.js version 22 is required, but found version $node_version"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
wasm-pack build --target web --features wasm,console_error_panic_hook
|
|
||||||
cargo test --verbose --features serde -- --include-ignored
|
|
||||||
|
|
||||||
cargo test
|
cargo test
|
||||||
cargo test --features serde
|
|
||||||
cargo test --features wasm
|
cargo test --features wasm
|
||||||
cargo test --features all
|
cargo test --features all
|
||||||
|
|
||||||
wasm-pack test --node --features wasm,console_error_panic_hook
|
wasm-pack test --node --features wasm,console_error_panic_hook
|
||||||
|
|
||||||
cd reconcile-js
|
npm test --prefix reconcile-js
|
||||||
npm ci
|
uv run --directory reconcile-python --no-sync pytest -v
|
||||||
npm run build
|
|
||||||
npm run test
|
|
||||||
cd -
|
|
||||||
|
|
||||||
cd reconcile-python
|
|
||||||
cp ../README.md ../LICENSE .
|
|
||||||
uv run maturin develop
|
|
||||||
uv run pytest -v
|
|
||||||
cd -
|
|
||||||
|
|
||||||
echo "Success!"
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue