diff --git a/.github/workflows/pull-request-jobs.yaml b/.github/workflows/pull-request-jobs.yaml index 21c7757..e5ed58c 100644 --- a/.github/workflows/pull-request-jobs.yaml +++ b/.github/workflows/pull-request-jobs.yaml @@ -9,7 +9,7 @@ concurrency: jobs: check: - name: Run check jobs + name: Check Types runs-on: ubuntu-latest steps: @@ -29,8 +29,8 @@ jobs: - name: Setup environment variables uses: Firenza/secrets-to-env@v1.3.0 with: - secrets: ${{ toJSON(secrets) }} - secret_filter_regex: SPOTIFY_* + secrets: ${{ toJSON(secrets) }} + secret_filter_regex: SPOTIFY_* - name: Install dependencies run: pnpm install @@ -38,8 +38,8 @@ jobs: - name: Run checks for repo run: pnpm check - test: - name: Run test jobs + lint: + name: Lint Code runs-on: ubuntu-latest steps: @@ -52,13 +52,33 @@ jobs: version: 9 - name: Install Node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 + + - name: Install dependencies + run: pnpm install + timeout-minutes: 2 + + - name: Run linting for repo + run: pnpm lint + format: + name: Check Formatting + runs-on: ubuntu-latest + + steps: + - name: Checkout branch + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v3 with: - node-version: 20 + version: 9 + + - name: Install Node + uses: actions/setup-node@v4 - name: Install dependencies run: pnpm install timeout-minutes: 2 - - name: Run tests for repo - run: pnpm test + - name: Run format checks for repo + run: pnpm format:check diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..cb2c84d --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +pnpm lint-staged diff --git a/.oxlint.json b/.oxlint.json new file mode 100644 index 0000000..eda782b --- /dev/null +++ b/.oxlint.json @@ -0,0 +1,6 @@ +{ + "$schema": "./node_modules/oxlint/configuration_schema.json", + "ignorePatterns": [ + "node_modules" + ] +} diff --git a/README.md b/README.md index 5c61f75..031d635 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,12 @@ -# `fi.dev` +# `fi` + Monorepo holding my procrastination and hopefully some actual merged code. ## 🧞 Commands -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `pnpm install` | Installs workspace dependencies | -| `pnpm dev` | Run workspace dev tasks | -| `pnpm build` | Run workspace build tasks | -| `pnpm @home` | Alias to home app scripts (@fi.dev/home) | + +| Command | Action | +| :------------- | :----------------------------------- | +| `pnpm install` | Installs workspace dependencies | +| `pnpm dev` | Run workspace dev tasks | +| `pnpm build` | Run workspace build tasks | +| `pnpm @home` | Alias to home app scripts (@fi/home) | diff --git a/apps/home/README.md b/apps/home/README.md index 782689d..0fcec49 100644 --- a/apps/home/README.md +++ b/apps/home/README.md @@ -1,12 +1,14 @@ -# `fi.dev` home +# `fi` home + Home application containing the blog and other goodies ## 🧞 Commands -| Command | Action | -| :------------------------ | :----------------------------------------------- | -| `pnpm install` | Installs dependencies | -| `pnpm dev` | Starts local dev server at `localhost:3000` | -| `pnpm build` | Build your production site to `./dist/` | -| `pnpm preview` | Preview your build locally, before deploying | -| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | -| `pnpm astro -- --help` | Get help using the Astro CLI | + +| Command | Action | +| :--------------------- | :----------------------------------------------- | +| `pnpm install` | Installs dependencies | +| `pnpm dev` | Starts local dev server at `localhost:3000` | +| `pnpm build` | Build your production site to `./dist/` | +| `pnpm preview` | Preview your build locally, before deploying | +| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | +| `pnpm astro -- --help` | Get help using the Astro CLI | diff --git a/apps/home/astro.config.ts b/apps/home/astro.config.ts index 9fbcdc8..17e4fdc 100644 --- a/apps/home/astro.config.ts +++ b/apps/home/astro.config.ts @@ -1,5 +1,5 @@ -import { loadEnv } from "vite"; import { defineConfig } from "astro/config"; +import { loadEnv } from "vite"; import tailwind from "@astrojs/tailwind"; diff --git a/apps/home/biome.jsonc b/apps/home/biome.jsonc deleted file mode 100644 index 6619d33..0000000 --- a/apps/home/biome.jsonc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", - "extends": ["../../biome.jsonc"], - "linter": { - "enabled": false - } -} diff --git a/apps/home/cms.config.ts b/apps/home/cms.config.ts index cc66ad2..5798ae1 100644 --- a/apps/home/cms.config.ts +++ b/apps/home/cms.config.ts @@ -2,15 +2,13 @@ import { exec } from "node:child_process"; import "dotenv/config"; -import { defineContentConfig } from "@fi.dev/content"; +import { defineContentConfig } from "@fi/content"; import { musicPost } from "@/libraries/posts/music"; -import { onPublishPosts } from "@/libraries/posts/onPublish"; export default defineContentConfig({ dir: "./src/content", entries: [musicPost], - onPublish: onPublishPosts, hooks: [ { events: ["create"], diff --git a/apps/home/drizzle.config.ts b/apps/home/drizzle.config.ts deleted file mode 100644 index fa9cd80..0000000 --- a/apps/home/drizzle.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import "dotenv/config"; - -import { defineConfig } from "drizzle-kit"; - -export default defineConfig({ - schema: "./src/libraries/database/database.tables.ts", - out: "./migrations", - dialect: "postgresql", - dbCredentials: { - url: process.env.NEON_DATABASE_URL!, - }, -}); diff --git a/apps/home/package.json b/apps/home/package.json index 3d2521f..233477b 100644 --- a/apps/home/package.json +++ b/apps/home/package.json @@ -1,5 +1,5 @@ { - "name": "@fi.dev/home", + "name": "@fi/home", "type": "module", "version": "0.0.1", "scripts": { @@ -7,11 +7,10 @@ "start": "astro dev", "build": "astro check && astro build", "preview": "astro preview", + "lint": "oxlint", "check": "astro check", - "test": "vitest", "astro": "astro", "astro:upgrade": "pnpm dlx @astrojs/upgrade", - "drizzle": "drizzle-kit", "node": "tsx", "content": "pnpm node ./cms.config.ts", "sync:icons": "pnpm node ./scripts/sync-svg-sprites.ts", @@ -23,14 +22,13 @@ "@astrojs/solid-js": "^5.0.0", "@astrojs/tailwind": "^5.1.3", "@astrojs/vercel": "^8.0.0", - "@fi.dev/content": "workspace:*", - "@fi.dev/theme": "workspace:*", - "@fi.dev/typescript": "workspace:*", + "@fi/content": "workspace:*", + "@fi/theme": "workspace:*", + "@fi/typescript": "workspace:*", "@fontsource-variable/nunito": "^5.1.0", "@fontsource-variable/space-grotesk": "^5.1.0", "@kobalte/core": "^0.13.7", "@kobalte/tailwindcss": "^0.9.0", - "@neondatabase/serverless": "^0.10.1", "@solid-primitives/intersection-observer": "^2.1.6", "@tanstack/solid-query": "^5.56.2", "@tanstack/solid-query-devtools": "^5.56.2", @@ -39,8 +37,6 @@ "astro": "^5.0.2", "astro-compressor": "^1.0.0", "class-variance-authority": "^0.7.0", - "drizzle-orm": "^0.35.3", - "drizzle-zod": "^0.5.1", "hast-util-from-html": "^2.0.3", "html-to-text": "^9.0.5", "qss": "^3.0.0", @@ -53,7 +49,6 @@ "@astrojs/check": "^0.9.4", "@types/hast": "^3.0.4", "dotenv": "^16.4.5", - "drizzle-kit": "^0.26.2", "open": "^10.1.0", "rehype-stringify": "^10.0.1", "remark-parse": "^11.0.0", diff --git a/apps/home/scripts/spotify-auth-code-flow.ts b/apps/home/scripts/spotify-auth-code-flow.ts index 3c5feb3..8318c95 100644 --- a/apps/home/scripts/spotify-auth-code-flow.ts +++ b/apps/home/scripts/spotify-auth-code-flow.ts @@ -2,8 +2,8 @@ import "dotenv/config"; import open from "open"; -import { getSpotifyEnv } from "@/libraries/schemas"; import { createSpotifyClient } from "@/libraries/clients"; +import { getSpotifyEnv } from "@/libraries/schemas"; const startSpotifyAuthFlow = async () => { console.log("Starting Spotify authorisation code flow"); diff --git a/apps/home/scripts/sync-music-post-entries-db.ts b/apps/home/scripts/sync-music-post-entries-db.ts deleted file mode 100644 index b4a301e..0000000 --- a/apps/home/scripts/sync-music-post-entries-db.ts +++ /dev/null @@ -1,27 +0,0 @@ -import path from "node:path"; - -import "dotenv/config"; - -import { getPostsPathsFromRootDir } from "@fi.dev/content"; - -import { client } from "../src/libraries/database"; - -const syncMusicPostEntriesDatabase = async () => { - const paths = getPostsPathsFromRootDir("./src/content/music").filter((path) => - path.includes(".md"), - ); - - const postsToPublish = paths.map((entryPath) => { - const splitPath = entryPath.split("/"); - - const slug = path.basename(entryPath).split(".")[0]; - const date = splitPath.at(-2); - - return { slug, publishDate: new Date(date || "") }; - }); - - client.post.handlePostPublishing(postsToPublish); - console.log(`Handled publishing of ${postsToPublish.length} posts`); -}; - -syncMusicPostEntriesDatabase(); diff --git a/apps/home/scripts/sync-music-post-entries-local.ts b/apps/home/scripts/sync-music-post-entries-local.ts index 9ac169e..d405d2b 100644 --- a/apps/home/scripts/sync-music-post-entries-local.ts +++ b/apps/home/scripts/sync-music-post-entries-local.ts @@ -1,10 +1,10 @@ import fs from "node:fs"; -import { getPostsPathsFromRootDir, matter } from "@fi.dev/content"; +import { getPostsPathsFromRootDir, matter } from "@fi/content"; const syncMusicPostEntriesLocal = () => { const paths = getPostsPathsFromRootDir("./src/content/music").filter((path) => - path.includes(".md"), + path.includes(".md") ); for (const path of paths) { diff --git a/apps/home/src/components/astro/ContentDisplay.astro b/apps/home/src/components/astro/ContentDisplay.astro index bebcaf0..e0e2c3c 100644 --- a/apps/home/src/components/astro/ContentDisplay.astro +++ b/apps/home/src/components/astro/ContentDisplay.astro @@ -1,8 +1,8 @@ --- -import { render, type CollectionEntry } from "astro:content"; +import { type CollectionEntry, render } from "astro:content"; import { twMerge } from "tailwind-merge"; -import { getEnvironmentVariable } from "@fi.dev/typescript"; +import { getEnvironmentVariable } from "@fi/typescript"; import { compileOutputWithPlugins } from "@/libraries/plugins"; import type { CollectionKey } from "astro:content"; @@ -31,40 +31,30 @@ const output = await (async () => { })(); ---
- { - typeof output === "string" ? ( - - ) : ( - - ) - } + {typeof output === "string" ? : }
- + link.setAttribute("target", "_blank"); + } +}); + diff --git a/apps/home/src/components/astro/InlineSprites.astro b/apps/home/src/components/astro/InlineSprites.astro index 070fdc2..defece2 100644 --- a/apps/home/src/components/astro/InlineSprites.astro +++ b/apps/home/src/components/astro/InlineSprites.astro @@ -1,164 +1,104 @@ - diff --git a/apps/home/src/components/interfaces/layouts/SocialLinksLayout.tsx b/apps/home/src/components/interfaces/layouts/SocialLinksLayout.tsx index c48f19b..6768359 100644 --- a/apps/home/src/components/interfaces/layouts/SocialLinksLayout.tsx +++ b/apps/home/src/components/interfaces/layouts/SocialLinksLayout.tsx @@ -2,7 +2,7 @@ import { twMerge } from "tailwind-merge"; import { AppManifest } from "@/configs"; -import { Link, Icon } from "@/components/core"; +import { Icon, Link } from "@/components/core"; export const SocialLinksLayout = (props: SocialLinksLayoutProps) => { return ( diff --git a/apps/home/src/components/interfaces/music/MusicArtistEntry.tsx b/apps/home/src/components/interfaces/music/MusicArtistEntry.tsx index 4a5f7b4..96104bf 100644 --- a/apps/home/src/components/interfaces/music/MusicArtistEntry.tsx +++ b/apps/home/src/components/interfaces/music/MusicArtistEntry.tsx @@ -3,8 +3,8 @@ import { twJoin } from "tailwind-merge"; import type { MusicArtistSchema } from "@/libraries/schemas"; -import { Passthrough } from "@/components/core"; import { ProjectPlaceholderPNG } from "@/assets"; +import { Passthrough } from "@/components/core"; import { AppManifest } from "@/configs"; export const MusicArtistEntry = (props: MusicArtistEntryProps) => { @@ -25,11 +25,9 @@ export const MusicArtistEntry = (props: MusicArtistEntryProps) => {
{!!props.artist?.covers.length && ( {`${props.artist?.name} { class="text-gray-500 font-light text-sm truncate" title={props.artist?.genres?.join(", ") || undefined} > - {props.artist?.genres.length - ? props.artist?.genres.join(", ") - : "no genres listed"} + {props.artist?.genres.length ? + props.artist?.genres.join(", ") : + "no genres listed"}

{ remaining: !data.remaining ? data.remaining : data.remaining + 1000, })); }, 1000); - const songEndTimeout = setTimeout(() => { - queryClient.invalidateQueries({ queryKey: currentPlayingQueryKey }); - }, currentPlayingQuery.data?.duration - - currentPlayingQuery.data.remaining); + const songEndTimeout = setTimeout( + () => { + queryClient.invalidateQueries({ queryKey: currentPlayingQueryKey }); + }, + currentPlayingQuery.data?.duration - + currentPlayingQuery.data.remaining, + ); onCleanup(() => { - clearInterval(songProgressInterval); + // FIXME for some reason this is needed here + clearInterval(songProgressInterval as NodeJS.Timeout); clearTimeout(songEndTimeout); }); } @@ -135,11 +130,9 @@ export const MusicCurrentlyPlayingPane = withQueryProvider(() => { { @@ -205,9 +200,7 @@ export const MusicCurrentlyPlayingPane = withQueryProvider(() => { - } + fallback={} > {(url) => ( {
Check back later

- } + fallback={

Check back later

} > ( diff --git a/apps/home/src/components/interfaces/music/MusicFeelingLuckyButton.tsx b/apps/home/src/components/interfaces/music/MusicFeelingLuckyButton.tsx index c59580e..1dcff0f 100644 --- a/apps/home/src/components/interfaces/music/MusicFeelingLuckyButton.tsx +++ b/apps/home/src/components/interfaces/music/MusicFeelingLuckyButton.tsx @@ -2,11 +2,11 @@ import { createSignal, Show } from "solid-js"; import { AppManifest } from "@/configs"; +import { MusicImFeelingLuckyRoute } from "@/libraries/api"; import { request } from "@/libraries/clients"; import { astroNavigate } from "@/libraries/utilities"; -import { MusicImFeelingLuckyRoute } from "@/libraries/api"; -import { Button, Icon, type ButtonProps } from "@/components/core"; +import { Button, type ButtonProps, Icon } from "@/components/core"; import { twMerge } from "tailwind-merge"; export const MusicFeelingLuckyButton = ( diff --git a/apps/home/src/components/interfaces/music/MusicPostStickyPane.tsx b/apps/home/src/components/interfaces/music/MusicPostStickyPane.tsx index 3d1edb0..c258d08 100644 --- a/apps/home/src/components/interfaces/music/MusicPostStickyPane.tsx +++ b/apps/home/src/components/interfaces/music/MusicPostStickyPane.tsx @@ -1,13 +1,13 @@ -import { Show, For, batch, type JSX } from "solid-js"; +import { batch, For, type JSX, Show } from "solid-js"; import { createStore } from "solid-js/store"; import { twJoin, twMerge } from "tailwind-merge"; -import { useQueryParams } from "@/libraries/hooks"; -import { MusicPostRatingMap } from "@/libraries/constants"; import { FetchMusicPostsRoute } from "@/libraries/api"; +import { MusicPostRatingMap } from "@/libraries/constants"; +import { useQueryParams } from "@/libraries/hooks"; import type { InferDTOS } from "@/libraries/types"; -import { Popover, Select, Button, Icon } from "@/components/core"; +import { Button, Icon, Popover, Select } from "@/components/core"; export const MusicPostStickyPane = (props: MusicPostStickyPaneProps) => { const [query, setQuery] = useQueryParams(FetchMusicPostsRoute.dtos.query); @@ -150,11 +150,9 @@ export const MusicPostStickyPane = (props: MusicPostStickyPaneProps) => { {(level) => ( - { - MusicPostRatingMap[ - level as keyof typeof MusicPostRatingMap - ] - } + {MusicPostRatingMap[ + level as keyof typeof MusicPostRatingMap + ]} )} @@ -182,9 +180,9 @@ export const MusicPostStickyPane = (props: MusicPostStickyPaneProps) => { onSubmit={handleSearchSubmission} class={twJoin( "flex items-center gap-1 pl-2 flex-grow", - !configIsDirty() && !configIsClearable() - ? "rounded-r-lg border-r-0" - : "border-b md:border-r md:border-b-0 border-slate-200", + !configIsDirty() && !configIsClearable() ? + "rounded-r-lg border-r-0" : + "border-b md:border-r md:border-b-0 border-slate-200", )} >
-
+
-
- +
+
-
+
- Me taking photo + Me taking photo

Storytime with Fidel

Warning: there may be tangents
-
- +
+
- + diff --git a/apps/home/src/pages/api/subscribers.ts b/apps/home/src/pages/api/subscribers.ts deleted file mode 100644 index 7e7ae49..0000000 --- a/apps/home/src/pages/api/subscribers.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { APIRoute } from "astro"; - -import { subscribeToWebsite } from "@/libraries/server"; - -export const prerender = false; - -export const POST: APIRoute = async (context) => { - const { request } = context; - - const result = await subscribeToWebsite(request); - - return Response.json(result, { status: 202 }); -}; diff --git a/apps/home/src/pages/index.astro b/apps/home/src/pages/index.astro index 8cfe743..9806c40 100644 --- a/apps/home/src/pages/index.astro +++ b/apps/home/src/pages/index.astro @@ -1,16 +1,16 @@ --- import { AppManifest } from "@/configs"; -import { fetchMusicProjects, fetchMusicPostsTotal } from "@/libraries/server"; +import { fetchMusicPostsTotal, fetchMusicProjects } from "@/libraries/server"; import { RootLayout } from "@/pages/_root.layout"; import { Container, Grid, Link } from "@/components/core"; import { - MusicProjectEntry, + HeadingSection, MusicCurrentlyPlayingPane, + MusicProjectEntry, MusicSearchOptions, - HeadingSection, } from "@/components/interfaces"; const request = new Request(`${Astro.request.url}?page=1&size=3`); @@ -21,14 +21,10 @@ const [displayPosts, totalPosts] = await Promise.all([ --- - - + + - { - displayPosts.items.map(post => ( - - )) - } + {displayPosts.items.map(post => )}
- +
diff --git a/apps/home/src/pages/music.astro b/apps/home/src/pages/music.astro index 5cc07c0..7ad7857 100644 --- a/apps/home/src/pages/music.astro +++ b/apps/home/src/pages/music.astro @@ -1,6 +1,6 @@ --- -import { astroMeta } from "@/libraries/utilities"; import { fetchMusicGenres, fetchMusicProjects } from "@/libraries/server"; +import { astroMeta } from "@/libraries/utilities"; import { RootLayout } from "@/pages/_root.layout"; @@ -21,8 +21,8 @@ const [initialProjects, genres] = await Promise.all([ --- - - + +
{ const [firstArtist] = populatedArtists; const [firstImageCover] = covers; -const tracksList = - type === MusicPostMetadata.types.ALBUM ? entry.data.tracks : []; +const tracksList = type === MusicPostMetadata.types.ALBUM ? entry.data.tracks : []; const favouriteTracks = tracksList .map((track, trackIndex) => - track.favourite - ? { - number: trackIndex + 1, - track, - } - : [], + track.favourite ? + { + number: trackIndex + 1, + track, + } : + [] ) .flat(); @@ -95,26 +94,26 @@ const truncatedContent = convert( Track list -
+
    { tracksList.map( (track, trackIndex) => ( -
  • - {track.name} .{trackIndex + 1} -
  • - ) +
  • + {track.name} .{trackIndex + 1} +
  • + ), ) }
-
+
  • {genres.join(", ")}
  • - +
  • @@ -152,10 +151,11 @@ const truncatedContent = convert( { favouriteTracks.map( (track) => ( -
  • - {track.number}. {track.track.name} -
  • - ) +
  • + {track.number}. + {track.track.name} +
  • + ), ) } @@ -163,12 +163,12 @@ const truncatedContent = convert(
    - +
    { entry.data.date && (
    - +