@herodevs/cli 1.5.0-beta.3 → 2.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -7
- package/bin/dev.js +7 -9
- package/bin/main.js +29 -0
- package/bin/run.js +6 -2
- package/dist/api/nes/nes.client.js +4 -3
- package/dist/api/types/hd-cli.types.d.ts +1 -0
- package/dist/commands/scan/eol.d.ts +1 -0
- package/dist/commands/scan/eol.js +12 -1
- package/dist/config/constants.d.ts +8 -0
- package/dist/config/constants.js +8 -0
- package/dist/hooks/npm-update-notifier.d.ts +2 -0
- package/dist/hooks/npm-update-notifier.js +26 -6
- package/dist/service/eol/cdx.svc.d.ts +5 -1
- package/dist/service/nes/nes.svc.js +1 -0
- package/dist/service/purls.svc.d.ts +2 -2
- package/dist/service/purls.svc.js +37 -4
- package/dist/ui/eol.ui.js +3 -3
- package/dist/ui/shared.ui.d.ts +1 -0
- package/dist/ui/shared.ui.js +1 -0
- package/package.json +6 -11
package/README.md
CHANGED
|
@@ -10,6 +10,10 @@ The HeroDevs CLI
|
|
|
10
10
|
* [@herodevs/cli](#herodevscli)
|
|
11
11
|
<!-- tocstop -->
|
|
12
12
|
|
|
13
|
+
## TERMS
|
|
14
|
+
|
|
15
|
+
Use of this CLI is governed by the [HeroDevs End of Life Dataset Terms of Service and Data Policy](https://docs.herodevs.com/legal/end-of-life-dataset-terms).
|
|
16
|
+
|
|
13
17
|
## Scanning Behavior
|
|
14
18
|
|
|
15
19
|
The CLI's scanning commands (`hd scan eol` and `hd scan sbom`) are designed to be non-invasive:
|
|
@@ -26,7 +30,7 @@ $ npm install -g @herodevs/cli
|
|
|
26
30
|
$ hd COMMAND
|
|
27
31
|
running command...
|
|
28
32
|
$ hd (--version)
|
|
29
|
-
@herodevs/cli/
|
|
33
|
+
@herodevs/cli/2.0.0-beta.0 linux-x64 node-v22.15.0
|
|
30
34
|
$ hd --help [COMMAND]
|
|
31
35
|
USAGE
|
|
32
36
|
$ hd COMMAND
|
|
@@ -60,7 +64,7 @@ DESCRIPTION
|
|
|
60
64
|
Display help for hd.
|
|
61
65
|
```
|
|
62
66
|
|
|
63
|
-
_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.2.
|
|
67
|
+
_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.2.28/src/commands/help.ts)_
|
|
64
68
|
|
|
65
69
|
## `hd report committers`
|
|
66
70
|
|
|
@@ -91,7 +95,7 @@ EXAMPLES
|
|
|
91
95
|
$ hd report committers --csv
|
|
92
96
|
```
|
|
93
97
|
|
|
94
|
-
_See code: [src/commands/report/committers.ts](https://github.com/herodevs/cli/blob/
|
|
98
|
+
_See code: [src/commands/report/committers.ts](https://github.com/herodevs/cli/blob/v2.0.0-beta.0/src/commands/report/committers.ts)_
|
|
95
99
|
|
|
96
100
|
## `hd report purls`
|
|
97
101
|
|
|
@@ -125,7 +129,7 @@ EXAMPLES
|
|
|
125
129
|
$ hd report purls --save --csv
|
|
126
130
|
```
|
|
127
131
|
|
|
128
|
-
_See code: [src/commands/report/purls.ts](https://github.com/herodevs/cli/blob/
|
|
132
|
+
_See code: [src/commands/report/purls.ts](https://github.com/herodevs/cli/blob/v2.0.0-beta.0/src/commands/report/purls.ts)_
|
|
129
133
|
|
|
130
134
|
## `hd scan eol`
|
|
131
135
|
|
|
@@ -159,7 +163,7 @@ EXAMPLES
|
|
|
159
163
|
$ hd scan eol -a --dir=./my-project
|
|
160
164
|
```
|
|
161
165
|
|
|
162
|
-
_See code: [src/commands/scan/eol.ts](https://github.com/herodevs/cli/blob/
|
|
166
|
+
_See code: [src/commands/scan/eol.ts](https://github.com/herodevs/cli/blob/v2.0.0-beta.0/src/commands/scan/eol.ts)_
|
|
163
167
|
|
|
164
168
|
## `hd scan sbom`
|
|
165
169
|
|
|
@@ -187,7 +191,7 @@ EXAMPLES
|
|
|
187
191
|
$ hd scan sbom --file=path/to/sbom.json
|
|
188
192
|
```
|
|
189
193
|
|
|
190
|
-
_See code: [src/commands/scan/sbom.ts](https://github.com/herodevs/cli/blob/
|
|
194
|
+
_See code: [src/commands/scan/sbom.ts](https://github.com/herodevs/cli/blob/v2.0.0-beta.0/src/commands/scan/sbom.ts)_
|
|
191
195
|
|
|
192
196
|
## `hd update [CHANNEL]`
|
|
193
197
|
|
|
@@ -225,5 +229,5 @@ EXAMPLES
|
|
|
225
229
|
$ hd update --available
|
|
226
230
|
```
|
|
227
231
|
|
|
228
|
-
_See code: [@oclif/plugin-update](https://github.com/oclif/plugin-update/blob/v4.6.
|
|
232
|
+
_See code: [@oclif/plugin-update](https://github.com/oclif/plugin-update/blob/v4.6.39/src/commands/update.ts)_
|
|
229
233
|
<!-- commandsstop -->
|
package/bin/dev.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
-
import { execute } from '@oclif/core';
|
|
4
|
-
|
|
5
|
-
// Localhost
|
|
6
|
-
// process.env.GRAPHQL_HOST = 'http://localhost:3000';
|
|
7
|
-
|
|
8
|
-
// Dev
|
|
9
3
|
process.env.GRAPHQL_HOST = 'https://api.dev.nes.herodevs.com';
|
|
4
|
+
process.env.EOL_REPORT_URL = 'https://eol-report-card.stage.apps.herodevs.io/reports';
|
|
10
5
|
|
|
11
|
-
|
|
12
|
-
// process.env.GRAPHQL_HOST = 'https://api.nes.herodevs.com';
|
|
6
|
+
import main from './main.js';
|
|
13
7
|
|
|
14
|
-
|
|
8
|
+
try {
|
|
9
|
+
await main(false);
|
|
10
|
+
} catch (error) {
|
|
11
|
+
process.exit(1);
|
|
12
|
+
}
|
package/bin/main.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { parseArgs } from 'node:util';
|
|
2
|
+
import { execute } from '@oclif/core';
|
|
3
|
+
|
|
4
|
+
async function main(isProduction = false) {
|
|
5
|
+
const { positionals } = parseArgs({
|
|
6
|
+
allowPositionals: true,
|
|
7
|
+
strict: false, // Don't validate flags
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
// If no arguments at all, default to scan:eol -t
|
|
11
|
+
if (positionals.length === 0) {
|
|
12
|
+
process.argv.splice(2, 0, 'scan:eol', '-t');
|
|
13
|
+
}
|
|
14
|
+
// If only flags are provided, set scan:eol as the command for those flags
|
|
15
|
+
else if (positionals.length === 1 && positionals[0].startsWith('-')) {
|
|
16
|
+
process.argv.splice(2, 0, 'scan:eol');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
try {
|
|
20
|
+
await execute({
|
|
21
|
+
development: !isProduction,
|
|
22
|
+
dir: new URL('./dev.js', import.meta.url),
|
|
23
|
+
});
|
|
24
|
+
} catch (error) {
|
|
25
|
+
process.exit(1);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default main;
|
package/bin/run.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ApolloClient } from "../../api/client.js";
|
|
2
|
+
import { config } from "../../config/constants.js";
|
|
2
3
|
import { debugLogger } from "../../service/log.svc.js";
|
|
3
4
|
import { SbomScanner, buildScanResult } from "../../service/nes/nes.svc.js";
|
|
4
5
|
import { DEFAULT_SCAN_BATCH_SIZE, DEFAULT_SCAN_INPUT_OPTIONS, } from "../types/hd-cli.types.js";
|
|
@@ -21,9 +22,8 @@ export class NesApolloClient {
|
|
|
21
22
|
* Submit a scan for a list of purls after they've been batched by batchSubmitPurls
|
|
22
23
|
*/
|
|
23
24
|
function submitScan(purls, options) {
|
|
24
|
-
|
|
25
|
-
const
|
|
26
|
-
const path = process.env.GRAPHQL_PATH || '/graphql';
|
|
25
|
+
const host = config.graphqlHost;
|
|
26
|
+
const path = config.graphqlPath;
|
|
27
27
|
const url = host + path;
|
|
28
28
|
const client = new NesApolloClient(url);
|
|
29
29
|
return client.scan.purls(purls, options);
|
|
@@ -38,6 +38,7 @@ export const batchSubmitPurls = async (purls, options = DEFAULT_SCAN_INPUT_OPTIO
|
|
|
38
38
|
message: 'No batches to process',
|
|
39
39
|
success: true,
|
|
40
40
|
warnings: [],
|
|
41
|
+
scanId: undefined,
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
44
|
const results = await processBatches(batches, options);
|
|
@@ -2,10 +2,11 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { Command, Flags, ux } from '@oclif/core';
|
|
4
4
|
import { batchSubmitPurls } from "../../api/nes/nes.client.js";
|
|
5
|
+
import { config } from "../../config/constants.js";
|
|
5
6
|
import { getErrorMessage, isErrnoException } from "../../service/error.svc.js";
|
|
6
7
|
import { extractPurls, parsePurlsFile } from "../../service/purls.svc.js";
|
|
7
8
|
import { createStatusDisplay, createTableForStatus, groupComponentsByStatus } from "../../ui/eol.ui.js";
|
|
8
|
-
import { INDICATORS, STATUS_COLORS } from "../../ui/shared.ui.js";
|
|
9
|
+
import { INDICATORS, SCAN_ID_KEY, STATUS_COLORS } from "../../ui/shared.ui.js";
|
|
9
10
|
import ScanSbom from "./sbom.js";
|
|
10
11
|
export default class ScanEol extends Command {
|
|
11
12
|
static description = 'Scan a given sbom for EOL data';
|
|
@@ -61,6 +62,9 @@ export default class ScanEol extends Command {
|
|
|
61
62
|
else {
|
|
62
63
|
this.displayResults(scan, flags.all);
|
|
63
64
|
}
|
|
65
|
+
if (scan.scanId) {
|
|
66
|
+
this.printWebReportUrl(scan.scanId);
|
|
67
|
+
}
|
|
64
68
|
}
|
|
65
69
|
return { components };
|
|
66
70
|
}
|
|
@@ -82,6 +86,13 @@ export default class ScanEol extends Command {
|
|
|
82
86
|
this.error(`Failed to read purls file. ${getErrorMessage(error)}`);
|
|
83
87
|
}
|
|
84
88
|
}
|
|
89
|
+
printWebReportUrl(scanId) {
|
|
90
|
+
this.logLine();
|
|
91
|
+
const id = scanId.split(SCAN_ID_KEY)[1];
|
|
92
|
+
const reportCardUrl = config.eolReportUrl;
|
|
93
|
+
const url = ux.colorize('blue', `${reportCardUrl}/${id}`);
|
|
94
|
+
this.log(`🌐 View your free EOL report at: ${ux.colorize('blue', url)}`);
|
|
95
|
+
}
|
|
85
96
|
async scanSbom(sbom) {
|
|
86
97
|
let scan;
|
|
87
98
|
let purls;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const EOL_REPORT_URL = "https://eol-report-card.apps.herodevs.com/reports";
|
|
2
|
+
export declare const GRAPHQL_HOST = "https://api.nes.herodevs.com";
|
|
3
|
+
export declare const GRAPHQL_PATH = "/graphql";
|
|
4
|
+
export declare const config: {
|
|
5
|
+
eolReportUrl: string;
|
|
6
|
+
graphqlHost: string;
|
|
7
|
+
graphqlPath: string;
|
|
8
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const EOL_REPORT_URL = 'https://eol-report-card.apps.herodevs.com/reports';
|
|
2
|
+
export const GRAPHQL_HOST = 'https://api.nes.herodevs.com';
|
|
3
|
+
export const GRAPHQL_PATH = '/graphql';
|
|
4
|
+
export const config = {
|
|
5
|
+
eolReportUrl: process.env.EOL_REPORT_URL || EOL_REPORT_URL,
|
|
6
|
+
graphqlHost: process.env.GRAPHQL_HOST || GRAPHQL_HOST,
|
|
7
|
+
graphqlPath: process.env.GRAPHQL_PATH || GRAPHQL_PATH,
|
|
8
|
+
};
|
|
@@ -2,6 +2,8 @@ import type { Hook } from '@oclif/core';
|
|
|
2
2
|
import { type UpdateInfo } from 'update-notifier';
|
|
3
3
|
declare const updateNotifierHook: Hook.Init;
|
|
4
4
|
export default updateNotifierHook;
|
|
5
|
+
type DistTag = 'latest' | 'beta' | 'alpha' | 'next';
|
|
6
|
+
export declare function getDistTag(version: string): DistTag;
|
|
5
7
|
export declare function handleUpdate(update: UpdateInfo, currentVersion: string): {
|
|
6
8
|
message: string;
|
|
7
9
|
defer: boolean;
|
|
@@ -1,23 +1,43 @@
|
|
|
1
1
|
import updateNotifier, {} from 'update-notifier';
|
|
2
2
|
import pkg from '../../package.json' with { type: 'json' };
|
|
3
|
+
import { debugLogger } from "../service/log.svc.js";
|
|
3
4
|
const updateNotifierHook = async (options) => {
|
|
5
|
+
debugLogger('pkg.version', pkg.version);
|
|
6
|
+
const distTag = getDistTag(pkg.version);
|
|
7
|
+
debugLogger('distTag', distTag);
|
|
8
|
+
const ONE_DAY_MS = 1000 * 60 * 60 * 24;
|
|
9
|
+
// If we're on the latest dist-tag, check for updates every time
|
|
10
|
+
const updateCheckInterval = distTag === 'latest' ? 0 : ONE_DAY_MS;
|
|
11
|
+
debugLogger('updateCheckInterval', updateCheckInterval);
|
|
4
12
|
const notifier = updateNotifier({
|
|
5
13
|
pkg,
|
|
6
|
-
|
|
14
|
+
distTag,
|
|
15
|
+
updateCheckInterval,
|
|
16
|
+
shouldNotifyInNpmScript: true,
|
|
7
17
|
});
|
|
18
|
+
debugLogger('updateNotifierHook', { notifier });
|
|
8
19
|
if (notifier.update) {
|
|
9
20
|
const notification = handleUpdate(notifier.update, pkg.version);
|
|
21
|
+
debugLogger('notification', notification);
|
|
10
22
|
if (notification) {
|
|
11
23
|
notifier.notify(notification);
|
|
12
24
|
}
|
|
13
25
|
}
|
|
14
26
|
};
|
|
15
27
|
export default updateNotifierHook;
|
|
28
|
+
export function getDistTag(version) {
|
|
29
|
+
if (version.includes('-beta'))
|
|
30
|
+
return 'beta';
|
|
31
|
+
if (version.includes('-alpha'))
|
|
32
|
+
return 'alpha';
|
|
33
|
+
if (version.includes('-next'))
|
|
34
|
+
return 'next';
|
|
35
|
+
return 'latest';
|
|
36
|
+
}
|
|
16
37
|
export function handleUpdate(update, currentVersion) {
|
|
17
|
-
const isPreV1 = currentVersion.startsWith('0.');
|
|
18
|
-
const
|
|
19
|
-
const
|
|
20
|
-
const isNext = currentVersion.includes('-next') || update.latest.includes('-next');
|
|
38
|
+
const isPreV1 = currentVersion.startsWith('0.') || update.latest.startsWith('0.');
|
|
39
|
+
const currentDistTag = getDistTag(currentVersion);
|
|
40
|
+
const updateDistTag = getDistTag(update.latest);
|
|
21
41
|
let message = `Update available! v${currentVersion} → v${update.latest}`;
|
|
22
42
|
/**
|
|
23
43
|
* Show breaking changes warning for:
|
|
@@ -28,7 +48,7 @@ export function handleUpdate(update, currentVersion) {
|
|
|
28
48
|
* [1]https://semver.org/#spec-item-4
|
|
29
49
|
* [2]https://antfu.me/posts/epoch-semver#leading-zero-major-versioning
|
|
30
50
|
*/
|
|
31
|
-
if (isPreV1 ||
|
|
51
|
+
if (isPreV1 || currentDistTag !== 'latest' || updateDistTag !== 'latest' || update.type === 'major') {
|
|
32
52
|
message += '\nThis update may contain breaking changes.';
|
|
33
53
|
}
|
|
34
54
|
// For all other updates (minor, patch), they should be non-breaking
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { CdxGenOptions } from './eol.svc.ts';
|
|
2
|
+
export interface SbomDependency {
|
|
3
|
+
ref: string;
|
|
4
|
+
dependsOn: string[];
|
|
5
|
+
}
|
|
2
6
|
export interface SbomEntry {
|
|
3
7
|
group: string;
|
|
4
8
|
name: string;
|
|
@@ -7,7 +11,7 @@ export interface SbomEntry {
|
|
|
7
11
|
}
|
|
8
12
|
export interface Sbom {
|
|
9
13
|
components: SbomEntry[];
|
|
10
|
-
dependencies:
|
|
14
|
+
dependencies: SbomDependency[];
|
|
11
15
|
}
|
|
12
16
|
export declare const SBOM_DEFAULT__OPTIONS: {
|
|
13
17
|
$0: string;
|
|
@@ -12,9 +12,9 @@ export declare function formatCsvValue(value: string): string;
|
|
|
12
12
|
*/
|
|
13
13
|
export declare function getPurlOutput(purls: string[], output: string): string;
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Extract all PURLs from a CycloneDX SBOM, including components and dependencies
|
|
16
16
|
*/
|
|
17
|
-
export declare function extractPurls(sbom: Sbom):
|
|
17
|
+
export declare function extractPurls(sbom: Sbom): string[];
|
|
18
18
|
/**
|
|
19
19
|
* Parse a purls file in either JSON or text format, including the format of
|
|
20
20
|
* eol.purls.json - { purls: [ 'pkg:npm/express@4.18.2', 'pkg:npm/react@18.3.1' ] }
|
|
@@ -21,11 +21,44 @@ export function getPurlOutput(purls, output) {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
/**
|
|
24
|
-
*
|
|
24
|
+
* Extract PURLs from components recursively
|
|
25
25
|
*/
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
26
|
+
function extractPurlsFromComponents(components, purlSet) {
|
|
27
|
+
for (const component of components) {
|
|
28
|
+
if (component.purl) {
|
|
29
|
+
purlSet.add(component.purl);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Extract PURLs from dependencies
|
|
35
|
+
*/
|
|
36
|
+
function extractPurlsFromDependencies(dependencies, purlSet) {
|
|
37
|
+
for (const dependency of dependencies) {
|
|
38
|
+
if (dependency.ref) {
|
|
39
|
+
purlSet.add(dependency.ref);
|
|
40
|
+
}
|
|
41
|
+
if (dependency.dependsOn) {
|
|
42
|
+
for (const dep of dependency.dependsOn) {
|
|
43
|
+
purlSet.add(dep);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Extract all PURLs from a CycloneDX SBOM, including components and dependencies
|
|
50
|
+
*/
|
|
51
|
+
export function extractPurls(sbom) {
|
|
52
|
+
const purlSet = new Set();
|
|
53
|
+
// Extract from direct components
|
|
54
|
+
if (sbom.components) {
|
|
55
|
+
extractPurlsFromComponents(sbom.components, purlSet);
|
|
56
|
+
}
|
|
57
|
+
// Extract from dependencies
|
|
58
|
+
if (sbom.dependencies) {
|
|
59
|
+
extractPurlsFromDependencies(sbom.dependencies, purlSet);
|
|
60
|
+
}
|
|
61
|
+
return Array.from(purlSet);
|
|
29
62
|
}
|
|
30
63
|
/**
|
|
31
64
|
* Parse a purls file in either JSON or text format, including the format of
|
package/dist/ui/eol.ui.js
CHANGED
|
@@ -19,10 +19,10 @@ function getDaysEolString(daysEol) {
|
|
|
19
19
|
if (daysEol === null) {
|
|
20
20
|
return '';
|
|
21
21
|
}
|
|
22
|
-
if (daysEol
|
|
23
|
-
return `${Math.abs(daysEol)} days from now`;
|
|
22
|
+
if (daysEol <= 0) {
|
|
23
|
+
return `${Math.abs(daysEol) + 1} days from now`;
|
|
24
24
|
}
|
|
25
|
-
if (daysEol
|
|
25
|
+
if (daysEol > 0) {
|
|
26
26
|
return 'today';
|
|
27
27
|
}
|
|
28
28
|
return `${daysEol} days ago`;
|
package/dist/ui/shared.ui.d.ts
CHANGED
|
@@ -3,3 +3,4 @@ export declare const STATUS_COLORS: Record<ComponentStatus, string>;
|
|
|
3
3
|
export declare const INDICATORS: Record<ComponentStatus, string>;
|
|
4
4
|
export declare const MAX_PURL_LENGTH = 60;
|
|
5
5
|
export declare const MAX_TABLE_COLUMN_WIDTH = 30;
|
|
6
|
+
export declare const SCAN_ID_KEY = "eol-scan-v1-";
|
package/dist/ui/shared.ui.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herodevs/cli",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0-beta.0",
|
|
4
4
|
"author": "HeroDevs, Inc",
|
|
5
5
|
"bin": {
|
|
6
6
|
"hd": "./bin/run.js"
|
|
@@ -26,10 +26,6 @@
|
|
|
26
26
|
"prepack": "oclif manifest && oclif readme",
|
|
27
27
|
"pretest": "npm run lint && npm run typecheck",
|
|
28
28
|
"readme": "npm run ci:fix && npm run build && npm exec oclif readme",
|
|
29
|
-
"release": "./scripts/release.sh",
|
|
30
|
-
"pre:release:publish": "npm run prepack && git add README.md",
|
|
31
|
-
"release:publish:beta": "npm run release -- --publish",
|
|
32
|
-
"release:publish:latest": "npm run release -- --latest --publish",
|
|
33
29
|
"test": "globstar -- node --import tsx --test \"test/**/*.test.ts\"",
|
|
34
30
|
"test:e2e": "globstar -- node --import tsx --test \"e2e/**/*.test.ts\"",
|
|
35
31
|
"typecheck": "tsc --noEmit"
|
|
@@ -41,29 +37,28 @@
|
|
|
41
37
|
],
|
|
42
38
|
"dependencies": {
|
|
43
39
|
"@apollo/client": "^3.13.8",
|
|
44
|
-
"@cyclonedx/cdxgen": "^11.2.
|
|
40
|
+
"@cyclonedx/cdxgen": "^11.2.7",
|
|
45
41
|
"@oclif/core": "^4",
|
|
46
42
|
"@oclif/plugin-help": "^6",
|
|
47
43
|
"@oclif/plugin-update": "^4",
|
|
48
44
|
"@oclif/table": "^0.4.7",
|
|
49
|
-
"graphql": "^16.
|
|
45
|
+
"graphql": "^16.11.0",
|
|
50
46
|
"packageurl-js": "^2.0.1",
|
|
51
47
|
"update-notifier": "^7.3.1"
|
|
52
48
|
},
|
|
53
49
|
"devDependencies": {
|
|
54
50
|
"@biomejs/biome": "^1.8.3",
|
|
55
51
|
"@oclif/test": "^4",
|
|
56
|
-
"@types/inquirer": "^9.0.
|
|
52
|
+
"@types/inquirer": "^9.0.8",
|
|
57
53
|
"@types/node": "^22",
|
|
58
54
|
"@types/sinon": "^17.0.4",
|
|
59
55
|
"@types/update-notifier": "^6.0.8",
|
|
60
|
-
"commit-and-tag-version": "^12.5.1",
|
|
61
56
|
"globstar": "^1.0.0",
|
|
62
57
|
"oclif": "^4",
|
|
63
58
|
"shx": "^0.4.0",
|
|
64
59
|
"sinon": "^20.0.0",
|
|
65
60
|
"ts-node": "^10",
|
|
66
|
-
"tsx": "^4.19.
|
|
61
|
+
"tsx": "^4.19.4",
|
|
67
62
|
"typescript": "^5.8.3"
|
|
68
63
|
},
|
|
69
64
|
"engines": {
|
|
@@ -86,7 +81,7 @@
|
|
|
86
81
|
"@oclif/plugin-update"
|
|
87
82
|
],
|
|
88
83
|
"hooks": {
|
|
89
|
-
"init": "./dist/hooks/npm-update-notifier",
|
|
84
|
+
"init": "./dist/hooks/npm-update-notifier.js",
|
|
90
85
|
"prerun": "./dist/hooks/prerun.js"
|
|
91
86
|
},
|
|
92
87
|
"topicSeparator": " ",
|