license-downloader 1.3.2 → 2.0.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/CHANGELOG.md CHANGED
@@ -2,6 +2,32 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [2.0.0](https://github.com/BePo65/license-downloader/compare/v1.3.3...v2.0.0) (2026-05-02)
6
+
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * requires node version >= 22
11
+
12
+ ### Features
13
+
14
+ * set minimal node version to 22 ([779d017](https://github.com/BePo65/license-downloader/commit/779d017efe09b5f95bc48f6967aa69a7a7d038d5))
15
+
16
+
17
+ ### Bug Fixes
18
+
19
+ * update packages to fix dependabot security warnings ([1222a97](https://github.com/BePo65/license-downloader/commit/1222a977bd4e294a51d39fc837fee9b9934c78af))
20
+ * update packages to fix dependabot security warnings ([d746f3b](https://github.com/BePo65/license-downloader/commit/d746f3b1eb87c6091d857eb973ec5f6ea98d1211))
21
+ * update packages to fix dependabot security warnings ([2c86a69](https://github.com/BePo65/license-downloader/commit/2c86a696a641f03a256afcacba7cc4ca57818620))
22
+ * update packages to fix github dependabot security warnings ([2c97082](https://github.com/BePo65/license-downloader/commit/2c97082d5ac99d0b9f9fab840f3d2f614a8536f7))
23
+
24
+ ## [1.3.3](https://github.com/BePo65/license-downloader/compare/v1.3.2...v1.3.3) (2025-10-24)
25
+
26
+ ### Bug Fixes
27
+
28
+ - update packages to remove security warnings ([ed33513](https://github.com/BePo65/license-downloader/commit/ed335136b83d817e8ebeb2ecd6a5baadba8e5757))
29
+ - use "node:" in imports ([dc35d48](https://github.com/BePo65/license-downloader/commit/dc35d480f30f4508ceeae9de7c83f5a5f26c09b9))
30
+
5
31
  ## [1.3.2](https://github.com/BePo65/license-downloader/compare/v1.3.1...v1.3.2) (2025-05-02)
6
32
 
7
33
  ## [1.3.1](https://github.com/BePo65/license-downloader/compare/v1.3.0...v1.3.1) (2024-12-10)
package/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # license-downloader - an add-on to license-report tool
2
2
 
3
- ![Version](https://img.shields.io/badge/version-1.3.2-blue.svg?cacheSeconds=2592000)
4
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](#)
3
+ [![Version](https://img.shields.io/badge/version-2.0.0-blue.svg?cacheSeconds=86400)](https://github.com/BePo65/license-downloader/blob/main/CHANGELOG.md)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?cacheSeconds=86400)](https://github.com/BePo65/license-downloader/blob/main/LICENSE)
5
5
 
6
6
  > Download the license files of the dependencies of a project based on the json report from the package 'license-report'.
7
7
 
package/index.js CHANGED
@@ -1,42 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- import path from 'path';
3
+ import path from 'node:path';
4
4
 
5
5
  import config from './lib/config.js';
6
6
  import FsService from './lib/filesystem-service.js';
7
+ import { helpText, licenseFilesTargetFolder, sourceToTargetFilename } from './lib/util.js';
7
8
  import WebService from './lib/web-service.js';
8
- import {
9
- helpText,
10
- licenseFilesTargetFolder,
11
- sourceToTargetFilename,
12
- } from './lib/util.js';
13
9
 
14
10
  (async () => {
15
11
  if (config.help) {
16
- console.log(helpText); // eslint-disable-line security-node/detect-crlf
12
+ console.log(helpText);
17
13
  return;
18
14
  }
19
15
 
20
16
  try {
21
17
  const sourceFilename = config.source;
22
18
  const json = await FsService.readJson(sourceFilename);
23
- await WebService.addLicenseFilePath(
24
- json,
25
- config.httpRetryOptions,
26
- config.githubToken,
27
- );
28
- const targetFilename = sourceToTargetFilename(
29
- sourceFilename,
30
- config.licDir,
31
- );
19
+ await WebService.addLicenseFilePath(json, config.httpRetryOptions, config.githubToken);
20
+ const targetFilename = sourceToTargetFilename(sourceFilename, config.licDir);
32
21
  FsService.createDirFromFilename(targetFilename);
33
22
  await FsService.writeJson(json, targetFilename);
34
23
  if (config.download) {
35
24
  const sourceDirectory = path.dirname(sourceFilename);
36
- const targetDirectory = licenseFilesTargetFolder(
37
- config.licDir,
38
- sourceDirectory,
39
- );
25
+ const targetDirectory = licenseFilesTargetFolder(config.licDir, sourceDirectory);
40
26
  await WebService.downloadLicenseFiles(
41
27
  json,
42
28
  targetDirectory,
@@ -46,6 +32,6 @@ import {
46
32
  }
47
33
  } catch (e) {
48
34
  console.error(e.message);
49
- process.exit(1); // eslint-disable-line n/no-process-exit
35
+ process.exit(1);
50
36
  }
51
37
  })();
@@ -1,12 +1,12 @@
1
- import fs from 'fs';
2
- import path from 'path';
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
3
  import jsonfile from 'jsonfile';
4
4
 
5
5
  /**
6
6
  * Reads json file generated by license-report (with option "--output=json")
7
7
  * and generates javascript object array from it
8
8
  * @param {string} filePath - full path to the license-report generated json file
9
- * @returns {*} content of the license-report generated json file as object array
9
+ * @returns {object} content of the license-report generated json file as object array
10
10
  */
11
11
  export const readJson = async (filePath) => {
12
12
  if (!filePath) {
package/lib/util.js CHANGED
@@ -1,4 +1,4 @@
1
- import path from 'path';
1
+ import path from 'node:path';
2
2
 
3
3
  const defaultTargetSubdirectory = 'licenses';
4
4
 
@@ -13,26 +13,15 @@ const defaultTargetSubdirectory = 'licenses';
13
13
  export const sourceToTargetFilename = (sourceFilename, targetDirectory) => {
14
14
  if (typeof sourceFilename === 'string' && sourceFilename.trim().length > 0) {
15
15
  const extension = path.extname(sourceFilename);
16
- const fileBasename = path
17
- .basename(sourceFilename)
18
- .slice(0, -1 * extension.length);
16
+ const fileBasename = path.basename(sourceFilename).slice(0, -1 * extension.length);
19
17
  let targetDir = targetDirectory;
20
- if (
21
- targetDir === undefined ||
22
- targetDir === null ||
23
- targetDir.trim().length === 0
24
- ) {
18
+ if (targetDir === undefined || targetDir === null || targetDir.trim().length === 0) {
25
19
  targetDir = path.dirname(sourceFilename);
26
20
  }
27
- const targetFilename = path.join(
28
- targetDir,
29
- `${fileBasename}.ext${extension}`,
30
- );
21
+ const targetFilename = path.join(targetDir, `${fileBasename}.ext${extension}`);
31
22
  return targetFilename;
32
23
  } else {
33
- throw new Error(
34
- 'Source filename must not be empty to generate target filename',
35
- );
24
+ throw new Error('Source filename must not be empty to generate target filename');
36
25
  }
37
26
  };
38
27
 
@@ -44,18 +33,10 @@ export const sourceToTargetFilename = (sourceFilename, targetDirectory) => {
44
33
  */
45
34
  export const licenseFilesTargetFolder = (licenseDirectory, sourceDirectory) => {
46
35
  let targetFolder = '';
47
- if (
48
- licenseDirectory !== undefined &&
49
- licenseDirectory !== null &&
50
- licenseDirectory.length > 0
51
- ) {
36
+ if (licenseDirectory !== undefined && licenseDirectory !== null && licenseDirectory.length > 0) {
52
37
  targetFolder = licenseDirectory;
53
38
  } else {
54
- if (
55
- sourceDirectory !== undefined &&
56
- sourceDirectory !== null &&
57
- sourceDirectory.length > 0
58
- ) {
39
+ if (sourceDirectory !== undefined && sourceDirectory !== null && sourceDirectory.length > 0) {
59
40
  targetFolder = path.join(sourceDirectory, defaultTargetSubdirectory);
60
41
  } else {
61
42
  targetFolder = defaultTargetSubdirectory;
@@ -1,9 +1,9 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import stream from 'stream';
4
- import { promisify } from 'util';
5
- import got from 'got';
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import stream from 'node:stream';
4
+ import { promisify } from 'node:util';
6
5
  import debug from 'debug';
6
+ import got from 'got';
7
7
 
8
8
  import FsService from './filesystem-service.js';
9
9
 
@@ -42,7 +42,6 @@ const tokenFromConfigObject = (githubTokenConfig) => {
42
42
  typeof tokenFileEnvVar === 'string' &&
43
43
  tokenFileEnvVar.length > 0
44
44
  ) {
45
- // eslint-disable-next-line security/detect-object-injection
46
45
  const tokenFile = process.env[tokenFileEnvVar];
47
46
  if (tokenFile !== undefined && tokenFile.length > 0) {
48
47
  if (fs.existsSync(tokenFile)) {
@@ -58,12 +57,7 @@ const tokenFromConfigObject = (githubTokenConfig) => {
58
57
  }
59
58
  } else {
60
59
  const tokenEnvVar = githubTokenConfig.tokenEnvVar;
61
- if (
62
- tokenEnvVar !== undefined &&
63
- typeof tokenEnvVar === 'string' &&
64
- tokenEnvVar.length > 0
65
- ) {
66
- // eslint-disable-next-line security/detect-object-injection
60
+ if (tokenEnvVar !== undefined && typeof tokenEnvVar === 'string' && tokenEnvVar.length > 0) {
67
61
  const tempToken = process.env[tokenEnvVar];
68
62
  if (tempToken !== undefined && tempToken.trim().length > 0) {
69
63
  token = tempToken;
@@ -87,8 +81,7 @@ const gotGithubJsonOptions = (maxAttempts, name, githubTokenConfig = {}) => {
87
81
  retry: { limit: maxAttempts },
88
82
  hooks: {
89
83
  beforeRetry: [
90
- // eslint-disable-next-line no-unused-vars
91
- (error, retryCount) => {
84
+ (_error, _retryCount) => {
92
85
  debugForApp(
93
86
  `http request to github api for package "${name}" license info failed, retrying again soon...`,
94
87
  );
@@ -99,7 +92,6 @@ const gotGithubJsonOptions = (maxAttempts, name, githubTokenConfig = {}) => {
99
92
 
100
93
  const token = tokenFromConfigObject(githubTokenConfig);
101
94
  // no idea how to prevent timing attacks for the download operations
102
- // eslint-disable-next-line security/detect-possible-timing-attacks
103
95
  if (token !== undefined) {
104
96
  gotOptions.headers = {
105
97
  Authorization: `Bearer ${token}`,
@@ -116,17 +108,12 @@ const gotGithubJsonOptions = (maxAttempts, name, githubTokenConfig = {}) => {
116
108
  * @param {object} githubTokenConfig - object with authorization data {tokenEnvVar, tokenFileEnvVar}
117
109
  * @returns {object} object with the options for 'got' request
118
110
  */
119
- const gotGithubLicenseFileOptions = (
120
- maxAttempts,
121
- url,
122
- githubTokenConfig = {},
123
- ) => {
111
+ const gotGithubLicenseFileOptions = (maxAttempts, url, githubTokenConfig = {}) => {
124
112
  const gotOptions = {
125
113
  retry: { limit: maxAttempts },
126
114
  hooks: {
127
115
  beforeRetry: [
128
- // eslint-disable-next-line no-unused-vars
129
- (error, retryCount) => {
116
+ (_error, _retryCount) => {
130
117
  debugForApp(
131
118
  `http request to github for license file at "${url}" failed, retrying again soon...`,
132
119
  );
@@ -143,7 +130,6 @@ const gotGithubLicenseFileOptions = (
143
130
 
144
131
  const token = tokenFromConfigObject(githubTokenConfig);
145
132
  // no idea how to prevent timing attacks for the download operations
146
- // eslint-disable-next-line security/detect-possible-timing-attacks
147
133
  if (token !== undefined) {
148
134
  gotOptions.headers = {
149
135
  Authorization: `Bearer ${token}`,
@@ -161,9 +147,7 @@ const gotGithubLicenseFileOptions = (
161
147
  */
162
148
  const getPackageNameFromLinkGit = (link) => {
163
149
  let packageName = '';
164
- const results = link.match(
165
- /.+github\.com\/([^/]+\/[^/#]+?)(?:\.git)?(?=\/|#|$)/i,
166
- );
150
+ const results = link.match(/.+github\.com\/([^/]+\/[^/#]+?)(?:\.git)?(?=\/|#|$)/i);
167
151
  if (results !== null && results.length === 2) {
168
152
  packageName = results[1];
169
153
  }
@@ -211,7 +195,7 @@ const getPackageNameFromLink = (link) => {
211
195
 
212
196
  /**
213
197
  * Adds path to license file to object array
214
- * @param {*} packagesInfos - array of objects generated from the license-report generated json file
198
+ * @param {object[]} packagesInfos - array of objects generated from the license-report generated json file
215
199
  * @param {object} httpRetryOptions - http retry options for 'got' requests ({maxAttempts})
216
200
  * @param {object} authorizationOptions - authorization options for 'got' requests {tokenEnvVar, tokenFileEnvVar}
217
201
  */
@@ -220,11 +204,7 @@ export const addLicenseFilePath = async (
220
204
  httpRetryOptions = {},
221
205
  authorizationOptions = {},
222
206
  ) => {
223
- if (
224
- packagesInfos !== undefined &&
225
- Array.isArray(packagesInfos) &&
226
- packagesInfos.length > 0
227
- ) {
207
+ if (packagesInfos !== undefined && Array.isArray(packagesInfos) && packagesInfos.length > 0) {
228
208
  await Promise.all(
229
209
  packagesInfos.map(async (element) => {
230
210
  element.licenseFileLink = '';
@@ -241,10 +221,7 @@ export const addLicenseFilePath = async (
241
221
  );
242
222
  const result = await got(licenseInfoAdr, options);
243
223
  const licenseInfo = result.body;
244
- if (
245
- licenseInfo.download_url !== undefined &&
246
- licenseInfo.download_url.length > 0
247
- ) {
224
+ if (licenseInfo.download_url !== undefined && licenseInfo.download_url.length > 0) {
248
225
  element.licenseFileLink = licenseInfo.download_url;
249
226
  }
250
227
  } catch (error) {
@@ -253,8 +230,8 @@ export const addLicenseFilePath = async (
253
230
  const { headers } = response;
254
231
  if (headers['x-ratelimit-remaining'] === '0') {
255
232
  const timeForRateLimitReset =
256
- parseInt(error.response.headers['x-ratelimit-reset']) -
257
- Math.floor(new Date().getTime() / 1000);
233
+ parseInt(error.response.headers['x-ratelimit-reset'], 10) -
234
+ Math.floor(Date.now() / 1000);
258
235
  const resetMsg = timeForRateLimitReset
259
236
  ? ` please wait ${timeForRateLimitReset} seconds before trying again.`
260
237
  : '';
@@ -265,18 +242,14 @@ export const addLicenseFilePath = async (
265
242
  console.error(
266
243
  'You can increase the rate limit by providing a github token. See the README for more information.',
267
244
  );
268
- debugForApp(
269
- `Failed query '${licenseInfoAdr}' ('${error.message}')`,
270
- );
245
+ debugForApp(`Failed query '${licenseInfoAdr}' ('${error.message}')`);
271
246
  return;
272
247
  }
273
248
  }
274
249
  console.error(
275
- `the project '${githubPackageName}' does not contain a license file on github`,
276
- );
277
- debugForApp(
278
- `no license file on '${licenseInfoAdr}' ('${error.message}')`,
250
+ `the project '${githubPackageName}' does not contain a license file on github; request returned ${response.statusCode} ( ${response.statusMessage})`,
279
251
  );
252
+ debugForApp(`no license file on '${licenseInfoAdr}' ('${error.message}')`);
280
253
  }
281
254
  }
282
255
  }
@@ -289,7 +262,7 @@ export const addLicenseFilePath = async (
289
262
 
290
263
  /**
291
264
  * Download all license files to target directory
292
- * @param {*} packagesInfos - array of objects with package infos including path to license file
265
+ * @param {object[]} packagesInfos - array of objects with package infos including path to license file
293
266
  * @param {string} targetDirectory - path of directory for downloaded license files
294
267
  * @param {object} httpRetryOptions - http retry options for 'got' requests ({maxAttempts})
295
268
  * @param {object} authorizationOptions - authorization options for 'got' requests {tokenEnvVar, tokenFileEnvVar}
@@ -324,11 +297,7 @@ export const downloadLicenseFiles = async (
324
297
  await pipeline(
325
298
  got.stream(
326
299
  url,
327
- gotGithubLicenseFileOptions(
328
- httpRetryOptions.maxAttempts,
329
- url,
330
- authorizationOptions,
331
- ),
300
+ gotGithubLicenseFileOptions(httpRetryOptions.maxAttempts, url, authorizationOptions),
332
301
  ),
333
302
  fileWriterStream,
334
303
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "license-downloader",
3
- "version": "1.3.2",
3
+ "version": "2.0.0",
4
4
  "description": "Download the license files of the dependencies of a project",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -8,7 +8,7 @@
8
8
  },
9
9
  "type": "module",
10
10
  "engines": {
11
- "node": ">=18"
11
+ "node": ">=22"
12
12
  },
13
13
  "files": [
14
14
  "index.js",
@@ -21,8 +21,9 @@
21
21
  },
22
22
  "bugs": "https://github.com/BePo65/license-downloader/issues",
23
23
  "scripts": {
24
- "lint": "npx eslint index.js lib/**/*.js test/**/*.js **/*.json",
25
- "test": "npx mocha -R spec",
24
+ "lint": "npx @biomejs/biome check .",
25
+ "lint:fix": "npx @biomejs/biome check --write .",
26
+ "test": "node --test --test-reporter=spec",
26
27
  "lint-commits": "commitlint --from d6a731d70b4f2 --to HEAD --verbose",
27
28
  "init-changelog": "commit-and-tag-version -i CHANGELOG.md --same-file --prerelease pre --first-release",
28
29
  "release": "commit-and-tag-version -i CHANGELOG.md --same-file",
@@ -36,33 +37,23 @@
36
37
  "author": "BePo65",
37
38
  "license": "MIT",
38
39
  "dependencies": {
39
- "debug": "^4.4.0",
40
- "got": "^14.4.7",
41
- "jsonfile": "^6.1.0",
40
+ "debug": "^4.4.3",
41
+ "got": "^15.0.3",
42
+ "jsonfile": "^6.2.1",
42
43
  "rc": "^1.2.8"
43
44
  },
44
45
  "devDependencies": {
45
- "@commitlint/cli": "^19.8.0",
46
- "@commitlint/config-angular": "^19.8.0",
47
- "chai": "^5.2.0",
48
- "commit-and-tag-version": "^12.5.1",
49
- "eslint": "^9.25.1",
50
- "eslint-plugin-chai-expect": "^3.1.0",
51
- "eslint-plugin-jsdoc": "^50.6.11",
52
- "eslint-plugin-json": "^4.0.1",
53
- "eslint-plugin-mocha": "^11.0.0",
54
- "eslint-plugin-n": "^17.17.0",
55
- "eslint-plugin-prefer-arrow": "^1.2.3",
56
- "eslint-plugin-security": "^3.0.1",
57
- "eslint-plugin-security-node": "^1.1.4",
46
+ "@biomejs/biome": "^2.4.5",
47
+ "@commitlint/cli": "^20.4.3",
48
+ "@commitlint/config-angular": "^20.4.3",
49
+ "commit-and-tag-version": "^12.7.1",
50
+ "conventional-commits-filter": "^5.0.0",
58
51
  "husky": "^9.1.7",
59
- "lint-staged": "^15.5.1",
60
- "mocha": "^11.2.2",
61
- "prettier": "^3.5.3",
52
+ "lint-staged": "^16.4.0",
62
53
  "temp": "^0.9.4"
63
54
  },
64
55
  "lint-staged": {
65
- "**/*": "prettier --write --ignore-unknown"
56
+ "**/*": "npx @biomejs/biome check --write ."
66
57
  },
67
58
  "commit-and-tag-version": {
68
59
  "packageFiles": [