diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..714e54c --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,86 @@ +name: Publish packages + +on: + push: + branches: [ master ] + tags: + - 'v*.*.*' + pull_request: + branches: [ master ] + +jobs: + pkg-pr-new: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Use Node.js + uses: actions/setup-node@v6 + with: + node-version: 24.x + cache: npm + + - name: Install dependencies + run: npm ci + + - name: Build + run: npm run build + + - name: Test + run: npm run test + + - name: Publish package to pkg.pr.new + run: npm exec -- pkg-pr-new publish "." + + publish: + needs: + - pkg-pr-new + if: startsWith(github.ref, 'refs/tags/v') + permissions: + contents: read + id-token: write + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Use Node.js + uses: actions/setup-node@v6 + with: + node-version: 24.x + registry-url: https://registry.npmjs.org + package-manager-cache: false + + - name: Configure release + id: release + run: | + PACKAGE_NAME=$(node -p "require('./package.json').name") + BASE_VERSION=$(node -p "require('./package.json').version") + + if [[ ! "$GITHUB_REF_NAME" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "::error::Release tags must match vX.X.X, got $GITHUB_REF_NAME." + exit 1 + fi + + PACKAGE_VERSION="${GITHUB_REF_NAME#v}" + if [[ "$PACKAGE_VERSION" != "$BASE_VERSION" ]]; then + echo "::error::Tag $GITHUB_REF_NAME does not match package.json version $BASE_VERSION." + exit 1 + fi + + if npm view "$PACKAGE_NAME@$PACKAGE_VERSION" version >/dev/null 2>&1; then + echo "already_published=true" >> "$GITHUB_OUTPUT" + else + echo "already_published=false" >> "$GITHUB_OUTPUT" + fi + + - name: Publish package to npm + if: steps.release.outputs.already_published == 'false' + run: npm publish --provenance --access public + + - name: Skip already published version + if: steps.release.outputs.already_published == 'true' + run: echo "$GITHUB_REF_NAME is already published; skipping npm publish." diff --git a/package-lock.json b/package-lock.json index be0cbd5..bbd160a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.15.0", "license": "MIT", "devDependencies": { + "pkg-pr-new": "^0.0.75", "react": "^19.2.0", "react-dom": "^19.2.0", "rescript": "^12.0.0" @@ -111,6 +112,16 @@ "node": ">=20.11.0" } }, + "node_modules/pkg-pr-new": { + "version": "0.0.75", + "resolved": "https://registry.npmjs.org/pkg-pr-new/-/pkg-pr-new-0.0.75.tgz", + "integrity": "sha512-u9mdErTewKSMsr+ceCt8VcNuNP0ro5AXiPXhUVApuEyqr2Zlvt+DdCFBcm+yGWN8mhOdZJ27meIDbnoZgfzpOw==", + "dev": true, + "license": "MIT", + "bin": { + "pkg-pr-new": "bin/cli.js" + } + }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -223,6 +234,12 @@ "dev": true, "optional": true }, + "pkg-pr-new": { + "version": "0.0.75", + "resolved": "https://registry.npmjs.org/pkg-pr-new/-/pkg-pr-new-0.0.75.tgz", + "integrity": "sha512-u9mdErTewKSMsr+ceCt8VcNuNP0ro5AXiPXhUVApuEyqr2Zlvt+DdCFBcm+yGWN8mhOdZJ27meIDbnoZgfzpOw==", + "dev": true + }, "react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", diff --git a/package.json b/package.json index 3762776..9a9791d 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ }, "homepage": "https://rescript-lang.org/docs/react/latest/introduction", "devDependencies": { + "pkg-pr-new": "^0.0.75", "react": "^19.2.0", "react-dom": "^19.2.0", "rescript": "^12.0.0" @@ -38,4 +39,4 @@ "react": ">=19.2.0", "react-dom": ">=19.2.0" } -} \ No newline at end of file +} diff --git a/src/React.res b/src/React.res index dce5f54..e453bfc 100644 --- a/src/React.res +++ b/src/React.res @@ -472,4 +472,4 @@ useEffectEvent is a React Hook that lets you extract non-reactive logic from you [Read more on the React Documentation](https://react.dev/reference/react/useEffectEvent) */ @module("react") -external useEffectEvent: (unit => unit) => unit = "useEffectEvent" +external useEffectEvent: ('event => unit) => 'event => unit = "useEffectEvent"