diff --git a/.gitignore b/.gitignore index 3031280..d25fdab 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,4 @@ jspm_packages .node_repl_history # Ignore build -/build +/dist diff --git a/Readme.md b/Readme.md index 8b1a5a9..97c35ee 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,7 @@ # Joe Wroten's Portfolio +```bash +export GITHUB_API_TOKEN="TOKEN" +``` + diff --git a/index.js b/index.js new file mode 100644 index 0000000..796b652 --- /dev/null +++ b/index.js @@ -0,0 +1,60 @@ +const { compile } = require('handlebars'); +const requestGithub = require('./src/request'); +const { join } = require('path'); +const { readdir, readJson, outputFile } = require('fs-extra'); + +const pagesPath = './src/pages'; +const dist = './dist'; +const exampleHBS = compile(` +

{{name}}

+
+`); + +(async () => { + let fileNames; + let filesJSON; + let { + data: { + viewer: { + pinnedRepositories: { + edges: pinnedRepoData + } + } + } + } = await requestGithub(require('./src/schema')); + pinnedRepoData = pinnedRepoData.map(data => data.node); + + try { + fileNames = await readdir(pagesPath); + } catch (error) { + console.error(error); + return; + } + + let readFilesPromises = fileNames.map(fileName => { + let filePath = join(pagesPath, fileName); + return readJson(filePath); + }); + + try { + filesJSON = await Promise.all(readFilesPromises); + } catch (error) { + console.error('Error while reading JSON', error); + return; + } + + let combinedJSONs = filesJSON.concat(pinnedRepoData); + + let writeFilesPromises = combinedJSONs.map(json => { + let fileName = json.name.replace(/[^a-zA-Z\d:]/g, '').toLowerCase(); + return outputFile(join(dist, fileName) + '.html', exampleHBS(json)); + }); + + try { + await Promise.all(writeFilesPromises); + } catch (error) { + console.error('Error while writing html files', error); + return; + } +})(); + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..03f9a0a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,152 @@ +{ + "name": "joe-wroten-portfolio", + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "^4.17.10" + } + }, + "axios": { + "version": "0.18.0", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "dev": true, + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.0.tgz", + "integrity": "sha512-4Oh4eI3S9OueVV41AgJ1oLjpaJUhbJ7JDGOMhe0AFqoSejl5Q2nn3eGglAzRUKVKZE8jG5MNn66TjCJMAnpsWA==", + "dev": true, + "requires": { + "debug": "=3.1.0" + } + }, + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "^2.5.0", + "optimist": "^0.6.1", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + }, + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 5533716..7644eb0 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,11 @@ { "name": "joe-wroten-portfolio", "private": true, - "scripts": { - }, - "dependencies": { - }, + "scripts": {}, + "dependencies": {}, "devDependencies": { + "axios": "^0.18.0", + "fs-extra": "^7.0.1", + "handlebars": "^4.0.12" } } diff --git a/src/pages/example.json b/src/pages/example.json new file mode 100644 index 0000000..8b20df1 --- /dev/null +++ b/src/pages/example.json @@ -0,0 +1,3 @@ +{ + "name": "Example" +} diff --git a/src/request.js b/src/request.js new file mode 100644 index 0000000..fade4cf --- /dev/null +++ b/src/request.js @@ -0,0 +1,27 @@ +const axios = require('axios'); + +module.exports = async query => { + let githubApiToken = process.env.GITHUB_API_TOKEN; + if (!githubApiToken) { + console.error('No process env GITHUB_API_TOKEN found.'); + return; + } + let axiosGithubGraphql = axios.create({ + baseURL: 'https://api.github.com/graphql', + headers: { + Authorization: `bearer ${githubApiToken}` + }, + }); + try { + const result = await axiosGithubGraphql({ + url: '', + method: 'post', + data: { + query, + }, + }); + return result.data; + } catch (err) { + console.log(err); + } +}; diff --git a/src/schema.js b/src/schema.js new file mode 100644 index 0000000..e2a9749 --- /dev/null +++ b/src/schema.js @@ -0,0 +1,28 @@ +module.exports = `{ + viewer { + pinnedRepositories(last: 6) { + edges { + node { + name + updatedAt + description + url + repositoryTopics(last: 12) { + edges { + node { + topic { + name + } + } + } + } + readme: object(expression: "master:README.md") { + ... on Blob { + text + } + } + } + } + } + } +}`;