Skip to content

Commit

Permalink
feat: export more types
Browse files Browse the repository at this point in the history
  • Loading branch information
danielroe committed Oct 6, 2024
1 parent f8383d8 commit f39b584
Show file tree
Hide file tree
Showing 9 changed files with 37 additions and 30 deletions.
12 changes: 5 additions & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,21 @@
import type { FontFaceData, InitializedProvider, Provider, ResolveFontOptions } from './types'
import type { InitializedProvider, Provider, ResolveFontOptions, ResolveFontResult } from './types'
import { createAsyncStorage, memoryStorage, type Storage } from './cache'

export * as providers from './providers'
export { defineFontProvider } from './types'
export type { FontFaceData, LocalFontSource, Provider, ProviderContext, ProviderDefinition, ProviderFactory, RemoteFontSource, ResolveFontOptions } from './types'
export { defineFontProvider } from './utils'

export interface UnifontOptions {
storage?: Storage
}

export type { ResolveFontOptions } from './types'
export interface Unifont {
resolveFont: (fontFamily: string, options?: ResolveFontOptions, providers?: string[]) => Promise<{
resolveFont: (fontFamily: string, options?: ResolveFontOptions, providers?: string[]) => Promise<ResolveFontResult & {
provider?: string
fonts: FontFaceData[]
}>
/** @deprecated use `resolveFont` */
resolveFontFace: (fontFamily: string, options?: ResolveFontOptions, providers?: string[]) => Promise<{
resolveFontFace: (fontFamily: string, options?: ResolveFontOptions, providers?: string[]) => Promise<ResolveFontResult & {
provider?: string
fonts: FontFaceData[]
}>
}

Expand Down
5 changes: 3 additions & 2 deletions src/providers/adobe.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hash } from 'ohash'
import type { ResolveFontOptions } from '../types'

import { hash } from 'ohash'
import { extractFontFaceData } from '../css/parse'
import { $fetch } from '../fetch'
import { defineFontProvider, type ResolveFontOptions } from '../types'
import { defineFontProvider } from '../utils'

interface ProviderOption {
id: string[] | string
Expand Down
5 changes: 3 additions & 2 deletions src/providers/bunny.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hash } from 'ohash'
import type { ResolveFontOptions } from '../types'

import { hash } from 'ohash'
import { extractFontFaceData } from '../css/parse'
import { $fetch } from '../fetch'
import { defineFontProvider, type ResolveFontOptions } from '../types'
import { defineFontProvider } from '../utils'

const fontAPI = $fetch.create({ baseURL: 'https://fonts.bunny.net' })

Expand Down
5 changes: 3 additions & 2 deletions src/providers/fontshare.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hash } from 'ohash'
import type { ResolveFontOptions } from '../types'

import { hash } from 'ohash'
import { extractFontFaceData } from '../css/parse'
import { $fetch } from '../fetch'
import { defineFontProvider, type ResolveFontOptions } from '../types'
import { defineFontProvider } from '../utils'

const fontAPI = $fetch.create({ baseURL: 'https://api.fontshare.com/v2' })
export default defineFontProvider('fontshare', async (_options, ctx) => {
Expand Down
5 changes: 3 additions & 2 deletions src/providers/fontsource.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { hash } from 'ohash'
import type { FontFaceData, ResolveFontOptions } from '../types'

import { hash } from 'ohash'
import { $fetch } from '../fetch'
import { defineFontProvider, type FontFaceData, type ResolveFontOptions } from '../types'
import { defineFontProvider } from '../utils'

const fontAPI = $fetch.create({ baseURL: 'https://api.fontsource.org/v1' })

Expand Down
5 changes: 3 additions & 2 deletions src/providers/google.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { hash } from 'ohash'
import type { ResolveFontOptions } from '../types'

import { hash } from 'ohash'
import { extractFontFaceData } from '../css/parse'
import { $fetch } from '../fetch'
import { defineFontProvider, type ResolveFontOptions } from '../types'
import { defineFontProvider } from '../utils'

export default defineFontProvider('google', async (_options, ctx) => {
const googleFonts = await ctx.storage.getItem('google:meta.json', () => $fetch<{ familyMetadataList: FontIndexMeta[] }>('https://fonts.google.com/metadata/fonts', { responseType: 'json' }).then(r => r.familyMetadataList))
Expand Down
2 changes: 1 addition & 1 deletion src/providers/googleicons.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { hash } from 'ohash'

import { extractFontFaceData } from '../css/parse'
import { $fetch } from '../fetch'
import { defineFontProvider } from '../types'
import { defineFontProvider } from '../utils'

export default defineFontProvider('googleicons', async (_options, ctx) => {
const googleIcons = await ctx.storage.getItem('googleicons:meta.json', async () => {
Expand Down
23 changes: 11 additions & 12 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
type Awaitable<T> = T | Promise<T>

interface ProviderContext {
export interface ProviderContext {
storage: {
getItem: {
<T = unknown>(key: string): Promise<T | null>
Expand Down Expand Up @@ -29,6 +29,7 @@ export interface LocalFontSource {
name: string
}

// TODO: name
export interface FontFaceData {
src: Array<LocalFontSource | RemoteFontSource>
/**
Expand All @@ -50,18 +51,20 @@ export interface FontFaceData {
variationSettings?: string
}

export interface InitializedProvider {
resolveFont: (family: string, options: ResolveFontOptions) => Awaitable<undefined | {
export interface ResolveFontResult {
/**
* Return data used to generate @font-face declarations.
* @see https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face
*/
fonts: FontFaceData[]
fallbacks?: string[]
}>
fonts: FontFaceData[]
fallbacks?: string[]
}

interface ProviderDefinition<T = unknown> {
export interface InitializedProvider {
resolveFont: (family: string, options: ResolveFontOptions) => Awaitable<ResolveFontResult | undefined>
}

export interface ProviderDefinition<T = unknown> {
(options: T, ctx: ProviderContext): Awaitable<InitializedProvider | undefined>
}

Expand All @@ -70,13 +73,9 @@ export interface Provider {
(ctx: ProviderContext): Awaitable<InitializedProvider | undefined>
}

type ProviderFactory<T = unknown> =
export type ProviderFactory<T = unknown> =
unknown extends T
? () => Provider
: Partial<T> extends T
? (options?: T) => Provider
: (options: T) => Provider

export function defineFontProvider<T = unknown>(name: string, provider: ProviderDefinition<T>): ProviderFactory<T> {
return ((options: T) => Object.assign(provider.bind(null, options || {} as T), { _name: name })) as ProviderFactory<T>
}
5 changes: 5 additions & 0 deletions src/utils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { ProviderDefinition, ProviderFactory } from './types'

export function defineFontProvider<T = unknown>(name: string, provider: ProviderDefinition<T>): ProviderFactory<T> {
return ((options: T) => Object.assign(provider.bind(null, options || {} as T), { _name: name })) as ProviderFactory<T>
}

0 comments on commit f39b584

Please sign in to comment.