Skip to content

chore(deps): replace lerna with nx - #315

Merged
jsteinich merged 1 commit into
open-constructs:mainfrom
X-Guardian:chore/replace-lerna-with-nx
Jul 9, 2026
Merged

jsteinich merged 1 commit into
open-constructs:mainfrom
X-Guardian:chore/replace-lerna-with-nx

Conversation

@X-Guardian

Copy link
Copy Markdown
Contributor

Description

The repo already uses nx as its task runner for test, lint, and the affected-graph, but still depends on lerna for a handful of orchestration and release chores. This PR removes lerna entirely and routes those chores through nx, then converts the touched shell scripts to ESM Node.

Lerna → nx command mapping:

  • lerna run --scope <glob> <target> → nx run-many -t <target> -p <glob> (root build, package*, watch, dist-clean scripts).
  • lerna exec --scope <glob> -- <cmd> → nx exec -p <glob> -- <cmd> (link-packages, and the ncu runs in pnpm-upgrade.yml).
  • lerna ls -p (absolute package paths) → pnpm --recursive exec pwd.
  • lerna list --all --json / lerna ls --all --json (only the package names were used) → nx show projects --json.
  • lerna version <v> → nx release version <v>. This needs a release block in nx.json (fixed release group of cdktn, cdktn-cli, @cdktn/*); the command is run with --git-commit/tag/push=false --stage-changes=false so it only rewrites versions on disk, matching the old --no-git-tag-version --no-push behaviour.

Other Changes

Dead code deleted rather than converted (both were unreferenced — nothing in the repo or CI invoked them):

  • tools/build-unit-test-matrix.sh — the unit workflows build their matrix inline via nx show projects --affected; this script was orphaned.
  • tools/setup-prebuild-provider-folder.sh — a manual utility that scaffolded a workspace of cloned hashicorp/* provider repos, which are no longer the canonical source.

Shell/batch scripts converted to ESM Node (.mjs), per the repo's preference for JS ESM tooling:

  • tools/align-version.sh → tools/align-version.mjs. Also drops a dead jq loop that rewrote 0.0.0 peerDependencies — the only internal peerDep is cdktn: workspace:*, which jsii-pacmak resolves to a concrete version at pack time (verified against the built tarball), so the loop matched nothing.
  • tools/collect-dist.sh and tools/collect-dist.bat → a single cross-platform tools/collect-dist.mjs (uses fs.cpSync(..., { dereference: true }) for the rsync -aL behaviour; verified byte-identical output to the old script). The .bat was still calling lerna ls -p, so this also removes the last stray lerna reference. package-windows now runs the same .mjs as every other platform.
  • tools/build-example.js → tools/build-example.mjs (CJS require/__dirname → ESM). This leaves no CommonJS in top-level tools/.

Lint coverage for tools/: the root eslint.config.mjs ignores all **/*.js and **/*.mjs, and ESLint flat config does not auto-discover nested config files — so the top-level tools/ scripts were never linted (per-project linting only works because nx invokes ESLint per project). Added tools/project.json (@tools/scripts) so nx infers a lint target and the scripts are picked up by nx run-many -t lint, plus tools/eslint.config.mjs that lints them as plain ESM JavaScript (no type-aware TS parsing) and defers to the nested tools/* projects for their own files.

Callers updated: release.yml, unit.yml, pr-unit.yml, examples.yml, pnpm-upgrade.yml, CONTRIBUTING.md, and docs/release-please.md. Stale !tools/*.js negations in .gitignore / .prettierignore are dropped (the .mjs replacements aren't caught by the *.js ignore, so they need no negation).

Checklist

  • I have updated the PR title to match CDKTN's style guide
  • I have run the linter on my code locally
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation if applicable
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works if applicable
  • New and existing unit tests pass locally with my changes

@X-Guardian
X-Guardian force-pushed the chore/replace-lerna-with-nx branch from 98d4e6b to febb992 Compare July 7, 2026 15:01
@X-Guardian
X-Guardian marked this pull request as ready for review July 7, 2026 15:51
@X-Guardian
X-Guardian requested a review from a team as a code owner July 7, 2026 15:51
@jsteinich
jsteinich merged commit 94999fc into open-constructs:main Jul 9, 2026
259 checks passed
so0k pushed a commit that referenced this pull request Aug 7, 2026
🤖 Release PR — merge to cut a new release. Kept open and rebased
as commits land on `main`.
---


<details><summary>0.24.0</summary>

##
[0.24.0](v0.23.4...v0.24.0)
(2026-08-06)


### ⚠ BREAKING CHANGES

* **lib:** validate Terraform function versions by default
([#362](#362))
* **deps:** Require Node 22 minimum
([#345](#345))
* **lib:** preserve symlinks in TerraformAsset walkers
([#321](#321))
* **cli:** replace node-fetch with undici
([#306](#306))

### Features

* **lib:** canonical asset hashes behind the canonicalAssetHashes
feature flag
([#323](#323))
([76dd4ff](76dd4ff))
* **lib:** validate Terraform function versions by default
([#362](#362))
([4ac0736](4ac0736))
* support newer provider plugin-protocol features via targetVersions
(RFC-04)
([#296](#296))
([90322f9](90322f9))


### Bug Fixes

* **cli:** don't downgrade prebuilt providers on a transient registry
failure
([#298](#298))
([a960c5c](a960c5c))
* **cli:** include dev dependencies in npm version lookup
([#280](#280))
([955204a](955204a))
* **docs:** fix stale constructs pin breaking with()/IMixin docs
([#305](#305))
([605cf63](605cf63))
* **gha:** Allow pnpm to update the lockfile after package updates
([#318](#318))
([a899b7c](a899b7c))
* **gha:** Fix pnpm upgrade workflow
([#335](#335))
([e1a69fc](e1a69fc))
* **gha:** flip merged release PR label to autorelease: tagged
([#302](#302))
([8d64f6c](8d64f6c))
* **gha:** mint the Go-publish token from the CDKTN Maintainers app
([#369](#369))
([71921ce](71921ce))
* **gha:** mint the Go-publish token from the open-constructs-cdktn App
([#368](#368))
([179f10c](179f10c))
* **gha:** pass the Go-publish App token as x-access-token userinfo
([#370](#370))
([4e3ff19](4e3ff19))
* **lib:** Disallow constructs 10.8 until support can be added
([#363](#363))
([8bdae0d](8bdae0d))
* **lib:** preserve symlinks in TerraformAsset walkers
([#321](#321))
([6360e20](6360e20))
* typo in `moveFromId` JSDoc
([#355](#355))
([e1cf8ce](e1cf8ce))


### Miscellaneous Chores

* **cli:** replace Ink + React with smaller-tree CLI libraries
([#264](#264))
([a6aff7e](a6aff7e))
* **cli:** replace node-fetch with undici
([#306](#306))
([1317141](1317141))
* **deps:** bump glob to 13.0.6
([#307](#307))
([47ee2bb](47ee2bb))
* **deps:** bump the github-actions-backward-compatible group with 2
updates
([#295](#295))
([eab2a01](eab2a01))
* **deps:** replace lerna with nx
([#315](#315))
([94999fc](94999fc))
* **deps:** Require Node 22 minimum
([#345](#345))
([2bf315d](2bf315d))
* **deps:** update ci-info to 4.4.0 across all packages
([#329](#329))
([557a163](557a163))
* **deps:** update fs-extra to 11.3.6 across all packages
([#328](#328))
([95753a9](95753a9))
* **deps:** update minimatch to 10.2.5
([#330](#330))
([d1c1c53](d1c1c53))
* **deps:** Update sscaff to v2.0.388
([#331](#331))
([38ea0ba](38ea0ba))
* **deps:** Update zod to v4.4.3
([#332](#332))
([c10ee35](c10ee35))
* **deps:** Upgrade dependencies
([#347](#347))
([45d3a66](45d3a66))
* remove cdktf from tests
([#277](#277))
([dc9a8e9](dc9a8e9))
* ship Terraform 1.15.8 in the jsii-terraform image
([#367](#367))
([deaa9b0](deaa9b0))
* Upgrade dependencies for lib
([#348](#348))
([d616f17](d616f17))
</details>

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).

Co-authored-by: open-constructs-cdktn[bot] <291052431+open-constructs-cdktn[bot]@users.noreply.github.com>
@github-actions

github-actions Bot commented Aug 8, 2026

Copy link
Copy Markdown
Contributor

I'm going to lock this pull request because it has been closed for 30 days. This helps our maintainers find and focus on the active issues. If you've found a problem that seems related to this change, please open a new issue and complete the issue template so we can capture all the details necessary to investigate further.

@github-actions github-actions Bot locked as resolved and limited conversation to collaborators Aug 8, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants