From 61268576e19bd979ec8a3ecafa42c5cc98945fbb Mon Sep 17 00:00:00 2001 From: Sam Carlton Date: Fri, 20 Nov 2020 15:30:37 -0600 Subject: [PATCH] Add game endpoints --- .gitignore | 1 + helpers/build-game-list.js | 123 +++++++++++++++++++++++++++++++++++++ nuxt.config.js | 30 ++++++++- pages/game/_slug.vue | 89 +++++++++++++++++++++++++++ 4 files changed, 241 insertions(+), 2 deletions(-) create mode 100644 helpers/build-game-list.js create mode 100644 pages/game/_slug.vue diff --git a/.gitignore b/.gitignore index 521e51b..28c9110 100644 --- a/.gitignore +++ b/.gitignore @@ -84,3 +84,4 @@ dist # Other /app-list.json /README-temp.md +/game-list.json diff --git a/helpers/build-game-list.js b/helpers/build-game-list.js new file mode 100644 index 0000000..fe4f7fd --- /dev/null +++ b/helpers/build-game-list.js @@ -0,0 +1,123 @@ + +import { promises as fs } from 'fs' +import slugify from 'slugify' +import axios from 'axios' + +import { statuses } from './build-app-list' + + +// console.log('process.env.GAMES_SOURCE', process.env.GAMES_SOURCE) + +// export const statuses = { +// '✅': 'native', +// '✳️': 'rosetta', +// '⏹': 'no-in-progress', +// '🚫': 'no' +// } + +const statusesTranslations = { + 'Native': 'native', + 'Rosetta': 'rosetta', + // '': 'no' +} + +const statusesMessages = { + 'native': '✅ Yes, Full Native Apple Silicon Support', + 'rosetta': '✳️ Yes, works via Rosetta 2', + 'no': '🚫 No, not yet supported only works on Intel-based Macs' +} + + +function parseStatus(game) { + if (game.Playable === 'no') return 'no' + + // Match status to Sheet Status + return statusesTranslations[game['Native/Rosetta']] + // for (const statusKey in statusesTranslations) { + // console.log("game['Native/Rosetta']", game['Native/Rosetta']) + // console.log('statuses[statusKey]', statusesTranslations[game['Native/Rosetta']]) + // if (game['Native/Rosetta'].includes(statusKey)) { + // return statusesTranslations[statusKey] + // } + // } +} + +export default async function () { + + // Fetch Sheet data + const gamesSheet = await axios + .get(process.env.GAMES_SOURCE) + .then(function (response) { + // handle success + return response.data.records + }) + .catch(function (error) { + // handle error + console.log(error); + }) + + const gameList = [] + + // console.log('gamesSheet', gamesSheet) + + for (const game of gamesSheet) { + + // If there's no title + // then stop + if (game.Games.length === 0) continue + + // If there's no 'Native/Rosetta' status + // then stop + if (game['Native/Rosetta'].length === 0) continue + + // Generate slug + const slug = slugify(game.Games, { + lower: true, + strict: true + }) + + // Find index of game is list so far + const gameIndex = gameList.findIndex(game => { + return game.slug === slug + }) + + // Game already has entry + if (gameIndex !== -1) continue + + + const status = parseStatus(game) + + // console.log('status', status) + + gameList.push({ + name: game.Games, + status, + url: `https://rawg.io/search?query=${encodeURIComponent(game.Games)}`, + text: statusesMessages[status], + slug, + section: { + label: 'Games', + slug: 'games' + }, + content: '', + relatedLinks: [], + reports: [ + game + ] + }) + + } + + // console.log('gameList', gameList) + + + return gameList + + // fs.readFile('../README.md', 'utf8') + // .then((err, data) => { + // const result = md.parse(data) + // console.log('result', result) + + // return result + // }) +} diff --git a/nuxt.config.js b/nuxt.config.js index 7f224fa..79cb37f 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -3,22 +3,35 @@ import path from 'path' import pkg from './package' import buildAppList from './helpers/build-app-list.js' +import buildGamesList from './helpers/build-game-list.js' const storeAppList = async function (builder) { + // TODO: Make DRY + const appListPath = path.join( // builder.nuxt.options.buildDir, builder.nuxt.options.srcDir, '/app-list.json' ) + const gamesListPath = path.join( + // builder.nuxt.options.buildDir, + builder.nuxt.options.srcDir, + '/game-list.json' + ) + const appList = await buildAppList() + const gamesList = await buildGamesList() // console.log('builder.nuxt.options', builder.nuxt.options) await fs.writeFile(appListPath, JSON.stringify(appList)) + await fs.writeFile(gamesListPath, JSON.stringify(gamesList)) } +// console.log('process.env.GAMES_SOURCE', process.env.GAMES_SOURCE) + export default { target: 'static', @@ -43,9 +56,16 @@ export default { ] }, routes() { - return import('./app-list.json')//buildAppList() - .then((importedAppList) => { + return Promise.all([ + import('./app-list.json'), + import('./game-list.json') + ]) + .then(([ + importedAppList, + importedGameList + ]) => { const appList = importedAppList.default + const gameList = importedGameList.default // console.log('appList', appList) const appRoutes = appList.map(app => ({ @@ -53,6 +73,11 @@ export default { // payload: appList })) + const gameRoutes = gameList.map(game => ({ + route: '/game/' + game.slug, + // payload: appList + })) + const sectionList = [] appList.forEach(app => { @@ -68,6 +93,7 @@ export default { return [ ...appRoutes, + ...gameRoutes, ...sectionRoutes ] }) diff --git a/pages/game/_slug.vue b/pages/game/_slug.vue new file mode 100644 index 0000000..728708d --- /dev/null +++ b/pages/game/_slug.vue @@ -0,0 +1,89 @@ + + +