registry-sync 6.0.0 → 6.1.1

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 CHANGED
@@ -8,7 +8,7 @@ The local copy can then be used as a simple private NPM registry without publish
8
8
 
9
9
  ## Pre-requisites
10
10
 
11
- - Node.js v16.14.0 or newer
11
+ - Node.js v18.20.0 or newer
12
12
 
13
13
  ## Installation
14
14
 
@@ -25,8 +25,8 @@ The local copy can then be used as a simple private NPM registry without publish
25
25
  --root <path> Path to save NPM package tarballs and metadata to
26
26
  --manifest <file> Path to a package-lock.json or yarn.lock file to use as catalog for mirrored NPM packages
27
27
  --localUrl <url> URL to use as root in stored package metadata (i.e. where folder defined as --root will be exposed at)
28
- --binaryAbi <list> Optional comma-separated list of node C++ ABI numbers to download pre-built binaries for.
29
- See NODE_MODULE_VERSION column in https://nodejs.org/en/download/releases/.
28
+ --binaryAbi <list> Optional comma-separated list of node C++ ABI numbers (NODE_MODULE_VERSION) to download pre-built binaries for.
29
+ Look for NODE_MODULE_VERSION in release ChangeLogs via https://nodejs.org/en/download/releases/.
30
30
  Default value is from the current Node.js process.
31
31
  --binaryArch <list> Optional comma-separated list of CPU architectures to download pre-built binaries for.
32
32
  Valid values: arm, arm64, ia32, and x64.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "registry-sync",
3
- "version": "6.0.0",
3
+ "version": "6.1.1",
4
4
  "description": "synchronize a remote npm registry for private use",
5
5
  "repository": "https://github.com/heikkipora/registry-sync",
6
6
  "bin": {
@@ -13,26 +13,26 @@
13
13
  "eslint": "eslint --fix --format=codeframe --ext .ts .",
14
14
  "eslint:check": "eslint --max-warnings=0 --format=codeframe --ext .ts .",
15
15
  "lint-staged": "lint-staged --verbose",
16
- "test": "mocha -r ts-node/register --timeout 120000 test/*.ts",
16
+ "test": "mocha -r ts-node/register --config test/.mocharc.js --timeout 120000 test/*.ts",
17
17
  "release-test": "cd release-test && ./run-sync-install-cycle.sh"
18
18
  },
19
19
  "author": "Heikki Pora",
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
22
  "@yarnpkg/lockfile": "1.1.0",
23
- "axios": "1.7.2",
23
+ "axios": "1.7.4",
24
24
  "commander": "12.1.0",
25
25
  "lru-cache": "10.2.2",
26
- "semver": "7.6.2",
26
+ "semver": "7.6.3",
27
27
  "ssri": "10.0.6",
28
28
  "tar-fs": "3.0.6"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@arkweid/lefthook": "0.7.7",
32
- "@types/chai": "4.3.16",
33
- "@types/lodash": "4.17.4",
34
- "@types/mocha": "10.0.6",
35
- "@types/node": "20.12.12",
32
+ "@types/chai": "4.3.17",
33
+ "@types/lodash": "4.17.7",
34
+ "@types/mocha": "10.0.7",
35
+ "@types/node": "20.14.8",
36
36
  "@types/semver": "7.5.8",
37
37
  "@types/ssri": "7.1.5",
38
38
  "@types/tar-fs": "2.0.4",
@@ -43,13 +43,13 @@
43
43
  "eslint": "8.56.0",
44
44
  "eslint-config-prettier": "9.1.0",
45
45
  "eslint-formatter-codeframe": "7.32.1",
46
- "eslint-plugin-mocha": "10.4.3",
46
+ "eslint-plugin-mocha": "10.5.0",
47
47
  "express": "4.19.2",
48
- "lint-staged": "15.2.5",
49
- "mocha": "10.4.0",
50
- "prettier": "3.2.5",
48
+ "lint-staged": "15.2.9",
49
+ "mocha": "10.7.3",
50
+ "prettier": "3.3.3",
51
51
  "ts-node": "10.9.2",
52
- "typescript": "5.4.5"
52
+ "typescript": "5.5.4"
53
53
  },
54
54
  "keywords": [
55
55
  "registry",
package/src/client.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetchBinaryData = exports.fetchJsonWithCacheCloned = void 0;
3
+ exports.fetchJsonWithCacheCloned = fetchJsonWithCacheCloned;
4
+ exports.fetchBinaryData = fetchBinaryData;
4
5
  const https = require("https");
5
6
  const axios_1 = require("axios");
6
7
  const lru_cache_1 = require("lru-cache");
@@ -17,11 +18,9 @@ async function fetchJsonWithCacheCloned(url, token) {
17
18
  metadataCache.set(url, value);
18
19
  return structuredClone(value);
19
20
  }
20
- exports.fetchJsonWithCacheCloned = fetchJsonWithCacheCloned;
21
21
  function fetchBinaryData(url, token) {
22
22
  return fetch(url, 'arraybuffer', token);
23
23
  }
24
- exports.fetchBinaryData = fetchBinaryData;
25
24
  async function fetch(url, responseType, token) {
26
25
  const config = { responseType };
27
26
  if (token !== '') {
package/src/download.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.downloadAll = void 0;
3
+ exports.downloadAll = downloadAll;
4
4
  const fs = require("fs");
5
5
  const path = require("path");
6
6
  const semver = require("semver");
@@ -15,7 +15,6 @@ async function downloadAll(packages, { localUrl, prebuiltBinaryProperties, regis
15
15
  await downloadFromRegistry(pkg);
16
16
  }
17
17
  }
18
- exports.downloadAll = downloadAll;
19
18
  async function download(registryUrl, registryToken, localUrl, rootFolder, prebuiltBinaryProperties, enforceTarballsOverHttps, { name, version }) {
20
19
  const registryMetadata = await fetchMetadataCloned(name, registryUrl, registryToken);
21
20
  const versionMetadata = registryMetadata.versions[version];
@@ -48,9 +47,21 @@ async function updateMetadata(versionMetadata, defaultMetadata, registryUrl, loc
48
47
  const localMetadata = await loadMetadata(localMetadataPath, defaultMetadata);
49
48
  localMetadata.versions[version] = versionMetadata;
50
49
  localMetadata.time[version] = defaultMetadata.time[version];
51
- localMetadata['dist-tags'].latest = Object.keys(localMetadata.versions).sort(semver.compare).pop();
50
+ localMetadata['dist-tags'] = collectDistTags(localMetadata, defaultMetadata);
52
51
  await saveMetadata(localMetadataPath, localMetadata);
53
52
  }
53
+ // Collect thise dist-tags entries (name -> version) from registry metadata,
54
+ // which point to versions we have locally available.
55
+ // Override 'latest' tag to ensure its validity as we might not have the version
56
+ // that is tagged latest in registry
57
+ function collectDistTags(localMetadata, defaultMetadata) {
58
+ const availableVersions = Object.keys(localMetadata.versions);
59
+ const validDistTags = Object.entries(defaultMetadata['dist-tags']).filter(([, version]) => availableVersions.includes(version));
60
+ return {
61
+ ...Object.fromEntries(validDistTags),
62
+ latest: availableVersions.sort(semver.compare).pop()
63
+ };
64
+ }
54
65
  async function loadMetadata(path, defaultMetadata) {
55
66
  try {
56
67
  const json = await fs.promises.readFile(path, 'utf8');
package/src/integrity.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sha512 = exports.sha1 = exports.verifyIntegrity = void 0;
3
+ exports.verifyIntegrity = verifyIntegrity;
4
+ exports.sha1 = sha1;
5
+ exports.sha512 = sha512;
4
6
  const ssri = require("ssri");
5
7
  function verifyIntegrity(data, id, { integrity, shasum }) {
6
8
  if (!integrity && !shasum) {
@@ -15,12 +17,9 @@ function verifyIntegrity(data, id, { integrity, shasum }) {
15
17
  throw new Error(`Integrity check with SHA1 failed for failed for ${id}`);
16
18
  }
17
19
  }
18
- exports.verifyIntegrity = verifyIntegrity;
19
20
  function sha1(data) {
20
21
  return ssri.fromData(data, { algorithms: ['sha1'] }).hexDigest();
21
22
  }
22
- exports.sha1 = sha1;
23
23
  function sha512(data) {
24
24
  return ssri.fromData(data, { algorithms: ['sha512'] }).toString();
25
25
  }
26
- exports.sha512 = sha512;
package/src/metadata.js CHANGED
@@ -1,6 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.tarballFilename = exports.extractTgz = exports.rewriteMetadataInTarball = exports.rewriteVersionMetadata = void 0;
3
+ exports.rewriteVersionMetadata = rewriteVersionMetadata;
4
+ exports.rewriteMetadataInTarball = rewriteMetadataInTarball;
5
+ exports.extractTgz = extractTgz;
6
+ exports.tarballFilename = tarballFilename;
4
7
  const fs = require("fs");
5
8
  const path = require("path");
6
9
  const tar = require("tar-fs");
@@ -17,7 +20,6 @@ function rewriteVersionMetadata(versionMetadata, data, localUrl) {
17
20
  versionMetadata.dist.shasum = (0, integrity_1.sha1)(data);
18
21
  }
19
22
  }
20
- exports.rewriteVersionMetadata = rewriteVersionMetadata;
21
23
  async function rewriteMetadataInTarball(data, versionMetadata, localUrl, localFolder) {
22
24
  const tmpFolder = path.join(localFolder, '.tmp');
23
25
  await fs.promises.mkdir(tmpFolder, { recursive: true });
@@ -32,7 +34,6 @@ async function rewriteMetadataInTarball(data, versionMetadata, localUrl, localFo
32
34
  await fs.promises.rm(tmpFolder, { recursive: true });
33
35
  return updatedData;
34
36
  }
35
- exports.rewriteMetadataInTarball = rewriteMetadataInTarball;
36
37
  function createPrebuiltBinaryRemotePath(url, versionMetadata) {
37
38
  return `${removeTrailingSlash(url.pathname)}/${versionMetadata.name}/${versionMetadata.version}/`;
38
39
  }
@@ -43,7 +44,6 @@ function extractTgz(data, folder) {
43
44
  tgz.on('error', reject);
44
45
  });
45
46
  }
46
- exports.extractTgz = extractTgz;
47
47
  function compressTgz(folder) {
48
48
  return new Promise((resolve, reject) => {
49
49
  const chunks = [];
@@ -60,7 +60,6 @@ function tarballFilename(name, version) {
60
60
  const normalized = name.replace(/\//g, '-');
61
61
  return `${normalized}-${version}.tgz`;
62
62
  }
63
- exports.tarballFilename = tarballFilename;
64
63
  function removeTrailingSlash(str) {
65
64
  return str.replace(/\/$/, '');
66
65
  }
@@ -29,7 +29,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
29
  */
30
30
  // From https://github.com/yarnpkg/yarn/blob/953c8b6a20e360b097625d64189e6e56ed813e0f/src/util/normalize-pattern.js#L2
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.normalizeYarnPackagePattern = void 0;
32
+ exports.normalizeYarnPackagePattern = normalizeYarnPackagePattern;
33
33
  function normalizeYarnPackagePattern(pattern) {
34
34
  let hasVersion = false;
35
35
  let range = 'latest';
@@ -58,4 +58,3 @@ function normalizeYarnPackagePattern(pattern) {
58
58
  }
59
59
  return { name, range, hasVersion };
60
60
  }
61
- exports.normalizeYarnPackagePattern = normalizeYarnPackagePattern;
package/src/pregyp.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.downloadPrebuiltBinaries = exports.hasPrebuiltBinaries = void 0;
3
+ exports.hasPrebuiltBinaries = hasPrebuiltBinaries;
4
+ exports.downloadPrebuiltBinaries = downloadPrebuiltBinaries;
4
5
  const fs = require("fs");
5
6
  const path = require("path");
6
7
  const semver = require("semver");
@@ -9,7 +10,6 @@ const client_1 = require("./client");
9
10
  function hasPrebuiltBinaries({ binary }) {
10
11
  return Boolean(binary && binary.module_name);
11
12
  }
12
- exports.hasPrebuiltBinaries = hasPrebuiltBinaries;
13
13
  async function downloadPrebuiltBinaries(versionMetadata, localFolder, prebuiltBinaryProperties) {
14
14
  const { binary, name, version } = versionMetadata;
15
15
  if (!binary.napi_versions) {
@@ -24,7 +24,6 @@ async function downloadPrebuiltBinaries(versionMetadata, localFolder, prebuiltBi
24
24
  }
25
25
  }
26
26
  }
27
- exports.downloadPrebuiltBinaries = downloadPrebuiltBinaries;
28
27
  async function downloadPrebuiltBinary(localFolder, name, version, binary, abi, platform, arch, napiVersion) {
29
28
  try {
30
29
  const data = await fetchPrebuiltBinary(name, version, binary, abi, platform, arch, napiVersion);
package/src/resolve.js CHANGED
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.dependenciesFromPackageLock = exports.dependenciesNotInCache = exports.updateDependenciesCache = void 0;
3
+ exports.updateDependenciesCache = updateDependenciesCache;
4
+ exports.dependenciesNotInCache = dependenciesNotInCache;
5
+ exports.dependenciesFromPackageLock = dependenciesFromPackageLock;
4
6
  const fs = require("fs");
5
7
  const pathLib = require("path");
6
8
  const readline = require("readline");
@@ -19,7 +21,6 @@ async function updateDependenciesCache(newDependencies, cacheFilePath, prebuiltB
19
21
  };
20
22
  return fs.promises.writeFile(cacheFilePath, JSON.stringify(data), 'utf8');
21
23
  }
22
- exports.updateDependenciesCache = updateDependenciesCache;
23
24
  async function dependenciesNotInCache(dependencies, cacheFilePath, prebuiltBinaryProperties) {
24
25
  const { dependencies: cachedDependencies, prebuiltBinaryProperties: cachedPrebuiltBinaryProperties, prebuiltBinaryNApiSupport } = await loadCache(cacheFilePath);
25
26
  if (cachedDependencies.length > 0 &&
@@ -30,7 +31,6 @@ async function dependenciesNotInCache(dependencies, cacheFilePath, prebuiltBinar
30
31
  const packageIdsInCache = cachedDependencies.map(pkg => pkg.id);
31
32
  return dependencies.filter(pkg => !packageIdsInCache.includes(pkg.id));
32
33
  }
33
- exports.dependenciesNotInCache = dependenciesNotInCache;
34
34
  async function loadCache(cacheFilePath) {
35
35
  try {
36
36
  const data = JSON.parse(await fs.promises.readFile(cacheFilePath, 'utf8'));
@@ -169,7 +169,6 @@ async function dependenciesFromPackageLock(path, includeDevDependencies) {
169
169
  : await parseDependenciesFromNpmLockFile(path, includeDevDependencies);
170
170
  return dependencies.sort(sortById).filter(uniqueById).filter(isNotLocal);
171
171
  }
172
- exports.dependenciesFromPackageLock = dependenciesFromPackageLock;
173
172
  function sortById(a, b) {
174
173
  return a.id.localeCompare(b.id);
175
174
  }
package/src/sync.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.synchronize = void 0;
3
+ exports.synchronize = synchronize;
4
4
  const download_1 = require("./download");
5
5
  const resolve_1 = require("./resolve");
6
6
  async function synchronize(options) {
@@ -18,4 +18,3 @@ async function synchronize(options) {
18
18
  }
19
19
  return newPackages;
20
20
  }
21
- exports.synchronize = synchronize;