Skip to content

Commit 1688867

Browse files
authored
refactor(cli/extract.integrity): compare object if integrity is not matching (#544)
1 parent 790e0e8 commit 1688867

File tree

6 files changed

+55
-39
lines changed

6 files changed

+55
-39
lines changed

bin/index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,6 @@ prog
131131
prog
132132
.command("extract integrity [spec]")
133133
.describe(i18n.getTokenSync("cli.commands.extractIntegrity.desc"))
134-
.option("-t, --token", i18n.getTokenSync("cli.commands.extractIntegrity.option_token"))
135134
.action(commands.extractIntegrity.main);
136135

137136
prog.parse(process.argv);

docs/cli/extract-integrity.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,4 @@ $ nsecure extract integrity [spec]
1010

1111
## ⚙️ Available Options
1212

13-
| Name | Shortcut | Default Value | Description |
14-
|---|---|---|---|
15-
| `--token` | `-t` | undefined | NPM token. |
13+
NONE

i18n/english.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ const cli = {
7878
cleared: "Cache cleared successfully!"
7979
},
8080
extractIntegrity: {
81-
desc: "Extract the integrity of a package from its manifest and tarball and compare the two integrities if different from one another.",
82-
option_token: "NPM token"
81+
desc: "Extract the integrity of a package from its manifest and tarball and compare the two integrities if different from one another."
8382
}
8483
},
8584
startHttp: {

i18n/french.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,7 @@ const cli = {
7878
cleared: "Cache nettoyé avec succès !"
7979
},
8080
extractIntegrity: {
81-
desc: "Extraire l'intégrité d'un paquet à partir de son manifeste et du tarball et comparer les deux intégrités si elles sont différentes.",
82-
option_token: "Jeton NPM"
81+
desc: "Extraire l'intégrité d'un paquet à partir de son manifeste et du tarball et comparer les deux intégrités si elles sont différentes."
8382
}
8483
},
8584
startHttp: {

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,14 @@
9191
"@lit/task": "^1.0.3",
9292
"@nodesecure/documentation-ui": "^1.3.0",
9393
"@nodesecure/flags": "^3.0.3",
94-
"@nodesecure/i18n": "^4.0.1",
94+
"@nodesecure/i18n": "^4.0.2",
9595
"@nodesecure/js-x-ray": "^9.2.0",
9696
"@nodesecure/licenses-conformance": "^2.1.0",
9797
"@nodesecure/npm-registry-sdk": "^3.0.0",
9898
"@nodesecure/ossf-scorecard-sdk": "^3.2.1",
9999
"@nodesecure/rc": "^5.0.0",
100100
"@nodesecure/report": "^3.0.0",
101-
"@nodesecure/scanner": "^6.9.0",
101+
"@nodesecure/scanner": "^6.12.0",
102102
"@nodesecure/utils": "^2.2.0",
103103
"@nodesecure/vulnera": "^2.0.1",
104104
"@openally/result": "^1.3.0",
@@ -109,12 +109,12 @@
109109
"@topcli/spinner": "^3.0.0",
110110
"cacache": "^19.0.1",
111111
"chokidar": "^4.0.3",
112-
"diff": "^8.0.2",
113112
"dotenv": "^17.0.0",
114113
"filenamify": "^6.0.0",
115114
"glob": "^11.0.1",
116115
"highlightjs-line-numbers.js": "^2.8.0",
117116
"ini": "^5.0.0",
117+
"json-diff-ts": "^4.8.1",
118118
"kleur": "^4.1.5",
119119
"lit": "^3.3.1",
120120
"ms": "^2.1.3",

src/commands/extract-integrity.js

Lines changed: 49 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,58 @@
1+
// Import Node.js Dependencies
2+
import fs from "node:fs/promises";
3+
import os from "node:os";
4+
import path from "node:path";
5+
16
// Import Third-party Dependencies
2-
import kleur from "kleur";
3-
import { diffChars } from "diff";
4-
import { packumentVersion } from "@nodesecure/npm-registry-sdk";
7+
import * as npmRegistrySDK from "@nodesecure/npm-registry-sdk";
8+
import { diff } from "json-diff-ts";
59
import { tarball } from "@nodesecure/scanner";
10+
import {
11+
parseNpmSpec,
12+
packageJSONIntegrityHash
13+
} from "@nodesecure/mama";
614

7-
export async function main(spec, options) {
8-
const [pkgName, pkgVersion] = spec.split("@");
9-
const { dist: { tarball: location, shasum: manifestIntegrity } } = await packumentVersion(pkgName, pkgVersion, {
10-
token: options.token
11-
});
12-
const manifestManager = await tarball.extractAndResolve(location, {
13-
spec
14-
});
15-
const tarballIntegrity = manifestManager.integrity;
16-
if (manifestIntegrity === tarballIntegrity) {
17-
console.log(`integrity: ${manifestIntegrity}`);
18-
19-
return;
15+
export async function main(
16+
npmPackageSpec
17+
) {
18+
const parsedPackageSpec = parseNpmSpec(npmPackageSpec);
19+
if (!parsedPackageSpec) {
20+
throw new Error(`Invalid npm spec: ${npmPackageSpec}`);
2021
}
2122

22-
console.log(`manifest integrity: ${manifestIntegrity}`);
23-
console.log(`tarball integrity: ${tarballIntegrity}`);
24-
process.stdout.write("integrity diff: ");
25-
for (const { added, removed, value } of diffChars(manifestIntegrity, tarballIntegrity)) {
26-
if (added) {
27-
process.stdout.write(kleur.green().bold(`+${value}`));
28-
}
29-
else if (removed) {
30-
process.stdout.write(kleur.red().bold(`-${value}`));
23+
const packumentVersion = await npmRegistrySDK.packumentVersion(
24+
parsedPackageSpec.name,
25+
parsedPackageSpec.semver,
26+
{
27+
token: process.env.NODE_SECURE_TOKEN
3128
}
32-
else {
33-
process.stdout.write(value);
29+
);
30+
const remote = packageJSONIntegrityHash(
31+
packumentVersion,
32+
{ isFromRemoteRegistry: true }
33+
);
34+
35+
const extractionDirectory = await fs.mkdtemp(
36+
path.join(os.tmpdir(), "nodesecure-tarball-integrity-")
37+
);
38+
39+
try {
40+
const mama = await tarball.extractAndResolve(extractionDirectory, {
41+
spec: npmPackageSpec
42+
});
43+
const local = packageJSONIntegrityHash(mama.document);
44+
45+
if (local.integrity === remote.integrity) {
46+
console.log("no integrity diff found");
47+
48+
return;
3449
}
50+
51+
const diffs = diff(local.object, remote.object);
52+
console.log("integrity diff found:");
53+
console.log(JSON.stringify(diffs, null, 2));
54+
}
55+
finally {
56+
await fs.rm(extractionDirectory, { recursive: true, force: true });
3557
}
36-
console.log("\n");
3758
}

0 commit comments

Comments
 (0)