117 lines
4.7 KiB
JavaScript
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
|
|
}; |