embroider-build / embroider

Compiling Ember apps into spec-compliant, modern Javascript.
MIT License
337 stars 137 forks source link

Uncaught (in promise) Error: Could not find module `../@ember/test-helpers/index.js` imported from `(require)` #1078

Closed thoov closed 2 years ago

thoov commented 2 years ago

Starting in v0.49.0+ I am seeing this error (v0.47.0 & v0.48.0 worked fine):

Uncaught (in promise) Error: Could not find module `../@ember/test-helpers/index.js` imported from `(require)`
    at missingModule (vendor.js:254:11)
    at findModule (vendor.js:265:7)
    at requireModule (vendor.js:31:15)
    at Module.callback (chunk.d52098f8114ab94f4e23.js:171157:67)
    at Module.exports (vendor.js:113:32)
    at requireModule (vendor.js:34:18)
    at getRfc232TestContext (chunk.d52098f8114ab94f4e23.js:171171:66)
    at _shouldUseMirage (chunk.c965491da35091374282.js:208433:102)
    at Object.initialize (chunk.c965491da35091374282.js:208413:9)
    at vendor.js:37224:21

getRfc232TestContext module looks like:

/***/ "./node_modules/ember-cli-mirage/get-rfc232-test-context.js":
/*!******************************************************************!*\
  !*** ./node_modules/ember-cli-mirage/get-rfc232-test-context.js ***!
  \******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ getRfc232TestContext)
/* harmony export */ });
/* harmony import */ var _externals_require__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../externals/require */ "../externals/require.js");
/* harmony import */ var _externals_require__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_externals_require__WEBPACK_IMPORTED_MODULE_0__);
window.define("@ember/test-helpers", function () {
  return _externals_require__WEBPACK_IMPORTED_MODULE_0___default()("../@ember/test-helpers/index.js");
});
 //
// Helper to get our rfc232/rfc268 test context object, or null if we're not in
// such a test.
//

function getRfc232TestContext() {
  // Support older versions of `ember-qunit` that don't have
  // `@ember/test-helpers` (and therefore cannot possibly be running an
  // rfc232/rfc268 test).
  if (_externals_require__WEBPACK_IMPORTED_MODULE_0___default().has('@ember/test-helpers')) {
    let {
      getContext
    } = _externals_require__WEBPACK_IMPORTED_MODULE_0___default()('@ember/test-helpers');

    return getContext();
  }
}

Specifically these lines cause problems:

window.define("@ember/test-helpers", function () {
  return _externals_require__WEBPACK_IMPORTED_MODULE_0___default()("../@ember/test-helpers/index.js");
});

I am also seeing this happen in other modules as well where it is creating ../module-name/index.js and throwing an error.

In v0.48.0 this is what the module looked like:

/***/ "./node_modules/ember-cli-mirage/get-rfc232-test-context.js":
/*!******************************************************************!*\
  !*** ./node_modules/ember-cli-mirage/get-rfc232-test-context.js ***!
  \******************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
/* harmony export */   "default": () => (/* binding */ getRfc232TestContext)
/* harmony export */ });
/* harmony import */ var _ember_test_helpers_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../@ember/test-helpers/index.js */ "./node_modules/@ember/test-helpers/index.js");
/* harmony import */ var _externals_require__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../externals/require */ "../externals/require.js");
/* harmony import */ var _externals_require__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_externals_require__WEBPACK_IMPORTED_MODULE_1__);

window.define("@ember/test-helpers", function () {
  return _ember_test_helpers_index_js__WEBPACK_IMPORTED_MODULE_0__;
});
 //
// Helper to get our rfc232/rfc268 test context object, or null if we're not in
// such a test.
//

function getRfc232TestContext() {
  // Support older versions of `ember-qunit` that don't have
  // `@ember/test-helpers` (and therefore cannot possibly be running an
  // rfc232/rfc268 test).
  if (_externals_require__WEBPACK_IMPORTED_MODULE_1___default().has('@ember/test-helpers')) {
    let {
      getContext
    } = _externals_require__WEBPACK_IMPORTED_MODULE_1___default()('@ember/test-helpers');

    return getContext();
  }
}

/***/ }),
ef4 commented 2 years ago

I just remembered where those window.define are coming from. They're extraImports being added by a packageRule.

And their behavior changed in 0.49.0: https://github.com/embroider-build/embroider/pull/1043

ef4 commented 2 years ago

The part that's likely to be relevant is

https://github.com/embroider-build/embroider/blob/42baeb0efb2bf2b8059d082bcbb0fedc702308c4/packages/core/src/babel-plugin-adjust-imports.ts#L474-L482

Which started inserting an importSync, which will itself get further transformed by the macros-babel-plugin.

Some combination of those two things is what's emitting these weird relative paths.

thoov commented 2 years ago

Steps to reproduce:

packageRules: [{
  package: 'ember-cli-mirage',
  addonModules: {
    'get-rfc232-test-context.js': { dependsOnModules: ['@ember/test-helpers'] }
  }
}],
ef4 commented 2 years ago

Fixed in #1081