Skip to content

Commit 1f79f5c

Browse files
committed
feat: add releases product to api-js
1 parent c816604 commit 1f79f5c

File tree

2 files changed

+81
-3
lines changed

2 files changed

+81
-3
lines changed

api-js/src/SDKMeta.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import sdkRepos from './data/repos.json'
33
import sdkNames from './data/names.json'
44
import sdkTypes from './data/types.json'
55
import sdkPopularity from './data/popularity.json'
6+
import sdkReleases from './data/releases.json'
67

78
export enum Type {
89
// ClientSide is an SDK that runs in a client scenario.
@@ -29,9 +30,41 @@ export const Languages: Record<string, string[]> = sdkLanguages;
2930
export const Names: Record<string, string> = sdkNames;
3031
export const Repos: Record<string, Repo> = sdkRepos;
3132
export const Popularity: Record<string, number> = sdkPopularity;
33+
export const Releases: ReleaseList = Object.fromEntries(
34+
Object.entries(sdkReleases).map(([key, value]) => [
35+
key,
36+
value.map((release: any) => ({
37+
Major: release["major"],
38+
Minor: release["minor"],
39+
Date: new Date(release["date"]),
40+
EOL: release["eol"] ? new Date(release["eol"]) : null
41+
}))
42+
]));
3243

3344
export const Types: Record<string, Type> = Object.fromEntries(
3445
Object.entries(sdkTypes).map(([key, value]) => [
3546
key,
3647
isType(value) ? value : Type.Unknown
3748
]));
49+
50+
51+
export interface Release {
52+
Major: number;
53+
Minor: number;
54+
Date: Date;
55+
EOL: Date | null;
56+
}
57+
58+
export interface ReleaseList {
59+
[key: string]: Release[];
60+
}
61+
62+
export namespace ReleaseHelpers {
63+
export const IsLatest = (release: Release) => release.EOL === null;
64+
export const IsEOL = (release: Release, now: Date) => !IsLatest(release) && now > release.EOL!;
65+
export const IsApproachingEOL = (release: Release, now: Date, thresholdPrior: number) =>
66+
!IsLatest(release) && now.getTime() + thresholdPrior > release.EOL!.getTime();
67+
68+
export const Earliest = (releases: Release[]) => releases[releases.length - 1];
69+
export const Latest = (releases: Release[]) => releases[0];
70+
}

api-js/tests/e2e.test.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Names, Repos, Types, Type, Popularity, Languages } from '../src/SDKMeta';
1+
import { Names, Repos, Types, Type, Popularity, Languages, Releases, ReleaseHelpers } from '../src/SDKMeta';
22

33
test('names', () => {
44
expect(Names['node-server']).toBe('Node.js Server SDK');
@@ -17,8 +17,53 @@ test('types', () => {
1717
expect(Types['node-server']).toBe('server-side');
1818
});
1919

20-
21-
2220
test('popularity', () => {
2321
expect(Popularity['node-server']).toBe(2);
2422
});
23+
24+
test('releases', () => {
25+
const firstNodeReleaseDate = new Date("2015-05-13T16:55:00Z");
26+
const firstNodeReleaseEOL = new Date("2016-09-12T00:00:00Z");
27+
28+
expect(Releases['node-server'].length).toBeGreaterThanOrEqual(1);
29+
30+
const firstRelease = ReleaseHelpers.Earliest(Releases['node-server']);
31+
expect(firstRelease.Major).toBe(1);
32+
expect(firstRelease.Minor).toBe(0);
33+
expect(ReleaseHelpers.IsLatest(firstRelease)).toBe(false);
34+
35+
expect(firstRelease.Date).toEqual(firstNodeReleaseDate);
36+
expect(firstRelease.EOL).not.toBeNull();
37+
expect(firstRelease.EOL).toEqual(firstNodeReleaseEOL);
38+
39+
const latestRelease = ReleaseHelpers.Latest(Releases['node-server']);
40+
expect(latestRelease.Major).toBeGreaterThanOrEqual(9);
41+
expect(latestRelease.Minor).toBeGreaterThanOrEqual(4);
42+
expect(latestRelease.EOL).toBeNull();
43+
expect(ReleaseHelpers.IsLatest(latestRelease)).toBe(true);
44+
})
45+
46+
test('eol calculations', () => {
47+
const releases = Releases['node-server'];
48+
const earliest = ReleaseHelpers.Earliest(releases);
49+
const latest = ReleaseHelpers.Latest(releases);
50+
const earliestEOL = new Date("2016-09-12T00:00:00Z");
51+
52+
// Checking that the latest release is not yet EOL
53+
expect(ReleaseHelpers.IsEOL(latest, new Date())).toBe(false);
54+
// Checking that the earliest release becomes EOL if we pass in a "current" date of its EOL + 1 second
55+
expect(ReleaseHelpers.IsEOL(earliest, new Date(earliestEOL.getTime() + 1000))).toBe(true);
56+
57+
// Check the "approaching EOL" logic for the earliest release by passing in different values of "current" date.
58+
const minute = 60 * 1000;
59+
const hour = 60 * minute;
60+
const hour_and_1_minute = 61 * minute;
61+
const fifty_nine_minutes = 59 * minute;
62+
const thirty_minutes = 30 * minute;
63+
64+
expect(ReleaseHelpers.IsApproachingEOL(earliest, new Date(earliestEOL.getTime() - hour_and_1_minute), hour)).toBe(false);
65+
expect(ReleaseHelpers.IsApproachingEOL(earliest, new Date(earliestEOL.getTime() - hour), hour)).toBe(false);
66+
expect(ReleaseHelpers.IsApproachingEOL(earliest, new Date(earliestEOL.getTime() - fifty_nine_minutes), hour)).toBe(true);
67+
expect(ReleaseHelpers.IsApproachingEOL(earliest, new Date(earliestEOL.getTime() - thirty_minutes), hour)).toBe(true);
68+
expect(ReleaseHelpers.IsApproachingEOL(earliest, new Date(earliestEOL.getTime() - minute), hour)).toBe(true);
69+
})

0 commit comments

Comments
 (0)