Skip to content

feat!: modernize tooling - esbuild, npm workspaces, git-cliff, strict TS, node24#86

Merged
bryantbiggs merged 21 commits intomainfrom
chore/modernize-tooling
Mar 6, 2026
Merged

feat!: modernize tooling - esbuild, npm workspaces, git-cliff, strict TS, node24#86
bryantbiggs merged 21 commits intomainfrom
chore/modernize-tooling

Conversation

@bryantbiggs
Copy link
Copy Markdown
Member

@bryantbiggs bryantbiggs commented Mar 6, 2026

Summary

BREAKING CHANGE: Action runtime updated from node20 to node24. Users on older GitHub Actions runner versions may need to update.

Tooling Migration

  • Replace yarn/lerna with npm workspaces for monorepo management
  • Replace @vercel/ncc with esbuild for bundling (single file output, 10-100x faster, native ESM support)
  • Replace semantic-release/lerna versioning with git-cliff + GitHub Releases
  • Add vitest with unit tests for all 4 actions + awscli-core (17 tests across 5 test files)

TypeScript & Config

  • Enable TypeScript strict mode and fix all type errors (proper error narrowing, safe null handling)
  • Add tsc --noEmit type checking to the build pipeline
  • Modernize tsconfig.json, eslint flat config
  • Update action runtimes from node20 to node24

Bug Fixes

  • Fix AWS CLI install logic (resolves Error on Github action #7): run ./aws/install on Linux and use .pkg installer on macOS instead of just extracting the zip
  • Add arm64 support for Linux AWS CLI downloads
  • Remove destructive rmdir of C:/Program Files/Amazon on Windows in get()
  • Fix version() parsing to return actual CLI version (2.15.0) instead of Python/3.11.6
  • Mask AWS credentials as secrets to prevent leaking in logs
  • Fix DurationSeconds typo in STS AssumeRoleCommand params (was DurationSecond)
  • Fix NaN duration when duration-seconds input is empty
  • Fix maskAccountId logic to respect explicit false value
  • Move assume-role params into conditional block, omit empty ExternalId
  • Fix s3_sync to throw on non-directory path instead of logging and continuing
  • Default callerReference to ISO timestamp when not provided
  • Fix callStdout to preserve caller's listeners instead of silently dropping them
  • Use token input for action-gh-release (compatible with persist-credentials: false)

CI/CD

  • Add verify-build shared workflow (lint, typecheck, test, build, dist check) triggered by all action changes
  • Add PR triggers, pinned action SHAs, permissions, and concurrency to all workflows
  • Modernize iam_access_credentials workflow (rename .yaml.yml, add PR triggers, pinned actions)
  • Add git-cliff release workflow with empty changelog guard
  • Include packages/*/dist/ in verify-build dist check

Cleanup

  • Remove stale CHANGELOGs, commitlint, lerna config, yarn.lock
  • Remove dead workspace test scripts
  • Clean up .gitignore and .gitattributes
  • Update README to reference npm workspaces, fix workflow badge URLs
  • Rename dependabot.yaml → .yml

Test plan

  • npx tsc --noEmit passes (strict mode)
  • npm run lint passes
  • npm run test passes (17 tests across 5 test files)
  • npm run all succeeds (lint → typecheck → test → compile)
  • CI workflows run successfully

Closes #7

- Fix ESM compatibility: awscli-core now compiles as ESM (module: nodenext)
  to work with @actions/* v3 ESM-only packages
- Use ncc transpile-only mode (-t) to avoid ts-loader/webpack conflicts
- Rebuild all dist bundles
- Update action runtime from node20 to node24 (node22 is not a valid
  GitHub Actions runtime)
- Add --passWithNoTests to vitest so CI doesn't fail when no tests exist
…workflows

BREAKING CHANGE: Action runtime updated from node20 to node24

- Replace @vercel/ncc with esbuild for bundling (single file output,
  10-100x faster, native ESM support)
- Add unit tests for all 4 actions (vitest)
- Extract verify-build into shared workflow triggered by all action changes
- Modernize iam_access_credentials workflow (rename .yaml→.yml, add PR
  triggers, pinned actions, permissions, concurrency)
- Remove awscli-core ESM workaround (no longer needed with esbuild)
@bryantbiggs bryantbiggs changed the title chore: modernize tooling - npm workspaces, git-cliff, strict TS, node22 feat!: modernize tooling - esbuild, npm workspaces, git-cliff, strict TS, node24 Mar 6, 2026
…remaining gaps

- Remove awscli-core lib/ build step — esbuild bundles directly from
  TypeScript source, eliminating the intermediate tsc compilation
- Remove awscli-core tsconfig.json and lib/ output (no longer needed)
- Simplify npm scripts: remove build step from all script, remove
  --passWithNoTests (tests exist now)
- Add awscli-core unit tests (3 tests)
- Expand awscli and s3_sync tests with happy path coverage (11 total)
- Add vitest.config.ts with coverage configuration
- Modernize stale-actions workflow: rename .yaml→.yml, pin SHA, add
  permissions block, remove deprecated repo-token
- Update .gitattributes and verify-build to remove lib/ references
…ndling

- Add `tsc --noEmit` typecheck step to `npm run all` pipeline
- Fix README workflow badge URLs to match renamed workflows
- Replace non-null assertions with proper guards in iam_access_credentials
- Replace fragile `setTimeout` test pattern with direct `run()` calls
- Remove dead `test` scripts from workspace package.json files
- Add empty changelog guard to release workflow
…le bugs

- Fix awscli-core install to run ./aws/install on Linux and use .pkg on macOS
- Add arm64 support for Linux AWS CLI downloads
- Remove destructive rmdir of C:/Program Files/Amazon on Windows
- Fix version() parsing to return actual CLI version
- Mask AWS credentials as secrets to prevent log leaks
- Fix DurationSeconds typo in STS AssumeRoleCommand params
- Fix NaN duration when input is empty
- Fix maskAccountId logic to respect explicit false
- Move assume-role params into conditional block, omit empty ExternalId
- Fix s3_sync to throw on non-directory instead of logging and continuing
- Default callerReference to ISO timestamp when not provided
- Fix callStdout to preserve caller's listeners
- Use token input for action-gh-release with persist-credentials: false
- Add packages/*/dist/ to verify-build check
- Expand test coverage for assume-role, credential masking, and edge cases
exec.exec() splits the command string on spaces via argStringToArray,
so paths like C:\Program Files\Amazon\AWSCLIV2\aws.exe get split
into ['C:\Program', 'Files\...']. Quote the path when it contains
spaces to prevent this.
@bryantbiggs bryantbiggs merged commit 21fd07f into main Mar 6, 2026
15 checks passed
@bryantbiggs bryantbiggs deleted the chore/modernize-tooling branch March 6, 2026 21:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Error on Github action

1 participant