فرق تبعيات package.json
قارن بين قائمتي تبعيات من package.json لترى ما تغيّر فعلًا: انتقل react من ^17.0.2 إلى ^18.2.0، وأُضيف axios، وحُذف moment، وبقي lodash كما هو. لا يُحتسب التنسيق ولا ترتيب المفاتيح. مجاني في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
تعمل هذه الأداة داخل متصفحك — مجانًا، ولا تُرسل بياناتك إلى أي خادم
مقارنة كتل التبعيات بين لقطتي package.json مهمة يومية في مراجعات الإصدار والترقيات وتدقيقات طلبات السحب. يخلط فرق النص أو الأسطر ضوضاء التنسيق وترتيب المفاتيح والحقول غير ذات الصلة بالإشارة التي تهمّكم: أي الحزم ظهرت، وأيها غادرت، وأي نطاقات الإصدار تحرّكت. يقبل فرق تبعيات package.json هذا كائنين بسيطين — كلٌّ منهما خريطة من اسم الحزمة إلى سلسلة نطاق الإصدار، تمامًا كما في dependencies وdevDependencies وpeerDependencies أو optionalDependencies — ويعيد قوائم منظّمة للحزم المضافة والمزالة والمتغيّرة مع المدخلات غير المتغيّرة والعدادات.
ما الذي يبلغ عنه فرق التبعيات الدلالي
يعامل فرق التبعيات الدلالي كل اسم حزمة كعنصر مجموعة وكل حقل إصدار كتسمية سلسلة مرتبطة بذلك الاسم. أي اسم موجود في after فقط يُبلَغ عنه ضمن added مع نطاق إصداره الجديد. أي اسم موجود في before فقط يُبلَغ عنه ضمن removed مع الإصدار الذي كان لديه.
الأسماء الموجودة في الخريطتين بسلاسل إصدار غير متساوية تظهر ضمن changed بحقول from وto. الأسماء ذات السلاسل المتطابقة تظهر ضمن unchanged حتى تتمكنوا من جرد الجزء المستقر من السطح المُعلَن. تتيح عدّادات كل مجموعة وإجماليات الخريطتين للوحات العرض رسم شارات دون إعادة عدّ المصفوفات.
المقارنة سطحية عن قصد: لا توسّع نطاقات caret، ولا تحلّ سجل npm، ولا تقيّم ما إذا كان ^17.0.0 و17.0.2 سيثبّتان الشجرة نفسها. يبقي ذلك الأداة حتمية ودون شبكة ومناسبة لبوابات CI التي تحتاج فقط إلى معرفة ما إذا تحرّك كائن التبعيات المُعلَن.
أين يبرّر فرق تبعيات package.json قيمته
يجمّد مديرو الإصدار كائن تبعيات معروف الجودة قبل موجة ترقية ويعيدون الفرق بعد دفعات Dependabot أو Renovate الآلية لتأكيد مجموعة الارتفاعات المقصودة. تربط مسارات مراجعة الأمن هذا الخرج المنظّم باستعلامات التنبيهات: يكفي مسح CVE لاتحاد أسماء الحزم المضافة والمتغيّرة عندما يبقى باقي الشجرة دون تغيير. يستفيد المحتوى التعليمي وصفحات SEO التي تترتب على فرق تبعيات package.json من ودجت مجاني في المتصفح يطابق مسار الأتمتة المدفوع على الوحدة النقية نفسها، فلا تختلف أمثلة التوثيق عن الإنتاج.
أبقوا الخرائط معتدلة، وثبّتوا المصفوفات المرتبة في الاختبارات، لتحصلوا على تقارير قابلة لإعادة الإنتاج عن تغيّر التبعيات لـ CI ومراجعة الشيفرة وقوائم الهجرة دون إقامة محلّل lockfile كامل.
حالات الاستخدام
ملخصات التبعيات في طلبات السحب
قارِنوا كائني تبعيات package.json للأساس والرأس وانشروا على طلب السحب فقط الحزم المضافة أو المزالة أو المتغيّرة الإصدار.
مراجعة دفعات الترقية وRenovate
قارِنوا خريطة التبعيات قبل وبعد دفعة ترقية آلية للتحقق من الارتفاعات المقصودة واكتشاف الإزالات المفاجئة.
قوائم إعادة فحص أمني مركّزة
غذّوا ماسحات التنبيهات بأسماء الحزم المضافة والمتغيّرة حتى لا تُعاد فحص الحزم غير المتغيّرة عند كل إيداع.
الأسئلة الشائعة
هل يحلّ نطاقات semver مقابل السجل؟
لا. تُقارَن مواصفات الإصدار كسلاسل دقيقة. يُعامل ^1.0.0 و1.0.0 كتغيير حتى لو أمكن لكليهما تثبيت الإصدار نفسه.
هل يمكن تمرير devDependencies أو peerDependencies؟
نعم. أي خريطة اسم→إصدار تعمل — dependencies أو devDependencies أو peerDependencies أو optionalDependencies أو كائن مدمج تبنونه بأنفسكم.
لماذا لا أقارن الملفين سطرًا بسطر؟
مقارنة الأسطر تخلط ضوضاء التنسيق وترتيب المفاتيح والأقسام الأخرى بما يهمك فعلًا. أما هنا فيُقارَن اسم كل حزمة بنص إصدارها، فلا ترى إلا الحزم التي أُضيفت أو حُذفت أو تغيّر إصدارها.
هل تظهر الحزم التي لم تتغير أيضًا؟
نعم. توضع الحزم ذات نص الإصدار المتطابق في قائمة خاصة بها، لتتمكن من حصر الجزء المستقر. وتأتي كل القوائم مرتبة أبجديًا مع عدد عناصرها.
كيف يفيد ذلك في مراجعة الأمان؟
عندما يبقى معظم الشجرة كما هو، لا تحتاج إلى فحص جديد للتحذيرات إلا الحزم المضافة والتي تغيّر إصدارها. مرّر هذه الأسماء إلى أداة الفحص بدل إعادة فحص كل الحزم مع كل تعديل.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev/semantic-diff-package-json \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"before":{"react":"^17.0.2","lodash":"^4.17.21","moment":"^2.29.4"},"after":{"react":"^18.2.0","lodash":"^4.17.21","axios":"^1.6.0"}}'const res = await fetch("https://api.kit.forhosting.com/dev/semantic-diff-package-json", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"before": {
"react": "^17.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
},
"after": {
"react": "^18.2.0",
"lodash": "^4.17.21",
"axios": "^1.6.0"
}
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/semantic-diff-package-json",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"before": {
"react": "^17.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
},
"after": {
"react": "^18.2.0",
"lodash": "^4.17.21",
"axios": "^1.6.0"
}
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/semantic-diff-package-json", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"before":{"react":"^17.0.2","lodash":"^4.17.21","moment":"^2.29.4"},"after":{"react":"^18.2.0","lodash":"^4.17.21","axios":"^1.6.0"}}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"before":{"react":"^17.0.2","lodash":"^4.17.21","moment":"^2.29.4"},"after":{"react":"^18.2.0","lodash":"^4.17.21","axios":"^1.6.0"}}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/semantic-diff-package-json", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"before": {
"react": "^17.0.2",
"lodash": "^4.17.21",
"moment": "^2.29.4"
},
"after": {
"react": "^18.2.0",
"lodash": "^4.17.21",
"axios": "^1.6.0"
}
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.semantic_diff_package_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
الخوارزمية مقارنة مجموعات خالصة بمساواة السلاسل على مواصفات الإصدار، لذا يتفق ودجت المتصفح المجاني ومسار API دائمًا. تفشل المدخلات غير الكائنات بـ invalid_input ولا تُحصَّل.
ما الذي يبلغ عنه فرق التبعيات الدلالي
خريطة الأساس هي before؛ والخريطة المرشّحة هي after. الصقوا dependencies أو devDependencies أو عرضًا مدمجًا بنيتموه بأنفسكم — تحتاج نقطة النهاية فقط إلى كائنين بمواصفات إصدار قيمها سلاسل.
عقد الإدخال وشكل الاستجابة والأخطاء
يجب أن يكون كلٌّ منهما كائنًا بسيطًا، لا مصفوفة ولا null ولا قيمة أولية. تصبح أسماء الحزم مفاتيح الكائن؛ ويجب أن تكون نطاقات الإصدار سلاسل أو قيماً بسيطة تتحوّل إلى سلاسل نظيفة — تُرفض الكائنات المتداخلة كقيم إصدار. الكائنات الفارغة صالحة وتعني مجموعة تبعيات فارغة. عند النجاح يتضمن الجسم مصفوفات added وremoved وchanged وunchanged مرتّبة أبجديًا حسب اسم الحزمة؛ لكل عنصر مضاف أو مُزال name وversion، ولكل متغيّر name وfrom وto، ولكل غير متغيّر name وversion. أرسلوا جسم JSON بحقلَي كائن مطلوبين: before (أسماء بديلة left وold وprevious) وafter (أسماء بديلة right وnew وnext). العدادات العددية added_count وremoved_count وchanged_count وunchanged_count وtotal_before وtotal_after تعكس المصفوفات. القيمة المنطقية has_changes تكون true عندما تُضاف حزمة أو تُزال أو تتغيّر إصداراً. إذا كان before أو after مفقودًا أو مصفوفة أو سلسلة أو غير كائن، تفشل المهمة بـ invalid_input مع تسمية الحقل؛ ولا تستهلك تلك الإخفاقات الرصيد. مثال: before يحوي react ^17.0.2 وlodash ^4.17.21 وmoment ^2.29.4 مقابل after يحوي react ^18.2.0 وlodash ^4.17.21 وaxios ^1.6.0 ينتج إزالة moment وإضافة axios وتغيير react من ^17.0.2 إلى ^18.2.0 وبقاء lodash دون تغيير.
أين يبرّر فرق تبعيات package.json قيمته
يمكن لروبوتات طلبات السحب استخراج التبعيات من ملفّي package.json للأساس والرأس، واستدعاء نقطة النهاية هذه، ونشر تعليق قصير يسرد فقط تحركات الحزم الحقيقية بدل فرق موحّد صاخب. ولأن التنفيذ parse خالص من المستوى A، يكلّف كل استدعاء ناجح السعر الأساسي المنشور $0.002 دون رموز نموذج ودون شبكة صادرة.
أسئلة تقنية
كيف نقارن كائني تبعيات package.json؟
أرسلوا before وafter ككائنين بسيطين يربطان أسماء الحزم بسلاسل نطاق الإصدار. تعيد API قوائم مرتّبة added وremoved وchanged وunchanged مع العدادات.
ماذا يحدث إن لم يكن before أو after كائنًا؟
تفشل المهمة بـ invalid_input. تُرفض المصفوفات وnull والسلاسل والحقول المفقودة ولا تُحصَّل.
كم يكلّف فرق تبعيات package.json؟
أداة المتصفح مجانية. تستخدم طلبات API رصيد KIT المدفوع مسبقًا بمبلغ $0.002 لكل استدعاء ناجح؛ والمدخل غير الصالح لا يُحصَّل.