2

I have a react web application, that uses webpack.

Due to the issue with Left-pad I am including my node_modules folder in source control.

I have mocha and enzyme set up to unit test my react modules and my packages.json has the following test configuration.

 "test": "mocha-webpack --webpack-config webpack.config-test.js \"source/**/*.test.js\""

It all works great. when I run

npm run test

on my local development machine. All my test's get executed.

The problem I have is when I run "npm run test" as part of a build process on a dedicated build machine I get the following error

Error: Cannot find module 'enzyme'

After some digging around, I discovered that if I ran

npm install enzyme

on the build machine before I ran the test, then it worked fine. The reason this worked is that the install modified my node_modules/enzyme/packages.json file. There are 2 full paths stored in this file that had the paths to my local dev environment in them, and they got changed to the full path to where my project was run on the build machine.

One under _Args and one under _where

   {
  "_args": [
    [
      {
        "raw": "enzyme@^2.6.0",
        "scope": null,
        "escapedName": "enzyme",
        "name": "enzyme",
        "rawSpec": "^2.6.0",
        "spec": ">=2.6.0 <3.0.0",
        "type": "range"
      },
      "C:\\Dev\\UnifiedWeb"
    ]
  ],
  "_from": "enzyme@>=2.6.0 <3.0.0",
  "_id": "enzyme@2.6.0",
  "_inCache": true,
  "_location": "/enzyme",
  "_nodeVersion": "7.0.0",
  "_npmOperationalInternal": {
    "host": "packages-12-west.internal.npmjs.com",
    "tmp": "tmp/enzyme-2.6.0.tgz_1478746866117_0.454174768878147"
  },
  "_npmUser": {
    "name": "ljharb",
    "email": "ljharb@gmail.com"
  },
  "_npmVersion": "3.10.8",
  "_phantomChildren": {},
  "_requested": {
    "raw": "enzyme@^2.6.0",
    "scope": null,
    "escapedName": "enzyme",
    "name": "enzyme",
    "rawSpec": "^2.6.0",
    "spec": ">=2.6.0 <3.0.0",
    "type": "range"
  },
  "_requiredBy": [
    "#DEV:/",
    "#USER"
  ],
  "_resolved": "https://registry.npmjs.org/enzyme/-/enzyme-2.6.0.tgz",
  "_shasum": "148d742b25e2565f7e80870a0c92aea9be1b90ea",
  "_shrinkwrap": null,
  "_spec": "enzyme@^2.6.0",
  "_where": "C:\\Dev\\UnifiedWeb",
  "author": {
    "name": "Leland Richardson",
    "email": "leland.richardson@airbnb.com"
  },
  "bugs": {
    "url": "https://github.com/airbnb/enzyme/issues"
  },
  "dependencies": {
    "cheerio": "^0.22.0",
    "function.prototype.name": "^1.0.0",
    "in-publish": "^2.0.0",
    "is-subset": "^0.1.1",
    "lodash": "^4.16.4",
    "object-is": "^1.0.1",
    "object.assign": "^4.0.4",
    "object.entries": "^1.0.3",
    "object.values": "^1.0.3",
    "uuid": "^2.0.3"
  },
  "description": "JavaScript Testing utilities for React",
  "devDependencies": {
    "babel-cli": "^6.18.0",
    "babel-core": "^6.18.2",
    "babel-eslint": "^7.1.0",
    "babel-loader": "^6.2.7",
    "babel-preset-airbnb": "^2.1.1",
    "babel-register": "^6.18.0",
    "chai": "^3.5.0",
    "coveralls": "^2.11.14",
    "enzyme-example-jest": "^0.1.0",
    "enzyme-example-karma": "^0.1.1",
    "enzyme-example-karma-webpack": "^0.1.4",
    "enzyme-example-mocha": "^0.1.0",
    "enzyme-example-react-native": "^0.1.0",
    "eslint": "^3.9.1",
    "eslint-config-airbnb": "^13.0.0",
    "eslint-plugin-import": "^2.2.0",
    "eslint-plugin-jsx-a11y": "^2.2.3",
    "eslint-plugin-react": "^6.6.0",
    "gitbook-cli": "^1.0.1",
    "istanbul": "^1.0.0-alpha.2",
    "jsdom": "^6.1.0",
    "json-loader": "^0.5.4",
    "karma": "^1.3.0",
    "karma-chrome-launcher": "^1.0.1",
    "karma-firefox-launcher": "^1.0.0",
    "karma-mocha": "^1.2.0",
    "karma-sourcemap-loader": "^0.3.7",
    "karma-webpack": "^1.8.0",
    "mocha": "^3.1.2",
    "rimraf": "^2.5.4",
    "safe-publish-latest": "^1.1.1",
    "sinon": "^1.17.6",
    "webpack": "^1.13.3"
  },
  "directories": {},
  "dist": {
    "shasum": "148d742b25e2565f7e80870a0c92aea9be1b90ea",
    "tarball": "https://registry.npmjs.org/enzyme/-/enzyme-2.6.0.tgz"
  },
  "gitHead": "5c37d91715a88d393f3c260447a189a446d76e0c",
  "homepage": "https://github.com/airbnb/enzyme#readme",
  "keywords": [
    "javascript",
    "shallow rendering",
    "shallowRender",
    "test",
    "reactjs",
    "react",
    "flux",
    "testing",
    "test utils",
    "assertion helpers",
    "tdd",
    "mocha"
  ],
  "license": "MIT",
  "main": "build",
  "maintainers": [
    {
      "name": "airbnb",
      "email": "jordan.harband+npm@airbnb.com"
    },
    {
      "name": "intelligibabble",
      "email": "leland.m.richardson@gmail.com"
    },
    {
      "name": "ljharb",
      "email": "ljharb@gmail.com"
    }
  ],
  "name": "enzyme",
  "optionalDependencies": {},
  "peerDependencies": {
    "react": "0.13.x || 0.14.x || ^15.0.0-0 || 15.x"
  },
  "readme": "ERROR: No README data found!",
  "repository": {
    "type": "git",
    "url": "git+https://github.com/airbnb/enzyme.git"
  },
  "scripts": {
    "build": "babel src --out-dir build",
    "check": "npm run lint && npm run test:all",
    "clean": "rimraf build",
    "docs:build": "npm run docs:prepare && gitbook build",
    "docs:clean": "rimraf _book",
    "docs:prepare": "gitbook install",
    "docs:publish": "npm run docs:clean && npm run docs:build && cd _book && git init && git commit --allow-empty -m 'update book' && git fetch git@github.com:airbnb/enzyme.git gh-pages && git checkout -b gh-pages && git add . && git commit -am 'update book' && git push git@github.com:airbnb/enzyme.git gh-pages --force",
    "docs:watch": "npm run docs:prepare && gitbook serve",
    "lint": "eslint --ext js,jsx src test",
    "postversion": "git push && git push --tags && npm run clean && npm run docs:publish",
    "prepublish": "not-in-publish || (npm run clean && npm run build && safe-publish-latest)",
    "pretest": "npm run lint",
    "preversion": "npm run clean && npm run check",
    "react:13": "npm run react:clean && npm i react@0.13",
    "react:14": "npm run react:clean && npm i react@0.14 react-dom@0.14 react-addons-test-utils@0.14",
    "react:15": "npm run react:clean && npm i react@15 react-dom@15 react-addons-test-utils@15",
    "react:clean": "rimraf node_modules/react node_modules/react-dom node_modules/react-addons-test-utils",
    "test": "npm run clean && npm run build && npm run test:only",
    "test:all": "npm run react:13 && npm run test:only && npm run react:14 && npm run test:only && npm run react:15 && npm run test:only",
    "test:env": "sh ./example-test.sh",
    "test:karma": "karma start",
    "test:only": "mocha --recursive test",
    "test:single": "mocha --watch",
    "test:watch": "mocha --recursive --watch test",
    "travis": "babel-node ./node_modules/.bin/istanbul cover --report html _mocha -- test --recursive",
    "version": "npm run build"
  },
  "version": "2.6.0"
}

This problem will also affect other developers in my team, as the paths will need to be changed to their local development if they want to run the tests locally.

Why is the full path in the enzyme package? Is there a better way of handling this? Am I missing something, or is npm not portable?

David Kethel
  • 2,440
  • 9
  • 29
  • 49
  • Did you use `npm shrinkwrap` by chance? Looking at the [`enzyme` `package.json`](https://github.com/airbnb/enzyme/blob/master/package.json) file it doesn't seem to have local paths. – MarcoL Nov 21 '16 at 07:46
  • Thanks Marcol. I've just added my enzyme/package.json. I think NPM adds them not enzyme – David Kethel Nov 21 '16 at 23:10

1 Answers1

1

Have you tried npm link ext/* --prefix=node_modules

As per this thread - Local dependency in package.json

Community
  • 1
  • 1
Scott
  • 1,978
  • 1
  • 16
  • 36