@badisi/latest-version 6.0.0 → 6.1.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.
Files changed (4) hide show
  1. package/README.md +1 -1
  2. package/cli.js +19 -227
  3. package/index.js +4 -0
  4. 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 import_global_dirs = require("global-dirs");
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, ..._1) => __async(exports, [_0, ..._1], function* (packages, options = { useCache: true }) {
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
- const latestVersionPackages = yield src_default(packages, options);
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, import_fs2.existsSync)(args[0])) {
436
- process.chdir((0, import_path2.dirname)(args[0]));
437
- yield checkVersions(JSON.parse((0, import_fs2.readFileSync)(args[0]).toString()));
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, import_fs2.existsSync)("package.json")) {
444
- localPkgJson = JSON.parse((0, import_fs2.readFileSync)("package.json").toString());
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
  ));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@badisi/latest-version",
3
- "version": "6.0.0",
3
+ "version": "6.1.0",
4
4
  "description": "Get latest versions of packages",
5
5
  "homepage": "https://github.com/badisi/latest-version",
6
6
  "license": "MIT",