From cc77c47b367c97475d06a25de67c0e9a021a8ed2 Mon Sep 17 00:00:00 2001
From: Jack Reed <phillipjreed@gmail.com>
Date: Tue, 5 May 2020 17:45:03 -0600
Subject: [PATCH] More basic project setup stuff

---
 .eslintrc                                 | 31 +++++++++++++++++++++++
 __tests__/.eslintrc                       |  5 ++++
 __tests__/miradorAnnotationPlugin.test.js | 22 ++++++++++++++++
 babel.config.js                           | 13 ++++++++++
 jest.config.js                            | 17 +++++++++++++
 nwb.config.js                             | 21 ++++++++++++---
 package.json                              | 23 ++++++++++++++---
 setupJest.js                              |  4 +++
 src/index.js                              |  2 +-
 src/plugins/miradorAnnotationPlugin.js    | 14 +++++-----
 tests/.eslintrc                           |  5 ----
 tests/index.test.js                       | 23 -----------------
 12 files changed, 139 insertions(+), 41 deletions(-)
 create mode 100644 .eslintrc
 create mode 100644 __tests__/.eslintrc
 create mode 100644 __tests__/miradorAnnotationPlugin.test.js
 create mode 100644 babel.config.js
 create mode 100644 jest.config.js
 create mode 100644 setupJest.js
 delete mode 100644 tests/.eslintrc
 delete mode 100644 tests/index.test.js

diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 0000000..b3caa59
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,31 @@
+{
+  "env": {
+    "jest/globals": true
+  },
+  "extends": ["airbnb","react-app"],
+  "globals": {
+    "page": true,
+    "document": true
+  },
+  "parser": "babel-eslint",
+  "plugins": ["jest"],
+  "rules": {
+    "import/prefer-default-export": "off",
+    "no-console": "off",
+    "react/jsx-filename-extension": [1, { "extensions": [".js", ".jsx"] }],
+    "require-jsdoc": ["error", {
+      "require": {
+        "FunctionDeclaration": true,
+        "MethodDefinition": true,
+        "ClassDeclaration": true,
+        "ArrowFunctionExpression": true,
+        "FunctionExpression": true
+      }
+    }],
+    "react/prefer-stateless-function": "off",
+    "sort-keys": ["error", "asc", {
+      "caseSensitive": false,
+      "natural": false
+    }]
+  }
+}
diff --git a/__tests__/.eslintrc b/__tests__/.eslintrc
new file mode 100644
index 0000000..17e9d54
--- /dev/null
+++ b/__tests__/.eslintrc
@@ -0,0 +1,5 @@
+{
+  "rules": {
+    "react/jsx-props-no-spreading": [0],
+  }
+}
diff --git a/__tests__/miradorAnnotationPlugin.test.js b/__tests__/miradorAnnotationPlugin.test.js
new file mode 100644
index 0000000..4551606
--- /dev/null
+++ b/__tests__/miradorAnnotationPlugin.test.js
@@ -0,0 +1,22 @@
+import React from 'react';
+import { shallow } from 'enzyme';
+import miradorAnnotationPlugin from '../src/plugins/miradorAnnotationPlugin';
+
+/** */
+function createWrapper(props) {
+  return shallow(
+    <miradorAnnotationPlugin.component
+      TargetComponent={'<div>hello</div>'}
+      targetProps={{}}
+      {...props}
+    />,
+  );
+}
+
+describe('MiradorAnnotation', () => {
+  let wrapper;
+  it('renders MiradorAnnotation', () => {
+    wrapper = createWrapper();
+    expect(wrapper.text()).toBe('HelloWorld');
+  });
+});
diff --git a/babel.config.js b/babel.config.js
new file mode 100644
index 0000000..6779626
--- /dev/null
+++ b/babel.config.js
@@ -0,0 +1,13 @@
+module.exports = {
+  presets: [
+    [
+      '@babel/preset-env',
+      {
+        targets: {
+          node: 'current',
+        },
+      },
+    ],
+    '@babel/preset-react',
+  ],
+};
diff --git a/jest.config.js b/jest.config.js
new file mode 100644
index 0000000..22585e0
--- /dev/null
+++ b/jest.config.js
@@ -0,0 +1,17 @@
+// For a detailed explanation regarding each configuration property, visit:
+// https://jestjs.io/docs/en/configuration.html
+
+module.exports = {
+  // Automatically clear mock calls and instances between every test
+  clearMocks: true,
+
+  // The directory where Jest should output its coverage files
+  coverageDirectory: 'coverage',
+  setupFiles: [
+    '<rootDir>/setupJest.js',
+  ],
+  // Ignore Mirador code from jest transforms
+  transformIgnorePatterns: [
+    '<rootDir>/node_modules/(?!mirador)',
+  ],
+};
diff --git a/nwb.config.js b/nwb.config.js
index 146d011..509e5a7 100644
--- a/nwb.config.js
+++ b/nwb.config.js
@@ -1,7 +1,22 @@
+const path = require('path');
+
 module.exports = {
   type: 'react-component',
   npm: {
     esModules: true,
-    umd: false
-  }
-}
+    umd: {
+      global: 'MiradorAnnotation',
+      externals: {
+        react: 'React',
+      },
+    },
+  },
+  webpack: {
+    aliases: {
+      '@material-ui/core': path.resolve('./', 'node_modules', '@material-ui/core'),
+      '@material-ui/styles': path.resolve('./', 'node_modules', '@material-ui/styles'),
+      react: path.resolve('./', 'node_modules', 'react'),
+      'react-dom': path.resolve('./', 'node_modules', 'react-dom'),
+    },
+  },
+};
diff --git a/package.json b/package.json
index 4de8429..0a76794 100644
--- a/package.json
+++ b/package.json
@@ -13,11 +13,12 @@
   "scripts": {
     "build": "nwb build-react-component",
     "clean": "nwb clean-module && nwb clean-demo",
+    "lint": "eslint ./src ./__tests__",
     "prepublishOnly": "npm run build",
     "start": "nwb serve-react-demo",
-    "test": "nwb test-react",
-    "test:coverage": "nwb test-react --coverage",
-    "test:watch": "nwb test-react --server"
+    "test": "npm run lint && jest",
+    "test:coverage": "jest --coverage",
+    "test:watch": "jest --watch"
   },
   "dependencies": {},
   "peerDependencies": {
@@ -25,6 +26,22 @@
     "react": "16.x"
   },
   "devDependencies": {
+    "@babel/core": "^7.9.6",
+    "@babel/preset-env": "^7.9.6",
+    "@babel/preset-react": "^7.9.4",
+    "babel-eslint": "^10.1.0",
+    "enzyme": "^3.11.0",
+    "enzyme-adapter-react-16": "^1.15.2",
+    "eslint": "^6.8.0",
+    "eslint-config-airbnb": "^18.1.0",
+    "eslint-config-react-app": "^5.2.1",
+    "eslint-plugin-flowtype": "^4.7.0",
+    "eslint-plugin-import": "^2.20.2",
+    "eslint-plugin-jest": "^23.9.0",
+    "eslint-plugin-jsx-a11y": "^6.2.3",
+    "eslint-plugin-react": "^7.19.0",
+    "eslint-plugin-react-hooks": "^4.0.0",
+    "jest": "^26.0.1",
     "mirador": "^3.0.0-beta.8",
     "nwb": "0.24.x",
     "react": "^16.13.1",
diff --git a/setupJest.js b/setupJest.js
new file mode 100644
index 0000000..7d1129a
--- /dev/null
+++ b/setupJest.js
@@ -0,0 +1,4 @@
+import Enzyme from 'enzyme'; // eslint-disable-line import/no-extraneous-dependencies
+import Adapter from 'enzyme-adapter-react-16'; // eslint-disable-line import/no-extraneous-dependencies
+
+Enzyme.configure({ adapter: new Adapter() });
diff --git a/src/index.js b/src/index.js
index 782b893..b2aab9a 100644
--- a/src/index.js
+++ b/src/index.js
@@ -1 +1 @@
- export miradorAnnotationPlugin from './plugins/miradorAnnotationPlugin';
+export miradorAnnotationPlugin from './plugins/miradorAnnotationPlugin';
diff --git a/src/plugins/miradorAnnotationPlugin.js b/src/plugins/miradorAnnotationPlugin.js
index f5dec87..a513e16 100644
--- a/src/plugins/miradorAnnotationPlugin.js
+++ b/src/plugins/miradorAnnotationPlugin.js
@@ -1,15 +1,17 @@
-import React, { Component } from 'react'
+import React, { Component } from 'react';
 
-class MiradorImageTools extends Component {
+/** */
+class MiradorAnnotation extends Component {
+  /** */
   render() {
     return (
       <div>HelloWorld</div>
-    )
+    );
   }
 }
 
 export default {
-  target: 'WindowTopMenu',
+  component: MiradorAnnotation,
   mode: 'add',
-  component: MiradorImageTools,
-}
+  target: 'WindowTopMenu',
+};
diff --git a/tests/.eslintrc b/tests/.eslintrc
deleted file mode 100644
index 7eeefc3..0000000
--- a/tests/.eslintrc
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "env": {
-    "mocha": true
-  }
-}
diff --git a/tests/index.test.js b/tests/index.test.js
deleted file mode 100644
index 0d00909..0000000
--- a/tests/index.test.js
+++ /dev/null
@@ -1,23 +0,0 @@
-import expect from 'expect'
-import React from 'react'
-import {render, unmountComponentAtNode} from 'react-dom'
-
-import Component from 'src/'
-
-describe('Component', () => {
-  let node
-
-  beforeEach(() => {
-    node = document.createElement('div')
-  })
-
-  afterEach(() => {
-    unmountComponentAtNode(node)
-  })
-
-  it('displays a welcome message', () => {
-    render(<Component/>, node, () => {
-      expect(node.innerHTML).toContain('Welcome to React components')
-    })
-  })
-})
-- 
GitLab