Lewati ke konten utama

Referensi API

Referensi lengkap @powerduck/conf-patch, mencakup tanda tangan fungsi dan nilai bawaan setiap simbol yang diekspor.

Ada dua titik masuk:

  • @powerduck/conf-patch — semua fitur di bawah: lapisan inti, berkas, validasi OpenAPI, dan utilitas.
  • @powerduck/conf-patch/core — hanya bagian yang kompatibel dengan browser: patchContent, setContentValue, deleteContentValue, PatchContentOptions, fungsi asersi, serta tipe ConfigFormat, JsonPatchOp, JsonPathSegment.

Lapisan inti (kompatibel dengan browser)​

patchContent​

Menerapkan array operasi patch RFC 6902 pada string konfigurasi. Fungsi murni tanpa akses sistem berkas.

function patchContent(
content: string,
ops: JsonPatchOp[],
format: ConfigFormat,
options?: PatchContentOptions,
): string;
ParameterTipeDeskripsi
contentstringKonten konfigurasi mentah yang harus valid menurut format yang ditentukan.
opsJsonPatchOp[]Operasi yang diterapkan berurutan. Array kosong mengembalikan content tanpa perubahan.
formatConfigFormat"json" | "jsonc" | "yaml".
options.strictbooleanDengan true (bawaan), operasi yang gagal melempar pengecualian. Dengan false, operasi dilewati dan dilaporkan melalui console.warn.

Mengembalikan: konten konfigurasi yang telah diubah (string).

Pengecualian: TypeError jika content bukan string atau ops tidak valid; galat yang menjelaskan operasi gagal saat strict bernilai 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​

Mengatur atau membuat satu nilai. Secara internal memanggil patchContent dengan satu operasi add. Sesuai RFC 6902, add mengganti properti objek yang ada atau menyisipkan pada indeks array.

function setContentValue(
content: string,
path: readonly (string | number)[],
value: unknown,
format: ConfigFormat,
): string;
ParameterTipeDeskripsi
contentstringKonten konfigurasi mentah.
pathreadonly (string | number)[]Jalur per segmen, misalnya ["server", "port"]. Tidak boleh kosong.
valueunknownNilai yang akan ditulis.
formatConfigFormatFormat konfigurasi.

Mengembalikan: konten yang diperbarui (string).

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

deleteContentValue​

Menghapus kunci atau elemen array. Secara internal memanggil patchContent dengan satu operasi remove. Jalur harus ada.

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;
}

Lapisan berkas (khusus Node.js / Electron)​

readConfigFile​

Membaca teks UTF-8 dari jalur lokal atau URL file://.

function readConfigFile(filePath: string): Promise<string>;
ParameterTipeDeskripsi
filePathstringJalur absolut, relatif, atau URL file://. Tidak boleh kosong.

Mengembalikan: konten UTF-8 mentah (Promise<string>).

Pengecualian: jika berkas tidak dapat dibaca, galat yang membungkus kegagalan sistem berkas yang mendasarinya.


writeConfigFile​

Menulis konten secara atomik melalui berkas sementara dan penggantian nama, dengan kunci berkas eksklusif secara bawaan. Direktori induk dibuat sebelum penguncian.

function writeConfigFile(
filePath: string,
content: string,
options?: WriteConfigOptions,
): Promise<void>;
ParameterTipeDeskripsi
filePathstringJalur berkas konfigurasi.
contentstringKonten yang ditulis. Harus berupa string.
optionsWriteConfigOptionsLihat di bawah.

Pengecualian: TypeError untuk masukan tidak valid; kegagalan penulisan sistem berkas dibungkus dalam galat.

WriteConfigOptions​

OpsiTipeBawaanDeskripsi
lockbooleantrueMengaktifkan penguncian selama penulisan.
lockTimeoutMsnumberBawaan withFileLock (10 detik)Waktu tunggu maksimum untuk memperoleh kunci, dalam milidetik.
lockRetryDelayMsnumberBawaan withFileLock (25 milidetik)Jeda awal percobaan ulang, dalam milidetik, sebelum kenaikan eksponensial.
lockStaleThresholdMsnumberBawaan withFileLockUsia kunci dalam milidetik yang mengizinkan pemulihan.
allowStaleRecoverybooleanfalseMengizinkan pengambilan kembali kunci kedaluwarsa secara otomatis.
import { writeConfigFile } from "@powerduck/conf-patch";

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

patchConfigFile​

Transaksi utama lapisan berkas: membaca di dalam kunci, menerapkan patchContent, lalu menulis kembali secara atomik hanya jika konten berubah. Tanpa options.format, format dideteksi dari ekstensi.

function patchConfigFile(
filePath: string,
ops: JsonPatchOp[],
options?: PatchConfigOptions,
): Promise<void>;
ParameterTipeDeskripsi
filePathstringJalur berkas konfigurasi. Tidak boleh kosong.
opsJsonPatchOp[]Operasi yang diterapkan. Array kosong langsung kembali tanpa membaca atau menulis.
optionsPatchConfigOptionsLihat di bawah.

Pengecualian: TypeError jika filePath kosong, opsi kunci tidak valid, atau format tidak dapat dideteksi dan format tidak diberikan; galat operasi saat strict bernilai true.

PatchConfigOptions​

OpsiTipeBawaanDeskripsi
formatConfigFormatdeteksi otomatisFormat eksplisit, mengesampingkan deteksi ekstensi.
strictbooleantrueOperasi yang gagal melempar pengecualian.
lockbooleantrueMengaktifkan penguncian berkas.
lockTimeoutMsnumber10 detikTidak negatif. Waktu tunggu maksimum untuk kunci.
lockRetryDelayMsnumber25 milidetikPositif. Jeda awal percobaan ulang.
lockStaleThresholdMsnumberdihitungPositif. Usia kunci yang diperlukan untuk pemulihan.
allowStaleRecoverybooleanfalseMengambil kembali kunci kedaluwarsa secara otomatis.
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​

Menambahkan atau mengganti nilai bertingkat dalam berkas. Mendelegasikan satu operasi add ke patchConfigFile.

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

deleteConfigValue​

Menghapus nilai bertingkat yang ada dari berkas. Mendelegasikan satu operasi remove ke patchConfigFile.

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

withFileLock​

Menjalankan callback asinkron melalui antrean lokal proses dan berkas kunci eksklusif (<file>.confedit.lock). Kunci menggunakan token kepemilikan. Kunci kedaluwarsa hanya dipulihkan jika allowStaleRecovery bernilai true dan usianya melampaui staleThresholdMs. PID sengaja tidak diperiksa karena dapat digunakan kembali.

function withFileLock<T>(
filePath: string,
callback: () => Promise<T>,
options?: FileLockOptions,
): Promise<T>;
ParameterTipeDeskripsi
filePathstringBerkas yang dikunci.
callback() => Promise<T>Pekerjaan yang dijalankan selama kunci dipegang.
optionsFileLockOptionsLihat di bawah.

Mengembalikan: hasil callback (Promise<T>). Kunci selalu dilepas dalam blok finally, meskipun callback melempar pengecualian.

FileLockOptions​

OpsiTipeBawaanDeskripsi
timeoutMsnumber10000Waktu tunggu maksimum kunci dalam milidetik. Harus tidak negatif.
retryDelayMsnumber25Jeda awal dalam milidetik. Harus positif. Jeda naik 1,5 kali hingga maksimum 1000 milidetik.
staleThresholdMsnumbermax(timeoutMs * 2, 60000)Usia kunci yang mengizinkan pemulihan, dalam milidetik. Harus positif.
allowStaleRecoverybooleanfalsePemulihan otomatis kunci kedaluwarsa. Nonaktif secara bawaan untuk proses utama tunggal Electron agar transaksi aktif tidak terputus.
import { withFileLock } from "@powerduck/conf-patch";

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

releaseAllLocalLocks​

Menghapus semua berkas kunci milik proses saat ini. Gunakan saat aplikasi ditutup, setelah transaksi berkas aktif selesai. Untuk pembersihan asinkron di Electron, cegah peristiwa keluar pertama lalu lanjutkan keluar setelah pembersihan selesai, seperti pada contoh. Kegagalan tiap kunci diabaikan.

function releaseAllLocalLocks(): Promise<void>;

Validasi OpenAPI​

validateOpenAPISpec​

Memvalidasi konten OpenAPI/Swagger mentah dalam JSON atau YAML. Masukan dianggap sebagai konten secara bawaan; hanya ditafsirkan sebagai jalur dengan inputKind: "file". Validasi didelegasikan ke @powerduck/openapi-parser; fungsi ini menambahkan perlindungan pada penanganan masukan.

function validateOpenAPISpec(
input: string,
options?: ValidateOpenApiOptions,
): Promise<AnyOpenAPIDocument>;
ParameterTipeDeskripsi
inputstringKonten spesifikasi mentah, atau jalur berkas dengan inputKind: "file".
optionsValidateOpenApiOptionsLihat di bawah.

Mengembalikan: dokumen yang tervalidasi saat berhasil (Promise<AnyOpenAPIDocument>).

Pengecualian: TypeError untuk masukan kosong atau bukan string; OpenApiValidationError untuk opsi tidak valid atau kegagalan validasi.


validateOpenAPIFile​

Fungsi praktis yang memanggil validateOpenAPISpec dengan inputKind: "file" dan baseFilePath berisi jalur yang diberikan. Memerlukan 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​

OpsiTipeBawaanDeskripsi
inputKind"content" | "file""content"Cara menafsirkan input.
baseFilePathstring—Jalur dasar untuk konteks resolusi referensi.
allowedRootDirectorystring—Direktori akar masukan berkas. Wajib jika inputKind adalah "file".
timeoutMsnumber15000Batas waktu operasi, dalam milidetik.
maxInputBytesnumber5242880 (5 MB)Ukuran maksimum masukan mentah, dalam byte.
maxDocumentNodesnumber100000Jumlah maksimum simpul dokumen yang diurai, untuk perlindungan DoS.
maxDocumentDepthnumber100Kedalaman maksimum struktur bertingkat, untuk perlindungan DoS.
maxValidationErrorsnumber50Jumlah maksimum galat dalam pesan.
maxErrorMessageLengthnumber1000Jumlah maksimum karakter per galat validasi.
signalAbortSignal—Sinyal pembatalan opsional.

OpenApiValidationError​

Galat terstruktur saat validasi gagal. Petakan galat pada batas aplikasi sebelum mengembalikannya ke klien; pesan dan penyebab dapat memuat jalur lokal atau detail dokumen.

class OpenApiValidationError extends Error {
readonly code: string;
readonly cause?: unknown;
constructor(code: string, message: string, cause?: unknown);
}
PropertiTipeDeskripsi
codestringKode galat yang dapat diproses program; lihat tabel berikut.
messagestringDetail yang dapat dibaca pengguna.
causeunknownGalat dasar opsional.

Kode galat​

KodeArti
INVALID_OPTIONNilai opsi yang diberikan tidak valid.
INPUT_TOO_LARGEKonten mentah melebihi maxInputBytes.
INPUT_FILE_TOO_LARGEBerkas masukan melebihi batas ukuran.
FILE_INPUT_FORBIDDENMasukan berkas digunakan tanpa allowedRootDirectory.
PATH_OUTSIDE_ROOTJalur berkas yang diselesaikan berada di luar allowedRootDirectory.
PARSE_ERRORGagal mengurai konten JSON/YAML.
INVALID_DOCUMENT_SHAPEDokumen bukan objek JSON.
UNSUPPORTED_VERSIONDokumen tidak menyatakan versi OpenAPI/Swagger yang didukung; hanya versi utama 2 dan 3 yang diterima.
DOCUMENT_TOO_DEEPKedalaman melebihi maxDocumentDepth.
DOCUMENT_TOO_LARGEJumlah simpul melebihi maxDocumentNodes.
SPEC_VALIDATION_FAILEDSpesifikasi gagal dalam validasi OpenAPI.
OPERATION_TIMEOUTOperasi melampaui timeoutMs.
OPERATION_ABORTEDOperasi dibatalkan melalui signal.
UNKNOWN_ERRORGalat tak terduga.

Utilitas​

detectFormat​

Mendeteksi ConfigFormat dari ekstensi jalur berkas atau URL file://.

function detectFormat(filePath: string): ConfigFormat;
EkstensiHasil
.json"json"
.jsonc"jsonc"
.yaml, .yml"yaml"
ekstensi lainnyamelempar galat

normalizeFilePath​

Mengubah jalur lokal atau URL file: menjadi jalur native absolut. Mempertahankan spasi yang valid dan nama berkas Unicode.

function normalizeFilePath(filePath: string): string;

URL file: didekodekan dengan fileURLToPath; jalur absolut dikembalikan apa adanya; jalur relatif diselesaikan terhadap process.cwd().


Fungsi asersi​

Diekspor ulang untuk penggunaan lanjutan dan modul internal. Kode aplikasi jarang perlu memanggilnya langsung.

assertNonEmptyString​

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

Melempar TypeError jika value bukan string yang tidak kosong.

assertPatchPath​

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

Melempar pengecualian jika path bukan array tidak kosong yang segmennya berupa string tidak kosong atau bilangan bulat aman yang tidak negatif.

assertPatchOperations​

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

Memvalidasi setiap operasi: op harus "add" | "replace" | "remove", path harus lolos assertPatchPath, dan add/replace harus memiliki properti sendiri value.

assertConfigFormat​

function assertConfigFormat(format: ConfigFormat): void;

Melempar pengecualian jika format bukan "json", "jsonc", atau "yaml".

getErrorMessage​

function getErrorMessage(error: unknown): string;

Mengembalikan error.message untuk instans Error, selain itu String(error).

createError​

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

Membuat Error dan menambahkan properti cause melalui Object.defineProperty, dengan cara alternatif untuk runtime lama.


Tipe​

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;
}
waspada

Hanya "add", "replace", dan "remove" yang didukung. "move", "copy", dan "test" sengaja tidak disertakan.

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​

Union bentuk dokumen OpenAPI/Swagger yang didukung dan dikembalikan oleh validasi:

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 adalah tipe struktural yang longgar:

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

Ringkasan ekspor​

SimbolTitik masuk utamaSubjalur intiJenis
patchContent✓✓fungsi
setContentValue✓✓fungsi
deleteContentValue✓✓fungsi
PatchContentOptions✓✓tipe
assertNonEmptyString✓✓fungsi
assertPatchPath✓✓fungsi
assertPatchOperations✓✓fungsi
assertConfigFormat✓✓fungsi
getErrorMessage✓✓fungsi
createError✓✓fungsi
ConfigFormat✓✓tipe
JsonPatchOp✓✓tipe
JsonPathSegment✓✓tipe
readConfigFile✓—fungsi
writeConfigFile✓—fungsi
WriteConfigOptions✓—tipe
patchConfigFile✓—fungsi
setConfigValue✓—fungsi
deleteConfigValue✓—fungsi
withFileLock✓—fungsi
releaseAllLocalLocks✓—fungsi
PatchConfigOptions✓—tipe
FileLockOptions✓—tipe
detectFormat✓—fungsi
normalizeFilePath✓—fungsi
validateOpenAPISpec✓—fungsi
validateOpenAPIFile✓—fungsi
OpenApiValidationError✓—kelas
ValidateOpenApiOptions✓—tipe
OpenApiInputKind✓—tipe
AnyOpenAPIDocument✓—tipe