diff --git a/.changeset/old-poems-sing.md b/.changeset/old-poems-sing.md new file mode 100644 index 00000000..f774682f --- /dev/null +++ b/.changeset/old-poems-sing.md @@ -0,0 +1,9 @@ +--- +"cmake-file-api": patch +"weak-node-api": patch +"@react-native-node-api/cli-utils": patch +"@react-native-node-api/test-app": patch +"react-native-node-api": patch +--- + +Fix minor package issues. diff --git a/.changeset/wild-boats-lay.md b/.changeset/wild-boats-lay.md new file mode 100644 index 00000000..302b14b3 --- /dev/null +++ b/.changeset/wild-boats-lay.md @@ -0,0 +1,5 @@ +--- +"weak-node-api": patch +--- + +Add missing "generated" directory diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index d85f17bd..17cfdac4 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -49,6 +49,7 @@ jobs: DEBUG: eslint:eslint - run: npm run prettier:check - run: npm run depcheck + - run: npm run publint unit-tests: strategy: fail-fast: false diff --git a/apps/test-app/package.json b/apps/test-app/package.json index 2f41e8c4..39518dd6 100644 --- a/apps/test-app/package.json +++ b/apps/test-app/package.json @@ -1,6 +1,7 @@ { "name": "@react-native-node-api/test-app", "private": true, + "type": "commonjs", "version": "0.2.0", "scripts": { "metro": "react-native start --no-interactive", diff --git a/package-lock.json b/package-lock.json index b16b1d3a..eaf0b060 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,6 +32,7 @@ "eslint-config-prettier": "^10.1.8", "globals": "^16.0.0", "prettier": "^3.6.2", + "publint": "^0.3.15", "react-native": "0.81.4", "read-pkg": "^9.0.1", "tsx": "^4.20.6", @@ -5319,6 +5320,19 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/@publint/pack": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@publint/pack/-/pack-0.1.2.tgz", + "integrity": "sha512-S+9ANAvUmjutrshV4jZjaiG8XQyuJIZ8a4utWmN/vW1sgQ9IfBnPndwkmQYw53QmouOIytT874u65HEmu6H5jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" + } + }, "node_modules/@react-native-community/cli": { "version": "20.0.2", "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-20.0.2.tgz", @@ -8834,16 +8848,6 @@ "node": ">= 0.8" } }, - "node_modules/end-of-stream": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", - "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/enquirer": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", @@ -9731,13 +9735,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT" - }, "node_modules/fs-extra": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", @@ -11801,13 +11798,6 @@ "node": ">=10" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true, - "license": "MIT" - }, "node_modules/mocha": { "version": "11.7.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.7.2.tgz", @@ -12199,32 +12189,6 @@ "node": ">=12.0.0" } }, - "node_modules/node-abi": { - "version": "3.77.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.77.0.tgz", - "integrity": "sha512-DSmt0OEcLoK4i3NuscSbGjOf3bqiDEutejqENSplMSFA/gmB8mkED9G4pKWnPl7MDU4rSHebKPHeitpDfyH0cQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-abi/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/node-addon-api": { "version": "8.5.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", @@ -12870,37 +12834,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/prebuildify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/prebuildify/-/prebuildify-6.0.1.tgz", - "integrity": "sha512-8Y2oOOateom/s8dNBsGIcnm6AxPmLH4/nanQzL5lQMU+sC0CMhzARZHizwr36pUPLdvBnOkCNQzxg4djuFSgIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "mkdirp-classic": "^0.5.3", - "node-abi": "^3.3.0", - "npm-run-path": "^3.1.0", - "pump": "^3.0.0", - "tar-fs": "^2.1.0" - }, - "bin": { - "prebuildify": "bin.js" - } - }, - "node_modules/prebuildify/node_modules/npm-run-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", - "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -12982,17 +12915,35 @@ "dev": true, "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "node_modules/publint": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/publint/-/publint-0.3.15.tgz", + "integrity": "sha512-xPbRAPW+vqdiaKy5sVVY0uFAu3LaviaPO3pZ9FaRx59l9+U/RKR1OEbLhkug87cwiVKxPXyB4txsv5cad67u+A==", "dev": true, "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "@publint/pack": "^0.1.2", + "package-manager-detector": "^1.3.0", + "picocolors": "^1.1.1", + "sade": "^1.8.1" + }, + "bin": { + "publint": "src/cli.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://bjornlu.com/sponsor" } }, + "node_modules/publint/node_modules/package-manager-detector": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.5.0.tgz", + "integrity": "sha512-uBj69dVlYe/+wxj8JOpr97XfsxH/eumMt6HqjNTmJDf/6NO9s+0uxeOneIz3AsPt2m6y9PqzDzd3ATcU17MNfw==", + "dev": true, + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -13698,6 +13649,19 @@ "tslib": "^2.1.0" } }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -14389,43 +14353,6 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", - "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true, - "license": "ISC" - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/tar/node_modules/minipass": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", @@ -15379,11 +15306,12 @@ } }, "packages/cmake-rn": { - "version": "0.5.2", + "version": "0.6.0", "dependencies": { "@react-native-node-api/cli-utils": "0.1.1", "cmake-file-api": "0.1.0", - "react-native-node-api": "0.6.2", + "react-native-node-api": "0.7.0", + "weak-node-api": "0.0.2", "zod": "^4.1.11" }, "bin": { @@ -15396,11 +15324,12 @@ }, "packages/ferric": { "name": "ferric-cli", - "version": "0.3.7", + "version": "0.3.8", "dependencies": { "@napi-rs/cli": "~3.0.3", "@react-native-node-api/cli-utils": "0.1.1", - "react-native-node-api": "0.6.2" + "react-native-node-api": "0.7.0", + "weak-node-api": "0.0.2" }, "bin": { "ferric": "bin/ferric.js" @@ -15414,7 +15343,7 @@ } }, "packages/gyp-to-cmake": { - "version": "0.4.0", + "version": "0.5.0", "dependencies": { "@react-native-node-api/cli-utils": "0.1.1", "gyp-parser": "^1.0.4", @@ -15427,7 +15356,7 @@ }, "packages/host": { "name": "react-native-node-api", - "version": "0.6.2", + "version": "0.7.0", "license": "MIT", "dependencies": { "@expo/plist": "^0.4.7", @@ -15447,7 +15376,7 @@ "peerDependencies": { "@babel/core": "^7.26.10", "react-native": "0.79.1 || 0.79.2 || 0.79.3 || 0.79.4 || 0.79.5 || 0.79.6 || 0.79.7 || 0.80.0 || 0.80.1 || 0.80.2 || 0.81.0 || 0.81.1 || 0.81.2 || 0.81.3 || 0.81.4 || 0.81.5", - "weak-node-api": "0.0.1" + "weak-node-api": "0.0.2" } }, "packages/node-addon-examples": { @@ -15469,17 +15398,18 @@ "devDependencies": { "cmake-rn": "*", "gyp-to-cmake": "*", - "prebuildify": "^6.0.1", - "react-native-node-api": "^0.6.1", + "react-native-node-api": "^0.7.0", "read-pkg": "^9.0.1", "rolldown": "1.0.0-beta.29" } }, "packages/weak-node-api": { - "version": "0.0.1", + "version": "0.0.2", "license": "MIT", + "dependencies": { + "node-api-headers": "^1.5.0" + }, "devDependencies": { - "node-api-headers": "^1.5.0", "zod": "^4.1.11" } } diff --git a/package.json b/package.json index 8ddb8b6c..7c4400dc 100644 --- a/package.json +++ b/package.json @@ -23,11 +23,13 @@ "dev": "tsc --build --watch", "lint": "eslint .", "depcheck": "node scripts/depcheck.ts", + "publint": "node scripts/run-in-published.ts npx publint --strict", "prettier:check": "prettier --experimental-cli --check .", "prettier:write": "prettier --experimental-cli --write .", "test": "npm test --workspace react-native-node-api --workspace cmake-rn --workspace gyp-to-cmake --workspace node-addon-examples", "bootstrap": "node --run build && npm run bootstrap --workspaces --if-present", "prerelease": "node --run build && npm run prerelease --workspaces --if-present", + "changeset": "changeset", "release": "changeset publish", "init-macos-test-app": "node scripts/init-macos-test-app.ts" }, @@ -67,6 +69,7 @@ "eslint-config-prettier": "^10.1.8", "globals": "^16.0.0", "prettier": "^3.6.2", + "publint": "^0.3.15", "react-native": "0.81.4", "read-pkg": "^9.0.1", "tsx": "^4.20.6", diff --git a/packages/cli-utils/package.json b/packages/cli-utils/package.json index af9743b6..05d9be6c 100644 --- a/packages/cli-utils/package.json +++ b/packages/cli-utils/package.json @@ -3,7 +3,12 @@ "version": "0.1.1", "description": "Useful utilities for the CLIs in the React Native Node API mono-repo", "type": "module", - "main": "dist/index.js", + "files": [ + "dist" + ], + "exports": { + ".": "./dist/index.js" + }, "dependencies": { "@commander-js/extra-typings": "^14.0.0", "bufout": "^0.3.2", diff --git a/packages/cmake-file-api/package.json b/packages/cmake-file-api/package.json index 656939c6..4958f523 100644 --- a/packages/cmake-file-api/package.json +++ b/packages/cmake-file-api/package.json @@ -19,7 +19,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/callstackincubator/react-native-node-api", + "url": "git+https://github.com/callstackincubator/react-native-node-api.git", "directory": "packages/cmake-file-api" }, "author": { diff --git a/packages/host/package.json b/packages/host/package.json index 400ecfc8..a071e6f8 100644 --- a/packages/host/package.json +++ b/packages/host/package.json @@ -19,8 +19,7 @@ "react-native": "./dist/react-native/index.js" }, "./babel-plugin": "./dist/node/babel-plugin/index.js", - "./cli": "./dist/node/cli/run.js", - "./weak-node-api": "./dist/node/weak-node-api.js" + "./cli": "./dist/node/cli/run.js" }, "files": [ "logo.svg", diff --git a/packages/weak-node-api/package.json b/packages/weak-node-api/package.json index 79256293..c5d85c6d 100644 --- a/packages/weak-node-api/package.json +++ b/packages/weak-node-api/package.json @@ -8,13 +8,16 @@ "url": "git+https://github.com/callstackincubator/react-native-node-api.git", "directory": "packages/weak-node-api" }, - "main": "dist/index.js", "type": "module", + "exports": { + ".": "./dist/index.js" + }, "files": [ "dist", "!dist/**/*.test.d.ts", "!dist/**/*.test.d.ts.map", "include", + "generated", "build/Debug", "build/Release", "*.podspec", diff --git a/scripts/run-in-published.ts b/scripts/run-in-published.ts new file mode 100644 index 00000000..cc59253b --- /dev/null +++ b/scripts/run-in-published.ts @@ -0,0 +1,32 @@ +import assert from "node:assert/strict"; +import cp from "node:child_process"; + +console.log("Run command in all non-private packages of the monorepo"); + +function getWorkspaces() { + const workspaces = JSON.parse( + cp.execFileSync("npm", ["query", ".workspace"], { encoding: "utf8" }), + ) as unknown; + assert(Array.isArray(workspaces)); + for (const workspace of workspaces) { + assert(typeof workspace === "object" && workspace !== null); + } + return workspaces as Record[]; +} + +const publishedPackagePaths = getWorkspaces() + .filter((w) => !w.private) + .map((p) => { + assert(typeof p.path === "string"); + return p.path; + }); + +const [, , command, ...argv] = process.argv; + +for (const packagePath of publishedPackagePaths) { + const { status } = cp.spawnSync(command, argv, { + cwd: packagePath, + stdio: "inherit", + }); + assert.equal(status, 0, `Command failed (status = ${status})`); +}