UNPKG

@wordpress/editor

Version:
8 lines (7 loc) 3.76 kB
{ "version": 3, "sources": ["../../../src/components/post-publish-panel/media-util.js"], "sourcesContent": ["/**\n * External dependencies\n */\nimport { v4 as uuid } from 'uuid';\n\n/**\n * WordPress dependencies\n */\nimport { getFilename } from '@wordpress/url';\n\n/**\n * Generate a list of unique basenames given a list of URLs.\n *\n * We want all basenames to be unique, since sometimes the extension\n * doesn't reflect the mime type, and may end up getting changed by\n * the server, on upload.\n *\n * @param {string[]} urls The list of URLs\n * @return {Record< string, string >} A URL => basename record.\n */\nexport function generateUniqueBasenames( urls ) {\n\tconst basenames = new Set();\n\n\treturn Object.fromEntries(\n\t\turls.map( ( url ) => {\n\t\t\t// We prefer to match the remote filename, if possible.\n\t\t\tconst filename = getFilename( url );\n\t\t\tlet basename = '';\n\n\t\t\tif ( filename ) {\n\t\t\t\tconst parts = filename.split( '.' );\n\t\t\t\tif ( parts.length > 1 ) {\n\t\t\t\t\t// Assume the last part is the extension.\n\t\t\t\t\tparts.pop();\n\t\t\t\t}\n\t\t\t\tbasename = parts.join( '.' );\n\t\t\t}\n\n\t\t\tif ( ! basename ) {\n\t\t\t\t// It looks like we don't have a basename, so let's use a UUID.\n\t\t\t\tbasename = uuid();\n\t\t\t}\n\n\t\t\tif ( basenames.has( basename ) ) {\n\t\t\t\t// Append a UUID to deduplicate the basename.\n\t\t\t\t// The server will try to deduplicate on its own if we don't do this,\n\t\t\t\t// but it may run into a race condition\n\t\t\t\t// (see https://github.com/WordPress/gutenberg/issues/64899).\n\t\t\t\t// Deduplicating the filenames before uploading is safer.\n\t\t\t\tbasename = `${ basename }-${ uuid() }`;\n\t\t\t}\n\n\t\t\tbasenames.add( basename );\n\n\t\t\treturn [ url, basename ];\n\t\t} )\n\t);\n}\n\n/**\n * Fetch a list of URLs, turning those into promises for files with\n * unique filenames.\n *\n * @param {string[]} urls The list of URLs\n * @return {Record< string, Promise< File > >} A URL => File promise record.\n */\nexport function fetchMedia( urls ) {\n\treturn Object.fromEntries(\n\t\tObject.entries( generateUniqueBasenames( urls ) ).map(\n\t\t\t( [ url, basename ] ) => {\n\t\t\t\tconst filePromise = window\n\t\t\t\t\t.fetch( url.includes( '?' ) ? url : url + '?' )\n\t\t\t\t\t.then( ( response ) => response.blob() )\n\t\t\t\t\t.then( ( blob ) => {\n\t\t\t\t\t\t// The server will reject the upload if it doesn't have an extension,\n\t\t\t\t\t\t// even though it'll rewrite the file name to match the mime type.\n\t\t\t\t\t\t// Here we provide it with a safe extension to get it past that check.\n\t\t\t\t\t\treturn new File( [ blob ], `${ basename }.png`, {\n\t\t\t\t\t\t\ttype: blob.type,\n\t\t\t\t\t\t} );\n\t\t\t\t\t} );\n\n\t\t\t\treturn [ url, filePromise ];\n\t\t\t}\n\t\t)\n\t);\n}\n"], "mappings": ";AAGA,SAAS,MAAM,YAAY;AAK3B,SAAS,mBAAmB;AAYrB,SAAS,wBAAyB,MAAO;AAC/C,QAAM,YAAY,oBAAI,IAAI;AAE1B,SAAO,OAAO;AAAA,IACb,KAAK,IAAK,CAAE,QAAS;AAEpB,YAAM,WAAW,YAAa,GAAI;AAClC,UAAI,WAAW;AAEf,UAAK,UAAW;AACf,cAAM,QAAQ,SAAS,MAAO,GAAI;AAClC,YAAK,MAAM,SAAS,GAAI;AAEvB,gBAAM,IAAI;AAAA,QACX;AACA,mBAAW,MAAM,KAAM,GAAI;AAAA,MAC5B;AAEA,UAAK,CAAE,UAAW;AAEjB,mBAAW,KAAK;AAAA,MACjB;AAEA,UAAK,UAAU,IAAK,QAAS,GAAI;AAMhC,mBAAW,GAAI,QAAS,IAAK,KAAK,CAAE;AAAA,MACrC;AAEA,gBAAU,IAAK,QAAS;AAExB,aAAO,CAAE,KAAK,QAAS;AAAA,IACxB,CAAE;AAAA,EACH;AACD;AASO,SAAS,WAAY,MAAO;AAClC,SAAO,OAAO;AAAA,IACb,OAAO,QAAS,wBAAyB,IAAK,CAAE,EAAE;AAAA,MACjD,CAAE,CAAE,KAAK,QAAS,MAAO;AACxB,cAAM,cAAc,OAClB,MAAO,IAAI,SAAU,GAAI,IAAI,MAAM,MAAM,GAAI,EAC7C,KAAM,CAAE,aAAc,SAAS,KAAK,CAAE,EACtC,KAAM,CAAE,SAAU;AAIlB,iBAAO,IAAI,KAAM,CAAE,IAAK,GAAG,GAAI,QAAS,QAAQ;AAAA,YAC/C,MAAM,KAAK;AAAA,UACZ,CAAE;AAAA,QACH,CAAE;AAEH,eAAO,CAAE,KAAK,WAAY;AAAA,MAC3B;AAAA,IACD;AAAA,EACD;AACD;", "names": [] }