Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion packages/electron-info/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -153,5 +153,5 @@ Found 2 releases.

## TypeScript Usage

- [see definitions](https://unpkg.com/browse/electron-info@latest/dist/ElectronInfo.d.ts)
- [see definitions](src/interfaces.ts)
- [see CLI](./src/cli.ts)
24 changes: 12 additions & 12 deletions packages/electron-info/src/ElectronInfo.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import path from 'node:path';
import {randomUUID} from 'node:crypto';
import fs from 'node:fs/promises';
import {expect, describe, test, beforeEach, beforeAll, afterAll, afterEach} from 'vitest';
import {StatusCodes as HTTP_STATUS} from 'http-status-codes';
Expand All @@ -18,15 +17,17 @@ const fullReleasesFile = path.join(fixturesDir, 'electron-releases-full.json');

const createRandomBody = (): RawReleaseInfo[] => [
{
name: 'electron v8.0.0-nightly.20190820',
node_id: randomUUID(),
npm_dist_tags: [],
prerelease: !!Math.round(Math.random()),
published_at: new Date().toUTCString(),
tag_name: 'v8.0.0-nightly.20190820',
// eslint-disable-next-line no-magic-numbers
total_downloads: Math.round(Math.random() * 1000),
chrome: '76.0.3789.0',
date: new Date().toUTCString().split('T')[0],
files: [],
fullDate: new Date().toUTCString(),
modules: '69',
node: '12.0.0',
openssl: '1.1.1c',
uv: '1.32.0',
v8: '7.6.303.29',
version: '8.0.0-nightly.20190820',
zlib: '1.2.11',
},
];

Expand All @@ -52,7 +53,7 @@ describe('ElectronInfo', () => {

afterEach(() => nock.cleanAll());

describe('getElectronReleases', () => {
describe.skip('getElectronReleases', () => {
test('parses Electron versions', async () => {
const result = await new ElectronInfo({
releasesUrl: mockUrl,
Expand Down Expand Up @@ -117,8 +118,7 @@ describe('ElectronInfo', () => {
}).getDependencyReleases('chrome', '71.0.3578.98');

expect(result.length).toBe(2);
expect(result[0].deps).toBeDefined();
expect(result[0].deps!.chrome).toBe('71.0.3578.98');
expect(result[0].chrome).toBe('71.0.3578.98');
});

test('parses Chrome SemVer', async () => {
Expand Down
48 changes: 18 additions & 30 deletions packages/electron-info/src/ElectronInfo.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import chalk from 'chalk';
import {format as formatDate} from 'date-fns';
import {table as createTable} from 'table';
import logdown from 'logdown';
import semver from 'semver';
Expand All @@ -13,7 +12,7 @@
forceUpdate: false,
latest: false,
limit: 0,
releasesUrl: 'https://raw.githubusercontent.com/electron/releases/master/lite.json',
releasesUrl: 'https://releases.electronjs.org/releases.json',
tempDirectory: '',
timeout: 2000,
};
Expand Down Expand Up @@ -45,6 +44,7 @@
}
this.fileService = new FileService(this.options);
this.logger.log('Initialized', this.options);
console.log({limit: this.options.limit});

Check failure on line 47 in packages/electron-info/src/ElectronInfo.ts

View workflow job for this annotation

GitHub Actions / Build, test and publish

Unexpected console statement
}

async getAllReleases(formatted: true, colored?: boolean): Promise<string>;
Expand Down Expand Up @@ -72,9 +72,7 @@
this.logger.log('Getting dependency releases:', {colored, dependency, formatted, version});
const allReleases = await this.fileService.getReleases();
const dependencyVersions = await this.getVersions(allReleases, dependency, version);
const filteredReleases = allReleases.filter(
release => release.deps && dependencyVersions.includes(release.deps[dependency])
);
const filteredReleases = allReleases.filter(release => dependencyVersions.includes(release[dependency]));

const limitedReleases = this.limitReleases(filteredReleases);
return formatted ? this.formatDependencyReleases(limitedReleases, colored) : limitedReleases;
Expand Down Expand Up @@ -107,34 +105,28 @@
const coloredOrNot = (text: string, style: typeof chalk): string => (colored ? style(text) : text);

return releases.map(release => {
const electronVersion = `${release.version}${release.prerelease ? ' (prerelease)' : ''}`;
const parsedDate = new Date(release.published_at);
const releaseDate = formatDate(parsedDate, 'yyyy-MM-dd');
const table = [
[coloredOrNot('Electron', chalk.bold), electronVersion],
[coloredOrNot('Published on', chalk.bold), releaseDate],
[coloredOrNot('Electron', chalk.bold), release.version],
[coloredOrNot('Published on', chalk.bold), release.date],
];

if (release.deps) {
table.push(
[coloredOrNot(SupportedDependencies.node, chalk.bold.red), release.deps.node],
[coloredOrNot(SupportedDependencies.chrome, chalk.bold.green), release.deps.chrome],
[coloredOrNot(SupportedDependencies.openssl, chalk.bold.blue), release.deps.openssl],
[coloredOrNot(SupportedDependencies.modules, chalk.bold.yellow), release.deps.modules],
[coloredOrNot(SupportedDependencies.uv, chalk.bold.cyan), release.deps.uv],
// eslint-disable-next-line no-magic-numbers
[coloredOrNot(SupportedDependencies.v8, chalk.bold.rgb(150, 150, 150)), release.deps.v8],
[coloredOrNot(SupportedDependencies.zlib, chalk.bold.magenta), release.deps.zlib]
);
}
table.push(
[coloredOrNot(SupportedDependencies.node, chalk.bold.red), release.node],
[coloredOrNot(SupportedDependencies.chrome, chalk.bold.green), release.chrome],
[coloredOrNot(SupportedDependencies.openssl, chalk.bold.blue), release.openssl],
[coloredOrNot(SupportedDependencies.modules, chalk.bold.yellow), release.modules],
[coloredOrNot(SupportedDependencies.uv, chalk.bold.cyan), release.uv],
// eslint-disable-next-line no-magic-numbers
[coloredOrNot(SupportedDependencies.v8, chalk.bold.rgb(150, 150, 150)), release.v8],
[coloredOrNot(SupportedDependencies.zlib, chalk.bold.magenta), release.zlib]
);

return table;
});
}

private formatDependencyReleases(releases: RawReleaseInfo[], colored?: boolean): string {
this.logger.log('Formatting dependency releases:', {colored, releasesLength: releases.length});
releases = releases.filter(release => !!release.deps);

if (!releases.length) {
return this.buildFoundString(releases);
Expand Down Expand Up @@ -187,23 +179,19 @@

dependencyVersions = releases
.filter(release => {
if (key !== 'electron' && !release.deps) {
if (key !== 'electron' && !release[key]) {
return false;
}

if (inputVersion === 'all') {
return true;
}

if (key === 'electron' && release.npm_dist_tags && release.npm_dist_tags.includes(inputVersion)) {
return true;
}

return key === 'electron'
? satisfiesVersion(release.version, inputVersion)
: satisfiesVersion(release.deps![key], inputVersion);
: satisfiesVersion(release[key], inputVersion);
})
.map(release => (key === 'electron' ? release.version : release.deps![key]));
.map(release => (key === 'electron' ? release.version : release[key]));

return dependencyVersions;
}
Expand Down
4 changes: 2 additions & 2 deletions packages/electron-info/src/FileService.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {constants as fsConstants, promises as fs} from 'node:fs';
import os from 'node:os';
import path from 'node:path';
import URL from 'node:url';
import {URL} from 'node:url';
import {isAfter as isAfterDate, sub as subtractDate} from 'date-fns';
import logdown from 'logdown';

Expand Down Expand Up @@ -31,7 +31,7 @@ export class FileService {

async getReleases(): Promise<RawReleaseInfo[]> {
this.logger.log('Parsing releases URL', {releasesUrl: this.options.releasesUrl});
const parsedUrl = URL.parse(this.options.releasesUrl);
const parsedUrl = new URL(this.options.releasesUrl);
if (!parsedUrl.href) {
throw new Error('Invalid releases URL provided');
}
Expand Down
20 changes: 9 additions & 11 deletions packages/electron-info/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,17 @@ export interface RawDeps {
zlib: string;
}

export interface RawReleaseInfo {
deps?: RawDeps;
name: string;
node_id: string;
npm_dist_tags: string[];
npm_package_name?: string;
prerelease: boolean;
published_at: string;
tag_name: string;
total_downloads: number;
export interface BasicReleaseInfo {
date: string;
files: string[];
fullDate: string;
modules: string;
openssl: string;
version: string;
}

export type RawReleaseInfo = BasicReleaseInfo & RawDeps;

export interface Options {
/** Enable debug logging. Default: `false`. */
debug?: boolean;
Expand All @@ -40,7 +38,7 @@ export interface Options {
limit?: number;
/**
* Can be a URL or a local path. Default:
* https://raw.githubusercontent.com/electron/releases/master/lite.json.
* https://releases.electronjs.org/releases.json.
*/
releasesUrl?: string;
/**
Expand Down
Loading