diff --git a/apps/d0rich.me/nuxt.config.ts b/apps/d0rich.me/nuxt.config.ts index 89f8820..bd19c02 100644 --- a/apps/d0rich.me/nuxt.config.ts +++ b/apps/d0rich.me/nuxt.config.ts @@ -24,11 +24,7 @@ export default defineNuxtConfig({ modules: ['@nuxthq/studio', '@nuxt/content'], nitro: { prerender: { - routes: [ - '/', - '/sitemap.xml', - '/api/resume/list.json', - ] + routes: ['/', '/sitemap.xml', '/api/resume/list.json'] } }, content: { diff --git a/cdn/package-lock.json b/cdn/package-lock.json index cf2494d..4545fa3 100644 --- a/cdn/package-lock.json +++ b/cdn/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "cdn", "version": "1.0.0", - "license": "ISC", "dependencies": { "ofetch": "^1.3.4", "puppeteer": "^22.11.0", diff --git a/cdn/src/features/resume/collectResumeList.ts b/cdn/src/features/resume/collectResumeList.ts index 0159305..c98bed3 100644 --- a/cdn/src/features/resume/collectResumeList.ts +++ b/cdn/src/features/resume/collectResumeList.ts @@ -1,8 +1,10 @@ -import { TypeOf } from "zod"; -import { ofetch } from "ofetch"; -import { ResumeListSchema } from "../../models/ResumeList"; +import { TypeOf } from 'zod' +import { ofetch } from 'ofetch' +import { ResumeListSchema } from '../../models/ResumeList' export async function collectResumeList() { - const response = await ofetch>("https://d0rich.me/api/resume/list"); - return ResumeListSchema.parse(response); + const response = await ofetch>( + 'https://d0rich.me/api/resume/list' + ) + return ResumeListSchema.parse(response) } diff --git a/cdn/src/features/resume/saveAllResume.ts b/cdn/src/features/resume/saveAllResume.ts index 3ce7681..7f71a49 100644 --- a/cdn/src/features/resume/saveAllResume.ts +++ b/cdn/src/features/resume/saveAllResume.ts @@ -1,4 +1,4 @@ -import {collectResumeList} from './collectResumeList' +import { collectResumeList } from './collectResumeList' import { getResumePdf } from './getResumePdf' import { dist } from '../../store/dist' diff --git a/cdn/src/main.ts b/cdn/src/main.ts index 85c3b26..c2bb936 100644 --- a/cdn/src/main.ts +++ b/cdn/src/main.ts @@ -1,6 +1,5 @@ -import { BrowserStore } from "./store/browser"; -import { saveAllResume } from "./features/resume/saveAllResume"; - +import { BrowserStore } from './store/browser' +import { saveAllResume } from './features/resume/saveAllResume' async function main() { const browser = await BrowserStore.getBrowser() diff --git a/cdn/src/models/ResumeList.ts b/cdn/src/models/ResumeList.ts index c7ce027..5e5e327 100644 --- a/cdn/src/models/ResumeList.ts +++ b/cdn/src/models/ResumeList.ts @@ -1,8 +1,8 @@ -import {z} from 'zod'; +import { z } from 'zod' export const ResumeSchema = z.object({ title: z.string(), path: z.string() -}); +}) -export const ResumeListSchema = z.array(ResumeSchema); +export const ResumeListSchema = z.array(ResumeSchema) diff --git a/cdn/src/store/browser.ts b/cdn/src/store/browser.ts index 94552d9..6b20b56 100644 --- a/cdn/src/store/browser.ts +++ b/cdn/src/store/browser.ts @@ -1,14 +1,14 @@ -import { launch, type Browser } from "puppeteer"; +import { launch, type Browser } from 'puppeteer' export class BrowserStore { - private static browser: Browser | Promise = launch(); + private static browser: Browser | Promise = launch() private constructor() {} static async getBrowser(): Promise { if (BrowserStore.browser instanceof Promise) { - BrowserStore.browser = await BrowserStore.browser; + BrowserStore.browser = await BrowserStore.browser } - return BrowserStore.browser; + return BrowserStore.browser } } diff --git a/cdn/src/store/dist.ts b/cdn/src/store/dist.ts index abf818b..3a8f54d 100644 --- a/cdn/src/store/dist.ts +++ b/cdn/src/store/dist.ts @@ -1,6 +1,6 @@ -import { createStorage } from "unstorage"; -import fsDriver from "unstorage/drivers/fs"; +import { createStorage } from 'unstorage' +import fsDriver from 'unstorage/drivers/fs' export const dist = createStorage({ - driver: fsDriver({ base: "./dist" }), -}); + driver: fsDriver({ base: './dist' }) +}) diff --git a/package-lock.json b/package-lock.json index d094e99..553821c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,8 @@ "name": "esprit", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "utils/*" ], "devDependencies": { "@changesets/cli": "^2.27.5", @@ -62,6 +63,7 @@ "apps/dog": { "name": "@d0rich/dog", "version": "0.1.0", + "extraneous": true, "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", "@types/node": "^20.14.2", @@ -80,24 +82,6 @@ "typescript": "^5.4.5" } }, - "apps/dog/node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "apps/dog/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "devOptional": true, @@ -2036,7 +2020,7 @@ } }, "node_modules/@d0rich/dog": { - "resolved": "apps/dog", + "resolved": "utils/dog", "link": true }, "node_modules/@d0rich/esprit-design": { @@ -28447,6 +28431,44 @@ "devDependencies": { "nuxt": "^3.12.1" } + }, + "utils/dog": { + "version": "0.1.0", + "dependencies": { + "@backroad/backroad": "^1.4.0-alpha.5", + "@types/node": "^20.14.2", + "commander": "^12.1.0", + "inquirer": "^9.2.23", + "node-html-to-image": "^4.0.0", + "png-to-ico": "^2.1.8", + "unstorage": "^1.10.2" + }, + "bin": { + "dog": "dist/cli.js" + }, + "devDependencies": { + "@types/inquirer": "^9.0.7", + "tsx": "^4.15.4", + "typescript": "^5.4.5" + } + }, + "utils/dog/node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "utils/dog/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } } }, "dependencies": { @@ -29806,7 +29828,7 @@ "requires": {} }, "@d0rich/dog": { - "version": "file:apps/dog", + "version": "file:utils/dog", "requires": { "@backroad/backroad": "^1.4.0-alpha.5", "@types/inquirer": "^9.0.7", diff --git a/utils/dog/src/cli.ts b/utils/dog/src/cli.ts index 145376e..508768d 100644 --- a/utils/dog/src/cli.ts +++ b/utils/dog/src/cli.ts @@ -1,52 +1,63 @@ #!/usr/bin/env node -import fs from "fs"; -import path from 'path'; -import { runWebGenerator } from './webApp'; -import { workingStorage } from "./storage.js"; -import { getFaviconIco, getOgImageJpeg } from "./generators/index.js"; -import { program } from "commander"; +import fs from 'fs' +import path from 'path' +import { runWebGenerator } from './webApp' +import { workingStorage } from './storage.js' +import { getFaviconIco, getOgImageJpeg } from './generators/index.js' +import chalk from 'chalk' +import { program } from 'commander' -const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, "../package.json/"), 'utf8')); +const packageJson = JSON.parse( + fs.readFileSync(path.resolve(__dirname, '../package.json/'), 'utf8') +) -program - .version(packageJson.version) - .description(packageJson.description) +program.version(packageJson.version).description(packageJson.description) interface GenOptions { - title?: string; - description?: string; + title?: string + description?: string } -program.command('gen', { isDefault: true }) +program + .command('gen', { isDefault: true }) .description('Generate images') .option('-t, --title ', 'Title', undefined) .option('-d, --description <description>', 'Description', undefined) .action(async (options: GenOptions) => { - const { default: inquirer } = await import('inquirer'); - const title: string = options.title || (await inquirer.prompt({ - type: 'input', - name: 'title', - message: 'Title' - })).title; + const { default: inquirer } = await import('inquirer') + const title: string = + options.title || + ( + await inquirer.prompt({ + type: 'input', + name: 'title', + message: 'Title' + }) + ).title console.log(`🐶 Title: ${title}`) - const description: string = options.description || (await inquirer.prompt({ - type: 'input', - name: 'description', - message: 'Description' - })).description; + const description: string = + options.description || + ( + await inquirer.prompt({ + type: 'input', + name: 'description', + message: 'Description' + }) + ).description console.log(`🐶 Description: ${description}`) console.log('🐶 Generating images...') const favicon = await getFaviconIco({ title }) const ogImage = await getOgImageJpeg({ title, description }) await workingStorage.setItemRaw('favicon.ico', favicon) await workingStorage.setItemRaw('og:image.jpg', ogImage) - console.log('🐶 Done, wuaff! Check out \'.dog\' directory') + console.log(`🐶 Done, wuaff! Check out ${chalk.yellow('.dog')} directory`) }) -program.command('web') +program + .command('web') .description('Run web generator') .action(() => { - runWebGenerator(); + runWebGenerator() }) -program.parse(); +program.parse() diff --git a/utils/dog/src/generators/index.ts b/utils/dog/src/generators/index.ts index ad06b41..5c06403 100644 --- a/utils/dog/src/generators/index.ts +++ b/utils/dog/src/generators/index.ts @@ -1,2 +1,2 @@ -export * from './favicon.js'; -export * from './og-image.js'; +export * from './favicon.js' +export * from './og-image.js' diff --git a/utils/dog/src/runWeb.ts b/utils/dog/src/runWeb.ts index c48dc7f..174d5ef 100644 --- a/utils/dog/src/runWeb.ts +++ b/utils/dog/src/runWeb.ts @@ -1,3 +1,3 @@ -import { runWebGenerator } from './webApp'; +import { runWebGenerator } from './webApp' -runWebGenerator(); +runWebGenerator() diff --git a/utils/dog/src/storage.ts b/utils/dog/src/storage.ts index 6275459..ffa8da4 100644 --- a/utils/dog/src/storage.ts +++ b/utils/dog/src/storage.ts @@ -1,15 +1,15 @@ -import path from 'path'; -import { createStorage } from "unstorage"; -import fsDriver from "unstorage/drivers/fs"; +import path from 'path' +import { createStorage } from 'unstorage' +import fsDriver from 'unstorage/drivers/fs' export const assetsStorage = createStorage({ - driver: fsDriver({ base: path.resolve(__dirname, "../assets/") }), -}); + driver: fsDriver({ base: path.resolve(__dirname, '../assets/') }) +}) export const tmpStorage = createStorage({ - driver: fsDriver({ base: path.resolve(__dirname, "../.tmp/") }), -}); + driver: fsDriver({ base: path.resolve(__dirname, '../.tmp/') }) +}) export const workingStorage = createStorage({ - driver: fsDriver({ base: '.dog' }), -}); + driver: fsDriver({ base: '.dog' }) +}) diff --git a/utils/dog/src/utils/bufferToImgSrc.ts b/utils/dog/src/utils/bufferToImgSrc.ts index 42ee40f..f5dfdab 100644 --- a/utils/dog/src/utils/bufferToImgSrc.ts +++ b/utils/dog/src/utils/bufferToImgSrc.ts @@ -1,4 +1,7 @@ -export function bufferToImgSrc(buffer: Buffer, ext: 'png' | 'ico' = 'png'): string { - const str = `data:image/${ext};base64, ` + buffer.toString('base64'); - return str; +export function bufferToImgSrc( + buffer: Buffer, + ext: 'png' | 'ico' = 'png' +): string { + const str = `data:image/${ext};base64, ` + buffer.toString('base64') + return str } diff --git a/utils/dog/src/webApp.ts b/utils/dog/src/webApp.ts index a199d95..9e82296 100644 --- a/utils/dog/src/webApp.ts +++ b/utils/dog/src/webApp.ts @@ -1,13 +1,12 @@ -import { run } from '@backroad/backroad'; -import { getFaviconIco, getOgImageJpeg } from './generators/index.js'; +import { run } from '@backroad/backroad' +import { getFaviconIco, getOgImageJpeg } from './generators/index.js' import { bufferToImgSrc } from './utils/bufferToImgSrc.js' export function runWebGenerator() { - run((br) => { br.title({ - label: '🐶Dog', - }); + label: '🐶Dog' + }) br.write({ body: ` # 🐶Dog: Generate OG images @@ -16,40 +15,43 @@ export function runWebGenerator() { You need to reaload page in order to see the generated images. You might want to use CLI instead. -`}); - const [col1, col2] = br.columns({ columns: 2 }); +` + }) + const [col1, col2] = br.columns({ columns: 2 }) const title = col1.textInput({ label: 'Title', - placeholder: 'My awesome docs', - }); + placeholder: 'My awesome docs' + }) const description = col1.textInput({ label: 'Description', - placeholder: '💪Understand the power of d0xigen', - }); - const faviconSrc = br.getOrDefault('favicon', null); - const ogImageSrc = br.getOrDefault('ogImage', null); + placeholder: '💪Understand the power of d0xigen' + }) + const faviconSrc = br.getOrDefault('favicon', null) + const ogImageSrc = br.getOrDefault('ogImage', null) const generate = col1.button({ label: 'Generate' }) if (faviconSrc) { col2.image({ src: faviconSrc, - label: 'Favicon', - }); + label: 'Favicon' + }) } if (ogImageSrc) { col2.image({ src: ogImageSrc, - label: 'OG Image', - }); + label: 'OG Image' + }) } if (generate) { br.setValue('favicon', null) br.setValue('ogImage', null) - getOgImageJpeg({ title, description}) - .then(res => br.setValue('ogImage', bufferToImgSrc(res as Buffer))) - getFaviconIco({ title }) - .then(res => br.setValue('favicon', bufferToImgSrc(res, 'ico'))) + getOgImageJpeg({ title, description }).then((res) => + br.setValue('ogImage', bufferToImgSrc(res as Buffer)) + ) + getFaviconIco({ title }).then((res) => + br.setValue('favicon', bufferToImgSrc(res, 'ico')) + ) } - }); + }) } diff --git a/utils/dog/tsconfig.json b/utils/dog/tsconfig.json index 0720ff8..ba10953 100644 --- a/utils/dog/tsconfig.json +++ b/utils/dog/tsconfig.json @@ -1,5 +1,4 @@ { - "compilerOptions": { "outDir": "./dist", "baseUrl": "./src", @@ -11,7 +10,7 @@ "allowSyntheticDefaultImports": true, "strict": true, "skipLibCheck": true, - "lib": ["ESNext"], + "lib": ["ESNext"] }, "include": ["**/*.ts"], "exclude": ["node_modules"]