UNPKG

@web/dev-server-core

Version:
90 lines 4.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.pluginTransformMiddleware = void 0; const PluginTransformCache_js_1 = require("./PluginTransformCache.js"); const utils_js_1 = require("../utils.js"); /** * Sets up a middleware which allows plugins to transform files before they are served to the browser. */ function pluginTransformMiddleware(logger, config, fileWatcher) { var _a; const cache = new PluginTransformCache_js_1.PluginTransformCache(fileWatcher, config.rootDir); const transformPlugins = ((_a = config.plugins) !== null && _a !== void 0 ? _a : []).filter(p => 'transform' in p); if (transformPlugins.length === 0) { // nothing to transform return (ctx, next) => next(); } return async (context, next) => { var _a; // The cache key is the request URL plus any specific cache keys provided by plugins. // For example plugins might do different transformations based on user agent. const cacheKey = context.url + (await Promise.all(transformPlugins.map(p => { var _a; return (_a = p.transformCacheKey) === null || _a === void 0 ? void 0 : _a.call(p, context); }))) .filter(_ => _) .join('_'); const result = await cache.get(cacheKey); if (result) { context.body = result.body; for (const [k, v] of Object.entries(result.headers)) { context.response.set(k, v); } logger.debug(`Serving cache key "${cacheKey}" from plugin transform cache`); return; } await next(); if (context.status < 200 || context.status >= 300) { return; } try { // ensure response body is turned into a string or buffer await (0, utils_js_1.getResponseBody)(context); let disableCache = false; let transformedCode = false; for (const plugin of transformPlugins) { const result = await ((_a = plugin.transform) === null || _a === void 0 ? void 0 : _a.call(plugin, context)); if (typeof result === 'object') { disableCache = result.transformCache === false ? true : disableCache; if (result.body != null) { context.body = result.body; transformedCode = true; logger.debug(`Plugin ${plugin.name} transformed ${context.path}.`); } if (result.headers) { for (const [k, v] of Object.entries(result.headers)) { context.response.set(k, v); } } } else if (typeof result === 'string') { context.body = result; transformedCode = true; logger.debug(`Plugin ${plugin.name} transformed ${context.path}.`); } } if (transformedCode && !disableCache) { logger.debug(`Added cache key "${cacheKey}" to plugin transform cache`); const filePath = (0, utils_js_1.getRequestFilePath)(context.url, config.rootDir); cache.set(filePath, context.body, context.response.headers, cacheKey); } } catch (e) { if (e instanceof utils_js_1.RequestCancelledError) { return undefined; } context.body = 'Error while transforming file. See the terminal for more information.'; context.status = 500; const error = e; if (error.name === 'PluginSyntaxError') { logger.logSyntaxError(error); return; } if (error.name === 'PluginError') { logger.error(error.message); return; } throw error; } }; } exports.pluginTransformMiddleware = pluginTransformMiddleware; //# sourceMappingURL=pluginTransformMiddleware.js.map