Welcome to the Linux Foundation Forum!

The require()'s in lab 7.2's test.js are throwing an error.

Hi, I have index.js behaving as asked in Lab 7.2 logging the sum of 19 and 23 to the console, but when I run npm test, I get the following error:

FVFZ51FEL416:labs-2 scbaker$ npm test

labs-2@1.0.0 test
node test.js

file:///Users/scbaker/Documents/dev/LFW211/labs/ch-7/labs-2/test.js:2
const labs1Path = require.resolve('../labs-1')
^

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/Users/scbaker/Documents/dev/LFW211/labs/ch-7/labs-2/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
at file:///Users/scbaker/Documents/dev/LFW211/labs/ch-7/labs-2/test.js:2:19
at ModuleJob.run (node:internal/modules/esm/module_job:195:25)
at async Promise.all (index 0)
at async ESMLoader.import (node:internal/modules/esm/loader:337:24)
at async loadESM (node:internal/process/esm_loader:88:5)
at async handleMainPromise (node:internal/modules/run_main:61:12)

I tried changing the require()'s to imports but that doesn't work with labs1Path. I also tried changing test.js to test.cjs as it suggests, but that threw a different error.

I'm not sure if this is part of the lab challenge or if I should have completed 7.1 as CJS instead of converting it to ESM?

Answers

  • debido
    debido Posts: 4

    sorry about a late response. you've probably already figured it out by now but i thought it would be nice to follow up...

    it says in lab 7.2 exercise instructions "if the prior exercise was completed in the form of an ESM module, this exercise must also be converted to ESM"

    try converting 7.1 back to cjs and get it to pass the tests. then, try 7.2

    or

    you could leave 7.1 as mjs and convert 7.2 to mjs

    either should work out in the end but it's much simpler to complete both cjs

  • jayjohnston
    jayjohnston Posts: 10
    edited March 2023

    My Attempt at the Fully ESM Solution:

    wow, i had been breezing through the training until chapter 7. i spent as much time on chapter 7 labs as i did 1-6 in entirety!

    i hope these notes help someone. also, could someone verify my research results put into the comments below, please?

    I finally realized i need to change index.js from a more simple 7.1 version to one that exports.

    index.js

    import { default as add } from '../labs-1/index.js'
    export const doit = () => {
      const out = add(19, 23)
      console.log(out)
    }
    doit()
    

    test.js

    import arsehurt from 'assert'
    
    const labs1Path = '../labs-1/index.js'
    const { default: add } = await import(labs1Path)
    
    let logged = false
    const { log } = console
    console.log = (out) => {
      logged = true
      arsehurt(+out === 42, 'correct value logged')
    }
    
    /*
      * Here we need to execute the module. Why (i wondered)?
      *  - CJS require reads, executes, exports
      *  - Since ES6 import statement is a declarative syntax,
      *  - the import is unable to execute
      */
    
    import { doit } from './index.js'
    doit()
    
    /*
      * Also i found an explanation that the `import` cache isnt available
      * (apparently to prevent memory leaks appears to be the reason)
      * So following the @csharr solution i changed the assertion
      */
    
    arsehurt(typeof add == 'function', 'module from labs-1 was correctly loaded')
    
    arsehurt(logged, 'value was sent to console.log')
    log('passed!')
    
  • Update the CH-7/labs-1/index.js to cjs like

    "use strict";
    /*
        * esm
        * export default function (a, b) {
        *  return a + b;
        * }
    */
    
    //cjs
    const add = (a, b) => {
      return a + b;
    };
    
    module.exports = add;
    

    Remove "type": "module", from labs-1 package.json. If it was solved by ESM.

    Add the following in the CH-7/labs-2/index.js (Keeping it as a CJS solution as mentioned above)

    "use strict";
    
    const labs1ADD = require("../labs-1/index.js");
    console.log(labs1ADD(19, 23));
    
    
  • xdxmxc
    xdxmxc Posts: 157

    yeah the module space in Node has been much complicated by the ESM standard + backcompat requirements, unfortunately this translates into a knowledge burden for the ecosystem

  • vvscode
    vvscode Posts: 1

    @xdxmxc as far as I understand it's impossible to solve the task with ESM (at least with having tests passing, just import and call is not a problem) - the mention in the task about ESM is very confusion. Does it worth to remove it?

  • xdxmxc
    xdxmxc Posts: 157

    @vvscode no it's possible as long as tests are also converted. It has to be in there because ESM is specification. Confusion here is an unfortunate outcome of the transition from CJS to ESM which is still on-going.

Categories

Upcoming Training