Welcome to the Linux Foundation Forum!

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

Options

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
    Options

    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
    Options

    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!')
    
  • narenbellala
    Options

    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: 139
    Options

    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

Categories

Upcoming Training