Skip to content

Commit 093b8a9

Browse files
committed
ref!: add types, switch to ESM (no bugfixes)
1 parent 76a872b commit 093b8a9

7 files changed

+1095
-946
lines changed

host-targets.js

+39-9
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
'use strict';
2-
31
/** @typedef {import('./types.js').OsString} OsString */
42
/** @typedef {import('./types.js').LibcString} LibcString */
53
/** @typedef {import('./types.js').ArchString} ArchString */
64
/** @typedef {import('./types.js').TargetTriplet} TargetTriplet */
5+
/** @typedef {import('./types.js').TargetMatcher} TargetMatcher */
76

8-
var HostTargets = module.exports;
7+
let HostTargets = {};
98

109
let reVersionOnly = /^[\d\.]+(-RELEASE)?$/;
1110
let reLeadingVer = /^\d([\d\.\-\+_])+/;
@@ -64,6 +63,7 @@ let T = {
6463
};
6564

6665
// OS, Arch, Libc
66+
/** @type {Object.<String, import('./types.js').TargetMatcher>} */
6767
HostTargets.TERMS = {
6868
// agent
6969
webi: {},
@@ -137,19 +137,21 @@ HostTargets._MATCHERS = {
137137
};
138138

139139
/**
140-
* @param {Object.<"os"|"arch"|"libc", String>} target
140+
* @param {Object.<"os"|"arch"|"libc", String>} targetIsh
141141
* @param {Array<String>} terms
142142
*/
143-
HostTargets.termsToTarget = function (target, terms) {
143+
HostTargets.termsToTarget = function (targetIsh, terms) {
144144
let bogoTerms = [];
145145

146-
Object.assign(target, { errors: [] });
146+
let target = Object.assign(targetIsh, { errors: [] });
147147

148148
for (let term of terms) {
149149
let lterm = term.toLowerCase();
150150
let hints = HostTargets.TERMS[lterm];
151151
if (hints) {
152-
upsertHints(target, terms, term, hints);
152+
let debugUa = terms.join(',');
153+
let debugTerms = [term];
154+
upsertHints(target, debugUa, debugTerms, hints);
153155
continue;
154156
}
155157

@@ -199,15 +201,26 @@ HostTargets.termsToTarget = function (target, terms) {
199201
return bogoTerms;
200202
};
201203

204+
/**
205+
* @param {TargetTriplet} target
206+
* @param {String} ua
207+
* @param {Array<String>} terms
208+
* @param {TargetMatcher} hints
209+
*/
202210
function upsertHints(target, ua, terms, hints) {
203211
if (!hints) {
204212
throw new Error("[SANITY FAIL] 'hints' not provided");
205213
}
206214

215+
// TODO maybe use utility type 'keyof'
216+
/** @type {["os","arch","libc","vendor"]} */ //@ts-expect-error
207217
let keys = Object.keys(hints);
208218
for (let key of keys) {
209219
if (!target[key]) {
210-
target[key] = hints[key];
220+
if (hints[key]) {
221+
//@ts-expect-error TODO
222+
target[key] = hints[key];
223+
}
211224
}
212225
if (target[key] !== hints[key]) {
213226
let msg = `'${key}' already set to '${target[key]}', not updated to '${hints[key]}'`;
@@ -222,19 +235,30 @@ function upsertHints(target, ua, terms, hints) {
222235
ignore = true;
223236
} else if (hints[key] === 'musl') {
224237
// musl can be installed on a GNU system
238+
//@ts-expect-error - TODO find out if we depend on this libs vs libcs typo (we probably do)
225239
target.libs = [target.libc, 'musl'];
226240
ignore = true;
227241
}
228242
}
229243
if (!ignore) {
244+
//@ts-expect-error
230245
target.errors.push({ [key]: hints[key], message: msg, terms: terms });
231246
throw new Error(`${msg} for '${ua}' / '${terms}'`);
232247
}
233248
}
234249
}
235250
}
236251

237-
// Workaround for current (2023-q4) Android misclassification
252+
/**
253+
* @typedef HasErrors
254+
* @prop {Array<any>} errors
255+
*/
256+
257+
/**
258+
* Workaround for current (2023-q4) Android misclassification
259+
* @param {TargetTriplet & HasErrors} target
260+
* @param {Array<String>} terms
261+
*/
238262
function upsertAndroidTerms(target, terms) {
239263
if (!target.android) {
240264
return;
@@ -268,3 +292,9 @@ function upsertAndroidTerms(target, terms) {
268292
}
269293
}
270294
}
295+
296+
export let TERMS = HostTargets.TERMS;
297+
export let WATERFALL = HostTargets.WATERFALL;
298+
export let _MATCHERS = HostTargets._MATCHERS;
299+
export let termsToTarget = HostTargets.termsToTarget;
300+
export default HostTargets;

lexver-test.js

+1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ async function main() {
7777
let knownKeys = Object.keys(known);
7878

7979
for (let key of knownKeys) {
80+
//@ts-expect-error - ignore dynamic key errors in test
8081
if (selected[key].toString() !== known[key].toString()) {
8182
console.error('Expected:');
8283
console.error(known);

lexver.js

+25-5
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
'use strict';
2-
3-
var Lexver = module.exports;
1+
let Lexver = {};
42

53
// hotfix is post-stable
64
let channels = ['alpha', 'beta', 'dev', 'pre', 'preview', 'rc', 'hotfix'];
@@ -12,6 +10,12 @@ let channelsRePost;
1210
channelsRePost = new RegExp(`(${channelsOr})([\\.\\-\\+]?)(\\d+)`);
1311
}
1412
let channelsPrePlacer = '$1-$2';
13+
/**
14+
* @param {unknown} _
15+
* @param {String} chan
16+
* @param {String} sep
17+
* @param {String} ver
18+
*/
1519
let channelsPostPlacer = function (_, chan, sep, ver) {
1620
ver = ver.padStart(2, '0');
1721

@@ -23,6 +27,11 @@ let digitsOnlyRe = /^\d+$/;
2327
// this is a special case, but if it gets complicated in the future, we'll drop it
2428
// and just treat it like a build hash and open an issue for to the maintainer
2529
let channelsReB = /(\.\d+b)(\d+)$/;
30+
/**
31+
* @param {unknown} _
32+
* @param {String} sep
33+
* @param {String} ver
34+
*/
2635
let channelsBPlacer = function (_, sep, ver) {
2736
ver = ver.padStart(2, '0');
2837
let rel = `${sep}${ver}`;
@@ -75,8 +84,8 @@ Lexver.sortedToTags = function (descVersions) {
7584
/**
7685
* Parse a semver or non-standard version and return a lexical version
7786
* Ex: 1.2beta-3 => 0001.0002.0000.0000-beta-03
78-
* @param {String} version - a semver or other version
79-
* @param {Object} _opts - no public options
87+
* @param {String} fullVersion - a semver or other version
88+
* @param {Object} [_opts] - no public options
8089
* @param {Boolean} _opts._asPrefix - don't expand 1.0 to 1.0.0, etc
8190
* @returns {String}
8291
*/
@@ -89,9 +98,11 @@ Lexver.parseVersion = function (fullVersion, _opts) {
8998
// 1.2beta1 => 1.2beta1
9099
let rels = fullVersion.split('-');
91100

101+
/** @type {String} */ //@ts-expect-error - even an empty string splits
92102
let version = rels.shift();
93103
if (version.includes('+')) {
94104
let parts = version.split('+');
105+
/** @type {String} */ //@ts-expect-error - even an empty string splits
95106
version = parts.shift();
96107
let build = parts.join(`${sortSuffixBuild}`);
97108
rels.unshift(`${sortSuffixBuild}${build}`);
@@ -105,6 +116,7 @@ Lexver.parseVersion = function (fullVersion, _opts) {
105116

106117
// 1.2-beta1-a => 1.2, beta1, a
107118
let subparts = version.split('-');
119+
/** @type {String} */ //@ts-expect-error - even an empty string splits
108120
version = subparts.shift();
109121

110122
// beta1, a => beta1-a
@@ -117,6 +129,7 @@ Lexver.parseVersion = function (fullVersion, _opts) {
117129
let levels = version.split('.');
118130
let digits = [];
119131
for (; levels.length; ) {
132+
/** @type {String} */ //@ts-expect-error - even an empty string splits
120133
let level = levels.shift();
121134
if (!digitsOnlyRe.test(level)) {
122135
levels.unshift(level);
@@ -247,3 +260,10 @@ Lexver.matchSorted = function (versions, prefix) {
247260
};
248261
return matchInfo;
249262
};
263+
264+
export let toTags = Lexver.toTags;
265+
export let sortedToTags = Lexver.sortedToTags;
266+
export let parseVersion = Lexver.parseVersion;
267+
export let parsePrefix = Lexver.parsePrefix;
268+
export let matchSorted = Lexver.matchSorted;
269+
export default Lexver;

lint-host-targets.js

+22-6
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,34 @@
1-
'use strict';
1+
import HostTargets from './host-targets.js';
22

3-
let HostTargets = require('./host-targets.js');
3+
import Fs from 'node:fs/promises';
4+
import Path from 'node:path';
45

5-
let uaMap = require('./uas.json');
6-
let uas = Object.keys(uaMap);
6+
/** @typedef {import('./types.js').TargetTriplet} TargetTriplet */
77

8+
/** @type {Object.<String, Number>} */
89
let partialsMap = {};
10+
/** @type {Object.<String, Number>} */
911
let termsMap = {};
1012
let termNames = Object.keys(HostTargets.TERMS);
1113
for (let term of termNames) {
1214
termsMap[term] = 0;
1315
}
1416

15-
function main() {
17+
async function main() {
1618
//let hostTargets = HostTargets.create({});
19+
/** @type {Object.<String, Boolean>} */
1720
let tripletsMap = {};
1821

22+
let modulePath = import.meta.url.slice('file://'.length);
23+
let moduleDir = Path.dirname(modulePath);
24+
let uasPath = Path.join(moduleDir, './uas.json');
25+
26+
let uaJson = await Fs.readFile(uasPath, 'utf8');
27+
let uaMap = JSON.parse(uaJson);
28+
let uas = Object.keys(uaMap);
29+
1930
for (let ua of uas) {
31+
/** @type {Array<String>} */
2032
let terms = [];
2133

2234
let parts = ua.split(/\s+/g);
@@ -33,6 +45,7 @@ function main() {
3345
terms = terms.concat(_terms);
3446
}
3547

48+
/** @type {Partial<TargetTriplet>} */
3649
let target = {};
3750
let bogoTerms;
3851
try {
@@ -104,4 +117,7 @@ function main() {
104117
}
105118
}
106119

107-
main();
120+
main().catch(function (e) {
121+
console.error(e.stack);
122+
process.exit(1);
123+
});

lint-versions.js

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
'use strict';
22

3-
let Path = require('node:path');
4-
let Fs = require('node:fs/promises');
3+
import Path from 'node:path';
4+
import Fs from 'node:fs/promises';
55

6-
let Lexver = require('./lexver.js');
6+
import Lexver from './lexver.js';
77

88
async function main() {
99
let matchVer = process.argv[2];
@@ -14,7 +14,9 @@ async function main() {
1414

1515
let versions;
1616
{
17-
let filepath = Path.join(__dirname, 'versions.txt');
17+
let modulePath = import.meta.url.slice('file://'.length);
18+
let moduleDir = Path.dirname(modulePath);
19+
let filepath = Path.join(moduleDir, 'versions.txt');
1820
let versionsTxt = await Fs.readFile(filepath, 'utf-8');
1921
versionsTxt = versionsTxt.trim();
2022
versions = versionsTxt.split('\n');

0 commit comments

Comments
 (0)