wxt
Version:
⚡ Next-gen Web Extension Framework
327 lines (326 loc) • 8.82 kB
JavaScript
import { resolve } from "path";
import { faker } from "@faker-js/faker";
import merge from "lodash.merge";
import { mock } from "vitest-mock-extended";
import { vi } from "vitest";
import { setWxtForTesting } from "../../../core/wxt.mjs";
faker.seed(import.meta.test.SEED);
function fakeObjectCreator(base) {
return (overrides) => merge(base(), overrides);
}
export function fakeFileName() {
return faker.string.alphanumeric() + "." + faker.string.alpha({ length: 3 });
}
export function fakeFile(root = process.cwd()) {
return resolve(root, fakeFileName());
}
export function fakeDir(root = process.cwd()) {
return resolve(root, faker.string.alphanumeric());
}
export const fakeEntrypoint = (options) => faker.helpers.arrayElement([
fakePopupEntrypoint,
fakeGenericEntrypoint,
fakeOptionsEntrypoint,
fakeBackgroundEntrypoint,
fakeContentScriptEntrypoint,
fakeUnlistedScriptEntrypoint
])(options);
export const fakeContentScriptEntrypoint = fakeObjectCreator(() => ({
type: "content-script",
inputPath: fakeFile("src"),
name: faker.string.alpha(),
options: {
matches: [],
matchAboutBlank: faker.datatype.boolean(),
matchOriginAsFallback: faker.helpers.arrayElement([
true,
false,
void 0
]),
runAt: faker.helpers.arrayElement([
"document_start",
"document_end",
"document_idle",
void 0
])
},
outputDir: fakeDir(".output"),
skipped: faker.datatype.boolean()
}));
export const fakeBackgroundEntrypoint = fakeObjectCreator(
() => ({
type: "background",
inputPath: "entrypoints/background.ts",
name: "background",
options: {
persistent: faker.datatype.boolean(),
type: faker.helpers.maybe(() => "module")
},
outputDir: fakeDir(".output"),
skipped: faker.datatype.boolean()
})
);
export const fakeUnlistedScriptEntrypoint = fakeObjectCreator(() => ({
type: "unlisted-script",
inputPath: fakeFile("src"),
name: faker.string.alpha(),
outputDir: fakeDir(".output"),
options: {},
skipped: faker.datatype.boolean()
}));
export const fakeOptionsEntrypoint = fakeObjectCreator(
() => ({
type: "options",
inputPath: "entrypoints/options.html",
name: "options",
outputDir: fakeDir(".output"),
options: {
browserStyle: faker.datatype.boolean(),
chromeStyle: faker.datatype.boolean(),
openInTab: faker.datatype.boolean()
},
skipped: faker.datatype.boolean()
})
);
export const fakePopupEntrypoint = fakeObjectCreator(() => ({
type: "popup",
inputPath: "entrypoints/popup.html",
name: "popup",
outputDir: fakeDir(".output"),
options: {
defaultTitle: faker.helpers.arrayElement([
faker.person.fullName(),
void 0
]),
defaultIcon: faker.helpers.arrayElement([
{
"16": "icon/16.png",
"24": "icon/24.png",
"64": "icon/64.png"
}
]),
mv2Key: faker.helpers.arrayElement([
"browser_action",
"page_action",
void 0
])
},
skipped: faker.datatype.boolean()
}));
export const fakeSidepanelEntrypoint = fakeObjectCreator(
() => ({
type: "sidepanel",
inputPath: "entrypoints/sidepanel.html",
name: "sidepanel",
outputDir: fakeDir(".output"),
options: {
defaultTitle: faker.helpers.arrayElement([
faker.person.fullName(),
void 0
]),
defaultIcon: faker.helpers.arrayElement([
{
"16": "icon/16.png",
"24": "icon/24.png",
"64": "icon/64.png"
}
]),
openAtInstall: faker.helpers.arrayElement([true, false, void 0])
},
skipped: faker.datatype.boolean()
})
);
export const fakeGenericEntrypoint = fakeObjectCreator(
() => ({
type: faker.helpers.arrayElement([
"sandbox",
"bookmarks",
"history",
"newtab",
"devtools",
"unlisted-page",
"unlisted-script"
]),
inputPath: fakeFile("src"),
name: faker.string.alpha(),
outputDir: fakeDir(".output"),
options: {},
skipped: faker.datatype.boolean()
})
);
export const fakeOutputChunk = fakeObjectCreator(() => ({
type: "chunk",
fileName: faker.string.alphanumeric(),
moduleIds: []
}));
export const fakeOutputAsset = fakeObjectCreator(() => ({
type: "asset",
fileName: fakeFileName()
}));
export function fakeOutputFile() {
return faker.helpers.arrayElement([fakeOutputAsset(), fakeOutputChunk()]);
}
export const fakeManifest = fakeObjectCreator(() => ({
manifest_version: faker.helpers.arrayElement([2, 3]),
name: faker.string.alphanumeric(),
version: `${faker.number.int()}.${faker.number.int()}.${faker.number.int()}`
}));
export const fakeUserManifest = fakeObjectCreator(() => ({
name: faker.string.alphanumeric(),
version: `${faker.number.int()}.${faker.number.int()}.${faker.number.int()}`
}));
export function fakeArray(createItem, count = 3) {
const array = [];
for (let i = 0; i < count; i++) {
array.push(createItem());
}
return array;
}
export const fakeResolvedConfig = fakeObjectCreator(() => {
const browser = faker.helpers.arrayElement(["chrome", "firefox"]);
const command = faker.helpers.arrayElement(["build", "serve"]);
const manifestVersion = faker.helpers.arrayElement([2, 3]);
const mode = faker.helpers.arrayElement(["development", "production"]);
return {
browser,
targetBrowsers: [],
command,
entrypointsDir: fakeDir(),
modulesDir: fakeDir(),
builtinModules: [],
userModules: [],
env: { browser, command, manifestVersion, mode },
fsCache: mock(),
imports: {
disabled: faker.datatype.boolean(),
eslintrc: {
enabled: faker.helpers.arrayElement([false, 8, 9]),
filePath: fakeFile(),
globalsPropValue: faker.helpers.arrayElement([
true,
false,
"readable",
"readonly",
"writable",
"writeable"
])
}
},
logger: mock(),
manifest: fakeUserManifest(),
manifestVersion,
mode,
outBaseDir: fakeDir(),
outDir: fakeDir(),
publicDir: fakeDir(),
root: fakeDir(),
wxtModuleDir: fakeDir(),
runnerConfig: {
config: {}
},
debug: faker.datatype.boolean(),
srcDir: fakeDir(),
typesDir: fakeDir(),
wxtDir: fakeDir(),
analysis: {
enabled: false,
open: false,
template: "treemap",
outputFile: fakeFile(),
outputDir: fakeDir(),
outputName: "stats",
keepArtifacts: false
},
zip: {
artifactTemplate: "{{name}}-{{version}}.zip",
includeSources: [],
excludeSources: [],
exclude: [],
sourcesRoot: fakeDir(),
sourcesTemplate: "{{name}}-sources.zip",
name: faker.person.firstName().toLowerCase(),
downloadedPackagesDir: fakeDir(),
downloadPackages: [],
compressionLevel: 9,
zipSources: false
},
userConfigMetadata: {},
alias: {},
experimental: {},
dev: {
reloadCommand: "Alt+R"
},
hooks: {},
vite: () => ({}),
plugins: []
};
});
export const fakeWxt = fakeObjectCreator(() => ({
config: fakeResolvedConfig(),
hook: vi.fn(),
hooks: mock(),
logger: mock(),
reloadConfig: vi.fn(),
pm: mock(),
server: faker.helpers.arrayElement([void 0, fakeWxtDevServer()]),
builder: mock()
}));
export const fakeWxtDevServer = fakeObjectCreator(() => ({
currentOutput: fakeBuildOutput(),
host: "localhost",
port: 3e3,
origin: "http://localhost:3000",
reloadContentScript: vi.fn(),
reloadExtension: vi.fn(),
reloadPage: vi.fn(),
restart: vi.fn(),
restartBrowser: vi.fn(),
start: vi.fn(),
stop: vi.fn(),
transformHtml: vi.fn(),
watcher: mock(),
ws: mock()
}));
export function setFakeWxt(overrides) {
const wxt = fakeWxt(overrides);
setWxtForTesting(wxt);
return wxt;
}
export const fakeBuildOutput = fakeObjectCreator(() => ({
manifest: fakeManifest(),
publicAssets: fakeArray(fakeOutputAsset),
steps: fakeArray(fakeBuildStepOutput)
}));
export const fakeBuildStepOutput = fakeObjectCreator(() => ({
chunks: fakeArray(fakeOutputChunk),
entrypoints: fakeArray(fakeEntrypoint)
}));
export const fakeManifestCommand = fakeObjectCreator(
() => ({
description: faker.string.sample(),
suggested_key: {
default: `${faker.helpers.arrayElement(["ctrl", "alt"])}+${faker.number.int(
{
min: 0,
max: 9
}
)}`
}
})
);
export const fakeDevServer = fakeObjectCreator(() => ({
host: "localhost",
port: 5173,
origin: "http://localhost:3000",
reloadContentScript: vi.fn(),
reloadExtension: vi.fn(),
reloadPage: vi.fn(),
restart: vi.fn(),
restartBrowser: vi.fn(),
stop: vi.fn(),
start: vi.fn(),
watcher: mock(),
transformHtml: vi.fn(),
ws: mock(),
currentOutput: void 0
}));