fix: measurementsAPI issue caused by production build (#842)

* ci: test docs-publish

* Specify to use prod

* Babel should transpile with env set by webpack

* in-progress

* in-progress

* Polyfill for ie11 and edge features

* Ditch polyfills w/ babel - we'll use a service for now

* Bump tools version; shift vtk.js up a layer

* Specify we shouldn't target older than IE 11

* ditch babel plugins that should be covered by preset-env

* Add a top level build demo command

* Let our babel config determine settings

* Same babel fixes as PWA

* Rebuild deps that don't satisfy our target

* Mini helper script for excluding all node_modules, except...

* Shift vtk.js dep up a layer

* Kill core-js

* Export in a node happy way

* Updated yarn lock

* Set NODE_ENV when launching anything w/ WebPack

* docs: updated FAQ

* docs: on browser support

* Add support for redux browser extension

* misc. small clean-up

* docs: Remove roadmap page; add browser-support to sidebar

* Formatting

* Remove roadmap links

* Formatting

* ci: Remove config syntax error

* Simplified bug report template

* update community request template

* Update question's template

* simplify build scripts

* specify new script names

* fix: for measurement api being pruned by minimizer in prod builds

* Use named exports

* Simplify config

* Let's not do so much heavy lifting for a dev-server build

* fix dev build

* Add hotkeys to demo

* fix: jest babel config and env specific configs

* Remove call to non-existant command

* Shift experimental proposal plugin up a layer

* Use `https`

* Try with reduced number of package exceptions

* Try to resolve cypress issue

* Try to fix cypress issue in CI

* Skip https
This commit is contained in:
Danny Brown 2019-09-04 13:53:13 -04:00 committed by GitHub
parent 25e7232660
commit 49d343941e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
63 changed files with 1773 additions and 813 deletions

6
.browserslistrc Normal file
View File

@ -0,0 +1,6 @@
# Browsers that we support
> 1%
IE 11
not dead
not op_mini all

View File

@ -279,7 +279,8 @@ workflows:
# Cypress job added by `cypress-io` orb # Cypress job added by `cypress-io` orb
- cypress/run: - cypress/run:
pre-steps: pre-steps:
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v' # Use yarn latest - run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
add wait-on' # Use yarn latest
yarn: true yarn: true
store_artifacts: true store_artifacts: true
start: yarn run dev start: yarn run dev
@ -303,7 +304,8 @@ workflows:
# Cypress job added by `cypress-io` orb # Cypress job added by `cypress-io` orb
- cypress/run: - cypress/run:
pre-steps: pre-steps:
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v' # Use yarn latest - run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
add wait-on' # Use yarn latest
yarn: true yarn: true
record: true record: true
store_artifacts: true store_artifacts: true

View File

@ -2,38 +2,32 @@
name: "\U0001F41B Bug report" name: "\U0001F41B Bug report"
about: Create a report to help us improve about: Create a report to help us improve
title: '' title: ''
labels: 'Bug Report :bug:' labels: 'Community: Report :bug:'
assignees: '' assignees: ''
--- ---
**Before Creating an issue** > **Before Creating an issue**
>
> - Are you running the latest version?
> - Are you reporting to the correct repository?
> - Did you search existing issues?
- Are you running the latest version? ## Bug Report
- Are you reporting to the correct repository?
- Did you search existing issues?
**Describe the bug** ### Describe the Bug
_A clear and concise description of what the bug is._ _A clear and concise description of what the bug is._
**Steps To Reproduce** ### What steps can we follow to reproduce the bug?
1. [First Step] 1. First step
2. [Second Step] 2. Second step
3. ... 3. ...
``` ```js
Please use code blocks to show formatted errors or code snippets Please use code blocks to show formatted errors or code snippets
``` ```
**Expected behavior** > :warning: Reports we cannot reproduce are at risk of being marked stale and
> closed. The more information you can provide, the more likely we are to look
_A clear and concise description of what you expected to happen._ > into and address your issue.
**Environment**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Additional context**

View File

@ -2,18 +2,24 @@
name: "\U0001F680 Feature request" name: "\U0001F680 Feature request"
about: Suggest an idea for this project about: Suggest an idea for this project
title: '' title: ''
labels: enhancement labels: 'Community: Request :hand:'
assignees: '' assignees: ''
--- ---
<!-- ## Awesome, do you have an idea? 😍 > :hand: Many people requests features. Tell us why yours is important to the
> community. How does it add value? Why _this feature_?
>
> Is your request very specific to your needs? Consider
> [contributing it](https://docs.ohif.org/contributing.html) yourself! Or reach
> out to a community member that offers
> [consulting services](https://docs.ohif.org/help.html#paid--commercial).
If you have a **feature request, improvement or idea**, check [our official roadmap](https://github.com/OHIF/react-viewerbase/projects) to see if it is already planned! --> ## Request
<!-- ### 👉 &nbsp; [Go to Roadmap](https://github.com/OHIF/react-viewerbase/projects) **What feature or change would you like to see made?**
If your feature request isn't there, continue with this issue and we can discuss ...
it 🤟 -->
Please include the reasons why you think your change should be made, and any **Why should we prioritize this feature?**
supporting evidence that helps us asses its value and priority.
...

View File

@ -2,13 +2,13 @@
name: "\U0001F917 Support Question" name: "\U0001F917 Support Question"
about: "I have a question \U0001F4AC" about: "I have a question \U0001F4AC"
title: '' title: ''
labels: question labels: 'Community: Question :question:'
assignees: '' assignees: ''
--- ---
We are a small team with limited resources. Your question is much more likely to > :hand: We are a small team with limited resources. Your question is much more
be answered if it is > likely to be answered if it is
[a good question](https://stackoverflow.com/help/how-to-ask) > [a good question](https://stackoverflow.com/help/how-to-ask)
**Description** **Description**

View File

@ -0,0 +1,22 @@
const path = require('path');
function excludeNodeModulesExcept(modules) {
var pathSep = path.sep;
if (pathSep == '\\')
// must be quoted for use in a regexp:
pathSep = '\\\\';
var moduleRegExps = modules.map(function(modName) {
return new RegExp('node_modules' + pathSep + modName);
});
return function(modulePath) {
if (/node_modules/.test(modulePath)) {
for (var i = 0; i < moduleRegExps.length; i++)
if (moduleRegExps[i].test(modulePath)) return false;
return true;
}
return false;
};
}
module.exports = excludeNodeModulesExcept;

View File

@ -0,0 +1,17 @@
const autoprefixer = require('autoprefixer');
const cssToJavaScript = {
test: /\.css$/,
use: [
'style-loader',
{ loader: 'css-loader', options: { importLoaders: 1 } },
{
loader: 'postcss-loader',
options: {
plugins: () => [autoprefixer('last 2 version', 'ie >= 11')],
},
},
],
};
module.exports = cssToJavaScript;

View File

@ -0,0 +1,10 @@
/**
* This is exclusively used by `vtk.js` to bundle glsl files.
*/
const loadShaders = {
test: /\.glsl$/i,
include: /vtk\.js[\/\\]Sources/,
loader: 'shader-loader',
};
module.exports = loadShaders;

View File

@ -0,0 +1,17 @@
/**
* This allows us to include web workers in our bundle, and VTK.js
* web workers in our bundle. While this increases bundle size, it
* cuts down on the number of includes we need for `script tag` usage.
*/
const loadWebWorkers = {
test: /\.worker\.js$/,
include: /vtk\.js[\/\\]Sources/,
use: [
{
loader: 'worker-loader',
options: { inline: true, fallback: false },
},
],
};
module.exports = loadWebWorkers;

View File

@ -0,0 +1,10 @@
const stylusToJavaScript = {
test: /\.styl$/,
use: [
{ loader: 'style-loader' }, // 3. Style nodes from JS Strings
{ loader: 'css-loader' }, // 2. CSS to CommonJS
{ loader: 'stylus-loader' }, // 1. Stylus to CSS
],
};
module.exports = stylusToJavaScript;

View File

@ -0,0 +1,39 @@
const excludeNodeModulesExcept = require('./../helpers/excludeNodeModulesExcept.js');
function transpileJavaScript(mode) {
const exclude =
mode === 'production'
? excludeNodeModulesExcept([
'vtk.js',
// 'dicomweb-client',
// https://github.com/react-dnd/react-dnd/blob/master/babel.config.js
'react-dnd',
// https://github.com/dcmjs-org/dcmjs/blob/master/.babelrc
// https://github.com/react-dnd/react-dnd/issues/1342
// 'dcmjs', // contains: loglevelnext
// https://github.com/shellscape/loglevelnext#browser-support
// 'loglevelnext',
// https://github.com/dcmjs-org/dicom-microscopy-viewer/issues/35
// 'dicom-microscopy-viewer',
// https://github.com/openlayers/openlayers#supported-browsers
// 'ol', --> Should be fine
])
: excludeNodeModulesExcept([]);
return {
test: /\.jsx?$/,
// These are packages that are not transpiled to our lowest supported
// JS version (currently ES5). Most of these leverage ES6+ features,
// that we need to transpile to a different syntax.
exclude,
loader: 'babel-loader',
options: {
// Find babel.config.js in monorepo root
// https://babeljs.io/docs/en/options#rootmode
rootMode: 'upward',
envName: mode,
},
};
}
module.exports = transpileJavaScript;

56
.webpack/webpack.base.js Normal file
View File

@ -0,0 +1,56 @@
const path = require('path');
const webpack = require('webpack');
const loadShadersRule = require('./rules/loadShaders.js');
const loadWebWorkersRule = require('./rules/loadWebWorkers.js');
const transpileJavaScriptRule = require('./rules/transpileJavaScript.js');
module.exports = (env, argv, { SRC_DIR, DIST_DIR }) => {
if (!process.env.NODE_ENV) {
throw new Error('process.env.NODE_ENV not set');
}
const mode =
process.env.NODE_ENV === 'production' ? 'production' : 'development';
return {
mode,
entry: {
app: `${SRC_DIR}/index.js`,
},
context: SRC_DIR,
module: {
rules: [
transpileJavaScriptRule(mode),
loadWebWorkersRule,
loadShadersRule,
],
},
resolve: {
// Which directories to search when resolving modules
modules: [
// Modules specific to this package
path.resolve(__dirname, '../node_modules'),
// Hoisted Yarn Workspace Modules
path.resolve(__dirname, '../../../node_modules'),
SRC_DIR,
],
// Attempt to resolve these extensions in order.
extensions: ['.js', '.jsx', '.json', '*'],
// symlinked resources are resolved to their real path, not their symlinked location
symlinks: true,
},
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
'process.env.APP_CONFIG': JSON.stringify(process.env.APP_CONFIG || ''),
'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || '/'),
}),
],
// Fix: https://github.com/webpack-contrib/css-loader/issues/447#issuecomment-285598881
// For issue in cornerstone-wado-image-loader
node: {
fs: 'empty',
},
};
};

View File

@ -1,101 +0,0 @@
const path = require('path');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
module.exports = (env, argv, { SRC_DIR, DIST_DIR }) => {
const mode =
process.env.NODE_ENV === 'production' ? 'production' : 'development';
return {
mode,
entry: {
bundle: `${SRC_DIR}/index.js`,
},
context: SRC_DIR,
module: {
rules: [
/**
* JSX
*/
{
test: /\.jsx?$/,
exclude: [/node_modules/, /packages\\extension/],
loader: 'babel-loader',
options: {
// Find babel.config.js in monorepo root
// https://babeljs.io/docs/en/options#rootmode
rootMode: 'upward',
envName: mode,
presets: [
[
'@babel/preset-env',
{
// Do not transform ES6 modules to another format.
// Webpack will take care of that.
modules: false,
targets: {
ie: '11',
},
// https://babeljs.io/docs/en/babel-preset-env#usebuiltins
useBuiltIns: 'usage',
// https://babeljs.io/docs/en/babel-preset-env#corejs
corejs: 3,
},
],
],
},
},
/**
* This allows us to include web workers in our bundle, and VTK.js
* web workers in our bundle. While this increases bundle size, it
* cuts down on the number of includes we need for `script tag` usage.
*/
{
test: /\.worker\.js$/,
include: /vtk\.js[\/\\]Sources/,
use: [
{
loader: 'worker-loader',
options: { inline: true, fallback: false },
},
],
},
/**
* This is exclusively used by `vtk.js` to bundle glsl files.
*/
{
test: /\.glsl$/i,
include: /vtk\.js[\/\\]Sources/,
loader: 'shader-loader',
},
],
},
resolve: {
// Which directories to search when resolving modules
modules: [
// Modules specific to this package
path.resolve(__dirname, '../node_modules'),
// Hoisted Yarn Workspace Modules
path.resolve(__dirname, '../../../node_modules'),
SRC_DIR,
],
// Attempt to resolve these extensions in order.
extensions: ['.js', '.jsx', '.json', '*'],
// symlinked resources are resolved to their real path, not their symlinked location
symlinks: true,
},
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
'process.env.APP_CONFIG': JSON.stringify(process.env.APP_CONFIG || ''),
'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || '/'),
}),
],
// Fix: https://github.com/webpack-contrib/css-loader/issues/447#issuecomment-285598881
// For issue in cornerstone-wado-image-loader
node: {
fs: 'empty',
},
};
};

View File

@ -1,131 +0,0 @@
const path = require('path');
const webpack = require('webpack');
const autoprefixer = require('autoprefixer');
module.exports = (env, argv, { SRC_DIR, DIST_DIR }) => {
const mode =
process.env.NODE_ENV === 'production' ? 'production' : 'development';
return {
mode,
entry: {
bundle: `${SRC_DIR}/index.js`,
},
context: SRC_DIR,
module: {
rules: [
/**
* JSX
*/
{
test: /\.jsx?$/,
exclude: [/node_modules/, /packages\\extension/],
loader: 'babel-loader',
options: {
// Find babel.config.js in monorepo root
// https://babeljs.io/docs/en/options#rootmode
rootMode: 'upward',
envName: mode,
presets: [
[
'@babel/preset-env',
{
// Do not transform ES6 modules to another format.
// Webpack will take care of that.
modules: false,
targets: {
ie: '11',
},
// https://babeljs.io/docs/en/babel-preset-env#usebuiltins
useBuiltIns: 'usage',
// https://babeljs.io/docs/en/babel-preset-env#corejs
corejs: 3,
},
],
],
},
},
/**
* Stylus to CSS
* CSS to CommonJS
* Style nodes from JS Strings
*/
{
test: /\.styl$/,
use: [
{ loader: 'style-loader' },
{ loader: 'css-loader' },
{ loader: 'stylus-loader' },
],
},
{
test: /\.css$/,
use: [
'style-loader',
// ExtractCssChunks.loader,
{ loader: 'css-loader', options: { importLoaders: 1 } },
{
loader: 'postcss-loader',
options: {
config: {
path: './postcss.config.js',
},
plugins: () => [autoprefixer('last 2 version', 'ie >= 11')],
},
},
],
},
/**
* This allows us to include web workers in our bundle, and VTK.js
* web workers in our bundle. While this increases bundle size, it
* cuts down on the number of includes we need for `script tag` usage.
*/
{
test: /\.worker\.js$/,
include: /vtk\.js[\/\\]Sources/,
use: [
{
loader: 'worker-loader',
options: { inline: true, fallback: false },
},
],
},
/**
* This is exclusively used by `vtk.js` to bundle glsl files.
*/
{
test: /\.glsl$/i,
include: /vtk\.js[\/\\]Sources/,
loader: 'shader-loader',
},
],
},
resolve: {
// Which directories to search when resolving modules
modules: [
// Modules specific to this package
path.resolve(__dirname, '../node_modules'),
// Hoisted Yarn Workspace Modules
path.resolve(__dirname, '../../../node_modules'),
SRC_DIR,
],
// Attempt to resolve these extensions in order.
extensions: ['.js', '.jsx', '.json', '*'],
// symlinked resources are resolved to their real path, not their symlinked location
symlinks: true,
},
plugins: [
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
'process.env.DEBUG': JSON.stringify(process.env.DEBUG),
'process.env.APP_CONFIG': JSON.stringify(process.env.APP_CONFIG || ''),
'process.env.PUBLIC_URL': JSON.stringify(process.env.PUBLIC_URL || '/'),
}),
],
// Fix: https://github.com/webpack-contrib/css-loader/issues/447#issuecomment-285598881
// For issue in cornerstone-wado-image-loader
node: {
fs: 'empty',
},
};
};

View File

@ -0,0 +1,18 @@
const webpackBase = require('./webpack.base.js');
const cssToJavaScriptRule = require('./rules/cssToJavaScript.js');
const stylusToJavaScriptRule = require('./rules/stylusToJavaScript.js');
/**
* WebPack configuration for CommonJS Bundles. Extends rules of BaseConfig by making
* sure we're bundling styles and other files that would normally be split in a
* PWA.
*/
module.exports = (env, argv, { SRC_DIR, DIST_DIR }) => {
const baseConfig = webpackBase(env, argv, { SRC_DIR, DIST_DIR });
return merge(baseConfig, {
module: {
rules: [cssToJavaScriptRule, stylusToJavaScriptRule],
},
});
};

View File

@ -1,57 +1,63 @@
const aliases = require('./aliases.config'); const aliases = require('./aliases.config');
const path = require('path'); const path = require('path');
// https://babeljs.io/docs/en/options#babelrcroots
module.exports = { module.exports = {
// Also specified in .webpack/webpack.common.js
// https://github.com/zloirock/core-js/blob/master/docs/2019-03-19-core-js-3-babel-and-a-look-into-the-future.md
presets: [
[
'@babel/preset-env',
{
targets: {
ie: '11',
},
// https://babeljs.io/docs/en/babel-preset-env#usebuiltins
useBuiltIns: 'usage',
// https://babeljs.io/docs/en/babel-preset-env#corejs
corejs: 3,
},
],
'@babel/preset-react',
],
// https://babeljs.io/docs/en/options#babelrcroots
babelrcRoots: ['./platform/*', './extensions/*'], babelrcRoots: ['./platform/*', './extensions/*'],
plugins: [ plugins: ['inline-react-svg', '@babel/plugin-proposal-class-properties'],
'react-hot-loader/babel',
'inline-react-svg',
'@babel/plugin-proposal-class-properties',
'@babel/plugin-proposal-object-rest-spread',
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-transform-regenerator',
'@babel/plugin-transform-runtime',
[
'module-resolver',
{
// https://github.com/tleunen/babel-plugin-module-resolver/issues/338
// There seem to be a bug with module-resolver with a mono-repo setup:
// It doesn't resolve paths correctly when using root/alias combo, so we
// use this function instead.
resolvePath(sourcePath, currentFile, opts) {
// This will return undefined if aliases has no key for the sourcePath,
// in which case module-resolver will fallback on its default behaviour.
return aliases[sourcePath];
},
},
],
],
env: { env: {
debug: { test: {
sourceMaps: 'inline', presets: [
retainLines: true, [
// TODO: https://babeljs.io/blog/2019/03/19/7.4.0#migration-from-core-js-2
'@babel/preset-env',
{
modules: 'commonjs',
debug: false,
},
],
'@babel/preset-react',
],
plugins: [
'@babel/plugin-proposal-object-rest-spread',
'@babel/plugin-syntax-dynamic-import',
'@babel/plugin-transform-regenerator',
'@babel/plugin-transform-runtime',
],
}, },
build: { production: {
presets: [
// WebPack handles ES6 --> Target Syntax
['@babel/preset-env', { modules: false }],
'@babel/preset-react',
],
ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'],
},
development: {
presets: [
// WebPack handles ES6 --> Target Syntax
['@babel/preset-env', { modules: false }],
'@babel/preset-react',
],
plugins: ['react-hot-loader/babel'],
ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'], ignore: ['**/*.test.jsx', '**/*.test.js', '__snapshots__', '__tests__'],
}, },
}, },
// ignore: ["node_modules"]
}; };
// TODO: Plugins; Aliases
// We don't currently use aliases, but this is a nice snippet that would help
// [
// 'module-resolver',
// {
// // https://github.com/tleunen/babel-plugin-module-resolver/issues/338
// // There seem to be a bug with module-resolver with a mono-repo setup:
// // It doesn't resolve paths correctly when using root/alias combo, so we
// // use this function instead.
// resolvePath(sourcePath, currentFile, opts) {
// // This will return undefined if aliases has no key for the sourcePath,
// // in which case module-resolver will fallback on its default behaviour.
// return aliases[sourcePath];
// },
// },
// ],

View File

@ -45,7 +45,7 @@
--- ---
- [Contributing](contributing.md)
- [FAQ](frequently-asked-questions.md) - [FAQ](frequently-asked-questions.md)
- [Roadmap](roadmap.md) - [Contributing](contributing.md)
- [Browser Support](browser-support.md)
- [Help](help.md) - [Help](help.md)

View File

@ -0,0 +1,47 @@
# Browser Support
The browsers that we support are specified in the `.browserlistrc` file located
in the `platform/viewer` project. While we leverage the latest language features
when writing code, we rely on `babel` to _transpile_ our code so that it can run
in the browsers that we support.
## In Practice
The OHIF Viewer is capable of _running_ on:
- IE 11
- FireFox
- Chrome
- Safari
- Edge
However, we do not have the resources to adequately test and maintain bug free
functionality across all of these. In order to push web based medical imaging
forward, we focus our development efforts on recent version of modern evergreen
browsers.
Our support of older browsers equates to our willingness to review PRs for bug
fixes, and target their minimum JS support whenever possible.
### Polyfills
> A polyfill, or polyfiller, is a piece of code (or plugin) that provides the
> technology that you, the developer, expect the browser to provide natively.
An example of a polyfill is that you expect `Array.prototype.filter` to exist,
but for some reason, the browser that's being used has not implemented that
language feature yet. Our earlier transpilation will rectify _syntax_
discrepencies, but unimplemented features require a "temporary" implementation.
That's where polyfills step in.
You can utilize a service like [polyfill.io](https://polyfill.io/v3/) to
auto-detect and apply polyfills as needed, or you can update the PWA build to
include polyfill's in your bundle by incorporating [core-js][core-js]
<!--
Links
-->
<!-- prettier-ignore-start -->
[core-js]: https://github.com/zloirock/core-js/blob/master/docs/2019-03-19-core-js-3-babel-and-a-look-into-the-future.md
<!-- prettier-ignore-end -->

View File

@ -35,10 +35,10 @@ Images can even be transcoded on the fly if this is desired.
- Choose the "Web Application" type - Choose the "Web Application" type
- Set up an - Set up an
[OAuth 2.0 Client ID](https://support.google.com/cloud/answer/6158849?hl=en) [OAuth 2.0 Client ID](https://support.google.com/cloud/answer/6158849?hl=en)
- Add your domain (e.g. `http://localhost:5000`) to Authorized JavaScript - Add your domain (e.g. `http://localhost:3000`) to Authorized JavaScript
origins. origins.
- Add your domain, plus `callback` (e.g. - Add your domain, plus `callback` (e.g. `http://localhost:3000/callback`) to
`http://localhost:5000/callback`) to Authorized Redirect URIs. Authorized Redirect URIs.
- Save your Client ID for later. - Save your Client ID for later.
- (Optional): Enable Public Datasets that are being hosted by Google: - (Optional): Enable Public Datasets that are being hosted by Google:
@ -46,8 +46,8 @@ Images can even be transcoded on the fly if this is desired.
## Run the viewer with your OAuth Client ID ## Run the viewer with your OAuth Client ID
1. Open the `config/google.js` file and change `YOURCLIENTID` to 1. Open the `config/google.js` file and change `YOURCLIENTID` to your Client ID
your Client ID value. value.
1. Run the OHIF Viewer using the config/google.js configuration file 1. Run the OHIF Viewer using the config/google.js configuration file
```bash ```bash
@ -58,9 +58,9 @@ APP_CONFIG=config/google.js yarn run dev
## Running via Docker ## Running via Docker
The OHIF Viewer Docker container can be connected to Google Cloud The OHIF Viewer Docker container can be connected to Google Cloud Healthcare by
Healthcare by providing a Client ID at runtime. This is a very simple providing a Client ID at runtime. This is a very simple method to get up and
method to get up and running. running.
1. Install Docker (https://www.docker.com/) 1. Install Docker (https://www.docker.com/)
1. Run the Docker container, providing a Client ID as an environment variable. 1. Run the Docker container, providing a Client ID as an environment variable.

View File

@ -60,8 +60,8 @@ Compiled successfully!
You can now view ohif-viewer in the browser. You can now view ohif-viewer in the browser.
Local: http://localhost:5000/ Local: http://localhost:3000/
On Your Network: http://10.74.20.83:5000/ On Your Network: http://10.74.20.83:3000/
Note that the development build is not optimized. Note that the development build is not optimized.
To create a production build, use yarn build. To create a production build, use yarn build.

View File

@ -1,36 +1,18 @@
# Frequently Asked Questions # Frequently Asked Questions
## How do I file a bug? ## Index
We accept and triage bug reports through Github primarily. - [Report a bug][report-bug]
- [Request a feature][new-feature]
- [Commercial Support & Consulting][commercial-support]
- [Academic collaborations][academic]
- [FDA Clearance or CE Marking][fda-clearance]
- [HIPAA Compliance][hipaa]
- [Create a Github account](https://github.com/join) ### How do I report a bug?
- Search the current [Issue List](https://github.com/OHIF/Viewers/issues) to
ensure you are not creating a duplicate issue.
- If your issue already exists, post a comment to show us that this issue also
affects you.
- If no prior issue exists,
[Create a New Issue](https://github.com/OHIF/Viewers/issues/new) on the
repository.
Some tips for filing a new issue: Navigate to our [GitHub Repository][new-issue], and submit a new bug report.
Follow the steps outlined in the [Bug Report Template][bug-report-template].
- **Make sure your issue is reproducible**: If we try to reproduce your issue
given your provided steps and we cannot reproduce it, we will not be able to
fix it. _Nobody wants to spend time guessing how to reproduce your issue!_
Before filing, please reproduce your issue more than once and clearly describe
the steps taken.
- **If you are reporting a user interface issue, provide screenshots**: A
picture is worth a thousand words. If your issue concerns the UI, screenshots
will help us identify the issue dramatically faster since it can be extremely
challenging to describe UI bugs with text. _You should still clearly describe
the steps that you took to produce the issue_.
- **Include platform & environment**: Your operating system, web browser, and
web browser version are highly relevant for many bugs. Please provide these
with all bug reports.
- **Include expected and actual result**: Tell us what you expected to happen,
and what actually happened. If you don't do this, we might not consider it a
bug.
### How can I request a new feature? ### How can I request a new feature?
@ -39,7 +21,8 @@ to communicate this to the community. If your requested feature is on the
roadmap, then it will most likely be built at some point. If it is not, you are roadmap, then it will most likely be built at some point. If it is not, you are
welcome to build it yourself and [contribute it](contributing.md). If you have welcome to build it yourself and [contribute it](contributing.md). If you have
resources and would like to fund the development of a feature, please resources and would like to fund the development of a feature, please
[contact us](http://www.ohif.org). [contact us](http://www.ohif.org) or work with community members that offer
[consulting services][commercial-support].
### Who should I contact about Academic Collaborations? ### Who should I contact about Academic Collaborations?
@ -49,7 +32,7 @@ collaborators. We are always happy to hear about new groups interested in using
the OHIF framework, and may be able to provide development support if the the OHIF framework, and may be able to provide development support if the
proposed collaboration has an impact on cancer research. proposed collaboration has an impact on cancer research.
### Do you offer commercial support? ### Does OHIF offer commercial support?
The Open Health Imaging Foundation does not offer commercial support, however, The Open Health Imaging Foundation does not offer commercial support, however,
some community members do offer consulting services. The following contacts may some community members do offer consulting services. The following contacts may
@ -60,36 +43,39 @@ be useful:
**Please file a Pull Request if you wish to add your name or organization to **Please file a Pull Request if you wish to add your name or organization to
this list.** this list.**
### I emailed my question to you directly and you did not respond. Why not? ### Does The OHIF Viewer have [510(k) Clearance][501k-clearance] from the U.S. F.D.A or [CE Marking][ce-marking] from the European Commission?
Emailing developers directly is not a shortcut to faster support. Please file **NO.** The OHIF Viewer is **NOT** F.D.A. cleared or CE Marked. It is the users
your issues and questions on Github so that everyone can benefit from the responsibility to ensure compliance with applicable rules and regulations. The
discussion and solutions.
### Do your Viewers have [510(k) Clearance][501k-clearance] from the U.S. F.D.A or [CE Marking][ce-marking] from the European Commission?
**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer, **NOT** F.D.A.
cleared or CE Marked. It is the users responsibility to ensure compliance with
applicable rules and regulations. The
[License](https://github.com/OHIF/Viewers/blob/master/LICENSE) for the OHIF [License](https://github.com/OHIF/Viewers/blob/master/LICENSE) for the OHIF
Framework does not prevent your company or group from seeking F.D.A. clearance Platform does not prevent your company or group from seeking F.D.A. clearance
for a product built using the framework. for a product built using the platform.
If you have gone this route (or are going there), please let us know because we If you have gone this route (or are going there), please let us know because we
would be interested to hear about your experience. would be interested to hear about your experience.
### Are your Viewers [HIPAA][hipaa] Compliant? ### Is The OHIF Viewer [HIPAA][hipaa] Compliant?
**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer **DO NOT** **NO.** The OHIF Viewer **DOES NOT** fulfill all of the criteria to become HIPAA
fulfill all of the criteria to become HIPAA Compliant. It is the users Compliant. It is the users responsibility to ensure compliance with applicable
responsibility to ensure compliance with applicable rules and regulations. rules and regulations.
<!-- <!--
Links Links
--> -->
<!-- prettier-ignore-start --> <!-- prettier-ignore-start -->
<!-- INDEX -->
[report-bug]: #how-do-i-report-a-bug
[new-feature]: #how-can-i-request-a-new-feature
[commercial-support]: #does-ohif-offer-commercial-support
[academic]: #who-should-i-contact-about-academic-collaborations
[fda-clearance]: #does-the-ohif-viewer-have-510k-clearance-from-the-us-fda-or-ce-marking-from-the-european-commission
[hipaa]: #is-the-ohif-viewer-hipaa-compliant
<!-- OTHER -->
[501k-clearance]: https://www.fda.gov/MedicalDevices/DeviceRegulationandGuidance/HowtoMarketYourDevice/PremarketSubmissions/PremarketNotification510k/ [501k-clearance]: https://www.fda.gov/MedicalDevices/DeviceRegulationandGuidance/HowtoMarketYourDevice/PremarketSubmissions/PremarketNotification510k/
[ce-marking]: https://ec.europa.eu/growth/single-market/ce-marking_en [ce-marking]: https://ec.europa.eu/growth/single-market/ce-marking_en
[hipaa]: https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act [hipaa]: https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act
[new-issue]: https://github.com/OHIF/Viewers/issues/new/choose
[bug-report-template]: https://github.com/OHIF/Viewers/issues/new?assignees=&labels=Bug+Report+%3Abug%3A&template=---bug-report.md&title=
<!-- prettier-ignore-end --> <!-- prettier-ignore-end -->

View File

@ -1,25 +0,0 @@
# Roadmap
If you want to know what's planned for the very near future,
[check out our roadmap](https://ohif.canny.io/). The best way to influence when
and what is worked on is to contribute to the conversation by creating GitHub
issues, and contributing code through pull requests. OHIF's high level
priorities for the near future are:
- Feature parity with version 1
- Extension and configuration improvements with key integration partners
- Continued Developer Experience Improvements
- Segmentation Tools, and improved VTK.js support
More granular information will make it's way to the backlog as these items
become scoped for development by core maintainers.
> Don't hesitate to ask questions, propose features, or create pull requests.
> We're here, we're listening, and we're ready to build the best open source
> medical imaging viewer on the web.
### Roadmap Generously Powered by Canny.io
<a href="https://ohif.canny.io/">
<img height="30" src="assets/img/canny-full.png" />
</a>

View File

@ -1,47 +1,93 @@
# Frequently Asked Questions - General # Frequently Asked Questions - General
### How do I file a bug? ### How do I file a bug?
We accept and triage bug reports through Github primarily. We accept and triage bug reports through Github primarily.
1. [Create a Github account](https://github.com/join) 1. [Create a Github account](https://github.com/join)
2. Search the current [Issue List](https://github.com/OHIF/Viewers/issues) to ensure you are not creating a duplicate issue. 2. Search the current [Issue List](https://github.com/OHIF/Viewers/issues) to
ensure you are not creating a duplicate issue.
If your issue already exists, post a comment to show us that this issue also affects you. If your issue already exists, post a comment to show us that this issue also
affects you.
3. If no prior issue exists, [Create a New Issue](https://github.com/OHIF/Viewers/issues/new) on the repository. 3. If no prior issue exists,
[Create a New Issue](https://github.com/OHIF/Viewers/issues/new) on the
repository.
Some tips for filing a new issue: Some tips for filing a new issue:
* **Make sure your issue is reproducible**: If we try to reproduce your issue given your provided steps and we cannot reproduce it, we will not be able to fix it. *Nobody wants to spend time guessing how to reproduce your issue!* Before filing, please reproduce your issue more than once and clearly describe the steps taken.
* **If you are reporting a user interface issue, provide screenshots**: A picture is worth a thousand words. If your issue concerns the UI, screenshots will help us identify the issue dramatically faster since it can be extremely challenging to describe UI bugs with text. *You should still clearly describe the steps that you took to produce the issue*. - **Make sure your issue is reproducible**: If we try to reproduce your issue
* **Include platform & environment**: Your operating system, web browser, and web browser version are highly relevant for many bugs. Please provide these with all bug reports. given your provided steps and we cannot reproduce it, we will not be able to
* **Include expected and actual result**: Tell us what you expected to happen, and what actually happened. If you don't do this, we might not consider it a bug. fix it. _Nobody wants to spend time guessing how to reproduce your issue!_
Before filing, please reproduce your issue more than once and clearly describe
the steps taken.
- **If you are reporting a user interface issue, provide screenshots**: A
picture is worth a thousand words. If your issue concerns the UI, screenshots
will help us identify the issue dramatically faster since it can be extremely
challenging to describe UI bugs with text. _You should still clearly describe
the steps that you took to produce the issue_.
- **Include platform & environment**: Your operating system, web browser, and
web browser version are highly relevant for many bugs. Please provide these
with all bug reports.
- **Include expected and actual result**: Tell us what you expected to happen,
and what actually happened. If you don't do this, we might not consider it a
bug.
### How can I request a new feature? ### How can I request a new feature?
At the moment we are in the process of defining our roadmap and will do our best to communicate this to the community. If your requested feature is on the roadmap, then it will most likely be built at some point. If it is not, you are welcome to build it yourself and [contribute it](../contributing.md). If you have resources and would like to fund the development of a feature, please [contact us](http://www.ohif.org). At the moment we are in the process of defining our roadmap and will do our best
to communicate this to the community. If your requested feature is on the
roadmap, then it will most likely be built at some point. If it is not, you are
welcome to build it yourself and [contribute it](../contributing.md). If you
have resources and would like to fund the development of a feature, please
[contact us](http://www.ohif.org).
### Who should I contact about Academic Collaborations? ### Who should I contact about Academic Collaborations?
[Gordon J. Harris](http://www.dfhcc.harvard.edu/insider/member-detail/member/gordon-j-harris-phd/) at Massachusetts General Hospital is the primary contact for any academic collaborators. We are always happy to hear about new groups interested in using the OHIF framework, and may be able to provide development support if the proposed collaboration has an impact on cancer research. [Gordon J. Harris](http://www.dfhcc.harvard.edu/insider/member-detail/member/gordon-j-harris-phd/)
at Massachusetts General Hospital is the primary contact for any academic
collaborators. We are always happy to hear about new groups interested in using
the OHIF framework, and may be able to provide development support if the
proposed collaboration has an impact on cancer research.
### Do you offer commercial support? ### Do you offer commercial support?
The Open Health Imaging Foundation does not offer commercial support, however, some community members do offer consulting services. The following contacts may be useful: The Open Health Imaging Foundation does not offer commercial support, however,
some community members do offer consulting services. The following contacts may
be useful:
* Rob Lewis ([Radical Imaging](http://radicalimaging.com/)) - Rob Lewis ([Radical Imaging](http://radicalimaging.com/))
**Please file a Pull Request if you wish to add your name or organization to this list.** **Please file a Pull Request if you wish to add your name or organization to
this list.**
### I emailed my question to you directly and you did not respond. Why not? ### I emailed my question to you directly and you did not respond. Why not?
Emailing developers directly is not a shortcut to faster support. Please file your issues and questions on Github so that everyone can benefit from the discussion and solutions. Emailing developers directly is not a shortcut to faster support. Please file
your issues and questions on Github so that everyone can benefit from the
discussion and solutions.
### Do your Viewers have [510(k) Clearance](https://www.fda.gov/MedicalDevices/DeviceRegulationandGuidance/HowtoMarketYourDevice/PremarketSubmissions/PremarketNotification510k/) from the U.S. F.D.A or [CE Marking](https://ec.europa.eu/growth/single-market/ce-marking_en) from the European Commission? ### Do your Viewers have [510(k) Clearance](https://www.fda.gov/MedicalDevices/DeviceRegulationandGuidance/HowtoMarketYourDevice/PremarketSubmissions/PremarketNotification510k/) from the U.S. F.D.A or [CE Marking](https://ec.europa.eu/growth/single-market/ce-marking_en) from the European Commission?
**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer, **NOT** F.D.A. cleared or CE Marked. It is the users responsibility to ensure compliance with applicable rules and regulations. The [License](https://github.com/OHIF/Viewers/blob/master/LICENSE) for the OHIF Framework does not prevent your company or group from seeking F.D.A. clearance for a product built using the framework. **NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer, **NOT** F.D.A.
cleared or CE Marked. It is the users responsibility to ensure compliance with
applicable rules and regulations. The
[License](https://github.com/OHIF/Viewers/blob/master/LICENSE) for the OHIF
Framework does not prevent your company or group from seeking F.D.A. clearance
for a product built using the framework.
If you have gone this route (or are going there), please let us know because we would be interested to hear about your experience. If you have gone this route (or are going there), please let us know because we
would be interested to hear about your experience.
### Are your Viewers [HIPAA](https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act) Compliant? ### Are your Viewers [HIPAA](https://en.wikipedia.org/wiki/Health_Insurance_Portability_and_Accountability_Act) Compliant?
**NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer **DO NOT** fulfill all of the criteria to become HIPAA Compliant. It is the users responsibility to ensure compliance with applicable rules and regulations. **NO.** The OHIF Viewer, Lesion Tracker, and Standalone Viewer **DO NOT**
fulfill all of the criteria to become HIPAA Compliant. It is the users
responsibility to ensure compliance with applicable rules and regulations.
The Lesion Tracker application demonstrates some available components and features (e.g. [Audit Trail](../lesion-tracker/audit-trail.md), automatic logoff, and unique user identification for [User Accounts](../lesion-tracker/user-accounts.md)) which could be used by third parties seeking HIPAA compliance. The Lesion Tracker application demonstrates some available components and
features (e.g. [Audit Trail](../lesion-tracker/audit-trail.md), automatic
logoff, and unique user identification for
[User Accounts](../lesion-tracker/user-accounts.md)) which could be used by
third parties seeking HIPAA compliance.

View File

@ -1,16 +1,8 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
});
}; };

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -1,16 +1,8 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
});
}; };

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -1,16 +1,8 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
});
}; };

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -1,16 +1,8 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
});
}; };

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -1,16 +1,8 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
});
}; };

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -48,8 +48,7 @@
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "^7.5.5", "@babel/runtime": "^7.5.5",
"react-vtkjs-viewport": "0.0.11", "react-vtkjs-viewport": "0.0.11"
"vtk.js": "^9.5.0"
}, },
"devDependencies": { "devDependencies": {
"@ohif/core": "^0.50.3", "@ohif/core": "^0.50.3",

View File

@ -1,4 +1,4 @@
import { redux } from "@ohif/core"; import { redux } from '@ohif/core';
const { setViewportLayoutAndData } = redux.actions; const { setViewportLayoutAndData } = redux.actions;

View File

@ -17,13 +17,7 @@ yarn add --dev -W package-name
project project
- Remove all-contributors bot; install CLI per project and add per project - Remove all-contributors bot; install CLI per project and add per project
commands commands
- Verify all have "dev:package-name" command
- Should we include `package.json` and `src` as output? (build from ESM)
- Should we remove `dev:package-name` commands and suggest navigating to
package root?
- Fix broken peer dependencies? - Fix broken peer dependencies?
- Lingering core-js resolution issues when building for Viewer PWA (from project
directory)
## ORBS ## ORBS
@ -35,20 +29,6 @@ yarn add --dev -W package-name
Debug Note: `http://localhost:3000/webpack-dev-server` Debug Note: `http://localhost:3000/webpack-dev-server`
NOTES:
# bumps pre-release version of all packages if any changes
- `npx lerna version prerelease`
# Releases based on package.json differences from NPM
- `npx lerna publish from-package --dist-tag canary`
Use Env options to set config:
- https://webpack.js.org/api/cli/#environment-options
## Bundling ## Bundling
- Extensions must bundle all assets into a single file for UMD - Extensions must bundle all assets into a single file for UMD

View File

@ -16,12 +16,12 @@
"dev:project": ".scripts/dev.sh", "dev:project": ".scripts/dev.sh",
"build": "lerna run build:viewer --stream", "build": "lerna run build:viewer --stream",
"build:ci": "lerna run build:viewer:ci --stream", "build:ci": "lerna run build:viewer:ci --stream",
"build:demo": "lerna run build:viewer:demo --stream",
"build:package": "lerna run build:viewer:package --stream", "build:package": "lerna run build:viewer:package --stream",
"build:package-all": "lerna run build:package --parallel --stream", "build:package-all": "lerna run build:package --parallel --stream",
"test": "yarn run test:unit && yarn run test:e2e:ci", "test": "yarn run test:unit",
"test:unit": "jest --collectCoverage", "test:unit": "jest --collectCoverage",
"test:unit:ci": "lerna run test:unit:ci --parallel --stream", "test:unit:ci": "lerna run test:unit:ci --parallel --stream",
"test:e2e:ci": "cd platform/viewer && yarn run test:e2e:ci",
"see-changed": "lerna changed", "see-changed": "lerna changed",
"docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh", "docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh",
"release": "yarn run lerna:version && yarn run lerna:publish", "release": "yarn run lerna:version && yarn run lerna:publish",
@ -35,8 +35,10 @@
"devDependencies": { "devDependencies": {
"@babel/core": "^7.5.0", "@babel/core": "^7.5.0",
"@babel/plugin-proposal-class-properties": "^7.5.0", "@babel/plugin-proposal-class-properties": "^7.5.0",
"@babel/plugin-proposal-object-rest-spread": "^7.5.0", "@babel/plugin-proposal-object-rest-spread": "^7.5.5",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-transform-arrow-functions": "^7.2.0",
"@babel/plugin-transform-regenerator": "^7.4.5",
"@babel/plugin-transform-runtime": "^7.5.0", "@babel/plugin-transform-runtime": "^7.5.0",
"@babel/preset-env": "^7.5.0", "@babel/preset-env": "^7.5.0",
"@babel/preset-react": "^7.0.0", "@babel/preset-react": "^7.0.0",
@ -91,11 +93,5 @@
}, },
"resolutions": { "resolutions": {
"**/@babel/runtime": "7.5.5" "**/@babel/runtime": "7.5.5"
}, }
"browserslist": [
">0.2%",
"not dead",
"not ie <= 11",
"not op_mini all"
]
} }

View File

@ -0,0 +1,8 @@
const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => {
return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
};

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -5,9 +5,10 @@ import getDescription from '../lib/getDescription';
import getImageIdForImagePath from '../lib/getImageIdForImagePath'; import getImageIdForImagePath from '../lib/getImageIdForImagePath';
import guid from '../../utils/guid'; import guid from '../../utils/guid';
import studyMetadataManager from '../../utils/studyMetadataManager'; import studyMetadataManager from '../../utils/studyMetadataManager';
import { measurementApiDefaultConfig } from './../configuration.js';
const configuration = { const configuration = {
measurementTools: [], ...measurementApiDefaultConfig,
}; };
export default class MeasurementApi { export default class MeasurementApi {

View File

@ -1,6 +1,9 @@
import log from '../../log'; import log from '../../log';
import { timepointApiDefaultConfig } from './../configuration.js';
const configuration = {}; const configuration = {
...timepointApiDefaultConfig,
};
const TIMEPOINT_TYPE_NAMES = { const TIMEPOINT_TYPE_NAMES = {
prebaseline: 'Pre-Baseline', prebaseline: 'Pre-Baseline',

View File

@ -1,4 +1,3 @@
import { TimepointApi, MeasurementApi } from './classes';
import { allTools } from './toolGroups/allTools'; import { allTools } from './toolGroups/allTools';
import { import {
retrieveMeasurements, retrieveMeasurements,
@ -10,7 +9,7 @@ import {
disassociateStudy, disassociateStudy,
} from './dataExchange'; } from './dataExchange';
MeasurementApi.setConfiguration({ const measurementApiDefaultConfig = {
measurementTools: [allTools], measurementTools: [allTools],
newLesions: [ newLesions: [
{ {
@ -28,9 +27,9 @@ MeasurementApi.setConfiguration({
retrieve: retrieveMeasurements, retrieve: retrieveMeasurements,
store: storeMeasurements, store: storeMeasurements,
}, },
}); };
TimepointApi.setConfiguration({ const timepointApiDefaultConfig = {
dataExchange: { dataExchange: {
retrieve: retrieveTimepoints, retrieve: retrieveTimepoints,
store: storeTimepoints, store: storeTimepoints,
@ -38,4 +37,6 @@ TimepointApi.setConfiguration({
update: updateTimepoint, update: updateTimepoint,
disassociate: disassociateStudy, disassociate: disassociateStudy,
}, },
}); };
export { measurementApiDefaultConfig, timepointApiDefaultConfig };

View File

@ -1,9 +1,6 @@
import './configuration';
import * as tools from './tools'; import * as tools from './tools';
import { MeasurementApi, TimepointApi } from './classes'; import { MeasurementApi, TimepointApi } from './classes';
import { ConformanceCriteria } from './conformance'; import { ConformanceCriteria } from './conformance';
import MeasurementHandlers from './measurementHandlers'; import MeasurementHandlers from './measurementHandlers';
import getDescription from './lib/getDescription'; import getDescription from './lib/getDescription';

View File

@ -1,16 +1,8 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); return webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
});
}; };

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -1,6 +1,6 @@
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const path = require('path'); const path = require('path');
const webpackCommon = require('./../../../.webpack/webpack.common.js'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const pkg = require('./../package.json'); const pkg = require('./../package.json');
const ROOT_DIR = path.join(__dirname, './..'); const ROOT_DIR = path.join(__dirname, './..');
@ -11,8 +11,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
devtool: 'source-map', devtool: 'source-map',
stats: { stats: {
colors: true, colors: true,

View File

@ -0,0 +1,7 @@
# Browsers that we support
> 1%
IE 11
not IE < 11
not dead
not op_mini all

View File

@ -1,74 +0,0 @@
/**
* Notice that we're not extracting CSS or generating a service-worker. This
* may create a slightly inconsistent experience, but should allow for faster/
* easier development.
*
* We do still need to generate the "index.html" and copy over files from
* "public/" so our `webpack-dev-server` can _serve_ them for us :+1:
*/
const path = require('path');
const merge = require('webpack-merge');
const webpack = require('webpack');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
// Plugins
const CopyWebpackPlugin = require('copy-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
// Const
const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist');
const PUBLIC_DIR = path.join(__dirname, '../public');
const ASSET_PATH = process.env.ASSET_PATH || '/';
// Env Vars
const HTML_TEMPLATE = process.env.HTML_TEMPLATE || 'index.html';
const PUBLIC_URL = process.env.PUBLIC_URL || '/';
const APP_CONFIG = process.env.APP_CONFIG || 'config/default.js';
module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-development
mode: 'development',
output: {
path: DIST_DIR, // push to common?
publicPath: ASSET_PATH,
// filename: '[name].bundle.js',
},
plugins: [
new webpack.HotModuleReplacementPlugin(),
// Copy "Public" Folder to Dist
new CopyWebpackPlugin([
{
from: PUBLIC_DIR,
to: DIST_DIR,
toType: 'dir',
// Ignore our HtmlWebpackPlugin template file
// Ignore our configuration files
ignore: ['config/*', 'html-templates/*', '.DS_Store'],
},
// Copy over and rename our target app config file
{
from: `${PUBLIC_DIR}/${APP_CONFIG}`,
to: `${DIST_DIR}/app-config.js`,
},
]),
// Generate "index.html" w/ correct includes/imports
new HtmlWebpackPlugin({
template: `${PUBLIC_DIR}/html-templates/${HTML_TEMPLATE}`,
filename: 'index.html',
templateParameters: {
PUBLIC_URL: PUBLIC_URL,
},
}),
],
// https://webpack.js.org/configuration/dev-server/
devServer: {
hot: true,
open: true,
port: 3000,
historyApiFallback: {
disableDotRule: true,
},
},
});
};

View File

@ -0,0 +1,35 @@
const ExtractCssChunksPlugin = require('extract-css-chunks-webpack-plugin');
function extractStyleChunks(isProdBuild) {
return [
{
test: /\.styl$/,
use: [
{
loader: ExtractCssChunksPlugin.loader,
options: {
hot: !isProdBuild,
},
},
{ loader: 'css-loader' },
{ loader: 'stylus-loader' },
],
},
{
test: /\.(sa|sc|c)ss$/,
use: [
{
loader: ExtractCssChunksPlugin.loader,
options: {
hot: !isProdBuild,
},
},
'css-loader',
'postcss-loader',
// 'sass-loader',
],
},
];
}
module.exports = extractStyleChunks;

View File

@ -0,0 +1,20 @@
/**
* For CommonJS, we want to bundle whatever font we've landed on. This allows
* us to reduce the number of script-tags we need to specify for simple use.
*
* PWA will grab these externally to reduce bundle size (think code split),
* and cache the grab using service-worker.
*/
const fontsToJavaScript = {
test: /\.(ttf|eot|woff|woff2)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[ext]',
},
},
],
};
module.exports = fontsToJavaScript;

View File

@ -1,9 +1,9 @@
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const webpack = require('webpack'); const webpackCommon = require('./../../../.webpack/webpack.commonjs.js');
const webpackCommon = require('./../../../.webpack/webpack.common.js');
// //
const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const fontsToJavaScriptRule = require('./rules/fontsToJavaScript.js');
// const // const
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
@ -12,8 +12,6 @@ module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR });
return merge(commonConfig, { return merge(commonConfig, {
// https://webpack.js.org/configuration/mode/#mode-production
mode: 'production',
entry: { entry: {
bundle: `${SRC_DIR}/index-umd.js`, bundle: `${SRC_DIR}/index-umd.js`,
}, },
@ -39,27 +37,8 @@ module.exports = (env, argv) => {
libraryTarget: 'umd', libraryTarget: 'umd',
filename: 'index.umd.js', filename: 'index.umd.js',
}, },
/**
* For CommonJS, we want to bundle whatever font we've landed on. This allows
* us to reduce the number of script-tags we need to specify for simple use.
*
* PWA will grab these externally to reduce bundle size (think code split),
* and cache the grab using service-worker.
*/
module: { module: {
rules: [ rules: [fontsToJavaScriptRule],
{
test: /\.(ttf|eot|woff|woff2)$/i,
use: [
{
loader: 'file-loader',
options: {
name: '[name].[ext]',
},
},
],
},
],
}, },
plugins: [ plugins: [
// Clean output.path // Clean output.path

View File

@ -1,34 +1,40 @@
// ~~ WebPack
const path = require('path'); const path = require('path');
const merge = require('webpack-merge'); const merge = require('webpack-merge');
const webpack = require('webpack'); const webpack = require('webpack');
const webpackCommon = require('./../../../.webpack/webpack.common-pwa.js'); const webpackBase = require('./../../../.webpack/webpack.base.js');
// Plugins // ~~ Plugins
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin;
const { CleanWebpackPlugin } = require('clean-webpack-plugin'); const { CleanWebpackPlugin } = require('clean-webpack-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin');
const ExtractCssChunksPlugin = require('extract-css-chunks-webpack-plugin'); const ExtractCssChunksPlugin = require('extract-css-chunks-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const WorkboxPlugin = require('workbox-webpack-plugin');
const TerserJSPlugin = require('terser-webpack-plugin'); const TerserJSPlugin = require('terser-webpack-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin'); const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin'); // ~~ Rules
const workboxPlugin = require('workbox-webpack-plugin'); const extractStyleChunksRule = require('./rules/extractStyleChunks.js');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer') // ~~ Directories
.BundleAnalyzerPlugin;
//
const SRC_DIR = path.join(__dirname, '../src'); const SRC_DIR = path.join(__dirname, '../src');
const DIST_DIR = path.join(__dirname, '../dist'); const DIST_DIR = path.join(__dirname, '../dist');
const PUBLIC_DIR = path.join(__dirname, '../public'); const PUBLIC_DIR = path.join(__dirname, '../public');
// Env Vars // ~~ Env Vars
const HTML_TEMPLATE = process.env.HTML_TEMPLATE || 'index.html'; const HTML_TEMPLATE = process.env.HTML_TEMPLATE || 'index.html';
const PUBLIC_URL = process.env.PUBLIC_URL || '/'; const PUBLIC_URL = process.env.PUBLIC_URL || '/';
const APP_CONFIG = process.env.APP_CONFIG || 'config/default.js'; const APP_CONFIG = process.env.APP_CONFIG || 'config/default.js';
module.exports = (env, argv) => { module.exports = (env, argv) => {
const commonConfig = webpackCommon(env, argv, { SRC_DIR, DIST_DIR }); const baseConfig = webpackBase(env, argv, { SRC_DIR, DIST_DIR });
const isProdBuild = process.env.NODE_ENV === 'production';
return merge(commonConfig, { const mergedConfig = merge(baseConfig, {
// https://webpack.js.org/configuration/mode/#mode-production devtool: isProdBuild ? 'source-map' : 'cheap-module-eval-source-map',
mode: 'production', output: {
// Out of memory -- Code Split path: DIST_DIR,
// devtool: 'source-map', filename: isProdBuild ? '[name].bundle.[chunkhash].js' : '[name].js',
publicPath: PUBLIC_URL, // Used by HtmlWebPackPlugin for asset prefix
},
stats: { stats: {
colors: true, colors: true,
hash: true, hash: true,
@ -41,86 +47,31 @@ module.exports = (env, argv) => {
warnings: true, warnings: true,
}, },
optimization: { optimization: {
minimize: true, minimize: isProdBuild,
sideEffects: true, sideEffects: true,
minimizer: [new TerserJSPlugin({}), new OptimizeCSSAssetsPlugin({})], // // TODO: For more granular minimize
}, // // minimizer: [
output: { // // new TerserJSPlugin({
path: DIST_DIR, // // sourceMap: true,
filename: '[name].bundle.[chunkhash].js', // // terserOptions: {
publicPath: PUBLIC_URL, // Used by HtmlWebPackPlugin for asset prefix // // sourceMap: {
// // file: '[name].map',
// // url: 'https://my-host/[url]',
// // },
// // },
// // }),
// // new OptimizeCSSAssetsPlugin({}),
// // ],
}, },
module: { module: {
rules: [ rules: [...extractStyleChunksRule(isProdBuild)],
{
test: /\.styl$/,
use: [
{
loader: ExtractCssChunksPlugin.loader,
options: {
hot: process.env.NODE_ENV === 'development',
},
},
{ loader: 'css-loader' },
{ loader: 'stylus-loader' },
],
},
{
test: /\.(sa|sc|c)ss$/,
use: [
{
loader: ExtractCssChunksPlugin.loader,
options: {
hot: process.env.NODE_ENV === 'development',
},
},
'css-loader',
'postcss-loader',
// 'sass-loader',
],
},
],
}, },
module: {
rules: [
{
test: /\.styl$/,
use: [
{
loader: ExtractCssChunksPlugin.loader,
options: {
hot: process.env.NODE_ENV === 'development',
},
},
{ loader: 'css-loader' },
{ loader: 'stylus-loader' },
],
},
{
test: /\.(sa|sc|c)ss$/,
use: [
{
loader: ExtractCssChunksPlugin.loader,
options: {
hot: process.env.NODE_ENV === 'development',
},
},
'css-loader',
'postcss-loader',
// 'sass-loader',
],
},
],
},
// TODO:
// Do we need to rip anything out of the more generic common.js we're
// merging with this?
plugins: [ plugins: [
// Uncomment to generate bundle analyzer // Uncomment to generate bundle analyzer
// new BundleAnalyzerPlugin(), // new BundleAnalyzerPlugin(),
// Clean output.path // Clean output.path
new CleanWebpackPlugin(), new CleanWebpackPlugin(),
// "Public" Folder // Copy "Public" Folder to Dist
new CopyWebpackPlugin([ new CopyWebpackPlugin([
{ {
from: PUBLIC_DIR, from: PUBLIC_DIR,
@ -142,10 +93,7 @@ module.exports = (env, argv) => {
chunkFilename: '[id].css', chunkFilename: '[id].css',
ignoreOrder: false, // Enable to remove warnings about conflicting order ignoreOrder: false, // Enable to remove warnings about conflicting order
}), }),
/** // Generate "index.html" w/ correct includes/imports
* This generates our index.html file from the specified template.
* This is the easiest way to inject custom configuration and extensions.
*/
new HtmlWebpackPlugin({ new HtmlWebpackPlugin({
template: `${PUBLIC_DIR}/html-templates/${HTML_TEMPLATE}`, template: `${PUBLIC_DIR}/html-templates/${HTML_TEMPLATE}`,
filename: 'index.html', filename: 'index.html',
@ -154,11 +102,31 @@ module.exports = (env, argv) => {
}, },
// favicon: `${PUBLIC_DIR}/favicon.ico`, // favicon: `${PUBLIC_DIR}/favicon.ico`,
}), }),
new workboxPlugin.GenerateSW({ new WorkboxPlugin.GenerateSW({
swDest: 'sw.js', swDest: 'sw.js',
clientsClaim: true, clientsClaim: true,
skipWaiting: true, skipWaiting: true,
}), }),
], ],
// https://webpack.js.org/configuration/dev-server/
devServer: {
// gzip compression of everything served
// Causes Cypress: `wait-on` issue in CI
// compress: true,
// http2: true,
// https: true,
hot: true,
open: true,
port: 3000,
historyApiFallback: {
disableDotRule: true,
},
},
}); });
if (!isProdBuild) {
mergedConfig.plugins.push(new webpack.HotModuleReplacementPlugin());
}
return mergedConfig;
}; };

View File

@ -12,7 +12,6 @@
</div> </div>
<div align="center"> <div align="center">
<a href="https://docs.ohif.org/demo">Demo</a> | <a href="https://docs.ohif.org/demo">Demo</a> |
<a href="https://ohif.canny.io/">Roadmap</a> |
<a href="https://react.ohif.org/">Component Library</a> <a href="https://react.ohif.org/">Component Library</a>
</div> </div>
@ -95,7 +94,9 @@ guide.
### E2E Tests ### E2E Tests
Using [Cypress](https://www.cypress.io/) to create End-to-End tests and check whether the application flow is performing correctly, ensuring that the integrated components are working as expected. Using [Cypress](https://www.cypress.io/) to create End-to-End tests and check
whether the application flow is performing correctly, ensuring that the
integrated components are working as expected.
#### Why Cypress? #### Why Cypress?
@ -146,10 +147,10 @@ When creating tests, place the test file "next to" the file you're testing.
```js ```js
// File // File
index.js index.js;
// Test for file // Test for file
index.test.js index.test.js;
``` ```
As you add and modify code, `jest` will watch for uncommitted changes and run As you add and modify code, `jest` will watch for uncommitted changes and run
@ -157,32 +158,6 @@ your tests, reporting the results to your terminal. Make a pull request with
your changes to `master`, and a core team member will review your work. If you your changes to `master`, and a core team member will review your work. If you
have any questions, please don't hesitate to reach out via a GitHub issue. have any questions, please don't hesitate to reach out via a GitHub issue.
## Roadmap
If you want to know what's planned for the very near future,
[check out our roadmap](https://ohif.canny.io/). The best way to influence when
and what is worked on is to contribute to the conversation by creating GitHub
issues, and contributing code through pull requests. OHIF's high level
priorities for the near future are:
- Feature parity with version 1
- Extension and configuration improvements with key integration partners
- Continued Developer Experience Improvements
- Segmentation Tools, and improved VTK.js support
More granular information will make it's way to the backlog as these items
become scoped for development by core maintainers.
> Don't hesitate to ask questions, propose features, or create pull requests.
> We're here, we're listening, and we're ready to build the best open source
> medical imaging viewer on the web.
#### Roadmap Generously Powered by Canny.io
<a href="https://ohif.canny.io/">
<img height="30" src="docs/latest/assets/img/canny-full.png" />
</a>
## Contributors ## Contributors
Thanks goes to these wonderful people Thanks goes to these wonderful people

View File

@ -17,13 +17,13 @@
}, },
"proxy": "http://localhost:8042", "proxy": "http://localhost:8042",
"scripts": { "scripts": {
"build:package": "cross-env NODE_ENV=production node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/commonjs.prod.js", "build:package": "cross-env NODE_ENV=production node --max_old_space_size=8192 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.commonjs.js",
"build:viewer": "cross-env NODE_ENV=production node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/pwa.prod.js", "build:viewer": "cross-env NODE_ENV=production node --max_old_space_size=8192 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js",
"build:viewer:ci": "cross-env NODE_ENV=production PUBLIC_URL=/pwa/ APP_CONFIG=config/netlify.js node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/pwa.prod.js", "build:viewer:ci": "cross-env NODE_ENV=production PUBLIC_URL=/pwa/ APP_CONFIG=config/netlify.js node --max_old_space_size=8192 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js",
"build:viewer:demo": "cross-env NODE_ENV=production APP_CONFIG=config/demo.js HTML_TEMPLATE=rollbar.html node --max_old_space_size=4096 ./../../node_modules/webpack/bin/webpack.js --config .webpack/pwa.prod.js", "build:viewer:demo": "cross-env NODE_ENV=production APP_CONFIG=config/demo.js HTML_TEMPLATE=rollbar.html node --max_old_space_size=8192 ./../../node_modules/webpack/bin/webpack.js --config .webpack/webpack.pwa.js",
"build:viewer:package": "yarn run build:package", "build:viewer:package": "yarn run build:package",
"dev": "webpack-dev-server --config .webpack/all.dev.js -w", "dev": "cross-env NODE_ENV=development webpack-dev-server --config .webpack/webpack.pwa.js -w",
"dev:orthanc": "cross-env APP_CONFIG=config/docker_nginx-orthanc.js react-scripts start", "dev:orthanc": "cross-env NODE_ENV=developmen APP_CONFIG=config/docker_nginx-orthanc.js react-scripts start",
"dev:viewer": "yarn run dev", "dev:viewer": "yarn run dev",
"start": "yarn run dev", "start": "yarn run dev",
"orthanc:up": "docker-compose -f docker/Nginx-Orthanc/docker-compose.yml up", "orthanc:up": "docker-compose -f docker/Nginx-Orthanc/docker-compose.yml up",
@ -31,10 +31,6 @@
"test:unit": "jest --watchAll", "test:unit": "jest --watchAll",
"test:unit:ci": "jest --ci --runInBand --collectCoverage" "test:unit:ci": "jest --ci --runInBand --collectCoverage"
}, },
"resolutions": {
"browserslist": "4.6.2",
"caniuse-lite": "1.0.30000974"
},
"files": [ "files": [
"dist", "dist",
"README.md" "README.md"
@ -55,10 +51,10 @@
"@ohif/ui": "^0.50.1", "@ohif/ui": "^0.50.1",
"@tanem/react-nprogress": "^1.1.25", "@tanem/react-nprogress": "^1.1.25",
"classnames": "^2.2.6", "classnames": "^2.2.6",
"core-js": "^3.1.4", "core-js": "^3.2.1",
"cornerstone-core": "^2.2.8", "cornerstone-core": "^2.2.8",
"cornerstone-math": "^0.1.8", "cornerstone-math": "^0.1.8",
"cornerstone-tools": "^3.15.1", "cornerstone-tools": "^3.19.2",
"cornerstone-wado-image-loader": "^3.0.0", "cornerstone-wado-image-loader": "^3.0.0",
"dcmjs": "^0.4.7", "dcmjs": "^0.4.7",
"dicom-parser": "^1.8.3", "dicom-parser": "^1.8.3",
@ -81,7 +77,8 @@
"redux-logger": "^3.0.6", "redux-logger": "^3.0.6",
"redux-oidc": "3.1.x", "redux-oidc": "3.1.x",
"redux-thunk": "^2.3.0", "redux-thunk": "^2.3.0",
"reselect": "^4.0.0" "reselect": "^4.0.0",
"vtk.js": "^11.0.1"
}, },
"devDependencies": { "devDependencies": {
"cypress": "^3.3.1", "cypress": "^3.3.1",

View File

@ -1,5 +1,6 @@
window.config = { window.config = {
routerBasename: '/', routerBasename: '/',
extensions: [],
showStudyList: true, showStudyList: true,
servers: { servers: {
dicomWeb: [ dicomWeb: [
@ -17,9 +18,51 @@ window.config = {
}, },
], ],
}, },
hotkeys: [
{
commandName: 'incrementActiveViewport',
label: 'Next Image Viewport',
keys: ['right'],
},
{
commandName: 'decrementActiveViewport',
label: 'Previous Image Viewport',
keys: ['left'],
},
{ commandName: 'rotateViewportCW', label: 'Rotate Right', keys: ['r'] },
{ commandName: 'rotateViewportCCW', label: 'Rotate Left', keys: ['l'] },
{ commandName: 'invertViewport', label: 'Invert', keys: ['i'] },
{
commandName: 'flipViewportVertical',
label: 'Flip Horizontally',
keys: ['h'],
},
{
commandName: 'flipViewportHorizontal',
label: 'Flip Vertically',
keys: ['v'],
},
{ commandName: 'scaleUpViewport', label: 'Zoom In', keys: ['+'] },
{ commandName: 'scaleDownViewport', label: 'Zoom Out', keys: ['-'] },
{ commandName: 'fitViewportToWindow', label: 'Zoom to Fit', keys: ['='] },
{ commandName: 'resetViewport', label: 'Reset', keys: ['space'] },
{ commandName: 'nextImage', label: 'Next Image', keys: ['down'] },
{ commandName: 'previousImage', label: 'Previous Image', keys: ['up'] },
{
commandName: 'nextViewportDisplaySet',
label: 'Previous Series',
keys: ['pagedown'],
},
{
commandName: 'previousViewportDisplaySet',
label: 'Next Series',
keys: ['pageup'],
},
{ commandName: 'setZoomTool', label: 'Zoom', keys: ['z'] },
],
i18n: { i18n: {
LOCIZE_PROJECTID: 'a8da3f9a-e467-4dd6-af33-474d582a0294', LOCIZE_PROJECTID: 'a8da3f9a-e467-4dd6-af33-474d582a0294',
LOCIZE_API_KEY: null, // Developers can use this to do in-context editing. DO NOT COMMIT THIS KEY! LOCIZE_API_KEY: null, // Developers can use this to do in-context editing. DO NOT COMMIT THIS KEY!
USE_LOCIZE: true USE_LOCIZE: true,
} },
} };

View File

@ -9,6 +9,9 @@
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<link rel="manifest" href="<%= PUBLIC_URL %>manifest.json" /> <link rel="manifest" href="<%= PUBLIC_URL %>manifest.json" />
<!-- Built with: https://polyfill.io/v3/url-builder/ -->
<!-- Targets IE11 -->
<script src="https://polyfill.io/v3/polyfill.min.js?flags=gated&features=default%2CObject.values%2CArray.prototype.flat%2CObject.entries%2CSymbol%2CArray.prototype.includes%2CString.prototype.repeat%2CArray.prototype.find"></script>
<script <script
type="text/javascript" type="text/javascript"
src="<%= PUBLIC_URL %>app-config.js" src="<%= PUBLIC_URL %>app-config.js"

View File

@ -9,6 +9,9 @@
<meta name="theme-color" content="#000000" /> <meta name="theme-color" content="#000000" />
<link rel="manifest" href="<%= PUBLIC_URL %>manifest.json" /> <link rel="manifest" href="<%= PUBLIC_URL %>manifest.json" />
<!-- Built with: https://polyfill.io/v3/url-builder/ -->
<!-- Targets IE11 -->
<script src="https://polyfill.io/v3/polyfill.min.js?flags=gated&features=default%2CObject.values%2CArray.prototype.flat%2CObject.entries%2CSymbol%2CArray.prototype.includes%2CString.prototype.repeat%2CArray.prototype.find"></script>
<script type="text/javascript" src="<%= PUBLIC_URL %>app-config.js"></script> <script type="text/javascript" src="<%= PUBLIC_URL %>app-config.js"></script>
<title>OHIF Viewer</title> <title>OHIF Viewer</title>

1024
platform/viewer/server.js Normal file

File diff suppressed because it is too large Load Diff

View File

@ -2,12 +2,6 @@ import { hot } from 'react-hot-loader/root';
import './config'; import './config';
// Polyfills
// PWA Only?
import 'core-js/features/array/flat';
import 'core-js/stable';
import 'regenerator-runtime/runtime';
import { import {
CommandsManager, CommandsManager,
ExtensionManager, ExtensionManager,

View File

@ -2,6 +2,9 @@
* Entry point for development and production PWA builds. * Entry point for development and production PWA builds.
* Packaged (NPM) builds go through `index-umd.js` * Packaged (NPM) builds go through `index-umd.js`
*/ */
import 'regenerator-runtime/runtime';
import App from './App.js'; import App from './App.js';
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';

View File

@ -2,6 +2,7 @@ import {
applyMiddleware, applyMiddleware,
combineReducers, combineReducers,
createStore, createStore,
compose,
} from 'redux/es/redux.js'; } from 'redux/es/redux.js';
// import { createLogger } from 'redux-logger'; // import { createLogger } from 'redux-logger';
@ -13,7 +14,8 @@ import thunkMiddleware from 'redux-thunk';
// Combine our ohif-core, ui, and oidc reducers // Combine our ohif-core, ui, and oidc reducers
// Set init data, using values found in localStorage // Set init data, using values found in localStorage
const { reducers, localStorage } = redux; const { reducers, localStorage } = redux;
// const loggerMiddleware = createLogger(); const middleware = [thunkMiddleware];
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
reducers.ui = layoutReducers; reducers.ui = layoutReducers;
reducers.oidc = oidcReducer; reducers.oidc = oidcReducer;
@ -22,10 +24,7 @@ const rootReducer = combineReducers(reducers);
const store = createStore( const store = createStore(
rootReducer, rootReducer,
localStorage.loadState(), // preloadedState localStorage.loadState(), // preloadedState
applyMiddleware( composeEnhancers(applyMiddleware(...middleware))
thunkMiddleware // Lets us dispatch() functions
// loggerMiddleware // neat middleware that logs actions
)
); );
// When the store's preferences change, // When the store's preferences change,

View File

@ -1,9 +1,13 @@
module.exports = { module.exports = function(ctx) {
// parser: "sugarss", ctx = ctx || {};
parser: false, ctx.env = ctx.env || 'development';
plugins: {
"postcss-import": {}, return {
"postcss-preset-env": {}, map: ctx.env === 'development' ? ctx.map : false,
cssnano: {} plugins: {
} 'postcss-import': {},
'postcss-preset-env': {},
cssnano: ctx.env === 'production' ? {} : false,
},
};
}; };

View File

@ -400,7 +400,7 @@
"@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0"
"@babel/plugin-proposal-object-rest-spread@7.5.5", "@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.4.3", "@babel/plugin-proposal-object-rest-spread@^7.5.0", "@babel/plugin-proposal-object-rest-spread@^7.5.5": "@babel/plugin-proposal-object-rest-spread@7.5.5", "@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.4.3", "@babel/plugin-proposal-object-rest-spread@^7.5.5":
version "7.5.5" version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.5.5.tgz#61939744f71ba76a3ae46b5eea18a54c16d22e58"
integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw== integrity sha512-F2DxJJSQ7f64FyTVl5cw/9MWn6naXGdk3Q3UhDbFEEHv+EilCPoeRD3Zh/Utx1CJz4uyKlQ4uH+bJPbEhMV7Zw==
@ -1105,7 +1105,21 @@
pirates "^4.0.0" pirates "^4.0.0"
source-map-support "^0.5.9" source-map-support "^0.5.9"
"@babel/runtime@7.1.2", "@babel/runtime@7.4.3", "@babel/runtime@7.5.5", "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5": "@babel/runtime@7.1.2":
version "7.1.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.2.tgz#81c89935f4647706fc54541145e6b4ecfef4b8e3"
integrity sha512-Y3SCjmhSupzFB6wcv1KmmFucH6gDVnI30WjOcicV10ju0cZjak3Jcs67YLIXBrmZYw1xCrVeJPbycFwrqNyxpg==
dependencies:
regenerator-runtime "^0.12.0"
"@babel/runtime@7.4.3":
version "7.4.3"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.3.tgz#79888e452034223ad9609187a0ad1fe0d2ad4bdc"
integrity sha512-9lsJwJLxDh/T3Q3SZszfWOTkk3pHbkmH+3KY+zwIDmsNlxsumuhS2TH3NIpktU4kNvfzy+k3eLT7aTJSPTo0OA==
dependencies:
regenerator-runtime "^0.13.2"
"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.2.0", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5":
version "7.5.5" version "7.5.5"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.5.5.tgz#74fba56d35efbeca444091c7850ccd494fd2f132"
integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ== integrity sha512-28QvEGyQyNkB0/m2B4FU7IEZGK2NUrcMtT6BZEFALTguLk+AUT6ofsHtPk5QyjAdUkpMJ+/Em+quwz4HOt30AQ==
@ -4092,13 +4106,13 @@ browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.5.2, browserslist@^4.6
node-releases "^1.1.23" node-releases "^1.1.23"
browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6: browserslist@^4.6.3, browserslist@^4.6.4, browserslist@^4.6.6:
version "4.6.6" version "4.7.0"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.6.6.tgz#6e4bf467cde520bc9dbdf3747dafa03531cec453" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.7.0.tgz#9ee89225ffc07db03409f2fee524dc8227458a17"
integrity sha512-D2Nk3W9JL9Fp/gIcWei8LrERCS+eXu9AM5cfXA8WEZ84lFks+ARnZ0q/R69m2SV3Wjma83QDDPxsNKXUwdIsyA== integrity sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==
dependencies: dependencies:
caniuse-lite "^1.0.30000984" caniuse-lite "^1.0.30000989"
electron-to-chromium "^1.3.191" electron-to-chromium "^1.3.247"
node-releases "^1.1.25" node-releases "^1.1.29"
bser@^2.0.0: bser@^2.0.0:
version "2.1.0" version "2.1.0"
@ -4399,7 +4413,7 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000974:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000974.tgz#b7afe14ee004e97ce6dc73e3f878290a12928ad8"
integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww== integrity sha512-xc3rkNS/Zc3CmpMKuczWEdY2sZgx09BkAxfvkxlAEBTqcMHeL8QnPqhKse+5sRTi3nrw2pJwToD2WvKn1Uhvww==
caniuse-lite@^1.0.30000955, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000984: caniuse-lite@^1.0.30000955, caniuse-lite@^1.0.30000980, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000989:
version "1.0.30000989" version "1.0.30000989"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000989.tgz#b9193e293ccf7e4426c5245134b8f2a56c0ac4b9"
integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw== integrity sha512-vrMcvSuMz16YY6GSVZ0dWDTJP8jqk3iFQ/Aq5iqblPwxSVVZI+zxDyTX0VPqtQsDnfdrBDcsmhgTEOh5R8Lbpw==
@ -5310,7 +5324,7 @@ core-js@^2.4.0, core-js@^2.4.1, core-js@^2.5.0, core-js@^2.5.7, core-js@^2.6.5:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2"
integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A==
core-js@^3.0.0, core-js@^3.1.4: core-js@^3.0.0:
version "3.2.0" version "3.2.0"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.0.tgz#0a835fdf6aa677fff83a823a7b5276c9e7cebb76" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.2.0.tgz#0a835fdf6aa677fff83a823a7b5276c9e7cebb76"
integrity sha512-gybgLzmr7SQRSF6UzGYXducx4eE10ONQlyEnQoqiGPbmbn7zLkb73tPfc4YbZN0lvcTQwoLNPjq4RuCaCumGyQ== integrity sha512-gybgLzmr7SQRSF6UzGYXducx4eE10ONQlyEnQoqiGPbmbn7zLkb73tPfc4YbZN0lvcTQwoLNPjq4RuCaCumGyQ==
@ -5345,7 +5359,7 @@ cornerstone-math@^0.1.8:
resolved "https://registry.yarnpkg.com/cornerstone-math/-/cornerstone-math-0.1.8.tgz#68ab1f9e4fdcd7c5cb23a0d2eb4263f9f894f1c5" resolved "https://registry.yarnpkg.com/cornerstone-math/-/cornerstone-math-0.1.8.tgz#68ab1f9e4fdcd7c5cb23a0d2eb4263f9f894f1c5"
integrity sha512-x7NEQHBtVG7j1yeyj/aRoKTpXv1Vh2/H9zNLMyqYJDtJkNng8C4Q8M3CgZ1qer0Yr7eVq2x+Ynmj6kfOm5jXKw== integrity sha512-x7NEQHBtVG7j1yeyj/aRoKTpXv1Vh2/H9zNLMyqYJDtJkNng8C4Q8M3CgZ1qer0Yr7eVq2x+Ynmj6kfOm5jXKw==
cornerstone-tools@^3.13.0, cornerstone-tools@^3.15.1: cornerstone-tools@^3.13.0:
version "3.18.3" version "3.18.3"
resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-3.18.3.tgz#a4f892867f816b7a774edea046522af793d3e10d" resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-3.18.3.tgz#a4f892867f816b7a774edea046522af793d3e10d"
integrity sha512-/jLNexVupGRLgxrtp7IE1en9n0x/Qj9HI5GLDDKTf4kBZl5eKToIkir83W1aqi+K1Hk1DR1Pb2lgxWT1NYvcsA== integrity sha512-/jLNexVupGRLgxrtp7IE1en9n0x/Qj9HI5GLDDKTf4kBZl5eKToIkir83W1aqi+K1Hk1DR1Pb2lgxWT1NYvcsA==
@ -5354,6 +5368,14 @@ cornerstone-tools@^3.13.0, cornerstone-tools@^3.15.1:
cornerstone-math "0.1.7" cornerstone-math "0.1.7"
debug "4.1.1" debug "4.1.1"
cornerstone-tools@^3.19.2:
version "3.19.2"
resolved "https://registry.yarnpkg.com/cornerstone-tools/-/cornerstone-tools-3.19.2.tgz#0cf3b2f3fe6fa1ec2585a5b90b0ba0cf0a20c913"
integrity sha512-oigCrT/cmgg5qWvRR65sTFONMG7tm4XcSNX5bTmiqOQ5enoDgCXdICbdxb/8PBFvsMHzJrBw0tC4qkJLkTiupw==
dependencies:
"@babel/runtime" "7.1.2"
cornerstone-math "0.1.7"
cornerstone-wado-image-loader@^3.0.0: cornerstone-wado-image-loader@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-3.0.0.tgz#250ba435379096815de52ed80629d6407e016841" resolved "https://registry.yarnpkg.com/cornerstone-wado-image-loader/-/cornerstone-wado-image-loader-3.0.0.tgz#250ba435379096815de52ed80629d6407e016841"
@ -6705,10 +6727,10 @@ ejs@^2.6.1:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.2.tgz#3a32c63d1cd16d11266cd4703b14fec4e74ab4f6" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.2.tgz#3a32c63d1cd16d11266cd4703b14fec4e74ab4f6"
integrity sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q== integrity sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==
electron-to-chromium@^1.3.122, electron-to-chromium@^1.3.191: electron-to-chromium@^1.3.122, electron-to-chromium@^1.3.247:
version "1.3.225" version "1.3.250"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.225.tgz#c6786475b5eb5f491ade01a78b82ba2c5bfdf72b" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.250.tgz#1f383c16aeb75e7bddbd6a0491237eca81b2cb1f"
integrity sha512-7W/L3jw7HYE+tUPbcVOGBmnSrlUmyZ/Uyg24QS7Vx0a9KodtNrN0r0Q/LyGHrcYMtw2rv7E49F/vTXwlV/fuaA== integrity sha512-2OAU91iUw83QvzuWJPfT+FMj+O+DC1EyTx1QBFcc9WZzOQSfZEAWINpdLWElxkgfiqTvQRDOKg0DkMZd9QoNug==
electron-to-chromium@^1.3.150: electron-to-chromium@^1.3.150:
version "1.3.224" version "1.3.224"
@ -12311,7 +12333,14 @@ node-pre-gyp@^0.12.0:
semver "^5.3.0" semver "^5.3.0"
tar "^4" tar "^4"
node-releases@^1.1.13, node-releases@^1.1.23, node-releases@^1.1.25: node-releases@^1.1.13, node-releases@^1.1.29:
version "1.1.29"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.29.tgz#86a57c6587a30ecd6726449e5d293466b0a0bb86"
integrity sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==
dependencies:
semver "^5.3.0"
node-releases@^1.1.23:
version "1.1.27" version "1.1.27"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.27.tgz#b19ec8add2afe9a826a99dceccc516104c1edaf4" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.27.tgz#b19ec8add2afe9a826a99dceccc516104c1edaf4"
integrity sha512-9iXUqHKSGo6ph/tdXVbHFbhRVQln4ZDTIBJCzsa90HimnBYc5jw8RWYt4wBYFHehGyC3koIz5O4mb2fHrbPOuA== integrity sha512-9iXUqHKSGo6ph/tdXVbHFbhRVQln4ZDTIBJCzsa90HimnBYc5jw8RWYt4wBYFHehGyC3koIz5O4mb2fHrbPOuA==
@ -15266,6 +15295,11 @@ regenerator-runtime@^0.11.0, regenerator-runtime@^0.11.1:
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
regenerator-runtime@^0.12.0:
version "0.12.1"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de"
integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==
regenerator-runtime@^0.13.2: regenerator-runtime@^0.13.2:
version "0.13.3" version "0.13.3"
resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5"
@ -18296,10 +18330,10 @@ void-elements@^2.0.1:
resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w= integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
vtk.js@^9.5.0: vtk.js@^11.0.1:
version "9.7.0" version "11.0.1"
resolved "https://registry.yarnpkg.com/vtk.js/-/vtk.js-9.7.0.tgz#763767607a958fba5c70754434612f3066bd96a0" resolved "https://registry.yarnpkg.com/vtk.js/-/vtk.js-11.0.1.tgz#a22a499eaac96a31a30e48f30a9dd7ac51f5587b"
integrity sha512-4IJJr2slOY+W/GjUdjElg3ViJSt6IF+siIJ4FmqOYQeOdTKRVxVYb7dAYVOH3MyVz8Zs39DEwJHHhRK5hkjsjg== integrity sha512-v5f6ItYQrdwE0FomKEy//oNYrFpD6CWaKjxbI6N5+ttsKLVtKwGmpYtB8bii0Tww1c50g0uo9tcj6tvKTUv62Q==
dependencies: dependencies:
blueimp-md5 "2.10.0" blueimp-md5 "2.10.0"
commander "2.11.0" commander "2.11.0"