Skip to content

Commit

Permalink
fix: mime missing extensions (#8568)
Browse files Browse the repository at this point in the history
  • Loading branch information
sapphi-red committed Jun 13, 2022
1 parent 2dfc015 commit acf3024
Show file tree
Hide file tree
Showing 6 changed files with 34 additions and 5 deletions.
5 changes: 4 additions & 1 deletion packages/vite/src/node/constants.ts
Expand Up @@ -62,7 +62,10 @@ export const CLIENT_DIR = path.dirname(CLIENT_ENTRY)

// ** READ THIS ** before editing `KNOWN_ASSET_TYPES`.
// If you add an asset to `KNOWN_ASSET_TYPES`, make sure to also add it
// to the TypeScript declaration file `packages/vite/client.d.ts`.
// to the TypeScript declaration file `packages/vite/client.d.ts` and
// add a mime type to the `registerCustomMime` in
// `packages/vite/src/node/plugin/assets.ts` if mime type cannot be
// looked up by mrmime.
export const KNOWN_ASSET_TYPES = [
// images
'png',
Expand Down
20 changes: 16 additions & 4 deletions packages/vite/src/node/plugins/asset.ts
Expand Up @@ -23,6 +23,18 @@ const assetHashToFilenameMap = new WeakMap<
// save hashes of the files that has been emitted in build watch
const emittedHashMap = new WeakMap<ResolvedConfig, Set<string>>()

// add own dictionary entry by directly assigning mrmime
export function registerCustomMime(): void {
// https://github.com/lukeed/mrmime/issues/3
mrmime.mimes['ico'] = 'image/x-icon'
// https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Containers#flac
mrmime.mimes['flac'] = 'audio/flac'
// mrmime and mime-db is not released yet: https://github.com/jshttp/mime-db/commit/c9242a9b7d4bb25d7a0c9244adec74aeef08d8a1
mrmime.mimes['aac'] = 'audio/aac'
// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
mrmime.mimes['eot'] = 'application/vnd.ms-fontobject'
}

/**
* Also supports loading plain strings with import text from './foo.txt?raw'
*/
Expand All @@ -31,9 +43,8 @@ export function assetPlugin(config: ResolvedConfig): Plugin {
assetHashToFilenameMap.set(config, new Map())
const relativeBase = isRelativeBase(config.base)

// add own dictionary entry by directly assigning mrmine
// https://github.com/lukeed/mrmime/issues/3
mrmime.mimes['ico'] = 'image/x-icon'
registerCustomMime()

return {
name: 'vite:asset',

Expand Down Expand Up @@ -338,8 +349,9 @@ async function fileToBuiltUrl(
(!file.endsWith('.svg') &&
content.length < Number(config.build.assetsInlineLimit))
) {
const mimeType = mrmime.lookup(file) ?? 'application/octet-stream'
// base64 inlined as a string
url = `data:${mrmime.lookup(file)};base64,${content.toString('base64')}`
url = `data:${mimeType};base64,${content.toString('base64')}`
} else {
// emit as asset
// rollup supports `import.meta.ROLLUP_FILE_URL_*`, but it generates code
Expand Down
6 changes: 6 additions & 0 deletions playground/assets/__tests__/assets.spec.ts
Expand Up @@ -218,6 +218,12 @@ describe('svg fragments', () => {
})
})

test('Unknown extension assets import', async () => {
expect(await page.textContent('.unknown-ext')).toMatch(
isBuild ? 'data:application/octet-stream;' : '/nested/foo.unknown'
)
})

test('?raw import', async () => {
expect(await page.textContent('.raw')).toMatch('SVG')
})
Expand Down
6 changes: 6 additions & 0 deletions playground/assets/index.html
Expand Up @@ -166,6 +166,9 @@ <h2>SVG Fragments via JS Import</h2>
<img class="svg-frag-import" alt="" />
</div>

<h2>Unknown extension assets import</h2>
<code class="unknown-ext"></code>

<h2>?raw import</h2>
<code class="raw"></code>

Expand Down Expand Up @@ -318,6 +321,9 @@ <h3>style in svg</h3>
text('.svg-frag-import-path', svgFrag)
document.querySelector('.svg-frag-import').src = svgFrag + '#icon-heart-view'

import unknownExtUrl from './nested/foo.unknown'
text('.unknown-ext', unknownExtUrl)

import rawSvg from './nested/fragment.svg?raw'
text('.raw', rawSvg)

Expand Down
1 change: 1 addition & 0 deletions playground/assets/nested/foo.unknown
@@ -0,0 +1 @@
custom file
1 change: 1 addition & 0 deletions playground/assets/vite.config.js
Expand Up @@ -11,6 +11,7 @@ module.exports = {
'@': path.resolve(__dirname, 'nested')
}
},
assetsInclude: ['**/*.unknown'],
build: {
outDir: 'dist/foo',
assetsInlineLimit: 8192, // 8kb
Expand Down

0 comments on commit acf3024

Please sign in to comment.