UNPKG

tesla-images

Version:

Generate Tesla Model S/3/X/Y 3D photo visualizations

104 lines (79 loc) 2.62 kB
'use strict' const { URL } = require('url') const { VIEW_ANGLES, VIEW_ANGLES_OLD, VIEW_ANGLES_V2, M3_OPTIONS_CODES, M3_NON_REFRESH, M3_INTERIOR_CODES, MY_OPTIONS_CODES } = require('./constants') const pick = (orig, dist) => orig.reduce((acc, item) => { const isPresent = dist.some(input => test(item, input)) if (isPresent) acc.push(item) return acc }, []) const has = (collection, input) => collection.some(item => test(item, input)) const test = (input, partial) => partial instanceof RegExp ? partial.test(input) : input.startsWith(partial) const isFirstGeneration = optionCodes => optionCodes.includes('MI00') || !has(optionCodes, 'MI0') const getOptions = ({ optionCodes, model }) => { switch (model) { case 'm3': { const pickedOptionCodes = pick(optionCodes, M3_OPTIONS_CODES) const hasInterior = M3_INTERIOR_CODES.some(optionCode => has(pickedOptionCodes, optionCode) ) if (hasInterior) return pickedOptionCodes const isRefresh = has(optionCodes, 'MT') && !M3_NON_REFRESH.some(optionCode => has(optionCodes, optionCode)) return [isRefresh ? 'IBB1' : 'IN3PB'].concat(pickedOptionCodes) } case 'my': { return pick(optionCodes, MY_OPTIONS_CODES) } case 'ms': case 'mx': { const isRefresh = has(optionCodes, 'ST0Y') return isRefresh ? optionCodes.filter(optionCode => !test(optionCode, /IC..$/)) : optionCodes } default: return optionCodes } } const getViewAngles = ({ optionCodes, model }) => { if (model === 'my') return VIEW_ANGLES if (model === 'm3') return VIEW_ANGLES if (model === 'mx') { if (has(optionCodes, 'MTX')) return VIEW_ANGLES_V2 return ['STUD_3QTR', 'STUD_SEAT'] } if (model === 'ms') { if (has(optionCodes, 'MTS')) return VIEW_ANGLES_V2 return isFirstGeneration(optionCodes) ? VIEW_ANGLES : VIEW_ANGLES_OLD } throw TypeError(`Model '${model}' not supported`) } const url = new URL('https://static-assets.tesla.com/configurator/compositor') url.searchParams.set('bkba_opt', '2') url.searchParams.set('file_type', 'jpg') module.exports = ({ optionCodes, modelLetter }) => { const model = `m${modelLetter.toString().toLowerCase()}` const viewAngles = getViewAngles({ optionCodes, model }) url.searchParams.set('model', model) url.searchParams.set( 'options', getOptions({ optionCodes, model }).sort().toString() ) url.searchParams.set('size', '800') return viewAngles.map(view => { url.searchParams.set('view', view) return url.toString() }) }