diff --git a/.circleci/config.yml b/.circleci/config.yml index 4e2020079..4082a5605 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,54 +3,83 @@ jobs: build: working_directory: ~/phovea docker: - - image: caleydo/phovea_circleci_python:v2.0 + - image: caleydo/phovea_circleci_python:v3.0 steps: - checkout - run: + name: Show Node.js and npm version + command: | + node -v + npm -v + - run: + name: Show Python and pip version + command: | + python --version + pip --version + - run: + name: Install Docker packages from docker_packages.txt command: | (!(test -f docker_packages.txt) || (cat docker_packages.txt | xargs sudo apt-get install -y)) - restore_cache: - key: deps4-{{ checksum "package.json" }} + key: deps2-{{ .Branch }}-{{ checksum "package.json" }} - run: - name: install-npm-wee + name: Install npm dependencies command: npm install - - run: #remove all resolved github dependencies - name: delete-vcs-dependencies + - run: + name: Remove npm dependencies installed from git repositories (avoid caching of old commits) command: | (grep -l '._resolved.: .\(git[^:]*\|bitbucket\):' ./node_modules/*/package.json || true) | xargs -r dirname | xargs -r rm -rf - save_cache: - key: deps4-{{ checksum "package.json" }} + key: deps2-{{ .Branch }}-{{ checksum "package.json" }} paths: - ./node_modules - - run: #install all dependencies - name: install-npm-wee2 + - run: + name: Install npm dependencies from git repositories (always get latest commit) command: npm install + - run: + name: Show installed npm dependencies + command: npm list --depth=1 || true - restore_cache: - key: deps1-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} + key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} - run: - name: install-pip-wee + name: Install pip requirements command: | virtualenv ~/venv . ~/venv/bin/activate pip install -r requirements_dev.txt pip install -r requirements.txt - save_cache: - key: deps1-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} + key: deps1-{{ .Branch }}-{{ checksum "requirements.txt" }}-{{ checksum "requirements_dev.txt" }} paths: - ~/venv - - run: #force update of VCS dependencies? - name: update-pip-vcs-dependencies + - run: + name: Force an update of pip dependencies from git repositories # not sure if this is working ? command: | . ~/venv/bin/activate pip install --upgrade --upgrade-strategy=only-if-needed -r requirements.txt - run: - name: build + name: Show installed pip packages + command: pip list || true + - run: + name: Build command: | . ~/venv/bin/activate - npm run build - + npm run dist + - store_artifacts: + path: dist + prefix: dist workflows: version: 2 +# build-nightly: +# triggers: +# - schedule: +# cron: "15 1 * * 1-5" # "At 01:15 on every day-of-week from Monday through Friday.”, see: https://crontab.guru/#15_1_*_*_1-5 +# filters: +# branches: +# only: +# - develop +# jobs: +# - build build-branch: jobs: - build: diff --git a/.gitignore b/.gitignore index 2104b5ef4..4969b7c18 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ node_modules/ /tests/**/*.js *.map *.css +/.cache-loader diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9074a7aa1..7feb5613c 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: caleydo/phovea_circleci_python:v1.0 +image: caleydo/phovea_circleci_python:v3.0 variables: GIT_DEPTH: "1" diff --git a/.yo-rc.json b/.yo-rc.json index 79f8ca603..3be8def29 100644 --- a/.yo-rc.json +++ b/.yo-rc.json @@ -43,6 +43,12 @@ ], "ignores": [], "today": "Sun, 06 Nov 2016 15:02:36 GMT", - "clientOnly": false + "clientOnly": false, + "promptValues": { + "authorName": "datavisyn", + "authorEmail": "contact@datavisyn.io", + "authorUrl": "https://www.datavisyn.io", + "githubAccount": "datavisyn" + } } -} \ No newline at end of file +} diff --git a/ISSUE_TEMPLATE.md b/ISSUE_TEMPLATE.md new file mode 100644 index 000000000..bdb156f5c --- /dev/null +++ b/ISSUE_TEMPLATE.md @@ -0,0 +1,17 @@ +* Release number or git hash: +* Web browser version and OS: +* Environment (local or deployed): + +### Steps to reproduce + +1. +2. + +### Observed behavior +* Any unexpected output or action (or lack of expected output or action) +* Web browser console errors (including tracebacks) +* Server errors (relevant messages and tracebacks) +* Static or animated images showing the UI behavior + +### Expected behavior +* diff --git a/buildInfo.js b/buildInfo.js index 09204ef6f..4e7bd687f 100644 --- a/buildInfo.js +++ b/buildInfo.js @@ -139,7 +139,7 @@ function resolveScreenshot() { if (!fs.existsSync(f)) { return null; } - const buffer = new Buffer(fs.readFileSync(f)).toString('base64'); + const buffer = Buffer.from(fs.readFileSync(f)).toString('base64'); return `data:image/png;base64,${buffer}`; } diff --git a/package-lock.json b/package-lock.json index 55d023d40..79cb597dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,9 +66,12 @@ "dev": true }, "@types/jquery": { - "version": "2.0.33", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.33.tgz", - "integrity": "sha1-aE7zoumfb9KvxSo1fkeuBfUfT2w=" + "version": "3.3.31", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.3.31.tgz", + "integrity": "sha512-Lz4BAJihoFw5nRzKvg4nawXPzutkv7wmfQ5121avptaSIXlDNJCUuxZxX/G+9EVidZGuO0UBlk+YjKbwRKJigg==", + "requires": { + "@types/sizzle": "*" + } }, "@types/lodash": { "version": "4.14.104", @@ -93,12 +96,18 @@ "integrity": "sha512-FMdVn84tJJdV+xe+53sYiZS4R5yn1mAIxfj+DVoNiQjTYz1+OYmjwEZr1ev9nU0axXwda0QDbYl06QHanRVH3A==", "dev": true }, + "@types/requirejs": { + "version": "2.1.31", + "resolved": "https://registry.npmjs.org/@types/requirejs/-/requirejs-2.1.31.tgz", + "integrity": "sha512-b2soeyuU76rMbcRJ4e0hEl0tbMhFwZeTC0VZnfuWlfGlk6BwWNsev6kFu/twKABPX29wkX84wU2o+cEJoXsiTw==" + }, "@types/select2": { - "version": "4.0.41", - "resolved": "https://registry.npmjs.org/@types/select2/-/select2-4.0.41.tgz", - "integrity": "sha512-3/91X/6jP7eW8Qx1Gjs5W7kdF+5C4XWZJRaDeFCKjpqCvCDI5QkB288OK+JXvWnQtqVYF+WNUshPIyvbMpQMrQ==", + "version": "4.0.48", + "resolved": "https://registry.npmjs.org/@types/select2/-/select2-4.0.48.tgz", + "integrity": "sha512-C1cUbfwKBqlO+/3OWQKMajA4D/d5SvI9rSGoXCa7FQI9B1p1iRqZzetkfpGPY44BP1Y8emHL17rdUJYZEyzN+Q==", "requires": { - "@types/jquery": "*" + "@types/jquery": "*", + "@types/requirejs": "*" } }, "@types/shelljs": { @@ -111,6 +120,11 @@ "@types/node": "*" } }, + "@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==" + }, "@types/whatwg-fetch": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/@types/whatwg-fetch/-/whatwg-fetch-0.0.33.tgz", @@ -190,11 +204,6 @@ "repeat-string": "^1.5.2" } }, - "almond": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/almond/-/almond-0.3.3.tgz", - "integrity": "sha1-oOfJWsdiTWQXtElLHmi/9pMWiiA=" - }, "alphanum-sort": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", @@ -3735,14 +3744,9 @@ "dev": true }, "jquery": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.1.tgz", - "integrity": "sha1-NHwcIcfgBBFeCk2jLOzgQfrTyKM=" - }, - "jquery-mousewheel": { - "version": "3.1.13", - "resolved": "https://registry.npmjs.org/jquery-mousewheel/-/jquery-mousewheel-3.1.13.tgz", - "integrity": "sha1-BvAzXxbjU6aV5yBr9QUDy1I6buU=" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.3.1.tgz", + "integrity": "sha512-Ubldcmxp5np52/ENotGxlLe6aGMvmF4R8S6tZjsP6Knsaxd/xp3Zrh50cG93lR6nPXyUFwzN3ZSOQI0wRJNdGg==" }, "js-base64": { "version": "2.5.1", @@ -4027,7 +4031,7 @@ "integrity": "sha512-6nrZlwJOBVOX+1fuqR21QvqH14y7kd+V1Qh/xZllkCHzy4IRtrywDc7YklYzmtpJWKDvflD2pfn2D75P+UICfg==" }, "lineupjs": { - "version": "github:lineupjs/lineupjs#ba19207e89ce0c94e23e0293ae8d2922aa2cf3fe", + "version": "github:lineupjs/lineupjs#1b84e033be7b1463825feb533905df29e1352b64", "from": "github:lineupjs/lineupjs#develop", "requires": { "@types/d3-format": "^1.3.1", @@ -5071,6 +5075,18 @@ "font-awesome": "4.7.0", "jquery": "3.1.1", "phovea_core": "^2.2.0" + }, + "dependencies": { + "@types/jquery": { + "version": "2.0.33", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-2.0.33.tgz", + "integrity": "sha1-aE7zoumfb9KvxSo1fkeuBfUfT2w=" + }, + "jquery": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.1.1.tgz", + "integrity": "sha1-NHwcIcfgBBFeCk2jLOzgQfrTyKM=" + } } }, "pify": { @@ -6563,13 +6579,9 @@ "dev": true }, "select2": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.4.tgz", - "integrity": "sha1-oYpih4X5jROZmXGuldjX5XJoB2s=", - "requires": { - "almond": "~0.3.1", - "jquery-mousewheel": "~3.1.13" - } + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.12.tgz", + "integrity": "sha512-mbXC05AvjCboZcRlgJqN4mlI2qmqshpRC76sKNAdxS1lPLOh2m/NTyfL6xsvGoY6eIhjaya4dbumN99MudVQ2w==" }, "select2-bootstrap-theme": { "version": "0.1.0-beta.9", @@ -8000,6 +8012,12 @@ "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", "dev": true + }, + "typescript": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", + "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "dev": true } } }, @@ -8010,9 +8028,9 @@ "dev": true }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==", "dev": true }, "uglify-js": { diff --git a/package.json b/package.json index 66328acf4..532974673 100644 --- a/package.json +++ b/package.json @@ -32,8 +32,8 @@ "redhat_packages.txt" ], "engines": { - "npm": ">= 3", - "node": ">= 6", + "npm": ">= 6.12", + "node": ">= 12.13", "iojs": ">= 3" }, "scripts": { @@ -43,7 +43,7 @@ "predist": "echo hybrid", "dist": "npm run dist:web && npm run dist:python", "compile": "tsc", - "lint": "tslint -c tslint.json -p .", + "lint": "tslint -c tslint.json -p . 'src/**/*.ts?(x)' 'tests/**/*.ts?(x)'", "docs": "npm run docs:web && npm run docs:python", "prebuild": "echo hybrid", "posttest": "echo hybrid", @@ -63,7 +63,7 @@ "test:python": "test ! $(find tests -name \"*.py\") || python setup.py test", "predist:web": "npm run build:web && npm run docs:web", "dist:web": "mkdirp dist && cd build && tar cvzf ../dist/tdp_core.tar.gz *", - "dist:python": "python setup.py sdist bdist_wheel", + "dist:python": "python setup.py bdist_egg", "predocker": "npm run build", "docker": "docker build -t tdp_core -f deploy/Dockerfile .", "docs:web": "typedoc --options typedoc.json src/**.ts", @@ -75,24 +75,27 @@ "prebuild:web": "node -e \"process.exit(process.env.PHOVEA_SKIP_TESTS === undefined?1:0)\" || npm run test:web" }, "dependencies": { - "@types/d3": "3.5.36", - "@types/select2": "4.0.41", - "d3": "3.5.17", + "@types/d3": "~3.5.36", + "@types/select2": "~4.0.47", + "d3": "~3.5.17", "lineupjs": "github:lineupjs/lineupjs#develop", "phovea_clue": "^2.2.0", - "select2": "4.0.4", + "select2": "~4.0.5", "select2-bootstrap-theme": "0.1.0-beta.9", - "@types/jquery": "2.0.33", - "jquery": "3.1.1" + "@types/jquery": "~3.3.6", + "jquery": "~3.3.1" }, "main": "build/tdp_core.js", "devDependencies": { "@types/jasmine": "2.5.47", "awesome-typescript-loader": "3.1.2", + "cache-loader": "1.2.0", "css-loader": "0.28.0", - "extract-loader": "0.1.0", "extract-text-webpack-plugin": "2.1.0", + "extract-loader": "0.1.0", + "ifdef-loader": "2.0.0", "file-loader": "0.11.1", + "fork-ts-checker-webpack-plugin": "0.4.1", "html-loader": "0.4.5", "imports-loader": "0.7.1", "jasmine": "2.5.3", @@ -110,17 +113,14 @@ "raw-loader": "0.5.1", "sass-loader": "6.0.7", "style-loader": "0.16.1", + "thread-loader": "1.1.2", + "ts-loader": "4.0.1", "tslib": "1.9.0", "tslint": "5.9.1", "typedoc": "0.11.1", - "typescript": "2.7.2", + "typescript": "2.8.1", "url-loader": "0.5.8", "webpack": "2.3.3", - "webpack-dev-server": "2.4.2", - "cache-loader": "1.2.0", - "ifdef-loader": "2.0.0", - "fork-ts-checker-webpack-plugin": "0.4.1", - "thread-loader": "1.1.2", - "ts-loader": "4.0.1" + "webpack-dev-server": "2.4.2" } } diff --git a/requirements.txt b/requirements.txt index b25add367..dda9cfdc5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -e git+https://github.com/phovea/phovea_server.git@develop#egg=phovea_server -pymongo==3.0.3 +pymongo~=3.7.1 requests~=2.20.0 SQLAlchemy==1.1.11 urllib3==1.20 diff --git a/setup.py b/setup.py index b4f30f17e..591c09df4 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,6 @@ def to_version(v): now = datetime.datetime.utcnow() return v.replace('SNAPSHOT', now.strftime('%Y%m%d-%H%M%S')) - setup( name=pkg['name'].lower(), version=to_version(pkg['version']), diff --git a/webpack.config.js b/webpack.config.js index ec65fe77a..95542e316 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -4,16 +4,7 @@ * Licensed under the new BSD license, available at http://caleydo.org/license **************************************************************************** */ -const { - libraryAliases, - libraryExternals, - modules, - entries, - ignores, - type, - registry, - vendor -} = require('./.yo-rc.json')['generator-phovea']; +const {libraryAliases, libraryExternals, modules, entries, ignores, type, registry, vendor} = require('./.yo-rc.json')['generator-phovea']; const resolve = require('path').resolve; const pkg = require('./package.json'); const webpack = require('webpack'); @@ -33,9 +24,7 @@ const banner = '/*! ' + (pkg.title || pkg.name) + ' - v' + pkg.version + ' - ' + '* Copyright (c) ' + year + ' ' + pkg.author.name + ';' + ' Licensed ' + pkg.license + '*/\n'; -const preCompilerFlags = { - flags: (registry || {}).flags || {} -}; +const preCompilerFlags = {flags: (registry || {}).flags || {}}; const includeFeature = registry ? (extension, id) => { const exclude = registry.exclude || []; const include = registry.include || []; @@ -46,13 +35,14 @@ const includeFeature = registry ? (extension, id) => { return include.every(test) && !exclude.some(test); } : () => true; -const tsLoader = [{ - loader: 'awesome-typescript-loader' -}]; +const tsLoader = [ + { + loader: 'awesome-typescript-loader' + } +]; -const tsLoaderDev = [{ - loader: 'cache-loader' - }, +const tsLoaderDev = [ + {loader: 'cache-loader'}, { loader: 'thread-loader', options: { @@ -65,40 +55,24 @@ const tsLoaderDev = [{ options: { happyPackMode: true, // IMPORTANT! use happyPackMode mode to speed-up compilation and reduce errors reported to webpack, compilerOptions: { - "target": "es6", - "jsx": "react", - "jsxFactory": "h", + target: 'es6' } } } ]; // list of loaders and their mappings -const webpackloaders = [{ - test: /\.scss$/, - use: 'style-loader!css-loader!sass-loader' - }, - { - test: /\.css$/, - use: 'style-loader!css-loader' - }, - { - test: /\.tsx?$/, - use: tsLoader - }, +const webpackloaders = [ + {test: /\.scss$/, use: 'style-loader!css-loader!sass-loader'}, + {test: /\.css$/, use: 'style-loader!css-loader'}, + {test: /\.tsx?$/, use: tsLoader}, { - test: /phovea(_registry)?\.js$/, - use: [{ + test: /phovea(_registry)?\.js$/, use: [{ loader: 'ifdef-loader', - options: Object.assign({ - include: includeFeature - }, preCompilerFlags) + options: Object.assign({include: includeFeature}, preCompilerFlags) }] }, - { - test: /\.json$/, - use: 'json-loader' - }, + {test: /\.json$/, use: 'json-loader'}, { test: /\.(png|jpg)$/, loader: 'url-loader', @@ -122,10 +96,7 @@ const webpackloaders = [{ mimetype: 'image/svg+xml' } }, - { - test: /\.(ttf|eot)(\?v=[0-9]\.[0-9]\.[0-9])?$/, - loader: 'file-loader' - } + {test: /\.(ttf|eot)(\?v=[0-9]\.[0-9]\.[0-9])?$/, loader: 'file-loader'} ]; /** @@ -270,10 +241,7 @@ function generateWebpack(options) { } else if (options.isDev) { // switch to def settings base.module.loaders.find((d) => d.use === tsLoader).use = tsLoaderDev; - base.plugins.push(new ForkTsCheckerWebpackPlugin({ - checkSyntacticErrors: true, - tsconfig: './tsconfig_dev.json' - })); + base.plugins.push(new ForkTsCheckerWebpackPlugin({checkSyntacticErrors: true, tsconfig: './tsconfig_dev.json'})); } if (options.library) { @@ -299,10 +267,7 @@ function generateWebpack(options) { // ignore extra modules (options.ignore || []).forEach(function (d) { - base.module.loaders.push({ - test: new RegExp(d), - loader: 'null-loader' - }); // use null loader + base.module.loaders.push({test: new RegExp(d), loader: 'null-loader'}); // use null loader }); // ingore phovea module registry calls (options.modules || []).forEach(function (m) { @@ -315,7 +280,7 @@ function generateWebpack(options) { if (!options.bundle || options.isApp) { // extract the included css file to own file const p = new ExtractTextPlugin({ - filename: (options.isApp || options.moduleBundle ? '[name]' : pkg.name) + (options.min && !options.nosuffix ? '.min' : '') + '.css', + filename: (options.isApp || options.moduleBundle ? 'style' : pkg.name) + (options.min && !options.nosuffix ? '.min' : '') + '.css', allChunks: true // there seems to be a bug in dynamically loaded chunk styles are not loaded, workaround: extract all styles from all chunks }); base.plugins.push(p); @@ -361,7 +326,7 @@ function generateWebpack(options) { new webpack.optimize.UglifyJsPlugin()); } else { // generate source maps - base.devtool = 'source-map'; + base.devtool = 'inline-source-map'; } return base; }