Repository navigation
Conversation
- turbo.json: pipeline -> tasks. - Turbo 2 runs tasks in strict env mode, so the release task now passes through the CI/GitHub/npm/Yarn variables semantic-release needs. - Turbo 2 ships a built-in `turbo docs <query>` command, so root scripts now use the explicit `turbo run <task>` form. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
typedoc 0.25.8 -> 0.28.20, typedoc-plugin-markdown 3.17.1 -> 4.14.0, typedoc-plugin-merge-modules 5.1.0 -> 7.0.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
semantic-release 23.1.1 -> 25.0.9 (semantic-release-yarn is already on its latest, 3.0.2). semantic-release 25 needs Node ^22.14 || >=24.10; the release workflow runs on .nvmrc (25.2.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3f52540 to
729a4d2
Compare
The next commit's yarn dedupe collapses the stale @types/react@* 18.3.3 lockfile entry into 19.2.18 (the version packages/native already declares). React 19's types no longer declare a global JSX namespace, so `JSX.Element` would stop compiling. ReactElement works on both. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lockfile only, no new resolutions: brace-expansion (1.1.21 / 2.1.7 / 5.0.12), braces 3.0.3, compression 1.8.2, flatted 3.4.4, form-data 4.0.6, joi 17.13.8, js-yaml@3 3.15.2, lodash / lodash-es 4.18.1, micromatch 4.0.8, picomatch (2.3.2 / 4.0.7), ws (7.5.13 / 8.22.0). js-yaml 4.x is left to #182. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every mocha 11.x release pins serialize-javascript to ^6, which is vulnerable (GHSA-5c6j-r48x-rmvq, high; GHSA-qj8w-gfj5-8c6v, moderate). mocha 12 depends on ^7.1.1 (resolves 7.1.2), so this clears both without forcing a major on mocha 11 through a resolution. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
mocha 12 needs Node ^20.19.0 || >=22.12.0; the old ">=20" let 20.0-20.18 install and then fail at test time. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
typedoc writes to ../../docs/<pkg>/build, outside the package, so turbo can't capture it as an output: a cache hit restored no docs (turbo 2 now warns about this). Always run it instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Hi @fefi95, thanks for batching these upgrades. Moving to Turbo 2 and clearing the transitive alerts in one go is really helpful.
I'm requesting changes for one item that I think will break the next real release. The rest are smaller and I've left them inline.
Blocking
turbo.json: Turbo 2's strict env mode will likely keep the GitHub OIDC variables away fromsemantic-release. Every package publishes with"provenance": true, and provenance needsACTIONS_ID_TOKEN_REQUEST_URL/_TOKEN. A dry run can't catch this, so it would only show up on the nextworkflow_dispatchrelease.
Non-blocking
mocha12 /semantic-release25 need a newer Node than our rootengines.node: ">=20"allows.@types/mochais still on v10 whilemochais on v12.- semantic-release jumps two majors (23 → 25, which brings commit-analyzer 13) and hasn't been run for real yet, so the scope-negation
releaseRulesare worth a quick check. - The same five devDependency bumps are repeated in 4 packages plus
examples/mocha. They could be hoisted to the root, but that can be a follow-up.
Pre-existing (not caused by this PR, FYI): the docs task's outputs: ["docs/*/build/**"] is resolved per package, but typedoc writes to ../../docs/<pkg>/build. So turbo caches no files, and after yarn clean a cache hit can leave docs/*/build empty. typedoc.json is also missing from inputs. It might be worth a follow-up issue, since this PR changes the typedoc majors.
🤖 Generated with Claude Code
| "cache": false, | ||
| "dependsOn": ["^build"] | ||
| "dependsOn": ["^build"], | ||
| "passThroughEnv": ["CI", "GITHUB_*", "GH_*", "NPM_*", "YARN_*"] |
There was a problem hiding this comment.
Turbo 2 runs tasks in strict env mode, so anything not listed here (or in turbo's small built-in allowlist) is removed from the task's environment. All four packages publish with publishConfig.provenance: true, and release.yml grants id-token: write for that. Provenance needs ACTIONS_ID_TOKEN_REQUEST_URL and ACTIONS_ID_TOKEN_REQUEST_TOKEN, and neither matches these globs. A dry run wouldn't catch this because nothing is published.
| "passThroughEnv": ["CI", "GITHUB_*", "GH_*", "NPM_*", "YARN_*"] | |
| "passThroughEnv": ["CI", "GITHUB_*", "GH_*", "NPM_*", "YARN_*", "ACTIONS_*", "RUNNER_*", "GIT_*", "SEMANTIC_RELEASE_*", "DEBUG"] |
(DEBUG is so DEBUG=semantic-release:* still works for troubleshooting. Alternatively, "envMode": "loose" on just this task would avoid keeping an allowlist up to date.)
There was a problem hiding this comment.
Applied your list in 8495f57. With ACTIONS_ID_TOKEN_REQUEST_URL=x turbo run release --dry=json, the variable now shows up in the release task's passthrough env; with the previous turbo.json it was dropped.
Related finding: provenance isn't in effect today. npm view @assertive-ts/core dist.attestations is empty for 2.0.0 and 2.1.0 (same for @assertive-ts/sinon), while it returns an attestation for e.g. semantic-release. And ACTIONS_ID_TOKEN doesn't appear anywhere in .yarn/releases/yarn-4.1.0.cjs. So the passthrough only matters once Yarn is upgraded. Noted in the PR description.
| "all-contributors-cli": "^6.26.1", | ||
| "mocha": "^11.8.0", | ||
| "semantic-release": "^23.1.1", | ||
| "mocha": "^12.0.3", |
There was a problem hiding this comment.
mocha@12 requires Node ^20.19.0 || >=22.12.0, and semantic-release@25 requires ^22.14.0 || >=24.10.0. The root engines.node is still >=20, so the engines plugin lets someone on Node 20.11 / 22.0 install and then fail with a confusing error in yarn test / yarn release. CI is fine because it resolves the latest 20/22/24. Should we raise the root engines.node to ^20.19.0 || >=22.12.0?
There was a problem hiding this comment.
Done in 257bdb0: root engines.node is now ^20.19.0 || >=22.12.0. The release job reads .nvmrc (25.2.1), which also satisfies semantic-release 25.
| @@ -11,7 +11,7 @@ | |||
| "@examples/symbol-plugin": "workspace:^", | |||
| "@types/mocha": "^10.0.6", | |||
There was a problem hiding this comment.
@types/mocha is still ^10.0.6 (10.0.6 in the lockfile) while the runtime is now mocha 12, so the tests type-check against an older API. Could we bump it together with mocha?
There was a problem hiding this comment.
Bumped to ^10.0.10 in all five packages (715c8b2). That's the latest @types/mocha on npm; there is no v11 or v12, and mocha 12.0.3 doesn't ship its own type definitions.
| "mocha": "^11.8.0", | ||
| "semantic-release": "^23.1.1", | ||
| "mocha": "^12.0.3", | ||
| "semantic-release": "^25.0.9", |
There was a problem hiding this comment.
This is two majors of semantic-release (and commit-analyzer 12 → 13, @semantic-release/github → 12). Since yarn release wasn't run for real, could you double-check that the releaseRules scope negations in .releaserc.json (!core, !all, …) still match the same way under commit-analyzer 13? If not, the first release after merge could publish every package for a commit scoped to one package, or publish none.
There was a problem hiding this comment.
Checked by running analyzeCommits from commit-analyzer 12.0.0 (main's lockfile) and 13.0.1 (this PR) with the packages/core/.releaserc.json rules on the same commits. Results are identical:
| Commit | 12.0.0 | 13.0.1 |
|---|---|---|
feat(core), fix(core), feat(dom), feat(all), chore(all) |
no release | no release |
feat: |
minor | minor |
fix: |
patch | patch |
feat(core)!: + BREAKING CHANGE |
major | major |
Unchanged by this PR, but worth knowing: with these rules a scoped feat(core) / fix(core) doesn't trigger a release on either version.
| "jsdom": "^24.0.0", | ||
| "jsdom-global": "^3.0.2", | ||
| "mocha": "^11.8.0", | ||
| "mocha": "^12.0.3", |
There was a problem hiding this comment.
The same mocha / semantic-release / typedoc* bumps are hand-edited in core, dom, native, sinon and examples/mocha. We could hoist them to the root devDependencies so the next upgrade is a single edit and can't drift. That's fine as a follow-up and doesn't need to be in this PR.
There was a problem hiding this comment.
Agreed, leaving the hoisting for a follow-up so this PR stays scoped to the alerts.
729a4d2 to
3f1c7ff
Compare
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
rojasTob
left a comment
There was a problem hiding this comment.
Hi @fefi95! Thanks so much for working through all of these, and for being so thorough about it 🙌
Approving ✅
- Turbo env passthrough: looks great, and thanks for checking it with
--dry=json. Good catch on provenance too. I confirmed it:dist.attestationsis empty for@assertive-ts/core, and Yarn 4.1.0 never reads the OIDC token. So the passthrough will be ready once we upgrade Yarn. engines.nodeand@types/mocha10.0.10: both look good. Thanks for checking that there's no newer@types/mocha.- Release rules check: thanks for the comparison table. I reran it with commit-analyzer 12 and got identical results.
- Hoisting the devDependencies: agreed, a follow-up makes sense.
Your side note on the release rules turned out to matter more than it looked. Because of how !all and !core combine, every scoped commit (feat(core), feat(dom), feat(all)…) maps to release: false, and only unscoped feat:/fix: trigger a release. That's probably why @assertive-ts/dom was never published to npm, even after toHaveAccessibleDescription, toContainHTML and toBePressed merged. It's older than this PR, so it shouldn't block anything here, but could you open an issue for it? 🙏
One more reminder: let's keep an eye on the first manual Release run after merge, since it'll be the first one on Turbo 2 and semantic-release 25.
Great work! 🚀
🤖 Generated with Claude Code
Closes #188
Closes #198
Parent tools are bumped first, then the lockfile is refreshed within existing ranges. No
resolutionsadded. One commit per step. No published package's runtimedependencieschanged: onlydevDependencieswere edited.Not covered here, because other PRs own them:
js-yaml4.x (#182),minimatch(#185),ip-address/socks(#186) andshell-quote(#187). Expect ayarn.lockconflict with whichever of these merges first. The parent bumps and the dedupe did shift someminimatchlockfile entries as a side effect (for example,^9.0.4moved from 9.0.5 to 9.0.9). This wasn't deliberate, and #185's targeted fix still applies.Changes
turbotypedoc/typedoc-plugin-markdown/typedoc-plugin-merge-modulessemantic-releasemochaserialize-javascript6.0.2 → 7.1.2; mocha 11 pins^6)@types/mochapacote,sigstore@isaacs/brace-expansion,browserslist,cross-spawn,glob@10yarn dedupebrace-expansionbraces,compression,flatted,form-data,joijs-yaml@3,lodash,lodash-es,micromatch,picomatch,wshttp-cache-semantics,sprintf-js,elliptic,braces(new advisory),tmpBreaking changes handled
turbo.jsonmoved frompipelinetotasks.turbo docscommand, so the root scripts now useturbo run <task>.releasetask now getspassThroughEnvforCI,GITHUB_*,GH_*,NPM_*,YARN_*,ACTIONS_*,RUNNER_*,GIT_*,SEMANTIC_RELEASE_*andDEBUG. A--dry=jsonrun shows a setACTIONS_ID_TOKEN_REQUEST_URLreaching the task (it was stripped before).SinonSpyAssertionandSinonSpyCallAssertionare type-only exports, so their pages move fromclasses/tointerfaces/. External links to the old pages will 404.^20.19.0 || >=22.12.0. Rootenginesis tightened to match..mocharc.json,--forbid-onlyand the test counts are unchanged.docstask: caching is turned off. typedoc writes to../../docs/<pkg>/build, outside the package, so theoutputsglob matched nothing and a cache hit restored no docs..nvmrc(25.2.1), so this is fine. The.releaserc.jsonrules give identical results under commit-analyzer 12 (main) and 13 (this PR) on the same sample commits.yarn releasewas not run.yarn dedupemoved@types/reactto 19, which drops the globalJSXnamespace. One native test fixture now usesReactElementinstead.No upstream fix (for Vanta dismissal)
None of these is in the dependency tree of a published
@assertive-ts/*package. They are all dev-only, although Dependabot labels the alertsscope: runtime.http-cache-semantics4.1.1 (high, #180)semantic-release→@semantic-release/npm→npm→make-fetch-happen; also Yarn's implicitnode-gyp@10→make-fetch-happen@13make-fetch-happencopies build their cache policy withshared: false(lib/cache/policy.js). Also, no.releaserc.jsonloads@semantic-release/npm, so semantic-release never runs that npm code. Note: 4.3.0 is outside the advisory's<=4.2.0range and would close the alert, but itsmax-stalehandling is unchanged, so this PR keeps 4.1.1 rather than close the alert without a fix.sprintf-js1.0.3 (moderate, #184)jest/react-native→babel-plugin-istanbul→@istanbuljs/load-nyc-config→js-yaml@3→argparse@1js-yaml@3requiresargparseonly from its CLI (bin/js-yaml.js);load-nyc-configuses the library, soargparse/sprintf-jsare never loaded. Everysprintf-jsrelease is affected.elliptic6.6.1 (low, #162)@assertive-ts/native(dev) →react-native-testing-mocks→rewiremock→node-libs-browser→crypto-browserifyrewiremockloadsnode-libs-browseronly when__webpack_require__is defined; the tests run under mocha on Node, not webpack.braces3.0.3 (high, GHSA-vfj7)micromatch← jest / metro / semantic-releasetmp0.0.33 (high)all-contributors-cli→inquirer@7→external-editorexternal-editorpinstmp@^0.0.33, so the fix needs a 0.x major.all-contributors-clihas no editor prompt (noeditorreference in itsdist). Reviewer call:"external-editor/tmp": "^0.2.6"would close it.Still open: moderate and low (follow-up)
ip-address(Chore: bump ip-address to 10.7.4 and drop socks resolution #186) andjs-yaml@4(Chore: JS-yaml vulnerability #182)@babel/runtime,@humanfs/node,@sinonjs/text-encoding,@testing-library/react-native,ajv,core-js,eslint,fast-xml-parser,glob@7/inflight,lodash.get,pbkdf2,postcss-selector-parser,qs,rimraf@3,whatwg-encodingdiffAll are dev-only.
Verification
yarn install --immutable, with the turbo cache bypassed, on the PR tip.yarn build,yarn docs,yarn compile,yarn lintandyarn testall pass, with the same test counts asmain.Notes for the release
yarn releasewas not run here.publishConfig.provenance: truecurrently has no effect: the bundled Yarn 4.1.0 never reads the OIDC token (ACTIONS_ID_TOKENdoes not appear in it), andnpm view @assertive-ts/core dist.attestationsis empty for published versions. TheACTIONS_*passthrough only matters once Yarn is upgraded.yarn npm audit --all --recursive --severity high🤖 Generated with Claude Code