diff --git a/packages/core/src/index.d.ts b/packages/core/src/index.d.ts index 7289319..fba5f83 100644 --- a/packages/core/src/index.d.ts +++ b/packages/core/src/index.d.ts @@ -111,9 +111,47 @@ interface Metadata { title?: string | null description?: string | null url?: string | null + author?: string | null + lang?: string | null + publisher?: string | null + date?: string | null + image?: Asset | null + logo?: Asset | null [key: string]: unknown } +/** Same shape as `?data=` / `microlink.extract` rules. */ +interface ExtractRule { + attr?: string | string[] | ExtractRules + evaluate?: string | (() => unknown) + selector?: string | string[] + selectorAll?: string | string[] + type?: + | 'audio' + | 'author' + | 'auto' + | 'boolean' + | 'date' + | 'description' + | 'email' + | 'image' + | 'ip' + | 'lang' + | 'logo' + | 'number' + | 'object' + | 'publisher' + | 'regexp' + | 'string' + | 'title' + | 'url' + | 'video' +} + +interface ExtractRules { + [field: string]: ExtractRule | ExtractRule[] +} + interface Embed { html: string scripts?: unknown[] @@ -121,7 +159,10 @@ interface Embed { } export type FunctionArgs = { - page: Page + page: Page & { + metadata(): Promise + extract(rules: ExtractRules): Promise> + } response: HTTPResponse headers: Record url: string @@ -163,7 +204,7 @@ interface MicrolinkClient { audios (url: string, options?: CollectionOptions): Promise extract ( url: string, - rules: Record, + rules: ExtractRules, options?: Options ): Promise> screenshot (url: string, options?: ScreenshotOptions): Promise diff --git a/packages/core/test/index.test-d.ts b/packages/core/test/index.test-d.ts index cce5d46..702d513 100644 --- a/packages/core/test/index.test-d.ts +++ b/packages/core/test/index.test-d.ts @@ -62,6 +62,14 @@ async function assertions (): Promise { avatar: { selector: 'img', attr: 'src', type: 'image' } }) expectAssignable>(data) + expectAssignable>( + await client.extract('https://example.com', { + avatar: [ + { selector: 'meta[property="og:image"]', attr: 'content', type: 'image' }, + { selector: 'img', attr: 'src', type: 'image' } + ] + }) + ) const news = await client.search('coffee', { type: 'news', limit: 3 }) expectAssignable<{ results: Array<{ publisher: string }> }>(news) @@ -79,6 +87,17 @@ async function assertions (): Promise { expectType(response.ok()) expectType>(headers) expectType(url) + const metadata = await page.metadata() + expectType(metadata.title) + expectType>( + await page.extract({ + title: { selector: 'h1', type: 'string' }, + avatar: [ + { selector: 'meta[property="og:image"]', attr: 'content', type: 'image' }, + { selector: 'img', attr: 'src', type: 'image' } + ] + }) + ) return page.title() } )