npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@xarf/xarf

v1.0.1

Published

XARF v4 (eXtended Abuse Reporting Format) parser and generator for JavaScript/TypeScript - supports XARF spec v4.2.0 with backward compatibility for v3

Readme

XARF JavaScript/TypeScript Library

XARF Spec npm version License: MIT Test

A JavaScript/TypeScript library for parsing, validating, and generating XARF v4 (eXtended Abuse Reporting Format) reports.

Features

  • Parse XARF reports from JSON with validation and typed results
  • Generate XARF-compliant reports with auto-generated metadata (UUIDs, timestamps)
  • Validate reports against the official JSON schemas with detailed errors and warnings
  • Full TypeScript support with discriminated union types for all 7 categories
  • v3 backward compatibility with automatic detection and conversion
  • Schema-driven — validation rules derived from the official xarf-spec schemas, not hardcoded

Installation

npm install @xarf/xarf

Quick Start

Parsing a Report

import { parse } from '@xarf/xarf';

// Missing first_seen and source_port produce validation errors.
const { report, errors, warnings } = parse({
  xarf_version: '4.2.0',
  report_id: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
  timestamp: '2024-01-15T10:30:00Z',
  // first_seen: '2024-01-15T10:00:00Z',
  reporter: {
    org: 'Security Team',
    contact: '[email protected]',
    domain: 'example.com',
  },
  sender: {
    org: 'Security Team',
    contact: '[email protected]',
    domain: 'example.com',
  },
  source_identifier: '192.0.2.100',
  // source_port: 1234,
  category: 'connection',
  type: 'ddos',
  evidence_source: 'honeypot',
  destination_ip: '203.0.113.10',
  protocol: 'tcp',
});

if (errors.length === 0) {
  console.log(report.category); // 'connection'
} else {
  console.log('Validation errors:', errors);
}

Creating a Report

import { createReport, createEvidence } from '@xarf/xarf';

// Returns { content_type, payload (base64), hash, size, description }
const evidence = createEvidence('message/rfc822', rawEmailContent, {
  description: 'Original spam email',
  hashAlgorithm: 'sha256',
});

// xarf_version, report_id, and timestamp are auto-generated
const { report, errors, warnings } = createReport({
  category: 'messaging',
  type: 'spam',
  source_identifier: '192.0.2.100',
  reporter: {
    org: 'Example Security',
    contact: '[email protected]',
    domain: 'example.com',
  },
  sender: {
    org: 'Example Security',
    contact: '[email protected]',
    domain: 'example.com',
  },
  evidence_source: 'spamtrap',
  description: 'Spam email detected from source',
  protocol: 'smtp',
  smtp_from: '[email protected]',
  evidence: [evidence],
});

console.log(JSON.stringify(report, null, 2));

API Reference

parse(jsonData, options?)

Parse and validate a XARF report from JSON. Supports both v4 and v3 (legacy) formats — v3 reports are automatically converted to v4 with deprecation warnings.

import { parse } from '@xarf/xarf';

const { report, errors, warnings, info } = parse(jsonData, options?);

Parameters:

  • jsonData: string | Record<string, unknown> — JSON string or object containing a XARF report
  • options.strict?: boolean — Throw XARFValidationError on validation failures (default: false)
  • options.showMissingOptional?: boolean — Include info about missing optional fields (default: false)

Returns ParseResult:

  • report: XARFReport — The parsed report, typed by category
  • errors: string[] — Validation errors (empty if valid)
  • warnings: string[] — Validation warnings
  • info?: ValidationInfo[] — Missing optional field info (only when showMissingOptional is true)

createReport(input, options?)

Create a validated XARF report with auto-generated metadata. Automatically fills xarf_version, report_id (UUID), and timestamp (ISO 8601) if not provided.

import { createReport } from '@xarf/xarf';

const { report, errors, warnings } = createReport(input, options?);

Parameters:

  • input: ReportInput — Report data. A discriminated union on category that narrows type-safe fields per category (e.g., MessagingReportInput, ConnectionReportInput, etc.)
  • options.strict?: boolean — Throw on validation failures (default: false)
  • options.showMissingOptional?: boolean — Include info about missing optional fields (default: false)

Returns CreateReportResult:

  • report: XARFReport — The generated report
  • errors: ValidationError[] — Structured validation errors ({ field, message, value? })
  • warnings: ValidationWarning[] — Structured validation warnings ({ field, message, value? })
  • info?: ValidationInfo[] — Missing optional field info (only when showMissingOptional is true)

createEvidence(contentType, payload, options?)

Create an evidence object with automatic base64 encoding, hashing, and size calculation.

import { createEvidence } from '@xarf/xarf';

const evidence = createEvidence(contentType, payload, options?);

Parameters:

  • contentType: string — MIME type of the evidence (e.g., 'message/rfc822')
  • payload: string | Buffer — The evidence data
  • options.description?: string — Human-readable description
  • options.hashAlgorithm?: 'sha256' | 'sha512' | 'sha1' | 'md5' — Hash algorithm (default: 'sha256')

Returns XARFEvidence with computed hash, size, and base64-encoded payload.

schemaRegistry

Access schema-derived validation rules and metadata programmatically.

import { schemaRegistry } from '@xarf/xarf';

// Get all valid categories
schemaRegistry.getCategories();
// Set { 'messaging', 'connection', 'content', 'infrastructure', 'copyright', 'vulnerability', 'reputation' }

// Get valid types for a category
schemaRegistry.getTypesForCategory('connection');
// Set { 'ddos', 'port_scan', 'login_attack', ... }

// Check if a category/type combination is valid
schemaRegistry.isValidType('connection', 'ddos'); // true

// Get field metadata including descriptions
schemaRegistry.getFieldMetadata('confidence');
// { description: '...', required: false, recommended: true, ... }

Validation Details

Both parse() and createReport() run validation internally. Additional behaviors:

  • Unknown fields trigger warnings (or errors in strict mode)
  • Missing optional fields can be discovered with showMissingOptional: true:
const { info } = parse(report, { showMissingOptional: true });

if (info) {
  info.forEach(({ field, message }) => {
    console.log(`${field}: ${message}`);
    // e.g., "description: OPTIONAL - Human-readable description of the abuse"
    // e.g., "confidence: RECOMMENDED - Confidence score between 0.0 and 1.0"
  });
}

v3 Backward Compatibility

The library automatically detects XARF v3 reports (by the Version field) and converts them to v4 during parsing. Converted reports include legacy_version: '3' and deprecation warnings.

import { parse } from '@xarf/xarf';

const { report, warnings } = parse(v3Report);

console.log(report.xarf_version); // '4.2.0'
console.log(report.category); // mapped category (e.g., 'messaging')
console.log(report.legacy_version); // '3'
// warnings includes deprecation notice + conversion details

You can also use the low-level utilities directly:

import { isXARFv3, convertV3toV4, getV3DeprecationWarning } from '@xarf/xarf';

if (isXARFv3(jsonData)) {
  const warnings: string[] = [];
  const v4Report = convertV3toV4(v3Report, warnings);
  console.log(getV3DeprecationWarning());
}

Unknown v3 report types cause a parse error listing the supported types. See MIGRATION_V3_TO_V4.md for the full type mapping and migration strategies.

Schema Management

This library validates against the official xarf-spec JSON schemas. Schemas are fetched automatically on npm install based on the version configured in package.json:

"xarfSpec": {
  "version": "v4.2.0"
}
# Check if a newer version of xarf-spec is available
npm run check-schema-updates

# Re-fetch schemas (e.g., if missing or to force a refresh)
npm run fetch-schemas

To update to a newer spec version, change the version in package.json and run npm install.

Development

npm test                  # Run tests
npm run test:coverage     # Run tests with coverage
npm run build             # Build TypeScript to JavaScript
npm run typecheck         # Type-check without emitting
npm run lint              # Run ESLint
npm run format:check      # Check Prettier formatting

See CONTRIBUTING.md for development guidelines.

Links