diff --git a/.babelrc b/.babelrc
deleted file mode 100644
index f8e757fe90..0000000000
--- a/.babelrc
+++ /dev/null
@@ -1,13 +0,0 @@
-{
- "plugins": [
- "@babel/plugin-transform-runtime"
- ],
- "presets": [[
- "@babel/preset-env",
- {
- "useBuiltIns": "usage",
- "targets": ">1%, not dead, not ie 11",
- "corejs": 3
- }
- ]]
-}
diff --git a/cypress/support/utils-test.js b/cypress/support/utils-test.js
index 0a8d30d36e..df652cce4b 100644
--- a/cypress/support/utils-test.js
+++ b/cypress/support/utils-test.js
@@ -14,24 +14,11 @@
* limitations under the License.
*/
-import UtilsNew from "../../src/core/utils-new.js";
-import JSZip from "jszip";
import {TIMEOUT} from "./constants.js";
export default class UtilsTest {
-
- static getFileJson = async (path, filename ) => {
- try {
- const zipFiles = await JSZip.loadAsync(UtilsNew.importBinaryFile(path));
- const content = await zipFiles.file(filename).async("string");
- return JSON.parse(content);
- } catch (err) {
- console.error("File not exist", err);
- }
- }
-
static getByDataTest = (selector, tag, ...args) => cy.get(`div[data-testid='${selector}'] ${tag ?? ""}`, ...args);
static setInput = (selectors, val) => {
diff --git a/dependency-graph.sh b/dependency-graph.sh
deleted file mode 100755
index dfa8762ea2..0000000000
--- a/dependency-graph.sh
+++ /dev/null
@@ -1,23 +0,0 @@
-exclude=\
-"node_modules|"\
-"./deprecated|"\
-"src/genome-browser|"\
-"src/core|"\
-"src/core/src/core/utils.js|"\
-"src/core/utilsNew.js|"\
-"src/core/clients|"\
-"src/core/visualisation|"\
-"src/webcomponents/loading-spinner.js|"\
-"src/webcomponents/NotificationUtils.js|"\
-"src/webcomponents/PolymerUtils.js|"\
-"src/webcomponents/opencga/clinical/obsolete|"\
-"src/webcomponents/variant/deprecated|"\
-"src/webcomponents/Notification.js|"\
-"src/webcomponents/commons/filters/deprecated|"\
-"src/webcomponents/commons"
-
-depcruise "src/webcomponents/**/*.js" -x "^($exclude)" --output-type dot | dot -T svg > dependency.svg
-depcruise "src/sites/iva/**/*.js" -x "^($exclude)" --output-type json > dependency.json
-
-# depcruise "lib/jsorolla/src/core/webcomponents/**/*.js" -x "^($exclude)" --output-type dot | dot -Gsplines=ortho -Grankdir=TD -T svg > dependency.svg
-# depcruise "lib/jsorolla/src/core/webcomponents/**/*.js" -x "^($exclude)" --output-type ddot | dot -Gsplines=ortho -T svg > dependency.svg
diff --git a/docker/iva-app/Dockerfile b/docker/iva-app/Dockerfile
index 6923534ff7..60d125af12 100644
--- a/docker/iva-app/Dockerfile
+++ b/docker/iva-app/Dockerfile
@@ -28,11 +28,6 @@ COPY ./${SITE}/iva/img /usr/local/apache2/htdocs/iva/img/
RUN true
-## API
-COPY ./build/api /usr/local/apache2/htdocs/api
-COPY ./${SITE}/api/conf /usr/local/apache2/htdocs/api/conf/
-COPY ./${SITE}/api/img /usr/local/apache2/htdocs/api/img/
-
## Genome Maps (Coming soon :-) )
#COPY ./build/genome-maps /usr/local/apache2/htdocs/genome-maps
diff --git a/package.json b/package.json
index 4b7ab97d04..444aefe678 100644
--- a/package.json
+++ b/package.json
@@ -13,88 +13,46 @@
},
"scripts": {
"serve": "npm run serve:dev",
- "serve:dev": "vite",
- "serve:build": "vite preview",
+ "serve:dev": "webpack serve",
+ "serve:build": "cross-env PORT=4000 node ./scripts/server.js",
"clean": "rm -rf build",
- "build": "npm run clean && rollup -c && npm run package",
+ "build": "npm run clean && cross-env NODE_ENV=production webpack build",
"test:open": "cypress open",
"test:prepare": "./prepare-test.sh",
"test:run": "cypress run --spec cypress/e2e/commons/data-form.cy.js,cypress/e2e/iva/**/*.cy.js",
- "browser-support": "npx browserslist",
- "build-deprecated": "npm run clean && npm run dist && npx webpack && npm run package && npm run build-genome-browser",
- "build-genome-browser-demo": "for i in `ls src/genome-browser/demo`; do cat src/genome-browser/demo/$i | sed 's/..\\/..\\/..\\/node_modules/vendors/' | sed 's/..\\/..\\/..\\/dist/dist/' | sed 's/..\\/webcomponent\\//webcomponent\\//'> build/genome-browser/$i; done",
- "build-new-genome-browser-demo": "npx webpack --config webpack_genome.config.js",
- "build-genome-browser": "mkdir -p build/genome-browser/vendors && npm run build-genome-browser-demo && cp -r dist src/genome-browser/webcomponent build/genome-browser && cp -r node_modules/jquery node_modules/qtip2 node_modules/urijs node_modules/cookies-js node_modules/crypto-js node_modules/underscore node_modules/backbone node_modules/@fortawesome/fontawesome-free node_modules/@webcomponents node_modules/@polymer build/genome-browser/vendors",
- "webcomponents": "mkdir -p dist/js/webcomponents && cp -r src/webcomponents dist/js/",
- "core": "mkdir -p dist/js/core && cd src/core && cat *.js bioinfo/*js cache/*.js clients/*.js clients/cellbase/*js data-source/*.js visualisation/*.js data-adapter/feature-adapter.js data-adapter/cellbase-adapter.js data-adapter/opencga-adapter.js data-adapter/feature-template-adapter.js widgets/*.js ../webcomponents/*.js ../webcomponents/opencga/*.js ../webcomponents/commons/*.js ../webcomponents/variant/*.js > ../../dist/js/core/core.js && cd ../.. && node_modules/uglify-js/bin/uglifyjs dist/js/core/core.js -o dist/js/core/core.min.js && npm run webcomponents",
- "genome-browser": "mkdir -p dist/js/genome-browser && cd src/genome-browser && cp -r webcomponent ../../dist/js/genome-browser && cat *.js renderers/renderer.js renderers/*-renderer.js tracks/feature-track.js tracks/gene-track.js tracks/alignment-track.js tracks/variant-track.js tracks/tracklist-panel.js > ../../dist/js/genome-browser/genome-browser.js && cd ../.. && node_modules/uglify-js/bin/uglifyjs dist/js/genome-browser/genome-browser.js -o dist/js/genome-browser/genome-browser.min.js",
- "dist": "npm run clean && mkdir -p dist/js && npm install && npm run core && npm run genome-browser && npm run styles",
- "serve-deprecated": "wds --watch --open src/sites/iva --node-resolve",
"package": "mv build iva-$npm_package_version && tar zcvf iva-$npm_package_version.tar.gz iva-$npm_package_version && mv iva-$npm_package_version build",
- "eslint": "eslint -c .eslintrc.json . --ignore-pattern '/web_modules/'",
- "lint:js": "lint-staged",
- "graph": "./dependency-graph.sh"
+ "eslint": "eslint -c .eslintrc.json . --ignore-pattern '/web_modules/'"
},
"license": "Apache-2.0",
"dependencies": {
"@eonasdan/tempus-dominus": "^6.7.11",
"@fortawesome/fontawesome-free": "^5.11.2",
- "@highlightjs/cdn-assets": "^10.6.0",
- "@polymer/polymer": "2.6.1",
- "@popperjs/core": "^2.11.7",
- "@svgdotjs/svg.js": "^3.0.16",
- "@vaadin/router": "^1.7.2",
- "animate.css": "^3.5.2",
"backbone": "~1.3.3",
"bootstrap": "^5.3.3",
- "bootstrap-3-typeahead": "^4.0.2",
- "bootstrap-colorpicker": "2.3.6",
- "bootstrap-select": "1.14.0-beta3",
"bootstrap-table": "1.21.2",
- "bootstrap-treeview": "git@github.com:jonmiles/bootstrap-treeview.git#develop",
- "bootstrap-validator": "~0.11.9",
"clipboard": "^2.0.6",
"cookies-js": "^1.2.3",
- "countup.js": "^2.0.8",
- "crypto-js": "~3.1.9-1",
- "cytoscape": "~2.5.4",
- "file-saver": "~1.3.2",
- "highcharts": "^8.0.4",
+ "highcharts": "^11.4.8",
"html-to-pdfmake": "^2.4.23",
- "jquery": "~2.2.4",
- "jquery.json-viewer": "^1.4.0",
- "jszip": "^3.10.1",
+ "jquery": "^3.7.1",
"jwt-decode": "^2.2.0",
"lit": "^2.7.4",
"lodash": "^4.17.19",
"moment": "^2.15.1",
- "pako": "~0.2.8",
"pdfmake": "^0.2.7",
"qtip2": "~3.0.3",
"select2": "^4.1.0-rc.0",
"select2-bootstrap-5-theme": "^1.3.0",
- "sweetalert2": "^9.13.1",
- "urijs": "~1.19.10",
"vanilla-jsoneditor": "^0.7.11"
},
"devDependencies": {
- "@babel/core": "^7.15.5",
- "@babel/plugin-transform-runtime": "^7.9.6",
- "@babel/preset-env": "^7.15.4",
- "@babel/runtime": "^7.15.4",
"@cypress/grep": "^3.1.5",
- "@rollup/plugin-babel": "^5.3.0",
- "@rollup/plugin-node-resolve": "^13.0.4",
- "@rollup/plugin-replace": "^4.0.0",
- "@rollup/plugin-terser": "^0.4.3",
- "@web/rollup-plugin-html": "^1.10.1",
- "babel-eslint": "^10.0.3",
- "core-js": "^3.17.2",
- "crisper": "~2.1.1",
- "cypress": "^12.4.0",
+ "copy-webpack-plugin": "^12.0.2",
+ "cross-env": "^7.0.3",
+ "css-loader": "^7.1.2",
+ "cypress": "^13.15.1",
"cypress-mochawesome-reporter": "^3.2.3",
"cypress-wait-until": "^1.7.1",
- "dependency-cruiser": "^10.0.7",
"eslint": "^7.29.0",
"eslint-config-google": "^0.14.0",
"eslint-plugin-cypress": "^2.10.3",
@@ -102,24 +60,13 @@
"eslint-plugin-lit": "^1.4.1",
"eslint-plugin-sort-class-members": "^1.11.0",
"eslint-plugin-wc": "^1.3.0",
- "file-loader": "^5.0.2",
- "grunt": "^1.4.0",
- "grunt-shell": "^3.0.1",
- "highlight.js": "^10.6.0",
+ "html-webpack-plugin": "^5.6.2",
"lint-staged": "^11.0.0",
- "postcss": "^8.4.24",
- "regenerator-runtime": "^0.13.3",
- "rollup": "^2.56.3",
- "rollup-plugin-cleaner": "^1.0.0",
- "rollup-plugin-copy": "^3.4.0",
- "rollup-plugin-delete": "^2.0.0",
- "rollup-plugin-eslint": "^7.0.0",
- "rollup-plugin-minify-html-literals": "^1.2.6",
- "uglify-es": "~3.1.9",
- "uglify-js": "^3.14.2",
- "uglifycss": "0.0.29",
- "vite": "^5.0.2",
- "xmldom": "0.1.27"
+ "mime-types": "^2.1.35",
+ "mini-css-extract-plugin": "^2.9.1",
+ "webpack": "^5.96.1",
+ "webpack-cli": "^5.1.4",
+ "webpack-dev-server": "^5.1.0"
},
"browserslist": [
"chrome > 79",
diff --git a/rollup.config.js b/rollup.config.js
deleted file mode 100644
index 1bed1b7037..0000000000
--- a/rollup.config.js
+++ /dev/null
@@ -1,250 +0,0 @@
-import html from "@web/rollup-plugin-html";
-import copy from "rollup-plugin-copy";
-import resolve from "@rollup/plugin-node-resolve";
-import replace from "@rollup/plugin-replace";
-import minifyHTML from "rollup-plugin-minify-html-literals";
-import fs from "fs";
-import path from "path";
-import del from "rollup-plugin-delete";
-import {babel} from "@rollup/plugin-babel";
-import terser from "@rollup/plugin-terser";
-import {execSync} from "child_process";
-import pkg from "./package.json";
-
-// eslint-disable-next-line no-undef
-const env = process.env || {};
-// eslint-disable-next-line no-undef
-const buildPath = path.join(__dirname, "build");
-// eslint-disable-next-line no-undef
-const sitesPath = path.join(__dirname, "src/sites");
-const patternConfig = /(config|settings|constants|tools)/gi;
-const internalCss = /(global|magic-check|style|toggle-switch|genome-browser)/gi;
-
-// Get target sites to build
-const getSitesToBuild = () => {
- // Josemi 2023-09-12 NOTE: test-app has been included by default in build process
- const sites = ["iva", "api", "test-app"];
- // Check if we need to include the test-app site in the sites to build list
- // This can be enabled using the '--include-test-app' flag when running 'npm run build' command
- // if (env.npm_config_include_test_app) {
- // sites.push("test-app");
- // }
- return sites;
-};
-
-const revision = () => {
- try {
- const jsorollaBranch = execSync("git rev-parse --abbrev-ref HEAD").toString();
- const jsorollaSha1 = execSync("git rev-parse HEAD").toString();
- return `
- Jsorolla Version: ${pkg.version} | Git: ${jsorollaBranch.trim()} - ${jsorollaSha1.trim()}
- Build generated on: ${new Date()}\n `;
- } catch (error) {
- console.error(`
- Status: ${error.status}
- ${error.stderr.toString()}
- `);
- }
-};
-
-const isConfig = name => {
- return name.match(patternConfig) !== null;
-};
-
-const isInternalCss = name => {
- return name.match(internalCss) !== null;
-};
-
-const getCustomSitePath = (name, from, folder) => {
- // NOTE: custom sites are not allowed for 'test-app'
- if (env.npm_config_custom_site && name.toUpperCase() !== "TEST-APP") {
- return `${from}custom-sites/${env.npm_config_custom_site}/${name}/${folder}`;
- }
- return folder; // Default path configuration
-};
-
-const getExtensionsPath = name => {
- // NOTE: extensions are only enabled at this moment for IVA
- if (env.npm_extensions && name.toUpperCase() === "IVA") {
- // We need to make sure that the extensions file exists
- // eslint-disable-next-line no-undef
- const extensionsPath = path.join(__dirname, "extensions", "build", "extensions.js");
- if (fs.existsSync(extensionsPath)) {
- return "../../../extensions/build";
- }
- }
- return "extensions";
-};
-
-const transformHtmlContent = (html, name) => {
- const annihilator = /[\s\S]*?/mg;
- const parsedName = name.replace(/-/g, "_").toUpperCase();
- const configRegex = new RegExp(`{{ ${parsedName}_CONFIG_PATH }}`, "g");
- const extensionsRegex = new RegExp(`{{ ${parsedName}_EXTENSIONS_PATH }}`, "g");
-
- return html
- .replace("[build-signature]", revision())
- .replace(annihilator, "")
- .replace(configRegex, getCustomSitePath(name, "../../../", "conf"))
- .replace(extensionsRegex, getExtensionsPath(name));
-};
-
-const getSiteContent = name => {
- const content = fs.readFileSync(path.join(sitesPath, name, "index.html"), "utf8");
- return {
- name: "index.html",
- html: transformHtmlContent(content, name),
- };
-};
-
-const getCopyTargets = site => {
- const targets = [
- {
- src: `./src/sites/${site}/img`,
- dest: `${buildPath}/${site}/`,
- },
- {
- src: "./styles/img",
- dest: `${buildPath}/${site}/`,
- },
- {
- src: "./styles/fonts",
- dest: `${buildPath}/${site}/`,
- },
- {
- src: "./src/genome-browser/img",
- dest: `${buildPath}/${site}/`,
- },
- {
- src: "./node_modules/@fortawesome/fontawesome-free/webfonts/*.woff2",
- dest: `${buildPath}/${site}/vendors/webfonts`,
- },
- ];
- if (env.npm_config_custom_site) {
- targets.push({
- src: getCustomSitePath(site, "", "img"),
- dest: `${buildPath}/${site}/`
- });
- }
- return targets;
-};
-
-export default getSitesToBuild().map(site => ({
- plugins: [
- del({
- targets: `build/${site}`,
- }),
- replace({
- preventAssignment: true,
- values: {
- "process.env.VERSION": JSON.stringify(pkg.version),
- },
- }),
- html({
- rootDir: `${sitesPath}/${site}/`,
- input: getSiteContent(site),
- }),
- resolve(),
- minifyHTML(),
- babel({
- exclude: "node_modules/**",
- babelHelpers: "runtime",
- presets: ["@babel/preset-env"],
- plugins: [
- "@babel/plugin-transform-runtime",
- ]
- }),
- terser({
- ecma: 2020,
- module: true,
- warnings: true
- }),
- copy({
- targets: getCopyTargets(site),
- }),
- ],
- moduleContext: id => {
- // Avoid this Error: https://rollupjs.org/guide/en/#error-this-is-undefined
- /*
- * In order to match native module behaviour, Rollup sets `this`
- * as `undefined` at the top level of modules. Rollup also outputs
- * a warning if a module tries to access `this` at the top level.
- * The following modules use `this` at the top level and expect it
- * to be the global `window` object, so we tell Rollup to set
- *`this = window` for these modules.
- */
- const thisAsWindowForModules = [
- "node_modules/countup.js/dist/countUp.min.js"
- ];
-
- if (thisAsWindowForModules.some(id_ => id.trimRight().endsWith(id_))) {
- return "window";
- }
- },
- output: {
- dir: `${buildPath}/${site}`,
- minifyInternalExports: false,
- manualChunks: id => {
- // Extract opencga client mock
- if (id.includes("test-app/clients/opencga-client-mock") || id.includes("api-mock")) {
- return "lib/opencga-client-mock.min";
- }
- // Extract cellbase client mock
- if (id.includes("test-app/clients/cellbase-client-mock")) {
- return "lib/cellbase-client-mock.min";
- }
- // Josemi 2023-09-19 NOTE: 'opencga-catalog-utils' is included inside the 'clients/opencga' folder
- // We need to make sure this file is not included in the opencga client bundle
- if (id.includes("clients/opencga") && !id.includes("opencga-catalog-utils")) {
- return "lib/opencga-client.min";
- }
- if (id.includes("node_modules")) {
- return "vendors/js/vendors";
- }
- if (id.includes("src/webcomponents")) {
- return "lib/webcomponents.min";
- }
- if (id.includes("src/core")) {
- return "lib/core.min";
- }
- },
- chunkFileNames: () => {
- return "[name]-[hash].js"; // configuration of manualChunks about name format and folder.
- },
- entryFileNames: entryInfo => {
- // Check for extensions entry --> save into 'extensions' folder
- if (entryInfo.name === "extensions") {
- return "extensions/[name].js";
- }
- return "lib/[name].js";
- },
- assetFileNames: assetInfo => {
- // if (assetInfo.name.includes("genome-browser.config")) {
- // return "genome-maps/conf/[name][extname]";
- // }
-
- if (isConfig(assetInfo.name)) {
- return "conf/[name][extname]";
- }
-
- if (isInternalCss(assetInfo.name)) {
- return "css/[name]-[hash][extname]";
- }
-
- // if (assetInfo.name.includes("extensions")) {
- // return "extensions/[name][extname]";
- // }
-
- if (assetInfo.name.endsWith(".js") && !isConfig(assetInfo.name)) {
- return "vendors/js/[name]-[hash][extname]";
- }
-
- if (assetInfo.name.endsWith(".css")) {
- return "vendors/css/[name]-[hash][extname]";
- }
-
- return "vendors/[name]-[hash][extname]";
- },
- },
-
-}));
diff --git a/scripts/server.js b/scripts/server.js
new file mode 100644
index 0000000000..6f5c8bd498
--- /dev/null
+++ b/scripts/server.js
@@ -0,0 +1,50 @@
+/* eslint-disable no-undef */
+const fs = require("node:fs");
+const http = require("node:http");
+const path = require("node:path");
+const mime = require("mime-types");
+
+const PORT = process.env.PORT || 4000;
+
+// send the provided file as a response
+const sendFile = (request, response, filePath) => {
+ fs.realpath(filePath, "utf8", (error, realFilePath) => {
+ if (!error && realFilePath === filePath) {
+ const pathIsDirectory = fs.statSync(realFilePath).isDirectory();
+ // 1. File exists and is not a directory
+ if (!pathIsDirectory) {
+ response.writeHead(200, {
+ "Content-Type": mime.lookup(path.basename(realFilePath)),
+ });
+ return fs.createReadStream(realFilePath).pipe(response);
+ }
+ // 2. Path is a directory: redirect to the same url but adding the trailing '/'
+ response.writeHead(302, {location: request.url + "/"});
+ return response.end();
+ }
+ // 3. Path does not exist: send a 404 message
+ response.writeHead(404);
+ response.end("Not found.");
+ });
+};
+
+const server = http.createServer((request, response) => {
+ // Capture all requests to 'test-data' folder
+ if (request.url.includes("test-data/")) {
+ // Note: test-data folder is always on the root of the jsorolla project
+ const testDataPath = path.join("../test-data", request.url.replace(/^[\w/\-_]*test-data\//, ""));
+ return sendFile(request, response, path.resolve(__dirname, testDataPath));
+ }
+ // If request does not contain 'test-data', try to find the file inside 'build' folder
+ // We will make sure that if request is a folder, the file 'index.html' file is served
+ const paths = [process.cwd(), "build", request.url];
+ if (request.url.endsWith("/")) {
+ paths.push("index.html");
+ }
+ return sendFile(request, response, path.join(...paths));
+});
+
+// Launch server
+server.listen(PORT);
+
+console.log(`Server running at http://127.0.0.1:${PORT}/`);
diff --git a/scripts/webpack-plugin-html-assets-fix.js b/scripts/webpack-plugin-html-assets-fix.js
new file mode 100644
index 0000000000..1a42f11cef
--- /dev/null
+++ b/scripts/webpack-plugin-html-assets-fix.js
@@ -0,0 +1,26 @@
+/* eslint-disable no-undef */
+/* eslint-disable no-param-reassign */
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+
+class WebpackPluginHtmlAssetsFix {
+
+ static PLUGIN_NAME = "WebpackPluginHtmlAssetsFix";
+
+ apply(compiler) {
+ compiler.hooks.compilation.tap(WebpackPluginHtmlAssetsFix.PLUGIN_NAME, compilation => {
+ const compilationHooks = HtmlWebpackPlugin.getCompilationHooks(compilation);
+ compilationHooks.beforeAssetTagGeneration.tapAsync(WebpackPluginHtmlAssetsFix.PLUGIN_NAME, (data, callback) => {
+ const chunk = data.plugin.userOptions.chunks[0];
+ ["js", "css"].forEach(type => {
+ data.assets[type] = (data.assets[type] || [])
+ .filter(file => !!file)
+ .map(file => file.replace("../" + chunk, "."));
+ });
+ return callback(null, data);
+ });
+ });
+ }
+
+}
+
+module.exports = WebpackPluginHtmlAssetsFix;
diff --git a/scripts/webpack-plugin-html-build-info.js b/scripts/webpack-plugin-html-build-info.js
new file mode 100644
index 0000000000..38772c17c4
--- /dev/null
+++ b/scripts/webpack-plugin-html-build-info.js
@@ -0,0 +1,36 @@
+/* eslint-disable no-undef */
+/* eslint-disable no-param-reassign */
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+
+class WebpackPluginHtmlBuildInfo {
+
+ static PLUGIN_NAME = "WebpackPluginHtmlBuildInfo";
+
+ constructor(options) {
+ this.options = options;
+ }
+
+ apply(compiler) {
+ compiler.hooks.compilation.tap(WebpackPluginHtmlBuildInfo.PLUGIN_NAME, compilation => {
+ const compilationHooks = HtmlWebpackPlugin.getCompilationHooks(compilation);
+ compilationHooks.beforeEmit.tapAsync(WebpackPluginHtmlBuildInfo.PLUGIN_NAME, (data, callback) => {
+ const lines = data.html.split("\n");
+ // find the index where the
begins
+ const headStartIndex = lines.findIndex(line => {
+ return line.trim().startsWith("");
+ });
+ if (headStartIndex > -1) {
+ lines.splice(headStartIndex + 1, 0, ` -->`);
+ lines.splice(headStartIndex + 1, 0, ` Build generated on: ${this.options.date}`);
+ lines.splice(headStartIndex + 1, 0, ` ${this.options.name} Version: ${this.options.version} | Git: ${this.options.branch} - ${this.options.commit}`);
+ lines.splice(headStartIndex + 1, 0, `
-
-
-
-
- Cache tests
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/core/clients/test/tests.js b/src/core/clients/test/tests.js
deleted file mode 100644
index c7c42f87c9..0000000000
--- a/src/core/clients/test/tests.js
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright 2015 OpenCB
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * Created with IntelliJ IDEA.
- * User: imedina
- * Date: 10/9/13
- * Time: 6:00 PM
- * To change this template use File | Settings | File Templates.
- */
-
-test("OpenCGAClient", function() {
- ok( 1 == 1, "Passed!" );
-});
-
-test("Adding and Getting", function() {
- ok( 1 == 1, "Passed!" );
-});
diff --git a/src/exclude b/src/exclude
deleted file mode 100644
index 8f0fff205d..0000000000
--- a/src/exclude
+++ /dev/null
@@ -1 +0,0 @@
-import "./core/clients/test/tests.js";
diff --git a/src/genome-browser/vendor/ChemDoodleWeb.css b/src/genome-browser/vendor/ChemDoodleWeb.css
deleted file mode 100644
index 446cd71d75..0000000000
--- a/src/genome-browser/vendor/ChemDoodleWeb.css
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-//
-// ChemDoodle Web Components 7.0.1
-//
-// http://web.chemdoodle.com
-//
-// Copyright 2009-2015 iChemLabs, LLC. All rights reserved.
-//
-// The ChemDoodle Web Components library is licensed under version 3
-// of the GNU GENERAL PUBLIC LICENSE.
-//
-// You may redistribute it and/or modify it under the terms of the
-// GNU General Public License as published by the Free Software Foundation,
-// either version 3 of the License, or (at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with this program. If not, see .
-//
-// Please contact iChemLabs for
-// alternate licensing options.
-//
-*/
-canvas.ChemDoodleWebComponent {
- border: 1px solid black;
-}
diff --git a/src/genome-browser/vendor/ChemDoodleWeb.js b/src/genome-browser/vendor/ChemDoodleWeb.js
deleted file mode 100644
index dacc617730..0000000000
--- a/src/genome-browser/vendor/ChemDoodleWeb.js
+++ /dev/null
@@ -1,766 +0,0 @@
-//
-// ChemDoodle Web Components 7.0.1
-//
-// http://web.chemdoodle.com
-//
-// Copyright 2009-2015 iChemLabs, LLC. All rights reserved.
-//
-// The ChemDoodle Web Components library is licensed under version 3
-// of the GNU GENERAL PUBLIC LICENSE.
-//
-// You may redistribute it and/or modify it under the terms of the
-// GNU General Public License as published by the Free Software Foundation,
-// either version 3 of the License, or (at your option) any later version.
-//
-// As an exception to the GPL, you may distribute this packed form of
-// the code without the copy of the GPL license normally required,
-// provided you include this license notice and a URL through which
-// recipients can access the corresponding unpacked source code.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// Please contact iChemLabs for
-// alternate licensing options.
-//
-var ChemDoodle=function(){var b={iChemLabs:{},informatics:{},io:{},lib:{},notations:{},structures:{}};b.structures.d2={};b.structures.d3={};b.getVersion=function(){return"7.0.1"};return b}();
-(function(b,j,o){function l(z){var c=z.length,a=m.type(z);return m.isWindow(z)?!1:1===z.nodeType&&c?!0:"array"===a||"function"!==a&&(0===c||"number"===typeof c&&0c;c+=2)"margin"===a&&(f+=m.css(z,a+Aa[c],!0,k)),d?("content"===a&&(f-=m.css(z,"padding"+Aa[c],!0,k)),"margin"!==a&&(f-=m.css(z,"border"+Aa[c]+"Width",
-!0,k))):(f+=m.css(z,"padding"+Aa[c],!0,k),"padding"!==a&&(f+=m.css(z,"border"+Aa[c]+"Width",!0,k)));return f}function G(z,c,a){var d=!0,k="width"===c?z.offsetWidth:z.offsetHeight,f=Ba(z),e=m.support.boxSizing&&"border-box"===m.css(z,"boxSizing",!1,f);if(0>=k||null==k){k=Ca(z,c,f);if(0>k||null==k)k=z.style[c];if(Wa.test(k))return k;d=e&&(m.support.boxSizingReliable||k===z.style[c]);k=parseFloat(k)||0}return k+D(z,c,a||(e?"border":"content"),d,f)+"px"}function E(z){var c=K,a=Pb[z];if(!a){a=H(z,c);if("none"===
-a||!a)Ra=(Ra||m("\x3ciframe frameborder\x3d'0' width\x3d'0' height\x3d'0'/\x3e").css("cssText","display:block !important")).appendTo(c.documentElement),c=(Ra[0].contentWindow||Ra[0].contentDocument).document,c.write("\x3c!doctype html\x3e\x3chtml\x3e\x3cbody\x3e"),c.close(),a=H(z,c),Ra.detach();Pb[z]=a}return a}function H(z,c){var a=m(c.createElement(z)).appendTo(c.body),d=m.css(a[0],"display");a.remove();return d}function I(z,c,a,d){var k;if(m.isArray(c))m.each(c,function(c,k){a||Dc.test(z)?d(z,
-k):I(z+"["+("object"===typeof k?c:"")+"]",k,a,d)});else if(!a&&"object"===m.type(c))for(k in c)I(z+"["+k+"]",c[k],a,d);else d(z,c)}function M(z){return function(c,a){"string"!==typeof c&&(a=c,c="*");var d,k=0,f=c.toLowerCase().match(pa)||[];if(m.isFunction(a))for(;d=f[k++];)"+"===d[0]?(d=d.slice(1)||"*",(z[d]=z[d]||[]).unshift(a)):(z[d]=z[d]||[]).push(a)}}function J(z,c,a,d){function k(b){var g;f[b]=!0;m.each(z[b]||[],function(z,b){var n=b(c,a,d);if("string"===typeof n&&!e&&!f[n])return c.dataTypes.unshift(n),
-k(n),!1;if(e)return!(g=n)});return g}var f={},e=z===nb;return k(c.dataTypes[0])||!f["*"]&&k("*")}function T(z,c){var a,d,k=m.ajaxSettings.flatOptions||{};for(d in c)c[d]!==o&&((k[d]?z:a||(a={}))[d]=c[d]);a&&m.extend(!0,z,a);return z}function F(){try{return new b.XMLHttpRequest}catch(z){}}function W(){setTimeout(function(){La=o});return La=m.now()}function R(z,c,a){for(var d,k=(Sa[c]||[]).concat(Sa["*"]),f=0,e=k.length;fa&&f)return c;b.resolveWith(z,[n]);return!1},n=b.promise({elem:z,props:m.extend({},c),opts:m.extend(!0,{specialEasing:{}},a),originalProperties:c,originalOptions:a,startTime:La||W(),duration:a.duration,tweens:[],createTween:function(c,a){var d=m.Tween(z,n.opts,c,a,n.opts.specialEasing[c]||
-n.opts.easing);n.tweens.push(d);return d},stop:function(c){var a=0,d=c?n.tweens.length:0;if(k)return this;for(k=!0;ak;k+=2-c)a=Aa[k],d["margin"+a]=d["padding"+a]=z;c&&(d.opacity=d.width=z);return d}function Da(z){return m.isWindow(z)?z:9===z.nodeType?z.defaultView||z.parentWindow:
-!1}var ka,$,oa=typeof o,Fc=b.location,K=b.document,ca=K.documentElement,da=b.jQuery,ea=b.$,Y={},ga=[],sa=ga.concat,qa=ga.push,U=ga.slice,Qb=ga.indexOf,Gc=Y.toString,Ma=Y.hasOwnProperty,ob="1.10.2".trim,m=function(z,c){return new m.fn.init(z,c,$)},Ya=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,pa=/\S+/g,Hc=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,Ic=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,Rb=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,Jc=/^[\],:{}\s]*$/,Kc=/(?:^|:|,)(?:\s*\[)+/g,Lc=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
-Mc=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,Nc=/^-ms-/,Oc=/-([\da-z])/gi,Pc=function(z,c){return c.toUpperCase()},ta=function(z){if(K.addEventListener||"load"===z.type||"complete"===K.readyState)Sb(),m.ready()},Sb=function(){K.addEventListener?(K.removeEventListener("DOMContentLoaded",ta,!1),b.removeEventListener("load",ta,!1)):(K.detachEvent("onreadystatechange",ta),b.detachEvent("onload",ta))};m.fn=m.prototype={jquery:"1.10.2",constructor:m,init:function(z,c,a){var d;if(!z)return this;
-if("string"===typeof z){if((d="\x3c"===z.charAt(0)&&"\x3e"===z.charAt(z.length-1)&&3<=z.length?[null,z,null]:Ic.exec(z))&&(d[1]||!c)){if(d[1]){if(c=c instanceof m?c[0]:c,m.merge(this,m.parseHTML(d[1],c&&c.nodeType?c.ownerDocument||c:K,!0)),Rb.test(d[1])&&m.isPlainObject(c))for(d in c)if(m.isFunction(this[d]))this[d](c[d]);else this.attr(d,c[d])}else{if((c=K.getElementById(d[2]))&&c.parentNode){if(c.id!==d[2])return a.find(z);this.length=1;this[0]=c}this.context=K;this.selector=z}return this}return!c||
-c.jquery?(c||a).find(z):this.constructor(c).find(z)}if(z.nodeType)return this.context=this[0]=z,this.length=1,this;if(m.isFunction(z))return a.ready(z);z.selector!==o&&(this.selector=z.selector,this.context=z.context);return m.makeArray(z,this)},selector:"",length:0,toArray:function(){return U.call(this)},get:function(z){return null==z?this.toArray():0>z?this[this.length+z]:this[z]},pushStack:function(z){z=m.merge(this.constructor(),z);z.prevObject=this;z.context=this.context;return z},each:function(z,
-c){return m.each(this,z,c)},ready:function(z){m.ready.promise().done(z);return this},slice:function(){return this.pushStack(U.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(z){var c=this.length;z=+z+(0>z?c:0);return this.pushStack(0<=z&&zd?Math.max(0,k+d):d:0;dQ.cacheLength&&delete c[a.shift()];return c[d]=k}var a=[];return c},ia=function(c){c[X]=!0;return c},ja=function(c){var a=aa.createElement("div");try{return!!c(a)}catch(d){return!1}finally{a.parentNode&&a.parentNode.removeChild(a)}},tb=function(c,a){for(var d=c.split("|"),k=c.length;k--;)Q.attrHandle[d[k]]=a},Ub=function(c,a){var d=a&&c,k=d&&1===c.nodeType&&1===a.nodeType&&(~a.sourceIndex||Tb)-(~c.sourceIndex||Tb);
-if(k)return k;if(d)for(;d=d.nextSibling;)if(d===a)return-1;return c?1:-1},Sc=function(c){return function(a){return"input"===a.nodeName.toLowerCase()&&a.type===c}},Tc=function(c){return function(a){var d=a.nodeName.toLowerCase();return("input"===d||"button"===d)&&a.type===c}},Fa=function(c){return ia(function(a){a=+a;return ia(function(d,k){for(var f,e=c([],d.length,a),b=e.length;b--;)if(d[f=e[b]])d[f]=!(k[f]=d[f])})})},Vb=function(){},Za=function(c,a){var d,k,f,e,b,n,g;if(b=Wb[c+" "])return a?0:b.slice(0);
-b=c;n=[];for(g=Q.preFilter;b;){if(!d||(k=Uc.exec(b)))k&&(b=b.slice(k[0].length)||b),n.push(f=[]);d=!1;if(k=Vc.exec(b))d=k.shift(),f.push({value:d,type:k[0].replace(ab," ")}),b=b.slice(d.length);for(e in Q.filter)if((k=bb[e].exec(b))&&(!g[e]||(k=g[e](k))))d=k.shift(),f.push({value:d,type:e,matches:k}),b=b.slice(d.length);if(!d)break}return a?b.length:b?S.error(c):Wb(c,n).slice(0)},$a=function(c){for(var a=0,d=c.length,k="";a+~]|[\x20\t\r\n\f])[\x20\t\r\n\f]*/,qb=/[\x20\t\r\n\f]*[+~]/,$c=RegExp("\x3d[\\x20\\t\\r\\n\\f]*([^\\]'\"]*)[\\x20\\t\\r\\n\\f]*\\]","g"),ad=RegExp(zb),bd=RegExp("^"+ac+"$"),bb={ID:/^#((?:\\.|[\w-]|[^\x00-\xa0])+)/,CLASS:/^\.((?:\\.|[\w-]|[^\x00-\xa0])+)/,TAG:RegExp("^("+"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+".replace("w","w*")+")"),ATTR:RegExp("^"+bc),PSEUDO:RegExp("^"+
-zb),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\([\\x20\\t\\r\\n\\f]*(even|odd|(([+-]|)(\\d*)n|)[\\x20\\t\\r\\n\\f]*(?:([+-]|)[\\x20\\t\\r\\n\\f]*(\\d+)|))[\\x20\\t\\r\\n\\f]*\\)|)","i"),bool:RegExp("^(?:checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)$","i"),needsContext:RegExp("^[\\x20\\t\\r\\n\\f]*[\x3e+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\([\\x20\\t\\r\\n\\f]*((?:-\\d)?\\d*)[\\x20\\t\\r\\n\\f]*\\)|)(?\x3d[^-]|$)",
-"i")},Ab=/^[^{]+\{\s*\[native \w/,Qc=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,cd=/^(?:input|select|textarea|button)$/i,dd=/^h\d$/i,Rc=/'|\\/g,va=RegExp("\\\\([\\da-f]{1,6}[\\x20\\t\\r\\n\\f]?|([\\x20\\t\\r\\n\\f])|.)","ig"),wa=function(c,a,d){c="0x"+a-65536;return c!==c||d?a:0>c?String.fromCharCode(c+65536):String.fromCharCode(c>>10|55296,c&1023|56320)};try{ua.apply(xa=$b.call(ra.childNodes),ra.childNodes),xa[ra.childNodes.length].nodeType}catch(Gd){ua={apply:xa.length?function(c,a){Zc.apply(c,$b.call(a))}:
-function(c,a){for(var d=c.length,k=0;c[d++]=a[k++];);c.length=d-1}}}Xb=S.isXML=function(c){return(c=c&&(c.ownerDocument||c).documentElement)?"HTML"!==c.nodeName:!1};V=S.support={};Ea=S.setDocument=function(c){var a=c?c.ownerDocument||c:ra;c=a.defaultView;if(a===aa||9!==a.nodeType||!a.documentElement)return aa;aa=a;na=a.documentElement;la=!Xb(a);c&&(c.attachEvent&&c!==c.top)&&c.attachEvent("onbeforeunload",function(){Ea()});V.attributes=ja(function(c){c.className="i";return!c.getAttribute("className")});
-V.getElementsByTagName=ja(function(c){c.appendChild(a.createComment(""));return!c.getElementsByTagName("*").length});V.getElementsByClassName=ja(function(c){c.innerHTML="\x3cdiv class\x3d'a'\x3e\x3c/div\x3e\x3cdiv class\x3d'a i'\x3e\x3c/div\x3e";c.firstChild.className="i";return 2===c.getElementsByClassName("i").length});V.getById=ja(function(c){na.appendChild(c).id=X;return!a.getElementsByName||!a.getElementsByName(X).length});V.getById?(Q.find.ID=function(c,a){if("undefined"!==typeof a.getElementById&&
-la){var d=a.getElementById(c);return d&&d.parentNode?[d]:[]}},Q.filter.ID=function(c){var a=c.replace(va,wa);return function(c){return c.getAttribute("id")===a}}):(delete Q.find.ID,Q.filter.ID=function(c){var a=c.replace(va,wa);return function(c){return(c="undefined"!==typeof c.getAttributeNode&&c.getAttributeNode("id"))&&c.value===a}});Q.find.TAG=V.getElementsByTagName?function(c,a){if("undefined"!==typeof a.getElementsByTagName)return a.getElementsByTagName(c)}:function(c,a){var d,k=[],z=0,f=a.getElementsByTagName(c);
-if("*"===c){for(;d=f[z++];)1===d.nodeType&&k.push(d);return k}return f};Q.find.CLASS=V.getElementsByClassName&&function(c,a){if("undefined"!==typeof a.getElementsByClassName&&la)return a.getElementsByClassName(c)};Ia=[];fa=[];if(V.qsa=Ab.test(a.querySelectorAll))ja(function(c){c.innerHTML="\x3cselect\x3e\x3coption selected\x3d''\x3e\x3c/option\x3e\x3c/select\x3e";c.querySelectorAll("[selected]").length||fa.push("\\[[\\x20\\t\\r\\n\\f]*(?:value|checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)");
-c.querySelectorAll(":checked").length||fa.push(":checked")}),ja(function(c){var d=a.createElement("input");d.setAttribute("type","hidden");c.appendChild(d).setAttribute("t","");c.querySelectorAll("[t^\x3d'']").length&&fa.push("[*^$]\x3d[\\x20\\t\\r\\n\\f]*(?:''|\"\")");c.querySelectorAll(":enabled").length||fa.push(":enabled",":disabled");c.querySelectorAll("*,:x");fa.push(",.*:")});(V.matchesSelector=Ab.test(gb=na.webkitMatchesSelector||na.mozMatchesSelector||na.oMatchesSelector||na.msMatchesSelector))&&
-ja(function(c){V.disconnectedMatch=gb.call(c,"div");gb.call(c,"[s!\x3d'']:x");Ia.push("!\x3d",zb)});fa=fa.length&&RegExp(fa.join("|"));Ia=Ia.length&&RegExp(Ia.join("|"));Ta=Ab.test(na.contains)||na.compareDocumentPosition?function(c,a){var d=9===c.nodeType?c.documentElement:c,k=a&&a.parentNode;return c===k||!(!k||!(1===k.nodeType&&(d.contains?d.contains(k):c.compareDocumentPosition&&c.compareDocumentPosition(k)&16)))}:function(c,a){if(a)for(;a=a.parentNode;)if(a===c)return!0;return!1};yb=na.compareDocumentPosition?
-function(c,d){if(c===d)return Oa=!0,0;var k=d.compareDocumentPosition&&c.compareDocumentPosition&&c.compareDocumentPosition(d);return k?k&1||!V.sortDetached&&d.compareDocumentPosition(c)===k?c===a||Ta(ra,c)?-1:d===a||Ta(ra,d)?1:Ha?Ga.call(Ha,c)-Ga.call(Ha,d):0:k&4?-1:1:c.compareDocumentPosition?-1:1}:function(c,d){var k,z=0;k=c.parentNode;var f=d.parentNode,e=[c],b=[d];if(c===d)return Oa=!0,0;if(!k||!f)return c===a?-1:d===a?1:k?-1:f?1:Ha?Ga.call(Ha,c)-Ga.call(Ha,d):0;if(k===f)return Ub(c,d);for(k=
-c;k=k.parentNode;)e.unshift(k);for(k=d;k=k.parentNode;)b.unshift(k);for(;e[z]===b[z];)z++;return z?Ub(e[z],b[z]):e[z]===ra?-1:b[z]===ra?1:0};return a};S.matches=function(c,a){return S(c,null,null,a)};S.matchesSelector=function(c,a){(c.ownerDocument||c)!==aa&&Ea(c);a=a.replace($c,"\x3d'$1']");if(V.matchesSelector&&la&&(!Ia||!Ia.test(a))&&(!fa||!fa.test(a)))try{var d=gb.call(c,a);if(d||V.disconnectedMatch||c.document&&11!==c.document.nodeType)return d}catch(k){}return 0d?d+a:d]}),even:Fa(function(c,a){for(var d=0;dd?d+a:d;0<=--a;)c.push(a);return c}),gt:Fa(function(c,
-a,d){for(d=0>d?d+a:d;++dk.indexOf(" "+f+" ")&&(k+=f+" ");d.className=m.trim(k)}return this},removeClass:function(c){var a,d,k,f,e,b=0,n=this.length;a=0===arguments.length||"string"===typeof c&&c;if(m.isFunction(c))return this.each(function(a){m(this).removeClass(c.call(this,a,this.className))});if(a)for(a=(c||"").match(pa)||[];bk)?null:[],e=c?k+1:d.length,b=0>k?e:c?k:0;bj.indexOf(":")&&"on"+j,c=c[m.expando]?c:new m.Event(j,"object"===typeof c&&c),c.isTrigger=k?2:3,c.namespace=p.join("."),c.namespace_re=c.namespace?RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,c.result=o,c.target||(c.target=
-d),a=null==a?[c]:m.makeArray(a,[c]),p=m.event.special[j]||{},k||!(p.trigger&&!1===p.trigger.apply(d,a))){if(!k&&!p.noBubble&&!m.isWindow(d)){g=p.delegateType||j;fc.test(g+j)||(n=n.parentNode);for(;n;n=n.parentNode)h.push(n),f=n;if(f===(d.ownerDocument||K))h.push(f.defaultView||f.parentWindow||b)}for(y=0;(n=h[y++])&&!c.isPropagationStopped();)c.type=1d.nodeType&&(b?-1]*)\/>/gi,
-kc=/<([\w:]+)/,lc=/\s*$/g,ha={option:[1,"\x3cselect multiple\x3d'multiple'\x3e","\x3c/select\x3e"],legend:[1,"\x3cfieldset\x3e","\x3c/fieldset\x3e"],area:[1,"\x3cmap\x3e","\x3c/map\x3e"],param:[1,"\x3cobject\x3e","\x3c/object\x3e"],thead:[1,"\x3ctable\x3e","\x3c/table\x3e"],tr:[2,"\x3ctable\x3e\x3ctbody\x3e",
-"\x3c/tbody\x3e\x3c/table\x3e"],col:[2,"\x3ctable\x3e\x3ctbody\x3e\x3c/tbody\x3e\x3ccolgroup\x3e","\x3c/colgroup\x3e\x3c/table\x3e"],td:[3,"\x3ctable\x3e\x3ctbody\x3e\x3ctr\x3e","\x3c/tr\x3e\x3c/tbody\x3e\x3c/table\x3e"],_default:m.support.htmlSerialize?[0,"",""]:[1,"X\x3cdiv\x3e","\x3c/div\x3e"]},Hb=q(K).appendChild(K.createElement("div"));ha.optgroup=ha.option;ha.tbody=ha.tfoot=ha.colgroup=ha.caption=ha.thead;ha.th=ha.td;m.fn.extend({text:function(c){return m.access(this,function(c){return c===
-o?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||K).createTextNode(c))},null,c,arguments.length)},append:function(){return this.domManip(arguments,function(c){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&A(this,c).appendChild(c)})},prepend:function(){return this.domManip(arguments,function(c){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var a=A(this,c);a.insertBefore(c,a.firstChild)}})},before:function(){return this.domManip(arguments,function(c){this.parentNode&&
-this.parentNode.insertBefore(c,this)})},after:function(){return this.domManip(arguments,function(c){this.parentNode&&this.parentNode.insertBefore(c,this.nextSibling)})},remove:function(c,a){for(var d,k=c?m.filter(c,this):this,f=0;null!=(d=k[f]);f++)!a&&1===d.nodeType&&m.cleanData(w(d)),d.parentNode&&(a&&m.contains(d.ownerDocument,d)&&u(w(d,"script")),d.parentNode.removeChild(d));return this},empty:function(){for(var c,a=0;null!=(c=this[a]);a++){for(1===c.nodeType&&m.cleanData(w(c,!1));c.firstChild;)c.removeChild(c.firstChild);
-c.options&&m.nodeName(c,"select")&&(c.options.length=0)}return this},clone:function(c,a){c=null==c?!1:c;a=null==a?c:a;return this.map(function(){return m.clone(this,c,a)})},html:function(c){return m.access(this,function(c){var a=this[0]||{},d=0,k=this.length;if(c===o)return 1===a.nodeType?a.innerHTML.replace(md,""):o;if("string"===typeof c&&!od.test(c)&&(m.support.htmlSerialize||!ic.test(c))&&(m.support.leadingWhitespace||!Gb.test(c))&&!ha[(kc.exec(c)||["",""])[1].toLowerCase()]){c=c.replace(jc,"\x3c$1\x3e\x3c/$2\x3e");
-try{for(;d=p||"string"!==typeof h||m.support.checkClone||!pd.test(h)))return this.each(function(k){var f=g.eq(k);j&&(c[0]=h.call(this,k,f.html()));f.domManip(c,a,d)});if(p&&(b=m.buildFragment(c,this[0].ownerDocument,!1,!d&&this),k=b.firstChild,1===b.childNodes.length&&(b=k),k)){e=m.map(w(b,"script"),r);for(f=e.length;n
- ...
- `,
- },
-];
diff --git a/src/sites/api/favicon.ico b/src/sites/api/favicon.ico
deleted file mode 100644
index 97e6fc47d7..0000000000
Binary files a/src/sites/api/favicon.ico and /dev/null differ
diff --git a/src/sites/api/img/opencb-logo.png b/src/sites/api/img/opencb-logo.png
deleted file mode 100644
index 77b2cba6a6..0000000000
Binary files a/src/sites/api/img/opencb-logo.png and /dev/null differ
diff --git a/src/sites/api/index.html b/src/sites/api/index.html
deleted file mode 100644
index ea8cc338e7..0000000000
--- a/src/sites/api/index.html
+++ /dev/null
@@ -1,135 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/sites/iva/LICENSE b/src/sites/iva/LICENSE
deleted file mode 100644
index 8dada3edaf..0000000000
--- a/src/sites/iva/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "{}"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright {yyyy} {name of copyright owner}
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/src/sites/iva/README.md b/src/sites/iva/README.md
deleted file mode 100644
index 1e05c875e6..0000000000
--- a/src/sites/iva/README.md
+++ /dev/null
@@ -1,138 +0,0 @@
-# README
-
-## Overview
-
-IVA is a generic Interactive Variant Analysis browser that can be used for the visualization of biological information from various data sources. IVA uses data from [OpenCGA](https://github.com/opencb/opencga) which is an OpenCB project.
-
-### Documentation
-
-You can find IVA documentation and tutorials at: [https://github.com/opencb/iva/wiki](https://github.com/opencb/iva/wiki).
-
-### Issues Tracking
-
-You can report bugs or request new features at [GitHub issue tracking](https://github.com/opencb/iva/issues).
-
-### Release Notes and Roadmap
-
-Releases notes are available at [GitHub releases](https://github.com/opencb/iva/releases).
-
-Roadmap is available at [GitHub milestones](https://github.com/opencb/iva/milestones). You can report bugs or request new features at [GitHub issue tracking](https://github.com/opencb/iva/issues).
-
-### Versioning
-
-IVA is versioned following the rules from [Semantic versioning](http://semver.org/).
-
-### Maintainers
-
-We recommend to contact IVA developers by writing to OpenCB mailing list opencb@googlegroups.com. The main developers and maintainers are:
-
-* Ignacio Medina \(im411@cam.ac.uk\) \(_Founder and Project Leader_\)
-* Javier Perez Florido \(javier.perez.florido.ext@juntadeandalucia.es\)
-* Alexis Martínez \(alexis.martinez@juntadeandalucia.es\)
-
-#### Former Contributors
-
-* Swaathi Kandasaamy \(sk913@cam.ac.uk\)
-* Asuncion Gallego \(agallego@cipf.es\)
-
-#### Contributing
-
-IVA is an open-source and collaborative project, currently developement is mainly carried out by Stefan Gräf and Ignacio Medina teams from the University of Cambridge and Joaquin Dopazo team from CIBERER. We appreciate any help and feedback from users, you can contribute in many different ways such as simple bug reporting and feature request. Dependending on your skills you are more than welcome to develop client tools, new features or even fixing bugs.
-
-## How to build
-
-IVA is developed in HTML5, therefore it is mainly developed in JavaScript and makes a heavy usage of HTML and CSS. It uses Grunt as building tool. IVA also requires of OpenCB JSorolla project to be built, this is a JavaScript library developed for several OpenCB web-based projects, this can be found as Git submodule in IVA.
-
-Stable releases are merged and tagged at _master_ branch, you are encourage to use latest stable release for production. Current active development is carried out at _develop_ branch, only building is guaranteed and bugs are expected, use this branch for development or for testing new functionalities. The only dependency of IVA from OpenCB is JSorolla.
-
-### Prerequisites
-
-The following technologies are needed to build IVA: [Node.js](https://nodejs.org/en/), [npm](https://www.npmjs.com/) and [Grunt](http://gruntjs.com/getting-started).
-
-#### Installing Node.js and npm
-
-To install [Node.js](https://nodejs.org/en/) you can visit [this link](http://blog.teamtreehouse.com/install-node-js-npm-linux).
-
-[npm](https://www.npmjs.com/) stands for _node packaged modules_ and it is the dependency manager of [Node.js](https://nodejs.org/en/).
-
-### Cloning
-
-IVA is an open-source project and can be downloaded either as package\(tar.gz\) from GitHub releases or source code by cloning the repository.
-
-Default _**develop**_ branch can be downloaded by executing:
-
-```text
-$ git clone https://github.com/opencb/iva.git
-Cloning into 'iva'...
-remote: Counting objects: 624, done.
-remote: Total 624 (delta 0), reused 0 (delta 0), pack-reused 624
-Receiving objects: 100% (624/624), 139.37 KiB | 0 bytes/s, done.
-Resolving deltas: 100% (356/356), done.
-Checking connectivity... done.
-```
-
-Latest stable release at _**master**_ branch can be downloaded by executing:
-
-```text
-$ git clone -b master https://github.com/opencb/iva.git
-Cloning into 'iva'...
-remote: Counting objects: 624, done.
-remote: Total 624 (delta 0), reused 0 (delta 0), pack-reused 624
-Receiving objects: 100% (624/624), 139.37 KiB | 191.00 KiB/s, done.
-Resolving deltas: 100% (356/356), done.
-Checking connectivity... done.
-```
-
-After this, in both cases, you **must** execute the following command to fetch the JSorolla submodule \(only the first time\):
-
-```text
-git submodule update --init
-```
-
-Go to lib/jsorolla and checkout to _**develop**_ branch of Jsorolla by
-
-```text
-cd lib/jsorolla
-git checkout develop
-```
-
-### Build
-
-First, you must update JSorolla dependencies, from the root folder execute:
-
-```text
-cd lib/jsorolla
-npm install
-```
-
-Finally, to build IVA execute:
-
-We have to install npm packages for IVA, from the the root folder execute:
-
-```text
-npm install
-```
-
-And now execute:
-
-```text
-npm run build
-```
-
-when completed, all compiled files will be located under the _build_ folder.
-
-### Testing
-
-You can copy build content to a web server such as Apache HTTP Server and open your favourite internet browser to open IVA.
-
-### Execute Tests in development with nightwatch\([http://nightwatchjs.org/](http://nightwatchjs.org/)\)
-
-Prerequisite: make sure you have JDK installed, with at least version 8. If you don't have it, you can grab it from [http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html).
-
-1. npm install --dev
-2. Selenium server. Download the latest release .jar from [http://selenium-release.storage.googleapis.com/index.html](http://selenium-release.storage.googleapis.com/index.html). i.e. selenium-server-standalone-3.7.0.jar
-3. Chromedriver. Download from [https://sites.google.com/a/chromium.org/chromedriver/downloads](https://sites.google.com/a/chromium.org/chromedriver/downloads) that version which supports your chrome versión. You can review what version fits your browser here [https://chromedriver.storage.googleapis.com/2.33/notes.txt](https://chromedriver.storage.googleapis.com/2.33/notes.txt).
-4. Create a bin folder inside your test folder in root path
-5. Move selenium bin and chrome bin inside that bin folder.
-6. npm run test-e2e \( or ./node\_modules/.bin/nightwatch test/e2e/clinical-prioritization.js if you want execute just one\)
-
diff --git a/src/sites/iva/index.html b/src/sites/iva/index.html
index b9289a309e..617a72ee0f 100644
--- a/src/sites/iva/index.html
+++ b/src/sites/iva/index.html
@@ -1,226 +1,44 @@
-
-
-
-
-
-
-
-
+
OpenCB Suite
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
diff --git a/src/sites/iva/iva-app.js b/src/sites/iva/iva-app.js
index a91f95c57b..c343891b24 100644
--- a/src/sites/iva/iva-app.js
+++ b/src/sites/iva/iva-app.js
@@ -19,8 +19,13 @@
*/
import {html, LitElement, nothing} from "lit";
-import "./getting-started.js";
-import "./iva-settings.js";
+// import "./getting-started.js";
+// import "./iva-settings.js";
+
+// import jsorolla styles
+import "../../../styles/css/global.css";
+import "../../genome-browser/css/genome-browser.css";
+import "../../core/visualisation/viz-styles.css";
import {OpenCGAClient} from "../../core/clients/opencga/opencga-client.js";
import {CellBaseClient} from "../../core/clients/cellbase/cellbase-client.js";
diff --git a/src/sites/test-app/LICENSE b/src/sites/test-app/LICENSE
deleted file mode 100644
index 8dada3edaf..0000000000
--- a/src/sites/test-app/LICENSE
+++ /dev/null
@@ -1,201 +0,0 @@
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "{}"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright {yyyy} {name of copyright owner}
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
diff --git a/src/sites/test-app/README.md b/src/sites/test-app/README.md
deleted file mode 100644
index 1e05c875e6..0000000000
--- a/src/sites/test-app/README.md
+++ /dev/null
@@ -1,138 +0,0 @@
-# README
-
-## Overview
-
-IVA is a generic Interactive Variant Analysis browser that can be used for the visualization of biological information from various data sources. IVA uses data from [OpenCGA](https://github.com/opencb/opencga) which is an OpenCB project.
-
-### Documentation
-
-You can find IVA documentation and tutorials at: [https://github.com/opencb/iva/wiki](https://github.com/opencb/iva/wiki).
-
-### Issues Tracking
-
-You can report bugs or request new features at [GitHub issue tracking](https://github.com/opencb/iva/issues).
-
-### Release Notes and Roadmap
-
-Releases notes are available at [GitHub releases](https://github.com/opencb/iva/releases).
-
-Roadmap is available at [GitHub milestones](https://github.com/opencb/iva/milestones). You can report bugs or request new features at [GitHub issue tracking](https://github.com/opencb/iva/issues).
-
-### Versioning
-
-IVA is versioned following the rules from [Semantic versioning](http://semver.org/).
-
-### Maintainers
-
-We recommend to contact IVA developers by writing to OpenCB mailing list opencb@googlegroups.com. The main developers and maintainers are:
-
-* Ignacio Medina \(im411@cam.ac.uk\) \(_Founder and Project Leader_\)
-* Javier Perez Florido \(javier.perez.florido.ext@juntadeandalucia.es\)
-* Alexis Martínez \(alexis.martinez@juntadeandalucia.es\)
-
-#### Former Contributors
-
-* Swaathi Kandasaamy \(sk913@cam.ac.uk\)
-* Asuncion Gallego \(agallego@cipf.es\)
-
-#### Contributing
-
-IVA is an open-source and collaborative project, currently developement is mainly carried out by Stefan Gräf and Ignacio Medina teams from the University of Cambridge and Joaquin Dopazo team from CIBERER. We appreciate any help and feedback from users, you can contribute in many different ways such as simple bug reporting and feature request. Dependending on your skills you are more than welcome to develop client tools, new features or even fixing bugs.
-
-## How to build
-
-IVA is developed in HTML5, therefore it is mainly developed in JavaScript and makes a heavy usage of HTML and CSS. It uses Grunt as building tool. IVA also requires of OpenCB JSorolla project to be built, this is a JavaScript library developed for several OpenCB web-based projects, this can be found as Git submodule in IVA.
-
-Stable releases are merged and tagged at _master_ branch, you are encourage to use latest stable release for production. Current active development is carried out at _develop_ branch, only building is guaranteed and bugs are expected, use this branch for development or for testing new functionalities. The only dependency of IVA from OpenCB is JSorolla.
-
-### Prerequisites
-
-The following technologies are needed to build IVA: [Node.js](https://nodejs.org/en/), [npm](https://www.npmjs.com/) and [Grunt](http://gruntjs.com/getting-started).
-
-#### Installing Node.js and npm
-
-To install [Node.js](https://nodejs.org/en/) you can visit [this link](http://blog.teamtreehouse.com/install-node-js-npm-linux).
-
-[npm](https://www.npmjs.com/) stands for _node packaged modules_ and it is the dependency manager of [Node.js](https://nodejs.org/en/).
-
-### Cloning
-
-IVA is an open-source project and can be downloaded either as package\(tar.gz\) from GitHub releases or source code by cloning the repository.
-
-Default _**develop**_ branch can be downloaded by executing:
-
-```text
-$ git clone https://github.com/opencb/iva.git
-Cloning into 'iva'...
-remote: Counting objects: 624, done.
-remote: Total 624 (delta 0), reused 0 (delta 0), pack-reused 624
-Receiving objects: 100% (624/624), 139.37 KiB | 0 bytes/s, done.
-Resolving deltas: 100% (356/356), done.
-Checking connectivity... done.
-```
-
-Latest stable release at _**master**_ branch can be downloaded by executing:
-
-```text
-$ git clone -b master https://github.com/opencb/iva.git
-Cloning into 'iva'...
-remote: Counting objects: 624, done.
-remote: Total 624 (delta 0), reused 0 (delta 0), pack-reused 624
-Receiving objects: 100% (624/624), 139.37 KiB | 191.00 KiB/s, done.
-Resolving deltas: 100% (356/356), done.
-Checking connectivity... done.
-```
-
-After this, in both cases, you **must** execute the following command to fetch the JSorolla submodule \(only the first time\):
-
-```text
-git submodule update --init
-```
-
-Go to lib/jsorolla and checkout to _**develop**_ branch of Jsorolla by
-
-```text
-cd lib/jsorolla
-git checkout develop
-```
-
-### Build
-
-First, you must update JSorolla dependencies, from the root folder execute:
-
-```text
-cd lib/jsorolla
-npm install
-```
-
-Finally, to build IVA execute:
-
-We have to install npm packages for IVA, from the the root folder execute:
-
-```text
-npm install
-```
-
-And now execute:
-
-```text
-npm run build
-```
-
-when completed, all compiled files will be located under the _build_ folder.
-
-### Testing
-
-You can copy build content to a web server such as Apache HTTP Server and open your favourite internet browser to open IVA.
-
-### Execute Tests in development with nightwatch\([http://nightwatchjs.org/](http://nightwatchjs.org/)\)
-
-Prerequisite: make sure you have JDK installed, with at least version 8. If you don't have it, you can grab it from [http://www.oracle.com/technetwork/java/javase/downloads/index.html](http://www.oracle.com/technetwork/java/javase/downloads/index.html).
-
-1. npm install --dev
-2. Selenium server. Download the latest release .jar from [http://selenium-release.storage.googleapis.com/index.html](http://selenium-release.storage.googleapis.com/index.html). i.e. selenium-server-standalone-3.7.0.jar
-3. Chromedriver. Download from [https://sites.google.com/a/chromium.org/chromedriver/downloads](https://sites.google.com/a/chromium.org/chromedriver/downloads) that version which supports your chrome versión. You can review what version fits your browser here [https://chromedriver.storage.googleapis.com/2.33/notes.txt](https://chromedriver.storage.googleapis.com/2.33/notes.txt).
-4. Create a bin folder inside your test folder in root path
-5. Move selenium bin and chrome bin inside that bin folder.
-6. npm run test-e2e \( or ./node\_modules/.bin/nightwatch test/e2e/clinical-prioritization.js if you want execute just one\)
-
diff --git a/src/sites/test-app/conf/data-form.js b/src/sites/test-app/conf/data-form.js
index e26d523cb0..9e20226308 100644
--- a/src/sites/test-app/conf/data-form.js
+++ b/src/sites/test-app/conf/data-form.js
@@ -1,4 +1,3 @@
-
import {html} from "lit";
const defaultHighchartConfig = {
diff --git a/src/sites/test-app/index.html b/src/sites/test-app/index.html
index 868bfc1fb5..78450bad47 100644
--- a/src/sites/test-app/index.html
+++ b/src/sites/test-app/index.html
@@ -1,166 +1,23 @@
-
-
-
-
-
-
-
- Test App
-
-
+ Test App
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
diff --git a/src/sites/test-app/test-app.js b/src/sites/test-app/test-app.js
index a47cea98ea..e4eb233d50 100644
--- a/src/sites/test-app/test-app.js
+++ b/src/sites/test-app/test-app.js
@@ -20,6 +20,11 @@
import {html, LitElement, nothing} from "lit";
+// import jsorolla styles
+import "../../../styles/css/global.css";
+import "../../genome-browser/css/genome-browser.css";
+import "../../core/visualisation/viz-styles.css";
+
import UtilsNew from "../../core/utils-new.js";
import NotificationUtils from "../../webcomponents/commons/utils/notification-utils.js";
import NotificationManager from "../../core/notification-manager.js";
diff --git a/src/webcomponents/commons/opencga-browser.js b/src/webcomponents/commons/opencga-browser.js
index 6b949f565e..0a63e8d881 100644
--- a/src/webcomponents/commons/opencga-browser.js
+++ b/src/webcomponents/commons/opencga-browser.js
@@ -83,7 +83,6 @@ export default class OpencgaBrowser extends LitElement {
}
firstUpdated() {
- $(".bootstrap-select", this).selectpicker();
UtilsNew.initTooltip(this);
}
diff --git a/styles/css/global.css b/styles/css/global.css
index 251d2d9a33..943497d674 100644
--- a/styles/css/global.css
+++ b/styles/css/global.css
@@ -448,6 +448,7 @@ select.no-data + .select2-container--bootstrap-5.select2-container--open.select2
/* Fonts */
+/*
@font-face {
font-family: 'Ubuntu';
font-style: normal;
@@ -498,6 +499,7 @@ select.no-data + .select2-container--bootstrap-5.select2-container--open.select2
font-weight: 400;
src: local('Roboto'), local('Roboto'), url(../fonts/Roboto.woff) format('woff');
}
+*/
/* qtip tooltip */
diff --git a/vite.config.js b/vite.config.js
deleted file mode 100644
index 225676ae4d..0000000000
--- a/vite.config.js
+++ /dev/null
@@ -1,135 +0,0 @@
-import fs from "fs";
-import path from "path";
-import {defineConfig} from "vite";
-import replace from "@rollup/plugin-replace";
-import pkg from "./package.json";
-
-// eslint-disable-next-line no-undef
-const env = process.env || {};
-const sites = ["iva", "api", "test-app"];
-
-const getCustomSitePath = (name, folder) => {
- if (env.npm_config_custom_site) {
- return `../../../custom-sites/${env.npm_config_custom_site}/${name}/${folder}`;
- }
- return folder; // Default path configuration
-};
-
-const getExtensionsPath = name => {
- // NOTE: at this moment, extensions are only available for IVA
- if (env.npm_extensions && name.toUpperCase() === "IVA") {
- return "../../../extensions/build";
- }
- return "extensions";
-};
-
-const getTestDataFile = (req, res) => {
- // eslint-disable-next-line no-undef
- const filePath = path.join(process.cwd(), "test-data", req.url.replace(/^[\w/\-_]*test-data\//, ""));
- // At this moment we only support JSON files
- if (fs.existsSync(filePath) && path.extname(filePath) === ".json") {
- res.setHeader("Content-Type", "application/json");
- res.writeHead(200);
- const fileReader = fs.createReadStream(filePath);
- fileReader.on("data", data => res.write(data));
- fileReader.on("end", () => res.end(""));
- } else {
- res.writeHead(404);
- res.end("");
- }
-};
-
-const transformHtmlContent = html => {
- return sites.reduce((prevHtml, name) => {
- const parsedName = name.replace(/-/g, "_").toUpperCase();
- const configRegex = new RegExp(`{{ ${parsedName}_CONFIG_PATH }}`, "g");
- const extensionsRegex = new RegExp(`{{ ${parsedName}_EXTENSIONS_PATH }}`, "g");
-
- return prevHtml
- .replace(configRegex, getCustomSitePath(name, "conf"))
- .replace(extensionsRegex, getExtensionsPath(name));
- }, html);
-};
-
-const configurePreviewServer = server => {
- // Middleware to intercept all calls that contains the 'test-data' word
- server.middlewares.use((req, res, next) => {
- if (req.url.includes("test-data/")) {
- return getTestDataFile(req, res);
- }
- return next();
- });
-};
-
-const configureServer = server => {
- // Middleware to intercept all calls that contains the 'test-data' word
- server.middlewares.use((req, res, next) => {
- if (req.url.includes("test-data/")) {
- return getTestDataFile(req, res);
- }
- return next();
- });
- // Middleware to fix the path to images used in custom-sites
- server.middlewares.use((req, res, next) => {
- if (env.npm_config_custom_site && req.url.startsWith("/src/sites") && req.url.includes("img")) {
- const customUrl = req.url.replace("/src/sites", `/custom-sites/${env.npm_config_custom_site}`);
- // eslint-disable-next-line no-undef
- const originalPath = path.join(process.cwd(), req.url);
- // eslint-disable-next-line no-undef
- const customPath = path.join(process.cwd(), customUrl);
- if (!fs.existsSync(originalPath) && fs.existsSync(customPath)) {
- // eslint-disable-next-line no-param-reassign
- req.url = customUrl; // Replace the url with the correct image path
- }
- }
- return next();
- });
-};
-
-export default defineConfig({
- mode: env.NODE_ENV || "development",
- root: "./",
- resolve: {
- alias: {
- "~bootstrap": path.resolve("./", "node_modules/bootstrap"),
- }
- },
- server: {
- open: env.NODE_ENV !== "production" ? "/src/sites/iva/index.html" : "/iva/index.html",
- port: 3000,
- watch: ["src", "styles", "custom-sites"]
- },
- build: {
- outDir: "build"
- },
- preview: {
- port: 4000,
- },
- plugins: [
- {
- ...replace({
- preventAssignment: true,
- values: {
- "process.env.VERSION": JSON.stringify(pkg.version),
- },
- }),
- apply: "serve",
- },
- {
- name: "html-transform",
- transformIndexHtml: transformHtmlContent,
- apply: "serve",
- },
- {
- name: "configure-server",
- configureServer,
- apply: "serve",
- },
- {
- name: "configure-preview-server",
- configurePreviewServer,
- apply: "serve",
- },
- ],
-});
-
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 0000000000..1391e98860
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,208 @@
+/* eslint-disable no-undef */
+const fs = require("node:fs");
+const path = require("node:path");
+const childProcess = require("node:child_process");
+const webpack = require("webpack");
+const HtmlWebpackPlugin = require("html-webpack-plugin");
+const CopyWebpackPlugin = require("copy-webpack-plugin");
+const MiniCssExtractPlugin = require("mini-css-extract-plugin");
+const WebpackPluginHtmlAssetsFix = require("./scripts/webpack-plugin-html-assets-fix.js");
+const WebpackPluginHtmlGlobalAssets = require("./scripts/webpack-plugin-html-global-assets.js");
+const WebpackPluginHtmlBuildInfo = require("./scripts/webpack-plugin-html-build-info.js");
+
+// load package.json from the current working directory
+const pkg = require(path.join(process.cwd(), "package.json"));
+
+// check if we are in development mode
+// this is used also to tell webpack to minimize the code or not
+const isDevelopment = process.env.NODE_ENV !== "production";
+
+// list of entries to build (in src/sites folder)
+const entries = ["iva", "test-app"];
+
+// internal method to get the path to the custom site
+const getCustomSitePath = (entry, folder) => {
+ // NOTE: custom sites are not allowed for 'test-app'
+ if (process.env.npm_config_custom_site && entry !== "test-app") {
+ return path.join(__dirname, "custom-sites", process.env.npm_config_custom_site, "iva", folder);
+ }
+ // return the default path
+ return path.join(__dirname, "src", "sites", entry, folder);
+};
+
+// Setup middlewares for development server.
+const setupCustomMiddlewares = (middlewares, devServer) => {
+ if (!devServer) {
+ throw new Error("webpack-dev-server is not defined");
+ }
+ // Redirect requests to test data to the correct file
+ devServer.app.get("/:site/test-data/:version/:file", (request, response) => {
+ const filePath = path.join(__dirname, "test-data", request.params.version, request.params.file);
+ // At this moment we only support JSON files
+ if (fs.existsSync(filePath) && path.extname(filePath) === ".json") {
+ response.setHeader("Content-Type", "application/json");
+ response.writeHead(200);
+ const fileReader = fs.createReadStream(filePath);
+ fileReader.on("data", data => response.write(data));
+ fileReader.on("end", () => response.end(""));
+ } else {
+ response.writeHead(404);
+ response.end(`Cannot find test data file: ${filePath}`);
+ }
+ });
+ return middlewares;
+};
+
+module.exports = {
+ mode: isDevelopment ? "development" : "production",
+ target: "web",
+ entry: {
+ "iva": "./src/sites/iva/iva-app.js",
+ "test-app": "./src/sites/test-app/test-app.js",
+ },
+ output: {
+ path: path.join(process.cwd(), "build"),
+ filename: "[name]/js/[name].[contenthash].js",
+ iife: true,
+ scriptType: "text/javascript",
+ chunkFormat: "array-push",
+ },
+ experiments: {
+ outputModule: true,
+ },
+ optimization: {
+ minimize: !isDevelopment,
+ splitChunks: {
+ cacheGroups: {
+ defaultVendors: false,
+ vendorIva: {
+ test: /node_modules/,
+ chunks: /iva/,
+ filename: "iva/js/vendor.[contenthash].js",
+ },
+ vendorTestApp: {
+ test: /node_modules/,
+ chunks: /test-app/,
+ filename: "test-app/js/vendor.[contenthash].js",
+ },
+ },
+ },
+ },
+ module: {
+ rules: [
+ {
+ test: /\.css$/i,
+ use: [MiniCssExtractPlugin.loader, "css-loader"],
+ },
+ {
+ test: /\.(png|svg|jpg|jpeg|gif)$/i,
+ type: "asset/inline",
+ },
+ ],
+ },
+ devServer: {
+ hot: false,
+ open: "/iva/index.html",
+ port: process.env.npm_config_port || 3000,
+ client: {
+ overlay: false,
+ },
+ setupMiddlewares: setupCustomMiddlewares,
+ devMiddleware: {
+ writeToDisk: true,
+ },
+ },
+ performance: {
+ // this is used to remove the warning message when the size of the generated files is too big
+ assetFilter: () => false,
+ },
+ plugins: [
+ new webpack.ProgressPlugin(),
+ new WebpackPluginHtmlAssetsFix(),
+ new MiniCssExtractPlugin({
+ filename: () => {
+ // TODO: get the cache group from pathData.chunk.chunkReason
+ // Example: chunkReason: 'split chunk (cache group: vendor)'
+ return "[name]/css/vendor.[contenthash].css";
+ },
+ }),
+ new WebpackPluginHtmlGlobalAssets({
+ cwd: __dirname,
+ files: {
+ "[name]/js/globals.[contenthash].js": [
+ "node_modules/jquery/dist/jquery.min.js",
+ "node_modules/lodash/lodash.min.js",
+ "node_modules/backbone/backbone-min.js",
+ "node_modules/moment/min/moment.min.js",
+ "node_modules/highcharts/highcharts.js",
+ "node_modules/qtip2/dist/jquery.qtip.min.js",
+ "node_modules/cookies-js/dist/cookies.min.js",
+ "node_modules/@popperjs/core/dist/umd/popper.min.js",
+ "node_modules/bootstrap/dist/js/bootstrap.min.js",
+ "node_modules/select2/dist/js/select2.full.min.js",
+ "node_modules/@eonasdan/tempus-dominus/dist/js/tempus-dominus.min.js",
+ "node_modules/bootstrap-table/dist/bootstrap-table.min.js",
+ "node_modules/jwt-decode/build/jwt-decode.min.js",
+ "node_modules/clipboard/dist/clipboard.min.js",
+ // "node_modules/pdfmake/build/pdfmake.min.js",
+ // "node_modules/pdfmake/build/vfs_fonts.js",
+ // "node_modules/html-to-pdfmake/browser.js",
+ ],
+ "[name]/css/globals.[contenthash].css": [
+ "node_modules/bootstrap/dist/css/bootstrap.min.css",
+ "node_modules/select2/dist/css/select2.min.css",
+ "node_modules/select2-bootstrap-5-theme/dist/select2-bootstrap-5-theme.min.css",
+ "node_modules/@eonasdan/tempus-dominus/dist/css/tempus-dominus.min.css",
+ "node_modules/bootstrap-table/dist/bootstrap-table.min.css",
+ "node_modules/@fortawesome/fontawesome-free/css/all.min.css",
+ "node_modules/qtip2/dist/jquery.qtip.min.css",
+ ],
+ },
+ chunks: entries,
+ }),
+ ...entries.map(entry => {
+ return new HtmlWebpackPlugin({
+ template: path.join(__dirname, "src", "sites", entry, "index.html"),
+ filename: entry + "/index.html",
+ chunks: [entry],
+ minify: false,
+ });
+ }),
+ ...entries.map(entry => {
+ return new CopyWebpackPlugin({
+ patterns: [
+ {
+ from: path.join(__dirname, "src", "sites", entry, "favicon.ico"),
+ to: entry + "/favicon.ico",
+ },
+ {
+ from: getCustomSitePath(entry, "conf"),
+ to: entry + "/conf",
+ },
+ {
+ from: getCustomSitePath(entry, "img"),
+ to: entry + "/img",
+ },
+ {
+ from: path.join(__dirname, "src", "sites", entry, "extensions"),
+ to: entry + "/extensions",
+ },
+ {
+ from: path.join(__dirname, "node_modules/@fortawesome/fontawesome-free/webfonts"),
+ to: entry + "/webfonts",
+ },
+ ],
+ });
+ }),
+ new webpack.DefinePlugin({
+ "process.env.VERSION": JSON.stringify(pkg.version),
+ }),
+ new WebpackPluginHtmlBuildInfo({
+ name: "Jsorolla",
+ version: require(path.join(__dirname, "package.json")).version,
+ branch: childProcess.execSync("git rev-parse --abbrev-ref HEAD", {cwd: __dirname}).toString().trim(),
+ commit: childProcess.execSync("git rev-parse HEAD", {cwd: __dirname}).toString().trim(),
+ date: new Date().toString(),
+ }),
+ ],
+};