{
  "version": 3,
  "sources": ["../../../src/font-library/utils/index.ts"],
  "sourcesContent": ["/**\n * WordPress dependencies\n */\nimport { privateApis as componentsPrivateApis } from '@wordpress/components';\nimport type { FontFamily, FontFace } from '@wordpress/core-data';\nimport type { DataRegistry } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport { FONT_WEIGHTS, FONT_STYLES } from './constants';\nimport { fetchInstallFontFace } from '../api';\nimport { formatFontFaceName } from './preview-styles';\nimport type { FontFamilyToUpload, FontUploadResult } from '../types';\nimport { unlock } from '../../lock-unlock';\n\n/**\n * Browser dependencies\n */\nconst { File } = window;\nconst { kebabCase } = unlock( componentsPrivateApis );\n\nexport function setUIValuesNeeded(\n\tfont: FontFamily,\n\textraValues: Partial< FontFamily > = {}\n): FontFamily {\n\tif ( ! font.name && ( font.fontFamily || font.slug ) ) {\n\t\tfont.name = font.fontFamily || font.slug;\n\t}\n\treturn {\n\t\t...font,\n\t\t...extraValues,\n\t};\n}\n\nexport function isUrlEncoded( url: string ): boolean {\n\tif ( typeof url !== 'string' ) {\n\t\treturn false;\n\t}\n\treturn url !== decodeURIComponent( url );\n}\n\nexport function getFontFaceVariantName( face: FontFace ): string {\n\tconst weightName = FONT_WEIGHTS[ face.fontWeight ?? '' ] || face.fontWeight;\n\tconst styleName =\n\t\tface.fontStyle === 'normal'\n\t\t\t? ''\n\t\t\t: FONT_STYLES[ face.fontStyle ?? '' ] || face.fontStyle;\n\treturn `${ weightName } ${ styleName }`;\n}\n\nexport function mergeFontFaces(\n\texisting: FontFace[] = [],\n\tincoming: FontFace[] = []\n): FontFace[] {\n\tconst map = new Map();\n\tfor ( const face of existing ) {\n\t\tmap.set( `${ face.fontWeight }${ face.fontStyle }`, face );\n\t}\n\tfor ( const face of incoming ) {\n\t\t// This will overwrite if the src already exists, keeping it unique.\n\t\tmap.set( `${ face.fontWeight }${ face.fontStyle }`, face );\n\t}\n\treturn Array.from( map.values() );\n}\n\nexport function mergeFontFamilies(\n\texisting: FontFamily[] = [],\n\tincoming: FontFamily[] = []\n): FontFamily[] {\n\tconst map = new Map();\n\t// Add the existing array to the map.\n\tfor ( const font of existing ) {\n\t\tmap.set( font.slug, { ...font } );\n\t}\n\t// Add the incoming array to the map, overwriting existing values excepting fontFace that need to be merged.\n\tfor ( const font of incoming ) {\n\t\tif ( map.has( font.slug ) ) {\n\t\t\tconst { fontFace: incomingFontFaces, ...restIncoming } = font;\n\t\t\tconst existingFont = map.get( font.slug );\n\t\t\t// Merge the fontFaces existing with the incoming fontFaces.\n\t\t\tconst mergedFontFaces = mergeFontFaces(\n\t\t\t\texistingFont.fontFace,\n\t\t\t\tincomingFontFaces\n\t\t\t);\n\t\t\t// Except for the fontFace key all the other keys are overwritten with the incoming values.\n\t\t\tmap.set( font.slug, {\n\t\t\t\t...restIncoming,\n\t\t\t\tfontFace: mergedFontFaces,\n\t\t\t} );\n\t\t} else {\n\t\t\tmap.set( font.slug, { ...font } );\n\t\t}\n\t}\n\treturn Array.from( map.values() );\n}\n\n/*\n * Loads the font face from a URL and adds it to the browser.\n * It also adds it to the iframe document.\n */\nexport async function loadFontFaceInBrowser(\n\tfontFace: FontFace,\n\tsource: string | File,\n\taddTo: 'all' | 'document' | 'iframe' = 'all'\n): Promise< void > {\n\tlet dataSource;\n\n\tif ( typeof source === 'string' ) {\n\t\tdataSource = `url(${ source })`;\n\t} else if ( source instanceof File ) {\n\t\tdataSource = await source.arrayBuffer();\n\t} else {\n\t\treturn;\n\t}\n\n\tconst newFont = new window.FontFace(\n\t\tformatFontFaceName( fontFace.fontFamily ),\n\t\tdataSource,\n\t\t{\n\t\t\tstyle: fontFace.fontStyle,\n\t\t\tweight: String( fontFace.fontWeight ),\n\t\t}\n\t);\n\n\tconst loadedFace = await newFont.load();\n\n\tif ( addTo === 'document' || addTo === 'all' ) {\n\t\tdocument.fonts.add( loadedFace );\n\t}\n\n\tif ( addTo === 'iframe' || addTo === 'all' ) {\n\t\tconst iframe = document.querySelector(\n\t\t\t'iframe[name=\"editor-canvas\"]'\n\t\t) as HTMLIFrameElement;\n\t\tif ( iframe?.contentDocument ) {\n\t\t\tiframe.contentDocument.fonts.add( loadedFace );\n\t\t}\n\t}\n}\n\n/*\n * Unloads the font face and remove it from the browser.\n * It also removes it from the iframe document.\n *\n * Note that Font faces that were added to the set using the CSS @font-face rule\n * remain connected to the corresponding CSS, and cannot be deleted.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/delete.\n */\nexport function unloadFontFaceInBrowser(\n\tfontFace: FontFace,\n\tremoveFrom: 'all' | 'document' | 'iframe' = 'all'\n): void {\n\tconst unloadFontFace = ( fonts: FontFaceSet ) => {\n\t\tfonts.forEach( ( f ) => {\n\t\t\tif (\n\t\t\t\tf.family === formatFontFaceName( fontFace?.fontFamily ) &&\n\t\t\t\tf.weight === fontFace?.fontWeight &&\n\t\t\t\tf.style === fontFace?.fontStyle\n\t\t\t) {\n\t\t\t\tfonts.delete( f );\n\t\t\t}\n\t\t} );\n\t};\n\n\tif ( removeFrom === 'document' || removeFrom === 'all' ) {\n\t\tunloadFontFace( document.fonts );\n\t}\n\n\tif ( removeFrom === 'iframe' || removeFrom === 'all' ) {\n\t\tconst iframe = document.querySelector(\n\t\t\t'iframe[name=\"editor-canvas\"]'\n\t\t) as HTMLIFrameElement;\n\t\tif ( iframe?.contentDocument ) {\n\t\t\tunloadFontFace( iframe.contentDocument.fonts );\n\t\t}\n\t}\n}\n\n/**\n * Retrieves the display source from a font face src.\n *\n * @param {string|string[]} input - The font face src.\n * @return {string|undefined} The display source or undefined if the input is invalid.\n */\nexport function getDisplaySrcFromFontFace(\n\tinput: string | string[]\n): string | undefined {\n\tif ( ! input ) {\n\t\treturn;\n\t}\n\n\tlet src;\n\tif ( Array.isArray( input ) ) {\n\t\tsrc = input[ 0 ];\n\t} else {\n\t\tsrc = input;\n\t}\n\t// It's expected theme fonts will already be loaded in the browser.\n\tif ( src.startsWith( 'file:.' ) ) {\n\t\treturn;\n\t}\n\tif ( ! isUrlEncoded( src ) ) {\n\t\tsrc = encodeURI( src );\n\t}\n\treturn src;\n}\n\nexport function makeFontFamilyFormData( fontFamily: FontFamily ): FormData {\n\tconst formData = new FormData();\n\n\tconst { fontFace, category, ...familyWithValidParameters } = fontFamily;\n\tconst fontFamilySettings = {\n\t\t...familyWithValidParameters,\n\t\tslug: kebabCase( fontFamily.slug ),\n\t};\n\n\tformData.append(\n\t\t'font_family_settings',\n\t\tJSON.stringify( fontFamilySettings )\n\t);\n\treturn formData;\n}\n\nexport function makeFontFacesFormData( font: FontFamilyToUpload ): FormData[] {\n\tconst fontFacesFormData = ( font?.fontFace ?? [] ).map(\n\t\t( item, faceIndex ) => {\n\t\t\tconst face = { ...item };\n\t\t\tconst formData = new FormData();\n\t\t\tif ( face.file ) {\n\t\t\t\t// Normalize to an array, since face.file may be a single file or an array of files.\n\t\t\t\tconst files = Array.isArray( face.file )\n\t\t\t\t\t? face.file\n\t\t\t\t\t: [ face.file ];\n\t\t\t\tconst src: string[] = [];\n\n\t\t\t\tfiles.forEach( ( file, key ) => {\n\t\t\t\t\t// Slugified file name because the it might contain spaces or characters treated differently on the server.\n\t\t\t\t\tconst fileId = `file-${ faceIndex }-${ key }`;\n\t\t\t\t\t// Add the files to the formData\n\t\t\t\t\tformData.append( fileId, file, file.name );\n\t\t\t\t\tsrc.push( fileId );\n\t\t\t\t} );\n\n\t\t\t\tface.src = src.length === 1 ? src[ 0 ] : src;\n\t\t\t\tdelete face.file;\n\n\t\t\t\tformData.append( 'font_face_settings', JSON.stringify( face ) );\n\t\t\t} else {\n\t\t\t\tformData.append( 'font_face_settings', JSON.stringify( face ) );\n\t\t\t}\n\t\t\treturn formData;\n\t\t}\n\t);\n\n\treturn fontFacesFormData;\n}\n\nexport async function batchInstallFontFaces(\n\tfontFamilyId: string,\n\tfontFacesData: FormData[],\n\tregistry: DataRegistry\n): Promise< FontUploadResult > {\n\tconst responses: {\n\t\tstatus: 'fulfilled' | 'rejected';\n\t\tvalue?: FontFace;\n\t\treason?: Error;\n\t}[] = [];\n\n\t/*\n\t * Uses the same response format as Promise.allSettled, but executes requests in sequence to work\n\t * around a race condition that can cause an error when the fonts directory doesn't exist yet.\n\t */\n\tfor ( const faceData of fontFacesData ) {\n\t\ttry {\n\t\t\tconst response = await fetchInstallFontFace(\n\t\t\t\tfontFamilyId,\n\t\t\t\tfaceData,\n\t\t\t\tregistry\n\t\t\t);\n\t\t\tresponses.push( { status: 'fulfilled', value: response } );\n\t\t} catch ( error ) {\n\t\t\tresponses.push( { status: 'rejected', reason: error as Error } );\n\t\t}\n\t}\n\n\tconst results: {\n\t\tsuccesses: FontFace[];\n\t\terrors: Array< {\n\t\t\tdata: FormData;\n\t\t\tmessage: string;\n\t\t} >;\n\t} = {\n\t\terrors: [],\n\t\tsuccesses: [],\n\t};\n\n\tresponses.forEach( ( result, index ) => {\n\t\tif ( result.status === 'fulfilled' && result.value ) {\n\t\t\tconst response = result.value;\n\t\t\tresults.successes.push( response );\n\t\t} else if ( result.reason ) {\n\t\t\t// Handle network errors or other fetch-related errors\n\t\t\tresults.errors.push( {\n\t\t\t\tdata: fontFacesData[ index ],\n\t\t\t\tmessage: result.reason.message,\n\t\t\t} );\n\t\t}\n\t} );\n\n\treturn results;\n}\n\n/*\n * Downloads a font face asset from a URL to the client and returns a File object.\n */\nexport async function downloadFontFaceAssets(\n\tsrc: string | string[]\n): Promise< File | File[] > {\n\t// Normalize to an array, since `src` could be a string or array.\n\tsrc = Array.isArray( src ) ? src : [ src ];\n\n\tconst files = await Promise.all(\n\t\tsrc.map( async ( url ) => {\n\t\t\treturn fetch( new Request( url ) )\n\t\t\t\t.then( ( response ) => {\n\t\t\t\t\tif ( ! response.ok ) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`Error downloading font face asset from ${ url }. Server responded with status: ${ response.status }`\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\treturn response.blob();\n\t\t\t\t} )\n\t\t\t\t.then( ( blob ) => {\n\t\t\t\t\tconst filename = url.split( '/' ).pop() as string;\n\t\t\t\t\tconst file = new File( [ blob ], filename, {\n\t\t\t\t\t\ttype: blob.type,\n\t\t\t\t\t} );\n\t\t\t\t\treturn file;\n\t\t\t\t} );\n\t\t} )\n\t);\n\n\t// If we only have one file return it (not the array).  Otherwise return all of them in the array.\n\treturn files.length === 1 ? files[ 0 ] : files;\n}\n\n/*\n * Determine if a given Font Face is present in a given collection.\n * We determine that a font face has been installed by comparing the fontWeight and fontStyle\n *\n * @param {Object} fontFace The Font Face to seek\n * @param {Array} collection The Collection to seek in\n * @returns True if the font face is found in the collection.  Otherwise False.\n */\nexport function checkFontFaceInstalled(\n\tfontFace: FontFace,\n\tcollection: FontFace[]\n): boolean {\n\treturn (\n\t\t-1 !==\n\t\tcollection.findIndex( ( collectionFontFace ) => {\n\t\t\treturn (\n\t\t\t\tcollectionFontFace.fontWeight === fontFace.fontWeight &&\n\t\t\t\tcollectionFontFace.fontStyle === fontFace.fontStyle\n\t\t\t);\n\t\t} )\n\t);\n}\n"],
  "mappings": "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",
  "names": ["componentsPrivateApis"]
}
