@mongodb-js/mongodb-downloader 0.5.0 → 1.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/README.md +39 -0
- package/dist/.esm-wrapper.mjs +1 -0
- package/dist/index.d.ts +15 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +117 -63
- package/dist/index.js.map +1 -1
- package/dist/with-lock.d.ts +2 -0
- package/dist/with-lock.d.ts.map +1 -0
- package/dist/with-lock.js +52 -0
- package/dist/with-lock.js.map +1 -0
- package/package.json +9 -2
package/README.md
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
## mongodb-downloader
|
|
2
|
+
|
|
3
|
+
A simple library to download MongoDB binaries for different platforms and versions.
|
|
4
|
+
|
|
5
|
+
### Migrating from v0.5 to v0.6+
|
|
6
|
+
|
|
7
|
+
In v0.6.x, the library introduced lockfiles to prevent parallel downloads of the same MongoDB binary. It also changed the arguments for the `downloadMongoDb` and `downloadMongoDbWithVersionInfo` functions, introducing a new `useLockfile` field and using a single options object instead of separate parameters for different options. It is recommended to enable lockfiles to prevent redundant downloads unless you have a specific reason not to.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
// Before (v0.5.x)
|
|
11
|
+
downloadMongoDb('/tmp/directory', '4.4.6', {
|
|
12
|
+
platform: 'linux',
|
|
13
|
+
arch: 'x64',
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
downloadMongoDbWithVersionInfo('/tmp/directory', '4.4.6', {
|
|
17
|
+
arch: 'x64',
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// After (v0.6.x)
|
|
21
|
+
downloadMongoDb({
|
|
22
|
+
directory: '/tmp/directory',
|
|
23
|
+
version: '4.4.6',
|
|
24
|
+
useLockfile: true, // New, required field.
|
|
25
|
+
downloadOptions: {
|
|
26
|
+
platform: 'linux',
|
|
27
|
+
arch: 'x64',
|
|
28
|
+
},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
downloadMongoDbWithVersionInfo({
|
|
32
|
+
directory: '/tmp/directory',
|
|
33
|
+
version: '4.4.6',
|
|
34
|
+
useLockfile: true, // New, required field.
|
|
35
|
+
downloadOptions: {
|
|
36
|
+
arch: 'x64',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
```
|
package/dist/.esm-wrapper.mjs
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,19 @@ export type { DownloadOptions };
|
|
|
3
3
|
export type DownloadResult = DownloadArtifactInfo & {
|
|
4
4
|
downloadedBinDir: string;
|
|
5
5
|
};
|
|
6
|
-
export
|
|
7
|
-
|
|
6
|
+
export type MongoDBDownloaderOptions = {
|
|
7
|
+
directory: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
useLockfile: boolean;
|
|
10
|
+
downloadOptions?: DownloadOptions;
|
|
11
|
+
};
|
|
12
|
+
export declare class MongoDBDownloader {
|
|
13
|
+
downloadMongoDbWithVersionInfo({ downloadOptions, version, directory, useLockfile, }: MongoDBDownloaderOptions): Promise<DownloadResult>;
|
|
14
|
+
static HWM: number;
|
|
15
|
+
private downloadAndExtract;
|
|
16
|
+
private lookupDownloadUrl;
|
|
17
|
+
private getCurrentDownloadedFile;
|
|
18
|
+
}
|
|
19
|
+
export declare function downloadMongoDbWithVersionInfo({ downloadOptions, version, directory, useLockfile, }: MongoDBDownloaderOptions): Promise<DownloadResult>;
|
|
20
|
+
export declare function downloadMongoDb({ downloadOptions, version, directory, useLockfile, }: MongoDBDownloaderOptions): Promise<string>;
|
|
8
21
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,OAAO,IAAI,eAAe,EAC1B,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,OAAO,IAAI,eAAe,EAC1B,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAM9B,YAAY,EAAE,eAAe,EAAE,CAAC;AAEhC,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG;IAClD,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IAErC,SAAS,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,WAAW,EAAE,OAAO,CAAC;IAErB,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF,qBAAa,iBAAiB;IACtB,8BAA8B,CAAC,EACnC,eAAoB,EACpB,OAAa,EACb,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;IAkFrD,MAAM,CAAC,GAAG,SAAe;YAEX,kBAAkB;YA6DlB,iBAAiB;YAgBjB,wBAAwB;CAiBvC;AAaD,wBAAsB,8BAA8B,CAAC,EACnD,eAAoB,EACpB,OAAa,EACb,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,CAOpD;AAED,wBAAsB,eAAe,CAAC,EACpC,eAAoB,EACpB,OAAa,EACb,SAAS,EACT,WAAW,GACZ,EAAE,wBAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5C"}
|
package/dist/index.js
CHANGED
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MongoDBDownloader = void 0;
|
|
6
7
|
exports.downloadMongoDbWithVersionInfo = downloadMongoDbWithVersionInfo;
|
|
7
8
|
exports.downloadMongoDb = downloadMongoDb;
|
|
8
9
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
@@ -14,37 +15,107 @@ const decompress_1 = __importDefault(require("decompress"));
|
|
|
14
15
|
const stream_1 = require("stream");
|
|
15
16
|
const mongodb_download_url_1 = __importDefault(require("mongodb-download-url"));
|
|
16
17
|
const debug_1 = __importDefault(require("debug"));
|
|
18
|
+
const with_lock_1 = require("./with-lock");
|
|
17
19
|
const debug = (0, debug_1.default)('mongodb-downloader');
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
class MongoDBDownloader {
|
|
21
|
+
async downloadMongoDbWithVersionInfo({ downloadOptions = {}, version = '*', directory, useLockfile, }) {
|
|
22
|
+
await fs_1.promises.mkdir(directory, { recursive: true });
|
|
23
|
+
const isWindows = ['win32', 'windows'].includes(downloadOptions.platform ?? process.platform);
|
|
24
|
+
const isCryptLibrary = !!downloadOptions.crypt_shared;
|
|
25
|
+
let isEnterprise = downloadOptions.enterprise ?? false;
|
|
26
|
+
let versionName = version;
|
|
27
|
+
if (/-enterprise$/.test(version)) {
|
|
28
|
+
isEnterprise = true;
|
|
29
|
+
version = version.replace(/-enterprise$/, '');
|
|
30
|
+
versionName = versionName.replace(/-enterprise$/, '');
|
|
31
|
+
}
|
|
32
|
+
if (versionName !== 'latest-alpha') {
|
|
33
|
+
versionName = versionName + (isEnterprise ? '-enterprise' : '-community');
|
|
34
|
+
}
|
|
35
|
+
const downloadTarget = path_1.default.resolve(directory, `mongodb-${process.platform}-${process.env.DISTRO_ID || 'none'}-${process.arch}-${versionName}`.replace(/[^a-zA-Z0-9_-]/g, ''));
|
|
36
|
+
const bindir = path_1.default.resolve(downloadTarget, isCryptLibrary && !isWindows ? 'lib' : 'bin');
|
|
37
|
+
return (async () => {
|
|
38
|
+
const artifactInfoFile = path_1.default.join(bindir, '.artifact_info');
|
|
39
|
+
const currentDownloadedFile = await this.getCurrentDownloadedFile({
|
|
40
|
+
bindir,
|
|
41
|
+
artifactInfoFile,
|
|
42
|
+
});
|
|
43
|
+
if (currentDownloadedFile) {
|
|
44
|
+
debug(`Skipping download because ${downloadTarget} exists`);
|
|
45
|
+
return currentDownloadedFile;
|
|
46
|
+
}
|
|
47
|
+
return await (useLockfile ? with_lock_1.withLock : withoutLock)(downloadTarget, async () => {
|
|
48
|
+
const downloadedFile = await this.getCurrentDownloadedFile({
|
|
49
|
+
bindir,
|
|
50
|
+
artifactInfoFile,
|
|
51
|
+
});
|
|
52
|
+
if (downloadedFile) {
|
|
53
|
+
debug(`Skipping download because ${downloadTarget} exists after waiting on lock`);
|
|
54
|
+
return downloadedFile;
|
|
55
|
+
}
|
|
56
|
+
await fs_1.promises.mkdir(downloadTarget, { recursive: true });
|
|
57
|
+
const artifactInfo = await this.lookupDownloadUrl({
|
|
58
|
+
targetVersion: version,
|
|
59
|
+
enterprise: isEnterprise,
|
|
60
|
+
options: downloadOptions,
|
|
61
|
+
});
|
|
62
|
+
const { url } = artifactInfo;
|
|
63
|
+
debug(`Downloading ${url} into ${downloadTarget}...`);
|
|
64
|
+
await this.downloadAndExtract({
|
|
65
|
+
url,
|
|
66
|
+
downloadTarget,
|
|
67
|
+
isCryptLibrary,
|
|
68
|
+
bindir,
|
|
69
|
+
});
|
|
70
|
+
await fs_1.promises.writeFile(artifactInfoFile, JSON.stringify(artifactInfo));
|
|
71
|
+
debug(`Download complete`, bindir);
|
|
72
|
+
return { ...artifactInfo, downloadedBinDir: bindir };
|
|
73
|
+
});
|
|
74
|
+
})();
|
|
75
|
+
}
|
|
76
|
+
async downloadAndExtract({ withExtraStripDepth = 0, downloadTarget, isCryptLibrary, bindir, url, }) {
|
|
77
|
+
const response = await (0, node_fetch_1.default)(url, {
|
|
78
|
+
highWaterMark: MongoDBDownloader.HWM,
|
|
79
|
+
});
|
|
80
|
+
if (/\.tgz$|\.tar(\.[^.]+)?$/.exec(url)) {
|
|
81
|
+
await (0, util_1.promisify)(stream_1.pipeline)(response.body, tar_1.default.x({ cwd: downloadTarget, strip: isCryptLibrary ? 0 : 1 }));
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
const filename = path_1.default.join(downloadTarget, path_1.default.basename(new URL(url).pathname));
|
|
85
|
+
await (0, util_1.promisify)(stream_1.pipeline)(response.body, (0, fs_1.createWriteStream)(filename, { highWaterMark: MongoDBDownloader.HWM }));
|
|
86
|
+
debug(`Written file ${url} to ${filename}, extracting...`);
|
|
87
|
+
await (0, decompress_1.default)(filename, downloadTarget, {
|
|
88
|
+
strip: isCryptLibrary ? 0 : 1,
|
|
89
|
+
filter: (file) => path_1.default.extname(file.path) !== '.pdb',
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
try {
|
|
93
|
+
await fs_1.promises.stat(bindir);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
if (withExtraStripDepth === 0 && url.includes('macos')) {
|
|
97
|
+
console.info('Retry due to miscalculated --strip-components depth');
|
|
98
|
+
return await this.downloadAndExtract({
|
|
99
|
+
withExtraStripDepth: 1,
|
|
100
|
+
url,
|
|
101
|
+
downloadTarget,
|
|
102
|
+
isCryptLibrary,
|
|
103
|
+
bindir,
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async lookupDownloadUrl({ targetVersion, enterprise, options, }) {
|
|
22
110
|
return await (0, mongodb_download_url_1.default)({
|
|
23
|
-
version:
|
|
24
|
-
enterprise
|
|
111
|
+
version: targetVersion,
|
|
112
|
+
enterprise,
|
|
25
113
|
...options,
|
|
26
114
|
});
|
|
27
115
|
}
|
|
28
|
-
|
|
29
|
-
if (targetVersionSemverSpecifier === 'latest-alpha') {
|
|
30
|
-
return await doDownload(tmpdir, !!options.crypt_shared, 'latest-alpha', isWindows, lookupDownloadUrl);
|
|
31
|
-
}
|
|
32
|
-
if (/-enterprise$/.test(targetVersionSemverSpecifier)) {
|
|
33
|
-
wantsEnterprise = true;
|
|
34
|
-
targetVersionSemverSpecifier = targetVersionSemverSpecifier.replace(/-enterprise$/, '');
|
|
35
|
-
}
|
|
36
|
-
return await doDownload(tmpdir, !!options.crypt_shared, targetVersionSemverSpecifier +
|
|
37
|
-
(wantsEnterprise ? '-enterprise' : '-community'), isWindows, () => lookupDownloadUrl());
|
|
38
|
-
}
|
|
39
|
-
const downloadPromises = Object.create(null);
|
|
40
|
-
async function doDownload(tmpdir, isCryptLibrary, version, isWindows, lookupDownloadUrl) {
|
|
41
|
-
const downloadTarget = path_1.default.resolve(tmpdir, `mongodb-${process.platform}-${process.env.DISTRO_ID || 'none'}-${process.arch}-${version}`.replace(/[^a-zA-Z0-9_-]/g, ''));
|
|
42
|
-
return (downloadPromises[downloadTarget] ?? (downloadPromises[downloadTarget] = (async () => {
|
|
43
|
-
const bindir = path_1.default.resolve(downloadTarget, isCryptLibrary && !isWindows ? 'lib' : 'bin');
|
|
44
|
-
const artifactInfoFile = path_1.default.join(bindir, '.artifact_info');
|
|
116
|
+
async getCurrentDownloadedFile({ bindir, artifactInfoFile, }) {
|
|
45
117
|
try {
|
|
46
118
|
await fs_1.promises.stat(artifactInfoFile);
|
|
47
|
-
debug(`Skipping download because ${downloadTarget} exists`);
|
|
48
119
|
return {
|
|
49
120
|
...JSON.parse(await fs_1.promises.readFile(artifactInfoFile, 'utf8')),
|
|
50
121
|
downloadedBinDir: bindir,
|
|
@@ -52,45 +123,28 @@ async function doDownload(tmpdir, isCryptLibrary, version, isWindows, lookupDown
|
|
|
52
123
|
}
|
|
53
124
|
catch {
|
|
54
125
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
debug(`Written file ${url} to ${filename}, extracting...`);
|
|
71
|
-
await (0, decompress_1.default)(filename, downloadTarget, {
|
|
72
|
-
strip: isCryptLibrary ? 0 : 1,
|
|
73
|
-
filter: (file) => path_1.default.extname(file.path) !== '.pdb',
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
try {
|
|
77
|
-
await fs_1.promises.stat(bindir);
|
|
78
|
-
}
|
|
79
|
-
catch (err) {
|
|
80
|
-
if (withExtraStripDepth === 0 && url.includes('macos')) {
|
|
81
|
-
console.info('Retry due to miscalculated --strip-components depth');
|
|
82
|
-
return await downloadAndExtract(1);
|
|
83
|
-
}
|
|
84
|
-
throw err;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
await downloadAndExtract();
|
|
88
|
-
await fs_1.promises.writeFile(artifactInfoFile, JSON.stringify(artifactInfo));
|
|
89
|
-
debug(`Download complete`, bindir);
|
|
90
|
-
return { ...artifactInfo, downloadedBinDir: bindir };
|
|
91
|
-
})()));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.MongoDBDownloader = MongoDBDownloader;
|
|
129
|
+
MongoDBDownloader.HWM = 1024 * 1024;
|
|
130
|
+
async function withoutLock(bindir, callback) {
|
|
131
|
+
return await callback();
|
|
132
|
+
}
|
|
133
|
+
const downloader = new MongoDBDownloader();
|
|
134
|
+
async function downloadMongoDbWithVersionInfo({ downloadOptions = {}, version = '*', directory, useLockfile, }) {
|
|
135
|
+
return await downloader.downloadMongoDbWithVersionInfo({
|
|
136
|
+
downloadOptions,
|
|
137
|
+
version,
|
|
138
|
+
directory,
|
|
139
|
+
useLockfile,
|
|
140
|
+
});
|
|
92
141
|
}
|
|
93
|
-
async function downloadMongoDb(
|
|
94
|
-
return (await downloadMongoDbWithVersionInfo(
|
|
142
|
+
async function downloadMongoDb({ downloadOptions = {}, version = '*', directory, useLockfile, }) {
|
|
143
|
+
return (await downloader.downloadMongoDbWithVersionInfo({
|
|
144
|
+
downloadOptions,
|
|
145
|
+
version,
|
|
146
|
+
directory,
|
|
147
|
+
useLockfile,
|
|
148
|
+
})).downloadedBinDir;
|
|
95
149
|
}
|
|
96
150
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-lock.d.ts","sourceRoot":"","sources":["../src/with-lock.ts"],"names":[],"mappings":"AASA,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,gBAAgB,EAAE,MAAM,EACxB,EAAE,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,GACtC,OAAO,CAAC,CAAC,CAAC,CAgDZ"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.withLock = withLock;
|
|
7
|
+
const proper_lockfile_1 = __importDefault(require("proper-lockfile"));
|
|
8
|
+
const promises_1 = __importDefault(require("fs/promises"));
|
|
9
|
+
async function withLock(originalFilePath, cb) {
|
|
10
|
+
const controller = new AbortController();
|
|
11
|
+
let release;
|
|
12
|
+
const lockFile = `${originalFilePath}/.mongodb-downloader-lock`;
|
|
13
|
+
await promises_1.default.mkdir(originalFilePath, { recursive: true });
|
|
14
|
+
await promises_1.default.writeFile(lockFile, '');
|
|
15
|
+
try {
|
|
16
|
+
release = await proper_lockfile_1.default.lock(lockFile, {
|
|
17
|
+
retries: {
|
|
18
|
+
retries: 100,
|
|
19
|
+
minTimeout: 100,
|
|
20
|
+
maxTimeout: 5000,
|
|
21
|
+
factor: 2,
|
|
22
|
+
},
|
|
23
|
+
stale: 100000,
|
|
24
|
+
onCompromised: () => {
|
|
25
|
+
controller.abort();
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return await new Promise((resolve, reject) => {
|
|
29
|
+
controller.signal.addEventListener('abort', () => {
|
|
30
|
+
reject(new Error('Aborted by abort signal'));
|
|
31
|
+
});
|
|
32
|
+
void (async () => {
|
|
33
|
+
try {
|
|
34
|
+
resolve(await cb(controller.signal));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
reject(err);
|
|
38
|
+
}
|
|
39
|
+
})();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
if (release) {
|
|
44
|
+
try {
|
|
45
|
+
await release();
|
|
46
|
+
}
|
|
47
|
+
catch (err) {
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=with-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"with-lock.js","sourceRoot":"","sources":["../src/with-lock.ts"],"names":[],"mappings":";;;;;AASA,4BAmDC;AA5DD,sEAAuC;AACvC,2DAA6B;AAQtB,KAAK,UAAU,QAAQ,CAC5B,gBAAwB,EACxB,EAAuC;IAEvC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,IAAI,OAA0C,CAAC;IAE/C,MAAM,QAAQ,GAAG,GAAG,gBAAgB,2BAA2B,CAAC;IAGhE,MAAM,kBAAE,CAAC,KAAK,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAGtD,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEjC,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,yBAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtC,OAAO,EAAE;gBACP,OAAO,EAAE,GAAG;gBACZ,UAAU,EAAE,GAAG;gBACf,UAAU,EAAE,IAAI;gBAChB,MAAM,EAAE,CAAC;aACV;YACD,KAAK,EAAE,MAAO;YACd,aAAa,EAAE,GAAG,EAAE;gBAClB,UAAU,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;SACF,CAAC,CAAC;QAEH,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;gBAC/C,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC;oBACH,OAAO,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,OAAO,EAAE,CAAC;YAClB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;YAEf,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"email": "compass@mongodb.com"
|
|
14
14
|
},
|
|
15
15
|
"homepage": "https://github.com/mongodb-js/devtools-shared",
|
|
16
|
-
"version": "0.
|
|
16
|
+
"version": "1.0.0",
|
|
17
17
|
"repository": {
|
|
18
18
|
"type": "git",
|
|
19
19
|
"url": "https://github.com/mongodb-js/devtools-shared.git"
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
"decompress": "^4.2.1",
|
|
57
57
|
"mongodb-download-url": "^1.7.0",
|
|
58
58
|
"node-fetch": "^2.7.0",
|
|
59
|
+
"proper-lockfile": "^4.1.2",
|
|
59
60
|
"tar": "^6.1.15"
|
|
60
61
|
},
|
|
61
62
|
"devDependencies": {
|
|
@@ -63,18 +64,24 @@
|
|
|
63
64
|
"@mongodb-js/mocha-config-devtools": "^1.0.5",
|
|
64
65
|
"@mongodb-js/prettier-config-devtools": "^1.0.2",
|
|
65
66
|
"@mongodb-js/tsconfig-devtools": "^1.0.4",
|
|
67
|
+
"@types/chai": "^4.2.21",
|
|
66
68
|
"@types/debug": "^4.1.8",
|
|
67
69
|
"@types/decompress": "^4.2.4",
|
|
68
70
|
"@types/mocha": "^9.1.1",
|
|
69
71
|
"@types/node": "^22.15.30",
|
|
72
|
+
"@types/proper-lockfile": "^4.1.4",
|
|
73
|
+
"@types/sinon-chai": "^3.2.5",
|
|
70
74
|
"@types/tar": "^6.1.5",
|
|
75
|
+
"chai": "^4.5.0",
|
|
71
76
|
"depcheck": "^1.4.7",
|
|
72
77
|
"eslint": "^7.25.0",
|
|
73
78
|
"gen-esm-wrapper": "^1.1.3",
|
|
74
79
|
"mocha": "^8.4.0",
|
|
75
80
|
"nyc": "^15.1.0",
|
|
76
81
|
"prettier": "^3.5.3",
|
|
82
|
+
"sinon": "^9.2.3",
|
|
83
|
+
"sinon-chai": "^3.7.0",
|
|
77
84
|
"typescript": "^5.0.4"
|
|
78
85
|
},
|
|
79
|
-
"gitHead": "
|
|
86
|
+
"gitHead": "417692c25f4e605c333621b093819f0be131699f"
|
|
80
87
|
}
|