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/README.md b/README.md index a9b21c4..38bba91 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ | @rescript/react | ReScript | ReactJS | Documentation | | --------------- | ---------------------------------- | ------- | ----------------------------------------------------------------- | +| 0.16.x | 13.0+ | 19 | | 0.15.x | 12.0+ | 19 | | | 0.14.x | 11.0+ (JSX4 + uncurried mode only) | 19 | | | 0.12.x, 0.13.x | 11.0+ | 18 | [Link](https://rescript-lang.org/docs/react/latest/introduction) | diff --git a/package-lock.json b/package-lock.json index be0cbd5..5e5397d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,28 +1,29 @@ { "name": "@rescript/react", - "version": "0.15.0", + "version": "0.16.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@rescript/react", - "version": "0.15.0", + "version": "0.16.0", "license": "MIT", "devDependencies": { + "pkg-pr-new": "^0.0.75", "react": "^19.2.0", "react-dom": "^19.2.0", - "rescript": "^12.0.0" + "rescript": "^13.0.0-alpha.5" }, "peerDependencies": { - "@rescript/runtime": ">=12.0.0", + "@rescript/runtime": ">=13.0.0-alpha.5", "react": ">=19.2.0", "react-dom": ">=19.2.0" } }, "node_modules/@rescript/darwin-arm64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.2.0.tgz", - "integrity": "sha512-xc3K/J7Ujl1vPiFY2009mRf3kWRlUe/VZyJWprseKxlcEtUQv89ter7r6pY+YFbtYvA/fcaEncL9CVGEdattAg==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-13.0.0-alpha.5.tgz", + "integrity": "sha512-OCpT4VYLkxTjm56y+CG4SfrqotMLCaqKY5pxGq75hOPRZLZ5n5BG3OvA1rBsmz5+gT7VpKm1Do9YhmO0JvYZfg==", "cpu": [ "arm64" ], @@ -37,9 +38,9 @@ } }, "node_modules/@rescript/darwin-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.2.0.tgz", - "integrity": "sha512-qqcTvnlSeoKkywLjG7cXfYvKZ1e4Gz2kUKcD6SiqDgCqm8TF+spwlFAiM6sloRUOFsc0bpC/0R0B3yr01FCB1A==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-13.0.0-alpha.5.tgz", + "integrity": "sha512-UT143XnOVmUUayrD/1ceKrXb8rbhNmXKhhfnTnRGRLWp1Hxyiq5uq3OGNorSIW6jHsszsP0VvjKA+Z31h04E6Q==", "cpu": [ "x64" ], @@ -54,9 +55,9 @@ } }, "node_modules/@rescript/linux-arm64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.2.0.tgz", - "integrity": "sha512-ODmpG3ji+Nj/8d5yvXkeHlfKkmbw1Q4t1iIjVuNwtmFpz7TiEa7n/sQqoYdE+WzbDX3DoJfmJNbp3Ob7qCUoOg==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-13.0.0-alpha.5.tgz", + "integrity": "sha512-lQ3trljExrH1uqS3hsjjoi6fnaImG/tYppcF2X4Yk8u0AP1t6AC6LUM0KR2kjctG5b7OVUrujOu91NnjovN46A==", "cpu": [ "arm64" ], @@ -71,9 +72,9 @@ } }, "node_modules/@rescript/linux-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.2.0.tgz", - "integrity": "sha512-2W9Y9/g19Y4F/subl8yV3T8QBG2oRaP+HciNRcBjptyEdw9LmCKH8+rhWO6sp3E+nZLwoE2IAkwH0WKV3wqlxQ==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-13.0.0-alpha.5.tgz", + "integrity": "sha512-Cu73xGa2nMcSgW274tAJDexlBqJGFKpv/v9wHAxqFxXzIwSkET51N9xkf42GljejeVzwyDEfgQId2Znme/PWkg==", "cpu": [ "x64" ], @@ -88,16 +89,15 @@ } }, "node_modules/@rescript/runtime": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-12.2.0.tgz", - "integrity": "sha512-NwfljDRq1rjFPHUaca1nzFz13xsa9ZGkBkLvMhvVgavJT5+A4rMcLu8XAaVTi/oAhO/tlHf9ZDoOTF1AfyAk9Q==", - "license": "MIT", - "peer": true + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-13.0.0-alpha.5.tgz", + "integrity": "sha512-k0iQhrDasCD5K5orSrps21ZVgvMgOIwh03QjUAxtMkVwyPclg6LbgG5eAAgduyecXXm3ii30o3nDaXvCryu/Tw==", + "license": "MIT" }, "node_modules/@rescript/win32-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.2.0.tgz", - "integrity": "sha512-fhf8CBj3p1lkIXPeNko3mVTKQfXXm4BoxJtR1xAXxUn43wDpd8Lox4w8/EPBbbW6C/YFQW6H7rtpY+2AKuNaDA==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-13.0.0-alpha.5.tgz", + "integrity": "sha512-7uUkUY0pXDdPB5znHQYWsGml3E2pQ68KSaM7HZoFfnOEIuPqGz/hssgLgsXHkfHxrHB0waX9fsqx2Qckn6IGsw==", "cpu": [ "x64" ], @@ -111,13 +111,22 @@ "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", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -136,41 +145,41 @@ } }, "node_modules/rescript": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.2.0.tgz", - "integrity": "sha512-1Jf2cmNhyx5Mj2vwZ4XXPcXvNSjGj9D1jPBUcoqIOqRpLPo1ch2Ta/7eWh23xAHWHK5ow7BCDyYFjvZSjyjLzg==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-13.0.0-alpha.5.tgz", + "integrity": "sha512-rv/xA1OQLN5l90/szD82IR8p/bNzwKNPLnEVaR89oiuBZYG7IhHfRxEKAvpOHqlrpnV8zKmc16IXcjCQxlni/w==", "dev": true, "license": "(LGPL-3.0-or-later AND MIT)", "workspaces": [ + "packages/dev-playground", "packages/playground", "packages/@rescript/*", "tests/dependencies/**", "tests/analysis_tests/**", "tests/docstring_tests", "tests/gentype_tests/**", + "tests/tests", "tests/tools_tests", "tests/commonjs_tests", "scripts/res" ], "dependencies": { - "@rescript/runtime": "12.2.0" + "@rescript/runtime": "13.0.0-alpha.5" }, "bin": { "bsc": "cli/bsc.js", - "bstracing": "cli/bstracing.js", "rescript": "cli/rescript.js", - "rescript-legacy": "cli/rescript-legacy.js", "rescript-tools": "cli/rescript-tools.js" }, "engines": { - "node": ">=20.11.0" + "node": ">=22" }, "optionalDependencies": { - "@rescript/darwin-arm64": "12.2.0", - "@rescript/darwin-x64": "12.2.0", - "@rescript/linux-arm64": "12.2.0", - "@rescript/linux-x64": "12.2.0", - "@rescript/win32-x64": "12.2.0" + "@rescript/darwin-arm64": "13.0.0-alpha.5", + "@rescript/darwin-x64": "13.0.0-alpha.5", + "@rescript/linux-arm64": "13.0.0-alpha.5", + "@rescript/linux-x64": "13.0.0-alpha.5", + "@rescript/win32-x64": "13.0.0-alpha.5" } }, "node_modules/scheduler": { @@ -183,52 +192,56 @@ }, "dependencies": { "@rescript/darwin-arm64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-12.2.0.tgz", - "integrity": "sha512-xc3K/J7Ujl1vPiFY2009mRf3kWRlUe/VZyJWprseKxlcEtUQv89ter7r6pY+YFbtYvA/fcaEncL9CVGEdattAg==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/darwin-arm64/-/darwin-arm64-13.0.0-alpha.5.tgz", + "integrity": "sha512-OCpT4VYLkxTjm56y+CG4SfrqotMLCaqKY5pxGq75hOPRZLZ5n5BG3OvA1rBsmz5+gT7VpKm1Do9YhmO0JvYZfg==", "dev": true, "optional": true }, "@rescript/darwin-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-12.2.0.tgz", - "integrity": "sha512-qqcTvnlSeoKkywLjG7cXfYvKZ1e4Gz2kUKcD6SiqDgCqm8TF+spwlFAiM6sloRUOFsc0bpC/0R0B3yr01FCB1A==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/darwin-x64/-/darwin-x64-13.0.0-alpha.5.tgz", + "integrity": "sha512-UT143XnOVmUUayrD/1ceKrXb8rbhNmXKhhfnTnRGRLWp1Hxyiq5uq3OGNorSIW6jHsszsP0VvjKA+Z31h04E6Q==", "dev": true, "optional": true }, "@rescript/linux-arm64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-12.2.0.tgz", - "integrity": "sha512-ODmpG3ji+Nj/8d5yvXkeHlfKkmbw1Q4t1iIjVuNwtmFpz7TiEa7n/sQqoYdE+WzbDX3DoJfmJNbp3Ob7qCUoOg==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/linux-arm64/-/linux-arm64-13.0.0-alpha.5.tgz", + "integrity": "sha512-lQ3trljExrH1uqS3hsjjoi6fnaImG/tYppcF2X4Yk8u0AP1t6AC6LUM0KR2kjctG5b7OVUrujOu91NnjovN46A==", "dev": true, "optional": true }, "@rescript/linux-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-12.2.0.tgz", - "integrity": "sha512-2W9Y9/g19Y4F/subl8yV3T8QBG2oRaP+HciNRcBjptyEdw9LmCKH8+rhWO6sp3E+nZLwoE2IAkwH0WKV3wqlxQ==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/linux-x64/-/linux-x64-13.0.0-alpha.5.tgz", + "integrity": "sha512-Cu73xGa2nMcSgW274tAJDexlBqJGFKpv/v9wHAxqFxXzIwSkET51N9xkf42GljejeVzwyDEfgQId2Znme/PWkg==", "dev": true, "optional": true }, "@rescript/runtime": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-12.2.0.tgz", - "integrity": "sha512-NwfljDRq1rjFPHUaca1nzFz13xsa9ZGkBkLvMhvVgavJT5+A4rMcLu8XAaVTi/oAhO/tlHf9ZDoOTF1AfyAk9Q==", - "peer": true + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/runtime/-/runtime-13.0.0-alpha.5.tgz", + "integrity": "sha512-k0iQhrDasCD5K5orSrps21ZVgvMgOIwh03QjUAxtMkVwyPclg6LbgG5eAAgduyecXXm3ii30o3nDaXvCryu/Tw==" }, "@rescript/win32-x64": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-12.2.0.tgz", - "integrity": "sha512-fhf8CBj3p1lkIXPeNko3mVTKQfXXm4BoxJtR1xAXxUn43wDpd8Lox4w8/EPBbbW6C/YFQW6H7rtpY+2AKuNaDA==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/@rescript/win32-x64/-/win32-x64-13.0.0-alpha.5.tgz", + "integrity": "sha512-7uUkUY0pXDdPB5znHQYWsGml3E2pQ68KSaM7HZoFfnOEIuPqGz/hssgLgsXHkfHxrHB0waX9fsqx2Qckn6IGsw==", "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", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", - "dev": true, - "peer": true + "dev": true }, "react-dom": { "version": "19.2.4", @@ -240,17 +253,17 @@ } }, "rescript": { - "version": "12.2.0", - "resolved": "https://registry.npmjs.org/rescript/-/rescript-12.2.0.tgz", - "integrity": "sha512-1Jf2cmNhyx5Mj2vwZ4XXPcXvNSjGj9D1jPBUcoqIOqRpLPo1ch2Ta/7eWh23xAHWHK5ow7BCDyYFjvZSjyjLzg==", + "version": "13.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/rescript/-/rescript-13.0.0-alpha.5.tgz", + "integrity": "sha512-rv/xA1OQLN5l90/szD82IR8p/bNzwKNPLnEVaR89oiuBZYG7IhHfRxEKAvpOHqlrpnV8zKmc16IXcjCQxlni/w==", "dev": true, "requires": { - "@rescript/darwin-arm64": "12.2.0", - "@rescript/darwin-x64": "12.2.0", - "@rescript/linux-arm64": "12.2.0", - "@rescript/linux-x64": "12.2.0", - "@rescript/runtime": "12.2.0", - "@rescript/win32-x64": "12.2.0" + "@rescript/darwin-arm64": "13.0.0-alpha.5", + "@rescript/darwin-x64": "13.0.0-alpha.5", + "@rescript/linux-arm64": "13.0.0-alpha.5", + "@rescript/linux-x64": "13.0.0-alpha.5", + "@rescript/runtime": "13.0.0-alpha.5", + "@rescript/win32-x64": "13.0.0-alpha.5" } }, "scheduler": { diff --git a/package.json b/package.json index 3762776..1f610c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@rescript/react", - "version": "0.15.0", + "version": "0.16.0", "description": "React bindings for ReScript", "files": [ "README.md", @@ -29,13 +29,14 @@ }, "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" + "rescript": "^13.0.0-alpha.5" }, "peerDependencies": { - "@rescript/runtime": ">=12.0.0", + "@rescript/runtime": ">=13.0.0-alpha.5", "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 e453bfc..33aa4c7 100644 --- a/src/React.res +++ b/src/React.res @@ -13,7 +13,7 @@ type componentLike<'props, 'return> = Jsx.componentLike<'props, 'return> type component<'props> = Jsx.component<'props> -external component: componentLike<'props, element> => component<'props> = "%identity" +external component: componentLike<'props, element> => component<'props> = "%component_identity" @module("react") external createElement: (component<'props>, 'props) => element = "createElement"