From 1431dbd949f0ba05605e3dcb9d04301dfe49c388 Mon Sep 17 00:00:00 2001 From: David Sherret Date: Sat, 23 May 2026 16:14:11 -0400 Subject: [PATCH 1/4] chore: modernize release workflow and expand README - Bump release.yml to use jsr:@dprint/automation@0.10.3/tasks/publish-release - Expand README with proper Install section covering both `dprint add sql` and `dprint add npm:@dprint/sql` --- .github/workflows/release.yml | 2 +- README.md | 12 +++++++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b46b0fa..05dc25d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -34,4 +34,4 @@ jobs: run: | git config user.email "${{ github.actor }}@users.noreply.github.com" git config user.name "${{ github.actor }}" - deno run -A https://raw.githubusercontent.com/dprint/automation/0.10.0/tasks/publish_release.ts --${{github.event.inputs.releaseKind}} + deno run -A jsr:@dprint/automation@0.10.3/tasks/publish-release --${{github.event.inputs.releaseKind}} diff --git a/README.md b/README.md index c8393b1..2bcece4 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,17 @@ # dprint-plugin-sql +[![CI](https://github.com/dprint/dprint-plugin-sql/workflows/CI/badge.svg)](https://github.com/dprint/dprint-plugin-sql/actions?query=workflow%3ACI) + Wrapper around [sqlformat-rs](https://github.com/shssoichiro/sqlformat-rs) for use as a formatting plugin for [dprint](https://github.com/dprint/dprint). -```sh +## Install + +[Install](https://dprint.dev/install/) and [setup](https://dprint.dev/setup/) dprint. + +Then in your project's directory with a dprint.json file, run: + +```shellsession dprint add sql +# or install from npm +dprint add npm:@dprint/sql ``` From 08fbfad2dca535bb9c4336612fba13364940283b Mon Sep 17 00:00:00 2001 From: David Sherret Date: Sat, 23 May 2026 18:07:09 -0400 Subject: [PATCH 2/4] chore: also bump rust-toolchain.toml from update.ts Previously update.ts only bumped the sqlformat version in Cargo.toml. If sqlformat ever raises its declared rust-version above what's in rust-toolchain.toml, CI would silently end up trying to compile newer sqlformat on the old toolchain. Match what dprint-plugin-ruff already does: fetch the new sqlformat crate version's rust_version from crates.io and bump rust-toolchain.toml to match (only ever upgrading; never downgrading). --- scripts/update.ts | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/scripts/update.ts b/scripts/update.ts index 70a7c93..a0f562c 100644 --- a/scripts/update.ts +++ b/scripts/update.ts @@ -16,11 +16,15 @@ if (semver.compare(currentVersion, latestVersion) >= 0) { } $.log("Found new version."); -$.logStep("Updating Cargo.toml..."); const isPatchBump = currentVersion.major === latestVersion.major && currentVersion.minor === latestVersion.minor; const currentVersionStr = `${currentVersion.major}.${currentVersion.minor}.${currentVersion.patch}`; const latestVersionStr = `${latestVersion.major}.${latestVersion.minor}.${latestVersion.patch}`; + +$.logStep("Updating rust-toolchain.toml..."); +await updateRustToolchain(latestVersionStr); + +$.logStep("Updating Cargo.toml..."); cargoToml.replaceAll(`sqlformat = "${currentVersionStr}"`, `sqlformat = "${latestVersionStr}"`); // run the tests @@ -69,3 +73,38 @@ async function getLatestSqlformatVersion() { $.logLight("Latest sqlformat version:", version); return semver.parse(version); } + +async function updateRustToolchain(sqlformatVersion: string) { + const response = await fetch(`https://crates.io/api/v1/crates/sqlformat/${sqlformatVersion}`, { + headers: { + "User-Agent": "dprint-plugin-sql update script", + }, + }); + if (!response.ok) { + throw new Error(`Failed to fetch sqlformat ${sqlformatVersion} info: ${response.statusText}`); + } + const data = await response.json(); + const requiredRustVersion = data.version?.rust_version; + if (requiredRustVersion == null) { + $.log(`sqlformat ${sqlformatVersion} does not declare a rust_version; leaving rust-toolchain.toml alone.`); + return; + } + + const toolchainPath = rootDirPath.join("rust-toolchain.toml"); + const localContent = toolchainPath.readTextSync(); + const localMatch = localContent.match(/channel\s*=\s*"([^"]+)"/); + if (localMatch == null) { + throw new Error("Could not find channel in local rust-toolchain.toml."); + } + // crates.io rust_version may be "1.84" (no patch); pad to MAJOR.MINOR.PATCH + // so @std/semver can parse it. + const normalize = (v: string) => /^\d+\.\d+$/.test(v) ? `${v}.0` : v; + const local = semver.parse(normalize(localMatch[1])); + const required = semver.parse(normalize(requiredRustVersion)); + if (semver.greaterThan(required, local)) { + $.log(`Updating Rust toolchain: ${localMatch[1]} -> ${requiredRustVersion}`); + toolchainPath.writeTextSync(localContent.replace(localMatch[0], `channel = "${requiredRustVersion}"`)); + } else { + $.log(`Rust toolchain at ${localMatch[1]} already satisfies sqlformat ${sqlformatVersion} (needs >= ${requiredRustVersion}).`); + } +} From 12531bc79970687d9f5afa52eab6920f209d0ead Mon Sep 17 00:00:00 2001 From: David Sherret Date: Sun, 24 May 2026 09:35:58 -0400 Subject: [PATCH 3/4] chore: use dax $.request instead of fetch in update.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aligns with how dprint-plugin-ruff's update.ts already calls crates.io — $.request auto-throws on non-2xx and `.json()` returns the parsed body in one call, so the manual response.ok checks go away. Custom User-Agent is set via `.header(...)`. --- scripts/update.ts | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/scripts/update.ts b/scripts/update.ts index a0f562c..7998031 100644 --- a/scripts/update.ts +++ b/scripts/update.ts @@ -63,27 +63,18 @@ function getSqlformatVersion(text: string) { } async function getLatestSqlformatVersion() { - const response = await fetch("https://crates.io/api/v1/crates/sqlformat", { - headers: { - "User-Agent": "dprint-plugin-sql update script", - }, - }); - const data = await response.json(); + const data = await $.request("https://crates.io/api/v1/crates/sqlformat") + .header("User-Agent", "dprint-plugin-sql update script") + .json(); const version = data.crate.max_stable_version ?? data.crate.max_version; $.logLight("Latest sqlformat version:", version); return semver.parse(version); } async function updateRustToolchain(sqlformatVersion: string) { - const response = await fetch(`https://crates.io/api/v1/crates/sqlformat/${sqlformatVersion}`, { - headers: { - "User-Agent": "dprint-plugin-sql update script", - }, - }); - if (!response.ok) { - throw new Error(`Failed to fetch sqlformat ${sqlformatVersion} info: ${response.statusText}`); - } - const data = await response.json(); + const data = await $.request(`https://crates.io/api/v1/crates/sqlformat/${sqlformatVersion}`) + .header("User-Agent", "dprint-plugin-sql update script") + .json(); const requiredRustVersion = data.version?.rust_version; if (requiredRustVersion == null) { $.log(`sqlformat ${sqlformatVersion} does not declare a rust_version; leaving rust-toolchain.toml alone.`); From afc31d03f8b1bbe114ab62bab9d60a49605b8e4b Mon Sep 17 00:00:00 2001 From: David Sherret Date: Sun, 24 May 2026 09:54:20 -0400 Subject: [PATCH 4/4] chore: migrate workflows to gagen --- ...pdates.yml => check_updates.generated.yml} | 23 ++- .github/workflows/check_updates.ts | 52 +++++++ .github/workflows/ci.generated.yml | 93 ++++++++++++ .github/workflows/ci.ts | 142 ++++++++++++++++++ .github/workflows/ci.yml | 96 ------------ .github/workflows/publish_npm.generated.yml | 36 +++++ .github/workflows/publish_npm.ts | 53 +++++++ .github/workflows/publish_npm.yml | 38 ----- .github/workflows/release.generated.yml | 34 +++++ .github/workflows/release.ts | 53 +++++++ .github/workflows/release.yml | 37 ----- 11 files changed, 472 insertions(+), 185 deletions(-) rename .github/workflows/{check_updates.yml => check_updates.generated.yml} (60%) create mode 100755 .github/workflows/check_updates.ts create mode 100644 .github/workflows/ci.generated.yml create mode 100755 .github/workflows/ci.ts delete mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/publish_npm.generated.yml create mode 100755 .github/workflows/publish_npm.ts delete mode 100644 .github/workflows/publish_npm.yml create mode 100644 .github/workflows/release.generated.yml create mode 100755 .github/workflows/release.ts delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/check_updates.yml b/.github/workflows/check_updates.generated.yml similarity index 60% rename from .github/workflows/check_updates.yml rename to .github/workflows/check_updates.generated.yml index 4b8f9a3..1c77b9e 100644 --- a/.github/workflows/check_updates.yml +++ b/.github/workflows/check_updates.generated.yml @@ -1,33 +1,28 @@ -name: check_updates +# GENERATED BY ./check_updates.ts -- DO NOT DIRECTLY EDIT +name: check_updates on: - workflow_dispatch: + workflow_dispatch: {} schedule: - # do this once per day - - cron: "0 7 * * *" - + - cron: 0 7 * * * jobs: build: name: check updates if: github.repository == 'dprint/dprint-plugin-sql' runs-on: ubuntu-latest timeout-minutes: 45 - steps: - name: Clone repository - uses: actions/checkout@v6 + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 with: - token: ${{ secrets.GH_DPRINTBOT_PAT }} - - - uses: denoland/setup-deno@v2 - - uses: dsherret/rust-toolchain-file@v1 - + token: '${{ secrets.GH_DPRINTBOT_PAT }}' + - uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2 + - uses: dsherret/rust-toolchain-file@3551321aa44dd44a0393eb3b6bdfbc5d25ecf621 # v1 - name: Run script - run: | + run: |- git config user.email "dprintbot@users.noreply.github.com" git config user.name "dprintbot" deno run -A ./scripts/update.ts - # This is necessary to prevent GH automatically disabling this workflow after 60 days. workflow-keepalive: if: github.event_name == 'schedule' runs-on: ubuntu-latest diff --git a/.github/workflows/check_updates.ts b/.github/workflows/check_updates.ts new file mode 100755 index 0000000..2a8997a --- /dev/null +++ b/.github/workflows/check_updates.ts @@ -0,0 +1,52 @@ +#!/usr/bin/env -S deno run -A +import { job, workflow } from "jsr:@david/gagen@^0.5.0"; + +const buildJob = job("build", { + name: "check updates", + if: "github.repository == 'dprint/dprint-plugin-sql'", + runsOn: "ubuntu-latest", + timeoutMinutes: 45, + steps: [ + { + name: "Clone repository", + uses: "actions/checkout@v6", + with: { token: "${{ secrets.GH_DPRINTBOT_PAT }}" }, + }, + { uses: "denoland/setup-deno@v2" }, + { uses: "dsherret/rust-toolchain-file@v1" }, + { + name: "Run script", + run: [ + `git config user.email "dprintbot@users.noreply.github.com"`, + `git config user.name "dprintbot"`, + "deno run -A ./scripts/update.ts", + ], + }, + ], +}); + +// This is necessary to prevent GH automatically disabling this workflow after 60 days. +const keepaliveJob = job("workflow-keepalive", { + if: "github.event_name == 'schedule'", + runsOn: "ubuntu-latest", + permissions: { actions: "write" }, + steps: [ + { uses: "liskin/gh-workflow-keepalive@f72ff1a1336129f29bf0166c0fd0ca6cf1bcb38c" }, + ], +}); + +workflow({ + name: "check_updates", + on: { + workflow_dispatch: {}, + schedule: [ + // do this once per day + { cron: "0 7 * * *" }, + ], + }, + jobs: [buildJob, keepaliveJob], +}).writeOrLint({ + filePath: new URL("./check_updates.generated.yml", import.meta.url), + header: "# GENERATED BY ./check_updates.ts -- DO NOT DIRECTLY EDIT", + pinDeps: true, +}); diff --git a/.github/workflows/ci.generated.yml b/.github/workflows/ci.generated.yml new file mode 100644 index 0000000..0977c19 --- /dev/null +++ b/.github/workflows/ci.generated.yml @@ -0,0 +1,93 @@ +# GENERATED BY ./ci.ts -- DO NOT DIRECTLY EDIT + +name: CI +on: + pull_request: + branches: + - main + push: + branches: + - main + tags: + - '*' +jobs: + build: + name: '${{ matrix.config.kind }} ${{ matrix.config.os }}' + runs-on: '${{ matrix.config.os }}' + strategy: + matrix: + config: + - os: ubuntu-latest + kind: test_release + - os: ubuntu-latest + kind: test_debug + env: + CARGO_INCREMENTAL: 0 + RUST_BACKTRACE: full + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: dsherret/rust-toolchain-file@3551321aa44dd44a0393eb3b6bdfbc5d25ecf621 # v1 + - name: Install wasm32 target + if: matrix.config.kind == 'test_release' + run: rustup target add wasm32-unknown-unknown + - uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 + with: + save-if: '${{ github.ref == ''refs/heads/main'' }}' + - uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2 + with: + deno-version: v2.x + - name: Build debug + if: matrix.config.kind == 'test_debug' + run: cargo build + - name: Build release + if: matrix.config.kind == 'test_release' + run: cargo build --target wasm32-unknown-unknown --features wasm --release + - name: Test debug + if: matrix.config.kind == 'test_debug' + run: cargo test + - name: Test release + if: matrix.config.kind == 'test_release' + run: cargo test --release + - name: Get tag version + id: get_tag_version + if: 'matrix.config.kind == ''test_release'' && startsWith(github.ref, ''refs/tags/'')' + run: 'echo "TAG_VERSION=${GITHUB_REF/refs\/tags\//}" >> "$GITHUB_OUTPUT"' + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + if: matrix.config.kind == 'test_release' + with: + node-version: 24.x + registry-url: 'https://registry.npmjs.org' + - name: Setup and test npm deployment + if: matrix.config.kind == 'test_release' + run: |- + cd deployment/npm + npm install + node setup.js + npm run test + - name: Pre-release + if: 'matrix.config.kind == ''test_release'' && startsWith(github.ref, ''refs/tags/'')' + run: |- + # update config schema to have version + sed -i 's/sql\/0.0.0/sql\/${{ steps.get_tag_version.outputs.TAG_VERSION }}/' deployment/schema.json + # rename the wasm file + (cd target/wasm32-unknown-unknown/release/ && mv dprint_plugin_sql.wasm plugin.wasm) + # create release notes + deno run -A ./scripts/generateReleaseNotes.ts ${{ steps.get_tag_version.outputs.TAG_VERSION }} > ${{ github.workspace }}-CHANGELOG.txt + - name: Release + uses: softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844 + if: 'matrix.config.kind == ''test_release'' && startsWith(github.ref, ''refs/tags/'')' + env: + GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' + with: + files: |- + target/wasm32-unknown-unknown/release/plugin.wasm + deployment/schema.json + body_path: '${{ github.workspace }}-CHANGELOG.txt' + draft: false + - name: Lint workflow generation + if: matrix.config.kind == 'test_debug' + run: |- + ./.github/workflows/ci.ts --lint + ./.github/workflows/publish_npm.ts --lint + ./.github/workflows/release.ts --lint + ./.github/workflows/check_updates.ts --lint diff --git a/.github/workflows/ci.ts b/.github/workflows/ci.ts new file mode 100755 index 0000000..c673662 --- /dev/null +++ b/.github/workflows/ci.ts @@ -0,0 +1,142 @@ +#!/usr/bin/env -S deno run -A +import { conditions, defineMatrix, expr, job, step, workflow } from "jsr:@david/gagen@^0.5.0"; + +const pluginName = "sql"; +const cargoWasmName = `dprint_plugin_${pluginName}`; + +const matrix = defineMatrix({ + config: [ + { os: "ubuntu-latest", kind: "test_release" }, + { os: "ubuntu-latest", kind: "test_debug" }, + ], +}); + +const kind = expr("matrix.config.kind"); +const os = expr("matrix.config.os"); + +const isRelease = kind.equals("test_release"); +const isDebug = kind.equals("test_debug"); +const isTag = conditions.isTag(); +const isReleaseAndTag = isRelease.and(isTag); + +const getTagVersion = step({ + id: "get_tag_version", + name: "Get tag version", + if: isReleaseAndTag, + run: `echo "TAG_VERSION=\${GITHUB_REF/refs\\/tags\\//}" >> "$GITHUB_OUTPUT"`, + outputs: ["TAG_VERSION"], +}); + +const buildJob = job("build", { + name: `${kind} ${os}`, + runsOn: os, + strategy: { matrix }, + env: { + CARGO_INCREMENTAL: 0, + RUST_BACKTRACE: "full", + }, + steps: [ + { uses: "actions/checkout@v6" }, + { uses: "dsherret/rust-toolchain-file@v1" }, + { + name: "Install wasm32 target", + if: isRelease, + run: "rustup target add wasm32-unknown-unknown", + }, + { + uses: "Swatinem/rust-cache@v2", + with: { "save-if": "${{ github.ref == 'refs/heads/main' }}" }, + }, + // deno is needed by the "Lint workflow generation" step (test_debug) + // and by the "Pre-release" step (test_release on tag). Install it + // once at the top of every job to keep the matrix steps simple. + { + uses: "denoland/setup-deno@v2", + with: { "deno-version": "v2.x" }, + }, + + { name: "Build debug", if: isDebug, run: "cargo build" }, + { + name: "Build release", + if: isRelease, + run: "cargo build --target wasm32-unknown-unknown --features wasm --release", + }, + + { name: "Test debug", if: isDebug, run: "cargo test" }, + { name: "Test release", if: isRelease, run: "cargo test --release" }, + + getTagVersion, + + // NPM + { + uses: "actions/setup-node@v6", + if: isRelease, + with: { + "node-version": "24.x", + "registry-url": "https://registry.npmjs.org", + }, + }, + { + name: "Setup and test npm deployment", + if: isRelease, + run: [ + "cd deployment/npm", + "npm install", + "node setup.js", + "npm run test", + ], + }, + + // GITHUB RELEASE + { + name: "Pre-release", + if: isReleaseAndTag, + run: [ + "# update config schema to have version", + `sed -i 's/${pluginName}\\/0.0.0/${pluginName}\\/${getTagVersion.outputs.TAG_VERSION}/' deployment/schema.json`, + "# rename the wasm file", + `(cd target/wasm32-unknown-unknown/release/ && mv ${cargoWasmName}.wasm plugin.wasm)`, + "# create release notes", + `deno run -A ./scripts/generateReleaseNotes.ts ${getTagVersion.outputs.TAG_VERSION} > \${{ github.workspace }}-CHANGELOG.txt`, + ], + }, + { + name: "Release", + // pinned because softprops/action-gh-release was once compromised + uses: "softprops/action-gh-release@de2c0eb89ae2a093876385947365aca7b0e5f844", + if: isReleaseAndTag, + env: { GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" }, + with: { + files: [ + "target/wasm32-unknown-unknown/release/plugin.wasm", + "deployment/schema.json", + ].join("\n"), + body_path: "${{ github.workspace }}-CHANGELOG.txt", + draft: false, + }, + }, + { + name: "Lint workflow generation", + if: isDebug, + run: [ + "./.github/workflows/ci.ts --lint", + "./.github/workflows/publish_npm.ts --lint", + "./.github/workflows/release.ts --lint", + "./.github/workflows/check_updates.ts --lint", + ], + }, + ], +}); + +workflow({ + name: "CI", + on: { + pull_request: { branches: ["main"] }, + push: { branches: ["main"], tags: ["*"] }, + }, + jobs: [buildJob], +}).writeOrLint({ + filePath: new URL("./ci.generated.yml", import.meta.url), + header: "# GENERATED BY ./ci.ts -- DO NOT DIRECTLY EDIT", + pinDeps: true, +}); diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index dcb0da8..0000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: CI - -on: - push: - branches: [main] - tags: - - '*' - pull_request: - branches: [main] - -jobs: - build: - name: ${{ matrix.config.kind }} ${{ matrix.config.os }} - runs-on: ${{ matrix.config.os }} - strategy: - matrix: - config: - - os: ubuntu-latest - kind: test_release - - os: ubuntu-latest - kind: test_debug - - env: - CARGO_INCREMENTAL: 0 - RUST_BACKTRACE: full - - steps: - - uses: actions/checkout@v6 - - uses: dsherret/rust-toolchain-file@v1 - - name: Install wasm32 target - if: matrix.config.kind == 'test_release' - run: rustup target add wasm32-unknown-unknown - - - uses: Swatinem/rust-cache@v2 - with: - save-if: ${{ github.ref == 'refs/heads/main' }} - - - name: Build debug - if: matrix.config.kind == 'test_debug' - run: cargo build - - name: Build release - if: matrix.config.kind == 'test_release' - run: cargo build --target wasm32-unknown-unknown --features wasm --release - - - name: Test debug - if: matrix.config.kind == 'test_debug' - run: cargo test - - name: Test release - if: matrix.config.kind == 'test_release' - run: cargo test --release - - - name: Get tag version - if: matrix.config.kind == 'test_release' && startsWith(github.ref, 'refs/tags/') - id: get_tag_version - run: echo "TAG_VERSION=${GITHUB_REF/refs\/tags\//}" >> "$GITHUB_OUTPUT" - - # NPM - - uses: actions/setup-node@v6 - if: matrix.config.kind == 'test_release' - with: - node-version: '24.x' - registry-url: 'https://registry.npmjs.org' - - - name: Setup and test npm deployment - if: matrix.config.kind == 'test_release' - run: | - cd deployment/npm - npm install - node setup.js - npm run test - - # GITHUB RELEASE - - uses: denoland/setup-deno@v2 - if: matrix.config.kind == 'test_release' && startsWith(github.ref, 'refs/tags/') - with: - deno-version: v2.x - - name: Pre-release - if: matrix.config.kind == 'test_release' && startsWith(github.ref, 'refs/tags/') - run: | - # update config schema to have version - sed -i 's/sql\/0.0.0/sql\/${{ steps.get_tag_version.outputs.TAG_VERSION }}/' deployment/schema.json - # rename the wasm file - (cd target/wasm32-unknown-unknown/release/ && mv dprint_plugin_sql.wasm plugin.wasm) - # create release notes - deno run -A ./scripts/generateReleaseNotes.ts ${{ steps.get_tag_version.outputs.TAG_VERSION }} > ${{ github.workspace }}-CHANGELOG.txt - - name: Release - uses: softprops/action-gh-release@v2 - if: matrix.config.kind == 'test_release' && startsWith(github.ref, 'refs/tags/') - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - files: | - target/wasm32-unknown-unknown/release/plugin.wasm - deployment/schema.json - body_path: ${{ github.workspace }}-CHANGELOG.txt - draft: false diff --git a/.github/workflows/publish_npm.generated.yml b/.github/workflows/publish_npm.generated.yml new file mode 100644 index 0000000..8b6ea61 --- /dev/null +++ b/.github/workflows/publish_npm.generated.yml @@ -0,0 +1,36 @@ +# GENERATED BY ./publish_npm.ts -- DO NOT DIRECTLY EDIT + +name: publish npm +on: + workflow_dispatch: {} + push: + tags: + - '*' +permissions: + id-token: write + contents: read +jobs: + build: + name: publish-npm + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + - uses: dsherret/rust-toolchain-file@3551321aa44dd44a0393eb3b6bdfbc5d25ecf621 # v1 + - name: Install wasm32 target + run: rustup target add wasm32-unknown-unknown + - name: Build release + run: cargo build --target wasm32-unknown-unknown --features wasm --release + - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6 + with: + node-version: 24.x + registry-url: 'https://registry.npmjs.org' + - name: Setup and test npm deployment + run: |- + cd deployment/npm + npm install + node setup.js sync-version + npm run test + - name: npm publish + run: |- + cd deployment/npm + npm publish --access public diff --git a/.github/workflows/publish_npm.ts b/.github/workflows/publish_npm.ts new file mode 100755 index 0000000..de23b20 --- /dev/null +++ b/.github/workflows/publish_npm.ts @@ -0,0 +1,53 @@ +#!/usr/bin/env -S deno run -A +import { job, workflow } from "jsr:@david/gagen@^0.5.0"; + +const npmJob = job("build", { + name: "publish-npm", + runsOn: "ubuntu-latest", + steps: [ + { uses: "actions/checkout@v6" }, + { uses: "dsherret/rust-toolchain-file@v1" }, + { name: "Install wasm32 target", run: "rustup target add wasm32-unknown-unknown" }, + { + name: "Build release", + run: "cargo build --target wasm32-unknown-unknown --features wasm --release", + }, + { + uses: "actions/setup-node@v6", + with: { + "node-version": "24.x", + "registry-url": "https://registry.npmjs.org", + }, + }, + { + name: "Setup and test npm deployment", + run: [ + "cd deployment/npm", + "npm install", + "node setup.js sync-version", + "npm run test", + ], + }, + { + name: "npm publish", + run: [ + "cd deployment/npm", + "npm publish --access public", + ], + }, + ], +}); + +workflow({ + name: "publish npm", + on: { + workflow_dispatch: {}, + push: { tags: ["*"] }, + }, + permissions: { "id-token": "write", contents: "read" }, + jobs: [npmJob], +}).writeOrLint({ + filePath: new URL("./publish_npm.generated.yml", import.meta.url), + header: "# GENERATED BY ./publish_npm.ts -- DO NOT DIRECTLY EDIT", + pinDeps: true, +}); diff --git a/.github/workflows/publish_npm.yml b/.github/workflows/publish_npm.yml deleted file mode 100644 index 560b519..0000000 --- a/.github/workflows/publish_npm.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: publish npm - -on: - workflow_dispatch: - push: - tags: - - '*' - -permissions: - id-token: write - contents: read - -jobs: - build: - name: publish-npm - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - uses: dsherret/rust-toolchain-file@v1 - - name: Install wasm32 target - run: rustup target add wasm32-unknown-unknown - - name: Build release - run: cargo build --target wasm32-unknown-unknown --features wasm --release - - - uses: actions/setup-node@v6 - with: - node-version: '24.x' - registry-url: 'https://registry.npmjs.org' - - name: Setup and test npm deployment - run: | - cd deployment/npm - npm install - node setup.js sync-version - npm run test - - name: npm publish - run: | - cd deployment/npm - npm publish --access public diff --git a/.github/workflows/release.generated.yml b/.github/workflows/release.generated.yml new file mode 100644 index 0000000..65df7a2 --- /dev/null +++ b/.github/workflows/release.generated.yml @@ -0,0 +1,34 @@ +# GENERATED BY ./release.ts -- DO NOT DIRECTLY EDIT + +name: release +on: + workflow_dispatch: + inputs: + releaseKind: + description: Kind of release + default: minor + type: choice + options: + - patch + - minor + required: true +jobs: + rust: + name: release + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - name: Clone repository + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6 + with: + token: '${{ secrets.GH_DPRINTBOT_PAT }}' + - uses: denoland/setup-deno@667a34cdef165d8d2b2e98dde39547c9daac7282 # v2 + - uses: dsherret/rust-toolchain-file@3551321aa44dd44a0393eb3b6bdfbc5d25ecf621 # v1 + - name: Bump version and tag + env: + GITHUB_TOKEN: '${{ secrets.GH_DPRINTBOT_PAT }}' + GH_WORKFLOW_ACTOR: '${{ github.actor }}' + run: |- + git config user.email "${{ github.actor }}@users.noreply.github.com" + git config user.name "${{ github.actor }}" + deno run -A jsr:@dprint/automation@0.10.3/tasks/publish-release --${{ github.event.inputs.releaseKind }} diff --git a/.github/workflows/release.ts b/.github/workflows/release.ts new file mode 100755 index 0000000..af09719 --- /dev/null +++ b/.github/workflows/release.ts @@ -0,0 +1,53 @@ +#!/usr/bin/env -S deno run -A +import { expr, workflow } from "jsr:@david/gagen@^0.5.0"; + +const releaseKind = expr("github.event.inputs.releaseKind"); +const actor = expr("github.actor"); + +workflow({ + name: "release", + on: { + workflow_dispatch: { + inputs: { + releaseKind: { + description: "Kind of release", + default: "minor", + type: "choice", + options: ["patch", "minor"], + required: true, + }, + }, + }, + }, + jobs: [{ + id: "rust", + name: "release", + runsOn: "ubuntu-latest", + timeoutMinutes: 30, + steps: [ + { + name: "Clone repository", + uses: "actions/checkout@v6", + with: { token: "${{ secrets.GH_DPRINTBOT_PAT }}" }, + }, + { uses: "denoland/setup-deno@v2" }, + { uses: "dsherret/rust-toolchain-file@v1" }, + { + name: "Bump version and tag", + env: { + GITHUB_TOKEN: "${{ secrets.GH_DPRINTBOT_PAT }}", + GH_WORKFLOW_ACTOR: actor, + }, + run: [ + `git config user.email "${actor}@users.noreply.github.com"`, + `git config user.name "${actor}"`, + `deno run -A jsr:@dprint/automation@0.10.3/tasks/publish-release --${releaseKind}`, + ], + }, + ], + }], +}).writeOrLint({ + filePath: new URL("./release.generated.yml", import.meta.url), + header: "# GENERATED BY ./release.ts -- DO NOT DIRECTLY EDIT", + pinDeps: true, +}); diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 05dc25d..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,37 +0,0 @@ -name: release - -on: - workflow_dispatch: - inputs: - releaseKind: - description: 'Kind of release' - default: 'minor' - type: choice - options: - - patch - - minor - required: true - -jobs: - rust: - name: release - runs-on: ubuntu-latest - timeout-minutes: 30 - - steps: - - name: Clone repository - uses: actions/checkout@v6 - with: - token: ${{ secrets.GH_DPRINTBOT_PAT }} - - - uses: denoland/setup-deno@v2 - - uses: dsherret/rust-toolchain-file@v1 - - - name: Bump version and tag - env: - GITHUB_TOKEN: ${{ secrets.GH_DPRINTBOT_PAT }} - GH_WORKFLOW_ACTOR: ${{ github.actor }} - run: | - git config user.email "${{ github.actor }}@users.noreply.github.com" - git config user.name "${{ github.actor }}" - deno run -A jsr:@dprint/automation@0.10.3/tasks/publish-release --${{github.event.inputs.releaseKind}}