Vars Service
Vars Service отвечает за управление переменными в Diplodoc. Этот сервис позволяет работать с пресетами переменных, определенными в файлах presets.yaml
, и применять их к документации.
Основные возможности
- Загрузка и управление пресетами из файлов
presets.yaml
- Иерархическая система пресетов с поддержкой наследования
- Поддержка различных окружений через пресеты
- Доступ к переменным через прокси-объект
Получение доступа к сервису
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('MyExtension', (run) => {
// Получение сервиса из контекста
const {vars} = run;
// Получение хуков сервиса
const varsHooks = getVarsHooks(vars);
});
}
}
Доступные хуки
PresetsLoaded
Хук вызывается после загрузки пресетов из файла. Позволяет модифицировать загруженные пресеты.
varsHooks.PresetsLoaded.tap('MyExtension', (presets, path) => {
// Модификация пресетов
return presets;
});
Resolved
Хук вызывается после разрешения переменных на любом уровне. Данные переменных на этом этапе заморожены (sealed).
varsHooks.Resolved.tap('MyExtension', (vars, path) => {
// Обработка разрешенных переменных
});
API сервиса
Метод init
Инициализирует сервис, загружая все файлы presets.yaml
из директории input
.
// Инициализация сервиса
await varsService.init();
Метод for
Возвращает прокси-объект с доступом к переменным для указанного пути.
Параметры:
path
- относительный путь к файлу
Возвращает:
- Прокси-объект с доступом к переменным
// Получение переменных для конкретного пути
const vars = varsService.for('path/to/file.md');
// Доступ к переменным
console.log(vars.version);
console.log(vars['version']);
Метод dump
Преобразует объект с пресетами в YAML-строку.
Параметры:
presets
- объект с пресетами
Возвращает:
- YAML-строку
// Дамп пресетов в YAML
const yaml = varsService.dump({
default: {
version: "1.0.0"
}
});
entries
Свойство Возвращает объект со всеми загруженными пресетами.
Возвращает:
- Объект, где ключ - нормализованный путь к директории, значение - пресеты
// Получение всех загруженных пресетов
const entries = varsService.entries;
Работа с пресетами
Пресеты загружаются из файлов presets.yaml
и имеют следующую структуру:
# Корневой presets.yaml
default:
version: "1.0.0"
environment: "production"
# Поддиректория/subfolder/presets.yaml
default:
subfolder_var: "value"
# Переопределяет значение из родительского пресета
version: "2.0.0"
При обращении к переменным через varsService.for(path)
происходит следующее:
- Определяется иерархия директорий для пути
- Для каждой директории проверяется наличие
presets.yaml
- Переменные объединяются в следующем порядке:
- Переменные из конфигурации (
config.vars
) - Пресеты из текущей директории
- Пресеты из родительских директорий
- Переменные из конфигурации (
Пример
// Структура директорий:
// /docs
// presets.yaml
// /api
// presets.yaml
// page.md
// /docs/presets.yaml
default:
version: "1.0.0"
environment: "production"
// /docs/api/presets.yaml
default:
api_version: "2.0.0"
version: "2.0.0" // Переопределяет версию из родительского пресета
// Получение переменных для /docs/api/page.md
const vars = varsService.for('api/page.md');
// Доступ к переменным
console.log(vars.version); // "2.0.0"
console.log(vars.environment); // "production"
console.log(vars.api_version); // "2.0.0"
Конфигурация
Сервис можно настроить при создании через параметр options
:
const varsService = new VarsService(run, {
// Отключить загрузку presets.yaml
usePresets: false
});
Примеры использования
Работа с пресетами
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('PresetProcessor', (run) => {
const varsHooks = getVarsHooks(run.vars);
varsHooks.PresetsLoaded.tap('PresetProcessor', (presets, path) => {
// Добавляем новые поля в пресеты
return {
...presets,
default: {
...presets.default,
newField: 'value'
}
};
});
});
}
}
Интеграция с другими сервисами
export class Extension {
apply(program: Build) {
getBaseHooks(program).BeforeAnyRun.tap('ServiceIntegration', (run) => {
const {vars, meta} = run;
// Получение переменных для страницы
const pageVars = vars.for('path/to/page.md');
// Использование переменных в метаданных
meta.addMetadata('path/to/page.md', {
title: pageVars.title,
description: pageVars.description
});
});
}
}