@idlebox/esbuild-executer
Version:
A simple script to execute typescript file during development.
89 lines • 3.63 kB
JavaScript
import { resolve as resolvePath } from 'node:path';
import { pathToFileURL } from 'node:url';
import { inspectEnabled } from './common/cli.js';
import { compileFile, createEntryMapping } from './common/compiler.js';
import { logger, registerLogger } from './common/logger.js';
let compiledFiles;
let inspectModeEntryMapping;
export async function initialize({ options, port, tsFile }) {
registerLogger(port);
let entryFileUrl = tsFile;
try {
logger.worker `initialize worker with options: ${tsFile}, ${options}`;
compiledFiles = await compileFile(tsFile, options, port);
if (inspectEnabled) {
logger.worker `inspect mode enabled, entry mapping:`;
inspectModeEntryMapping = new Map();
const { entryPoints, outDir } = createEntryMapping([tsFile, ...(options?.entries ?? [])]);
for (const entry of entryPoints) {
const from = pathToFileURL(resolvePath(outDir, entry.in)).toString();
// biome-ignore lint/style/useTemplate: 太长
const to = pathToFileURL(resolvePath(outDir, entry.out)).toString() + '.js';
logger.worker ` ${from} -> ${to}`;
inspectModeEntryMapping.set(from, to);
}
const shouldFoundEntry = inspectModeEntryMapping.get(tsFile);
if (!shouldFoundEntry) {
throw new Error(`inspect mode entry file not found: ${tsFile}`);
}
entryFileUrl = shouldFoundEntry;
}
logger.worker `initialized | entry file: ${entryFileUrl}`;
port.postMessage({ type: 'initialize', entryFileUrl: entryFileUrl });
}
catch (e) {
port.postMessage({ type: 'error', message: e.message, stack: e.stack });
}
}
export async function resolve(specifier, context, nextResolve) {
logger.hook `<${compiledFiles ? 'runtime' : 'compile'}> resolve: ${specifier} (${context.importAttributes.type})`;
if (!compiledFiles) {
// 编译没有完成时,插件正在尝试分析路径
const r = await nextResolve(specifier, context);
logger.hook `resolved default: ${r}`;
return r;
}
let absolute = specifier;
if (absolute.startsWith('.') && context.parentURL) {
absolute = new URL(absolute, context.parentURL).href;
logger.hook ` turn to absolute: ${absolute}`;
}
const inspectEntry = inspectModeEntryMapping?.get(absolute);
if (inspectEntry) {
logger.hook ` found inspect mode entry!`;
absolute = inspectEntry;
}
if (absolute && compiledFiles.has(absolute)) {
logger.hook ` resolve memory result: ${absolute}`;
return {
url: absolute,
format: 'module',
shortCircuit: true,
};
}
return nextResolve(specifier, context);
}
export function load(url, context, nextLoad) {
logger.hook `try load: ${url} (${context.importAttributes.type})`;
if (!compiledFiles) {
// esbuild plugin is loading package.json
return nextLoad(url, context);
}
const data = compiledFiles.get(url);
if (data) {
logger.hook ` load from memory`;
return {
format: 'module',
source: data,
shortCircuit: true,
};
// } else {
// const knowns = [...compiledFiles.keys()];
// logger.hook(`not found this module (${knowns.length}): ${url}`);
// for (const k of knowns) {
// logger.hook(` - ${k}`);
// }
}
return nextLoad(url, context);
}
//# sourceMappingURL=hook-worker.js.map