Skip to content

Commit 3b02aca

Browse files
committed
chore(lint,scripts): migrate to release array
1 parent 66747e3 commit 3b02aca

19 files changed

+170
-127
lines changed

lint/linter/test-browsers-data.test.ts

+22-18
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,18 @@ describe('test-browsers-data', () => {
2222
type: 'server',
2323
accepts_flags: true,
2424
accepts_webextensions: false,
25-
releases: {
26-
'20.6.0': {
25+
releases: [
26+
{
27+
version: '20.6.0',
2728
release_date: '2023-09-04',
2829
status: 'current',
2930
},
30-
'21.2.0': {
31+
{
32+
version: '21.2.0',
3133
release_date: '2023-11-14',
3234
status: 'current',
3335
},
34-
},
36+
],
3537
};
3638

3739
test.check(logger, { data, path: { browser } });
@@ -45,10 +47,10 @@ describe('test-browsers-data', () => {
4547
type: 'desktop',
4648
accepts_flags: true,
4749
accepts_webextensions: true,
48-
releases: {
49-
'1': { status: 'nightly' },
50-
'2': { status: 'nightly' },
51-
},
50+
releases: [
51+
{ version: '1', status: 'nightly' },
52+
{ version: '2', status: 'nightly' },
53+
],
5254
};
5355
test.check(logger, { data, path: { browser } });
5456
assert.equal(logger.messages.length, 1);
@@ -61,10 +63,10 @@ describe('test-browsers-data', () => {
6163
type: 'server',
6264
accepts_flags: true,
6365
accepts_webextensions: false,
64-
releases: {
65-
'1': { status: 'nightly' },
66-
'2': { status: 'nightly' },
67-
},
66+
releases: [
67+
{ version: '1', status: 'nightly' },
68+
{ version: '2', status: 'nightly' },
69+
],
6870
};
6971
test.check(logger, { data, path: { browser } });
7072
assert.equal(logger.messages.length, 1);
@@ -78,7 +80,7 @@ describe('test-browsers-data', () => {
7880
upstream: browser,
7981
accepts_flags: false,
8082
accepts_webextensions: false,
81-
releases: {},
83+
releases: [],
8284
};
8385

8486
test.check(logger, { data, path: { browser } });
@@ -93,7 +95,7 @@ describe('test-browsers-data', () => {
9395
upstream: 'unknown' as any,
9496
accepts_flags: false,
9597
accepts_webextensions: false,
96-
releases: {},
98+
releases: [],
9799
};
98100

99101
test.check(logger, { data, path: { browser } });
@@ -109,18 +111,20 @@ describe('test-browsers-data', () => {
109111
pref_url: 'opera://flags',
110112
accepts_flags: true,
111113
accepts_webextensions: true,
112-
releases: {
113-
'97': {
114+
releases: [
115+
{
116+
version: '97',
114117
status: 'retired',
115118
engine: 'Blink',
116119
engine_version: '111',
117120
},
118-
'98': {
121+
{
122+
version: '98',
119123
status: 'current',
120124
engine: 'Blink',
121125
engine_version: '112',
122126
},
123-
},
127+
],
124128
};
125129
test.check(logger, { data, path: { browser } });
126130
assert.equal(logger.messages.length, 2);

lint/linter/test-browsers-data.ts

+6-6
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ const processData = (
2020
logger: Logger,
2121
): void => {
2222
for (const status of ['current', 'nightly']) {
23-
const releasesForStatus = Object.entries(data.releases)
24-
.filter(([, data]) => data.status == status)
25-
.map(([version]) => version);
23+
const releasesForStatus = data.releases
24+
.filter((data) => data.status == status)
25+
.map(({ version }) => version);
2626

2727
if (releasesForStatus.length > 1) {
2828
logger.error(
@@ -56,12 +56,12 @@ const processData = (
5656
// Ignore Oculus Browser, because release dates for versions 5.0 to 15.1 are not publicly documented.
5757
continue;
5858
}
59-
const releasesWithoutDate = Object.entries(data.releases)
59+
const releasesWithoutDate = data.releases
6060
.filter(
61-
([, data]) =>
61+
(data) =>
6262
data.status == status && typeof data.release_date === 'undefined',
6363
)
64-
.map(([version]) => version);
64+
.map(({ version }) => version);
6565

6666
if (releasesWithoutDate.length > 0) {
6767
logger.error(

lint/linter/test-obsolete.test.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@ const errorTime = new Date(),
1717
warningTime = new Date();
1818
errorTime.setFullYear(errorTime.getFullYear() - 2.5);
1919
warningTime.setFullYear(warningTime.getFullYear() - 2);
20-
const release = Object.entries(browsers.chrome.releases).find((r) => {
21-
if (r[1].release_date === undefined) {
20+
const release = browsers.chrome.releases.find((r) => {
21+
if (r.release_date === undefined) {
2222
return false;
2323
}
24-
const date = new Date(r[1].release_date);
24+
const date = new Date(r.release_date);
2525
return errorTime < date && date < warningTime;
2626
});
2727

@@ -100,7 +100,7 @@ describe('implementedAndRemoved', () => {
100100
chrome: [
101101
{
102102
version_added: '2',
103-
version_removed: release[0],
103+
version_removed: release.version,
104104
},
105105
{
106106
version_added: '1',
@@ -130,7 +130,7 @@ describe('implementedAndRemoved', () => {
130130
implementedAndRemoved({
131131
chrome: {
132132
version_added: '1',
133-
version_removed: Object.keys(browsers.chrome.releases)[-1],
133+
version_removed: browsers.chrome.releases.at(-1)?.version,
134134
},
135135
}),
136136
false,
@@ -140,7 +140,7 @@ describe('implementedAndRemoved', () => {
140140
chrome: [
141141
{
142142
version_added: '2',
143-
version_removed: Object.keys(browsers.chrome.releases)[-1],
143+
version_removed: browsers.chrome.releases.at(-1)?.version,
144144
},
145145
{
146146
version_added: '1',
@@ -161,7 +161,7 @@ describe('implementedAndRemoved', () => {
161161
it('rule 2 warning: returns "warning" for features which were implemented and removed some time ago', () => {
162162
// Make sure there is a suitable release
163163
assert.ok(release);
164-
const version_removed = release[0];
164+
const version_removed = release.version;
165165
assert.equal(
166166
implementedAndRemoved({
167167
chrome: {
@@ -260,7 +260,7 @@ describe('processData', () => {
260260
const logger = new Logger('', '');
261261
// Make sure there is a suitable release
262262
assert.ok(release);
263-
const version_removed = release[0];
263+
const version_removed = release.version;
264264
processData(logger, {
265265
support: {
266266
chrome: {

lint/linter/test-obsolete.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33

44
import chalk from 'chalk-template';
55

6-
import { Linter, Logger, LinterData, LinterMessageLevel } from '../utils.js';
6+
import {
7+
findBrowserRelease,
8+
Linter,
9+
Logger,
10+
LinterData,
11+
LinterMessageLevel,
12+
} from '../utils.js';
713
import { BrowserName, CompatStatement } from '../../types/types.js';
814
import {
915
InternalSupportBlock,
@@ -85,8 +91,11 @@ export const implementedAndRemoved = (
8591
return false;
8692
}
8793

88-
const releaseDateData =
89-
browsers[browser].releases[d.version_removed].release_date;
94+
const releaseDateData = findBrowserRelease(
95+
browsers,
96+
browser,
97+
d.version_removed,
98+
)?.release_date;
9099

91100
// No browser release date
92101
if (!releaseDateData) {

lint/linter/test-status.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export const checkExperimental = (data: CompatStatement): boolean => {
3838
const engineSupport = new Set();
3939

4040
for (const browser of browserSupport) {
41-
const currentRelease = Object.values(browsers[browser].releases).find(
41+
const currentRelease = browsers[browser].releases.find(
4242
(r) => r.status === 'current',
4343
);
4444
const engine = currentRelease?.engine;

lint/linter/test-versions.ts

+3-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import { compare, validate } from 'compare-versions';
55
import chalk from 'chalk-template';
66

7-
import { Linter, Logger, LinterData } from '../utils.js';
7+
import { findBrowserRelease, Linter, Logger, LinterData } from '../utils.js';
88
import {
99
BrowserName,
1010
SimpleSupportStatement,
@@ -78,7 +78,7 @@ const isValidVersion = (
7878
if (version === 'preview') {
7979
return !!browsers[browser].preview_name;
8080
}
81-
return Object.hasOwn(browsers[browser].releases, version.replace('≤', ''));
81+
return !!findBrowserRelease(browsers, browser, version.replace('≤', ''));
8282
} else if (
8383
realValuesRequired[category].includes(browser) &&
8484
version !== false
@@ -185,8 +185,7 @@ const checkVersions = (
185185
}
186186

187187
if (typeof version === 'string' && version.startsWith('≤')) {
188-
const releaseData =
189-
browsers[browser].releases[version.replace('≤', '')];
188+
const releaseData = findBrowserRelease(browsers, browser, version);
190189
if (
191190
!releaseData ||
192191
!releaseData.release_date ||

lint/utils.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { platform } from 'node:os';
66
import chalk from 'chalk-template';
77

88
import { DataType } from '../types/index.js';
9-
import { BrowserName } from '../types/types.js';
9+
import { BrowserName, Browsers, ReleaseStatement } from '../types/types.js';
1010

1111
export interface LintOptions {
1212
only?: string[];
@@ -268,3 +268,21 @@ export class Linters {
268268
}
269269
}
270270
}
271+
272+
/**
273+
* Finds a browser release.
274+
* @param browsers the browser data.
275+
* @param browser the name of the browser.
276+
* @param version the version of the release.
277+
* @returns the browser release if it exists, or undefined.
278+
*/
279+
export const findBrowserRelease = (
280+
browsers: Browsers,
281+
browser: string,
282+
version: string,
283+
): ReleaseStatement | undefined => {
284+
version = version.replace('≤', '');
285+
return browsers[browser].releases.find(
286+
(release) => release.version === version,
287+
);
288+
};

scripts/build/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ const getPreviousVersion = (
8888
version: VersionValue,
8989
): VersionValue => {
9090
if (typeof version === 'string' && !version.startsWith('≤')) {
91-
const browserVersions = Object.keys(bcd.browsers[browser].releases).sort(
92-
compareVersions,
91+
const browserVersions = bcd.browsers[browser].releases.map(
92+
({ version }) => version,
9393
);
9494
const currentVersionIndex = browserVersions.indexOf(version);
9595
if (currentVersionIndex > 0) {

scripts/build/mirror.ts

+16-8
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
SupportStatement,
1111
} from '../../types/types.js';
1212
import { InternalSupportBlock } from '../../types/index.js';
13+
import { findBrowserRelease } from '../lib/browsers.js';
1314

1415
const { browsers } = bcd;
1516

@@ -71,17 +72,24 @@ export const getMatchingBrowserVersion = (
7172
if (v) {
7273
return (range ? '≤' : '') + v;
7374
}
74-
if (sourceVersion.replace('≤', '') in browserData.releases) {
75+
if (
76+
browserData.releases
77+
.map(({ version }) => version)
78+
.includes(sourceVersion.replace('≤', ''))
79+
) {
7580
return sourceVersion;
7681
}
7782
throw new Error(`Cannot find iOS version matching Safari ${sourceVersion}`);
7883
}
7984

80-
const releaseKeys = Object.keys(browserData.releases);
81-
releaseKeys.sort(compareVersions);
85+
const releaseVersions = browserData.releases.map((r) => r.version);
86+
releaseVersions.sort(compareVersions);
8287

83-
const sourceRelease =
84-
browsers[browserData.upstream].releases[sourceVersion.replace('≤', '')];
88+
const sourceRelease = findBrowserRelease(
89+
browsers,
90+
browserData.upstream,
91+
sourceVersion,
92+
);
8593

8694
if (!sourceRelease) {
8795
throw new Error(
@@ -91,8 +99,8 @@ export const getMatchingBrowserVersion = (
9199

92100
let previousReleaseEngine;
93101

94-
for (const r of releaseKeys) {
95-
const release = browserData.releases[r];
102+
for (const v of releaseVersions) {
103+
const release = browserData.releases.find((r) => r.version === v)!;
96104

97105
// Add a range delimiter if there were previous releases of the downstream browser that used the same engine before this one (ex. after Edge 79)
98106
const rangeDelimiter =
@@ -112,7 +120,7 @@ export const getMatchingBrowserVersion = (
112120
compare(release.engine_version, sourceRelease.engine_version, '>=');
113121

114122
if (isChromeWebKitToBlink || isMatchingVersion) {
115-
return rangeDelimiter ? `≤${r}` : r;
123+
return rangeDelimiter ? `≤${v}` : v;
116124
}
117125

118126
previousReleaseEngine = release.engine;

scripts/lib/browsers.ts

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { Browsers, ReleaseStatement } from '../../types/types.js';
2+
3+
/**
4+
* Finds a browser release.
5+
* @param browsers the browser data.
6+
* @param browser the name of the browser.
7+
* @param version the version of the release.
8+
* @returns the browser release if it exists, or undefined.
9+
*/
10+
export const findBrowserRelease = (
11+
browsers: Browsers,
12+
browser: string,
13+
version: string,
14+
): ReleaseStatement | undefined => {
15+
version = version.replace('≤', '');
16+
return browsers[browser].releases.find(
17+
(release) => release.version === version,
18+
);
19+
};

scripts/lib/stringify-and-order-properties.test.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -33,16 +33,16 @@ describe('Order Properties', () => {
3333
const input = {
3434
browsers: {
3535
firefox: {
36-
releases: {
37-
'1.5': { version: '1.5', release_date: '2008-11-14' },
38-
'1': { version: '1', release_date: '2008-09-02' },
39-
},
36+
releases: [
37+
{ version: '1.5', release_date: '2008-11-14' },
38+
{ version: '1', release_date: '2008-09-02' },
39+
],
4040
},
4141
},
4242
};
4343

4444
const expected =
45-
'{\n "browsers": {\n "firefox": {\n "releases": {\n "1": {\n "release_date": "2008-09-02"\n },\n "1.5": {\n "release_date": "2008-11-14"\n }\n }\n }\n }\n}';
45+
'{\n "browsers": {\n "firefox": {\n "releases": [\n {\n "version": "1",\n "release_date": "2008-09-02"\n },\n {\n "version": "1.5",\n "release_date": "2008-11-14"\n }\n ]\n }\n }\n}';
4646

4747
const result = stringifyAndOrderProperties(input);
4848
assert.deepEqual(result, expected);

0 commit comments

Comments
 (0)