New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@clw233/getdep

Package Overview
Dependencies
Maintainers
1
Versions
5
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@clw233/getdep - npm Package Compare versions

Comparing version 1.0.2 to 1.0.3

test/normal/node_modules/normal-test-x/package.json

173

dist/index.js

@@ -12,3 +12,2 @@ #!/usr/bin/env node

const path_1 = __importDefault(require("path"));
const better_opn_1 = __importDefault(require("better-opn"));
function getID(id, dependenciesMap) {

@@ -68,3 +67,3 @@ return Object.entries(dependenciesMap).find((e) => id == `${e[0]} (${e[1].version})`);

}
function getDependenciesMap(depth, base) {
function getDependenciesMap(base, depth) {
if (!fs_1.default.existsSync(path_1.default.join(base, 'package.json'))) {

@@ -84,7 +83,5 @@ throw 'Open package.json failed: File not found.';

function saveDependencies(dependencies, currentDepth) {
if (currentDepth !== undefined) {
if (currentDepth === 0)
return;
currentDepth -= 1;
}
if (currentDepth === 0)
return;
currentDepth -= 1;
if (!dependencies)

@@ -100,3 +97,3 @@ return;

};
const subPackageJsonPath = `./node_modules/${name}/package.json`;
const subPackageJsonPath = path_1.default.join(base, `./node_modules/${name}/package.json`);
if (fs_1.default.existsSync(subPackageJsonPath)) {

@@ -115,4 +112,4 @@ const subPackageJson = fs_1.default.readFileSync(subPackageJsonPath, 'utf8');

}
function start(depth, base = '') {
const map = getDependenciesMap(depth, base);
function start(base = '', depth = -1) {
const map = getDependenciesMap(base, depth);
const entries = Object.entries(map);

@@ -147,4 +144,3 @@ entries.forEach((e) => {

//@ts-ignore
const result = start(yargs.argv.depth);
console.log(JSON.stringify(result));
const result = start('', yargs.argv.depth);
//@ts-ignore

@@ -156,153 +152,6 @@ if (yargs.argv.json) {

else {
const html = `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>getdep</title>
<link
href="https://unpkg.com/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD"
crossorigin="anonymous"
/>
<style>
.card {
margin: 1em 0;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-9">
<div id="container" class="card" style="overflow: hidden"></div>
</div>
<div id="data" class="col-3">
<noscript>
<div class="card border-warning">
<div class="card-header text-bg-warning">启用 JavaScript</div>
<div class="card-body">
<p class="card-text">
如果没有 JavaScript,程序将不能正常运行。
</p>
</div>
</div>
</noscript>
<div class="card">
<div class="card-header">包信息</div>
<div class="card-body">
<p class="card-text">名称:<span id="packagename"></span></p>
<p class="card-text">版本:<span id="packagever"></span></p>
<p class="card-text">
依赖包总数:<span id="packagecount"></span>
</p>
<p class="card-text">
循环依赖:<span id="packagecircular"></span>
</p>
</div>
</div>
<div class="card">
<div class="card-header">依赖</div>
<div class="card-body">
<p class="card-title">从图中选择一项来查看详情。</p>
<p class="card-text">名称:<span id="currentname"></span></p>
<p class="card-text">版本:<span id="currentver"></span></p>
<p class="card-text">
被引用次数:<span id="currentrequire"></span>
</p>
<p class="card-text">
循环依赖:<span id="currentcircular"></span>
</p>
</div>
</div>
</div>
</div>
</div>
<script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script>
<script>
const dependenciesData = ${JSON.stringify(result)}
const dependenciesMap = dependenciesData.map;
const nodes = Object.entries(dependenciesMap).map((e) => ({
id: e[0],
label: e[0]+' ('+e[1].version+')',
}));
const edges = Object.entries(dependenciesMap)
.map((e) =>
Object.entries(e[1].dependencies).map((f) => {
const obj = { source: e[0], target: f[0] };
if (f[1] != dependenciesMap[f[0]].version) {
obj.color = 'red';
}
return obj;
})
)
.flat();
const data = { nodes, edges };
var container = document.getElementById('container');
var width = container.clientWidth;
var height = window.innerHeight - 32;
const graph = new G6.Graph({
container: 'container',
width: width,
height: height,
defaultNode: { size: [80, 80] },
defaultEdge: { type: 'line', style: { endArrow: true } },
modes: { default: ['drag-node', 'drag-canvas', 'zoom-canvas'] },
layout: {
type: 'dagre',
nodesep: 32,
ranksep: 32,
controlPoints: true,
},
fitView: true,
fitViewPadding: [20, 20, 20, 20],
});
graph.on('node:click', (e) => {
var item = dependenciesMap[e.item._cfg.id];
document.getElementById('currentrequire').innerText =
item.requiredTimes;
document.getElementById('currentname').innerText = e.item._cfg.id;
document.getElementById('currentver').innerText = item.version;
document.getElementById('currentcircular').innerText = item.circular
? '是'
: '否';
});
graph.data(data);
graph.render();
document.getElementById('packagename').innerText = dependenciesData.name;
document.getElementById('packagever').innerText =
dependenciesData.version;
document.getElementById('packagecount').innerText =
dependenciesData.count;
document.getElementById('packagecircular').innerText =
dependenciesData.hasCircularDependency ? '有' : '无';
function redraw() {
var container = document.getElementById('container');
var width = container.clientWidth;
var height = 800;
graph.changeSize(width, height);
graph.render();
console.log('Redrawing...');
}
function throttle(callback, delay) {
let timer = null;
return function () {
if (timer) {
return;
}
timer = setTimeout(function () {
timer = null;
callback.apply(this, arguments);
}, delay);
};
}
var throttleRedraw = throttle(redraw, 100);
window.addEventListener('resize', throttleRedraw);
</script>
</body>
</html>
`;
const html = `<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>${`${result.name} ${result.version} - `}getdep</title><link href="https://unpkg.com/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous"><style>.card {margin:1em 0;}</style></head><body><div class="container-fluid"><div class="row"><div class="col-9"><div id="container" class="card" style="overflow:hidden"></div></div><div id="data" class="col-3"><noscript><div class="card border-warning"><div class="card-header text-bg-warning">启用 JavaScript</div><div class="card-body"><p class="card-text">如果没有 JavaScript,程序将不能正常运行。</p></div></div></noscript><div class="card"><div class="card-header">包信息</div><div class="card-body"><p class="card-text">名称:<span id="packagename"></span></p><p class="card-text">版本:<span id="packagever"></span></p><p class="card-text">依赖包总数:<span id="packagecount"></span></p><p class="card-text">循环依赖:<span id="packagecircular"></span></p></div></div><div class="card"><div class="card-header">依赖</div><div class="card-body"><p class="card-title">从图中选择一项来查看详情。</p><p class="card-text">名称:<span id="currentname"></span></p><p class="card-text">版本:<span id="currentver"></span></p><p class="card-text">被引用次数:<span id="currentrequire"></span></p><p class="card-text">循环依赖:<span id="currentcircular"></span></p></div></div><div class="card"><div class="card-header">功能</div><div class="card-body"><!-- Button trigger modal --><button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdrop"onclick="updateTable()" id="checkDep" disabled>查看依赖信息</button><!-- Modal --><div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"aria-labelledby="staticBackdropLabel" aria-hidden="true"><div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-xl"><div class="modal-content"><div class="modal-header"><h1 class="modal-title fs-5" id="staticBackdropLabel">正在查看依赖信息</h1><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><table class="table"><thead><tr><th>#</th><th>包名</th><th>依赖版本</th><th>实际版本</th></tr></thead><tbody id="depModalTable"></tbody></table></div></div></div></div></div></div></div></div></div><script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script><script>const dependenciesData=${JSON.stringify(result)};const dependenciesMap=dependenciesData.map;const nodes=Object.entries(dependenciesMap).map((e) => ({id:e[0],label:${'`${e[0]} (${e[1].version})`'},}));const edges=Object.entries(dependenciesMap).map((e) =>Object.entries(e[1].dependencies).map((f) => {const obj={source:e[0],target:f[0]};if (f[1] != dependenciesMap[f[0]].version) {obj.color='red';}return obj;})).flat();const data={nodes,edges};var container=document.getElementById('container');var width=container.clientWidth;var height=window.innerHeight - 32;const graph=new G6.Graph({container:'container',width:width,height:height,defaultNode:{size:[80,80]},defaultEdge:{type:'line',style:{endArrow:true}},modes:{default:['drag-node','drag-canvas','zoom-canvas']},layout:{type:'dagre',nodesep:32,ranksep:32,controlPoints:true,},fitView:true,fitViewPadding:[20,20,20,20],});graph.on('node:click',(e) => {var item=dependenciesMap[e.item._cfg.id];document.getElementById('currentrequire').innerText =item.requiredTimes;document.getElementById('currentname').innerText=e.item._cfg.id;document.getElementById('currentver').innerText=item.version;document.getElementById('currentcircular').innerText=item.circular? '是':'否';document.getElementById('checkDep').disabled=false});graph.data(data);graph.render();document.getElementById('packagename').innerText=dependenciesData.name;document.getElementById('packagever').innerText =dependenciesData.version;document.getElementById('packagecount').innerText =dependenciesData.count;document.getElementById('packagecircular').innerText =dependenciesData.hasCircularDependency ? '有' :'无';function redraw() {var container=document.getElementById('container');var width=container.clientWidth;var height=800;graph.changeSize(width,height);graph.render();}function throttle(callback,delay) {let timer=null;return function () {if (timer) {return;}timer=setTimeout(function () {timer=null;callback.apply(this,arguments);},delay);};}var throttleRedraw=throttle(redraw,100);window.addEventListener('resize',throttleRedraw);function updateTable() {document.getElementById('staticBackdropLabel').innerText=${"`正在查看 ${document.getElementById('currentname').innerText} 的依赖信息`"};var array=Object.entries(dependenciesMap[document.getElementById('currentname').innerText].dependencies);var tbody=document.getElementById('depModalTable');tbody.innerHTML='';for (var i=0; i < array.length; i++) {var row=document.createElement("tr");var id=document.createElement("td");id.innerText=i+1;var name=document.createElement("td");name.innerText=array[i][0];var version=document.createElement("td");version.innerText=array[i][1];var requiredversion=document.createElement("td");requiredversion.innerText=dependenciesMap[array[i][0]].version;row.appendChild(id);row.appendChild(name);row.appendChild(version);row.appendChild(requiredversion);if (array[i][1] != dependenciesMap[array[i][0]].version) {row.classList.add('table-danger')}tbody.appendChild(row);}}</script><script src="https://unpkg.com/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script></body></html>`;
fs_1.default.writeFileSync('package.json.html', html);
(0, better_opn_1.default)('package.json.html');
require('open-browsers')('http://localhost:3000');
console.info('See your browser for detail information.\nIf not opened automatically, please check package.json.html');
}

@@ -309,0 +158,0 @@ })

@@ -5,9 +5,9 @@ "use strict";

const index_1 = require("./index");
(0, globals_1.describe)('parse module', () => {
(0, globals_1.test)('parse self dependency', () => {
(0, globals_1.expect)((0, index_1.start)(undefined)).toStrictEqual({ "count": 17, "hasCircularDependency": false, "map": { "ansi-regex": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^5.0.1" }, "ansi-styles": { "circular": false, "dependencies": { "color-convert": "^2.0.1" }, "requiredTimes": 1, "version": "^4.0.0" }, "cliui": { "circular": false, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "requiredTimes": 1, "version": "^8.0.1" }, "color-convert": { "circular": false, "dependencies": { "color-name": "~1.1.4" }, "requiredTimes": 1, "version": "^2.0.1" }, "color-name": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "~1.1.4" }, "emoji-regex": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^8.0.0" }, "escalade": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^3.1.1" }, "get-caller-file": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^2.0.5" }, "getdep": { "circular": false, "dependencies": { "yargs": "^17.7.2" }, "requiredTimes": 0, "version": "1.0.0" }, "is-fullwidth-code-point": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^3.0.0" }, "require-directory": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^2.1.1" }, "string-width": { "circular": false, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "requiredTimes": 1, "version": "^4.2.0" }, "strip-ansi": { "circular": false, "dependencies": { "ansi-regex": "^5.0.1" }, "requiredTimes": 2, "version": "^6.0.1" }, "wrap-ansi": { "circular": false, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "requiredTimes": 1, "version": "^7.0.0" }, "y18n": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^5.0.5" }, "yargs": { "circular": false, "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "requiredTimes": 1, "version": "^17.7.2" }, "yargs-parser": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^21.1.1" } }, "name": "getdep", "version": "1.0.0" });
(0, globals_1.describe)('sum module', () => {
(0, globals_1.test)('parse normal dependency', () => {
(0, globals_1.expect)((0, index_1.start)('./test/normal/')).toStrictEqual({ "name": "normal-test", "version": "1.0.0", "count": 4, "hasCircularDependency": false, "map": { "normal-test": { "version": "1.0.0", "dependencies": { "normal-test-x": "0", "normal-test-y": "1" }, "circular": false, "requiredTimes": 0 }, "normal-test-x": { "version": "0", "dependencies": {}, "circular": false, "requiredTimes": 1 }, "normal-test-y": { "version": "1", "dependencies": { "normal-test-z": "2" }, "circular": false, "requiredTimes": 1 }, "normal-test-z": { "version": "2", "dependencies": {}, "circular": false, "requiredTimes": 1 } } });
});
(0, globals_1.test)('parse circular dependency', () => {
(0, globals_1.expect)((0, index_1.start)(undefined, './test/circular/')).toStrictEqual({ "count": 2, "hasCircularDependency": false, "map": { "circular-test": { "circular": false, "dependencies": { "circular-test-a": "0", }, "requiredTimes": 0, "version": "1.0.0", }, "circular-test-a": { "circular": false, "dependencies": {}, "requiredTimes": 1, "version": "0", }, }, "name": "circular-test", "version": "1.0.0", });
(0, globals_1.expect)((0, index_1.start)('./test/circular/')).toStrictEqual({ "name": "circular-test", "version": "1.0.0", "count": 4, "hasCircularDependency": true, "map": { "circular-test": { "version": "1.0.0", "dependencies": { "circular-test-a": "0" }, "circular": false, "requiredTimes": 0 }, "circular-test-a": { "version": "0", "dependencies": { "circular-test-b": "1" }, "circular": true, "requiredTimes": 2 }, "circular-test-b": { "version": "1", "dependencies": { "circular-test-c": "2" }, "circular": true, "requiredTimes": 1 }, "circular-test-c": { "version": "2", "dependencies": { "circular-test-a": "0" }, "circular": true, "requiredTimes": 1 } } });
});
});
{
"name": "@clw233/getdep",
"version": "1.0.2",
"version": "1.0.3",
"description": "Get Node.js Package Dependencies Analyzed",

@@ -26,4 +26,4 @@ "main": "index.js",

"dependencies": {
"better-opn": "^3.0.2",
"yargs": "^17.7.2"
"yargs": "^17.7.2",
"open-browsers": "^1.3.0"
},

@@ -30,0 +30,0 @@ "directories": {

@@ -10,2 +10,8 @@ # getdep

getdep analyze
```
```
## 命令行参数
`--depth=n` 指定查找深度
`--json=path` 仅将分析结果作为 JSON 保存在指定路径
import {describe, expect, test} from '@jest/globals';
import {start} from './index';
describe('parse module', () => {
test('parse self dependency', () => {
expect(start(undefined)).toStrictEqual({"count": 17, "hasCircularDependency": false, "map": {"ansi-regex": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^5.0.1"}, "ansi-styles": {"circular": false, "dependencies": {"color-convert": "^2.0.1"}, "requiredTimes": 1, "version": "^4.0.0"}, "cliui": {"circular": false, "dependencies": {"string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0"}, "requiredTimes": 1, "version": "^8.0.1"}, "color-convert": {"circular": false, "dependencies": {"color-name": "~1.1.4"}, "requiredTimes": 1, "version": "^2.0.1"}, "color-name": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "~1.1.4"}, "emoji-regex": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^8.0.0"}, "escalade": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^3.1.1"}, "get-caller-file": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^2.0.5"}, "getdep": {"circular": false, "dependencies": {"yargs": "^17.7.2"}, "requiredTimes": 0, "version": "1.0.0"}, "is-fullwidth-code-point": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^3.0.0"}, "require-directory": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^2.1.1"}, "string-width": {"circular": false, "dependencies": {"emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1"}, "requiredTimes": 1, "version": "^4.2.0"}, "strip-ansi": {"circular": false, "dependencies": {"ansi-regex": "^5.0.1"}, "requiredTimes": 2, "version": "^6.0.1"}, "wrap-ansi": {"circular": false, "dependencies": {"ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0"}, "requiredTimes": 1, "version": "^7.0.0"}, "y18n": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^5.0.5"}, "yargs": {"circular": false, "dependencies": {"cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1"}, "requiredTimes": 1, "version": "^17.7.2"}, "yargs-parser": {"circular": false, "dependencies": {}, "requiredTimes": 1, "version": "^21.1.1"}}, "name": "getdep", "version": "1.0.0"});
describe('sum module', () => {
test('parse normal dependency', () => {
expect(start('./test/normal/')).toStrictEqual({"name":"normal-test","version":"1.0.0","count":4,"hasCircularDependency":false,"map":{"normal-test":{"version":"1.0.0","dependencies":{"normal-test-x":"0","normal-test-y":"1"},"circular":false,"requiredTimes":0},"normal-test-x":{"version":"0","dependencies":{},"circular":false,"requiredTimes":1},"normal-test-y":{"version":"1","dependencies":{"normal-test-z":"2"},"circular":false,"requiredTimes":1},"normal-test-z":{"version":"2","dependencies":{},"circular":false,"requiredTimes":1}}});
});
test('parse circular dependency', () => {
expect(start(undefined,'./test/circular/')).toStrictEqual({"count": 2,"hasCircularDependency": false,"map": {"circular-test": {"circular": false,"dependencies": {"circular-test-a": "0",},"requiredTimes": 0,"version": "1.0.0",},"circular-test-a": {"circular": false,"dependencies": {},"requiredTimes": 1,"version": "0",},},"name": "circular-test","version": "1.0.0",});
expect(start('./test/circular/')).toStrictEqual({"name":"circular-test","version":"1.0.0","count":4,"hasCircularDependency":true,"map":{"circular-test":{"version":"1.0.0","dependencies":{"circular-test-a":"0"},"circular":false,"requiredTimes":0},"circular-test-a":{"version":"0","dependencies":{"circular-test-b":"1"},"circular":true,"requiredTimes":2},"circular-test-b":{"version":"1","dependencies":{"circular-test-c":"2"},"circular":true,"requiredTimes":1},"circular-test-c":{"version":"2","dependencies":{"circular-test-a":"0"},"circular":true,"requiredTimes":1}}});
});
});

@@ -78,6 +78,3 @@ #!/usr/bin/env node

}
function getDependenciesMap(
depth: number | undefined,
base: string
): DependenciesMap {
function getDependenciesMap(base: string, depth: number): DependenciesMap {
if (!fs.existsSync(path.join(base, 'package.json'))) {

@@ -98,8 +95,6 @@ throw 'Open package.json failed: File not found.';

dependencies: PackageJsonDependencies,
currentDepth: number | undefined
currentDepth: number
) {
if (currentDepth !== undefined) {
if (currentDepth === 0) return;
currentDepth -= 1;
}
if (currentDepth === 0) return;
currentDepth -= 1;
if (!dependencies) return;

@@ -114,3 +109,3 @@ Object.entries(dependencies).forEach(([name, version]) => {

};
const subPackageJsonPath = `./node_modules/${name}/package.json`;
const subPackageJsonPath = path.join(base, `./node_modules/${name}/package.json`);
if (fs.existsSync(subPackageJsonPath)) {

@@ -130,4 +125,4 @@ const subPackageJson = fs.readFileSync(subPackageJsonPath, 'utf8');

function start(depth: number | undefined, base: string = '') {
const map = getDependenciesMap(depth, base);
function start(base: string = '', depth: number = -1) {
const map = getDependenciesMap(base, depth);
const entries = Object.entries(map);

@@ -168,4 +163,3 @@ entries.forEach((e) => {

//@ts-ignore
const result = start(yargs.argv.depth);
console.log(JSON.stringify(result));
const result = start('', yargs.argv.depth);
//@ts-ignore

@@ -176,153 +170,10 @@ if (yargs.argv.json) {

} else {
const html = `<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>getdep</title>
<link
href="https://unpkg.com/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-GLhlTQ8iRABdZLl6O3oVMWSktQOp6b7In1Zl3/Jr59b6EGGoI1aFkw7cmDA6j6gD"
crossorigin="anonymous"
/>
<style>
.card {
margin: 1em 0;
}
</style>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="col-9">
<div id="container" class="card" style="overflow: hidden"></div>
</div>
<div id="data" class="col-3">
<noscript>
<div class="card border-warning">
<div class="card-header text-bg-warning">启用 JavaScript</div>
<div class="card-body">
<p class="card-text">
如果没有 JavaScript,程序将不能正常运行。
</p>
</div>
</div>
</noscript>
<div class="card">
<div class="card-header">包信息</div>
<div class="card-body">
<p class="card-text">名称:<span id="packagename"></span></p>
<p class="card-text">版本:<span id="packagever"></span></p>
<p class="card-text">
依赖包总数:<span id="packagecount"></span>
</p>
<p class="card-text">
循环依赖:<span id="packagecircular"></span>
</p>
</div>
</div>
<div class="card">
<div class="card-header">依赖</div>
<div class="card-body">
<p class="card-title">从图中选择一项来查看详情。</p>
<p class="card-text">名称:<span id="currentname"></span></p>
<p class="card-text">版本:<span id="currentver"></span></p>
<p class="card-text">
被引用次数:<span id="currentrequire"></span>
</p>
<p class="card-text">
循环依赖:<span id="currentcircular"></span>
</p>
</div>
</div>
</div>
</div>
</div>
<script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script>
<script>
const dependenciesData = ${JSON.stringify(result)}
const dependenciesMap = dependenciesData.map;
const nodes = Object.entries(dependenciesMap).map((e) => ({
id: e[0],
label: e[0]+' ('+e[1].version+')',
}));
const edges = Object.entries(dependenciesMap)
.map((e) =>
Object.entries(e[1].dependencies).map((f) => {
const obj = { source: e[0], target: f[0] };
if (f[1] != dependenciesMap[f[0]].version) {
obj.color = 'red';
}
return obj;
})
)
.flat();
const data = { nodes, edges };
var container = document.getElementById('container');
var width = container.clientWidth;
var height = window.innerHeight - 32;
const graph = new G6.Graph({
container: 'container',
width: width,
height: height,
defaultNode: { size: [80, 80] },
defaultEdge: { type: 'line', style: { endArrow: true } },
modes: { default: ['drag-node', 'drag-canvas', 'zoom-canvas'] },
layout: {
type: 'dagre',
nodesep: 32,
ranksep: 32,
controlPoints: true,
},
fitView: true,
fitViewPadding: [20, 20, 20, 20],
});
graph.on('node:click', (e) => {
var item = dependenciesMap[e.item._cfg.id];
document.getElementById('currentrequire').innerText =
item.requiredTimes;
document.getElementById('currentname').innerText = e.item._cfg.id;
document.getElementById('currentver').innerText = item.version;
document.getElementById('currentcircular').innerText = item.circular
? '是'
: '否';
});
graph.data(data);
graph.render();
document.getElementById('packagename').innerText = dependenciesData.name;
document.getElementById('packagever').innerText =
dependenciesData.version;
document.getElementById('packagecount').innerText =
dependenciesData.count;
document.getElementById('packagecircular').innerText =
dependenciesData.hasCircularDependency ? '有' : '无';
function redraw() {
var container = document.getElementById('container');
var width = container.clientWidth;
var height = 800;
graph.changeSize(width, height);
graph.render();
console.log('Redrawing...');
}
function throttle(callback, delay) {
let timer = null;
return function () {
if (timer) {
return;
}
timer = setTimeout(function () {
timer = null;
callback.apply(this, arguments);
}, delay);
};
}
var throttleRedraw = throttle(redraw, 100);
window.addEventListener('resize', throttleRedraw);
</script>
</body>
</html>
`;
const html = `<!DOCTYPE html><html><head><meta charset="UTF-8" /><title>${`${result.name} ${result.version} - `}getdep</title><link href="https://unpkg.com/bootstrap@5.3.1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-4bw+/aepP/YC94hEpVNVgiZdgIC5+VKNBQNGCHeKRQN+PtmoHDEXuppvnDJzQIu9" crossorigin="anonymous"><style>.card {margin:1em 0;}</style></head><body><div class="container-fluid"><div class="row"><div class="col-9"><div id="container" class="card" style="overflow:hidden"></div></div><div id="data" class="col-3"><noscript><div class="card border-warning"><div class="card-header text-bg-warning">启用 JavaScript</div><div class="card-body"><p class="card-text">如果没有 JavaScript,程序将不能正常运行。</p></div></div></noscript><div class="card"><div class="card-header">包信息</div><div class="card-body"><p class="card-text">名称:<span id="packagename"></span></p><p class="card-text">版本:<span id="packagever"></span></p><p class="card-text">依赖包总数:<span id="packagecount"></span></p><p class="card-text">循环依赖:<span id="packagecircular"></span></p></div></div><div class="card"><div class="card-header">依赖</div><div class="card-body"><p class="card-title">从图中选择一项来查看详情。</p><p class="card-text">名称:<span id="currentname"></span></p><p class="card-text">版本:<span id="currentver"></span></p><p class="card-text">被引用次数:<span id="currentrequire"></span></p><p class="card-text">循环依赖:<span id="currentcircular"></span></p></div></div><div class="card"><div class="card-header">功能</div><div class="card-body"><!-- Button trigger modal --><button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdrop"onclick="updateTable()" id="checkDep" disabled>查看依赖信息</button><!-- Modal --><div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1"aria-labelledby="staticBackdropLabel" aria-hidden="true"><div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-xl"><div class="modal-content"><div class="modal-header"><h1 class="modal-title fs-5" id="staticBackdropLabel">正在查看依赖信息</h1><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button></div><div class="modal-body"><table class="table"><thead><tr><th>#</th><th>包名</th><th>依赖版本</th><th>实际版本</th></tr></thead><tbody id="depModalTable"></tbody></table></div></div></div></div></div></div></div></div></div><script src="https://gw.alipayobjects.com/os/lib/antv/g6/4.3.11/dist/g6.min.js"></script><script>const dependenciesData=${JSON.stringify(
result
)};const dependenciesMap=dependenciesData.map;const nodes=Object.entries(dependenciesMap).map((e) => ({id:e[0],label:${'`${e[0]} (${e[1].version})`'},}));const edges=Object.entries(dependenciesMap).map((e) =>Object.entries(e[1].dependencies).map((f) => {const obj={source:e[0],target:f[0]};if (f[1] != dependenciesMap[f[0]].version) {obj.color='red';}return obj;})).flat();const data={nodes,edges};var container=document.getElementById('container');var width=container.clientWidth;var height=window.innerHeight - 32;const graph=new G6.Graph({container:'container',width:width,height:height,defaultNode:{size:[80,80]},defaultEdge:{type:'line',style:{endArrow:true}},modes:{default:['drag-node','drag-canvas','zoom-canvas']},layout:{type:'dagre',nodesep:32,ranksep:32,controlPoints:true,},fitView:true,fitViewPadding:[20,20,20,20],});graph.on('node:click',(e) => {var item=dependenciesMap[e.item._cfg.id];document.getElementById('currentrequire').innerText =item.requiredTimes;document.getElementById('currentname').innerText=e.item._cfg.id;document.getElementById('currentver').innerText=item.version;document.getElementById('currentcircular').innerText=item.circular? '是':'否';document.getElementById('checkDep').disabled=false});graph.data(data);graph.render();document.getElementById('packagename').innerText=dependenciesData.name;document.getElementById('packagever').innerText =dependenciesData.version;document.getElementById('packagecount').innerText =dependenciesData.count;document.getElementById('packagecircular').innerText =dependenciesData.hasCircularDependency ? '有' :'无';function redraw() {var container=document.getElementById('container');var width=container.clientWidth;var height=800;graph.changeSize(width,height);graph.render();}function throttle(callback,delay) {let timer=null;return function () {if (timer) {return;}timer=setTimeout(function () {timer=null;callback.apply(this,arguments);},delay);};}var throttleRedraw=throttle(redraw,100);window.addEventListener('resize',throttleRedraw);function updateTable() {document.getElementById('staticBackdropLabel').innerText=${"`正在查看 ${document.getElementById('currentname').innerText} 的依赖信息`"};var array=Object.entries(dependenciesMap[document.getElementById('currentname').innerText].dependencies);var tbody=document.getElementById('depModalTable');tbody.innerHTML='';for (var i=0; i < array.length; i++) {var row=document.createElement("tr");var id=document.createElement("td");id.innerText=i+1;var name=document.createElement("td");name.innerText=array[i][0];var version=document.createElement("td");version.innerText=array[i][1];var requiredversion=document.createElement("td");requiredversion.innerText=dependenciesMap[array[i][0]].version;row.appendChild(id);row.appendChild(name);row.appendChild(version);row.appendChild(requiredversion);if (array[i][1] != dependenciesMap[array[i][0]].version) {row.classList.add('table-danger')}tbody.appendChild(row);}}</script><script src="https://unpkg.com/bootstrap@5.3.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-HwwvtgBNo3bZJJLYd8oVXjrBZt8cqVSpeBNS5n7C8IVInixGAoxmnlMuBnhbgrkm" crossorigin="anonymous"></script></body></html>`;
fs.writeFileSync('package.json.html', html);
require('better-opn')('package.json.html');
require('open-browsers')('http://localhost:3000');
console.info(
'See your browser for detail information.\nIf not opened automatically, please check package.json.html'
);
}

@@ -329,0 +180,0 @@ })

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc