@coldsurf/shared-utils
v1.5.0
Published
Shared utilities for COLDSURF services.
Readme
@coldsurfers/shared-utils
Shared utilities for COLDSURF services.
Install
zod is a required peer dependency.
pnpm
pnpm add @coldsurfers/shared-utils zodnpm
npm install @coldsurfers/shared-utils zodyarn
yarn add @coldsurfers/shared-utils zodbun
bun add @coldsurfers/shared-utils zodOptional peers
Install only when you use related utilities.
pnpm add jwt-decode schema-dtsFeature -> dependency map
decodeJwt(utils.jwt) usesjwt-decodeat runtime.buildSeoTags/createSeo(metadata) usesschema-dtstypes for JSON-LD typing.createNextMetadata(@coldsurfers/shared-utils/next) uses thenextMetadatatype only (no runtime dependency).
SEO — Next.js App Router (/next)
createNextMetadata is the Next App Router twin of createSeoHead (/react): it binds a
SiteConfig once and maps the framework-agnostic SEO engine output into Next's nested Metadata
object. Since Metadata has no JSON-LD field, structured data is emitted separately through
buildSeoScripts.
// app/lib/metadata.ts
import {
createNextMetadata,
buildSeoScripts,
type SiteConfig,
} from '@coldsurfers/shared-utils/next';
const SITE: SiteConfig = {
name: 'COLDSURF',
baseUrl: 'https://blog.coldsurf.io',
keywords: ['공연', 'indie'],
icons: { icon: '/icons/favicon.ico', shortcut: '/icons/favicon.ico', apple: '/icons/apple-touch-icon.png' },
publisher: { name: 'COLDSURF', url: 'https://coldsurf.io', sameAs: ['https://coldsurf.io'] },
editor: { name: 'imcoldsurf' },
};
export const seo = createNextMetadata(SITE);
// app/[series]/[slug]/layout.tsx
export function generateMetadata(): Metadata {
return seo({
path: '/log/some-post',
title: 'Some Post',
description: 'A post',
article: { publishedTime, author: ['Writer A', 'Writer B'] }, // multiple writers supported
robots: 'noindex, nofollow', // optional per-route override
});
}
// JSON-LD — inject in the layout (Metadata cannot carry <script>)
const scripts = buildSeoScripts(
{ path: '/log/some-post', title, description, jsonLd: [{ type: 'WebSite' }, { type: 'Article' }] },
SITE,
);
// scripts.map((s) => <script type="application/ld+json" dangerouslySetInnerHTML={{ __html: s }} />)
nextis an optional peer dependency — install it only when you use the/nextadapter. The adapter imports theMetadatatype only; there is no runtimenextdependency.
What to install by use case
- You only use date/slug/uuid/number/parser/file/location/uri utils:
pnpm add @coldsurfers/shared-utils zod- You use
decodeJwt:
pnpm add @coldsurfers/shared-utils zod jwt-decode- You use
buildSeoTags/createSeo/createSeoHeadwithschema-dtstypes:
pnpm add @coldsurfers/shared-utils zod schema-dts- You use both JWT + metadata helpers:
pnpm add @coldsurfers/shared-utils zod jwt-decode schema-dts- You use the Next.js metadata adapter (
createNextMetadata/buildSeoScripts):
pnpm add @coldsurfers/shared-utils zod schema-dts next