/** * @module vesselTypes * @description AIS ship-type codes (ITU-R M.1371) to family names, with no * browser or i18n dependencies so the server-side query tools can use it. */ const NUMERIC_TYPE_SPECIALS = { 30: 'FISHING', 31: 'TOWING', 32: 'TOWING', 33: 'DREDGER', 34: 'DIVE OPS', 35: 'MILITARY', 36: 'SAILING', 37: 'PLEASURE', 50: 'PILOT', 51: 'SAR', 52: 'TUG', 53: 'PORT TENDER', 54: 'ANTI-POLLUTION', 55: 'LAW ENFORCE', 58: 'MEDICAL', }; const NUMERIC_TYPE_FAMILIES = { 4: 'HIGH-SPEED', 6: 'PASSENGER', 7: 'CARGO', 8: 'TANKER', 9: 'OTHER', }; /** * Resolve an AIS type to display text: bare numeric ship-type codes map to * family names ("71" → "CARGO"); text types pass through unchanged. Code 0 * ("not available") and the reserved codes 100 to 255 name no type and * resolve to "". * @param {string} type Raw AIS type. * @returns {string} */ export function normalizeVesselType(type) { const text = String(type || '').trim(); if (!text || !/^\d+$/.test(text)) return text; const code = Number(text); if (code <= 0 || code >= 100) return ''; if (NUMERIC_TYPE_SPECIALS[code]) return NUMERIC_TYPE_SPECIALS[code]; return NUMERIC_TYPE_FAMILIES[Math.floor(code / 10)] || 'OTHER'; }