Перейти к основному содержимому

Справочник API

Полный справочник @powerduck/conf-patch с сигнатурами и значениями по умолчанию для каждого экспортируемого символа.

Доступны две точки входа:

  • @powerduck/conf-patch — все перечисленные ниже возможности: ядро, файлы, проверка OpenAPI и утилиты.
  • @powerduck/conf-patch/core — только совместимая с браузером часть: patchContent, setContentValue, deleteContentValue, PatchContentOptions, проверочные функции и типы ConfigFormat, JsonPatchOp, JsonPathSegment.

Ядро (совместимо с браузером)​

patchContent​

Применяет массив операций RFC 6902 к строке конфигурации. Чистая функция без доступа к файловой системе.

function patchContent(
content: string,
ops: JsonPatchOp[],
format: ConfigFormat,
options?: PatchContentOptions,
): string;
ПараметрТипОписание
contentstringИсходное содержимое конфигурации. Должно соответствовать указанному format.
opsJsonPatchOp[]Операции, применяемые по порядку. Пустой массив возвращает content без изменений.
formatConfigFormat"json" | "jsonc" | "yaml".
options.strictbooleanПри true (по умолчанию) неудачная операция вызывает исключение. При false она пропускается с предупреждением через console.warn.

Возвращает: изменённое содержимое конфигурации (string).

Исключения: TypeError, если content не строка или ops некорректен; ошибка с описанием неудачной операции, если strict равен true.

import { patchContent } from "@powerduck/conf-patch/core";

patchContent(
'{"name": "app"}',
[{ op: "add", path: ["version"], value: "1.0.0" }],
"json",
);
// => '{\n "name": "app",\n "version": "1.0.0"\n}'

setContentValue​

Задаёт или создаёт одно значение. Внутри вызывает patchContent с одной операцией add. По RFC 6902 операция add заменяет существующее свойство объекта или вставляет элемент по индексу массива.

function setContentValue(
content: string,
path: readonly (string | number)[],
value: unknown,
format: ConfigFormat,
): string;
ПараметрТипОписание
contentstringИсходное содержимое конфигурации.
pathreadonly (string | number)[]Путь по сегментам, например ["server", "port"]. Не может быть пустым.
valueunknownЗаписываемое значение.
formatConfigFormatФормат конфигурации.

Возвращает: обновлённое содержимое (string).

setContentValue("server:\n port: 3000\n", ["server", "port"], 8080, "yaml");

deleteContentValue​

Удаляет ключ или элемент массива. Внутри вызывает patchContent с одной операцией remove. Путь должен существовать.

function deleteContentValue(
content: string,
path: readonly (string | number)[],
format: ConfigFormat,
): string;
deleteContentValue(
'{"name": "app", "legacy": true}',
["legacy"],
"json",
);

PatchContentOptions​

interface PatchContentOptions {
/** When true, failed operations throw. When false, they are skipped with a warning. Default: true */
strict?: boolean;
}

Файловый уровень (только Node.js / Electron)​

readConfigFile​

Читает текст UTF-8 по локальному пути или URL file://.

function readConfigFile(filePath: string): Promise<string>;
ПараметрТипОписание
filePathstringАбсолютный или относительный путь либо URL file://. Не может быть пустым.

Возвращает: исходное содержимое UTF-8 (Promise<string>).

Исключения: если чтение невозможно, ошибка, содержащая исходную ошибку файловой системы.


writeConfigFile​

Записывает содержимое атомарно через временный файл и переименование. По умолчанию используется исключительная блокировка файла. Родительские каталоги создаются до захвата блокировки.

function writeConfigFile(
filePath: string,
content: string,
options?: WriteConfigOptions,
): Promise<void>;
ПараметрТипОписание
filePathstringПуть к файлу конфигурации.
contentstringЗаписываемое содержимое. Должно быть строкой.
optionsWriteConfigOptionsСм. ниже.

Исключения: TypeError при некорректном вводе; ошибки файловой системы при записи оборачиваются.

WriteConfigOptions​

ОпцияТипПо умолчаниюОписание
lockbooleantrueВключить блокировку на время записи.
lockTimeoutMsnumberЗначение по умолчанию withFileLock (10 с)Максимальное время ожидания захвата блокировки, мс.
lockRetryDelayMsnumberЗначение по умолчанию withFileLock (25 мс)Начальная задержка повторной попытки в миллисекундах до экспоненциального увеличения.
lockStaleThresholdMsnumberЗначение по умолчанию withFileLockВозраст блокировки в миллисекундах, после которого разрешено восстановление.
allowStaleRecoverybooleanfalseРазрешить автоматическое восстановление устаревших блокировок.
import { writeConfigFile } from "@powerduck/conf-patch";

await writeConfigFile("config.json", '{"name": "app"}');

patchConfigFile​

Основная файловая транзакция: читает под блокировкой, применяет patchContent и атомарно записывает обратно только при изменении содержимого. Если options.format не задан, формат определяется по расширению.

function patchConfigFile(
filePath: string,
ops: JsonPatchOp[],
options?: PatchConfigOptions,
): Promise<void>;
ПараметрТипОписание
filePathstringПуть к файлу конфигурации. Не может быть пустым.
opsJsonPatchOp[]Применяемые операции. Пустой массив приводит к возврату без чтения и записи.
optionsPatchConfigOptionsСм. ниже.

Исключения: TypeError, если filePath пуст, опции блокировки некорректны или формат не определяется и не задан format; ошибка операции при strict, равном true.

PatchConfigOptions​

ОпцияТипПо умолчаниюОписание
formatConfigFormatопределяется автоматическиЯвный формат, имеющий приоритет над определением по расширению.
strictbooleantrueНеудачные операции вызывают исключения.
lockbooleantrueВключить блокировку файлов.
lockTimeoutMsnumber10 сНеотрицательное значение. Максимальное ожидание блокировки.
lockRetryDelayMsnumber25 мсПоложительное значение. Начальная задержка повторной попытки.
lockStaleThresholdMsnumberвычисляетсяПоложительное значение. Возраст блокировки для восстановления.
allowStaleRecoverybooleanfalseАвтоматически восстанавливать устаревшие блокировки.
await patchConfigFile("config.json", [
{ op: "replace", path: ["server", "host"], value: "0.0.0.0" },
{ op: "add", path: ["server", "ssl"], value: true },
{ op: "remove", path: ["legacySection"] },
]);

setConfigValue​

Добавляет или заменяет вложенное значение в файле. Передаёт одну операцию add в patchConfigFile.

function setConfigValue(
filePath: string,
path: readonly (string | number)[],
value: unknown,
options?: PatchConfigOptions,
): Promise<void>;
await setConfigValue("config.yaml", ["database", "port"], 5432);

deleteConfigValue​

Удаляет существующее вложенное значение из файла. Передаёт одну операцию remove в patchConfigFile.

function deleteConfigValue(
filePath: string,
path: readonly (string | number)[],
options?: PatchConfigOptions,
): Promise<void>;
await deleteConfigValue("config.json", ["features", "betaPreview"]);

withFileLock​

Выполняет асинхронный callback через локальную очередь процесса и исключительный файл блокировки (<file>.confedit.lock). Используются токены владельца. Устаревшая блокировка восстанавливается, только если allowStaleRecovery равен true и возраст превышает staleThresholdMs. PID намеренно не проверяются, поскольку могут использоваться повторно.

function withFileLock<T>(
filePath: string,
callback: () => Promise<T>,
options?: FileLockOptions,
): Promise<T>;
ПараметрТипОписание
filePathstringБлокируемый файл.
callback() => Promise<T>Работа, выполняемая при удержании блокировки.
optionsFileLockOptionsСм. ниже.

Возвращает: результат callback (Promise<T>). Блокировка всегда освобождается в блоке finally, даже при исключении в callback.

FileLockOptions​

ОпцияТипПо умолчаниюОписание
timeoutMsnumber10000Максимальное ожидание блокировки, мс. Должно быть неотрицательным.
retryDelayMsnumber25Начальная задержка, мс. Должна быть положительной. Увеличивается в 1,5 раза до предела 1000 мс.
staleThresholdMsnumbermax(timeoutMs * 2, 60000)Возраст блокировки, разрешающий восстановление, мс. Должен быть положительным.
allowStaleRecoverybooleanfalseАвтоматическое восстановление устаревших блокировок. По умолчанию отключено для единственного главного процесса Electron, чтобы не прерывать активные транзакции.
import { withFileLock } from "@powerduck/conf-patch";

await withFileLock("state.json", async () => {
// ... read, modify, write ...
}, { timeoutMs: 5000 });

releaseAllLocalLocks​

Удаляет все файлы блокировок текущего процесса. Используйте при завершении приложения после окончания активных файловых транзакций. Для асинхронной очистки Electron предотвратите первое событие выхода и возобновите выход после очистки, как показано в примерах. Ошибки отдельных блокировок игнорируются.

function releaseAllLocalLocks(): Promise<void>;

Проверка OpenAPI​

validateOpenAPISpec​

Проверяет исходное содержимое OpenAPI/Swagger в JSON или YAML. По умолчанию ввод считается содержимым; как путь он интерпретируется только при inputKind: "file". Проверку выполняет @powerduck/openapi-parser; эта функция добавляет защитные ограничения для ввода.

function validateOpenAPISpec(
input: string,
options?: ValidateOpenApiOptions,
): Promise<AnyOpenAPIDocument>;
ПараметрТипОписание
inputstringИсходное содержимое спецификации или путь к файлу при inputKind: "file".
optionsValidateOpenApiOptionsСм. ниже.

Возвращает: успешно проверенный документ (Promise<AnyOpenAPIDocument>).

Исключения: TypeError при пустом вводе или значении нестрокового типа; OpenApiValidationError при некорректных опциях или ошибках проверки.


validateOpenAPIFile​

Удобная обёртка, вызывающая validateOpenAPISpec с inputKind: "file" и указанным путём в baseFilePath. Требует allowedRootDirectory.

function validateOpenAPIFile(
filePath: string,
options?: ValidateOpenApiOptions,
): Promise<AnyOpenAPIDocument>;
import { validateOpenAPIFile } from "@powerduck/conf-patch";

const doc = await validateOpenAPIFile("./configs/openapi.yaml", {
allowedRootDirectory: "./configs",
});

ValidateOpenApiOptions​

ОпцияТипПо умолчаниюОписание
inputKind"content" | "file""content"Способ интерпретации input.
baseFilePathstring—Базовый путь для контекста разрешения ссылок.
allowedRootDirectorystring—Корневой каталог для файлового ввода. Обязателен, если inputKind равен "file".
timeoutMsnumber15000Предельное время операции, мс.
maxInputBytesnumber5242880 (5 МБ)Максимальный размер исходного ввода в байтах.
maxDocumentNodesnumber100000Максимальное число узлов разобранного документа для защиты от DoS.
maxDocumentDepthnumber100Максимальная глубина вложенности для защиты от DoS.
maxValidationErrorsnumber50Максимальное число ошибок в сообщении.
maxErrorMessageLengthnumber1000Максимальное число символов на одну ошибку проверки.
signalAbortSignal—Необязательный сигнал отмены.

OpenApiValidationError​

Структурированная ошибка проверки. Преобразуйте ошибки на границе приложения перед возвратом клиенту: сообщения и причины могут содержать локальные пути или детали документа.

class OpenApiValidationError extends Error {
readonly code: string;
readonly cause?: unknown;
constructor(code: string, message: string, cause?: unknown);
}
СвойствоТипОписание
codestringМашиночитаемый код ошибки; см. таблицу ниже.
messagestringПонятное пользователю описание.
causeunknownНеобязательная исходная ошибка.

Коды ошибок​

КодЗначение
INVALID_OPTIONПередано некорректное значение опции.
INPUT_TOO_LARGEИсходное содержимое превышает maxInputBytes.
INPUT_FILE_TOO_LARGEВходной файл превышает ограничение размера.
FILE_INPUT_FORBIDDENФайловый ввод использован без allowedRootDirectory.
PATH_OUTSIDE_ROOTРазрешённый путь находится за пределами allowedRootDirectory.
PARSE_ERRORНе удалось разобрать JSON/YAML.
INVALID_DOCUMENT_SHAPEДокумент не является JSON-объектом.
UNSUPPORTED_VERSIONДокумент не объявляет поддерживаемую версию OpenAPI/Swagger; допускаются только основные версии 2 и 3.
DOCUMENT_TOO_DEEPГлубина превышает maxDocumentDepth.
DOCUMENT_TOO_LARGEЧисло узлов превышает maxDocumentNodes.
SPEC_VALIDATION_FAILEDСпецификация не прошла проверку OpenAPI.
OPERATION_TIMEOUTОперация превысила timeoutMs.
OPERATION_ABORTEDОперация отменена через signal.
UNKNOWN_ERRORНепредвиденная ошибка.

Утилиты​

detectFormat​

Определяет ConfigFormat по расширению пути или URL file://.

function detectFormat(filePath: string): ConfigFormat;
РасширениеРезультат
.json"json"
.jsonc"jsonc"
.yaml, .yml"yaml"
любое другое расширениевызывает ошибку

normalizeFilePath​

Преобразует локальный путь или URL file: в абсолютный путь в формате системы. Сохраняет допустимые пробелы и имена файлов Unicode.

function normalizeFilePath(filePath: string): string;

URL file: декодируется через fileURLToPath; абсолютный путь возвращается как есть; относительный разрешается относительно process.cwd().


Проверочные функции​

Повторно экспортируются для расширенных сценариев и внутренних модулей. Код приложения редко нуждается в них напрямую.

assertNonEmptyString​

function assertNonEmptyString(value: unknown, label: string): asserts value is string;

Вызывает TypeError, если value не является непустой строкой.

assertPatchPath​

function assertPatchPath(
path: readonly (string | number)[],
label?: string, // default "path"
): void;

Вызывает исключение, если path не является непустым массивом непустых строк или безопасных неотрицательных целых чисел.

assertPatchOperations​

function assertPatchOperations(ops: JsonPatchOp[]): void;

Проверяет каждую операцию: op должен быть "add" | "replace" | "remove", path должен пройти assertPatchPath, а add/replace должны иметь собственное свойство value.

assertConfigFormat​

function assertConfigFormat(format: ConfigFormat): void;

Вызывает исключение, если format не равен "json", "jsonc" или "yaml".

getErrorMessage​

function getErrorMessage(error: unknown): string;

Возвращает error.message для экземпляров Error, иначе String(error).

createError​

function createError(message: string, cause: unknown): Error;

Создаёт Error и добавляет свойство cause через Object.defineProperty, с резервным способом для старых сред выполнения.


Типы​

ConfigFormat​

type ConfigFormat = "json" | "jsonc" | "yaml";

JsonPathSegment​

type JsonPathSegment = string | number;

JsonPatchOp​

interface JsonPatchOp {
op: "add" | "replace" | "remove";
path: JsonPathSegment[];
/** Required for "add" and "replace". */
value?: unknown;
}
предупреждение

Поддерживаются только "add", "replace" и "remove". "move", "copy" и "test" намеренно исключены.

PatchConfigOptions​

interface PatchConfigOptions {
format?: ConfigFormat;
strict?: boolean;
lock?: boolean;
lockTimeoutMs?: number;
lockRetryDelayMs?: number;
lockStaleThresholdMs?: number;
/** Whether stale locks can be automatically reclaimed. Defaults to false. */
allowStaleRecovery?: boolean;
}

FileLockOptions​

interface FileLockOptions {
/** Max time to wait for a lock. Defaults to 10 seconds. */
timeoutMs?: number;
/** Initial retry delay. Defaults to 25ms. */
retryDelayMs?: number;
/** Explicit lock age after which recovery is allowed. */
staleThresholdMs?: number;
/** Whether stale locks can be automatically reclaimed. Defaults to false. */
allowStaleRecovery?: boolean;
}

WriteConfigOptions​

interface WriteConfigOptions {
lock?: boolean;
lockTimeoutMs?: number;
lockRetryDelayMs?: number;
lockStaleThresholdMs?: number;
allowStaleRecovery?: boolean;
}

PatchContentOptions​

interface PatchContentOptions {
strict?: boolean;
}

OpenApiInputKind​

type OpenApiInputKind = "content" | "file";

AnyOpenAPIDocument​

Объединение поддерживаемых структур документов OpenAPI/Swagger, возвращаемых проверкой:

type AnyOpenAPIDocument =
| OpenAPIV2.Document // Swagger 2.0
| OpenAPIV3.Document // OpenAPI 3.0.x
| OpenAPIV3_1.Document // OpenAPI 3.1.x
| OpenAPIV3_2Document; // OpenAPI 3.2 (permissive structural type)

OpenAPIV3_2Document — структурный тип с широкими ограничениями:

interface OpenAPIV3_2Document {
openapi: string;
info: Record<string, unknown>;
paths?: Record<string, unknown>;
[key: string]: unknown;
}

Сводка экспортов​

СимволОсновной входПодпуть ядраКатегория
patchContent✓✓функция
setContentValue✓✓функция
deleteContentValue✓✓функция
PatchContentOptions✓✓тип
assertNonEmptyString✓✓функция
assertPatchPath✓✓функция
assertPatchOperations✓✓функция
assertConfigFormat✓✓функция
getErrorMessage✓✓функция
createError✓✓функция
ConfigFormat✓✓тип
JsonPatchOp✓✓тип
JsonPathSegment✓✓тип
readConfigFile✓—функция
writeConfigFile✓—функция
WriteConfigOptions✓—тип
patchConfigFile✓—функция
setConfigValue✓—функция
deleteConfigValue✓—функция
withFileLock✓—функция
releaseAllLocalLocks✓—функция
PatchConfigOptions✓—тип
FileLockOptions✓—тип
detectFormat✓—функция
normalizeFilePath✓—функция
validateOpenAPISpec✓—функция
validateOpenAPIFile✓—функция
OpenApiValidationError✓—класс
ValidateOpenApiOptions✓—тип
OpenApiInputKind✓—тип
AnyOpenAPIDocument✓—тип