mirror of
https://github.com/astral-sh/ruff.git
synced 2025-08-04 10:48:32 +00:00
Publish wasm API to npm (#12317)
This commit is contained in:
parent
073588b48e
commit
fe04f2b09d
7 changed files with 126 additions and 4 deletions
55
.github/workflows/publish-wasm.yml
vendored
Normal file
55
.github/workflows/publish-wasm.yml
vendored
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
# Build and publish ruff-api for wasm.
|
||||||
|
#
|
||||||
|
# Assumed to run as a subworkflow of .github/workflows/release.yml; specifically, as a publish
|
||||||
|
# job within `cargo-dist`.
|
||||||
|
name: "Build and publish wasm"
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
plan:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
env:
|
||||||
|
CARGO_INCREMENTAL: 0
|
||||||
|
CARGO_NET_RETRY: 10
|
||||||
|
CARGO_TERM_COLOR: always
|
||||||
|
RUSTUP_MAX_RETRIES: 10
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ruff_wasm:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
id-token: write
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
target: [web, bundler, nodejs]
|
||||||
|
fail-fast: false
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: "Install Rust toolchain"
|
||||||
|
run: rustup target add wasm32-unknown-unknown
|
||||||
|
- uses: jetli/wasm-pack-action@v0.4.0
|
||||||
|
- uses: jetli/wasm-bindgen-action@v0.2.0
|
||||||
|
- name: "Run wasm-pack build"
|
||||||
|
run: wasm-pack build --target ${{ matrix.target }} crates/ruff_wasm
|
||||||
|
- name: "Rename generated package"
|
||||||
|
run: | # Replace the package name w/ jq
|
||||||
|
jq '.name="@astral-sh/ruff-wasm-${{ matrix.target }}"' crates/ruff_wasm/pkg/package.json > /tmp/package.json
|
||||||
|
mv /tmp/package.json crates/ruff_wasm/pkg
|
||||||
|
- run: cp LICENSE crates/ruff_wasm/pkg # wasm-pack does not put the LICENSE file in the pkg
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
registry-url: "https://registry.npmjs.org"
|
||||||
|
- name: "Publish (dry-run)"
|
||||||
|
if: ${{ inputs.plan == '' || fromJson(inputs.plan).announcement_tag_is_implicit }}
|
||||||
|
run: npm publish --dry-run crates/ruff_wasm/pkg
|
||||||
|
- name: "Publish"
|
||||||
|
if: ${{ inputs.plan != '' && !fromJson(inputs.plan).announcement_tag_is_implicit }}
|
||||||
|
run: npm publish --provenance --access public crates/ruff_wasm/pkg
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
17
.github/workflows/release.yml
vendored
17
.github/workflows/release.yml
vendored
|
@ -214,16 +214,31 @@ jobs:
|
||||||
"id-token": "write"
|
"id-token": "write"
|
||||||
"packages": "write"
|
"packages": "write"
|
||||||
|
|
||||||
|
custom-publish-wasm:
|
||||||
|
needs:
|
||||||
|
- plan
|
||||||
|
- host
|
||||||
|
if: ${{ !fromJson(needs.plan.outputs.val).announcement_is_prerelease || fromJson(needs.plan.outputs.val).publish_prereleases }}
|
||||||
|
uses: ./.github/workflows/publish-wasm.yml
|
||||||
|
with:
|
||||||
|
plan: ${{ needs.plan.outputs.val }}
|
||||||
|
secrets: inherit
|
||||||
|
# publish jobs get escalated permissions
|
||||||
|
permissions:
|
||||||
|
"id-token": "write"
|
||||||
|
"packages": "write"
|
||||||
|
|
||||||
# Create a GitHub Release while uploading all files to it
|
# Create a GitHub Release while uploading all files to it
|
||||||
announce:
|
announce:
|
||||||
needs:
|
needs:
|
||||||
- plan
|
- plan
|
||||||
- host
|
- host
|
||||||
- custom-publish-pypi
|
- custom-publish-pypi
|
||||||
|
- custom-publish-wasm
|
||||||
# use "always() && ..." to allow us to wait for all publish jobs while
|
# use "always() && ..." to allow us to wait for all publish jobs while
|
||||||
# still allowing individual publish jobs to skip themselves (for prereleases).
|
# still allowing individual publish jobs to skip themselves (for prereleases).
|
||||||
# "host" however must run to completion, no skipping allowed!
|
# "host" however must run to completion, no skipping allowed!
|
||||||
if: ${{ always() && needs.host.result == 'success' && (needs.custom-publish-pypi.result == 'skipped' || needs.custom-publish-pypi.result == 'success') }}
|
if: ${{ always() && needs.host.result == 'success' && (needs.custom-publish-pypi.result == 'skipped' || needs.custom-publish-pypi.result == 'success') && (needs.custom-publish-wasm.result == 'skipped' || needs.custom-publish-wasm.result == 'success') }}
|
||||||
runs-on: "ubuntu-20.04"
|
runs-on: "ubuntu-20.04"
|
||||||
env:
|
env:
|
||||||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
2
Cargo.lock
generated
2
Cargo.lock
generated
|
@ -2490,7 +2490,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ruff_wasm"
|
name = "ruff_wasm"
|
||||||
version = "0.0.0"
|
version = "0.5.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"console_error_panic_hook",
|
"console_error_panic_hook",
|
||||||
"console_log",
|
"console_log",
|
||||||
|
|
|
@ -272,7 +272,7 @@ build-local-artifacts = false
|
||||||
# Local artifacts jobs to run in CI
|
# Local artifacts jobs to run in CI
|
||||||
local-artifacts-jobs = ["./build-binaries", "./build-docker"]
|
local-artifacts-jobs = ["./build-binaries", "./build-docker"]
|
||||||
# Publish jobs to run in CI
|
# Publish jobs to run in CI
|
||||||
publish-jobs = ["./publish-pypi"]
|
publish-jobs = ["./publish-pypi", "./publish-wasm"]
|
||||||
# Announcement jobs to run in CI
|
# Announcement jobs to run in CI
|
||||||
post-announce-jobs = ["./notify-dependents", "./publish-docs", "./publish-playground"]
|
post-announce-jobs = ["./notify-dependents", "./publish-docs", "./publish-playground"]
|
||||||
# Custom permissions for GitHub Jobs
|
# Custom permissions for GitHub Jobs
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "ruff_wasm"
|
name = "ruff_wasm"
|
||||||
version = "0.0.0"
|
version = "0.5.2"
|
||||||
publish = false
|
publish = false
|
||||||
authors = { workspace = true }
|
authors = { workspace = true }
|
||||||
edition = { workspace = true }
|
edition = { workspace = true }
|
||||||
|
|
51
crates/ruff_wasm/README.md
Normal file
51
crates/ruff_wasm/README.md
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
# Ruff WASM
|
||||||
|
|
||||||
|
> **⚠️ WARNING: This API is experimental and may change at any time**
|
||||||
|
|
||||||
|
[**Docs**](https://docs.astral.sh/ruff/) | [**Playground**](https://play.ruff.rs/)
|
||||||
|
|
||||||
|
An extremely fast Python linter and code formatter, written in Rust.
|
||||||
|
|
||||||
|
This is a WASM version of the Ruff API which can be used to lint/format Python in a browser environment.
|
||||||
|
|
||||||
|
There are multiple versions for the different wasm-pack targets. See [here](https://rustwasm.github.io/docs/wasm-bindgen/reference/deployment.html) for more info on targets.
|
||||||
|
|
||||||
|
- [Bundler](https://www.npmjs.com/package/@astral-sh/ruff-wasm-bundler)
|
||||||
|
- [Web](https://www.npmjs.com/package/@astral-sh/ruff-wasm-web)
|
||||||
|
- [Node.js](https://www.npmjs.com/package/@astral-sh/ruff-wasm-nodejs)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
This example uses the wasm-pack web target and is known to work with Vite.
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import init, { Workspace, type Diagnostic } from '@astral-sh/ruff-api';
|
||||||
|
|
||||||
|
const exampleDocument = `print('hello'); print("world")`
|
||||||
|
|
||||||
|
await init(); // Initializes WASM module
|
||||||
|
|
||||||
|
// These are default settings just to illustrate configuring Ruff
|
||||||
|
// Settings info: https://docs.astral.sh/ruff/settings
|
||||||
|
const workspace = new Workspace({
|
||||||
|
'line-length': 88,
|
||||||
|
'indent-width': 4,
|
||||||
|
format: {
|
||||||
|
'indent-style': 'space',
|
||||||
|
'quote-style': 'double',
|
||||||
|
},
|
||||||
|
lint: {
|
||||||
|
select: [
|
||||||
|
'E4',
|
||||||
|
'E7',
|
||||||
|
'E9',
|
||||||
|
'F'
|
||||||
|
],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
// Will contain 1 diagnostic code for E702: Multiple statements on one line
|
||||||
|
const diagnostics: Diagnostic[] = workspace.check(exampleDocument);
|
||||||
|
|
||||||
|
const formatted = workspace.format(exampleDocument);
|
||||||
|
```
|
|
@ -108,5 +108,6 @@ version_files = [
|
||||||
"docs/integrations.md",
|
"docs/integrations.md",
|
||||||
"crates/ruff/Cargo.toml",
|
"crates/ruff/Cargo.toml",
|
||||||
"crates/ruff_linter/Cargo.toml",
|
"crates/ruff_linter/Cargo.toml",
|
||||||
|
"crates/ruff_wasm/Cargo.toml",
|
||||||
"scripts/benchmarks/pyproject.toml",
|
"scripts/benchmarks/pyproject.toml",
|
||||||
]
|
]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue