@powerduck/conf-patch
@powerduck/conf-patch مكتبة لتحرير الإعدادات تعتمد بنية من طبقتين. تطبّق دلالات RFC 6902 JSON Patch على سلاسل JSON وJSONC وYAML مع الحفاظ على التعليقات والتنسيق، وتوفّر كتابة ذرّية وأقفال ملفات بين العمليات في Node.js وElectron.
- الإصدار:
- الترخيص: MIT
- متطلبات Node.js:
>= 22.12.0 - الشيفرة المصدرية: github.com/powerducklab/conf-patch
لماذا conf-patch؟
غالبًا ما يتطلب تحرير ملفات الإعدادات برمجيًا الاختيار بين إعادة تسلسل المستند كاملًا، مما قد يغيّر التعليقات والتنسيق، وبين معالجة نصية يدوية عرضة للأخطاء. توفّر conf-patch ما يلي:
- تعديلات تدريجية تحافظ على التعليقات في JSON/JSONC باستخدام
jsonc-parser، وتعديل شجرة AST في YAML باستخدامyaml. لا يُعاد تسلسل JSON/JSONC كاملًا؛ أما YAML فيُعاد تسلسل شجرته المعدّلة. - كتابة ذرّية عبر ملف مؤقت ثم إعادة تسميته، لتجنّب ترك الملف المستهدف مكتوبًا جزئيًا.
- أقفال بين العمليات مع رموز ملكية، وفترات انتظار متزايدة أُسّيًا بين المحاولات، واستعادة الأقفال القديمة.
- واجهة تعمل في بيئات متعدد ة: تعمل الطبقة الأساسية أيضًا في المتصفحات ودوال Edge والتطبيقات التي تستخدم تخزين IndexedDB.
بنية من طبقتين
┌──────────────────────────────────────────────────────────────┐
│ Application code │
├──────────────────────────────────────────────────────────────┤
│ File layer (Node.js / Electron only) │
│ ┌───────────────┐ ┌────────────────┐ ┌──────────────────┐ │
│ │ readConfigFile │ │ writeConfigFile│ │ patchConfigFile │ │
│ │ setConfigValue │ │ deleteConfig… │ │ withFileLock │ │
│ └──────┬────────┘ └───────┬────────┘ └────────┬─────────┘ │
│ │ │ │ │
│ ┌──────▼──────────────────▼───────────────────▼───────────┐ │
│ │ Core layer (browser-safe, zero Node deps) │ │
│ │ patchContent setContentValue deleteContentValue │ │
│ └──────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
الطبقة الأساسية — @powerduck/conf-patch/core (متوافقة مع المتصفح)
دوال نقية تتعامل مع السلاسل النصية، دون الاعتماد على node:fs أو node:path أو واجهات خاصة بـ Node.js. يمكن تضمين هذا المسار الفرعي في شيفرة المتصفح أو دوال Edge أو عامل الخدمة.
| الدالة | الغرض |
|---|---|
patchContent | تطبيق عمليات RFC 6902 على سلسلة إعدادات |
setContentValue | تعيين قيمة متداخلة أو إنشاؤها باستخدام add |
deleteContentValue | حذف مفتاح أو عنصر مصفوفة باستخدام remove |
طبقة الملفات — @powerduck/conf-patch (Node.js / Electron)
دوال غير متزامنة لقراءة الملفات الفعلية وكتابتها، تضيف الكتابة الذرّية والأقفال إلى الطبقة الأساسية.
| الدالة | الغرض |
|---|---|
readConfigFile | قراءة نص UTF-8 من مسار ملف أو عنوان file:// |
writeConfigFile | كتابة المحتوى ذرّيًا مع قفل اختياري |
patchConfigFile | تنفيذ معاملة قراءة وتعديل وكتابة ضمن قفل الملف |
setConfigValue | تعيين قيمة متداخلة في ملف |
deleteConfigValue | حذف قيمة متداخلة من ملف |
withFileLock | تنفيذ مهمة تحت قفل حصري |
releaseAllLocalLocks | تحرير جميع الأقفال التي تملكها العملية الحالية |
التنسيقات المدعومة
| التنسيق | الامتداد | السلوك |
|---|---|---|
| JSON | .json | JSON قياسي مع تعديلات تدريجية باستخدام jsonc-parser. |
| JSONC | .jsonc | JSON مع تعليقات وفواصل ختامية. تُحفَظ التعليقات. |
| YAML | .yaml, .yml | YAML 1.2. يحافظ تعديل AST على التعليقات والمراسي والمسافات البادئة. |
تربط detectFormat امتداد الملف بنوع ConfigFormat. تؤدي الامتدادات الأخرى إلى خطأ ما لم تحدد format صراحةً.
عمليات RFC 6902
تطبّق conf-patch جزءًا محددًا من RFC 6902. العمليات المدعومة هي فقط:
op | السلوك |
|---|---|
"add" | الإدراج عند فهرس مصفوفة، أو إضافة خاصية كائن أو استبدالها |
"replace" | استبدال قيمة موجودة؛ يجب أن يكون المسار موجودًا |
"remove" | حذف مفتاح أو عنصر مصفوفة موجود؛ يجب أن يكون المسار موجودًا |
العمليات "move" و"copy" و"test" غير مدعومة. يقصر النوع JsonPatchOp قيمة op على "add" | "replace" | "remove".
ملاحظات على السلوك:
- تؤدي
addعند فهرس مصفوفة إلى إدراج عنصر وفق RFC 6902. استخدمreplaceلاستبدال عنصر موجود. - تتطلب
addوجود المسار الأب مسبقًا. أنشئ الآباء قبل الأبناء. - تتطلب
replaceوremoveوجود المسار المستهدف. - عند استخدام
strict: true، وهو الافتراضي، تؤدي العملية الفاشلة إلى استثناء. وعند استخدامstrict: false، تُتخطى العملية ويُسجّل تحذير.