2

I want to test my simple Node.js (v14.15.4) application with Mocha (v8.2.1). I also include Babel to compile the ES6 modules in my code.

In particular, I use "@babel/core" (v7.12.10), "babel/register" (v7.12.10) to use the compiler with mocha, and "@babel/preset-env" (v7.12.11) for ES6 module support.

Everything works fine, until I include an external dependency in my code. In my case, I want to use bpmn-js (v8.2.0) which itself is ready for the use with ES6 modules (https://bpmn.io/blog/posts/2018-migrating-to-es-modules.html).

My project structure is as follows:

- bpmn
    - index.js
- node_modules
    - ...
- babel.config.json
- index.js
- index.test.js
- package.json

The files are depicted below:

package.json

{
  "name": "test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "mocha --require @babel/register index.test.js"
  },
  "devDependencies": {
    "mocha": "8.2.1",
    "@babel/core": "7.12.10",
    "@babel/register": "7.12.10",
    "@babel/preset-env": "7.12.11"
  },
  "dependencies": {
    "bpmn-js": "8.2.0"
  },
  "author": "",
  "license": "ISC"
}

babel.config.json

{
    "presets": ["@babel/preset-env"]
}

index.js

export {
    default
  } from './bpmn';

bpmn/index.js

//import { Viewer } from 'bpmn-js';

export default (str) => {
    return str.toUpperCase();
};

index.test.js

import toUpperCase from './index';

const assert = require('assert');

describe('The module toUpperCase', () => {
  it('should transform my test string', () => {
    assert.strictEqual(toUpperCase('test'), 'TEST');
  });
});

As stated, everything works fine when running npm run test. However, if I include the comment in line 1 in the bpmn/index.js file, the error below occurs. It seems that babel compiles my local project files, but ignores the external dependencies, i.e. bpmn-js in that case

\node_modules\bpmn-js\index.js:1
export {
^^^^^^

SyntaxError: Unexpected token 'export'
    at wrapSafe (internal/modules/cjs/loader.js:979:16)
    at Module._compile (internal/modules/cjs/loader.js:1027:27)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (D:\Code\Neuer Ordner\bpmn\/index.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (D:\Code\Neuer Ordner\/index.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.<anonymous> (D:\Code\Neuer Ordner\/index.test.js:1:1)
    at Module._compile (internal/modules/cjs/loader.js:1063:30)
    at Module._compile (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:1092:10)
    at Object.newLoader [as .js] (D:\Code\Neuer Ordner\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:928:32)
    at Function.Module._load (internal/modules/cjs/loader.js:769:14)
    at Module.require (internal/modules/cjs/loader.js:952:19)
    at require (internal/modules/cjs/helpers.js:88:18)
    at Object.exports.requireOrImport (D:\Code\Neuer Ordner\node_modules\mocha\lib\esm-utils.js:20:12)
    at Object.exports.loadFilesAsync (D:\Code\Neuer Ordner\node_modules\mocha\lib\esm-utils.js:33:34)
    at Mocha.loadFilesAsync (D:\Code\Neuer Ordner\node_modules\mocha\lib\mocha.js:431:19)
    at singleRun (D:\Code\Neuer Ordner\node_modules\mocha\lib\cli\run-helpers.js:125:15)
    at exports.runMocha (D:\Code\Neuer Ordner\node_modules\mocha\lib\cli\run-helpers.js:190:10)
    at Object.exports.handler (D:\Code\Neuer Ordner\node_modules\mocha\lib\cli\run.js:362:11)
    at D:\Code\Neuer Ordner\node_modules\yargs\lib\command.js:241:49
sensati0n
  • 21
  • 3

1 Answers1

0

There are two problems in your approach. The first one, really fundamental, is that you are trying to import bpmn-js inside a Node.js process. This package can only be run in a browser as it depends on the DOM Document being available. You are never going to be able to do this. The other problem is, as you correctly figured out, that bpmn-js uses ES6 module syntax. By default, packages found in the node_modules directory are ignored by @babel/register that you require. In other words, they are not transpiled. You could configure @babel/register to make an exemption for bpmn-js and transpile it but your import would still fail with something like:

ReferenceError: document is not defined
matej bobaly
  • 456
  • 3
  • 6