@wbce-d9/update-check 9.26.3

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/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ import { URL } from 'node:url';
2
+ import { gte } from 'semver';
3
+ import { fetch } from 'undici';
4
+ /**
5
+ * Check if a given package version is the most up to date release of that package. Returns the
6
+ * latest version string if package is not up to date, returns null if package is up to date.
7
+ */
8
+ export const isUpToDate = async (name, version) => {
9
+ const url = new URL(name, 'https://registry.npmjs.org');
10
+ const response = await fetch(url, {
11
+ headers: {
12
+ accept: 'application/vnd.npm.install-v1+json; q=1.0, application/json; q=0.8, */*',
13
+ },
14
+ });
15
+ if (!response.ok) {
16
+ throw new Error(`Couldn't find latest version for package "${name}": ${response.status} ${response.statusText}`);
17
+ }
18
+ const packageInformation = (await response.json());
19
+ const latest = packageInformation?.['dist-tags']?.['latest'];
20
+ if (!latest) {
21
+ throw new Error(`Couldn't find latest version for package "${name}"`);
22
+ }
23
+ const upToDate = gte(version, latest);
24
+ if (upToDate === false) {
25
+ return latest;
26
+ }
27
+ return null;
28
+ };
@@ -0,0 +1,72 @@
1
+ import { randNumber, randSemver, randSentence, randWord } from '@ngneat/falso';
2
+ import { URL } from 'node:url';
3
+ import { gte } from 'semver';
4
+ import { fetch } from 'undici';
5
+ import { afterEach, beforeEach, expect, test, vi } from 'vitest';
6
+ import { isUpToDate } from './index.js';
7
+ vi.mock('semver');
8
+ vi.mock('undici');
9
+ vi.mock('node:url');
10
+ let sample;
11
+ let mockResponse;
12
+ let mockResponseJson;
13
+ beforeEach(() => {
14
+ sample = {
15
+ name: randWord(),
16
+ version: randSemver(),
17
+ latest: randSemver(),
18
+ };
19
+ mockResponseJson = { 'dist-tags': { latest: sample.latest } };
20
+ mockResponse = { ok: true, json: vi.fn().mockResolvedValue(mockResponseJson) };
21
+ vi.mocked(fetch).mockResolvedValue(mockResponse);
22
+ });
23
+ afterEach(() => {
24
+ vi.resetAllMocks();
25
+ });
26
+ test('Creates URL for given package name', async () => {
27
+ await isUpToDate(sample.name, sample.version);
28
+ expect(URL).toHaveBeenCalledWith(sample.name, 'https://registry.npmjs.org');
29
+ });
30
+ test('Throws error if response is not ok', async () => {
31
+ mockResponse.ok = false;
32
+ mockResponse.status = randNumber({ min: 400, max: 599 });
33
+ mockResponse.statusText = randSentence();
34
+ try {
35
+ await isUpToDate(sample.name, sample.version);
36
+ }
37
+ catch (err) {
38
+ expect(err).toBeInstanceOf(Error);
39
+ expect(err.message).toBe(`Couldn't find latest version for package "${sample.name}": ${mockResponse.status} ${mockResponse.statusText}`);
40
+ }
41
+ });
42
+ test('Extracts latest version from package information', async () => {
43
+ await isUpToDate(sample.name, sample.version);
44
+ expect(mockResponse.json).toHaveBeenCalledOnce();
45
+ });
46
+ test('Throws error if latest version does not exist in json response', async () => {
47
+ mockResponseJson['dist-tags'] = {};
48
+ try {
49
+ await isUpToDate(sample.name, sample.version);
50
+ }
51
+ catch (err) {
52
+ expect(err).toBeInstanceOf(Error);
53
+ expect(err.message).toBe(`Couldn't find latest version for package "${sample.name}"`);
54
+ }
55
+ });
56
+ test('Uses semver.gte to check if passed version is bigger than latest', async () => {
57
+ sample.latest = '9.23.4';
58
+ sample.version = '10.0.0';
59
+ mockResponseJson['dist-tags'].latest = sample.latest;
60
+ await isUpToDate(sample.name, sample.version);
61
+ expect(gte).toHaveBeenCalledWith(sample.version, sample.latest);
62
+ });
63
+ test('Returns latest version if gte is false', async () => {
64
+ vi.mocked(gte).mockReturnValue(false);
65
+ const result = await isUpToDate(sample.name, sample.version);
66
+ expect(result).toBe(sample.latest);
67
+ });
68
+ test('Returns null if gte is true', async () => {
69
+ vi.mocked(gte).mockReturnValue(true);
70
+ const result = await isUpToDate(sample.name, sample.version);
71
+ expect(result).toBeNull();
72
+ });
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@wbce-d9/update-check",
3
+ "version": "9.26.3",
4
+ "type": "module",
5
+ "description": "Check if an update is available for a given package",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/LaWebcapsule/directus9.git",
9
+ "directory": "packages/update-check"
10
+ },
11
+ "funding": "https://github.com/LaWebcapsule/directus9?sponsor=1",
12
+ "license": "GPL-3.0",
13
+ "author": "Rijk van Zanten <rijkvanzanten@me.com>",
14
+ "exports": {
15
+ ".": "./dist/index.js",
16
+ "./package.json": "./package.json"
17
+ },
18
+ "main": "dist/index.js",
19
+ "files": [
20
+ "dist",
21
+ "!**/*.d.ts?(.map)"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "dependencies": {
27
+ "semver": "7.5.0",
28
+ "undici": "5.22.0"
29
+ },
30
+ "devDependencies": {
31
+ "@wbce-d9/tsconfig": "0.0.7",
32
+ "@ngneat/falso": "6.4.0",
33
+ "@types/semver": "7.3.13",
34
+ "@vitest/coverage-c8": "0.30.1",
35
+ "typescript": "5.0.4",
36
+ "vitest": "0.30.1"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc --build",
40
+ "dev": "tsc --watch",
41
+ "test": "vitest --watch=false"
42
+ }
43
+ }