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?

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Answers

  • 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

  • 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

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

    test.js

    1. import arsehurt from 'assert'
    2.  
    3. const labs1Path = '../labs-1/index.js'
    4. const { default: add } = await import(labs1Path)
    5.  
    6. let logged = false
    7. const { log } = console
    8. console.log = (out) => {
    9. logged = true
    10. arsehurt(+out === 42, 'correct value logged')
    11. }
    12.  
    13. /*
    14. * Here we need to execute the module. Why (i wondered)?
    15. * - CJS require reads, executes, exports
    16. * - Since ES6 import statement is a declarative syntax,
    17. * - the import is unable to execute
    18. */
    19.  
    20. import { doit } from './index.js'
    21. doit()
    22.  
    23. /*
    24. * Also i found an explanation that the `import` cache isnt available
    25. * (apparently to prevent memory leaks appears to be the reason)
    26. * So following the @csharr solution i changed the assertion
    27. */
    28.  
    29. arsehurt(typeof add == 'function', 'module from labs-1 was correctly loaded')
    30.  
    31. arsehurt(logged, 'value was sent to console.log')
    32. log('passed!')
  • Update the CH-7/labs-1/index.js to cjs like

    1. "use strict";
    2. /*
    3. * esm
    4. * export default function (a, b) {
    5. * return a + b;
    6. * }
    7. */
    8.  
    9. //cjs
    10. const add = (a, b) => {
    11. return a + b;
    12. };
    13.  
    14. 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)

    1. "use strict";
    2.  
    3. const labs1ADD = require("../labs-1/index.js");
    4. console.log(labs1ADD(19, 23));
    5.  
  • Posts: 160

    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

  • 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?

  • Posts: 160

    @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.

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Welcome!

It looks like you're new here. Sign in or register to get started.
Sign In

Categories

Upcoming Training