Path: blob/main/extensions/copilot/src/util/vs/base/common/mime.ts
13405 views
//!!! DO NOT modify, this file was COPIED from 'microsoft/vscode'12/*---------------------------------------------------------------------------------------------3* Copyright (c) Microsoft Corporation. All rights reserved.4* Licensed under the MIT License. See License.txt in the project root for license information.5*--------------------------------------------------------------------------------------------*/67import { extname } from './path';89export const Mimes = Object.freeze({10text: 'text/plain',11binary: 'application/octet-stream',12unknown: 'application/unknown',13markdown: 'text/markdown',14latex: 'text/latex',15uriList: 'text/uri-list',16html: 'text/html',17});1819interface MapExtToMediaMimes {20[index: string]: string | string[];21}2223const mapExtToTextMimes: Record<string, string> = {24'.css': 'text/css',25'.csv': 'text/csv',26'.htm': 'text/html',27'.html': 'text/html',28'.ics': 'text/calendar',29'.js': 'text/javascript',30'.mjs': 'text/javascript',31'.txt': 'text/plain',32'.xml': 'text/xml'33};3435// Known media mimes that we can handle36const mapExtToMediaMimes: MapExtToMediaMimes = {37'.aac': 'audio/x-aac',38'.avi': 'video/x-msvideo',39'.bmp': 'image/bmp',40'.flv': 'video/x-flv',41'.gif': 'image/gif',42'.ico': 'image/x-icon',43'.jpe': ['image/jpg', 'image/jpeg'],44'.jpeg': ['image/jpg', 'image/jpeg'],45'.jpg': ['image/jpg', 'image/jpeg'],46'.m1v': 'video/mpeg',47'.m2a': 'audio/mpeg',48'.m2v': 'video/mpeg',49'.m3a': 'audio/mpeg',50'.mid': 'audio/midi',51'.midi': 'audio/midi',52'.mk3d': 'video/x-matroska',53'.mks': 'video/x-matroska',54'.mkv': 'video/x-matroska',55'.mov': 'video/quicktime',56'.movie': 'video/x-sgi-movie',57'.mp2': 'audio/mpeg',58'.mp2a': 'audio/mpeg',59'.mp3': 'audio/mpeg',60'.mp4': 'video/mp4',61'.mp4a': 'audio/mp4',62'.mp4v': 'video/mp4',63'.mpe': 'video/mpeg',64'.mpeg': 'video/mpeg',65'.mpg': 'video/mpeg',66'.mpg4': 'video/mp4',67'.mpga': 'audio/mpeg',68'.oga': 'audio/ogg',69'.ogg': 'audio/ogg',70'.opus': 'audio/opus',71'.ogv': 'video/ogg',72'.png': 'image/png',73'.psd': 'image/vnd.adobe.photoshop',74'.qt': 'video/quicktime',75'.spx': 'audio/ogg',76'.svg': 'image/svg+xml',77'.tga': 'image/x-tga',78'.tif': 'image/tiff',79'.tiff': 'image/tiff',80'.wav': 'audio/x-wav',81'.webm': 'video/webm',82'.webp': 'image/webp',83'.wma': 'audio/x-ms-wma',84'.wmv': 'video/x-ms-wmv',85'.woff': 'application/font-woff',86};8788export function getMediaOrTextMime(path: string): string | undefined {89const ext = extname(path);90const textMime = mapExtToTextMimes[ext.toLowerCase()];91if (textMime !== undefined) {92return textMime;93} else {94return getMediaMime(path);95}96}9798export function getMediaMime(path: string): string | undefined {99const ext = extname(path);100const mimeType = mapExtToMediaMimes[ext.toLowerCase()];101return Array.isArray(mimeType) ? mimeType[0] : mimeType;102}103104export function getExtensionForMimeType(mimeType: string): string | undefined {105for (const extension in mapExtToMediaMimes) {106const value = mapExtToMediaMimes[extension];107if (Array.isArray(value) ? value.includes(mimeType) : value === mimeType) {108return extension;109}110}111112return undefined;113}114115const _simplePattern = /^(.+)\/(.+?)(;.+)?$/;116117export function normalizeMimeType(mimeType: string): string;118export function normalizeMimeType(mimeType: string, strict: true): string | undefined;119export function normalizeMimeType(mimeType: string, strict?: true): string | undefined {120121const match = _simplePattern.exec(mimeType);122if (!match) {123return strict124? undefined125: mimeType;126}127// https://datatracker.ietf.org/doc/html/rfc2045#section-5.1128// media and subtype must ALWAYS be lowercase, parameter not129return `${match[1].toLowerCase()}/${match[2].toLowerCase()}${match[3] ?? ''}`;130}131132/**133* Whether the provided mime type is a text stream like `stdout`, `stderr`.134*/135export function isTextStreamMime(mimeType: string) {136return ['application/vnd.code.notebook.stdout', 'application/vnd.code.notebook.stderr'].includes(mimeType);137}138139140