Tham chiếu API
Tham chiếu đầy đủ cho @powerduck/conf-patch, gồm chữ ký và giá trị mặc định của từng thành phần xuất.
Có hai điểm nhập:
@powerduck/conf-patch— toàn bộ chức năng bên dưới: lớp lõi, lớp tệp, xác thực OpenAPI và tiện ích.@powerduck/conf-patch/core— chỉ phần tương thích trình duyệt:patchContent,setContentValue,deleteContentValue,PatchContentOptions, các hàm kiểm tra điều kiện và kiểuConfigFormat,JsonPatchOp,JsonPathSegment.
Lớp lõi (tương thích trình duyệt)
patchContent
Áp dụng mảng thao tác vá RFC 6902 cho chuỗi cấu hình. Đây là hàm thuần, không truy cập hệ thống tệp.
function patchContent(
content: string,
ops: JsonPatchOp[],
format: ConfigFormat,
options?: PatchContentOptions,
): string;
| Tham số | Kiểu | Mô tả |
|---|---|---|
content | string | Nội dung cấu hình thô, phải hợp lệ theo format đã chọn. |
ops | JsonPatchOp[] | Các thao tác áp dụng theo thứ tự. Mảng rỗng trả về content không đổi. |
format | ConfigFormat | "json" | "jsonc" | "yaml". |
options.strict | boolean | Với true (mặc định), thao tác thất bại phát sinh ngoại lệ. Với false, thao tác bị bỏ qua và được báo qua console.warn. |
Trả về: nội dung cấu hình đã sửa (string).
Ngoại lệ: TypeError nếu content không phải chuỗi hoặc ops không hợp lệ; lỗi mô tả thao tác thất bại khi strict là 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
Đặt hoặc tạo một giá trị. Bên trong gọi patchContent với một thao tác add. Theo RFC 6902, add thay thế thuộc tính đối tượng hiện có hoặc chèn tại chỉ số mảng.
function setContentValue(
content: string,
path: readonly (string | number)[],
value: unknown,
format: ConfigFormat,
): string;
| Tham số | Kiểu | Mô tả |
|---|---|---|
content | string | Nội dung cấu hình thô. |
path | readonly (string | number)[] | Đường dẫn theo đoạn, ví dụ ["server", "port"]. Không được rỗng. |
value | unknown | Giá trị cần ghi. |
format | ConfigFormat | Định dạng cấu hình. |
Trả về: nội dung đã cập nhật (string).
setContentValue("server:\n port: 3000\n", ["server", "port"], 8080, "yaml");
deleteContentValue
Xóa khóa hoặc phần tử mảng. Bên trong gọi patchContent với một thao tác remove. Đường dẫn phải tồn tại.
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;
}
Lớp tệp (chỉ Node.js / Electron)
readConfigFile
Đọc văn bản UTF-8 từ đường dẫn cục bộ hoặc URL file://.
function readConfigFile(filePath: string): Promise<string>;
| Tham số | Kiểu | Mô tả |
|---|---|---|
filePath | string | Đường dẫn tuyệt đối, tương đối hoặc URL file://. Không được rỗng. |
Trả về: nội dung UTF-8 thô (Promise<string>).
Ngoại lệ: khi không đọc được tệp, phát sinh lỗi bao gồm nguyên nhân từ hệ thống tệp.
writeConfigFile
Ghi nội dung nguyên tử qua tệp tạm rồi đổi tên, mặc định dùng khóa tệp độc quyền. Các thư mục cha được tạo trước khi lấy khóa.
function writeConfigFile(
filePath: string,
content: string,
options?: WriteConfigOptions,
): Promise<void>;
| Tham số | Kiểu | Mô tả |
|---|---|---|
filePath | string | Đường dẫn tệp cấu hình. |
content | string | Nội dung cần ghi. Phải là chuỗi. |
options | WriteConfigOptions | Xem bên dưới. |
Ngoại lệ: TypeError với đầu vào không hợp lệ; lỗi ghi của hệ thống tệp được bao bọc trong lỗi trả về.
WriteConfigOptions
| Tùy chọn | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
lock | boolean | true | Bật khóa tệp khi ghi. |
lockTimeoutMs | number | Mặc định của withFileLock (10 giây) | Thời gian chờ lấy khóa tối đa, tính bằng mili giây. |
lockRetryDelayMs | number | Mặc định của withFileLock (25 mili giây) | Độ trễ thử lại ban đầu, tính bằng mili giây, trước khi tăng theo cấp số nhân. |
lockStaleThresholdMs | number | Mặc định của withFileLock | Thời gian khóa đã tồn tại, tính bằng mili giây, sau đó cho phép khôi phục. |
allowStaleRecovery | boolean | false | Cho phép tự động thu hồi khóa đã cũ. |
import { writeConfigFile } from "@powerduck/conf-patch";
await writeConfigFile("config.json", '{"name": "app"}');
patchConfigFile
Giao dịch chính của lớp tệp: đọc trong khóa, áp dụng patchContent, rồi ghi lại nguyên tử chỉ khi nội dung thay đổi. Nếu bỏ qua options.format, định dạng được nhận diện từ phần mở rộng.
function patchConfigFile(
filePath: string,
ops: JsonPatchOp[],
options?: PatchConfigOptions,
): Promise<void>;
| Tham số | Kiểu | Mô tả |
|---|---|---|
filePath | string | Đường dẫn tệp cấu hình. Không được rỗng. |
ops | JsonPatchOp[] | Các thao tác cần áp dụng. Mảng rỗng trả về ngay mà không đọc hay ghi. |
options | PatchConfigOptions | Xem bên dưới. |
Ngoại lệ: TypeError nếu filePath rỗng, tùy chọn khóa không hợp lệ hoặc không nhận diện được định dạng và không có format; lỗi thao tác khi strict là true.
PatchConfigOptions
| Tùy chọn | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
format | ConfigFormat | tự động nhận diện | Định dạng chỉ định rõ, ưu tiên hơn nhận diện theo phần mở rộng. |
strict | boolean | true | Thao tác thất bại phát sinh ngoại lệ. |
lock | boolean | true | Bật khóa tệp. |
lockTimeoutMs | number | 10 giây | Không âm. Thời gian chờ khóa tối đa. |
lockRetryDelayMs | number | 25 mili giây | Số dương. Độ trễ thử lại ban đầu. |
lockStaleThresholdMs | number | được tính toán | Số dương. Thời gian tồn tại cần thiết để khôi phục khóa cũ. |
allowStaleRecovery | boolean | false | Tự động thu hồi khóa cũ. |
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
Thêm hoặc thay thế giá trị lồng nhau trong tệp. Chuyển một thao tác add cho patchConfigFile.
function setConfigValue(
filePath: string,
path: readonly (string | number)[],
value: unknown,
options?: PatchConfigOptions,
): Promise<void>;
await setConfigValue("config.yaml", ["database", "port"], 5432);
deleteConfigValue
Xóa giá trị lồng nhau hiện có khỏi tệp. Chuyển một thao tác remove cho patchConfigFile.
function deleteConfigValue(
filePath: string,
path: readonly (string | number)[],
options?: PatchConfigOptions,
): Promise<void>;
await deleteConfigValue("config.json", ["features", "betaPreview"]);
withFileLock
Chạy hàm gọi lại bất đồng bộ qua hàng đợi trong tiến trình và tệp khóa độc quyền (<file>.confedit.lock). Khóa dùng mã xác nhận quyền sở hữu. Chỉ khôi phục khóa cũ khi allowStaleRecovery là true và thời gian tồn tại vượt staleThresholdMs. Không kiểm tra PID vì PID có thể được tái sử dụng.
function withFileLock<T>(
filePath: string,
callback: () => Promise<T>,
options?: FileLockOptions,
): Promise<T>;
| Tham số | Kiểu | Mô tả |
|---|---|---|
filePath | string | Tệp cần khóa. |
callback | () => Promise<T> | Công việc thực hiện trong khi giữ khóa. |
options | FileLockOptions | Xem bên dưới. |
Trả về: kết quả của callback (Promise<T>). Khóa luôn được giải phóng trong khối finally, kể cả khi hàm gọi lại phát sinh ngoại lệ.
FileLockOptions
| Tùy chọn | Kiểu | Mặc định | Mô tả |
|---|---|---|---|
timeoutMs | number | 10000 | Thời gian chờ khóa tối đa, tính bằng mili giây. Phải không âm. |
retryDelayMs | number | 25 | Độ trễ ban đầu, tính bằng mili giây. Phải dương. Mỗi lần tăng 1,5 lần, tối đa 1000 mili giây. |
staleThresholdMs | number | max(timeoutMs * 2, 60000) | Thời gian tồn tại cho phép khôi phục khóa, tính bằng mili giây. Phải dương. |
allowStaleRecovery | boolean | false | Tự động thu hồi khóa cũ. Mặc định tắt cho tiến trình chính duy nhất của Electron để tránh gián đoạn giao dịch đang chạy. |
import { withFileLock } from "@powerduck/conf-patch";
await withFileLock("state.json", async () => {
// ... read, modify, write ...
}, { timeoutMs: 5000 });