From 0980c48ca98fab2530e0ba659539566f43657ca0 Mon Sep 17 00:00:00 2001 From: Evren Ceyhan Date: Mon, 4 Dec 2023 19:54:30 +0100 Subject: [PATCH 1/6] convert tailwind config to ts --- tailwind.config.js | 7 ------- tailwind.config.ts | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 7 deletions(-) delete mode 100644 tailwind.config.js create mode 100644 tailwind.config.ts diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index d0d1f4e..0000000 --- a/tailwind.config.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - plugins: [require('daisyui')], - daisyui: { - themes: ['night'], - darkTheme: 'night', - }, -}; diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..4b1aa6b --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,14 @@ +import type { Config } from 'tailwindcss'; +import daisyui from 'daisyui'; + +export default { + content: [], + theme: { + extend: {}, + }, + plugins: [daisyui], + daisyui: { + themes: ['night'], + darkTheme: 'night', + }, +} satisfies Config; From b9c79aab3d5b8fcfb6f67d8ac2b4a5faa60df4bf Mon Sep 17 00:00:00 2001 From: Evren Ceyhan Date: Mon, 4 Dec 2023 22:15:04 +0100 Subject: [PATCH 2/6] refactor cache builder --- .gitignore | 2 +- bun.lockb | Bin 347900 -> 348267 bytes package.json | 3 +- server/mocker.js | 111 ---------------------------------- server/tsconfig.json | 5 +- server/utils/cache-builder.ts | 63 +++++++++++++++++++ 6 files changed, 70 insertions(+), 114 deletions(-) delete mode 100644 server/mocker.js create mode 100644 server/utils/cache-builder.ts diff --git a/.gitignore b/.gitignore index f721e1a..ae79ead 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ .nitro .cache dist -server/mocks +server/cache # Node dependencies node_modules diff --git a/bun.lockb b/bun.lockb index 4c05bea72f50d3eb635fac93fadc37063e2d65c2..10c2b4bd7a221c8459859d0b4cd58ad5a5bb180e 100755 GIT binary patch delta 62216 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 diff --git a/package.json b/package.json index 2ec5d19..22c8b84 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "generate": "nuxt generate", "preview": "nuxt preview", "postinstall": "nuxt prepare", - "mock": "node ./server/mocker.js" + "cache": "bun ./server/utils/cache-builder" }, "author": "Evren Ceyhan", "license": "MIT", @@ -26,6 +26,7 @@ "@pinia/nuxt": "^0.5.1", "@types/node": "^20.9.0", "bootstrap-icons": "^1.11.1", + "bun-types": "^1.0.15", "daisyui": "^4.0.3", "nuxt": "^3.8.2", "pinia": "^2.1.7", diff --git a/server/mocker.js b/server/mocker.js deleted file mode 100644 index 0217bd6..0000000 --- a/server/mocker.js +++ /dev/null @@ -1,111 +0,0 @@ -/** - * This is a server side script to generate mock data, it's not part of the app, - * It's only used to generate mock data for the DEV environment! - * - * Github has a rate limit of 60 requests per hour for unauthenticated requests, - * so we need to use a personal access token to increase the limit to 5000 requests per hour. - */ - -import { - readFileSync, - writeFileSync, - existsSync, - mkdirSync, - rmSync, -} from 'fs'; -import { dirname } from 'path'; -import { fileURLToPath } from 'url'; -import dotenv from 'dotenv'; - -// load env vars -dotenv.config(); - -const API_URL = 'https://api.github.com'; -const API_TOKEN = process.env.GITHUB_API_TOKEN; -const API_USERNAME = process.env.GITHUB_API_USERNAME; - -// __dirname is not available in ES6 modules -// https://stackoverflow.com/questions/46745014/using-dirname-in-es6-modules -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); -const MOCKS_DIR = __dirname + '/mocks'; - -// GENERATORS ////////////////////////////////////////////////////////////////////////////////////// - -const generateProfile = async () => { - console.log('generating profile'); - - const data = await fetchApi(`/users/${API_USERNAME}`); - writeMockFile('profile', data); -}; - -const generateRepos = async () => { - console.log('generating repos'); - - const data = await fetchApi(`/users/${API_USERNAME}/repos`, { - per_page: 100, - sort: 'updated', - }); - - writeMockFile('repos', data); -}; - -const generateRepoLanguages = async () => { - console.log('generating repo languages'); - - const repos = readMockFile('repos'); - - repos.forEach(async ({ name }) => { - const data = await fetchApi(`/repos/${API_USERNAME}/${name}/languages`); - writeMockFile(`${name}-languages`, data); - }); -}; - -// HELPERS ///////////////////////////////////////////////////////////////////////////////////////// - -const fetchApi = async (path, query = {}) => { - // create url object - const url = new URL(API_URL + path); - - // add query params - Object.entries(query).forEach(([key, value]) => { - url.searchParams.append(key, value); - }); - - const response = await fetch(url, { - headers: { Authorization: `Bearer ${API_TOKEN}` }, - }); - - return await response.json(); -}; - -const readMockFile = (name) => { - const filename = `${MOCKS_DIR}/${name}.json`; - const jsonData = readFileSync(filename); - - return JSON.parse(jsonData); -}; - -const writeMockFile = (name, data) => { - const filename = `${MOCKS_DIR}/${name}.json`; - const jsonData = JSON.stringify(data, null, 2); - - writeFileSync(filename, jsonData); -}; - -const ensureMocksDir = () => { - existsSync(MOCKS_DIR) || mkdirSync(MOCKS_DIR); -}; - -const purgeMocksDir = () => { - existsSync(MOCKS_DIR) && rmSync(MOCKS_DIR, { recursive: true }); -}; - -// RUN ///////////////////////////////////////////////////////////////////////////////////////////// - -purgeMocksDir(); -ensureMocksDir(); - -await generateProfile(); -await generateRepos(); -await generateRepoLanguages(); diff --git a/server/tsconfig.json b/server/tsconfig.json index b9ed69c..2f54888 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,3 +1,6 @@ { - "extends": "../.nuxt/tsconfig.server.json" + "extends": "../.nuxt/tsconfig.server.json", + "compilerOptions": { + "types": ["bun-types"] + } } diff --git a/server/utils/cache-builder.ts b/server/utils/cache-builder.ts new file mode 100644 index 0000000..b5a5102 --- /dev/null +++ b/server/utils/cache-builder.ts @@ -0,0 +1,63 @@ +import { existsSync, mkdirSync, rmSync } from 'fs'; + +/** + * This is a server side script to cache data. + * It's only used to generate mock data for the DEV environment! + * + * Github has a rate limit of 60 requests per hour for unauthenticated requests, + * so we need to use a personal access token to increase the limit to 5000 requests per hour. + */ + +const API_URL = 'https://api.github.com'; +const API_TOKEN = process.env.GITHUB_API_TOKEN; +const API_USERNAME = process.env.GITHUB_API_USERNAME; + +const DIR = import.meta.dir; +const CACHE_DIR = `${DIR}/../cache`; + +async function fetchApi(path: string, query: any = {}): Promise { + // create url object + const url = new URL(API_URL + path); + + // add query params + Object.entries(query).forEach(([key, value]) => { + url.searchParams.append(key, value as any); + }); + + const response = await fetch(url, { + headers: { Authorization: `Bearer ${API_TOKEN}` }, + }); + + return response.json() as Promise; +} + +function writeToCacheFile(path: string, data: any): void { + const filename = `${CACHE_DIR}/${path}.json`; + const jsonData = JSON.stringify(data, null, 4); + + console.log(`Writing to cache file: ${path}.json`); + Bun.write(filename, jsonData); +} + +// Create cache directory if it doesn't exist +existsSync(CACHE_DIR) || mkdirSync(CACHE_DIR); + +// Purge existing cache directory +rmSync(`${CACHE_DIR}/*`, { force: true }); + +// Fetch and cache user profile +const profile = await fetchApi(`/users/${API_USERNAME}`); +writeToCacheFile('profile', profile); + +// Fetch and cache repositories +const repos = await fetchApi(`/users/${API_USERNAME}/repos`, { + per_page: 100, + sort: 'updated', +}); +writeToCacheFile('repos', repos); + +// Fetch and cache languages for each repository +repos.forEach(({ name }) => { + const data = fetchApi(`/repos/${API_USERNAME}/${name}/languages`); + writeToCacheFile(`${name}-languages`, data); +}); From b715884ee76fd34c64fd6f267ee79671f2a00b06 Mon Sep 17 00:00:00 2001 From: Evren Ceyhan Date: Mon, 4 Dec 2023 22:21:40 +0100 Subject: [PATCH 3/6] refactor api constants in cache-builder --- server/utils/cache-builder.ts | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/server/utils/cache-builder.ts b/server/utils/cache-builder.ts index b5a5102..75673b0 100644 --- a/server/utils/cache-builder.ts +++ b/server/utils/cache-builder.ts @@ -1,4 +1,5 @@ import { existsSync, mkdirSync, rmSync } from 'fs'; +import { API_HEADERS, API_URL, API_USERNAME } from '../constants/github'; /** * This is a server side script to cache data. @@ -8,10 +9,6 @@ import { existsSync, mkdirSync, rmSync } from 'fs'; * so we need to use a personal access token to increase the limit to 5000 requests per hour. */ -const API_URL = 'https://api.github.com'; -const API_TOKEN = process.env.GITHUB_API_TOKEN; -const API_USERNAME = process.env.GITHUB_API_USERNAME; - const DIR = import.meta.dir; const CACHE_DIR = `${DIR}/../cache`; @@ -24,11 +21,7 @@ async function fetchApi(path: string, query: any = {}): Promise { url.searchParams.append(key, value as any); }); - const response = await fetch(url, { - headers: { Authorization: `Bearer ${API_TOKEN}` }, - }); - - return response.json() as Promise; + return (await fetch(url, { headers: API_HEADERS })).json() as any; } function writeToCacheFile(path: string, data: any): void { From e82a5a1aa6eec4c44fad7f39a6da1469315d00bb Mon Sep 17 00:00:00 2001 From: Evren Ceyhan Date: Mon, 4 Dec 2023 22:25:52 +0100 Subject: [PATCH 4/6] convert type to interface --- server/types/social.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/types/social.ts b/server/types/social.ts index bd0a0a1..7157766 100644 --- a/server/types/social.ts +++ b/server/types/social.ts @@ -1,5 +1,5 @@ -export type SocialLink = { +export interface SocialLink { id?: string; url: string; icon: string; -}; \ No newline at end of file +} From a994c4028c775e3d72a3f521f53b7f9735dd0520 Mon Sep 17 00:00:00 2001 From: Evren Ceyhan Date: Mon, 4 Dec 2023 22:26:03 +0100 Subject: [PATCH 5/6] add missing type hinting --- server/api/languages.ts | 2 +- server/api/topics.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/api/languages.ts b/server/api/languages.ts index 3e1c9a0..f518feb 100644 --- a/server/api/languages.ts +++ b/server/api/languages.ts @@ -8,7 +8,7 @@ export default defineEventHandler(async (event) => { if (cache.value) return cache.value; // fetch fresh data - const repos = await $fetch('/api/repos'); + const repos = await $fetch('/api/repos'); const languages = collectLanguages(repos); // save fresh data to cache diff --git a/server/api/topics.ts b/server/api/topics.ts index 419088c..8b48d5b 100644 --- a/server/api/topics.ts +++ b/server/api/topics.ts @@ -9,7 +9,7 @@ export default defineEventHandler(async (event) => { if (cache.value) return cache.value; // fetch fresh data - const repos = await $fetch('/api/repos'); + const repos = await $fetch('/api/repos'); const topics = collectTopics(repos); // save fresh data to cache From 59fdd300f564468ed9540051a8c8346d81d6894e Mon Sep 17 00:00:00 2001 From: Evren Ceyhan Date: Mon, 4 Dec 2023 22:29:24 +0100 Subject: [PATCH 6/6] add import types --- server/api/languages.ts | 2 +- server/api/profile.ts | 2 +- server/api/repos.ts | 2 +- server/api/social-links.ts | 2 +- server/api/topics.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/server/api/languages.ts b/server/api/languages.ts index f518feb..c9637c1 100644 --- a/server/api/languages.ts +++ b/server/api/languages.ts @@ -1,4 +1,4 @@ -import { Language, Repo } from '../types/repo'; +import type { Language, Repo } from '../types/repo'; export default defineEventHandler(async (event) => { // try to get cached data diff --git a/server/api/profile.ts b/server/api/profile.ts index aa0dc65..02597f0 100644 --- a/server/api/profile.ts +++ b/server/api/profile.ts @@ -1,5 +1,5 @@ import { API_USERNAME } from '../constants/github'; -import { Profile } from '../types/profile'; +import type { Profile } from '../types/profile'; export default defineEventHandler(async (event) => { // try to get cached data diff --git a/server/api/repos.ts b/server/api/repos.ts index 6dbfdc0..c4bb5b8 100644 --- a/server/api/repos.ts +++ b/server/api/repos.ts @@ -1,6 +1,6 @@ import { API_USERNAME } from '../constants/github'; import { COLORS } from '../constants/language'; -import { Language, Repo } from '../types/repo'; +import type { Language, Repo } from '../types/repo'; export default defineEventHandler(async (event) => { // try to get cached data diff --git a/server/api/social-links.ts b/server/api/social-links.ts index 39931f7..7ae6089 100644 --- a/server/api/social-links.ts +++ b/server/api/social-links.ts @@ -1,5 +1,5 @@ import { LINKS } from '../constants/social'; -import { SocialLink } from '../types/social'; +import type { SocialLink } from '../types/social'; export default defineEventHandler((event) => { return LINKS.filter(havingId).map(normalizeUrl); diff --git a/server/api/topics.ts b/server/api/topics.ts index 8b48d5b..388e888 100644 --- a/server/api/topics.ts +++ b/server/api/topics.ts @@ -1,5 +1,5 @@ import { CATEGORIES } from '../constants/topic'; -import { Repo, Topic } from '../types/repo'; +import type { Repo, Topic } from '../types/repo'; export default defineEventHandler(async (event) => { // try to get cached data