Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[solution] Cypress & with Yarn PnP #108

Open
OleksandrKucherenko opened this issue Oct 5, 2022 · 3 comments
Open

[solution] Cypress & with Yarn PnP #108

OleksandrKucherenko opened this issue Oct 5, 2022 · 3 comments
Labels
enhancement New feature or request

Comments

@OleksandrKucherenko
Copy link

OleksandrKucherenko commented Oct 5, 2022

Is your feature request related to a problem? Please describe.

The cause:

Error loading the reporter: cypress-mochawesome-reporter

We searched for the reporter in these paths:

 - ~/workspace/telekom.de/hvc-csp/cypress-mochawesome-reporter
 - ~/workspace/telekom.de/hvc-csp/node_modules/cypress-mochawesome-reporter

Learn more at https://on.cypress.io/reporters

Describe the solution you'd like

Step #1: Add mocha a required yarn package, so yarn PnP can resolve it for Cypress.

yarn add --dev mocha

Step #2: create in the root of the project file cypress-mochawesome-reporter.js with content:

const path = require("node:path");
const cwd = process.cwd();

// ref: https://yarnpkg.com/advanced/pnpapi
console.log("cypress-mochawesome-reporter.js: cwd =", cwd);
console.log("cypress-mochawesome-reporter.js: PnP =", path.join(cwd, ".pnp.cjs"));

const pnp = require(path.join(cwd, ".pnp.cjs"));
pnp.setup();
console.log("cypress-mochawesome-reporter.js: pnp =", process.versions.pnp);

// NOTE: at this point require('module') will be already patched by pnp and
// will have findPnpApi method; also `require('pnpapi')` will start to work.

let instance = {};

try {
  // ref: https://yarnpkg.com/advanced/pnpapi#requiremodule
  const { createRequire, findPnpApi } = require(`module`);
  const targetModule = cwd + "/";
  console.log("cypress-mochawesome-reporter.js: targetModule =", targetModule);

  const targetPnp = findPnpApi(targetModule);
  // console.log("cypress-mochawesome-reporter.js: targetPnp =", targetPnp);

  const targetRequire = createRequire(targetModule);
  // console.log("cypress-mochawesome-reporter.js: targetRequire =", targetRequire);

  const resolved = targetPnp.resolveRequest("cypress-mochawesome-reporter", targetModule);
  console.log("cypress-mochawesome-reporter.js: resolved =", resolved);

  instance = targetRequire(resolved);

  console.log("cypress-mochawesome-reporter.js: reporter loaded");
} catch (error) {
  console.error("cypress-mochawesome-reporter.js: error =", error);
}

module.exports = instance;

Follow the original configuration steps.

Describe alternatives you've considered

Refs:

Additional context

Cypress reporter executed in "isolated" node instance that does not have enabled P'n'P logic.

@OleksandrKucherenko OleksandrKucherenko added the enhancement New feature or request label Oct 5, 2022
@OleksandrKucherenko OleksandrKucherenko changed the title Cypress & with Yarn PnP [solution] Cypress & with Yarn PnP Oct 5, 2022
@OleksandrKucherenko
Copy link
Author

Cleaner version:

const path = require("node:path");
/* ref: https://yarnpkg.com/advanced/pnpapi */
require(path.join(process.cwd(), ".pnp.cjs")).setup();

const REPORTER = "cypress-mochawesome-reporter";

const resolve = () => {
  const cwd = process.cwd() + "/";

  try {
    const { createRequire, findPnpApi } = require(`module`);
    const targetPnp = findPnpApi(cwd);
    const targetRequire = createRequire(cwd);
    const resolved = targetPnp.resolveRequest(REPORTER, cwd);

    return targetRequire(resolved);
  } catch (error) {
    console.error(REPORTER + ".js: error =", error);
    throw error;
  }
};

module.exports = resolve();

@vire
Copy link

vire commented Nov 4, 2023

Cleaner version:

const path = require("node:path");
/* ref: https://yarnpkg.com/advanced/pnpapi */
require(path.join(process.cwd(), ".pnp.cjs")).setup();

const REPORTER = "cypress-mochawesome-reporter";

const resolve = () => {
  const cwd = process.cwd() + "/";

  try {
    const { createRequire, findPnpApi } = require(`module`);
    const targetPnp = findPnpApi(cwd);
    const targetRequire = createRequire(cwd);
    const resolved = targetPnp.resolveRequest(REPORTER, cwd);

    return targetRequire(resolved);
  } catch (error) {
    console.error(REPORTER + ".js: error =", error);
    throw error;
  }
};

module.exports = resolve();

This breaks with new yarn4 PNP api

@LironEr
Copy link
Owner

LironEr commented Dec 16, 2023

if you can open a PR and a test for that, it would be great.
I'm not familiar with Yarn PnP.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants