export enum MediaType {
JavaScript,
Jsx,
Mjs,
Cjs,
TypeScript,
Mts,
Cts,
Dts,
Dmts,
Dcts,
Tsx,
Json,
Wasm,
TsBuildInfo,
SourceMap,
Unknown,
}
const split_path = (path: string) => path.match(/^((?:.*\/)?([^\/]*?))(?:\.([^\.\/]*)$|$)/)?.slice(1);
function map_typescript_like(
path: string,
base_type: MediaType,
definition_type: MediaType,
): MediaType {
const match = split_path(path);
if (!match) return base_type;
const [file_stem, file_name, file_ext] = match;
if (
file_stem.endsWith(".d")
|| (file_ext === ("ts")
&& file_stem.includes(".d."))
)
{
return definition_type;
}
return base_type;
}
export function as_ts_extension(type: MediaType): string {
return ({
[MediaType.JavaScript]: ".js",
[MediaType.Jsx]: ".jsx",
[MediaType.Mjs]: ".mjs",
[MediaType.Cjs]: ".cjs",
[MediaType.TypeScript]: ".ts",
[MediaType.Mts]: ".mts",
[MediaType.Cts]: ".cts",
[MediaType.Dts]: ".d.ts",
[MediaType.Dmts]: ".d.mts",
[MediaType.Dcts]: ".d.cts",
[MediaType.Tsx]: ".tsx",
[MediaType.Json]: ".json",
[MediaType.Wasm]: ".js",
[MediaType.TsBuildInfo]: ".tsbuildinfo",
[MediaType.SourceMap]: ".js",
[MediaType.Unknown]: ".js",
})[type];
}
export function as_content_type(type: MediaType): string | undefined {
return ({
[MediaType.JavaScript]: ("text/javascript"),
[MediaType.Jsx]: ("text/jsx"),
[MediaType.Mjs]: ("text/javascript"),
[MediaType.Cjs]: ("text/javascript"),
[MediaType.TypeScript]: ("text/typescript"),
[MediaType.Mts]: ("text/typescript"),
[MediaType.Cts]: ("text/typescript"),
[MediaType.Dts]: ("text/typescript"),
[MediaType.Dmts]: ("text/typescript"),
[MediaType.Dcts]: ("text/typescript"),
[MediaType.Tsx]: ("text/tsx"),
[MediaType.Json]: ("application/json"),
[MediaType.Wasm]: ("application/wasm"),
[MediaType.TsBuildInfo]: ("application/json"),
[MediaType.SourceMap]: ("application/json"),
[MediaType.Unknown]: undefined,
})[type];
}
export function is_declaration(type: MediaType): type is MediaType.Dts | MediaType.Dcts | MediaType.Dmts {
return type === MediaType.Dts || type === MediaType.Dmts || type === MediaType.Dcts;
}
export function from_response(response: Response) {
return from_url_and_content_type(new URL(response.url), response.headers.get("content-type"));
}
export function from_url_and_content_type(
url: URL,
maybe_content_type?: string,
): MediaType {