* chore(release): adopt Lerna 5 with GitHub Releases and add v8 breaking-change docs
- Bump root lerna devDependency 3.13.3 -> 5.6.2 (matches ionic-framework)
- publish:ci passes --create-release github so Lerna creates a GitHub Release
per published tag; cd.yml provides GH_TOKEN (built-in token, contents: write)
- Add BREAKING.md (+ BREAKING_ARCHIVE/ convention) seeding the v8 removed-command log
- Add .github/RELEASING.md major-release runbook
* fix(cli): make build, lint, and tests run on Windows and macOS
Pre-existing cross-platform issues surfaced while validating the Lerna 5
upgrade; none are caused by the release tooling:
- discover: pin netmask 2.0.2 and @types/netmask 2.0.5 — the untracked
dependency tree had drifted to netmask 2.1.x, whose bundled types declare
'broadcast: string | undefined' and broke the build (TS2322)
- replace the Unix-only 'lint': 'true' no-op with cross-platform 'exit 0' in
all packages ('true' is not a cmd.exe builtin, so npm run lint failed on Windows)
- angular/cordova tests: normalize path separators in assertions and return the
floating expect().resolves promises (fixes Windows path failures and the
resulting jest-worker 'Call retries were exceeded' crash)
* docs(release): correct publish:testing guidance in runbook
publish:testing is NOT a dry run — lerna publish runs npm publish (testing
dist-tag); --no-push only suppresses git. It also only runs from 'stable' due
to the allowBranch guard. Replace the §4 'dry run' step with a safe,
non-publishing 'lerna version --no-push --no-git-tag-version --allow-branch'
smoke test, and document the bump-from-commits behavior.
* ci: pin actions to commit SHAs and bump to latest
Security-harden workflows by pinning actions to immutable commit SHAs
(version in trailing comment), and update from v3:
- actions/checkout v3 -> v6.0.3
- actions/setup-node v3 -> v6.4.0
- actions/cache v3 -> v5.0.5 (v3 cache backend was retired by GitHub)
* chore(deps): upgrade to TypeScript 5.9.3 and jest 29
Upgrade the TypeScript toolchain across all packages:
- typescript ~4.8.0 -> ~5.9.3
- ts-jest ~26.3.0 -> ^29.4.11
- jest/jest-cli ^26.x -> ^29.7.0 (stays on 29 to keep Node 16 support)
- @types/jest ^26.x -> ^29.5.14
- @types/node ~16.0.0 -> ^16.18.126 (16.0.3 conflicted with TS 5.9 libs)
- tslib ^2.0.1 -> ^2.8.1
Required code/config changes:
- jest.config.base.js: migrate ts-jest globals -> transform API, tsConfig -> tsconfig, explicit testEnvironment: node
- utils-array reduce(): annotate accumulator T|U + cast awaited result (TS 5.9 Awaited/NonNullable inference)
- tests: drop async from async-done callbacks (utils-fs), convert to async()+expect.assertions (utils-subprocess), spyOn().and.callFake -> jest.spyOn().mockImplementation (utils-network), legacyFakeTimers for timer-mock assertions (cli-framework-output)
Validated: build + lint + full test suite green.
* docs(release): make the runbook smoke-test command cross-shell
The step-4 lerna version command used a bash-only backslash continuation and
$(git branch --show-current), which fail in PowerShell/cmd. Use a single-line
command with --allow-branch "*" (quoted so bash doesn't glob-expand it) so it
runs identically in PowerShell, cmd, bash, and zsh. Also scope the cleanup to
'git checkout -- packages' so it only discards lerna's version writes.
* Update .github/RELEASING.md
Co-authored-by: Shane <shane@shanessite.net>
* fix(discover): let netmask float and handle nullable broadcast
netmask was pinned to an exact 2.0.2 to dodge a TS2322 build break. The
break originates from netmask >= 2.1, which ships its own bundled type
declarations (broadcast: string | undefined) that shadow @types/netmask
entirely — so pinning @types/netmask alone does not fix it.
Instead, restore the caret (^2.0.2) so the runtime can receive 2.x
patches, drop the now-shadowed @types/netmask dev dependency, and handle
the nullable broadcast in computeBroadcastAddress (broadcast is absent
for /31 and /32 blocks; fall back to the network address).
Validated: discover build + tests green with netmask 2.1.1.
* docs(release): refresh Node guidance for the jest 29 toolchain
The pre-publish validation note referenced a "bundled jest 26 worker"
caveat that is stale on this branch (it ships jest 29). jest 29 supports
newer Node than 26 did, so drop the caveat and state the validated
matrix: Node 18 to match CI, with the suite also green on Node 16 and 24.
* ci: block publishing BREAKING.md with unfilled <TODO placeholders
The v8 BREAKING.md entries are seeded placeholders that each removal PR
fills in. Add a guard to the stable publish pipeline that fails if any
<TODO marker remains, so the "each removal PR fills it in" contract is
enforced rather than risking placeholders shipping to users at 8.0.0.
* docs: add pull request template
Mirror the Ionic Framework PR template so contributors get a consistent
structure: issue reference, current/new behavior, a breaking-change
checkbox with migration guidance, and an other-information section. The
breaking-change note points at this repo's BREAKING.md and the
Conventional Commits footer format used by the publish pipeline.
* Update .github/RELEASING.md
Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com>
* Update .github/RELEASING.md
Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com>
* feat!: require Node >= 18
Enforce the supported runtime through package.json rather than leaving it
to documentation. Set engines.node to ">=18.0.0" across the monorepo: the
root workspace, every published @ionic/* package, and the previously unset
@ionic/discover and cli-scripts manifests.
Align the rest of the toolchain with the new baseline — drop Node 16.x
from the CI matrix (now 18.x and 20.x) and update the release runbook so
the recommended and minimum Node versions no longer disagree.
BREAKING CHANGE: Node 16 is no longer supported. The Ionic CLI and its
@ionic/* packages now require Node 18 or newer.
* docs(release): correct the discover drift-guard note
The step-3 drift guard still described the old netmask@2.0.2 +
@types/netmask@2.0.5 pins. That approach was replaced: netmask floats at
^2.0.2 (resolving to 2.1.x) using its own bundled types, @types/netmask
was dropped, and computeBroadcastAddress handles the nullable broadcast.
Update the note to match.
* docs(release): point to source files for Node versions
Stop hardcoding specific Node versions in the runbook. Reference the
authoritative sources instead — `engines.node` in package.json for the
minimum and the `node:` matrix in ci.yml (plus `node-version` in cd.yml)
for the versions CI exercises — so the doc stays correct when CI's Node
versions change without a separate edit.
---------
Co-authored-by: Shane <shane@shanessite.net>
Co-authored-by: Maria Hutt <thetaPC@users.noreply.github.com>