Diff dipendenze package.json
Confronti due elenchi di dipendenze di package.json e veda cosa è cambiato davvero: react passa da ^17.0.2 a ^18.2.0, entra axios, esce moment e lodash resta uguale. Formattazione e ordine delle chiavi non contano. Gratis nel suo browser.
- Gratis
- Funziona nel suo browser
- Senza registrazione
- I suoi dati restano sul dispositivo
Esegui gratis nel browser
Funziona nel tuo browser: gratis, senza registrazione, i file non escono dal tuo dispositivo.
Confrontare i blocchi di dipendenze tra due istantanee di package.json è un'attività quotidiana nelle revisioni di release, negli upgrade e negli audit delle pull request. Un diff di testo o di righe mescola rumore di formattazione, ordine delle chiavi e campi estranei con il segnale che conta: quali pacchetti sono comparsi, quali sono usciti e quali intervalli di versione si sono mossi. Questo diff delle dipendenze di package.json accetta due oggetti semplici — ciascuno una mappa da nome pacchetto a stringa di intervallo di versione, esattamente come in dependencies, devDependencies, peerDependencies o optionalDependencies — e restituisce elenchi strutturati di pacchetti aggiunti, rimossi e modificati, più le voci invariate e i conteggi.
Cosa segnala un diff semantico delle dipendenze
Un diff semantico delle dipendenze tratta ogni nome di pacchetto come elemento di un insieme e ogni campo versione come etichetta stringa legata a quel nome. Qualsiasi nome presente solo in after è segnalato in added con il nuovo intervallo di versione. Qualsiasi nome presente solo in before è segnalato in removed con la versione che aveva.
I nomi presenti in entrambe le mappe con stringhe di versione diverse compaiono in changed con i campi from e to. I nomi con stringhe identiche compaiono in unchanged così Lei può inventariare la parte stabile della superficie dichiarata. I conteggi di ciascun gruppo e i totali di entrambe le mappe consentono ai dashboard di mostrare badge senza ricontare gli array.
Il confronto è volutamente superficiale: non espande gli intervalli con caret, non risolve il registro npm e non valuta se ^17.0.0 e 17.0.2 installerebbero lo stesso albero. Così lo strumento resta deterministico, offline e adatto a gate CI che devono solo sapere se l'oggetto dipendenze dichiarato si è mosso.
Dove un diff delle dipendenze di package.json conviene
I responsabili di release congelano un oggetto di dipendenze noto come buono prima di un'onda di upgrade e rieseguono il diff dopo batch di Dependabot o Renovate per confermare l'insieme previsto di bump. Le pipeline di revisione di sicurezza abbinano questa uscita strutturata alle ricerche di advisory: solo l'unione dei nomi aggiunti e modificati necessita di scansione CVE quando il resto dell'albero è invariato.
Mantenga mappe modeste, fissi gli array ordinati nei test e otterrà report riproducibili di modifiche alle dipendenze per CI, code review e checklist di migrazione senza erigere un analizzatore completo di lockfile.
Casi d'uso
Riepiloghi delle dipendenze nelle pull request
Confronti gli oggetti di dipendenze di package.json di base e head e pubblichi sulla PR solo i pacchetti aggiunti, rimossi o con versione cambiata.
Revisione di batch di upgrade e Renovate
Confronti la mappa delle dipendenze prima e dopo un batch di upgrade automatico per verificare i bump previsti e individuare rimozioni a sorpresa.
Elenchi mirati di riscansione di sicurezza
Fornisca agli scanner di advisory i nomi dei pacchetti aggiunti e modificati così i pacchetti invariati non vengono ricontrollati a ogni commit.
Domande frequenti
Risolve gli intervalli semver contro il registro?
No. Le specifiche di versione sono confrontate come stringhe esatte. ^1.0.0 e 1.0.0 sono trattati come un cambiamento anche se entrambi potessero installare lo stesso release.
Posso passare devDependencies o peerDependencies?
Sì. Qualsiasi mappa nome→versione funziona — dependencies, devDependencies, peerDependencies, optionalDependencies o un oggetto unito che Lei costruisce.
Perché non confrontare i file riga per riga?
Un diff di righe mescola il rumore della formattazione, dell'ordine delle chiavi e di altre sezioni con ciò che conta. Qui ogni nome di pacchetto è confrontato con il suo testo di versione, così vede solo i pacchetti entrati, usciti o cambiati di versione.
Compaiono anche i pacchetti invariati?
Sì. I pacchetti con lo stesso testo di versione finiscono in un elenco a parte, così può inventariare la parte stabile. Tutti gli elenchi sono in ordine alfabetico e riportano il proprio conteggio.
Come aiuta in una revisione di sicurezza?
Quando quasi tutto l'albero resta uguale, solo i pacchetti aggiunti e quelli con versione cambiata richiedono un nuovo controllo degli avvisi. Passi questi nomi al suo scanner invece di ricontrollare ogni pacchetto a ogni commit.
Strumenti correlati
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo stack
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)Esempio di richiesta
{
"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"
}
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.semantic_diff_package_json",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |
Note tecniche
Gli input che non sono oggetti falliscono con invalid_input e non vengono addebitati.
Cosa segnala un diff semantico delle dipendenze
La mappa di base è before; la mappa candidata è after. Incolli dependencies, devDependencies o una vista unita costruita da Lei: l'endpoint richiede solo due oggetti di specifiche di versione in stringa.
Contratto di ingresso, forma della risposta ed errori
Ciascuno deve essere un oggetto semplice, non un array, non null e non un primitivo. I nomi pacchetto diventano chiavi dell'oggetto; gli intervalli di versione devono essere stringhe o scalari semplici che si convertano pulitamente in stringa — gli oggetti annidati come valore di versione sono rifiutati. Gli oggetti vuoti sono validi e significano un insieme vuoto di dipendenze. In caso di successo il corpo include gli array added, removed, changed e unchanged ordinati alfabeticamente per nome pacchetto; ogni elemento aggiunto o rimosso ha name e version, ogni modificato ha name, from e to, e ogni invariato ha name e version. Invii un corpo JSON con due campi oggetto obbligatori: before (alias left, old, previous) e after (alias right, new, next). I contatori numerici added_count, removed_count, changed_count, unchanged_count, total_before e total_after rispecchiano gli array. Il booleano has_changes è true quando un pacchetto è stato aggiunto, rimosso o ha cambiato versione. Se before o after manca, è un array, una stringa o altrimenti non un oggetto, l'attività fallisce con invalid_input indicando il campo; tali fallimenti non consumano saldo. Esempio: before con react ^17.0.2, lodash ^4.17.21, moment ^2.29.4 contro after con react ^18.2.0, lodash ^4.17.21, axios ^1.6.0 produce moment rimosso, axios aggiunto, react cambiato da ^17.0.2 a ^18.2.0, e lodash invariato.
Dove un diff delle dipendenze di package.json conviene
I bot delle pull request possono estrarre le dipendenze dai file package.json di base e head, chiamare questo endpoint e pubblicare un breve commento che elenca solo i veri movimenti di pacchetti invece di un diff unificato rumoroso. Poiché l'implementazione è parse puro di livello A, ogni chiamata riuscita costa il prezzo base pubblicato $0.002 senza token di modello e senza rete in uscita.
Domande tecniche
Come si confrontano due oggetti di dipendenze di package.json?
Invii before e after come oggetti semplici che mappano nomi di pacchetto a stringhe di intervallo di versione. L'API restituisce elenchi ordinati added, removed, changed e unchanged più i conteggi.
Cosa succede se before o after non è un oggetto?
L'attività fallisce con invalid_input. Array, null, stringhe e campi mancanti sono rifiutati e non addebitati.
Quanto costa il diff delle dipendenze di package.json?
Lo strumento nel browser è gratuito. Le richieste API usano il saldo prepagato KIT a $0.002 per chiamata riuscita; l'input non valido non viene addebitato.