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 +3 -3
- package/package.json +13 -13
- package/src/client.js +2 -3
- package/src/download.js +14 -3
- package/src/integrity.js +3 -4
- package/src/metadata.js +4 -5
- package/src/normalize-yarn-pattern.js +1 -2
- package/src/pregyp.js +2 -3
- package/src/resolve.js +3 -4
- package/src/sync.js +1 -2
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
|
|
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
|
-
|
|
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.
|
|
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.
|
|
23
|
+
"axios": "1.7.4",
|
|
24
24
|
"commander": "12.1.0",
|
|
25
25
|
"lru-cache": "10.2.2",
|
|
26
|
-
"semver": "7.6.
|
|
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.
|
|
33
|
-
"@types/lodash": "4.17.
|
|
34
|
-
"@types/mocha": "10.0.
|
|
35
|
-
"@types/node": "20.
|
|
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.
|
|
46
|
+
"eslint-plugin-mocha": "10.5.0",
|
|
47
47
|
"express": "4.19.2",
|
|
48
|
-
"lint-staged": "15.2.
|
|
49
|
-
"mocha": "10.
|
|
50
|
-
"prettier": "3.
|
|
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
|
|
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.
|
|
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 =
|
|
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']
|
|
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.
|
|
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.
|
|
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 =
|
|
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.
|
|
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.
|
|
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 =
|
|
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;
|