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
109let reVersionOnly = / ^ [ \d \. ] + ( - R E L E A S E ) ? $ / ;
1110let reLeadingVer = / ^ \d ( [ \d \. \- \+ _ ] ) + / ;
@@ -64,6 +63,7 @@ let T = {
6463} ;
6564
6665// OS, Arch, Libc
66+ /** @type {Object.<String, import('./types.js').TargetMatcher> } */
6767HostTargets . 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+ */
202210function 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+ */
238262function 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 ;
0 commit comments