Конфигурация

Справочник

Все поля ranklint.config и приоритеты слоёв.

Файл ranklint.config.{ts,js,mjs,json,jsonc}, грузится c12. Для TS — автодополнение через defineRanklintConfig, для JSON — JSON-схема. Весь конфиг валидируется Zod на старте: неизвестное правило — ошибка с did-you-mean (Левенштейн ≤ 3).

import { defineRanklintConfig } from '@ranklint/core'

export default defineRanklintConfig({
  extends: ['./agency-preset.ts', '@ranklint/preset-default'],

  site: { url: 'https://example.com', name: 'Example' },

  apps: {                                  // зоны multi-app домена
    self: { paths: ['/en/market/**'] },    // зона с именем self — краулится
    main: { paths: ['/**'], owner: 'external', checks: ['...'] },
  },

  rules: {
    'meta:title-length': ['error', { min: 30, max: 60 }],
    'meta:description-length': 'off',      // 'error' | 'warn' | 'info' | 'off' | [severity, options]
  },

  crawl: {
    entry: ['/en/market'],                 // сид-пути краула (по умолчанию — сам проверяемый URL)
    concurrency: 5,                        // параллельных вкладок
    delay: 0,                              // мс между страницами
    maxPages: 1000,                        // стоп + truncated: true в отчёте
    ignore: ['/admin/**'],                 // глобы — пропуск
    strategy: 'full',                      // 'full' | 'sitemap+sample'
    userAgent: 'custom UA',                // заодно выбирает группу robots.txt
    respectRobots: true,                   // не ходить по ссылкам, закрытым в <origin>/robots.txt (entry краулится всегда)
    insecureTls: true,                     // self-signed сертификаты dev/staging
    viewport: { width: 375, height: 812 },
    auth: {                                // staging за заглушкой
      headers: { 'X-Auth': '...' },
      basic: { username: '...', password: '...' },
      cookies: [{ name: '...', value: '...' }],
    },
  },

  robots: {                                // ожидания для ВНЕШНЕГО robots.txt
    mode: 'owner',                         // 'owner' | 'external'
    expect: {
      allow: ['/'], disallow: ['/admin'],
      sitemaps: ['https://example.com/sitemap.xml'],
      indexable: true,
    },
  },

  lighthouse: {
    enabled: true,
    runs: 5,                               // прогонов на URL
    aggregation: 'median',                 // 'median' | 'p75' | 'best'
    formFactor: 'mobile',                  // 'mobile' | 'desktop'
    maxUrls: 5,                            // потолок; без urls — первые 200-страницы краула
    runTimeout: 180000,                    // мс на прогон; зависший прогон пропускается, Chrome убивается
    urls: ['/', '/pricing'],               // точный список путей/URL, меряются даже вне краула
    thresholds: { '/listing/**': { performance: 90, lcp: 2500 } },
  },

  customChecks: [ /* defineCheck({...}) */ ],

  monitor: {
    storage: 'fs',                         // 'fs' | 's3'
    dir: '.ranklint/reports',              // для fs
    keep: 60,                              // ротация
    bucket: '...', prefix: '...', endpoint: '...', region: '...',  // для s3
  },

  profiles: {                              // накладываются defu поверх базы: --profile uat
    uat: { site: { url: 'https://uat.example.com' } },
  },
})
Приоритеты слоёв: сам конфиг > ранние элементы extends > поздние. Профиль накладывается патчем поверх базы. Локальные пути в extends требуют расширение файла (./preset.ts).insecureTls держите только в dev/local-профиле — в прод-аудит он попасть не должен.