{"version":3,"file":"_slug-Bm88cZuO.js","sources":["../../../app/routes/series_+/$slug.tsx"],"sourcesContent":["import { getBlogMdxListItems } from '~/utils/mdx.server.ts'\nimport {\n getDisplayUrl,\n getUrl,\n requireValidSlug,\n reuseUsefulLoaderHeaders,\n useCapturedRouteError,\n} from '~/utils/misc.tsx'\nimport {\n type HeadersFunction,\n json,\n type LoaderFunctionArgs,\n} from '@remix-run/node'\nimport slugify from 'slugify'\nimport { ServerError } from '~/components/errors.tsx'\nimport { ArticleCard } from '~/components/article-card.tsx'\nimport { Grid } from '~/components/grid.tsx'\nimport { H6 } from '~/components/typography.tsx'\nimport { type MetaFunction } from '@remix-run/react'\nimport { useLoaderData } from '@remix-run/react'\nimport { flatten } from '~/utils/cjs/lodash.js'\nimport { HeroSection } from '~/components/sections/hero-section.tsx'\nimport { getSocialMetas } from '~/utils/seo.ts'\nimport { getSocialImageWithPreTitle } from '~/images.tsx'\nimport { type RootLoaderType } from '~/root.tsx'\n\nexport async function loader({ request, params }: LoaderFunctionArgs) {\n requireValidSlug(params.slug)\n\n const posts = await getBlogMdxListItems({ request }).then(allPosts =>\n allPosts.filter(p => !p.frontmatter.draft && !p.frontmatter.unlisted),\n )\n\n const allSeries = flatten(\n posts.map(post => post.frontmatter.series || []),\n ).map(item => ({ ...item, slug: slugify(item.title, { lower: true }) }))\n const currentSeries = allSeries.find(item => item.slug === params.slug)\n\n if (!currentSeries) {\n throw new Response(`This is not a valid series: \"${params.slug}\"`, {\n status: 400,\n })\n }\n\n const seriesPosts = posts.filter(post => {\n const series = post.frontmatter.series || []\n return series\n .map(item => slugify(item.title, { lower: true }))\n .includes(params.slug!)\n })\n\n const data = {\n series: currentSeries,\n posts: seriesPosts,\n }\n\n return json(data, {\n headers: {\n 'Cache-Control': 'private, max-age=3600',\n Vary: 'Cookie',\n },\n })\n}\n\nexport const headers: HeadersFunction = reuseUsefulLoaderHeaders\n\nexport const meta: MetaFunction = ({\n matches,\n data,\n}) => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const requestInfo = matches.find(m => m.id === 'root')?.data.requestInfo\n return getSocialMetas({\n title: `Series - ${data?.series.title}`,\n description:\n 'Explore in-depth series on software development, featuring tutorials, best practices, and guides to enhance your development work.',\n keywords:\n 'Backend Development, Microservices Architecture, Database Management, Software Development, API Design, Server-Side Programming, Microservices Patterns, SQL Databases, NoSQL Databases, Cloud Backend Services, Distributed Systems, Database Optimization, Backend Frameworks, Service-Oriented Architecture, Data Modeling, Backend Scalability, DevOps for Microservices, Database Security, RESTful Services, Backend Integration',\n url: getUrl(requestInfo),\n image: getSocialImageWithPreTitle({\n url: getDisplayUrl(requestInfo),\n featuredImage: data?.series.bannerCloudinaryId || '',\n preTitle: 'Check out my series',\n title: `Series - ${data?.series.title}`,\n }),\n })\n}\n\nfunction SeriesIndex() {\n const data = useLoaderData()\n const { series, posts } = data\n\n return (\n
\n \n\n \n {posts.length === 0 ? (\n
\n
\n {`Couldn't find anything to match your criteria. Sorry.`}\n
\n
\n ) : (\n posts.map(article => (\n
\n \n
\n ))\n )}\n
\n
\n )\n}\n\nexport default SeriesIndex\nexport function ErrorBoundary() {\n const error = useCapturedRouteError()\n console.error(error)\n return \n}\n"],"names":["meta","matches","data","requestInfo","find","m","id","getSocialMetas","title","series","description","keywords","url","getUrl","image","getSocialImageWithPreTitle","getDisplayUrl","featuredImage","bannerCloudinaryId","preTitle","SeriesIndex","useLoaderData","posts","children","jsx","HeroSection","animatedTitle","Grid","className","length","H6","as","variant","map","article","ArticleCard","slug","ErrorBoundary","error","useCapturedRouteError","console","ServerError"],"mappings":"uRAkEO,MAAMA,EAA8DA,CAAC,CAC1EC,QAAAA,EACAC,KAAAA,CACF,IAAM,OAEE,MAAAC,GAAcF,EAAAA,EAAQG,KAAKC,GAAKA,EAAEC,KAAO,MAAM,IAAjCL,YAAAA,EAAoCC,KAAKC,YAC7D,OAAOI,EAAe,CACpBC,MAAO,YAAYN,GAAAA,YAAAA,EAAMO,OAAOD,KAAK,GACrCE,YACE,qIACFC,SACE,yaACFC,IAAKC,EAAOV,CAAW,EACvBW,MAAOC,EAA2B,CAChCH,IAAKI,EAAcb,CAAW,EAC9Bc,eAAef,GAAAA,YAAAA,EAAMO,OAAOS,qBAAsB,GAClDC,SAAU,sBACVX,MAAO,YAAYN,GAAAA,YAAAA,EAAMO,OAAOD,KAAK,EACtC,CAAA,CACH,CAAC,CACH,EAEA,SAASY,GAAc,CACrB,MAAMlB,EAAOmB,EAA6B,EACpC,CAAEZ,OAAAA,EAAQa,MAAAA,CAAM,EAAIpB,EAE1B,cACG,MACC,CAAAqB,SAAA,CAAAC,EAAA,IAACC,EAAY,CAAAjB,MAAOC,EAAOD,MAAOkB,cAAa,EAAC,CAAA,QAE/CC,EAAK,CAAAC,UAAU,QACbL,SAAAD,EAAMO,SAAW,EAChBL,EAAAA,IAAC,MAAI,CAAAI,UAAU,2CACbL,SAACC,EAAA,IAAAM,EAAA,CAAGC,GAAG,IAAIC,QAAQ,YAAYJ,UAAU,iBACtCL,SAAA,uDACH,CAAA,CACF,CAAA,EAEAD,EAAMW,IAAIC,SACP,MAAuB,CAAAN,UAAU,mBAChCL,SAAAC,EAAA,IAACW,GAAYD,QAAAA,CAAkB,CAAA,CAAA,EADvBA,EAAQE,IAElB,CACD,CAEL,CAAA,CAAA,CACF,CAAA,CAEJ,CAGO,SAASC,GAAgB,CAC9B,MAAMC,EAAQC,EAAsB,EACpCC,eAAQF,MAAMA,CAAK,QACXG,EAAY,EAAA,CACtB"}