Files
wxt/src/core/utils/entrypoints.ts
T

82 lines
2.2 KiB
TypeScript

import {
Entrypoint,
PerBrowserOption,
ResolvedPerBrowserOptions,
TargetBrowser,
} from '~/types';
import path, { relative, resolve } from 'node:path';
import { normalizePath } from './paths';
export function getEntrypointName(
entrypointsDir: string,
inputPath: string,
// type: Entrypoint['type'],
): string {
const relativePath = path.relative(entrypointsDir, inputPath);
// Grab the string up to the first . or / or \\
const name = relativePath.split(/[\.\/\\]/, 2)[0];
return name;
}
export function getEntrypointOutputFile(
entrypoint: Entrypoint,
ext: string,
): string {
return resolve(entrypoint.outputDir, `${entrypoint.name}${ext}`);
}
/**
* Return's the entrypoint's output path relative to the output directory. Used for paths in the
* manifest and rollup's bundle.
*/
export function getEntrypointBundlePath(
entrypoint: Entrypoint,
outDir: string,
ext: string,
): string {
return normalizePath(
relative(outDir, getEntrypointOutputFile(entrypoint, ext)),
);
}
/**
* Given an entrypoint option, resolve it's value based on a target browser.
*/
export function resolvePerBrowserOption<T>(
option: PerBrowserOption<T>,
browser: TargetBrowser,
): T {
if (typeof option === 'object' && !Array.isArray(option))
return (option as any)[browser];
return option;
}
/**
* Given an entrypoint option, resolve it's value based on a target browser.
*
* defaultIcon is special, it's the only key that's a record, which can confuse this function. So
* it's been manually excluded from resolution.
*/
export function resolvePerBrowserOptions<
T extends Record<string, any>,
TKeys extends keyof T,
>(options: T, browser: TargetBrowser): ResolvedPerBrowserOptions<T, TKeys> {
// @ts-expect-error: Object.entries is untyped.
return Object.fromEntries(
Object.entries(options).map(([key, value]) => [
key,
key === 'defaultIcon' ? value : resolvePerBrowserOption(value, browser),
]),
);
}
/**
* Returns true when the entrypoint is an HTML entrypoint.
*
* Naively just checking the file extension of the input path.
*/
export function isHtmlEntrypoint(entrypoint: Entrypoint): boolean {
return entrypoint.inputPath.endsWith('.html');
}