2024-11-25 16:53:40 -06:00

117 lines
4.7 KiB
JavaScript

"use strict";
var _fs = _interopRequireDefault(require("fs"));
var _url = _interopRequireDefault(require("url"));
var _compilationCache = require("./compilationCache");
var _transform = require("./transform");
var _portTransport = require("./portTransport");
var _util = require("../util");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* Copyright (c) Microsoft Corporation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Node < 18.6: defaultResolve takes 3 arguments.
// Node >= 18.6: nextResolve from the chain takes 2 arguments.
async function resolve(specifier, context, defaultResolve) {
var _currentFileDepsColle;
if (context.parentURL && context.parentURL.startsWith('file://')) {
const filename = _url.default.fileURLToPath(context.parentURL);
const resolved = (0, _transform.resolveHook)(filename, specifier);
if (resolved !== undefined) specifier = _url.default.pathToFileURL(resolved).toString();
}
const result = await defaultResolve(specifier, context, defaultResolve);
// Note: we collect dependencies here that will be sent to the main thread
// (and optionally runner process) after the loading finishes.
if (result !== null && result !== void 0 && result.url && result.url.startsWith('file://')) (_currentFileDepsColle = (0, _compilationCache.currentFileDepsCollector)()) === null || _currentFileDepsColle === void 0 || _currentFileDepsColle.add(_url.default.fileURLToPath(result.url));
return result;
}
// Node < 18.6: defaultLoad takes 3 arguments.
// Node >= 18.6: nextLoad from the chain takes 2 arguments.
async function load(moduleUrl, context, defaultLoad) {
var _transport;
// Bail out for wasm, json, etc.
// non-js files have context.format === undefined
if (context.format !== 'commonjs' && context.format !== 'module' && context.format !== undefined) return defaultLoad(moduleUrl, context, defaultLoad);
// Bail for built-in modules.
if (!moduleUrl.startsWith('file://')) return defaultLoad(moduleUrl, context, defaultLoad);
const filename = _url.default.fileURLToPath(moduleUrl);
// Bail for node_modules.
if (!(0, _transform.shouldTransform)(filename)) return defaultLoad(moduleUrl, context, defaultLoad);
const code = _fs.default.readFileSync(filename, 'utf-8');
const transformed = (0, _transform.transformHook)(code, filename, moduleUrl);
// Flush the source maps to the main thread, so that errors during import() are source-mapped.
if (transformed.serializedCache) await ((_transport = transport) === null || _transport === void 0 ? void 0 : _transport.send('pushToCompilationCache', {
cache: transformed.serializedCache
}));
// Output format is required, so we determine it manually when unknown.
// shortCircuit is required by Node >= 18.6 to designate no more loaders should be called.
return {
format: context.format || ((0, _util.fileIsModule)(filename) ? 'module' : 'commonjs'),
source: transformed.code,
shortCircuit: true
};
}
let transport;
// Node.js < 20
function globalPreload(context) {
transport = createTransport(context.port);
return `
globalThis.__esmLoaderPortPreV20 = port;
`;
}
// Node.js >= 20
function initialize(data) {
transport = createTransport(data === null || data === void 0 ? void 0 : data.port);
}
function createTransport(port) {
return new _portTransport.PortTransport(port, async (method, params) => {
if (method === 'setSingleTSConfig') {
(0, _transform.setSingleTSConfig)(params.tsconfig);
return;
}
if (method === 'setTransformConfig') {
(0, _transform.setTransformConfig)(params.config);
return;
}
if (method === 'addToCompilationCache') {
(0, _compilationCache.addToCompilationCache)(params.cache);
return;
}
if (method === 'getCompilationCache') return {
cache: (0, _compilationCache.serializeCompilationCache)()
};
if (method === 'startCollectingFileDeps') {
(0, _compilationCache.startCollectingFileDeps)();
return;
}
if (method === 'stopCollectingFileDeps') {
(0, _compilationCache.stopCollectingFileDeps)(params.file);
return;
}
});
}
module.exports = {
resolve,
load,
globalPreload,
initialize
};