1- import { Options } from './options'
2- import { getBlobFromURL } from './getBlobFromURL'
3- import { getMimeType , isDataUrl , makeDataUrl , resolveUrl } from './util'
1+ import { Options } from './types'
2+ import { resolveUrl } from './util'
3+ import { getMimeType } from './mimes'
4+ import { isDataUrl , makeDataUrl , resourceToDataURL } from './dataurl'
45
56const URL_REGEX = / u r l \( ( [ ' " ] ? ) ( [ ^ ' " ] + ?) \1\) / g
67const URL_WITH_FORMAT_REGEX = / u r l \( [ ^ ) ] + \) \s * f o r m a t \( ( [ " ' ] ? ) ( [ ^ " ' ] + ) \1\) / g
78const FONT_SRC_REGEX = / s r c : \s * (?: u r l \( [ ^ ) ] + \) \s * f o r m a t \( [ ^ ) ] + \) [ , ; ] \s * ) + / g
89
9- export function toRegex ( url : string ) : RegExp {
10+ function toRegex ( url : string ) : RegExp {
1011 // eslint-disable-next-line no-useless-escape
1112 const escaped = url . replace ( / ( [ . * + ? ^ $ { } ( ) | \[ \] \/ \\ ] ) / g, '\\$1' )
1213 return new RegExp ( `(url\\(['"]?)(${ escaped } )(['"]?\\))` , 'g' )
1314}
1415
1516export function parseURLs ( cssText : string ) : string [ ] {
16- const result : string [ ] = [ ]
17+ const urls : string [ ] = [ ]
1718
1819 cssText . replace ( URL_REGEX , ( raw , quotation , url ) => {
19- result . push ( url )
20+ urls . push ( url )
2021 return raw
2122 } )
2223
23- return result . filter ( ( url ) => ! isDataUrl ( url ) )
24+ return urls . filter ( ( url ) => ! isDataUrl ( url ) )
2425}
2526
26- export function embed (
27+ export async function embed (
2728 cssText : string ,
2829 resourceURL : string ,
2930 baseURL : string | null ,
3031 options : Options ,
31- get ?: ( url : string ) => Promise < string > ,
32+ getContentFromUrl ?: ( url : string ) => Promise < string > ,
3233) : Promise < string > {
33- const resolvedURL = baseURL ? resolveUrl ( resourceURL , baseURL ) : resourceURL
34-
35- return Promise . resolve ( resolvedURL )
36- . then < string | { blob : string ; contentType : string } > ( ( url ) =>
37- get ? get ( url ) : getBlobFromURL ( url , options ) ,
38- )
39- . then ( ( data ) => {
40- if ( typeof data === 'string' ) {
41- return makeDataUrl ( data , getMimeType ( resourceURL ) )
42- }
43-
44- return makeDataUrl (
45- data . blob ,
46- getMimeType ( resourceURL ) || data . contentType ,
47- )
48- } )
49- . then ( ( dataURL ) => cssText . replace ( toRegex ( resourceURL ) , `$1${ dataURL } $3` ) )
50- . then (
51- ( content ) => content ,
52- ( ) => resolvedURL ,
53- )
34+ try {
35+ const resolvedURL = baseURL ? resolveUrl ( resourceURL , baseURL ) : resourceURL
36+ const contentType = getMimeType ( resourceURL )
37+ let dataURL : string
38+ if ( getContentFromUrl ) {
39+ const content = await getContentFromUrl ( resolvedURL )
40+ dataURL = makeDataUrl ( content , contentType )
41+ } else {
42+ dataURL = await resourceToDataURL ( resolvedURL , contentType , options )
43+ }
44+ return cssText . replace ( toRegex ( resourceURL ) , `$1${ dataURL } $3` )
45+ } catch ( error ) {
46+ // pass
47+ }
48+ return cssText
5449}
5550
5651function filterPreferredFontFormat (
@@ -63,7 +58,6 @@ function filterPreferredFontFormat(
6358 // eslint-disable-next-line no-constant-condition
6459 while ( true ) {
6560 const [ src , , format ] = URL_WITH_FORMAT_REGEX . exec ( match ) || [ ]
66-
6761 if ( ! format ) {
6862 return ''
6963 }
@@ -92,7 +86,6 @@ export async function embedResources(
9286 const urls = parseURLs ( filteredCSSText )
9387 return urls . reduce (
9488 ( deferred , url ) =>
95- // eslint-disable-next-line promise/no-nesting
9689 deferred . then ( ( css ) => embed ( css , url , baseUrl , options ) ) ,
9790 Promise . resolve ( filteredCSSText ) ,
9891 )
0 commit comments