diff --git a/.agentready-config.yaml b/.agentready-config.yaml new file mode 100644 index 0000000..6d1f74d --- /dev/null +++ b/.agentready-config.yaml @@ -0,0 +1,14 @@ +# AgentReady — https://github.com/ambient-code/agentready +# Run from repo root: +# agentready assess -c .agentready-config.yaml . +# +# cyclomatic_complexity is implemented via the Python CLI "lizard". This +# package is Node/TypeScript-only; without lizard on PATH the check shows as +# skipped. Complexity is still limited by ESLint and code review. To inspect +# locally: pip install lizard && lizard src +# +# standard_layout expects a root tests/ or test/ directory. This repo keeps +# Jest suites under src/__tests__/ by decision — see docs/adr/0002-tests-under-src-instead-of-root-tests.md +excluded_attributes: + - cyclomatic_complexity + - standard_layout diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..0c3eefe --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,56 @@ +name: Bug report +description: Report unexpected CLI behavior or a defect +body: + - type: markdown + attributes: + value: | + Thanks for the report. Include enough detail that we can reproduce the problem. + + - type: textarea + id: summary + attributes: + label: Summary + description: Short description of the bug. + validations: + required: true + + - type: textarea + id: expected + attributes: + label: Expected behavior + validations: + required: true + + - type: textarea + id: actual + attributes: + label: Actual behavior + validations: + required: true + + - type: textarea + id: reproduce + attributes: + label: Steps to reproduce + description: Commands you ran, flags, template names, OS, Node/npm versions. + placeholder: | + 1. … + 2. … + validations: + required: true + + - type: input + id: version + attributes: + label: patternfly-cli version + description: Output of `patternfly-cli --version` or the npm package version. + validations: + required: false + + - type: textarea + id: context + attributes: + label: Additional context + description: Logs, screenshots, or links if helpful. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..3de14cc --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: PatternFly documentation + url: https://www.patternfly.org/ + about: Design system and product documentation + - name: PatternFly React + url: https://github.com/patternfly/patternfly-react + about: PatternFly React component library diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..c1e4c1f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,37 @@ +name: Feature request +description: Suggest a new command, flag, or improvement +body: + - type: markdown + attributes: + value: | + Describe the problem you are solving and how this CLI could help. + + - type: textarea + id: problem + attributes: + label: Problem / use case + description: What workflow or limitation led to this request? + validations: + required: true + + - type: textarea + id: proposal + attributes: + label: Proposed solution + description: Commands, UX, or behavior you have in mind. + validations: + required: true + + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + validations: + required: false + + - type: textarea + id: context + attributes: + label: Additional context + validations: + required: false diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..92cf72e --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,13 @@ +## What / why + + + +## How to test + + + +## Checklist + +- [ ] Tests added or updated where appropriate +- [ ] `npm run lint` and `npm test` pass locally +- [ ] Commit messages follow [Conventional Commits](https://www.conventionalcommits.org/) (required for semantic-release), e.g. `feat:`, `fix:`, `docs:`, `chore:` diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 024f934..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: Build - -on: - push: - branches: [main, master] - pull_request: - branches: [main, master] - -jobs: - build: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - - run: npm ci - - run: npm run build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..d1c9464 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,51 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + quality-gates: + name: Lint, build, and test + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Lint + run: npm run lint + + - name: Build + run: npm run build + + - name: Test + run: npm test + + commitlint: + name: Conventional Commits + runs-on: ubuntu-latest + if: github.event_name == 'pull_request' + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: actions/setup-node@v4 + with: + node-version: '22' + cache: 'npm' + + - name: Install dependencies + run: npm ci + + - name: Validate commit messages + run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index 9bdc4c4..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Lint - -on: - workflow_run: - workflows: [Build] - types: [completed] - branches: [main, master] - -jobs: - lint: - runs-on: ubuntu-latest - if: github.event.workflow_run.conclusion == 'success' - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.workflow_run.head_sha }} - - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - - run: npm ci - - run: npm run lint diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index df3dc8a..3afd959 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,10 +29,13 @@ jobs: - name: Install dependencies run: npm ci + - name: Lint + run: npm run lint + - name: Build run: npm run build - - name: Run tests + - name: Test run: npm test - name: Release diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index e3539ae..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Test - -on: - workflow_run: - workflows: [Build] - types: [completed] - branches: [main, master] - -jobs: - test: - runs-on: ubuntu-latest - if: github.event.workflow_run.conclusion == 'success' - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.workflow_run.head_sha }} - - - uses: actions/setup-node@v4 - with: - node-version: '22' - cache: 'npm' - - - run: npm ci - - run: npm test diff --git a/.gitignore b/.gitignore index 9a5aced..056da86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,131 +1,44 @@ -# Logs -logs +# Dependencies +node_modules/ + +# Build output (tsc → dist/) +dist/ + +# Test & coverage +coverage/ +*.lcov +.nyc_output/ +junit.xml + +# Logs & diagnostics +logs/ *.log npm-debug.log* yarn-debug.log* yarn-error.log* +pnpm-debug.log* lerna-debug.log* - -# Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage -*.lcov - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (https://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Snowpack dependency directory (https://snowpack.dev/) -web_modules/ - -# TypeScript cache -*.tsbuildinfo +# Environment (keep tracked examples if you add them) +.env +.env.* +!.env.example -# Optional npm cache directory +# Caches & temp .npm - -# Optional eslint cache .eslintcache - -# Optional stylelint cache .stylelintcache +*.tsbuildinfo +.cache/ +.parcel-cache/ +.temp/ +tmp/ +temp/ -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' +# Package manager *.tgz - -# Yarn Integrity file .yarn-integrity - -# dotenv environment variable files -.env -.env.* -!.env.example - -# parcel-bundler cache (https://parceljs.org/) -.cache -.parcel-cache - -# Next.js build output -.next -out - -# Nuxt.js build / generate output -.nuxt -dist - -# Gatsby files -.cache/ -# Comment in the public line in if your project uses Gatsby and not Next.js -# https://nextjs.org/blog/next-9-1#public-directory-support -# public - -# vuepress build output -.vuepress/dist - -# vuepress v2.x temp and cache directory -.temp -.cache - -# Sveltekit cache directory -.svelte-kit/ - -# vitepress build output -**/.vitepress/dist - -# vitepress cache directory -**/.vitepress/cache - -# Docusaurus cache and generated files -.docusaurus - -# Serverless directories -.serverless/ - -# FuseBox cache -.fusebox/ - -# DynamoDB Local files -.dynamodb/ - -# Firebase cache directory -.firebase/ - -# TernJS port file -.tern-port - -# Stores VSCode versions used for testing VSCode extensions -.vscode-test - -# yarn v3 .pnp.* .yarn/* !.yarn/patches @@ -134,6 +47,44 @@ dist !.yarn/sdks !.yarn/versions -# Vite logs files -vite.config.js.timestamp-* -vite.config.ts.timestamp-* +# Optional tooling / local reports +.agentready/ +.repomix-output/ + +# OS +.DS_Store +Thumbs.db + +# Editors / IDEs +.idea/ +*.swp +*.swo +*~ +.project +.classpath +.settings/ +*.sublime-project +*.sublime-workspace + +# VS Code — machine-specific (uncomment if nothing in .vscode/ should be shared) +# .vscode/ + +# Legacy / unused for this repo (harmless if present) +pids/ +*.pid +*.seed +*.pid.lock +lib-cov/ +.grunt/ +bower_components/ +.lock-wscript +build/Release/ +jspm_packages/ +web_modules/ +.node_repl_history +.tern-port +.vscode-test/ +.serverless/ +.fusebox/ +.dynamodb/ +.firebase/ diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..88fd9b6 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +npx --no commitlint --edit "$1" diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..f131ec3 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,120 @@ +# Agent context: PatternFly CLI + +This repository is **`@patternfly/patternfly-cli`**: a Node.js CLI for scaffolding projects from git templates, git/GitHub helpers, and GitHub Pages deploy. Published binaries: `patternfly-cli` and `pfcli`. + +## Tech stack + +- **Runtime**: Node.js 20–24 (CI uses 22). +- **Language**: TypeScript, **ES modules** (`"type": "module"`). Source uses `.js` extensions in import paths (Node ESM). +- **CLI**: [Commander](https://github.com/tj/commander.js). +- **Process / git**: [execa](https://github.com/sindresorhus/execa), [fs-extra](https://github.com/jprichardson/node-fs-extra), [inquirer](https://github.com/SBoudrias/Inquirer.js). +- **Tests**: Jest + ts-jest; tests live under `src/__tests__/**/*.test.ts`. +- **Lint**: ESLint flat config — `eslint.config.js`, scope `src/`. + +## Repository layout + +| Path | Role | +|------|------| +| `src/cli.ts` | **Main entry** — Commander wiring only; see [ADR 0001](docs/adr/0001-cli-entrypoint-and-command-modules.md) | +| `src/create.ts`, `src/save.ts`, `src/load.ts`, … | **Command modules** — one file per command’s implementation | +| `src/templates.ts`, `src/template-loader.ts` | Built-in templates and merge with `--template-file` | +| `src/github.ts`, `src/gh-pages.ts`, `src/git-user-config.ts` | GitHub / git / Pages | +| `src/__tests__/` | Jest tests and fixtures — **not** a root `tests/` folder; see [ADR 0002](docs/adr/0002-tests-under-src-instead-of-root-tests.md) | +| `dist/` | **Build output** — do not hand-edit; produced by `tsc` | +| `scripts/install.sh`, `scripts/uninstall.sh` | User-facing install helpers (not part of npm package build) | + +## Pattern references + +`src/cli.ts` is only the **entry point**; each command’s logic lives in a **separate** module. When adding or changing behavior, **follow the pattern** in these files instead of growing `cli.ts`: + +- **New or changed “create from template” flow** — follow the pattern in `src/create.ts`; register the command in `src/cli.ts` only. +- **Commit / push workflow** — see `src/save.ts` for how the command delegates to git and GitHub helpers. +- **Pull / sync workflow** — see `src/load.ts` for the same style of orchestration and error handling. +- **GitHub Pages deploy** — see `src/gh-pages.ts` for a reference implementation that wraps side-effectful steps. +- **Init / repo creation prompts** — use `src/github.ts` and `src/git-user-config.ts` as templates for interactive git and GitHub flows. + +Use `src/create.ts` as a **reference implementation** when you need a full example of a `run*` export wired from `cli.ts`. + +## Commands (local development) + +From the repo root: + +```bash +npm ci # preferred in CI / clean installs +npm install # local dev + +npm run build # compile TypeScript → dist/ +npm test # Jest +npm run lint # ESLint on src/ +npm run lint:fix +``` + +### Single-file verification + +After changing a source or test file, you can verify **just that file** (plus what ESLint’s type-aware project service needs) without scanning the whole tree for lint, and run **one** test file when relevant: + +```bash +# Lint one module (paths after `--`) +npm run lint:file -- src/create.ts + +# Types for the whole program graph (tsc does not support true one-file compile in this repo) +npm run typecheck + +# One Jest file +npm run test:file -- src/__tests__/create.test.ts +``` + +Use **`lint:file` + `test:file`** when you touched implementation and its test; use **`typecheck`** when you need a full TypeScript check without writing `dist/`. + +Run the built CLI without global install: + +```bash +npm run build && node dist/cli.js --help +``` + +Release tooling: **semantic-release** with **Conventional Commits** (see README “Releasing”). Dry run: `npx semantic-release --dry-run`. + +### Commits + +- **Commitlint** (`commitlint.config.mjs`) uses `@commitlint/config-conventional`. After `npm install`, **Husky** runs `commitlint` on `commit-msg` so invalid messages are blocked locally. +- On **pull requests**, CI runs `commitlint` over the commit range against the base branch. + +## CI + +- **CI** (`ci.yml`): on push and pull request to `main` — **lint**, **build**, **test** after `npm ci`; on pull requests only, a **Conventional Commits** job validates commit messages. +- **Release** (`release.yml`): on push to `main` — `npm ci`, lint, build, test, then semantic-release. + +## GitHub templates + +Issue forms live under **`.github/ISSUE_TEMPLATE/`**; the default PR template is **`.github/pull_request_template.md`**. + +## AgentReady and cyclomatic complexity + +**Cyclomatic complexity** is a rough count of independent paths through a function (branches, loops, `catch`, `?:`, etc.). Higher numbers usually mean code is harder to test and to reason about; many teams keep functions small and shallow to stay under common thresholds (for example average CCN under ~10). + +[AgentReady](https://github.com/ambient-code/agentready) can call the Python tool [**lizard**](https://github.com/terryyin/lizard) for TypeScript/JavaScript. This repo does **not** add Python to the Node toolchain, so that check is often **skipped** when `lizard` is not on your `PATH`. + +- **Recommended assessment command** (uses repo config): + + ```bash + agentready assess -c .agentready-config.yaml . + ``` + + **`.agentready-config.yaml`** excludes **`cyclomatic_complexity`** (no Python `lizard` in the Node toolchain) and **`standard_layout`** (AgentReady expects `./tests`; we use **`src/__tests__/`** per [ADR 0002](docs/adr/0002-tests-under-src-instead-of-root-tests.md)). We still rely on **ESLint**, **tests**, and review for quality. + +- **Optional** — run lizard yourself after `pip install lizard`: + + ```bash + lizard src + ``` + +## Conventions for changes + +- Prefer **small, focused** changes; match existing style (imports, error handling, Commander patterns). +- **Typecheck** is via `tsc` through `npm run build`; `tsconfig.json` uses strict options — keep types honest. +- New behavior should have **tests** in `src/__tests__/` when feasible; use existing fixtures under `src/__tests__/fixtures/` as patterns. +- Do not expand scope into unrelated refactors or new docs unless requested. + +## User-facing docs + +End-user install, commands, custom templates, and prerequisites are in **`README.md`**. Keep `AGENTS.md` aimed at contributors and coding agents; avoid duplicating long user docs here. diff --git a/commitlint.config.mjs b/commitlint.config.mjs new file mode 100644 index 0000000..0616fb9 --- /dev/null +++ b/commitlint.config.mjs @@ -0,0 +1,3 @@ +export default { + extends: ['@commitlint/config-conventional'], +}; diff --git a/docs/adr/0001-cli-entrypoint-and-command-modules.md b/docs/adr/0001-cli-entrypoint-and-command-modules.md new file mode 100644 index 0000000..64df2fc --- /dev/null +++ b/docs/adr/0001-cli-entrypoint-and-command-modules.md @@ -0,0 +1,38 @@ +# 1. CLI entry point and separate command modules + +## Status + +Accepted + +## Context + +The PatternFly CLI exposes multiple commands (create, init, list, save, load, deploy, and so on). We need a clear place to register the program with Commander and parse arguments, while keeping each command’s behavior maintainable and easy to test. + +## Decision + +1. **`src/cli.ts` is the sole main entry point** for the published binary (`package.json` `"main"` / `bin` → compiled `dist/cli.js`). It owns: + - importing Commander and wiring `program`; + - registering commands, options, and descriptions; + - delegating execution to command-specific modules. + +2. **Each command’s implementation lives in its own TypeScript file** under `src/` (for example `create.ts`, `save.ts`, `load.ts`, `gh-pages.ts`). Those modules export functions such as `runCreate`, `runSave`, etc., and contain the command’s business logic, side effects, and error handling. + +3. **`cli.ts` stays thin**: it should not grow large bodies of domain logic; new or refactored behavior belongs in the appropriate command module (or shared helpers), not inlined in `cli.ts`. + +## Consequences + +**Positive** + +- Easier navigation: contributors find command logic by filename, not inside one long entry file. +- Testing can target command modules with focused imports and mocks. +- Adding a command follows a repeatable pattern: new `src/.ts` + registration in `cli.ts`. + +**Negative / trade-offs** + +- `cli.ts` must stay in sync when adding or renaming commands (registration + imports). +- Shared cross-command behavior should live in dedicated modules to avoid circular imports between `cli.ts` and command files. + +## References + +- `src/cli.ts` — program wiring and command registration +- `src/create.ts`, `src/save.ts`, `src/load.ts`, and related modules — command implementations diff --git a/docs/adr/0002-tests-under-src-instead-of-root-tests.md b/docs/adr/0002-tests-under-src-instead-of-root-tests.md new file mode 100644 index 0000000..2102b35 --- /dev/null +++ b/docs/adr/0002-tests-under-src-instead-of-root-tests.md @@ -0,0 +1,35 @@ +# 2. Tests under `src/__tests__` instead of a root `tests/` directory + +## Status + +Accepted + +## Context + +Node and TypeScript projects often place tests in a top-level `tests/` or `test/` folder. Some automated readiness heuristics assume that layout. This repository already uses Jest with files under `src/__tests__/`, co-located next to the modules they exercise. + +## Decision + +1. **Jest tests and fixtures live under `src/__tests__/`** (for example `src/__tests__/create.test.ts`, `src/__tests__/fixtures/`). We **do not** use a root-level `tests/` directory for this package. + +2. **Rationale for co-location** + - Imports from tests to implementation stay short and stable (`../create.js`-style paths mirror the source tree). + - `tsconfig.json` can target production code under `src/` while excluding `*.test.ts` from the emit graph without maintaining a second top-level source tree. + +3. **Tooling alignment**: `package.json` Jest `testMatch` and scripts assume `**/__tests__/**/*.test.ts`. New suites should follow that layout. + +## Consequences + +**Positive** + +- Clear mapping from a feature file in `src/` to its tests in `src/__tests__/`. +- No duplicate “package root” for TypeScript sources vs tests. + +**Negative / trade-offs** + +- Tools or scores that only look for `./tests` at the repository root will not see our layout; contributors should rely on this ADR and `AGENTS.md` for the canonical rule. + +## References + +- `package.json` — `jest.testMatch` +- `src/__tests__/` — test suites and `fixtures/` diff --git a/docs/adr/README.md b/docs/adr/README.md new file mode 100644 index 0000000..5cbcec0 --- /dev/null +++ b/docs/adr/README.md @@ -0,0 +1,10 @@ +# Architecture Decision Records + +This folder holds ADRs for the PatternFly CLI: context, the decision we made, and consequences. + +| # | Title | +|---|--------| +| [0001](0001-cli-entrypoint-and-command-modules.md) | CLI entry point vs command modules | +| [0002](0002-tests-under-src-instead-of-root-tests.md) | Tests under `src/__tests__` instead of root `tests/` | + +New ADRs use the next free number: `NNNN-short-title.md`. diff --git a/package-lock.json b/package-lock.json index 5cb1a43..5259f44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,9 +16,12 @@ "inquirer": "^9.3.5" }, "bin": { - "patternfly-cli": "dist/cli.js" + "patternfly-cli": "dist/cli.js", + "pfcli": "dist/cli.js" }, "devDependencies": { + "@commitlint/cli": "^20.3.1", + "@commitlint/config-conventional": "^20.3.1", "@eslint/js": "^10.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", @@ -33,6 +36,7 @@ "@types/jest": "^30.0.0", "@types/node": "^24.10.1", "eslint": "^10.0.2", + "husky": "^9.1.7", "jest": "^29.7.0", "semantic-release": "^24.2.0", "ts-jest": "^29.4.5", @@ -596,6 +600,335 @@ "node": ">=0.1.90" } }, + "node_modules/@commitlint/cli": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-20.5.3.tgz", + "integrity": "sha512-OJdL0EXWD5y9LPa0nr/geOwzaS8BsdaybKkcloB0JgsguGxNv2R+hC2FTPqrAcprg35zF33KOQerY0x8W1aesA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/format": "^20.5.0", + "@commitlint/lint": "^20.5.3", + "@commitlint/load": "^20.5.3", + "@commitlint/read": "^20.5.0", + "@commitlint/types": "^20.5.0", + "tinyexec": "^1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-20.5.3.tgz", + "integrity": "sha512-j34Qqeaa152chJgz2ysyk0BCpHenJn1lV0Rx0VXf8k3ccQcED+48EZrzMvo9jLmJUyBrrBwvu89I+2er4gW7QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "conventional-changelog-conventionalcommits": "^9.2.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-20.5.0.tgz", + "integrity": "sha512-T/Uh6iJUzyx7j35GmHWdIiGRQB+ouZDk0pwAaYq4SXgB54KZhFdJ0vYmxiW6AMYICTIWuyMxDBl1jK74oFp/Gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@commitlint/ensure": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-20.5.3.tgz", + "integrity": "sha512-4i4AgNvH62owG9MwSiWKrle7HGNpBHHdLnWFIp5fTsHUYe5kRuh15t08L/0pdbbrRk8JKXQxxN4hZQcn+szkrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "es-toolkit": "^1.46.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-20.0.0.tgz", + "integrity": "sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-20.5.0.tgz", + "integrity": "sha512-TI9EwFU/qZWSK7a5qyXMpKPPv3qta7FO4tKW+Wt2al7sgMbLWTsAcDpX1cU8k16TRdsiiet9aOw0zpvRXNJu7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-20.5.0.tgz", + "integrity": "sha512-JWLarAsurHJhPozbuAH6GbP4p/hdOCoqS9zJMfqwswne+/GPs5V0+rrsfOkP68Y8PSLphwtFXV0EzJ+GTXTTGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-20.5.3.tgz", + "integrity": "sha512-M7JbWBNr2gXKaPc4i/KipsuW1gkDHpj35KPjWtKy3Z+2AQw5wu1gBi1LIO0uoaij67CqY4K8PxPZSGens4evCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/is-ignored": "^20.5.0", + "@commitlint/parse": "^20.5.0", + "@commitlint/rules": "^20.5.3", + "@commitlint/types": "^20.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-20.5.3.tgz", + "integrity": "sha512-1FDZWuKyu98Myb8i7Tp31jPU2rZpOwAdYRyJcy2KoGg7Xk2A+bgHN8smhMaaNSNkmE8fwt53BokywZq8Gv/5XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^20.5.0", + "@commitlint/execute-rule": "^20.0.0", + "@commitlint/resolve-extends": "^20.5.3", + "@commitlint/types": "^20.5.0", + "cosmiconfig": "^9.0.1", + "cosmiconfig-typescript-loader": "^6.1.0", + "es-toolkit": "^1.46.0", + "is-plain-obj": "^4.1.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/message": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-20.4.3.tgz", + "integrity": "sha512-6akwCYrzcrFcTYz9GyUaWlhisY4lmQ3KvrnabmhoeAV8nRH4dXJAh4+EUQ3uArtxxKQkvxJS78hNX2EU3USgxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-20.5.0.tgz", + "integrity": "sha512-SeKWHBMk7YOTnnEWUhx+d1a9vHsjjuo6Uo1xRfPNfeY4bdYFasCH1dDpAv13Lyn+dDPOels+jP6D2GRZqzc5fA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/types": "^20.5.0", + "conventional-changelog-angular": "^8.2.0", + "conventional-commits-parser": "^6.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-20.5.0.tgz", + "integrity": "sha512-JDEIJ2+GnWpK8QqwfmW7O42h0aycJEWNqcdkJnyzLD11nf9dW2dWLTVEa8Wtlo4IZFGLPATjR5neA5QlOvIH1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/top-level": "^20.4.3", + "@commitlint/types": "^20.5.0", + "git-raw-commits": "^5.0.0", + "minimist": "^1.2.8", + "tinyexec": "^1.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-20.5.3.tgz", + "integrity": "sha512-+ogW9v/u9JqpvAgTrLra/YTFo0KkjU6iNblF89pPsj4NebNc+DAWctsludwezI8YnsjBmfHpApSwcXprN/f/ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/config-validator": "^20.5.0", + "@commitlint/types": "^20.5.0", + "es-toolkit": "^1.46.0", + "global-directory": "^5.0.0", + "import-meta-resolve": "^4.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "20.5.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-20.5.3.tgz", + "integrity": "sha512-MPlMnb9D3wbszYMp+1hPtuhtPJndRo6I6yfkZVA4+jR8w7Kqp0u2u/Y+gzbaItx5Lltq5rw7FSZQWJMoXUC4NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@commitlint/ensure": "^20.5.3", + "@commitlint/message": "^20.4.3", + "@commitlint/to-lines": "^20.0.0", + "@commitlint/types": "^20.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "20.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-20.0.0.tgz", + "integrity": "sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "20.4.3", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-20.4.3.tgz", + "integrity": "sha512-qD9xfP6dFg5jQ3NMrOhG0/w5y3bBUsVGyJvXxdWEwBm8hyx4WOk3kKXw28T5czBYvyeCVJgJJ6aoJZUWDpaacQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types": { + "version": "20.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-20.5.0.tgz", + "integrity": "sha512-ZJoS8oSq2CAZEpc/YI9SulLrdiIyXeHb/OGqGrkUP6Q7YV+0ouNAa7GjqRdXeQPncHQIDz/jbCTlHScvYvO/gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-parser": "^6.3.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@conventional-changelog/git-client": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-2.7.0.tgz", + "integrity": "sha512-j7A8/LBEQ+3rugMzPXoKYzyUPpw/0CBQCyvtTR7Lmu4olG4yRC/Tfkq79Mr3yuPs0SUitlO2HwGP3gitMJnRFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/child-process-utils": "^1.0.0", + "@simple-libs/stream-utils": "^1.2.0", + "semver": "^7.5.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "conventional-commits-filter": "^5.0.0", + "conventional-commits-parser": "^6.4.0" + }, + "peerDependenciesMeta": { + "conventional-commits-filter": { + "optional": true + }, + "conventional-commits-parser": { + "optional": true + } + } + }, + "node_modules/@conventional-changelog/git-client/node_modules/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -2531,6 +2864,35 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@simple-libs/child-process-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@simple-libs/child-process-utils/-/child-process-utils-1.0.2.tgz", + "integrity": "sha512-/4R8QKnd/8agJynkNdJmNw2MBxuFTRcNFnE5Sg/G+jkSsV8/UBgULMzhizWWW42p8L5H7flImV2ATi79Ove2Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@simple-libs/stream-utils": "^1.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, + "node_modules/@simple-libs/stream-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@simple-libs/stream-utils/-/stream-utils-1.2.0.tgz", + "integrity": "sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://ko-fi.com/dangreen" + } + }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", @@ -3893,9 +4255,22 @@ } }, "node_modules/conventional-changelog-angular": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.1.0.tgz", - "integrity": "sha512-GGf2Nipn1RUCAktxuVauVr1e3r8QrLP/B0lEUsFktmGqc3ddbQkhoJZHJctVU829U1c6mTSWftrVOCHaL85Q3w==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.3.1.tgz", + "integrity": "sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-9.3.1.tgz", + "integrity": "sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==", "dev": true, "license": "ISC", "dependencies": { @@ -3948,12 +4323,13 @@ } }, "node_modules/conventional-commits-parser": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.2.1.tgz", - "integrity": "sha512-20pyHgnO40rvfI0NGF/xiEoFMkXDtkF8FwHvk5BokoFoCuTQRI8vrNCNFWUOfuolKJMm1tPCHc8GgYEtr1XRNA==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.4.0.tgz", + "integrity": "sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==", "dev": true, "license": "MIT", "dependencies": { + "@simple-libs/stream-utils": "^1.2.0", "meow": "^13.0.0" }, "bin": { @@ -3991,9 +4367,9 @@ "license": "MIT" }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.1.tgz", + "integrity": "sha512-hr4ihw+DBqcvrsEDioRO31Z17x71pUYoNe/4h6Z0wB72p7MU7/9gH8Q3s12NFhHPfYBBOV3qyfUxmr/Yn3shnQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4017,6 +4393,24 @@ } } }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.3.0.tgz", + "integrity": "sha512-Akr82WH1Wfqatyiqpj8HDkO2o2KmJRu1FhKfSNJP3K4IdXwHfEyL7MOb62i1AGQVLtIQM+iCE9CGOtrfhR+mmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "jiti": "2.6.1" + }, + "engines": { + "node": ">=v18" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=9", + "typescript": ">=5" + } + }, "node_modules/cosmiconfig/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -4497,6 +4891,17 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-toolkit": { + "version": "1.46.1", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.46.1.tgz", + "integrity": "sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4903,6 +5308,23 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.20.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", @@ -5279,6 +5701,23 @@ "traverse": "0.6.8" } }, + "node_modules/git-raw-commits": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.1.tgz", + "integrity": "sha512-Y+csSm2GD/PCSh6Isd/WiMjNAydu0VBiG9J7EdQsNA5P9uXvLayqjmTsNlK5Gs9IhblFZqOU0yid5Il5JPoLiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@conventional-changelog/git-client": "^2.6.0", + "meow": "^13.0.0" + }, + "bin": { + "git-raw-commits": "src/cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5314,6 +5753,32 @@ "node": ">=10.13.0" } }, + "node_modules/global-directory": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-5.0.0.tgz", + "integrity": "sha512-1pgFdhK3J2LeM+dVf2Pd424yHx2ou338lC0ErNP2hPx4j8eW1Sp0XqSjNxtk6Tc4Kr5wlWtSvz8cn2yb7/SG/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "6.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -5471,6 +5936,22 @@ "node": ">=18.18.0" } }, + "node_modules/husky": { + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", + "dev": true, + "license": "MIT", + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, "node_modules/iconv-lite": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz", @@ -7435,6 +7916,16 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10938,6 +11429,16 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -14555,6 +15056,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/tinyexec": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.1.2.tgz", + "integrity": "sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", diff --git a/package.json b/package.json index 24f0aab..20adace 100644 --- a/package.json +++ b/package.json @@ -14,12 +14,16 @@ "pfcli": "./dist/cli.js" }, "scripts": { + "prepare": "husky", "build": "tsc", "start": "node dist/cli.js", "test": "jest", + "test:file": "jest --runTestsByPath", + "typecheck": "tsc --noEmit", "semantic-release": "semantic-release", "lint": "eslint src", - "lint:fix": "eslint src --fix" + "lint:fix": "eslint src --fix", + "lint:file": "eslint" }, "jest": { "preset": "ts-jest", @@ -58,6 +62,8 @@ "inquirer": "^9.3.5" }, "devDependencies": { + "@commitlint/cli": "^20.3.1", + "@commitlint/config-conventional": "^20.3.1", "@eslint/js": "^10.0.1", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", @@ -72,6 +78,7 @@ "@types/jest": "^30.0.0", "@types/node": "^24.10.1", "eslint": "^10.0.2", + "husky": "^9.1.7", "jest": "^29.7.0", "semantic-release": "^24.2.0", "ts-jest": "^29.4.5", diff --git a/tsconfig.json b/tsconfig.json index f814415..98f138e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,36 +1,23 @@ { - // Visit https://aka.ms/tsconfig to read more about this file "compilerOptions": { "module": "NodeNext", "moduleResolution": "nodenext", - // File Layout "rootDir": "./src", "outDir": "./dist", - // Environment Settings - // See also https://aka.ms/tsconfig/module "target": "esnext", - "lib": [ - "esnext" - ], - "types": [ - "node", - "jest" - ], - // Other Outputs + "lib": ["esnext"], + "types": ["node", "jest"], "sourceMap": true, "declaration": true, "declarationMap": true, - // Stricter Typechecking Options "noUncheckedIndexedAccess": true, "exactOptionalPropertyTypes": true, - // Style Options "noImplicitReturns": true, "noImplicitOverride": true, "noUnusedLocals": true, "noUnusedParameters": true, "noFallthroughCasesInSwitch": true, "noPropertyAccessFromIndexSignature": true, - // Recommended Options "strict": true, "jsx": "react-jsx", "verbatimModuleSyntax": true, @@ -41,10 +28,6 @@ "noImplicitAny": false, "esModuleInterop": true }, - "include": [ - "src/**/*" - ], - "exclude": [ - "src/__tests__/**/*.test.ts" - ] -} \ No newline at end of file + "include": ["src/**/*"], + "exclude": ["src/__tests__/**/*.test.ts"] +}