@umbrelladocs/rdformat-validator
Version:
Validate and fix Reviewdog Diagnostic Format (RD Format) - A comprehensive library and CLI tool for validating JSON data against the Reviewdog Diagnostic Format specification
470 lines (362 loc) • 11.3 kB
Markdown
# RDFormat Validator
A NodeJS library and CLI tool for validating JSON data against the [Reviewdog Diagnostic Format](https://github.com/reviewdog/reviewdog/blob/master/proto/rdf/reviewdog.proto) specification.
## Features
- ✅ **JSON Schema Validation** - Validates against the official RDFormat specification
- 🔧 **Automatic Fixing** - Attempts to fix common formatting issues
- 📝 **Detailed Error Reporting** - Provides clear error messages with location information
- 🎯 **TypeScript Support** - Full type definitions included
- 🖥️ **CLI Tool** - Standalone command-line interface
- 📚 **Library Usage** - Import as a module in your NodeJS projects
- 🔄 **Multiple Input Formats** - Supports single diagnostics, arrays, and structured results
## Installation
### As a Library
```bash
npm install @umbrelladocs/rdformat-validator
```
### As a CLI Tool
```bash
# Install globally
npm install -g @umbrelladocs/rdformat-validator
# Or use with npx
npx @umbrelladocs/rdformat-validator --help
```
## Quick Start
### Library Usage
```typescript
import { validate, validateAndFix, RDFormatValidator } from 'rdformat-validator';
```typescript
import { validate, validateAndFix, RDFormatValidator } from '@umbrelladocs/rdformat-validator';
// Quick validation
const result = await validate('{"diagnostics": []}');
console.log(result.valid); // true
// Validation with automatic fixing
const fixResult = await validateAndFix(invalidData, { fixLevel: 'basic' });
if (fixResult.fixedData) {
console.log('Fixed data:', fixResult.fixedData);
}
// Using the main validator class
const validator = new RDFormatValidator({
strictMode: true,
allowExtraFields: false
});
const result = await validator.validateFile('./diagnostics.json');
```
### CLI Usage
```bash
# Validate a single file
rdformat-validator diagnostics.json
# Validate multiple files
rdformat-validator file1.json file2.json
# Validate from stdin
cat diagnostics.json | rdformat-validator
# Validate and fix issues
rdformat-validator --fix diagnostics.json
# Output in JSON format
rdformat-validator --format json diagnostics.json
# Strict validation mode
rdformat-validator --strict --no-extra-fields diagnostics.json
```
## RDFormat Overview
The Reviewdog Diagnostic Format (RDFormat) is a standardized JSON format for representing code analysis results. It supports two main structures:
### 1. Diagnostic Array Format
An array of individual diagnostic objects:
```json
[
{
"message": "Line too long",
"location": {
"path": "src/main.js",
"range": {
"start": { "line": 10, "column": 1 },
"end": { "line": 10, "column": 120 }
}
},
"severity": "WARNING",
"source": {
"name": "eslint",
"url": "https://eslint.org"
}
}
]
```
### 2. Diagnostic Result Format
A structured result object containing diagnostics and metadata:
```json
{
"diagnostics": [
{
"message": "Missing semicolon",
"location": {
"path": "src/app.js",
"range": {
"start": { "line": 15, "column": 25 }
}
},
"severity": "ERROR",
"source": {
"name": "jshint"
}
}
],
"source": {
"name": "multi-linter",
"url": "https://example.com/multi-linter"
},
"severity": "ERROR"
}
```
## Library API
### Main Classes
#### `RDFormatValidator`
The primary validator class providing comprehensive validation functionality.
```typescript
const validator = new RDFormatValidator({
strictMode: false, // Enable strict validation
allowExtraFields: true, // Allow extra fields not in spec
fixLevel: 'basic' // Fix level: 'basic' or 'aggressive'
});
```
**Methods:**
- `validateString(input: string, fix?: boolean)` - Validate JSON string
- `validateFile(filePath: string, fix?: boolean)` - Validate JSON file
- `validateObject(data: any, fix?: boolean)` - Validate JavaScript object
- `getSchema()` - Get the JSON schema used for validation
- `setOptions(options)` - Update validator options
### Convenience Functions
#### `validate(input, options?)`
Simple validation without fixing:
```typescript
const result = await validate('{"diagnostics": []}');
console.log(result.valid); // boolean
console.log(result.errors); // ValidationError[]
console.log(result.warnings); // ValidationWarning[]
```
#### `validateAndFix(input, options?)`
Validation with automatic fixing:
```typescript
const result = await validateAndFix(invalidData, { fixLevel: 'aggressive' });
if (result.fixedData) {
console.log('Data was fixed:', result.fixedData);
console.log('Applied fixes:', result.appliedFixes);
}
```
#### `isValidRDFormat(input, options?)`
Quick validation check:
```typescript
const isValid = await isValidRDFormat(data);
console.log(isValid); // boolean
```
### Batch Processing
#### `validateBatch(inputs, options?)`
Validate multiple inputs simultaneously:
```typescript
const results = await validateBatch([
'{"diagnostics": []}',
{ diagnostics: [] },
invalidData
]);
results.forEach((result, index) => {
console.log(`Input ${index}: ${result.valid ? 'valid' : 'invalid'}`);
});
```
#### `validateAndFixBatch(inputs, options?)`
Batch validation with fixing:
```typescript
const results = await validateAndFixBatch(inputs, { fixLevel: 'basic' });
```
### Utility Functions
#### `createValidationSummary(results)`
Create a summary of validation results:
```typescript
const summary = createValidationSummary(results);
console.log(`Valid: ${summary.validCount}/${summary.totalCount}`);
console.log(`Total errors: ${summary.totalErrors}`);
```
#### `formatValidationErrors(errors, options?)`
Format errors for display:
```typescript
const formattedErrors = formatValidationErrors(result.errors, {
includeCode: true,
includeExpected: true
});
formattedErrors.forEach(error => console.log(error));
```
## CLI Reference
### Basic Usage
```bash
rdformat-validator [options] [files...]
```
### Options
| Option | Description | Default |
|--------|-------------|---------|
| `-f, --fix` | Attempt to automatically fix common issues | `false` |
| `-o, --output <file>` | Output file (default: stdout) | - |
| `-v, --verbose` | Enable verbose output | `false` |
| `-s, --silent` | Suppress non-error output | `false` |
| `--format <format>` | Output format: `json` or `text` | `text` |
| `--strict` | Enable strict validation mode | `false` |
| `--no-extra-fields` | Disallow extra fields not in specification | `false` |
| `--fix-level <level>` | Fix level: `basic` or `aggressive` | `basic` |
### Examples
#### Basic Validation
```bash
# Validate a single file
rdformat-validator diagnostics.json
# Validate multiple files
rdformat-validator file1.json file2.json file3.json
# Validate from stdin
cat diagnostics.json | rdformat-validator
echo '{"diagnostics": []}' | rdformat-validator
```
#### Validation with Fixing
```bash
# Fix common issues
rdformat-validator --fix diagnostics.json
# Aggressive fixing
rdformat-validator --fix --fix-level aggressive diagnostics.json
# Save fixed output to file
rdformat-validator --fix --output fixed.json diagnostics.json
```
#### Output Formats
```bash
# JSON output format
rdformat-validator --format json diagnostics.json
# Verbose text output
rdformat-validator --verbose diagnostics.json
# Silent mode (only errors)
rdformat-validator --silent diagnostics.json
```
#### Strict Validation
```bash
# Strict mode with no extra fields
rdformat-validator --strict --no-extra-fields diagnostics.json
# Combine with other options
rdformat-validator --strict --verbose --format json diagnostics.json
```
### Exit Codes
- `0` - Success (all files are valid)
- `1` - Validation errors found or other errors occurred
## Configuration Options
### Validation Options
```typescript
interface RDFormatValidatorOptions {
strictMode?: boolean; // Enable strict validation (default: false)
allowExtraFields?: boolean; // Allow extra fields (default: true)
fixLevel?: 'basic' | 'aggressive'; // Fix level (default: 'basic')
}
```
### Fix Levels
- **`basic`** - Safe fixes that don't change data semantics
- Add missing required fields with sensible defaults
- Fix simple type mismatches (string to number, etc.)
- Correct basic structural issues
- **`aggressive`** - More extensive fixes that may change data
- Remove invalid fields
- Restructure nested objects
- Apply more complex transformations
## Error Handling
### Validation Errors
```typescript
interface ValidationError {
path: string; // JSON path to error location
message: string; // Human-readable error message
code: string; // Error code for programmatic handling
value?: any; // The value that caused the error
expected?: string; // Description of expected value/format
}
```
### Common Error Codes
- `REQUIRED_PROPERTY` - Missing required field
- `INVALID_TYPE` - Wrong data type
- `INVALID_FORMAT` - Invalid format (e.g., invalid enum value)
- `PARSE_ERROR` - JSON parsing error
- `UNEXPECTED_ERROR` - Unexpected system error
### Error Examples
```typescript
const result = await validate(invalidData);
if (!result.valid) {
result.errors.forEach(error => {
console.log(`${error.path}: ${error.message} (${error.code})`);
});
}
```
## TypeScript Support
Full TypeScript definitions are included:
```typescript
import {
RDFormatValidator,
RDFormatValidatorOptions,
RDFormatValidatorResult,
ValidationError,
ValidationWarning,
Diagnostic,
DiagnosticResult,
Location,
Range,
Position,
Severity,
Source,
Code,
Suggestion
} from 'rdformat-validator';
```
## Integration Examples
### CI/CD Pipeline
```bash
#!/bin/bash
# Validate diagnostic output in CI
if ! rdformat-validator --silent diagnostics.json; then
echo "Invalid RDFormat data detected"
exit 1
fi
```
### Node.js Script
```javascript
const { validateFile } = require('rdformat-validator');
async function validateDiagnostics() {
try {
const result = await validateFile('./output/diagnostics.json');
if (!result.valid) {
console.error('Validation failed:', result.errors);
process.exit(1);
}
console.log('Diagnostics are valid!');
} catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
}
validateDiagnostics();
```
### Express.js Middleware
```javascript
const { validate } = require('rdformat-validator');
function validateRDFormat(req, res, next) {
validate(req.body)
.then(result => {
if (!result.valid) {
return res.status(400).json({
error: 'Invalid RDFormat data',
details: result.errors
});
}
next();
})
.catch(next);
}
app.post('/diagnostics', validateRDFormat, (req, res) => {
// Handle valid RDFormat data
res.json({ status: 'success' });
});
```
## Requirements
- Node.js 14.0.0 or higher
- TypeScript 5.8+ (for development)
## License
MIT
## Contributing
Contributions are welcome! Please read our contributing guidelines and submit pull requests to our GitHub repository.
## Links
- [Reviewdog Project](https://github.com/reviewdog/reviewdog)
- [RDFormat Specification](https://github.com/reviewdog/reviewdog/blob/master/proto/rdf/reviewdog.proto)
- [NPM Package](https://www.npmjs.com/package/rdformat-validator)