{"id":39545327,"url":"https://github.com/jmlweb/tooling","last_synced_at":"2026-01-20T17:05:36.789Z","repository":{"id":330903918,"uuid":"1122887634","full_name":"jmlweb/tooling","owner":"jmlweb","description":"Centralized configuration packages for development tools","archived":false,"fork":false,"pushed_at":"2026-01-12T11:01:17.000Z","size":954,"stargazers_count":0,"open_issues_count":12,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-18T15:43:52.452Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://tooling-example-nodejs-javascript.vercel.app","language":"MDX","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jmlweb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-12-25T18:34:21.000Z","updated_at":"2026-01-04T18:45:36.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jmlweb/tooling","commit_stats":null,"previous_names":["jmlweb/tooling"],"tags_count":93,"template":false,"template_full_name":null,"purl":"pkg:github/jmlweb/tooling","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmlweb%2Ftooling","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmlweb%2Ftooling/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmlweb%2Ftooling/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmlweb%2Ftooling/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jmlweb","download_url":"https://codeload.github.com/jmlweb/tooling/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jmlweb%2Ftooling/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28607624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T16:10:39.856Z","status":"ssl_error","status_checked_at":"2026-01-20T16:10:39.493Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-18T06:44:13.886Z","updated_at":"2026-01-20T17:05:36.752Z","avatar_url":"https://github.com/jmlweb.png","language":"MDX","funding_links":[],"categories":[],"sub_categories":[],"readme":"# jmlweb-tooling\n\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)\n[![Turborepo](https://img.shields.io/badge/Built%20with-Turborepo-EF4444.svg)](https://turbo.build/repo)\n[![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18.0.0-339933.svg)](https://nodejs.org/)\n\nCentralized configuration packages for development tools. One source of truth for consistent formatting, linting, and code quality across all projects.\n\n## 📚 Documentation\n\n**[View the full documentation →](https://jmlweb.github.io/tooling/)**\n\nComplete guides, usage examples, and API references for all packages.\n\n## Packages\n\n| Package                                                                   | Description                                                             | Version                                                                      |\n| ------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ---------------------------------------------------------------------------- |\n| **Formatting**                                                            |                                                                         |                                                                              |\n| [`@jmlweb/prettier-config-base`](./packages/prettier-config-base)         | Base Prettier configuration                                             | ![npm](https://img.shields.io/npm/v/@jmlweb/prettier-config-base?label=)     |\n| [`@jmlweb/prettier-config-tailwind`](./packages/prettier-config-tailwind) | Prettier + Tailwind CSS plugin                                          | ![npm](https://img.shields.io/npm/v/@jmlweb/prettier-config-tailwind?label=) |\n| **Linting**                                                               |                                                                         |                                                                              |\n| [`@jmlweb/eslint-config-base`](./packages/eslint-config-base)             | ESLint for TypeScript (strict)                                          | ![npm](https://img.shields.io/npm/v/@jmlweb/eslint-config-base?label=)       |\n| [`@jmlweb/eslint-config-base-js`](./packages/eslint-config-base-js)       | ESLint for JavaScript                                                   | ![npm](https://img.shields.io/npm/v/@jmlweb/eslint-config-base-js?label=)    |\n| [`@jmlweb/eslint-config-react`](./packages/eslint-config-react)           | ESLint for React libraries with TypeScript, extending base config       | ![npm](https://img.shields.io/npm/v/@jmlweb/eslint-config-react?label=)      |\n| **TypeScript**                                                            |                                                                         |                                                                              |\n| [`@jmlweb/tsconfig-base`](./packages/tsconfig-base)                       | Base TypeScript configuration                                           | ![npm](https://img.shields.io/npm/v/@jmlweb/tsconfig-base?label=)            |\n| [`@jmlweb/tsconfig-node`](./packages/tsconfig-node)                       | TypeScript configuration for Node.js and CLI projects                   | ![npm](https://img.shields.io/npm/v/@jmlweb/tsconfig-node?label=)            |\n| [`@jmlweb/tsconfig-react`](./packages/tsconfig-react)                     | TypeScript configuration for React libraries with JSX support           | ![npm](https://img.shields.io/npm/v/@jmlweb/tsconfig-react?label=)           |\n| [`@jmlweb/tsconfig-nextjs`](./packages/tsconfig-nextjs)                   | TypeScript configuration for Next.js applications                       | ![npm](https://img.shields.io/npm/v/@jmlweb/tsconfig-nextjs?label=)          |\n| **Testing**                                                               |                                                                         |                                                                              |\n| [`@jmlweb/vitest-config`](./packages/vitest-config)                       | Base Vitest configuration with TypeScript support and coverage settings | ![npm](https://img.shields.io/npm/v/@jmlweb/vitest-config?label=)            |\n| **Build Tools**                                                           |                                                                         |                                                                              |\n| [`@jmlweb/tsup-config-base`](./packages/tsup-config-base)                 | Base tsup configuration for building TypeScript packages                | ![npm](https://img.shields.io/npm/v/@jmlweb/tsup-config-base?label=)         |\n| [`@jmlweb/vite-config`](./packages/vite-config)                           | Base Vite configuration for frontend projects                           | ![npm](https://img.shields.io/npm/v/@jmlweb/vite-config?label=)              |\n| **Commit Linting**                                                        |                                                                         |                                                                              |\n| [`@jmlweb/commitlint-config`](./packages/commitlint-config)               | Commitlint configuration for Conventional Commits                       | ![npm](https://img.shields.io/npm/v/@jmlweb/commitlint-config?label=)        |\n\n## Quick Start\n\n### Prettier\n\n```bash\npnpm add -D @jmlweb/prettier-config-base prettier\n```\n\n```json\n{\n  \"prettier\": \"@jmlweb/prettier-config-base\"\n}\n```\n\n### ESLint (TypeScript)\n\n```bash\npnpm add -D @jmlweb/eslint-config-base eslint typescript-eslint\n```\n\n```javascript\n// eslint.config.js\nimport baseConfig from '@jmlweb/eslint-config-base';\n\nexport default [...baseConfig];\n```\n\n## Package Hierarchy\n\n```text\nprettier-config-base ─────► prettier-config-tailwind\n                                    │\n                                    └── + Tailwind CSS plugin\n\neslint-config-base-js ────► eslint-config-base ────► eslint-config-react\n                                    │                        │\n                                    └── + TypeScript        └── + React rules\n                                        strict rules\n\ntsconfig-base ────► tsconfig-node\n              │            │\n              │            └── + Node.js types only\n              │                (excludes DOM)\n              │\n              └──► tsconfig-react ────► tsconfig-nextjs\n                            │                    │\n                            └── + JSX            └── + Next.js plugin\n                                support               \u0026 path aliases\n\nStandalone packages (no inheritance):\n├── vitest-config      - Testing configuration\n├── tsup-config-base   - Package bundling\n├── vite-config        - Frontend build tool\n└── commitlint-config  - Commit message linting\n```\n\n## Development\n\n```bash\n# Install dependencies\npnpm install\n\n# Format code\npnpm format\n\n# Run linting\npnpm lint\n\n# Run tests (validates all packages)\npnpm test\n\n# Validate everything (format + lint + syncpack)\npnpm validate\n\n# Check dependency version consistency\npnpm syncpack:check\n\n# Fix dependency version mismatches\npnpm syncpack:fix\n```\n\n## Examples\n\nSee [`apps/`](./apps) directory for test applications and real-world usage examples. The [`apps/README.md`](./apps/README.md) provides detailed documentation for:\n\n- **Test App** - Validates all configuration packages work correctly\n- **Node.js TypeScript API** - Express.js API with TypeScript, ESLint, Prettier, and Vitest\n- **React TypeScript App** - React app with Tailwind CSS, TypeScript, ESLint, and Vitest\n- **Node.js JavaScript** - Pure JavaScript Express.js API with ESLint and Prettier\n\nEach example includes complete setup instructions and demonstrates best practices for using the packages.\n\n## Node.js Compatibility\n\nDifferent packages in this monorepo have different Node.js version requirements. Most packages work with Node.js \u003e= 18.0.0, while some TypeScript ESLint configurations require Node.js \u003e= 20.11.0 due to the use of `import.meta.dirname`, which was introduced in Node.js 20.11.0.\n\n### Compatibility Matrix\n\n| Package                            | Node.js Requirement | Reason                                      |\n| ---------------------------------- | ------------------- | ------------------------------------------- |\n| `@jmlweb/prettier-config-base`     | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/prettier-config-tailwind` | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/eslint-config-base-js`    | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/eslint-config-base`       | \u003e= 20.11.0          | Uses `import.meta.dirname` for config files |\n| `@jmlweb/eslint-config-react`      | \u003e= 20.11.0          | Uses `import.meta.dirname` for config files |\n| `@jmlweb/vitest-config`            | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/tsconfig-base`            | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/tsconfig-node`            | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/tsconfig-react`           | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/tsconfig-nextjs`          | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/tsup-config-base`         | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/vite-config`              | \u003e= 18.0.0           | Standard compatibility                      |\n| `@jmlweb/commitlint-config`        | \u003e= 18.0.0           | Standard compatibility                      |\n\n### Why Different Requirements?\n\n**Node.js \u003e= 18.0.0 (Most Packages)**\n\n- Most packages use standard JavaScript/TypeScript features available in Node.js 18.0.0\n- These packages are compatible with all Node.js LTS versions\n\n**Node.js \u003e= 20.11.0 (TypeScript ESLint Configs)**\n\n- `@jmlweb/eslint-config-base` and `@jmlweb/eslint-config-react` require Node.js \u003e= 20.11.0\n- These packages use `import.meta.dirname` in their configuration files, which was introduced in Node.js 20.11.0\n- This feature enables better path resolution for ESLint configuration files in the flat config format\n\n### Choosing the Right Node.js Version\n\n- **If you're using TypeScript ESLint configs** (`@jmlweb/eslint-config-base` or `@jmlweb/eslint-config-react`):\n  - Use **Node.js \u003e= 20.11.0**\n  - Recommended: Use the latest Node.js LTS version\n\n- **If you're only using other packages** (Prettier, Vitest, or TypeScript configs):\n  - Use **Node.js \u003e= 18.0.0**\n  - Recommended: Use Node.js 18 LTS or later for security updates\n\n### Checking Your Node.js Version\n\n```bash\nnode --version\n```\n\nTo install or update Node.js, visit [nodejs.org](https://nodejs.org/) or use a version manager like [nvm](https://github.com/nvm-sh/nvm) or [fnm](https://github.com/Schniz/fnm).\n\n## Requirements\n\n- **Node.js** \u003e= 18.0.0 (see [Node.js Compatibility](#nodejs-compatibility) for package-specific requirements)\n- **ESLint** \u003e= 9.0.0 (flat config format, required for ESLint config packages)\n- **Prettier** \u003e= 3.0.0 (required for Prettier config packages)\n\n## Dependency Version Consistency\n\nThis project uses [syncpack](https://jamiemason.github.io/syncpack/) to ensure consistent dependency versions across all packages in the monorepo.\n\n### Available Commands\n\n```bash\n# Check for version mismatches (included in `validate`)\npnpm syncpack:check\n\n# Fix version mismatches automatically\npnpm syncpack:fix\n```\n\n### Configuration\n\nThe syncpack configuration (`.syncpackrc.json`) enforces:\n\n- **Version consistency**: All dev and prod dependencies use the same version across packages\n- **Semver ranges**: All dependencies use caret (`^`) ranges for flexibility\n- **Formatting**: Package.json files are sorted consistently\n\nPeer dependencies are intentionally excluded from version matching since they specify broader compatibility ranges.\n\n### CI Integration\n\nSyncpack checks run automatically in the CI pipeline. PRs with version mismatches will fail the `validate` job.\n\n## Dependency Updates\n\nThis project uses [Dependabot](https://docs.github.com/en/code-security/dependabot) to automatically keep dependencies up to date.\n\n### Update Policies\n\n- **Patch and Minor Updates**: Dependabot creates pull requests for patch and minor version updates automatically. These can typically be merged after CI passes.\n- **Major Updates**: Major version updates are ignored by default and require manual review. To update a dependency to a major version:\n  1. Manually create a PR with the update\n  2. Review breaking changes in the dependency's changelog\n  3. Test thoroughly before merging\n\n### Update Schedule\n\n- **Weekly**: Dependabot checks for updates every Monday at 9:00 AM\n- **GitHub Actions**: Updates for GitHub Actions workflows are checked weekly as well\n\n### Handling Update PRs\n\n1. **Review the PR**: Check what changed and why\n2. **Verify CI**: Ensure all CI checks pass\n3. **Test Locally** (if needed): For significant updates, test locally\n4. **Merge**: Merge when ready, using a conventional commit message if squashing\n\n### Auto-merge (Optional)\n\nYou can enable auto-merge for patch/minor updates in GitHub repository settings:\n\n- Go to Settings → General → Pull Requests\n- Enable \"Allow auto-merge\"\n- Configure auto-merge rules for Dependabot PRs\n\nMajor version updates should always be reviewed manually.\n\n## Support\n\n### Getting Help\n\n- **Bug Reports**: [Open an issue](https://github.com/jmlweb/tooling/issues/new?labels=bug) with detailed reproduction steps\n- **Feature Requests**: [Open an issue](https://github.com/jmlweb/tooling/issues/new?labels=enhancement) with your use case\n- **Questions**: [Open an issue](https://github.com/jmlweb/tooling/issues/new?labels=question) or check existing issues\n\n### Response Times\n\nThis is an open-source project maintained in spare time. While we aim to respond to issues promptly, response times may vary. Critical bugs are prioritized.\n\n## Package Analytics\n\nTrack package usage and health through npm statistics:\n\n### Download Statistics\n\n| Package                            | Weekly Downloads                                                                               | Total Downloads                                                                         |\n| ---------------------------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- |\n| `@jmlweb/prettier-config-base`     | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/prettier-config-base?label=)     | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/prettier-config-base?label=)     |\n| `@jmlweb/prettier-config-tailwind` | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/prettier-config-tailwind?label=) | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/prettier-config-tailwind?label=) |\n| `@jmlweb/eslint-config-base-js`    | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/eslint-config-base-js?label=)    | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/eslint-config-base-js?label=)    |\n| `@jmlweb/eslint-config-base`       | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/eslint-config-base?label=)       | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/eslint-config-base?label=)       |\n| `@jmlweb/eslint-config-react`      | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/eslint-config-react?label=)      | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/eslint-config-react?label=)      |\n| `@jmlweb/tsconfig-base`            | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/tsconfig-base?label=)            | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/tsconfig-base?label=)            |\n| `@jmlweb/tsconfig-node`            | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/tsconfig-node?label=)            | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/tsconfig-node?label=)            |\n| `@jmlweb/tsconfig-react`           | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/tsconfig-react?label=)           | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/tsconfig-react?label=)           |\n| `@jmlweb/tsconfig-nextjs`          | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/tsconfig-nextjs?label=)          | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/tsconfig-nextjs?label=)          |\n| `@jmlweb/vitest-config`            | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/vitest-config?label=)            | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/vitest-config?label=)            |\n| `@jmlweb/tsup-config-base`         | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/tsup-config-base?label=)         | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/tsup-config-base?label=)         |\n| `@jmlweb/vite-config`              | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/vite-config?label=)              | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/vite-config?label=)              |\n| `@jmlweb/commitlint-config`        | ![npm weekly downloads](https://img.shields.io/npm/dw/@jmlweb/commitlint-config?label=)        | ![npm downloads](https://img.shields.io/npm/dt/@jmlweb/commitlint-config?label=)        |\n\n### Viewing Detailed Statistics\n\n- **npm Stats**: Visit [npmjs.com/package/@jmlweb/PACKAGE_NAME](https://www.npmjs.com/package/@jmlweb/prettier-config-base) (replace with package name)\n- **npm-stat**: Visit [npm-stat.com](https://npm-stat.com/charts.html?package=@jmlweb/prettier-config-base) for historical download charts\n\n## Security\n\n### Vulnerability Monitoring\n\nThis project uses multiple layers of security monitoring:\n\n1. **Dependabot**: Automatically monitors dependencies for known vulnerabilities and creates PRs to update affected packages (see [Dependency Updates](#dependency-updates))\n\n2. **pnpm audit**: Run locally to check for vulnerabilities:\n\n   ```bash\n   pnpm audit\n   ```\n\n3. **GitHub Security Advisories**: Security alerts are enabled on this repository\n\n### Reporting Security Issues\n\nIf you discover a security vulnerability:\n\n1. **Do not** open a public issue\n2. Email the maintainer directly or use GitHub's private vulnerability reporting\n3. Include a detailed description and reproduction steps\n\n## Contributing\n\nContributions are welcome! This project thrives on community involvement, whether you're fixing bugs, proposing features, improving documentation, or helping others.\n\n### Ways to Contribute\n\n- **🐛 Report Bugs**: [Open a bug report](https://github.com/jmlweb/tooling/issues/new?labels=bug) with detailed reproduction steps\n- **💡 Request Features**: [Open a feature request](https://github.com/jmlweb/tooling/issues/new?labels=enhancement) describing your use case\n- **📖 Improve Documentation**: [Open a documentation issue](https://github.com/jmlweb/tooling/issues/new?labels=documentation) or submit a PR\n- **🔧 Submit Pull Requests**: [View open PRs](https://github.com/jmlweb/tooling/pulls) or create your own\n\n### Getting Started\n\n1. **Fork the repository** and clone your fork\n2. **Install dependencies**: `pnpm install`\n3. **Create a branch**: `git checkout -b feature/your-feature-name`\n4. **Make your changes** following our [development guidelines](#development)\n5. **Test your changes**: `pnpm validate` (runs format, lint, and tests)\n6. **Commit your changes** using [Conventional Commits](https://www.conventionalcommits.org/)\n7. **Push to your fork** and submit a pull request\n\n### Pull Request Guidelines\n\n- **Clear description**: Explain what changes you made and why\n- **Reference issues**: Link related issues with `Fixes #123` or `Relates to #456`\n- **Follow conventions**: Use Conventional Commits format for commit messages\n- **Ensure CI passes**: All tests, linting, and format checks must pass\n- **Keep it focused**: One feature or fix per PR when possible\n- **Update documentation**: If your changes affect usage, update relevant READMEs\n\n### Development Workflow\n\nSee the [Development](#development) section for available commands. Key commands:\n\n```bash\npnpm validate    # Run all checks (format, lint, syncpack)\npnpm format      # Format code with Prettier\npnpm lint        # Run ESLint checks\npnpm test        # Run all tests\n```\n\n### Questions or Need Help?\n\n- Browse [existing issues](https://github.com/jmlweb/tooling/issues) to see if your question has been answered\n- [Open a question issue](https://github.com/jmlweb/tooling/issues/new?labels=question) for support\n\nThis is an open-source project maintained in spare time. We appreciate your patience and understanding.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmlweb%2Ftooling","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjmlweb%2Ftooling","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjmlweb%2Ftooling/lists"}