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
+ }
+ }
+ }
+ }
+ }
+ }
+}`;