diff --git a/packages/cli/src/config/rollup.config.js b/packages/cli/src/config/rollup.config.js index 3bb9b8ce3..76d522cea 100644 --- a/packages/cli/src/config/rollup.config.js +++ b/packages/cli/src/config/rollup.config.js @@ -74,6 +74,12 @@ function greenwoodResourceLoader (compilation) { } } + for (const plugin of resourcePlugins) { + if (plugin.shouldOptimize && await plugin.shouldOptimize(idUrl, response.clone())) { + response = await plugin.optimize(idUrl, response.clone()); + } + } + return await response.text(); } } diff --git a/packages/cli/src/lifecycles/serve.js b/packages/cli/src/lifecycles/serve.js index fa29dbb19..ae31a62e0 100644 --- a/packages/cli/src/lifecycles/serve.js +++ b/packages/cli/src/lifecycles/serve.js @@ -70,7 +70,6 @@ async function getDevServer(compilation) { const merged = mergeResponse(response.clone(), current.clone()); response = merged; - break; } } diff --git a/packages/cli/src/loader.js b/packages/cli/src/loader.js index 5d347bc20..657ab4e16 100644 --- a/packages/cli/src/loader.js +++ b/packages/cli/src/loader.js @@ -1,32 +1,48 @@ import { readAndMergeConfig as initConfig } from './lifecycles/config.js'; +import { mergeResponse } from './lib/resource-utils.js'; const config = await initConfig(); -const resourcePlugins = config.plugins.filter(plugin => plugin.type === 'resource').map(plugin => plugin.provider({ - context: { - projectDirectory: new URL(`file://${process.cwd()}`) - }, - config: { - devServer: {} - }, - graph: [] -})); - -async function getCustomLoaderResponse(url, checkOnly = false) { +const resourcePlugins = config.plugins + .filter(plugin => plugin.type === 'resource') + .filter(plugin => plugin.name !== 'plugin-node-modules:resource' && plugin.name !== 'plugin-user-workspace') + .map(plugin => plugin.provider({ + context: { + projectDirectory: new URL(`file://${process.cwd()}/`), + scratchDir: new URL(`file://${process.cwd()}/.greenwood/`) + }, + config: { + devServer: {} + }, + graph: [] + })); + +async function getCustomLoaderResponse(initUrl, checkOnly = false) { const headers = { 'Accept': 'text/javascript', 'Sec-Fetch-Dest': 'empty' }; - const request = new Request(url, { headers }); const initResponse = new Response(''); + let request = new Request(initUrl, { headers }); + let url = initUrl; let response = initResponse.clone(); let shouldHandle = false; for (const plugin of resourcePlugins) { - if (plugin.shouldServe && await plugin.shouldServe(url, request)) { + if (initUrl.protocol === 'file:' && plugin.shouldResolve && await plugin.shouldResolve(initUrl, request)) { shouldHandle = true; if (!checkOnly) { - response = await plugin.serve(url, request); + url = new URL((await plugin.resolve(initUrl, request)).url); + } + } + } + + for (const plugin of resourcePlugins) { + if (plugin.shouldServe && await plugin.shouldServe(initUrl, request)) { + shouldHandle = true; + + if (!checkOnly) { + response = mergeResponse(response, await plugin.serve(initUrl, request)); } } } @@ -36,7 +52,7 @@ async function getCustomLoaderResponse(url, checkOnly = false) { shouldHandle = true; if (!checkOnly) { - response = await plugin.preIntercept(url, request, response.clone()); + response = mergeResponse(response, await plugin.preIntercept(url, request, response.clone())); } } @@ -44,7 +60,7 @@ async function getCustomLoaderResponse(url, checkOnly = false) { shouldHandle = true; if (!checkOnly) { - response = await plugin.intercept(url, request, response.clone()); + response = mergeResponse(response, await plugin.intercept(url, request, response.clone())); } } }