From 59a3e26c20c9905f210eb3258e271b035995a891 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Wed, 17 Jul 2024 14:30:49 +0100 Subject: [PATCH] Pass --- .../addon-catalog/app/[...addonName]/page.tsx | 2 +- .../components/addon/addon-hero.tsx | 32 ++++++---- .../components/addon/addon-sidebar.tsx | 2 +- .../lib/fetch-tag-details-data.ts | 62 +++++++++---------- apps/addon-catalog/lib/fetch-tags-data.ts | 56 +++++++++-------- apps/addon-catalog/package.json | 3 + apps/addon-catalog/types.ts | 23 ++++--- package-lock.json | 37 ++--------- packages/ui/src/mdx/components/td.tsx | 10 +-- packages/ui/src/mdx/components/th.tsx | 6 +- packages/ui/src/mdx/components/tr.tsx | 6 +- turbo.json | 7 ++- 12 files changed, 119 insertions(+), 127 deletions(-) diff --git a/apps/addon-catalog/app/[...addonName]/page.tsx b/apps/addon-catalog/app/[...addonName]/page.tsx index 4c0b3838..c8f7a52a 100644 --- a/apps/addon-catalog/app/[...addonName]/page.tsx +++ b/apps/addon-catalog/app/[...addonName]/page.tsx @@ -35,7 +35,7 @@ export default async function AddonDetails({ params }: AddonDetailsProps) {
{ - copy(`npx install ${addon.name}`); + copy(`npx install ${addon.name ?? ''}`); setState(true); setTimeout(() => { setState(false); @@ -27,22 +27,27 @@ export function AddonHero({ addon }: { addon: Addon }) { return (
- {addon.icon ?
: null} + /> + ) : null}

{addon.displayName}

{addon.verified && - ['official', 'integrators'].includes(addon.verified) && - addon.status !== 'deprecated' ? : null} + ['official', 'integrators'].includes(addon.verified) && + addon.status !== 'deprecated' ? ( + + ) : null}

{addon.description}

); diff --git a/apps/addon-catalog/components/addon/addon-sidebar.tsx b/apps/addon-catalog/components/addon/addon-sidebar.tsx index 4277e69e..235fce7a 100644 --- a/apps/addon-catalog/components/addon/addon-sidebar.tsx +++ b/apps/addon-catalog/components/addon/addon-sidebar.tsx @@ -58,7 +58,7 @@ export function AddonSidebar({ addon }: { addon: AddonWithTagLinks }) { ))} : null} - {tags && tags.length ? <> + {tags?.length ? <>
Tags
diff --git a/apps/addon-catalog/lib/fetch-tag-details-data.ts b/apps/addon-catalog/lib/fetch-tag-details-data.ts index 7a07a2d2..0c7071bd 100644 --- a/apps/addon-catalog/lib/fetch-tag-details-data.ts +++ b/apps/addon-catalog/lib/fetch-tag-details-data.ts @@ -1,15 +1,16 @@ import { addonFragment, recipeFragment, validateResponse } from '@repo/utils'; +import { type Tag } from '../types'; import { fetchAddonsQuery, gql } from './fetch-addons-query'; type TagValue = Pick< - Tag, - | 'name' - | 'displayName' - | 'description' - | 'icon' - | 'relatedTags' - | 'topIntegrations' - > + Tag, + | 'name' + | 'displayName' + | 'description' + | 'icon' + | 'relatedTags' + | 'topIntegrations' +>; interface TagsData { tags: TagValue[]; @@ -20,14 +21,13 @@ async function fetchTagsData({ }: { isCategory?: boolean; } = {}) { - try { - let value: TagValue[] = []; - async function fetchPartialData(skip = 0) { - const data = await fetchAddonsQuery< - TagsData, - { isCategory: boolean; skip: number } - >( - gql` + let value: TagValue[] = []; + async function fetchPartialData(skip = 0) { + const data = await fetchAddonsQuery< + TagsData, + { isCategory: boolean; skip: number } + >( + gql` query Tags($isCategory: Boolean!, $skip: Int!) { tags(isCategory: $isCategory, limit: 30, skip: $skip) { name @@ -54,26 +54,26 @@ async function fetchTagsData({ } } `, - { - variables: { isCategory: Boolean(isCategory), skip }, - }, - ); + { + variables: { isCategory: Boolean(isCategory), skip }, + }, + ); - validateResponse(() => data.tags); + validateResponse(() => data.tags); - const { tags } = data; + const { tags } = data; - value = [...value, ...tags]; + value = [...value, ...tags]; - if (tags.length > 0) await fetchPartialData(skip + tags.length); + if (tags.length > 0) await fetchPartialData(skip + tags.length); - return value; - } + return value; + } + try { return await fetchPartialData(); } catch (error) { - // @ts-expect-error - Seems safe - throw new Error(`Failed to fetch tags data: ${error.message}`); + throw new Error(`Failed to fetch tags data: ${(error as Error).message}`); } } @@ -83,9 +83,7 @@ export async function fetchTagDetailsData(name: string) { const categoriesData = await fetchTagsData({ isCategory: true }); const tagsData = await fetchTagsData(); - const tag = [...categoriesData, ...tagsData].find( - (tag) => tag.name === name, - ); + const tag = [...categoriesData, ...tagsData].find((t) => t.name === name); // if (!tag) throw new Error(`Tag not found: ${name}`); @@ -96,6 +94,6 @@ export async function fetchTagDetailsData(name: string) { isCategory: categoriesData.find((category) => category.name === name), }; } catch (error) { - throw new Error(`Failed to fetch tags data: ${error}`); + throw new Error(`Failed to fetch tags data: ${(error as Error).message}`); } } diff --git a/apps/addon-catalog/lib/fetch-tags-data.ts b/apps/addon-catalog/lib/fetch-tags-data.ts index 721d0a4f..fc93dd9c 100644 --- a/apps/addon-catalog/lib/fetch-tags-data.ts +++ b/apps/addon-catalog/lib/fetch-tags-data.ts @@ -1,5 +1,6 @@ import { validateResponse } from '@repo/utils'; -import { fetchAddonsQuery, gql } from "./fetch-addons-query"; +import { type Tag } from '../types'; +import { fetchAddonsQuery, gql } from './fetch-addons-query'; type TagValue = Tag['name']; @@ -12,39 +13,40 @@ export async function fetchTagsData({ }: { isCategory?: boolean; } = {}) { - try { - let value: TagValue[] = []; - async function fetchPartialData(skip = 0) { - const data = await fetchAddonsQuery< - TagsData, - { isCategory: boolean; skip: number } - >( - gql` - query TagNames($isCategory: Boolean!, $skip: Int!) { - tags(isCategory: $isCategory, limit: 30, skip: $skip) { - name - } + let value: TagValue[] = []; // Moved outside to be accessible by fetchPartialData + + // Define fetchPartialData at the root of fetchTagsData function body + async function fetchPartialData(skip = 0): Promise { + const data = await fetchAddonsQuery< + TagsData, + { isCategory: boolean; skip: number } + >( + gql` + query TagNames($isCategory: Boolean!, $skip: Int!) { + tags(isCategory: $isCategory, limit: 30, skip: $skip) { + name } - `, - { - variables: { isCategory: Boolean(isCategory), skip }, - }, - ); + } + `, + { + variables: { isCategory: Boolean(isCategory), skip }, + }, + ); - validateResponse(() => data?.tags); + validateResponse(() => data?.tags); - const { tags } = data; + const { tags } = data; - value = [...value, ...tags.map(({ name }) => name)]; + value = [...value, ...tags.map(({ name }) => name)]; - if (tags.length > 0) await fetchPartialData(skip + tags.length); + if (tags.length > 0) await fetchPartialData(skip + tags.length); - return value; - } + return value; + } - return await fetchPartialData(); + try { + return await fetchPartialData(); // Call fetchPartialData at the end of fetchTagsData } catch (error) { - // @ts-expect-error - Seems safe - throw new Error(`Failed to fetch addons data: ${error.message}`); + throw new Error(`Failed to fetch addons data: ${(error as Error).message}`); } } diff --git a/apps/addon-catalog/package.json b/apps/addon-catalog/package.json index e553c6f2..dcab0dc3 100644 --- a/apps/addon-catalog/package.json +++ b/apps/addon-catalog/package.json @@ -16,6 +16,7 @@ "@next/third-parties": "^14.2.4", "@radix-ui/react-slot": "^1.1.0", "@repo/ui": "*", + "@repo/utils": "*", "@storybook/icons": "^1.2.9", "@types/mdx": "^2.0.13", "copy-to-clipboard": "^3.3.3", @@ -23,6 +24,8 @@ "graphql-request": "^7.1.0", "human-format": "^1.2.0", "next": "^14.2.4", + "next-plausible": "^3.12.0", + "next-themes": "^0.3.0", "prismjs": "^1.29.0", "react": "^18", "react-dom": "^18", diff --git a/apps/addon-catalog/types.ts b/apps/addon-catalog/types.ts index 62167cf1..5cd03ef7 100644 --- a/apps/addon-catalog/types.ts +++ b/apps/addon-catalog/types.ts @@ -1,8 +1,9 @@ +// @ts-expect-error - TypeScript is unable to resolve the module declare module 'rehype-urls'; -type Appearance = 'official' | 'integrator' | 'community'; +export type Appearance = 'official' | 'integrator' | 'community'; -interface Addon { +export interface Addon { type?: 'Addon'; name?: string; authors?: User[] | null; @@ -26,11 +27,13 @@ interface Addon { yearlyDownloads?: number | null; } -interface AddonWithTagLinks extends Omit { tags: TagLinkType[] } +export interface AddonWithTagLinks extends Omit { + tags: TagLinkType[]; +} -interface Framework extends Pick {} +export type Framework = Pick; -interface Recipe { +export interface Recipe { type: 'Recipe'; name: string; accentColor: string | null; @@ -50,9 +53,9 @@ interface Recipe { yearlyViews: number | null; } -type Status = 'default' | 'essential' | 'deprecated'; +export type Status = 'default' | 'essential' | 'deprecated'; -interface Tag { +export interface Tag { type?: 'Tag'; // displayName is nullable in the GraphQL schema, but buildTagLinks implies it's always available displayName?: string; @@ -68,16 +71,16 @@ interface Tag { link?: string; } -interface User { +export interface User { type?: 'User'; username: string; email?: string | null; gravatarUrl: string | null; } -type Verified = 'integrators' | 'official'; +export type Verified = 'integrators' | 'official'; -interface TagLinkType { +export interface TagLinkType { link: string; name: string; } diff --git a/package-lock.json b/package-lock.json index 0180365a..be8fb637 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,6 +31,7 @@ "@next/third-parties": "^14.2.4", "@radix-ui/react-slot": "^1.1.0", "@repo/ui": "*", + "@repo/utils": "*", "@storybook/icons": "^1.2.9", "@types/mdx": "^2.0.13", "copy-to-clipboard": "^3.3.3", @@ -38,6 +39,8 @@ "graphql-request": "^7.1.0", "human-format": "^1.2.0", "next": "^14.2.4", + "next-plausible": "^3.12.0", + "next-themes": "^0.3.0", "prismjs": "^1.29.0", "react": "^18", "react-dom": "^18", @@ -151,6 +154,7 @@ }, "apps/tutorials": { "version": "0.1.0", + "extraneous": true, "dependencies": { "@docsearch/css": "^3.6.0", "@repo/ui": "*", @@ -13013,11 +13017,6 @@ "node": "^12.20 || >= 14.13" } }, - "node_modules/fflate": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz", - "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA==" - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -19521,25 +19520,6 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, - "node_modules/posthog-js": { - "version": "1.146.0", - "resolved": "https://registry.npmjs.org/posthog-js/-/posthog-js-1.146.0.tgz", - "integrity": "sha512-ciA3AmqED7CI1upQg+v3Be6+0ird0zDZi+K//l1Ck9OkFyXhbOfT3p7IFo39Q7nt+oCneelyF94KiPEQlZfUzg==", - "dependencies": { - "fflate": "^0.4.8", - "preact": "^10.19.3", - "web-vitals": "^4.0.1" - } - }, - "node_modules/preact": { - "version": "10.22.1", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.22.1.tgz", - "integrity": "sha512-jRYbDDgMpIb5LHq3hkI0bbl+l/TQ9UnkdQ0ww+lp+4MMOdqaUYdFc5qeyP+IV8FAd/2Em7drVPeKdQxsiWCf/A==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -23613,10 +23593,6 @@ "win32" ] }, - "node_modules/tutorials": { - "resolved": "apps/tutorials", - "link": true - }, "node_modules/tween-functions": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tween-functions/-/tween-functions-1.2.0.tgz", @@ -24704,11 +24680,6 @@ "node": ">= 8" } }, - "node_modules/web-vitals": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.1.tgz", - "integrity": "sha512-U6bAxeudnhDqcXNl50JC4hLlqox9DZnngxfISZm3DMZnonW35xtJOVUc091L+DOY+6hVZVpKXoiCP0RiT6339Q==" - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", diff --git a/packages/ui/src/mdx/components/td.tsx b/packages/ui/src/mdx/components/td.tsx index 8721a2b3..e9a61be5 100644 --- a/packages/ui/src/mdx/components/td.tsx +++ b/packages/ui/src/mdx/components/td.tsx @@ -1,12 +1,14 @@ -import type { DetailedHTMLProps, HTMLAttributes } from 'react'; +import type { DetailedHTMLProps, FC, HTMLAttributes } from 'react'; type TableProps = DetailedHTMLProps< HTMLAttributes, HTMLHeadingElement >; -export function Td({ children }: TableProps) { +export const Td: FC = ({ children }) => { return ( // TODO: Check prefix placement in ones like `[&>code]:ui-text-slate-500` - {children} + + {children} + ); -} +}; diff --git a/packages/ui/src/mdx/components/th.tsx b/packages/ui/src/mdx/components/th.tsx index eb579647..4a92c5a5 100644 --- a/packages/ui/src/mdx/components/th.tsx +++ b/packages/ui/src/mdx/components/th.tsx @@ -1,9 +1,9 @@ -import type { DetailedHTMLProps, HTMLAttributes } from 'react'; +import type { DetailedHTMLProps, FC, HTMLAttributes } from 'react'; type TableProps = DetailedHTMLProps< HTMLAttributes, HTMLHeadingElement >; -export function Th({ children }: TableProps) { +export const Th: FC = ({ children }) => { return {children}; -} +}; diff --git a/packages/ui/src/mdx/components/tr.tsx b/packages/ui/src/mdx/components/tr.tsx index 50216924..0ea1709c 100644 --- a/packages/ui/src/mdx/components/tr.tsx +++ b/packages/ui/src/mdx/components/tr.tsx @@ -1,9 +1,9 @@ -import type { DetailedHTMLProps, HTMLAttributes } from 'react'; +import type { DetailedHTMLProps, FC, HTMLAttributes } from 'react'; type TableProps = DetailedHTMLProps< HTMLAttributes, HTMLHeadingElement >; -export function Tr({ children }: TableProps) { +export const Tr: FC = ({ children }) => { return {children}; -} +}; diff --git a/turbo.json b/turbo.json index bce062ed..9e96d0f2 100644 --- a/turbo.json +++ b/turbo.json @@ -1,7 +1,12 @@ { "$schema": "https://turbo.build/schema.json", "globalDependencies": ["**/.env.*local"], - "globalEnv": ["GCP_CREDENTIALS", "SKIP_IP_HASH", "ALGOLIA_API_KEY"], + "globalEnv": [ + "GCP_CREDENTIALS", + "SKIP_IP_HASH", + "ALGOLIA_API_KEY", + "NEXT_PUBLIC_ALGOLIA_API_KEY" + ], "tasks": { "lint": { "dependsOn": ["^lint"]