Skip to content

Commit

Permalink
feat(preset-web-fonts): support passing custom provider, close #2535, #…
Browse files Browse the repository at this point in the history
  • Loading branch information
antfu committed Apr 23, 2023
1 parent 2ddbef3 commit ca4f668
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 25 deletions.
41 changes: 24 additions & 17 deletions packages/preset-web-fonts/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,31 +4,38 @@ import { BunnyFontsProvider } from './providers/bunny'
import { GoogleFontsProvider } from './providers/google'
import { FontshareProvider } from './providers/fontshare'
import { NoneProvider } from './providers/none'
import type { WebFontMeta, WebFontsOptions, WebFontsProviders } from './types'
import type { Provider, ResolvedWebFontMeta, WebFontMeta, WebFontsOptions, WebFontsProviders } from './types'

export * from './types'

export function normalizedFontMeta(meta: WebFontMeta | string, defaultProvider: WebFontsProviders): WebFontMeta {
const builtinProviders = {
google: GoogleFontsProvider,
bunny: BunnyFontsProvider,
fontshare: FontshareProvider,
none: NoneProvider,
}

function resolveProvider(provider: WebFontsProviders): Provider {
if (typeof provider === 'string')
return builtinProviders[provider]
return provider
}

export function normalizedFontMeta(meta: WebFontMeta | string, defaultProvider: WebFontsProviders): ResolvedWebFontMeta {
if (typeof meta !== 'string') {
meta.provider = meta.provider ?? defaultProvider
return meta
meta.provider = resolveProvider(meta.provider || defaultProvider)
return meta as ResolvedWebFontMeta
}

const [name, weights = ''] = meta.split(':')

return {
name,
weights: weights.split(/[,;]\s*/).filter(Boolean),
provider: defaultProvider,
provider: resolveProvider(defaultProvider),
}
}

const providers = {
google: GoogleFontsProvider,
bunny: BunnyFontsProvider,
fontshare: FontshareProvider,
none: NoneProvider,
}

function preset(options: WebFontsOptions = {}): Preset<any> {
const {
provider: defaultProvider = 'google',
Expand Down Expand Up @@ -67,17 +74,17 @@ function preset(options: WebFontsOptions = {}): Preset<any> {
}
}

const enabledProviders = new Set(fonts.map(i => i.provider))

const preset: Preset<any> = {
name: '@unocss/preset-web-fonts',
preflights: [
{
async getCSS() {
const names = new Set(fonts.map(i => i.provider || defaultProvider))
const preflights: (string | undefined)[] = []

for (const name of names) {
const fontsForProvider = fonts.filter(i => i.provider === name)
const provider = providers[name]
for (const provider of enabledProviders) {
const fontsForProvider = fonts.filter(i => i.provider === provider)

if (provider.getImportUrl) {
const url = provider.getImportUrl(fontsForProvider)
Expand All @@ -100,7 +107,7 @@ function preset(options: WebFontsOptions = {}): Preset<any> {
theme[themeKey] = {}
const obj = Object.fromEntries(
Object.entries(fontObject)
.map(([name, fonts]) => [name, fonts.map(f => providers[f.provider || defaultProvider].getFontName(f))]),
.map(([name, fonts]) => [name, fonts.map(f => f.provider.getFontName?.(f) ?? `"${f.name}"`)]),
)
for (const key of Object.keys(obj)) {
if (typeof theme[themeKey][key] === 'string')
Expand Down
3 changes: 0 additions & 3 deletions packages/preset-web-fonts/src/providers/fontshare.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,5 @@ export function createFontshareProvider(name: WebFontsProviders, host: string):
}).join('&')
return `${host}/v2/css?${strings}&display=swap`
},
getFontName(font) {
return `"${font.name}"`
},
}
}
3 changes: 0 additions & 3 deletions packages/preset-web-fonts/src/providers/google.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,5 @@ export function createGoogleProvider(name: WebFontsProviders, host: string): Pro
}).join('&')
return `${host}/css2?${strings}&display=swap`
},
getFontName(font) {
return `"${font.name}"`
},
}
}
8 changes: 6 additions & 2 deletions packages/preset-web-fonts/src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export type WebFontsProviders = 'google' | 'bunny' | 'fontshare' | 'none'
export type WebFontsProviders = 'google' | 'bunny' | 'fontshare' | 'none' | Provider

export interface WebFontMeta {
name: string
Expand All @@ -11,6 +11,10 @@ export interface WebFontMeta {
provider?: WebFontsProviders
}

export interface ResolvedWebFontMeta extends Omit<WebFontMeta, 'provider'> {
provider: Provider
}

export interface WebFontsOptions {
/**
* Provider service of the web fonts
Expand Down Expand Up @@ -55,5 +59,5 @@ export interface Provider {
name: WebFontsProviders
getPreflight?(fonts: WebFontMeta[]): string
getImportUrl?(fonts: WebFontMeta[]): string | undefined
getFontName(font: WebFontMeta): string
getFontName?(font: WebFontMeta): string
}

0 comments on commit ca4f668

Please sign in to comment.