@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
TypeScript
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 {};