@badisi/latest-version 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 +1 -1
- package/cli.js +19 -227
- package/index.js +4 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -192,7 +192,7 @@ $ latest-version <packageJson|packageName...>
|
|
|
192
192
|
Examples:
|
|
193
193
|
$ lv
|
|
194
194
|
$ latest-version path/to/package.json
|
|
195
|
-
$ latest-version package1 package2 package3
|
|
195
|
+
$ latest-version package1 package2 package3 --skip-missing
|
|
196
196
|
```
|
|
197
197
|
|
|
198
198
|
![CLI utility preview][clipreview]
|
package/cli.js
CHANGED
|
@@ -1,27 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __create = Object.create;
|
|
3
3
|
var __defProp = Object.defineProperty;
|
|
4
|
-
var __defProps = Object.defineProperties;
|
|
5
4
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
7
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
8
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
9
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
10
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
11
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
12
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
13
|
-
var __spreadValues = (a, b) => {
|
|
14
|
-
for (var prop in b ||= {})
|
|
15
|
-
if (__hasOwnProp.call(b, prop))
|
|
16
|
-
__defNormalProp(a, prop, b[prop]);
|
|
17
|
-
if (__getOwnPropSymbols)
|
|
18
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
19
|
-
if (__propIsEnum.call(b, prop))
|
|
20
|
-
__defNormalProp(a, prop, b[prop]);
|
|
21
|
-
}
|
|
22
|
-
return a;
|
|
23
|
-
};
|
|
24
|
-
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
25
8
|
var __copyProps = (to, from, except, desc) => {
|
|
26
9
|
if (from && typeof from === "object" || typeof from === "function") {
|
|
27
10
|
for (let key of __getOwnPropNames(from))
|
|
@@ -31,6 +14,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
31
14
|
return to;
|
|
32
15
|
};
|
|
33
16
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
34
21
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
35
22
|
mod
|
|
36
23
|
));
|
|
@@ -57,209 +44,9 @@ var __async = (__this, __arguments, generator) => {
|
|
|
57
44
|
|
|
58
45
|
// src/cli.ts
|
|
59
46
|
var import_safe = require("@colors/colors/safe");
|
|
60
|
-
var import_fs2 = require("fs");
|
|
61
|
-
var import_path2 = require("path");
|
|
62
|
-
|
|
63
|
-
// src/index.ts
|
|
64
47
|
var import_fs = require("fs");
|
|
65
48
|
var import_path = require("path");
|
|
66
|
-
var
|
|
67
|
-
var import_os = require("os");
|
|
68
|
-
var import_url = require("url");
|
|
69
|
-
var import_registry_url = __toESM(require("registry-auth-token/registry-url"));
|
|
70
|
-
var import_registry_auth_token = __toESM(require("registry-auth-token"));
|
|
71
|
-
var import_max_satisfying = __toESM(require("semver/ranges/max-satisfying"));
|
|
72
|
-
var import_gt = __toESM(require("semver/functions/gt"));
|
|
73
|
-
var ONE_DAY = 1e3 * 60 * 60 * 24;
|
|
74
|
-
var isPackageJson = (obj) => {
|
|
75
|
-
return obj.dependencies !== void 0 || obj.devDependencies !== void 0 || obj.peerDependencies !== void 0;
|
|
76
|
-
};
|
|
77
|
-
var downloadMetadata = (pkgName, options) => {
|
|
78
|
-
return new Promise((resolve, reject) => {
|
|
79
|
-
const i = pkgName.indexOf("/");
|
|
80
|
-
const pkgScope = i !== -1 ? pkgName.slice(0, i) : "";
|
|
81
|
-
const registryUrl = (options == null ? void 0 : options.registryUrl) || (0, import_registry_url.default)(pkgScope);
|
|
82
|
-
const pkgUrl = new import_url.URL(encodeURIComponent(pkgName).replace(/^%40/, "@"), registryUrl);
|
|
83
|
-
let requestOptions = {
|
|
84
|
-
headers: { accept: "application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*" },
|
|
85
|
-
host: pkgUrl.hostname,
|
|
86
|
-
path: pkgUrl.pathname,
|
|
87
|
-
port: pkgUrl.port
|
|
88
|
-
};
|
|
89
|
-
const authInfo = (0, import_registry_auth_token.default)(pkgUrl.toString(), { recursive: true });
|
|
90
|
-
if (authInfo && requestOptions.headers) {
|
|
91
|
-
requestOptions.headers.authorization = `${authInfo.type} ${authInfo.token}`;
|
|
92
|
-
}
|
|
93
|
-
if (options == null ? void 0 : options.requestOptions) {
|
|
94
|
-
requestOptions = __spreadValues(__spreadValues({}, requestOptions), options.requestOptions);
|
|
95
|
-
}
|
|
96
|
-
const { get } = pkgUrl.protocol === "https:" ? require("https") : require("http");
|
|
97
|
-
const request = get(requestOptions, (res) => {
|
|
98
|
-
if (res.statusCode === 200) {
|
|
99
|
-
let rawData = "";
|
|
100
|
-
res.setEncoding("utf8");
|
|
101
|
-
res.on("data", (chunk) => rawData += chunk);
|
|
102
|
-
res.once("end", () => {
|
|
103
|
-
res.setTimeout(0);
|
|
104
|
-
res.removeAllListeners();
|
|
105
|
-
try {
|
|
106
|
-
const pkgMetadata = JSON.parse(rawData);
|
|
107
|
-
return resolve({
|
|
108
|
-
name: pkgName,
|
|
109
|
-
lastUpdateDate: Date.now(),
|
|
110
|
-
versions: Object.keys(pkgMetadata.versions),
|
|
111
|
-
distTags: pkgMetadata["dist-tags"]
|
|
112
|
-
});
|
|
113
|
-
} catch (err) {
|
|
114
|
-
return reject(err);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
} else {
|
|
118
|
-
res.removeAllListeners();
|
|
119
|
-
res.resume();
|
|
120
|
-
return reject(`Request error (${res.statusCode}): ${pkgUrl}`);
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
const abort = (error) => {
|
|
124
|
-
request.removeAllListeners();
|
|
125
|
-
request.destroy();
|
|
126
|
-
return reject(error);
|
|
127
|
-
};
|
|
128
|
-
request.once("timeout", () => abort(`Request timed out: ${pkgUrl}`));
|
|
129
|
-
request.once("error", (err) => abort(err));
|
|
130
|
-
});
|
|
131
|
-
};
|
|
132
|
-
var getCacheDir = (name = "@badisi/latest-version") => {
|
|
133
|
-
const homeDir = (0, import_os.homedir)();
|
|
134
|
-
switch (process.platform) {
|
|
135
|
-
case "darwin":
|
|
136
|
-
return (0, import_path.join)(homeDir, "Library", "Caches", name);
|
|
137
|
-
case "win32":
|
|
138
|
-
return (0, import_path.join)(process.env.LOCALAPPDATA || (0, import_path.join)(homeDir, "AppData", "Local"), name, "Cache");
|
|
139
|
-
default:
|
|
140
|
-
return (0, import_path.join)(process.env.XDG_CACHE_HOME || (0, import_path.join)(homeDir, ".cache"), name);
|
|
141
|
-
}
|
|
142
|
-
};
|
|
143
|
-
var saveMetadataToCache = (pkg) => {
|
|
144
|
-
const filePath = (0, import_path.join)(getCacheDir(), `${pkg.name}.json`);
|
|
145
|
-
if (!(0, import_fs.existsSync)((0, import_path.dirname)(filePath))) {
|
|
146
|
-
(0, import_fs.mkdirSync)((0, import_path.dirname)(filePath), { recursive: true });
|
|
147
|
-
}
|
|
148
|
-
(0, import_fs.writeFileSync)(filePath, JSON.stringify(pkg));
|
|
149
|
-
};
|
|
150
|
-
var getMetadataFromCache = (pkgName, options) => {
|
|
151
|
-
var _a;
|
|
152
|
-
const maxAge = (_a = options == null ? void 0 : options.cacheMaxAge) != null ? _a : ONE_DAY;
|
|
153
|
-
if (maxAge !== 0) {
|
|
154
|
-
const pkgCacheFilePath = (0, import_path.join)(getCacheDir(), `${pkgName}.json`);
|
|
155
|
-
if ((0, import_fs.existsSync)(pkgCacheFilePath)) {
|
|
156
|
-
const pkg = JSON.parse((0, import_fs.readFileSync)(pkgCacheFilePath).toString());
|
|
157
|
-
if (Date.now() - pkg.lastUpdateDate < maxAge) {
|
|
158
|
-
return pkg;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return void 0;
|
|
163
|
-
};
|
|
164
|
-
var getRegistryVersions = (pkgName, tagOrRange, options) => __async(void 0, null, function* () {
|
|
165
|
-
var _a, _b, _c;
|
|
166
|
-
let pkgMetadata;
|
|
167
|
-
if (pkgName.length && (options == null ? void 0 : options.useCache)) {
|
|
168
|
-
pkgMetadata = getMetadataFromCache(pkgName, options);
|
|
169
|
-
if (!pkgMetadata) {
|
|
170
|
-
pkgMetadata = yield downloadMetadata(pkgName, options);
|
|
171
|
-
saveMetadataToCache(pkgMetadata);
|
|
172
|
-
}
|
|
173
|
-
} else if (pkgName.length) {
|
|
174
|
-
pkgMetadata = yield downloadMetadata(pkgName, options);
|
|
175
|
-
}
|
|
176
|
-
const versions = {
|
|
177
|
-
latest: (_a = pkgMetadata == null ? void 0 : pkgMetadata.distTags) == null ? void 0 : _a.latest,
|
|
178
|
-
next: (_b = pkgMetadata == null ? void 0 : pkgMetadata.distTags) == null ? void 0 : _b.next
|
|
179
|
-
};
|
|
180
|
-
if (tagOrRange && (pkgMetadata == null ? void 0 : pkgMetadata.distTags) && (pkgMetadata == null ? void 0 : pkgMetadata.distTags[tagOrRange])) {
|
|
181
|
-
versions.wanted = pkgMetadata.distTags[tagOrRange];
|
|
182
|
-
} else if (tagOrRange && ((_c = pkgMetadata == null ? void 0 : pkgMetadata.versions) == null ? void 0 : _c.length)) {
|
|
183
|
-
versions.wanted = (0, import_max_satisfying.default)(pkgMetadata.versions, tagOrRange) || void 0;
|
|
184
|
-
}
|
|
185
|
-
return versions;
|
|
186
|
-
});
|
|
187
|
-
var getInstalledVersion = (pkgName, location = "local") => {
|
|
188
|
-
var _a, _b, _c, _d;
|
|
189
|
-
try {
|
|
190
|
-
if (location === "globalNpm") {
|
|
191
|
-
return (_a = require((0, import_path.join)(import_global_dirs.npm.packages, pkgName, "package.json"))) == null ? void 0 : _a.version;
|
|
192
|
-
} else if (location === "globalYarn") {
|
|
193
|
-
const yarnGlobalPkg = require((0, import_path.resolve)(import_global_dirs.yarn.packages, "..", "package.json"));
|
|
194
|
-
if (!((_b = yarnGlobalPkg == null ? void 0 : yarnGlobalPkg.dependencies) == null ? void 0 : _b[pkgName])) {
|
|
195
|
-
return void 0;
|
|
196
|
-
}
|
|
197
|
-
return (_c = require((0, import_path.join)(import_global_dirs.yarn.packages, pkgName, "package.json"))) == null ? void 0 : _c.version;
|
|
198
|
-
} else if (location === "local") {
|
|
199
|
-
const { root } = (0, import_path.parse)(process.cwd());
|
|
200
|
-
let path = process.cwd();
|
|
201
|
-
const localPaths = [(0, import_path.join)(path, "node_modules")];
|
|
202
|
-
while (path !== root) {
|
|
203
|
-
path = (0, import_path.dirname)(path);
|
|
204
|
-
localPaths.push((0, import_path.join)(path, "node_modules"));
|
|
205
|
-
}
|
|
206
|
-
for (const localPath of localPaths) {
|
|
207
|
-
const pkgPath = (0, import_path.join)(localPath, pkgName, "package.json");
|
|
208
|
-
if ((0, import_fs.existsSync)(pkgPath)) {
|
|
209
|
-
return (_d = require(pkgPath)) == null ? void 0 : _d.version;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return void 0;
|
|
214
|
-
} catch (e) {
|
|
215
|
-
return void 0;
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
var getInfo = (pkg, options) => __async(void 0, null, function* () {
|
|
219
|
-
const i = pkg.lastIndexOf("@");
|
|
220
|
-
let pkgInfo = {
|
|
221
|
-
name: i > 1 ? pkg.slice(0, i) : pkg,
|
|
222
|
-
wantedTagOrRange: i > 1 ? pkg.slice(i + 1) : "latest",
|
|
223
|
-
updatesAvailable: false
|
|
224
|
-
};
|
|
225
|
-
try {
|
|
226
|
-
pkgInfo = __spreadValues(__spreadProps(__spreadValues({}, pkgInfo), {
|
|
227
|
-
local: getInstalledVersion(pkgInfo.name, "local"),
|
|
228
|
-
globalNpm: getInstalledVersion(pkgInfo.name, "globalNpm"),
|
|
229
|
-
globalYarn: getInstalledVersion(pkgInfo.name, "globalYarn")
|
|
230
|
-
}), yield getRegistryVersions(pkgInfo.name, pkgInfo.wantedTagOrRange, options));
|
|
231
|
-
const local = pkgInfo.local && pkgInfo.wanted ? (0, import_gt.default)(pkgInfo.wanted, pkgInfo.local) ? pkgInfo.wanted : false : false;
|
|
232
|
-
const globalNpm = pkgInfo.globalNpm && pkgInfo.wanted ? (0, import_gt.default)(pkgInfo.wanted, pkgInfo.globalNpm) ? pkgInfo.wanted : false : false;
|
|
233
|
-
const globalYarn = pkgInfo.globalYarn && pkgInfo.wanted ? (0, import_gt.default)(pkgInfo.wanted, pkgInfo.globalYarn) ? pkgInfo.wanted : false : false;
|
|
234
|
-
pkgInfo.updatesAvailable = local || globalNpm || globalYarn ? { local, globalNpm, globalYarn } : false;
|
|
235
|
-
} catch (err) {
|
|
236
|
-
pkgInfo.error = (err == null ? void 0 : err.message) || err;
|
|
237
|
-
}
|
|
238
|
-
return pkgInfo;
|
|
239
|
-
});
|
|
240
|
-
var latestVersion = (arg, options) => __async(void 0, null, function* () {
|
|
241
|
-
const pkgs = [];
|
|
242
|
-
if (typeof arg === "string") {
|
|
243
|
-
pkgs.push(arg);
|
|
244
|
-
} else if (Array.isArray(arg)) {
|
|
245
|
-
pkgs.push(...arg);
|
|
246
|
-
} else if (isPackageJson(arg)) {
|
|
247
|
-
const addDeps = (deps) => {
|
|
248
|
-
if (deps) {
|
|
249
|
-
pkgs.push(...Object.keys(deps).map((key) => `${key}@${deps[key]}`));
|
|
250
|
-
}
|
|
251
|
-
};
|
|
252
|
-
addDeps(arg.dependencies);
|
|
253
|
-
addDeps(arg.devDependencies);
|
|
254
|
-
addDeps(arg.peerDependencies);
|
|
255
|
-
}
|
|
256
|
-
const jobs = yield Promise.allSettled(pkgs.map((pkg) => getInfo(pkg, options)));
|
|
257
|
-
const results = jobs.map((jobResult) => jobResult.value);
|
|
258
|
-
return typeof arg === "string" ? results[0] : results;
|
|
259
|
-
});
|
|
260
|
-
var src_default = latestVersion;
|
|
261
|
-
|
|
262
|
-
// src/cli.ts
|
|
49
|
+
var import_index = __toESM(require("./index"));
|
|
263
50
|
var import_major = __toESM(require("semver/functions/major"));
|
|
264
51
|
var import_diff = __toESM(require("semver/functions/diff"));
|
|
265
52
|
var import_ora = __toESM(require("ora"));
|
|
@@ -422,26 +209,31 @@ var displayTable = (updates) => {
|
|
|
422
209
|
console.log((0, import_safe.green)("\u{1F389} Packages are up-to-date"));
|
|
423
210
|
}
|
|
424
211
|
};
|
|
425
|
-
var checkVersions = (_0, ...
|
|
212
|
+
var checkVersions = (_0, _1, ..._2) => __async(exports, [_0, _1, ..._2], function* (packages, skipMissing, options = { useCache: true }) {
|
|
426
213
|
const spinner = (0, import_ora.default)({ text: (0, import_safe.cyan)("Checking versions...") });
|
|
427
214
|
spinner.start();
|
|
428
|
-
|
|
215
|
+
let latestVersionPackages = yield (0, import_index.default)(packages, options);
|
|
216
|
+
if (skipMissing) {
|
|
217
|
+
latestVersionPackages = latestVersionPackages.filter((pkg) => pkg.local || pkg.globalNpm || pkg.globalYarn);
|
|
218
|
+
}
|
|
429
219
|
spinner.stop();
|
|
430
220
|
displayTable(latestVersionPackages);
|
|
431
221
|
});
|
|
432
222
|
void (() => __async(exports, null, function* () {
|
|
433
223
|
let args = process.argv.slice(2);
|
|
224
|
+
const skipMissing = args.includes("--skip-missing");
|
|
225
|
+
args = args.filter((arg) => !arg.startsWith("-"));
|
|
434
226
|
if (args.length === 1 && args[0].endsWith("package.json")) {
|
|
435
|
-
if ((0,
|
|
436
|
-
process.chdir((0,
|
|
437
|
-
yield checkVersions(JSON.parse((0,
|
|
227
|
+
if ((0, import_fs.existsSync)(args[0])) {
|
|
228
|
+
process.chdir((0, import_path.dirname)(args[0]));
|
|
229
|
+
yield checkVersions(JSON.parse((0, import_fs.readFileSync)(args[0]).toString()), skipMissing);
|
|
438
230
|
} else {
|
|
439
231
|
console.log((0, import_safe.cyan)("No package.json file were found"));
|
|
440
232
|
}
|
|
441
233
|
} else {
|
|
442
234
|
let localPkgJson;
|
|
443
|
-
if ((0,
|
|
444
|
-
localPkgJson = JSON.parse((0,
|
|
235
|
+
if ((0, import_fs.existsSync)("package.json")) {
|
|
236
|
+
localPkgJson = JSON.parse((0, import_fs.readFileSync)("package.json").toString());
|
|
445
237
|
}
|
|
446
238
|
if (args.length) {
|
|
447
239
|
args = args.map((arg) => {
|
|
@@ -455,9 +247,9 @@ void (() => __async(exports, null, function* () {
|
|
|
455
247
|
}
|
|
456
248
|
return arg;
|
|
457
249
|
});
|
|
458
|
-
yield checkVersions(args);
|
|
250
|
+
yield checkVersions(args, skipMissing);
|
|
459
251
|
} else if (localPkgJson) {
|
|
460
|
-
yield checkVersions(localPkgJson);
|
|
252
|
+
yield checkVersions(localPkgJson, skipMissing);
|
|
461
253
|
} else {
|
|
462
254
|
console.log((0, import_safe.cyan)("No packages were found"));
|
|
463
255
|
}
|
package/index.js
CHANGED
|
@@ -35,6 +35,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
35
35
|
return to;
|
|
36
36
|
};
|
|
37
37
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
38
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
39
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
40
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
41
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
38
42
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
39
43
|
mod
|
|
40
44
|
));
|