UNPKG

@estarlincito/utils

Version:

A collection of utility functions designed to simplify and speed up development tasks in JavaScript and TypeScript projects.

1,068 lines (1,067 loc) 30.1 kB
import { z } from 'zod'; /** * Schema for image metadata. */ declare const ImagesSchema: z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>; /** * Types for image metadata. */ type Images = z.infer<typeof ImagesSchema>; /** * Schema for general website metadata. */ declare const WebsiteSchema: z.ZodObject<{ description: z.ZodString; images: z.ZodTuple<[z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>], z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>>; locale: z.ZodDefault<z.ZodString>; siteName: z.ZodString; title: z.ZodString; url: z.ZodString; }, "strip", z.ZodTypeAny, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; locale: string; siteName: string; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; locale?: string | undefined; }>; /** * Types for general website metadata. */ type Website = z.infer<typeof WebsiteSchema>; /** * Schema for book metadata, extending website metadata. */ declare const BookSchema: z.ZodObject<z.objectUtil.extendShape<{ authors: z.ZodTuple<[z.ZodString], z.ZodString>; isbn: z.ZodString; releaseDate: z.ZodString; tags: z.ZodTuple<[z.ZodString], z.ZodString>; }, { description: z.ZodString; images: z.ZodTuple<[z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>], z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>>; locale: z.ZodDefault<z.ZodString>; siteName: z.ZodString; title: z.ZodString; url: z.ZodString; }>, "strip", z.ZodTypeAny, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; locale?: string | undefined; }>; /** * Types for book metadata, extends Website metadata. */ type Book = z.infer<typeof BookSchema>; /** * Schema for article metadata, extending website metadata. */ declare const ArticleSchema: z.ZodObject<z.objectUtil.extendShape<{ audio: z.ZodOptional<z.ZodString>; authors: z.ZodTuple<[z.ZodString], z.ZodString>; modifiedTime: z.ZodString; publishedTime: z.ZodString; section: z.ZodString; tags: z.ZodTuple<[z.ZodString], z.ZodString>; }, { description: z.ZodString; images: z.ZodTuple<[z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>], z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>>; locale: z.ZodDefault<z.ZodString>; siteName: z.ZodString; title: z.ZodString; url: z.ZodString; }>, "strip", z.ZodTypeAny, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; locale?: string | undefined; audio?: string | undefined; }>; /** * Types for article metadata, extends Website metadata. */ type Article = z.infer<typeof ArticleSchema>; /** Possible OpenGraph content types. */ type Type = { type: 'article' | 'website' | 'book'; }; type _Image = { alt: string; url: string; height: 600; width: 800; }; /** * Schema generator for structured metadata. * * @template T - The OpenGraph content type (`'article' | 'website' | 'book'`). * @param {T} type - The type of content for metadata generation. */ declare const ReturnsSchema: <T extends Type["type"]>(type: T) => z.ZodObject<{ description: z.ZodString; icons: z.ZodObject<{ icon: z.ZodString; shortcut: z.ZodString; }, "strip", z.ZodTypeAny, { icon: string; shortcut: string; }, { icon: string; shortcut: string; }>; metadataBase: z.ZodType<URL, z.ZodTypeDef, URL>; openGraph: z.ZodEffects<z.ZodObject<{ description: z.ZodString; images: z.ZodTuple<[z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>], z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>>; locale: z.ZodDefault<z.ZodString>; siteName: z.ZodString; title: z.ZodString; url: z.ZodString; }, "strip", z.ZodTypeAny, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; locale: string; siteName: string; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; locale?: string | undefined; }>, { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; locale?: string | undefined; }> | z.ZodEffects<z.ZodObject<z.objectUtil.extendShape<{ authors: z.ZodTuple<[z.ZodString], z.ZodString>; isbn: z.ZodString; releaseDate: z.ZodString; tags: z.ZodTuple<[z.ZodString], z.ZodString>; }, { description: z.ZodString; images: z.ZodTuple<[z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>], z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>>; locale: z.ZodDefault<z.ZodString>; siteName: z.ZodString; title: z.ZodString; url: z.ZodString; }>, "strip", z.ZodTypeAny, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; locale?: string | undefined; }>, { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; locale?: string | undefined; }> | z.ZodEffects<z.ZodObject<z.objectUtil.extendShape<{ audio: z.ZodOptional<z.ZodString>; authors: z.ZodTuple<[z.ZodString], z.ZodString>; modifiedTime: z.ZodString; publishedTime: z.ZodString; section: z.ZodString; tags: z.ZodTuple<[z.ZodString], z.ZodString>; }, { description: z.ZodString; images: z.ZodTuple<[z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>], z.ZodObject<{ alt: z.ZodString; height: z.ZodOptional<z.ZodNumber>; url: z.ZodString; width: z.ZodOptional<z.ZodNumber>; }, "strip", z.ZodTypeAny, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }, { url: string; alt: string; height?: number | undefined; width?: number | undefined; }>>; locale: z.ZodDefault<z.ZodString>; siteName: z.ZodString; title: z.ZodString; url: z.ZodString; }>, "strip", z.ZodTypeAny, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; locale?: string | undefined; audio?: string | undefined; }>, { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }, { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; locale?: string | undefined; audio?: string | undefined; }>; title: z.ZodString; }, "strip", z.ZodTypeAny, { title: string; description: string; icons: { icon: string; shortcut: string; }; metadataBase: URL; openGraph: { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: T; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }; }, { title: string; description: string; icons: { icon: string; shortcut: string; }; metadataBase: URL; openGraph: { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; locale?: string | undefined; } | { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; locale?: string | undefined; } | { url: string; title: string; description: string; images: [{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }, ...{ url: string; alt: string; height?: number | undefined; width?: number | undefined; }[]]; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; locale?: string | undefined; audio?: string | undefined; }; }>; /** * Types for Returns. */ type Returns<T extends Type['type']> = z.infer<ReturnType<typeof ReturnsSchema<T>>>; /** * Types for GenerateMetadataTypes. */ export interface GenerateMetadataTypes { Type: Type; Images: Images; Website: Website; Article: Article; Book: Book; ReturnsWebsite: Returns<'website'>; ReturnsArticle: Returns<'article'>; ReturnsBook: Returns<'book'>; ReturnsWebsites: Returns<'website'>[]; ReturnsArticles: Returns<'article'>[]; ReturnsBooks: Returns<'book'>[]; } /** * Class for generating metadata for different types of content (website, book, article). * Each method generates metadata specific to a content type (website, book, or article). */ export declare class GenerateMetadata { private constructor(); private static generate; /** * Generates metadata specifically for an article. * * @param meta - The article metadata. * @returns - The generated metadata for the article. * * @example * const articleMeta: Article = { * title: 'Example Article Title', * description: 'Description for the article.', * url: 'https://example.com/article', * siteName: 'Example Site', * locale: 'en-US', * images: [{ url: '/assets/image1.jpg', alt: 'Article Image', width: 800, height: 600 }], * section: 'Tech News', * publishedTime: '2025-02-12T15:09:16Z', * modifiedTime: '2025-02-12T16:00:00Z', * authors: ['Author One'], * audio: new URL('/assets/audio.mp3'), * }; * const metadata = GenerateMetadata.article(articleMeta); */ static article(meta: Article): { title: string; description: string; icons: { icon: string; shortcut: string; }; metadataBase: URL; openGraph: { images: [_Image, ..._Image[]]; type: "article"; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: "article"; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: "article"; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }; }; /** * Generates metadata specifically for a website. * * @param meta - The website metadata. * @returns - The generated metadata for the website. * * @example * const websiteMeta: Website = { * title: 'Example Website Title', * description: 'Description for the website.', * url: 'https://example.com/website', * siteName: 'Example Site', * locale: 'en-US', * images: [{ url: '/assets/image1.jpg', alt: 'Website Image', width: 800, height: 600 }], * }; * const metadata = GenerateMetadata.website(websiteMeta); */ static website(meta: Website): { title: string; description: string; icons: { icon: string; shortcut: string; }; metadataBase: URL; openGraph: { images: [_Image, ..._Image[]]; type: "website"; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: "website"; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: "website"; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }; }; /** * Generates metadata specifically for a book. * * @param meta - The book metadata. * @returns - The generated metadata for the book. * * @example * const bookMeta: Book = { * title: 'Example Book Title', * description: 'Description for the book.', * url: 'https://example.com/book', * siteName: 'Example Site', * locale: 'en-US', * images: [{ url: '/assets/image1.jpg', alt: 'Book Cover Image', width: 800, height: 600 }], * isbn: '978-3-16-148410-0', * authors: ['Author One', 'Author Two'], * releaseDate: '2025-02-12', * tags: ['Fiction', 'Adventure'], * }; * const metadata = GenerateMetadata.book(bookMeta); */ static book(meta: Book): { title: string; description: string; icons: { icon: string; shortcut: string; }; metadataBase: URL; openGraph: { images: [_Image, ..._Image[]]; type: "book"; url: string; title: string; description: string; locale: string; siteName: string; } | { images: [_Image, ..._Image[]]; type: "book"; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; isbn: string; releaseDate: string; tags: [string, ...string[]]; } | { images: [_Image, ..._Image[]]; type: "book"; url: string; title: string; description: string; locale: string; siteName: string; authors: [string, ...string[]]; tags: [string, ...string[]]; modifiedTime: string; publishedTime: string; section: string; audio?: string | undefined; }; }; } export {};