import dotenv from 'dotenv' import config from '../nuxt.config.js' import { getAppType, getRouteType } from '../helpers/app-derived.js' import { deviceSupportsApp } from '../helpers/devices.js' import { makeLastUpdatedFriendly } from '../helpers/parse-date' import VideoRow from '../components-eleventy/video/row.js' // import VideoRow from '../components-eleventy/video/row.js' // import { isVideo } from '../helpers/app-derived' // Setup dotenv dotenv.config() export const makeTitle = function ( app ) { return `Does ${app.name} work on Apple Silicon? - ${ config.head.title }` } export const makeDescription = function ( app ) { return `Latest reported support status of ${ app.name } on Apple Silicon and Apple M1 Processors.` } // https://stackoverflow.com/a/15069646/1397641 function makeEnglishList ( array, conjunction = 'and' ) { const total = array.length if ( total < 3 ) return array.join(` ${conjunction} `) array = array.slice() // Prepend conjunction to final part array[ total-1 ] = `${ conjunction } ${ array[ total-1 ] }` return array.join(', ') } export function renderPageLinksHtml ( links ) { return links.map( (link, i) => { const notAppTestLink = !link.label.includes('๐Ÿงช') const isMainLink = (i === 0) && notAppTestLink return /* html */` ${ isMainLink ? 'View' : link.label } ` } ).join('') } export class AppTemplate { // or `async data() {` // or `get data() {` data () { return { layout: 'default.11ty.js', pagination: { data: 'eleventy-endpoints', size: 1, alias: 'app', before: function( data ) { return data.filter( entry => { // const [ _, routeType ] = entry.route.split('/') const routeType = getRouteType( entry.route ) return routeType === 'app' }) } }, eleventyComputed: { title: ({ app: { payload: { app } } }) => { // console.log('data', data) return makeTitle( app ) }, description: ({ app: { payload: { app } } }) => { return makeDescription( app ) }, mainHeading: ({ app: { payload: { app } } }) => { return `Does ${ app.name } work on Apple Silicon?` }, }, permalink: ({ app }) => { // console.log('payload', app.payload) return app.route.substring(1) + '/' } } } async render( data ) { const { app: { payload: { app, relatedVideos = [] } }, 'device-list': deviceList } = data const hasRelatedVideos = relatedVideos.length > 0 // console.log('deviceList', deviceList) // console.log('video.payload', Object.keys(video.payload)) const hasMultipleAliases = !!app.aliases && app.aliases.length > 1 const appDeviceSupport = deviceList.map( device => { const supportsApp = deviceSupportsApp( device, app ) return { ...device, emoji: supportsApp ? 'โœ…' : '๐Ÿšซ', ariaLabel: `${app.name} has ${ supportsApp ? '' : 'not' } been reported to work on ${device.name}` } }) const lastUpdatedFriendly = makeLastUpdatedFriendly( app.lastUpdated ) const relatedLinksHtml = renderPageLinksHtml( app.relatedLinks ) const relatedVideosRowHtml = hasRelatedVideos ? await this.boundComponent(VideoRow)( relatedVideos ) : null return /* html */`

${ data.mainHeading }

${ app.text }

${ hasMultipleAliases ? /* html */` May also be known as ${ makeEnglishList( app.aliases, 'or' ) } ` : '' }

Device Support

${ appDeviceSupport.map( device => /* html */` `).join('') }
${ hasRelatedVideos ? /* html */` ` : '' }
${ lastUpdatedFriendly !== null ? /* html */`
` : '' } Report Update
` } } module.exports = AppTemplate