From 215ea0e4290e2129301900c3c110baf769bde728 Mon Sep 17 00:00:00 2001 From: Jonathan Kolberg Date: Sat, 4 Jun 2022 10:12:52 +0200 Subject: [PATCH] feat(node): allow executing esm compiled scripts --- e2e/node/src/node.test.ts | 41 +++++++++++++++++++ .../node/node-with-require-overrides.ts | 4 +- 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/e2e/node/src/node.test.ts b/e2e/node/src/node.test.ts index db9b82804307f5..17ad3ee4217c10 100644 --- a/e2e/node/src/node.test.ts +++ b/e2e/node/src/node.test.ts @@ -16,6 +16,7 @@ import { tmpProjPath, uniq, updateFile, + updateJson, updateProjectConfig, } from '@nrwl/e2e/utils'; import { exec, execSync } from 'child_process'; @@ -255,6 +256,46 @@ describe('Node Applications', () => { expect(err).toBeFalsy(); } }, 120000); + + it('should be able to run es module applications', async () => { + const esmapp = uniq('esmapp'); + + runCLI(`generate @nrwl/node:app ${esmapp} --linter=eslint`); + updateJson(`apps/${esmapp}/tsconfig.app.json`, (config) => { + config.module = 'esnext'; + config.target = 'es2020'; + return config; + }); + updateProjectConfig(esmapp, (config) => { + config.targets.build.executor = '@nrwl/node:webpack'; + config.targets.build.options.outputFileName = 'main.mjs'; + config.targets.build.options.webpackConfig = `apps/${esmapp}/webpack.config.js`; + config.targets.serve.executor = '@nrwl/node:node'; + config.targets.serve.options.watch = false; + return config; + }); + updateFile( + `apps/${esmapp}/webpack.config.js`, + `module.exports = (config, context) => ({ + ...config, + experiments: { + ...config.experiments, + outputModule: true, + topLevelAwait: true, + }, + output: { + path: config.output.path, + chunkFormat: 'module', + library: { + type: 'module', + }, + }, + })` + ); + await runCLIAsync(`build ${esmapp}`); + const { stdout } = await runCLIAsync(`serve ${esmapp}`); + expect(stdout).toBe('Hello World!'); + }, 300000); }); describe('Build Node apps', () => { diff --git a/packages/node/src/executors/node/node-with-require-overrides.ts b/packages/node/src/executors/node/node-with-require-overrides.ts index 6d152d5adacb73..f8583422c609f2 100644 --- a/packages/node/src/executors/node/node-with-require-overrides.ts +++ b/packages/node/src/executors/node/node-with-require-overrides.ts @@ -1,6 +1,8 @@ const Module = require('module'); const originalLoader = Module._load; +const dynamicImport = new Function('specifier', 'return import(specifier)'); + const mappings = JSON.parse(process.env.NX_MAPPINGS); const keys = Object.keys(mappings); const fileToRun = process.env.NX_FILE_TO_RUN; @@ -17,4 +19,4 @@ Module._load = function (request, parent) { } }; -require(fileToRun); +dynamicImport(fileToRun);