Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ jobs:
- name: Install dependencies
run: npm ci
- name: E2E test affected projects
run: npx nx affected -t e2e-test --parallel=1
run: npx nx affected -t e2e-test --verbose --parallel=1

build:
runs-on: ubuntu-latest
Expand Down
165 changes: 101 additions & 64 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,89 +1,126 @@
<h1 align="center">Code PushUp CLI</h1>
<p align="center"><img alt="Code-Pushup Logo" src="./packages/cli/docs/images/logo.png" width="500" /></p>
<h2 align="center">Comprehensive tech quality monitoring</h2>
<!-- link when web landing is ready <a href="./packages/cli/README.md#getting-started">Try our paid features</a> -->
<p align="center">Quantify tech debt &mdash; Track incremental improvements &mdash; Monitor regressions</p>
# @code-pushup/models

---
[![npm](https://img.shields.io/npm/v/%40code-pushup%2Fmodels.svg)](https://www.npmjs.com/package/@code-pushup/models)
[![downloads](https://img.shields.io/npm/dm/%40code-pushup%2Fmodels)](https://npmtrends.com/@code-pushup/models)
[![dependencies](https://img.shields.io/librariesio/release/npm/%40code-pushup/models)](https://www.npmjs.com/package/@code-pushup/models?activeTab=dependencies)

[![version](https://img.shields.io/github/v/release/code-pushup/cli)](https://github.com/code-pushup/cli/releases/latest)
[![release date](https://img.shields.io/github/release-date/code-pushup/cli)](https://github.com/code-pushup/cli/releases)
![NodeJS support](https://img.shields.io/node/v/%40code-pushup%2Fcli)
[![license](https://img.shields.io/github/license/code-pushup/cli)](https://opensource.org/licenses/MIT)
[![commit activity](https://img.shields.io/github/commit-activity/m/code-pushup/cli)](https://github.com/code-pushup/cli/pulse/monthly)
[![CI](https://github.com/code-pushup/cli/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/code-pushup/cli/actions/workflows/ci.yml?query=branch%3Amain)
[![Codecov](https://codecov.io/gh/code-pushup/cli/branch/main/graph/badge.svg?token=Y7V489JZ4A)](https://codecov.io/gh/code-pushup/cli)
**Model definitions and validators** for the [Code PushUp CLI](../cli/README.md).

---
For a full list of models defined by this package, see the auto-generated [Code PushUp models reference](./docs/models-reference.md).

![Type safety](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/type-safety?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
![Bug prevention](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/bug-prevention?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
![Code style](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/code-style?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
![Code coverage](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/code-coverage?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
![Security](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/security?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
![Updates](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/updates?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
![Documentation](https://api.staging.code-pushup.dev/badges/code-pushup/cli-workspace/docs?apiKey=cp_def67c4efe558a9149061d0c62de893e1689ad793071db332790238446173fef)
## Setup

---
If you've already installed another `@code-pushup/*` package, then you may have already installed `@code-pushup/models` indirectly.

### 🔌 Code quality tools are like phone chargers. Everyone has a different plug.
If not, you can always install it separately:

_Common problems with keeping track of technical quality:_
```sh
npm install --save-dev @code-pushup/models
```

- When **tech debt is invisible**, it's difficult to plan much-needed maintenance efforts 🔧
- Individual tools measure different metrics, inability to combine them leads to
a **lack of comprehensive overview** 🧑‍🦯
- Open-source tools typically used for failing checks in CI, which **can't measure incremental improvements** due to arbitrary pass/fail thresholds 🤖
- Off-the-shelf solutions tend to be opinionated and **hard to customize**, so may not fit your specific needs 🧱
```sh
yarn add --dev @code-pushup/models
```

_We want to change that!_
```sh
pnpm add --save-dev @code-pushup/models
```

---
## Usage

## 🔎🔬 Code quality integrations for any tool 📉🔍
### Importing Everything (Traditional)

| [🚀 Get started](./packages/cli/README.md#getting-started)️ | [🤖 CI automation](https://github.com/marketplace/actions/code-pushup) |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <a href="./packages/cli/README.md#getting-started"><img alt="Getting started cover image" title="Getting started with code-pushup" src="packages/cli/docs/images/cli-terminal-overview.png" width="1000"></a> | <a href="./packages/cli/README.md#-ci-automation"><img alt="CI Automation cover" title="CI automation guide" src="docs/images/gh-action.png" width="1000"></a> |
| <ul><li>Run **[📦 `@code-pushup/cli`](./packages/cli#readme)** to collect **reports**.</li><li>[Get started](./packages/cli/README.md#getting-started) quickly with our [**official plugins**](#-officially-supported-plugins)! ⏱️</li></ul> | <ul><li>Easy **CI** setup with **[🤖 `code-pushup/github-action`](https://github.com/marketplace/actions/code-pushup)**.</li><li>Import logic from **[📦 `@code-pushup/core`](./packages/core#readme)** to craft **custom tools**.</li></ul> |
Import the type definitions if using TypeScript:

| 📈 [Portal](https://code-pushup.dev#portal)️ | 🔌 [Custom plugins](./packages/cli/docs/custom-plugins.md) |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| <a href="#portal-integration"><img alt="Portal integration cover image" title="Inetegrate code-pushup portal" src="packages/cli/docs/images/portal-cover.png" width="1000"></a> | <a href="#custom-plugins"><img alt="Custom plugins" title="Create custom code-pushup plugins" src="docs/images/code-pushup-custom-plugins.png" width="1000"></a> |
| <ul><li>**[Portal](https://code-pushup.dev#portal)** 🌐 **visualizes reports** in a slick UI.</li><li>Track **historical data** from uploads. ⬆️</li></ul> | <ul><li>All the [data models](./packages/models/docs/models-reference.md) you need are provided in **[📦 `@code-pushup/models`](./packages/models/README.md)**.</li><li>Find tons of useful utilities in **[📦 `@code-pushup/utils`](./packages/utils/README.md)**.</li></ul> |
- in `code-pushup.config.ts`:

---
```ts
import type { CoreConfig } from '@code-pushup/models';

### 🔌 Officially supported plugins
export default {
// ... this is type-checked ...
} satisfies CoreConfig;
```

| Icon | Name | Description |
| :------------------------------------------------------------: | :-------------------------------------------------- | :--------------------------------------------------------------------------------- |
| <img width="24" src="docs/images/plugin-eslint.icon.png"> | [ESLint](./packages/plugin-eslint#readme) | Static analysis using **ESLint** rules. |
| <img width="24" src="docs/images/plugin-coverage.icon.png"> | [Code Coverage](./packages/plugin-coverage#readme) | Collects code **coverage** from your tests. |
| <img width="24" src="docs/images/plugin-js-packages.icon.png"> | [JS Packages](./packages/plugin-js-packages#readme) | Checks 3rd party packages for known **vulnerabilities** and **outdated** versions. |
| <img width="24" src="docs/images/plugin-lighthouse.icon.png"> | [Lighthouse](./packages/plugin-lighthouse#readme) | Measures web performance and best practices with **Lighthouse**. |
| <img width="24" src="docs/images/plugin-jsdocs.icon.png"> | [JSDocs](./packages/plugin-jsdocs#readme) | Analyzes how much source code is **documented** using JSDocs comments. |
| <img width="24" src="docs/images/plugin-typescript.icon.png"> | [TypeScript](./packages/plugin-typescript#readme) | Checks for **TypeScript** errors using strict compiler flags. |
- in custom plugin:

---
```ts
import type { PluginConfig } from '@code-pushup/models';

## 📝 How it works
export default function myCustomPlugin(): PluginConfig {
return {
// ... this is type-checked ...
};
}
```

1. **[Configure](./packages/cli/README.md#getting-started)**
Pick from a set of supported packages or include your own ideas. 🧩
```ts
import type { AuditOutput } from '@code-pushup/models';

2. **[Integrate](https://github.com/marketplace/actions/code-pushup)**
Use our integration guide and packages to set up CI integration in minutes. ⏱️
async function myCustomPluginRunner() {
const audits: AuditOutput[] = await collectAudits();

3. **[Observe](https://code-pushup.dev#portal)**
Guard regressions and track improvements with every code change. 🔍
await writeFile(RUNNER_OUTPUT_FILE, JSON.stringify(audits));
}
```

4. **Relax!**
Watch improvements, share reports 📈
### Importing Specific Modules (Recommended)

---
For better tree-shaking and smaller bundle sizes, import only what you need from specific modules:

## 💖 Want to support us?
```ts
// Import only audit-related models
import { auditSchema } from '@code-pushup/models/audit';
import type { AuditOutput } from '@code-pushup/models/audit-output';
// Import only configuration models
import type { CoreConfig } from '@code-pushup/models/core-config';
import { persistConfigSchema } from '@code-pushup/models/persist-config';
// Import only plugin-related models
import type { PluginConfig } from '@code-pushup/models/plugin-config';
// Import only report-related models
import type { Report } from '@code-pushup/models/report';
import { reportsDiffSchema } from '@code-pushup/models/reports-diff';
```

- Read how to contribute to the codebase. See: [CONTRIBUTING.md](./CONTRIBUTING.md) 🤝
<!-- link when sponsorships are ready [Sponsor](./CONTRIBUTING.md) -->
### Available Entry Points

The following modules are available as individual entry points:

| Module | Import Path | Description |
| --------------- | ------------------------------------- | ----------------------------- |
| Audit | `@code-pushup/models/audit` | Audit definitions and schemas |
| Audit Output | `@code-pushup/models/audit-output` | Audit output models |
| Cache Config | `@code-pushup/models/cache-config` | Cache configuration models |
| Category Config | `@code-pushup/models/category-config` | Category configuration models |
| Commit | `@code-pushup/models/commit` | Commit-related models |
| Configuration | `@code-pushup/models/configuration` | General configuration models |
| Core Config | `@code-pushup/models/core-config` | Core configuration models |
| Group | `@code-pushup/models/group` | Group-related models |
| Issue | `@code-pushup/models/issue` | Issue definitions and schemas |
| Persist Config | `@code-pushup/models/persist-config` | Persist configuration models |
| Plugin Config | `@code-pushup/models/plugin-config` | Plugin configuration models |
| Report | `@code-pushup/models/report` | Report models |
| Reports Diff | `@code-pushup/models/reports-diff` | Report diff models |
| Runner Config | `@code-pushup/models/runner-config` | Runner configuration models |
| Source | `@code-pushup/models/source` | Source location models |
| Table | `@code-pushup/models/table` | Table formatting models |
| Tree | `@code-pushup/models/tree` | Tree structure models |
| Upload Config | `@code-pushup/models/upload-config` | Upload configuration models |

### Runtime Validation

If you need runtime validation, use the underlying Zod schemas:

```ts
// Import from specific modules (recommended)
import { coreConfigSchema } from '@code-pushup/models/core-config';
import { auditOutputSchema } from '@code-pushup/models/audit-output';

// Or import from main entry point
import { coreConfigSchema } from '@code-pushup/models';

const json = JSON.parse(readFileSync('code-pushup.config.json'));
const config = coreConfigSchema.parse(json); // throws ZodError if invalid
```

> **💡 Pro tip**: Using specific module imports (e.g., `@code-pushup/models/audit`) instead of the main entry point can significantly reduce your bundle size and avoid side effects by only including the code you actually use.
10 changes: 10 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export default tseslint.config(
enforceBuildableLibDependency: true,
allow: [
String.raw`^.*/eslint(\.base)?\.config\.[cm]?js$`,
String.raw`^.*/tsdown\.base\.[cm]?js$`,
String.raw`^.*/code-pushup\.(config|preset)(\.m?[jt]s)?$`,
'^[./]+/tools/.*$',
],
Expand Down Expand Up @@ -110,6 +111,14 @@ export default tseslint.config(
{
files: ['**/*.json'],
languageOptions: { parser: jsoncParser },
rules: {
'@nx/dependency-checks': [
'error',
{
ignoredDependencies: ['tsdown'],
},
],
},
},
{
files: ['**/*.ts', '**/*.js'],
Expand Down Expand Up @@ -138,6 +147,7 @@ export default tseslint.config(
ignores: [
'**/*.mock.*',
'**/code-pushup.config.ts',
'**/tsdown.config.ts',
'**/mocks/fixtures/**',
'**/__snapshots__/**',
'**/dist',
Expand Down
10 changes: 10 additions & 0 deletions examples/plugins/tsdown.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineConfig } from 'tsdown';
import { baseConfig, getExternalDependencies } from '../../tsdown.base';

const __dirname = import.meta.dirname;

export default defineConfig({
...baseConfig({ projectRoot: __dirname }),
external: await getExternalDependencies(__dirname),
copy: [],
});
21 changes: 18 additions & 3 deletions nx.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
"!{projectRoot}/tsconfig.@(test|tools).json",
"!{workspaceRoot}/**/(*.)coverage/**/*"
],
"tsdownConfigs": ["{projectRoot}/tsdown.config.ts"],
"test-vitest-inputs": [
"os",
{
Expand Down Expand Up @@ -75,14 +76,14 @@
"--max-warnings=0",
"--no-warn-ignored",
"--error-on-unmatched-pattern=false",
"--format=./tools/eslint-formatter-multi/dist/src/index.js"
"--format=./tools/eslint-formatter-multi/dist/src/index.mjs"
],
"env": {
"ESLINT_FORMATTER_CONFIG": "{\"outputDir\":\"{projectRoot}/.eslint\"}"
}
}
},
"build": {
"build-old": {
"dependsOn": ["^build"],
"inputs": ["production", "^production"],
"cache": true,
Expand All @@ -95,6 +96,19 @@
"assets": ["{projectRoot}/*.md"]
}
},
"build": {
"dependsOn": ["^build"],
"inputs": ["production", "^production", "tsdownConfigs"],
"cache": true,
"executor": "nx:run-commands",
"options": {
"commands": [
"node_modules/.bin/tsdown --config {projectRoot}/tsdown.config.ts"
],
"outputPath": "{projectRoot}/dist"
},
"outputs": ["{projectRoot}/dist"]
},
"unit-test": {
"cache": true,
"inputs": ["default", "test-vitest-inputs"],
Expand Down Expand Up @@ -358,7 +372,8 @@
"filterByTags": ["publishable"]
}
}
}
},
"./tools/src/ts-down.plugin.mjs"
],
"nxCloudId": "65d4d862d2adb16a45a4bc7c"
}
Loading
Loading