Skip to main content

Development Guide for Magiclogger

Project Overview​

Magiclogger is a fully typed, high-performance logging library built with TypeScript. This guide provides comprehensive instructions for setting up, developing, and contributing to the project.

Prerequisites​

  • Node.js 22 or later recommended (CI and the docs deploy use Node 22; the docs site needs Node 20 or later)
  • The published library runs on Node.js 16.11 or later, the engines range in package.json: its build keeps class static blocks, which Node parses from 16.11.0. CI's runtime-floor job installs the packed package on that version and loads both entry points, so raise engines with any change that needs a newer Node.
  • pnpm (preferred). Corepack can enable pnpm automatically.
  • TypeScript 5.x

Clone the repository and install dependencies (pnpm preferred for lockfile fidelity and speed):

Installation​

git clone https://github.com/manicinc/magiclogger.git
cd magiclogger
# Enable corepack if not already
corepack enable
pnpm install

Development Workflow​

Available Scripts​

CommandDescription
pnpm devStart development (tsup watch)
pnpm testRun test suite
pnpm test:coverageRun tests with coverage report
pnpm buildBuild ESM + CJS bundles via tsup
pnpm lintRun ESLint on src/tests/examples
pnpm lint:fixAutofix lint issues
pnpm formatFormat with Prettier
pnpm format:checkVerify formatting
pnpm preflightFull validation (format, lint, test, coverage, build, analysis)
npm run devStart development mode with file watching
npm testRun test suite
npm run formatFormat code with Prettier
npm run preflightRun comprehensive pre-release checks
View detailed coverage report with:
pnpm test:coverage

Testing​

CI reports coverage to Codecov on every push to master and every pull request. Test Coverage has the coverage badge and the coverage checks on pull requests.

Branch & Merge Workflow​

master is the only long-lived development branch; gh-pages holds the built documentation site.

Flow:

  1. Create feature/fix branches from master (e.g. feat/browser-export).
  2. Open a pull request into master. CI (lint/tests/build) must pass.
  3. Merging updates the draft release notes (Release Drafter). Releases to npm are made by semantic-release; see Version & Release below.
  4. If a pull request should stay out of the release notes (e.g. docs only), add the label skip-release (optionally also skip-changelog).
  • A dedicated GitHub Action (skip-release-guard.yml) enforces that no version bump or release-style commits occur while this label is present.

Version & Release​

semantic-release makes the releases from .github/workflows/releases.yml: it reads the conventional commits since the last v* tag, tags the new version, publishes it to npm through the package's trusted publisher (no npm token) and creates the GitHub Release. A push to master (or main) whose commit message starts with feat, fix, perf or revert, scoped or not, or with Revert " from git revert, or that carries a BREAKING CHANGE: footer under any type the job does not exclude (chore, docs, style, test, ci and build never start it), starts it; after a merge commit, run it by hand:

gh workflow run releases.yml --ref master

To see what the next release would be without making it, run a dry run on any branch:

gh workflow run releases.yml --ref <branch> -f dry_run=true

The Deployment & Release Guide has the details. A v* tag pushed by hand (for example after scripts/version-bump.cjs) builds the package and creates a GitHub Release; it does not publish to npm. semantic-release takes the highest v* tag as the last release, so push one by hand only for a version already on npm.

Preflight checks before opening a pull request:

pnpm preflight

| LOG_VERBOSE | Enable verbose logging | false | | LOG_DIR | Custom log directory | ./logs |

Recommended TypeScript configuration:

Commit Guidelines​

We use Conventional Commits for semantic versioning:

<type>(<scope>): <description>

[optional body]

[optional footer(s)]

Commit Types​

TypePurposeVersion Impact
featNew featureMinor version bump
fixBug fixPatch version bump
perfPerformance improvementPatch version bump
revertRevert of an earlier commit (also git revert's Revert "...")Patch version bump
docsDocumentation changesNo version change
styleCode formattingNo version change
refactorCode restructuringNo version change
testTest modificationsNo version change
buildBuild system and dependenciesNo version change
ciCI configurationNo version change
choreMaintenance tasksNo version change

Breaking Changes​

Indicate a breaking change with a BREAKING CHANGE: footer. The angular preset in .releaserc does not read a ! after the type, so feat!: ... with no footer releases nothing.

Release Process​

Checking a Release​

See what the next release would be, without publishing, tagging or pushing anything, with a dry run of the Release workflow on your branch:

gh workflow run releases.yml --ref <branch> -f dry_run=true

Preflight Checks​

Before any release, run comprehensive checks:

npm run preflight

This script ensures:

  • Code is formatted
  • Linting passes
  • All tests pass
  • Build succeeds
  • Coverage requirements met

Contributing​

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Run npm run preflight
  5. Submit a pull request

TypeScript Support​

Magiclogger is built 100% in TypeScript, providing:

  • Full type safety
  • Comprehensive type definitions
  • Intelligent type inference
  • Zero runtime type overhead

Recommended TypeScript configuration:

{
"compilerOptions": {
"strict": true,
"esModuleInterop": true,
"moduleResolution": "node",
"declaration": true,
"declarationMap": true
}
}

Documentation Site​

The documentation site uses Docusaurus and is located in the website directory.

Local Development​

cd website
pnpm install
pnpm start # Starts dev server at http://localhost:3000

Building Documentation​

cd website
pnpm build # Creates static build in website/build

Analytics Configuration​

The documentation site includes Google Analytics and Microsoft Clarity for usage tracking.

Analytics are configured via GitHub Secrets only (for security):

  • Go to Settings → Secrets and variables → Actions
  • Add GA_TRACKING_ID (Google Analytics Measurement ID)
  • Add MS_CLARITY_ID (Microsoft Clarity Project ID)

Analytics only work in production deployment via GitHub Actions.

GDPR Compliance​

The site includes a minimal cookie consent banner that:

  • Appears on first visit
  • Blocks analytics until user consent
  • Remembers user preference
  • Styled to match site theme (light/dark mode)

Deploying Documentation​

Documentation automatically deploys to GitHub Pages when pushing to main/master branch. The GitHub Actions workflow uses the repository secrets for analytics.

Local Security/Secret Scanning (Optional)​

We run Trivy secret scanning in CI. You can mirror this locally to catch issues before pushing:

  • macOS: brew install trivy
  • Windows: choco install trivy
  • Docker (no install):
    docker run --rm -v "$PWD":/project -w /project aquasec/trivy:latest fs --scanners secret .

Exit code 1 means potential secrets detected; rotate credentials and purge from history if confirmed.