diff --git a/.circleci/config.yml b/.circleci/config.yml old mode 100644 new mode 100755 index 96f09c0df..dcc6d54aa --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -7,7 +7,7 @@ jobs: build: docker: # specify the version you desire here - - image: cimg/node:20.1.0-browsers + - image: circleci/node:8.11.2-browsers # Specify service dependencies here if necessary # CircleCI maintains a library of pre-built images @@ -25,11 +25,11 @@ jobs: # fallback to using the latest cache if no exact match is found - openmbee-ve- - - run: yarn install + - run: npm install - save_cache: paths: - node_modules key: openmbee-ve-{{ checksum "package.json" }} - - run: VE_ENV=example yarn test + - run: ./node_modules/grunt/bin/grunt #--ARTIFACTORY_URL=https://oss.jfrog.org --ARTIFACTORY_USER=$ARTIFACTORY_USER --ARTIFACTORY_PASSWORD=$ARTIFACTORY_PASSWORD --SNAPSHOT_REPO=oss-snapshot-local --RELEASE_REPO=oss-release-local --GROUP_ID=org.openmbee deploy \ No newline at end of file diff --git a/.dockerignore b/.dockerignore old mode 100644 new mode 100755 index 98e3f64dc..94143827e --- a/.dockerignore +++ b/.dockerignore @@ -1,9 +1 @@ -* - -!yarn.lock -!webpack.config.ts -!package.json -!src/ -!config/ -!tsconfig.json -!lib +Dockerfile diff --git a/.gitignore b/.gitignore old mode 100644 new mode 100755 index e633d2690..b6163899f --- a/.gitignore +++ b/.gitignore @@ -7,12 +7,18 @@ build dist deploy docs -/app/* +app/bower_components +app/bower_components_target .sass-cache .idea PhantomJS_* Chrome_* test-results/ angular-mms-grunt-servers.json -venv -.vscode + +# paths I added +/node_modules/* +package-lock.json +yarn.lock.json +Dockerfile.test +build.log \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 000000000..f4aa944d4 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,86 @@ +variables: + DOCKER_DRIVER: overlay2 + DOCKER_TLS_CERTDIR: "/certs" + SELECTOR: "openmbee-ve" + TAG: "latest" + ENVIRONMENT: "dev" + OC_PROJECT: $OC_DEV_NAMESPACE + OC_TOKEN: $OC_DEV_TOKEN + OC_URL: $OC_PIPELINE_URL + + +stages: + - build + - deploy + +build: + image: registry-cli-docker.wseasttest.navair.navy.mil:5001/docker:20.10.1 + services: + - name: docker:20.10.1-dind + command: + - /bin/sh + - -c + - apk update && apk add ca-certificates wget && wget --no-check-certificate -r -np -nd -R "index.html*" https://wcf-serve.apps.arena-workspace.navair.navy.mil/wcf/latest/crt/ -P /usr/local/share/ca-certificates && update-ca-certificates --fresh > /dev/null && dockerd-entrypoint.sh --insecure-registry=registry-cli-docker.wseasttest.navair.navy.mil:5000 --insecure-registry=registry-cli-docker.wseasttest.navair.navy.mil:5001 --debug || exit + stage: build + tags: + - dind + - rhel + - edmz + before_script: + - echo $CI_COMMIT_REF_NAME + - | + if echo $CI_COMMIT_REF_NAME | grep -E [[:digit:]]+.[[:digit:]]+.[[:digit:]]+; + then + TAG=$CI_COMMIT_REF_NAME + else + TAG="latest" + fi + - apk -U upgrade + - docker info + script: + - docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWORD registry-cli-docker.wseasttest.navair.navy.mil:5000 + - docker login -u $NEXUS_USERNAME -p $NEXUS_PASSWORD registry-cli-docker.wseasttest.navair.navy.mil:5001 + - docker build -f $DOCKERFILE_PATH --build-arg NEXUS_USERNAME=$NEXUS_USERNAME --build-arg NEXUS_PASSWORD=$NEXUS_PASSWORD -t registry-cli-docker.wseasttest.navair.navy.mil:5000/$NEXUS_NAMESPACE/$SELECTOR:$TAG . + - docker push registry-cli-docker.wseasttest.navair.navy.mil:5000/$NEXUS_NAMESPACE/$SELECTOR:$TAG + +deploy: + image: openshift/origin-cli:v3.11 + stage: deploy + tags: + - edmz + - dind + - rhel + before_script: + - | + if [[ "$CI_COMMIT_REF_NAME" =~ [[:digit:]]+.[[:digit:]]+.[[:digit:]]+-RC[[:digit:]]+-SNAPSHOT ]] + then + TAG=$CI_COMMIT_REF_NAME + OC_PROJECT=$OC_STAGE_NAMESPACE + OC_TOKEN=$OC_STAGE_TOKEN + elif [[ "$CI_COMMIT_REF_NAME" =~ [[:digit:]]+.[[:digit:]]+.[[:digit:]]+.[[:digit:]]+-FINAL ]] + then + TAG=$CI_COMMIT_REF_NAME + OC_PROJECT=$OC_PROD_NAMESPACE + OC_URL=$OC_PROD_URL + OC_TOKEN=$OC_PROD_TOKEN + else + TAG="latest" + fi + script: + - echo $OC_URL + - oc login $OC_URL --token=$OC_TOKEN --insecure-skip-tls-verify + - oc project $OC_PROJECT + - | + OC_PATCH_STATUS=$(oc patch deploymentconfig openmbee-ve -p "{\"spec\":{\"template\":{\"spec\":{\"containers\":[{\"name\":\"$SELECTOR\",\"image\": \"registry-cli-docker.wseasttest.navair.navy.mil:5000/$NEXUS_NAMESPACE/$SELECTOR:$TAG\"}]}}}}") + - echo $OC_PATCH_STATUS + - | + if [[ "$OC_PATCH_STATUS" == *"not patched" ]]; then + oc rollout latest dc/$SELECTOR + oc rollout status dc/$SELECTOR + fi + - oc logout + +# Security scanning for ip adddresss and secret values +# include: +# - template: Security/Secret-Detection.gitlab-ci.yml + diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 index 264adaa6b..a8d0a22f5 --- a/Dockerfile +++ b/Dockerfile @@ -1,39 +1,128 @@ -################################################################################ -# Dockerfile -# -# Enquier -# openmbee@gmail.com -# -# This is the Dockerfile for View Editor (VE). -# To build the container, run the following command: `docker build -t ve .` -# To run the container, run `docker run -it -p 80:9000 --name ve ve` -# -################################################################################ -FROM node:16-alpine as builder + +FROM registry-cli-docker.wseasttest.navair.navy.mil:5001/node:19.1.0-bullseye as build_env + +# WORKDIR /opt/mbee/ve +# COPY ./ /opt/mbee/ve +# set working directory ENV VE_ENV 'example' WORKDIR /opt/mbee/ve COPY ./ /opt/mbee/ve -# Configures git to use https:// instead of git:// -RUN apk add --update git -RUN apk add --update openssh +# RUN mkdir /usr/src/app +# WORKDIR /usr/src/app + +ARG NEXUS_USERNAME +ARG NEXUS_PASSWORD + + +# Use Arena for nexus repos using npm (used in 1st stage) +RUN wget --no-check-certificate -O /opt/mbee/ve/.npmrc https://wcf-serve.apps.arena-workspace.navair.navy.mil/config/nexusiq/.npmrc +RUN export nexus_creds=$(echo -n ${NEXUS_USERNAME}:${NEXUS_PASSWORD} | openssl base64 -A) && sed -i "s//$nexus_creds/g" ./.npmrc + +# Use Arena for nexus repos using apt (used in 2nd stage) +RUN wget --no-check-certificate -O /etc/apt/sources.list https://wcf-serve.apps.arena-workspace.navair.navy.mil/config/debian/bullseye-sources.list +RUN sed -i "s//$NEXUS_USERNAME/g" /etc/apt/sources.list +RUN sed -i "s//$NEXUS_PASSWORD/g" /etc/apt/sources.list + +# install certs. this url is not reachable outside the openshift environment. +RUN wget --no-check-certificate -r -np -nd -R "index.html*" https://wcf-serve.apps.arena-workspace.navair.navy.mil/wcf/latest/crt/ -P /usr/local/share/ca-certificates/WCF +RUN wget --no-check-certificate -r -np -nd -R "index.html*" https://wcf-serve.apps.arena-workspace.navair.navy.mil/dod/latest/ -P /usr/local/share/ca-certificates/WCF + +RUN update-ca-certificates +RUN sed -i "s/CipherString = DEFAULT@SECLEVEL=2/CipherString = DEFAULT/g" /etc/ssl/openssl.cnf + +# install dependencies +# RUN apt-get update && apt-get upgrade -y + +COPY . . + +#allows to pull from github without using ssh RUN git config --global url."https://".insteadOf git:// -# Install dependencies -RUN yarn install +#RUN npm install -g bower-update-all +RUN cat ~/.npmrc || true +RUN npm config ls + +RUN python --version || true +#Resolve Node SASS issue +# RUN apt-get update && apt-get install -y python make g++ +# RUN which python +RUN apt-get update && apt-get install -y python2 +ENV PYTHON=python2 + +RUN python --version || true -# Build App -RUN yarn build +RUN rm -rf node_modules && rm -rf package-lock.json && yarn.lock || true +RUN ls -lah +RUN npm cache clean --force +RUN npm install -g grunt-cli +RUN npm install phantomjs-prebuilt@2.1.16 --ignore-scripts +RUN npm install +# RUN npm install node-sass@4.14.1 +# RUN npm update && npm install +# RUN node ./node_modules/node-sass/scripts/install.js +# RUN npm rebuild node-sass + + + +RUN cat app/config/config.example.js || true + +RUN apt-get install -y ruby && apt-get install -y sass +RUN grunt build --env=example + +FROM registry-cli-docker.wseasttest.navair.navy.mil:5001/nginx:1.22 + +COPY --from=build_env /etc/apt/sources.list /etc/apt/ +COPY --from=build_env /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt +# COPY --from=build_env /usr/local/share/ca-certificates/ /etc/ssl/certs/ca-certificates.crt + +# Install curl, ping, dslookup and dig commands +RUN apt-get update && apt-get install -y iputils-ping curl dnsutils|| true + +RUN useradd -ms /bin/bash username || true +RUN echo 'username ALL=(ALL:ALL) NOPASSWD: /bin/ping, /usr/bin/dig, /usr/bin/nslookup' >> /etc/sudoer || true + +# install dependencies +# Original Commands will raise high vulnerability due to libxpm4 +# RUN apt-mark hold libxpm4 +# RUN apt-get update && apt-get upgrade -y \ +# curl \ +# ca-certificates + +# Resolve the libxpm4 vulnerability +# install dependencies +RUN apt-get update && \ + apt-get install -y \ + libxpm4=1:3.5.12-1.1~deb11u1 \ + curl \ + ca-certificates && \ + apt-mark hold libxpm4 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +# # set working directory +# RUN mkdir /usr/src/appx +# WORKDIR /usr/src/app +WORKDIR /opt/mbee/ve -FROM nginx:mainline-alpine as production +# copy files from build image +COPY --from=build_env /etc/ssl/openssl.cnf /etc/ssl/openssl.cnf +COPY --from=build_env /opt/mbee/ve/dist /usr/share/nginx/html/ +COPY --from=build_env /opt/mbee/ve/app/config/config.example.js /usr/share/nginx/html/ +COPY --from=build_env /opt/mbee/ve/nginx.conf /etc/nginx/conf.d/default.conf +# COPY --from=build_env /opt/mbee/ve/json_data/ usr/share/nginx/html/ -COPY --from=builder /opt/mbee/ve/dist /usr/share/nginx/html -COPY ./config/default.nginx.template /etc/nginx/templates/default.conf.template +# OpenMBEE default dockerfile uses the following line. This line lead to our permission errors +# TODO: to test behavior use this line and change line 96 to RUN sed -i.bak 's/^user/#user/' /etc/nginx/templates/default.conf.template +# COPY ./config/default.nginx.template /etc/nginx/templates/default.conf.template -# Expose ports -EXPOSE ${NGINX_PORT} +# # configure and copy nginx config +# ## support running as arbitrary user which belogs to the root group +RUN chmod g+rwx /var/cache/nginx /var/run /var/log/nginx +# ## comment user directive as master process is run as user in OpenShift +RUN sed -i.bak 's/^user/#user/' /etc/nginx/nginx.conf +EXPOSE 8080 \ No newline at end of file diff --git a/Dockerfile-jenkins b/Dockerfile-jenkins old mode 100644 new mode 100755 diff --git a/Documents/ViewEditorUserGuide-OpenMBEE.pdf b/Documents/ViewEditorUserGuide-OpenMBEE.pdf old mode 100644 new mode 100755 diff --git a/Documents/ViewEditorUserGuide.pdf b/Documents/ViewEditorUserGuide.pdf old mode 100644 new mode 100755 diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100755 index 000000000..ebf6d4598 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,492 @@ +module.exports = function(grunt) { + + require('time-grunt')(grunt); + require('jit-grunt')(grunt, { + // static mapping for tasks that don't match their modules' name + useminPrepare: 'grunt-usemin', + configureProxies: 'grunt-connect-proxy-updated' + }); + + // const sass = require('node-sass'); + + // Project configuration. + var env = grunt.option('env') || 'example'; + var port = grunt.option('port') || 3030;//9000; + + var protocol = grunt.option('protocol') || 'http'; + + var jsFiles = ['app/js/**/*.js', 'src/directives/**/*.js', 'src/services/*.js']; + + var connectObject = { + docs: { + options: { + hostname: '*', + port: 10000, + base: './dist/docs' + } + } + }; + + //if (grunt.file.exists('angular-mms-grunt-servers.json')) { + //var server = grunt.file.readJSON('angular-mms-grunt-servers.json'); + //ar serverPort = server.mms_port; + //var serverHttps = true; + var serveStatic = require('serve-static'); + var modRewrite = require('connect-modrewrite'); + var docker_opts = { + hostname: '0.0.0.0', + protocol: protocol, + port: port, + debug: true, + base: { + path: './dist/', + options: { + index: 'mms.html', + // Add this so that the browser doesn't re-validate static resources + // Also, we have cache-busting, so we don't have to worry about stale resources + maxAge: 31536000000 + } + } + } + if (protocol === 'https') { + docker_opts.key = grunt.file.read('/run/secrets/server.key').toString() + docker_opts.cert =grunt.file.read('/run/secrets/server.crt').toString() + } + docker_opts.middleware = function (connect, options) { + var middlewares; + middlewares = []; + if (!Array.isArray(options.base)) { + options.base = [options.base]; + } + middlewares.push( + require('grunt-connect-proxy-updated/lib/utils').proxyRequest, + // add gzip compression to local server to reduce static resources' size and improve load speed + require('compression')() + //require('connect-modrewrite')(['!\\.html|\\.js|\\.css|\\.svg|\\.jp(e?)g|\\.png|\\.gif$ /mms.html']), + + // need to add livereload as a middleware at this specific order to avoid issues with other middlewares + ); + middlewares.push(modRewrite(['^[^\\.]*$ /mms.html [L]'])); + options.base.forEach(function (base) { + // Serve static files. + var path = base.path || base; + var staticOptions = base.options || defaultStaticOptions; + middlewares.push(serveStatic(path, staticOptions)); + }); + return middlewares; + }; + connectObject["docker"] = { + options: docker_opts, + }; + //} + + var combineCustomJS = { + options: { + banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd HH:MM:ss") %> */\n', + wrap: 'mms', + mangle: true, + sourceMap: { + includeSources: true + } + }, + files: { + 'dist/js/ve-mms.min.js': [ + + // mms module + 'src/mms.js', + 'src/services/*.js', + 'src/filters/*.js', + + // mms.directives module (need mms, mms.directives.tpls.js module ) + 'dist/jsTemp/mms.directives.tpls.js', + 'src/mms.directives.js', + 'src/directives/**/*.js', + + // app module ( need app.tpls.js, mms, mms.directives module ) + 'dist/jsTemp/app.tpls.js', + 'app/js/mms/app.js', + 'app/js/mms/controllers/*.js', + 'app/js/mms/directives/*.js', + + // config files + 'app/config/config.' + env + '.js' + ] + } + }; + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + + concurrent: { + devStep1: ['install', 'lint', 'clean:before'], + devStep2: [['copy:all', 'processExternalDepsDevMode'], 'processAppStyleSheets', 'processAppJSInDev'], + devStep3: ['copy:dev'], + devStep4: ['clean:devAfter', 'cacheBust'], + + releaseStep1: ['install', 'lint', 'clean:before'], + releaseStep2: [['copy:all', 'processExternalDeps'], 'processAppStyleSheets', 'processAppJSInProd' ], + releaseStep3: ['clean:releaseAfter', 'cacheBust'] + }, + + clean: { + before: { + src: ['dist'] + }, + releaseAfter: { + src: ['dist/bower_components', 'dist/concat', 'dist/cssTemp', 'dist/jsTemp'] + }, + devAfter: { + src: ['dist/concat', 'dist/cssTemp', 'dist/jsTemp'] + } + }, + + 'bower-install-simple': { + options: { + color: true, + cwd: './app', // where to look for bower.json + directory: 'bower_components' // where to store these libs, + }, + all: {} + }, + + copy: { + all: { + files: [ + + // Entry html files + {expand: true, cwd: 'app', src: ['mms.html', 'index.html'], dest: 'dist/'}, + + // External deps + {expand: true, cwd: 'app', src: ['bower.json', 'bower_components/**'], dest: 'dist/'}, + + // Internal deps + {expand: true, cwd: 'app/lib/', src: '**', dest: '../dist/lib'}, + {expand: true, cwd: 'src/lib/', src: ['**', '!bootstrap-sass-3.3.7/**'], dest: 'dist/lib'}, + + // Assets + {expand: true, cwd: 'app/bower_components/font-awesome-bower/fonts', src: '**', dest: 'dist/fonts'}, + {expand: true, cwd: 'app/assets/', src: ['*', '!styles'], dest: './dist/assets'}, + {expand: true, cwd: 'src/assets/', src: ['images/**'], dest: 'dist/assets'} + ] + }, + dev: { + files: [ + {expand: true, cwd: 'dist/concat/js', src: ['vendor.min.js'], dest: 'dist/js'}, + {expand: true, cwd: 'dist/concat/js', src: ['vendor-internal.min.js'], dest: 'dist/js'} + ] + } + }, + + /** Looks at dist/bower.json & all bower_components's bower.json to determine the order at which to include external libs **/ + wiredep: { + all: { + options: { + cwd: './dist', + directory: '', + dependencies: true, + devDependencies: false, // so that our final vendor bundle doesn't include devDep libs + exclude: [], + fileTypes: {}, + ignorePath: '', + overrides: {} + }, + src: ['dist/*.html'] + } + }, + + /** Work on top of wiredep to know which external libs to bundle. + * Delegate the concatenation and minification steps to other plugins **/ + useminPrepare: { + options: { + staging: 'dist' + }, + html: 'dist/mms.html' + }, + + /** Inject the final bundle into the corresponding html files **/ + usemin: { + html: ['dist/mms.html'] + }, + + mkdir: { + dist: { + options: { + mode: 0777, + create: ['./dist/'] + } + } + }, + + /** Transpile Sass to Css **/ + sass: { + all: { + files: { + 'dist/cssTemp/mms.css': 'src/assets/styles/mms-main.scss', + 'dist/cssTemp/ve-main.css': 'app/assets/styles/ve/ve-main.scss' + } + } + }, + + /** Concat + Minify CSS **/ + cssmin: { + all: { + files: { + 'dist/css/ve-mms.min.css': ['dist/cssTemp/mms.css', 'dist/cssTemp/ve-main.css'] + } + } + }, + + /** This task is for turning all html files into angularjs modules which are included as dependencies + * for a particular module specified in the module function below + * **/ + html2js: { + options: { + module: function(modulePath, taskName) { + if (taskName === 'directives') + return 'mms.directives.tpls'; + return 'app.tpls'; + }, + rename: function (modulePath) { + if (modulePath.indexOf('directives/templates') > -1) { + var moduleName = modulePath.replace('directives/templates/', ''); + return 'mms/templates/' + moduleName; + } + return modulePath.replace('app/', '').replace('../', ''); + } + }, + // This task name need to match with taskName param above. + directives: { + src: ['src/directives/templates/*.html'], + dest: 'dist/jsTemp/mms.directives.tpls.js' + }, + app: { + src: ['app/partials/mms/*.html'], + dest: 'dist/jsTemp/app.tpls.js' + } + }, + + // concat only (no minification ) + concat: { + combineCustomJS: combineCustomJS + }, + + /** Concat + Minify JS files **/ + uglify: { + generated: { + options: { + mangle: true + // Uncomment below codes to get source map files for vendor codes if desired ( no need to enable this for during + // development since vendor files are not minified for dev-build ) + // sourceMap: { + // includeSources: true + // } + } + } + }, + terser: { + combineCustomJS: { + options: { + wrap: 'mms', + mangle: true, + sourceMap: true + }, + files: { + 'dist/js/ve-mms.min.js': [ + + // mms module + 'src/mms.js', + 'src/services/*.js', + 'src/filters/*.js', + + // mms.directives module (need mms, mms.directives.tpls.js module ) + 'dist/jsTemp/mms.directives.tpls.js', + 'src/mms.directives.js', + 'src/directives/**/*.js', + + // app module ( need app.tpls.js, mms, mms.directives module ) + 'dist/jsTemp/app.tpls.js', + 'app/js/mms/app.js', + 'app/js/mms/controllers/*.js', + 'app/js/mms/directives/*.js', + + // config files + 'app/config/config.' + env + '.js' + ] + } + }, + + // this target is for files handled by usemin task. + }, + + /** Add hashing to static resources' names so that the browser doesn't use the stale cached resources **/ + cacheBust: { + all: { + options: { + assets: ['./dist/css/*', './dist/js/*'], + deleteOriginals: false // set to false so that it doesn't affect sourcemapping + }, + src: ['./dist/*.html'] + } + }, + + jshint: { + beforeconcat: jsFiles, + options: { + reporterOutput: '', + evil: true, //allow eval for plot integration + globalstrict: true, + validthis: true, + esversion: 6, + globals: { + angular: true, + window: true, + console: true, + Stomp: true, + Timely: true, + jQuery: true, + $: true, + //__timely: true, + Blob: true, + navigator: true, + eval: true, + Set: true, + FormData: true + } + } + }, + + ngdocs: { + options: { + dest: 'dist/docs', + html5Mode: false, + title: 'View Editor', + startPage: '/api' + }, + api: { + src: ['src/**/*.js', 'app/js/**/*.js'], + title: 'MMS/VE API' + } + }, + + connect: connectObject, + + watch: { + dev: { + files: ['app/env.js', 'app/**/*', '!app/bower_components/**', 'src/**/*'], + tasks: ['dev-build'] + }, + release: { + files: ['app/env.js', 'app/**/*', '!app/bower_components/**', 'src/**/*'], + tasks: ['release-build'] + }, + docs: { + files: ['app/env.js', 'app/**/*', '!app/bower_components/**', 'src/**/*'], + tasks: ['ngdocs'] + }, + options: { + livereload: true + } + }, + + // karma: { + // unit:{ + // configFile:'config/develop/karma.develop.conf.js' + // }, + // continuous:{ + // configFile:'config/develop/karma.develop.conf.js', + // logLevel: 'ERROR' + // } + // }, + + protractor: { + options: { + keepAlive: true, // If false, the grunt process stops when the test fails. + noColor: false // If true, protractor will not use colors in its output. + }, + develop: { // Grunt requires at least one target to run so you can simply put 'all: {}' here too. + options: { + configFile: "config/develop/protractor.develop.conf.js" // Target-specific config file + } + }, + suite:{ + all:{}, + options: { + configFile: "config/master/protractor.master.conf.js" // Target-specific config file + } + } + } + }); + + grunt.registerTask('install', 'bower-install-simple'); + grunt.registerTask('lint', ['jshint']); + + grunt.registerTask('processAppStyleSheets', ['sass', 'cssmin']); + + grunt.registerTask('processAppJSInDev', ['html2js', 'concat:combineCustomJS']); + grunt.registerTask('processAppJSInProd', ['html2js', 'terser:combineCustomJS']); + grunt.registerTask('processExternalDeps', ['wiredep', 'useminPrepare', 'concat:generated', 'cssmin:generated', 'uglify:generated', 'usemin']); + + // for dev mode, we don't need to minify vendor files because it slows down the build process + // but we still concat and minify our app codes so that our prod and dev builds are as similar as possible. That way, + // we can catch issues that may arise during the concatenation and minification steps asap. + grunt.registerTask('processExternalDepsDevMode', ['wiredep', 'useminPrepare', 'concat:generated', 'cssmin:generated', 'usemin']); + + + grunt.registerTask('default', ['dev-build']); + grunt.registerTask('dev-build', ['build:dev']); + grunt.registerTask('release-build', ['build:release']); + grunt.registerTask('build', function(buildType) { + if ( buildType === 'release' ) { + grunt.task.run(['concurrent:releaseStep1', 'concurrent:releaseStep2', 'concurrent:releaseStep3']); + } else { + grunt.task.run(['concurrent:devStep1', 'concurrent:devStep2', 'concurrent:devStep3', 'concurrent:devStep4']); + } + }); + grunt.registerTask('deploy', ['release-build', 'ngdocs']); + // grunt.registerTask('test', ['karma:unit']); + // grunt.registerTask('continuous', ['karma:continuous']); + grunt.registerTask('e2e-test', ['protractor']); + + grunt.registerTask('release', function(arg1) { + grunt.task.run('release-build'); + if (arguments.length !== 0) + grunt.task.run('launch:release:' + arg1); + else + grunt.task.run('launch:release'); + }); + + grunt.registerTask('server', function(arg1) { + grunt.task.run('dev-build'); + if (arguments.length !== 0) + grunt.task.run('launch:dev:' + arg1); + else + grunt.task.run('launch:dev'); + }); + + grunt.registerTask('docs', function() { + grunt.task.run('ngdocs'); + grunt.task.run('connect:docs'); + grunt.task.run('watch:docs'); + }); + + grunt.registerTask('launch', function(build, arg1) { + if (arg1) { + grunt.log.writeln("Launching server with proxy"); + grunt.task.run('configureProxies:' + arg1, 'connect:' + arg1); + } else { + // grunt.log.writeln("Launching server with proxy API"); + // grunt.task.run('configureProxies:opencaeuat', 'connect:opencaeuat'); + } + grunt.task.run('watch:' + build); + }); + + // grunt.registerTask('debug', function () { + // grunt.log.writeln("Launching Karma"); + // grunt.task.run('test'); + // }); + + grunt.registerTask('e2e',function(arg1) { + grunt.log.writeln("Launching Protractor"); + grunt.task.run('e2e-test'); + }); +}; \ No newline at end of file diff --git a/GruntfileMms.js b/GruntfileMms.js new file mode 100755 index 000000000..1a03efbe4 --- /dev/null +++ b/GruntfileMms.js @@ -0,0 +1,90 @@ +/** + * This is the configuration file for converting MMS' directives and templates into distributable files. + * **/ +module.exports = function(grunt) { + require('jit-grunt')(grunt); + + var combineCustomJS = { + options: { + banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd HH:MM:ss") %> */\n', + wrap: 'mms', + mangle: true, + sourceMap: { + includeSources: true + } + }, + files: { + 'dist/mms.js': ['src/mms.js', 'src/services/*.js'], + 'dist/mms.directives.js': ['src/mms.directives.js', 'src/directives/**/*.js'] + } + }; + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + + /** This task is for turning all html files into angularjs modules which are included as dependencies + * for a particular module specified in the module function below + * **/ + html2js: { + options: { + // All the templates converted to angularjs modules will belong to the module with the name returned + // by the following function + module: function(modulePath, taskName) { + return 'mms.directives.tpls'; + }, + // Change the module name to the string returned by the following function + rename: function (modulePath) { + var moduleName = modulePath.replace('directives/templates/', ''); + return 'mms/templates/' + moduleName; + } + }, + directives: { + src: ['src/directives/templates/*.html'], + dest: 'dist/temp/js/mms.directives.tpls.js' + } + }, + + // concat only (no minification ) + concat: { + combineCustomJS: combineCustomJS + }, + + uglify: { + options: { + banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd HH:MM:ss") %> */\n', + mangle: true, + sourceMap: { + includeSources: true + } + }, + + mms: { + options: { + wrap: 'mms' + }, + files: { + 'dist/mms.js': ['src/mms.js', 'src/services/*.js'] + } + }, + + mmsdirs: { + options: { + wrap: 'mmsdirs' + }, + files: { + 'dist/mms.directives.min.js': [ + 'src/mms.directives.js', + 'src/directives/**/*.js' + ], + + 'dist/mms.directives.tpls.min.js': [ + 'dist/temp/js/mms.directives.tpls.js' + ] + } + } + }, + clean: ['dist/temp'] + }); + + grunt.registerTask('default', ['html2js', 'concat', 'clean']); +}; \ No newline at end of file diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 diff --git a/src/ve-components/component.controller.ts b/Notes.MD similarity index 100% rename from src/ve-components/component.controller.ts rename to Notes.MD diff --git a/README.md b/README.md old mode 100644 new mode 100755 index fb564759d..f37dcd928 --- a/README.md +++ b/README.md @@ -1,109 +1,278 @@ - - - -OpenMBEE - +# View Editor (VE) -# View Editor +## Usage +https://github.com/Open-MBEE/ve/blob/develop/Documents/ViewEditorUserGuide.pdf +## File Structure +* /package.json - Manifest file specifying node module dependencies required to build and bundle the app +* /app/bower.json - Manifest file specifying bower dependencies (js/css library dependencies) +* /Gruntfile.js - build file +* /src/services - services for the mms module, these mostly wrap the rest services of the EMS +* /src/directives - common components for mms.directives module, these provide common ui and behavior +* /src/directives/templates - html templates for our directives plus common styling +* /app - MDEV developed application, this will be separated out in the future -## About - -View Editor (VE) is a web-based environment designed to interact with a -systems model. VE is a document oriented view of the model elements, -which are stored in [OpenMBEE's Model Management Server (MMS)](https://github.com/Open-MBEE/mms). Its purpose is to provide real and -true data through the web so that users may interact with actual model -elements without having to open a modeling software (e.g. MagicDraw ). -This allows users of all levels, including non-modelers, to view or -modify live documents and values of a singular source of truth. - -## Users Guide -http://docs.openmbee.org/projects/ve - - -## Deployment Guide - -### Configuration - +## Configuration +_(View Editor 4.0.0 and newer)_ You can now configure view editor to work with external sites without using Grunt. This file also allows the configuration of certain branding and other features that will be expanded in future versions - -#### For View Editor 5.x and newer - -1. In the `config` directory copy `example.json` into a new file and rename it to `.json` +1. In the `app/config` directory copy `config.example.js` into a new file and rename it to `config..js` 2. You should update the `baseUrl` and `apiUrl` fields to point to your MMS server (eg. `apiURL: 'https://localhost:8080'` & (`baseUrl: ''`) -3. To deploy view editor using this custom file, use `VE_ENV=` - prepended to your `npm` command (e.g. `export VE_ENV= & npm build --mode=production/development`). +3. To deploy view editor using this custom file, use `--env ` + appended to your `grunt` command (e.g. `grunt release:docker --env=prod`). +3. For more information regarding the available configuration options see [Config](docs/Config.md). + +_Versions Prior to 4.0.0_ +5. Create a file named `angular-mms-grunt-servers.json`. This is where you will add server mappings. + * The _grunt_ command will build with these default and fake values, but will not be runnable. + * You should update "ems" key to point to the value of the **actual** hostname serving the Model Management Server (MMS). +```json +{ + "ems": "hostnameurl" +} +``` +## Installation and Building + +1. Install the latest stable version of Node ( at the time of this writing 8.9.4 ) +2. To install grunt cli: + + npm install -g grunt-cli + +3. cd into angular-mms directory +4. to install all node module dependencies specified in package.json -### Installation and Building + npm install -1. Install the latest stable version of Node ( at the time of this writing 18.x ) -2. (optional) To install yarn cli: +6. In the root directory, run. . . +* . . .to build and bundle the app in development mode. The final artifact will be available in the dist folder: + + grunt - npm install -g yarn-cli +* . . .to build and bundle the app in production mode. The final artifact will be available in the dist folder: + + grunt release-build + +* . . .to build and bundle the app in development mode. This will also launch a web server at localhost:9000 for serving static resources from dist folder and a proxy server for any other resources with path starting with /alfresco. This allows us to test with real service endpoints defined in `angular-mms-grunt-servers.json`. The default server is opencaeuat: -3. to install all node module dependencies specified in package.json + grunt server + +* . . .to build a proxied service in develop mode with default configuration: - npm install + grunt server:docker + +* . . .to build and bundle the app in production mode as well as launching a web server locally and a proxy: -4. Use the following commands using webpack/npm to build and bundle the app in: - * . . . development mode. The final artifact will be available in the dist folder: - - export VE_ENV= & npm build --mode=development + grunt release + +* . . .to build and bundle the app in production mode as well as launching a webserver locally with default configuration: - * . . .production mode. The final artifact will be available in the dist folder: - - export VE_ENV= & npm build --mode=production + grunt release:docker + +* . . .to build and bundle the app with a custom configuration in dev/production mode as well as launching a webserver locally (defaults to `example`): + + grunt :docker --env= -5. Use the following to test launch a web server at localhost:9000 for serving static resources from dist folder: +* . . .to build and bundle the app in production modes, generate documentation and publish the final artifact to Artifactory: - npm start + grunt deploy + +* . . .to run unit tests: + + grunt test + +7. To deploy, zip up the dist folder, it can be served as static files from a web server. For convenience, can unzip it to where mms is hosted (ex. {tomcatDir}/webapps/ve, {mmshost}/ve/mms.html to access) -### Building and Running standalone +For more information, please consult the Gruntfile.js and the links at the bottom. -To deploy standalone, build in production mode & zip up the dist folder, it can be served as static files from a web server. -### Building and Running with Docker +## Building and Running with Docker To build the container, run the following command: `docker build -t ve .`. To run the container, run `docker run -it -p 80:9000 --name ve ve`. -#### Using the docker container +### Using the docker container The docker container can be configured using a number of options -##### Configuration Variables -The View Editor container is based on the lightweight nginx:alpine container. See the nginx documentation for more details -on how to configure nginx directly [here](https://hub.docker.com/_/nginx). +#### Specifying Port +To specify the port use `--env VE_ENV=` (default = 9000) -- `VE_PORT` (default = 9000) Specify the desired port for VE to listen on \* -- `VE_PROTOCOL` (accepts: 'http' | 'https') Enables SSL, you will additionally need to mount your https certificates and key to - `/run/secrets/cert.key` and `/run/secrets/cert.crt` \* -- `VE_ENV` (default='example') specify a custom configuration file. Mount the desired file using a docker config - to `/opt/mbee/ve/config/.json` or volume mounted at `/opt/mbee/ve/config`. +#### Enabling HTTPS +Use `--env VE_PROTOCOL='https'` in order for this to work you will need to mount your https certificates and key to +`/run/secrets/cert.key` and `/run/secrets/cert.crt` -(* note: This uses the default VE nginx template if you choose to configure nginx directly it will no longer function.) +#### Config file (View Editor 4.0+) +To use a custom configuration file with the docker container you can mount the desired file using a docker config (mounted to `/opt/mbee/ve/app/config/config..js`) or volume mounted at `/opt/mbee/ve/app/config`. +Using your custom configuration can be done by specifying `--env VE_ENV=` or adding `VE_ENV` to your compose file. ## Problems? +If you see some error after updating, try cleaning out the bower_components and bower_components_target folders under /app and do a _grunt clean_ + +### SASS Won't load +If you get `Loading "sass.js" tasks...ERROR` + +Perform the following steps to resolve: +1. cd to the project directory +2. `npm update && npm install` +3. Then `node ./node_modules/node-sass/scripts/install.js` +4. Finally `npm rebuild node-sass` +5. Execute Grunt + +### Rendering problems - clear bower cache +If you're sure everything is right, try running _bower cache clean_ ## Note on debugging VE has source-mapping enabled. When developing and debugging it using Chrome, make sure to disable caching in the Chrome's developer tool network tab to ensure that the source-mapping is updated when constantly modifying codes. ( Chrome caches source-mapping file by default ). Firefox by default doesn't do that, so if you don't want to disable caching, use Firefox. +## Testing +Run: + npm install -g protractor + webdriver-manager update + +To execute Karma tests manually use + + ./node_modules/karma/bin/karma start config/develop/karma.develop.conf.js + +To avoid typing ./node_modules/karma/bin/karma everytime, install karma-cli globally, then karma should automatically use local karma + + npm install -g karma-cli + karma start config/develop/karma.develop.conf.js + +To execute Protractor tests + + protractor config/develop/protractor.develop.conf.js + +For Karma - place new tests within test/develop/unit/DirectiveSpecs or test/develop/unit/ServiceSpecs + +For Protractor - place new tests within test/develop/e2e + ## Generating Docs -Docs are now automatically generated and posted to +* _grunt ngdocs_ - this would generate html docs based on code comments written in ngdocs style into docs/. The generated files need to be served through a webserver to work. +* _grunt docs_ - this would generate the docs and run the server at localhost:10000 + +## Contributing and Experimenting, Add Components +For general contributing guidelines, please see + +Fork this repo, switch to the develop branch and use our existing build process and structure to add in services/directives/apps - in the future will have a better repo structure for pulling in dependencies and module management + +### Services +These are singletons. Angular will use dependency injection to give you whatever dependency you need if you declare them (these can be any built in Angular service or our other custom services in mms module) + +Put services under /src/services. For example, to add a service to do graph analysis: + + /src/services/GraphAnalysis.js + + 'use strict'; + + angular.module('mms') + .factory('GraphAnalysis', ['dependentService', GraphAnalysis]); + /* GraphAnalysis is the name of this service, dependentService is the name of the service depended upon (there can be more than one comma separated strings for dependencies), the last argument is the actual service function + */ + + function GraphAnalysis(dependentService) { + var privateVarState = "probably shouldn't do this"; + + var detectCycles = function(graph) { //whatever graph format in js + //logic + }; + + var privateFunc = function(stuff) { + //logic + }; + + return { //this is like exposing a public method + detectCycles: detectCycles + }; + } + +### Directives +Put core [Directives](https://docs.angularjs.org/guide/directive "Angular Documentation about Directives") under /src/directives. These should all be prefixed with 'mms' in file names, and will be utilized as 'mms-' in html. For example, this takes an element id argument and just displays the name. + + /src/directives/mmsElementName.js + + 'use strict'; + + angular.module('mms.directives') + .directive('mmsElementName', ['ElementService', mmsElementName]); + + function mmsElementName(ElementService) { + var mmsElementNameLink = function(scope, element, attrs) { + ElementService.getElement(scope.mmsId) + .then(function(data) { + scope.element = data; + }); + }; + + return { + restrict: 'E', + template: '{{element.name}}', + scope: { + mmsId: '@' + }, + link: mmsElementNameLink + }; + } + +To use this on an html page, use + + + +For a more complex template, put your template html in /src/directives/templates and they will be picked up in the compile process, and put into the $templateCache as 'mms/templates/template.html' (see other mms directives for examples or consult the angular docs) + +There are many more directive options to make complex directives, consult the Angular docs or other mms directives for examples. + +If you want to be able to type this into the view editor as the documentation of some element, you'll need to tell the tinymce editor to allow this custom tag. _Go to /src/directives/mmsTinymce.js and add your custom tag to the tinymce option custom_elements_. + +### App pages +Put test pages under /app. The current build will look through bower dependencies and inject them into you page if you put in special tags. Example: +#### html + + /app/test.html + + + + + + + + + + + + + + + + + + + + + +#### js + /app/js/test/app.js + + 'use strict'; + + angular.module('myApp', ['mms', 'mms.directives']); + //declare module dependencies ### customize pdf css +see src/services/UtilsService.getPrintCss [princexml](https://www.princexml.com/) ## Links * [node.js](http://nodejs.org/) -* [angular,js](https://docs.angularjs.org/guide/directive) -* [webpack](http://gruntjs.com/) +* [angular](https://docs.angularjs.org/guide/directive) +* [grunt](http://gruntjs.com/) * [sass](http://sass-lang.com/) * [ngdocs](https://github.com/idanush/ngdocs/wiki/API-Docs-Syntax) * [grunt-ngdocs](https://github.com/m7r/grunt-ngdocs) * [jasmine](http://jasmine.github.io/) +## Rationale for using Karma for testing +* [karma](http://karma-runner.github.io/0.12/index.html) +* [thesis](https://github.com/karma-runner/karma/raw/master/thesis.pdf) diff --git a/View-Editor-Wires-Release-.pdf b/View-Editor-Wires-Release-.pdf old mode 100644 new mode 100755 diff --git a/src/assets/alfresco-icon-sm.png b/app/assets/alfresco-icon-sm.png old mode 100644 new mode 100755 similarity index 100% rename from src/assets/alfresco-icon-sm.png rename to app/assets/alfresco-icon-sm.png diff --git a/src/assets/delete.svg b/app/assets/delete.svg old mode 100644 new mode 100755 similarity index 100% rename from src/assets/delete.svg rename to app/assets/delete.svg diff --git a/src/assets/icons/favicon-16.png b/app/assets/favicon-16x16.png old mode 100644 new mode 100755 similarity index 100% rename from src/assets/icons/favicon-16.png rename to app/assets/favicon-16x16.png diff --git a/src/assets/icons/favicon-32.png b/app/assets/favicon-32x32.png old mode 100644 new mode 100755 similarity index 100% rename from src/assets/icons/favicon-32.png rename to app/assets/favicon-32x32.png diff --git a/src/assets/icons/favicon.ico b/app/assets/favicon.ico old mode 100644 new mode 100755 similarity index 100% rename from src/assets/icons/favicon.ico rename to app/assets/favicon.ico diff --git a/src/assets/icons/favicon.png b/app/assets/favicon.png old mode 100644 new mode 100755 similarity index 100% rename from src/assets/icons/favicon.png rename to app/assets/favicon.png diff --git a/src/assets/format-dropdown.png b/app/assets/format-dropdown.png old mode 100644 new mode 100755 similarity index 100% rename from src/assets/format-dropdown.png rename to app/assets/format-dropdown.png diff --git a/src/assets/insert.svg b/app/assets/insert.svg old mode 100644 new mode 100755 similarity index 100% rename from src/assets/insert.svg rename to app/assets/insert.svg diff --git a/src/assets/location-feedback-inline.svg b/app/assets/location-feedback-inline.svg old mode 100644 new mode 100755 similarity index 100% rename from src/assets/location-feedback-inline.svg rename to app/assets/location-feedback-inline.svg diff --git a/src/assets/location-feedback.svg b/app/assets/location-feedback.svg old mode 100644 new mode 100755 similarity index 100% rename from src/assets/location-feedback.svg rename to app/assets/location-feedback.svg diff --git a/src/assets/mmsplus.png b/app/assets/mmsplus.png old mode 100644 new mode 100755 similarity index 100% rename from src/assets/mmsplus.png rename to app/assets/mmsplus.png diff --git a/src/assets/logo-large.svg b/app/assets/openmbee.svg old mode 100644 new mode 100755 similarity index 100% rename from src/assets/logo-large.svg rename to app/assets/openmbee.svg diff --git a/app/assets/styles/ve/base/_globals.scss b/app/assets/styles/ve/base/_globals.scss new file mode 100755 index 000000000..440d32547 --- /dev/null +++ b/app/assets/styles/ve/base/_globals.scss @@ -0,0 +1,15 @@ +/************************* + View Editor variables & mixins +*************************/ + +/* MMS base styles */ +@import "../../../../../src/assets/styles/base/_mms-mixins.scss"; +@import "../../../../../src/assets/styles/base/_mms-typography.scss"; +@import "../../../../../src/assets/styles/base/_mms-colors.scss"; + +$background_hover_transition: background-color .2s linear; +$background_easeout_transition: background-color .1s ease-out; +$navHeight: 36px; +$navBanner: 20px; +$navProject: 56px; +$navTotal: 92px; diff --git a/app/assets/styles/ve/base/_ve-colors.scss b/app/assets/styles/ve/base/_ve-colors.scss new file mode 100755 index 000000000..d86856f78 --- /dev/null +++ b/app/assets/styles/ve/base/_ve-colors.scss @@ -0,0 +1,50 @@ + +$ve-light-text:#7a7a7a; +$ve-light-text-darker-1:#535353; + +$ve-white-text-darker-1:#a3a3a3; +$ve-white-text-lighter-2:#d0d0d0; + +$ve-slate-lighter-2:#5c5c5c; +$ve-slate-lighter-1:#505050; +$ve-slate-base:#404040; +$ve-slate-darker-1:#383838; +$ve-slate-darker-2:#313131; +$ve-slate-darker-3:#212121; + +$ve-silver-lighter-2:#fdfdfd; +$ve-silver-lighter-1:#f9f9f9; +$ve-silver-lighter-0:#f4f4f4; +$ve-silver-base:#f0f0f0; +$ve-silver-darker-1:#e2e2e2; +$ve-silver-darker-2:#d8d8d8; +$ve-silver-darker-3:#b8b8b8; + +$ve-green-lighter-1:#60b9a6; +$ve-green-base:#439886; +$ve-green-darker-1:#398272; + +$ve-teal-lighter-4:#f4f9fa; +$ve-teal-lighter-3:#bfdae0; +$ve-teal-lighter-2:#58b9cc; +$ve-teal-lighter-1:#369cb1; +$ve-teal-base:#2c7e8f; +$ve-teal-darker-1:#296f83; +$ve-teal-darker-2:#1a5e71; + +$ve-accent:#456e9d; +$ve-accent-darker:#376391; + +$ve-yellow-base:#f8d768; + +$ve-clear:rgba(0,0,0,0); + +/*Light saturated blue for cross referencing and reordering*/ +$ve-active:rgb(0, 153, 255); + +$ve-link:#4885bd; + +$ve-warning: #c5544e; +$ve-warning-darker-1: #b8423c; +$ve-warning-orange: #ffb462; +$ve-warning-orange-light: #fff2e4; diff --git a/src/styles/ve-app/layout/_login-select.scss b/app/assets/styles/ve/layout/_login-select.scss old mode 100644 new mode 100755 similarity index 57% rename from src/styles/ve-app/layout/_login-select.scss rename to app/assets/styles/ve/layout/_login-select.scss index 02d076787..da2f324d1 --- a/src/styles/ve-app/layout/_login-select.scss +++ b/app/assets/styles/ve/layout/_login-select.scss @@ -1,7 +1,4 @@ -/* VE base styles */ -@use "src/styles/globals"; - -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ [Login Table of contents] 1. Layout @@ -10,19 +7,20 @@ 3.1 Text Input 4. Animation 5. Branding -6. Login Warning -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ + -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1. Layout -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ #ve-origin-select, #ve-login { - background-color: globals.$ve-slate-darker-2; + + background-color: $ve-slate-darker-2; margin: 0; - height: 100vh; + height:100vh; .account-wall { min-width: 320px; @@ -42,15 +40,15 @@ position: relative; } - @media (max-height: 500px) { - .account-wall { + @media (max-height:500px){ + .account-wall{ margin: 40px auto; } } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2. Typography -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .account-wall h2 { margin-bottom: 32px; @@ -60,10 +58,10 @@ } .module-disabled { - opacity: 0.3; + opacity: .3; } - .back-to-account { + .back-to-account{ float: left; position: absolute; top: 18px; @@ -71,90 +69,74 @@ } .label-text { - color: globals.$ve-white-text-lighter-2; + color: $ve-white-text-lighter-2; font-size: 14px; } - /* ------------------------------------------------------------------ -3. UI Styling -------------------------------------------------------------------- */ +/*------------------------------------------------------------------ +3. Input +-------------------------------------------------------------------*/ .login-input { - background-color: globals.$ve-slate-base; - border: 1px solid globals.$ve-slate-base; + background-color: $ve-slate-base; + border: 1px solid $ve-slate-base; border-radius: 2px !important; box-shadow: none; - color: white; + color:white; line-height: 18px; margin: 6px 0 18px; - letter-spacing: 0.05em; + letter-spacing:.05em; height: 36px; &:focus { box-shadow: none; - border: 1px solid globals.$ve-teal-base; + border: 1px solid $ve-teal-base; } } -} -.modal-header { - .warning-header { - color: red; - display: block; - } } - -.modal-center-override { - top: 50% !important; - transform: translateY(-50%) !important; -} - - -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 4. Animation - slide in selection options when no project provided -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -@keyframes slide-in-from-left { +@keyframes slideInFromLeft { 0% { transform: translateX(16%); opacity: 0; } - 100% { transform: translateX(0); opacity: 1; } } -@keyframes fade-in { +@keyframes fadeIn { 0% { opacity: 0; } - 100% { opacity: 1; } } .animated-fade-in-slide { - animation: 0.3s ease-out 0s 1 slide-in-from-left; + animation: .3s ease-out 0s 1 slideInFromLeft; } -.fade-in { - animation: 0.7s ease-out 0s 1 fade-in; +.fade-in{ + animation: .7s ease-out 0s 1 fadeIn; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 5. Branding -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ #ve-origin-select, #ve-login { .login-banner { width: 100%; text-align: center; } - .login-box { margin: auto; padding: 20px 5px; @@ -166,8 +148,5 @@ list-style-type: none; padding: 0; } -} -/* ------------------------------------------------------------------ -6. Login Warning -------------------------------------------------------------------- */ +} \ No newline at end of file diff --git a/app/assets/styles/ve/layout/_pane-center.scss b/app/assets/styles/ve/layout/_pane-center.scss new file mode 100755 index 000000000..bfb52bbb6 --- /dev/null +++ b/app/assets/styles/ve/layout/_pane-center.scss @@ -0,0 +1,166 @@ +/************************* + Styles for the View Editor center pane +*************************/ + +$pane_center_btn_group_width: 340px; +$pane_center_toolbar: $pane_center_btn_group_width + 150px; + +/* start of fullDoc page styles */ +body.fullDoc { + text-rendering: optimizeLegibility; + overflow: scroll; + font-family: "Times New Roman", Serif; +} + +tr { + page-break-inside: avoid !important; +} + +.pane-center .container-fluid{ + padding-left: 31px; + padding-right:25px; +} +/* end of fullDoc page styles */ + +.clickable:hover { + cursor: pointer; + background-color: $light_blue; +} + +/*Overriding default from fa-pane-scroller that results in double scroll bar*/ +.center-view .center-view{ + overflow: hidden; +} + +.pane-center { + margin-right: -11px; + font-size: 16px; + + .pane-center { + margin-right: 0; + padding-bottom: 30px; + } + + .pane-center-spinner { + position: absolute; + top: 45%; + left: 50%; + } + + .pane-center-toolbar { + padding: 5px 10px; + min-width: $pane_center_toolbar; + } + + .pane-center-btn-group { + float: right; + // padding: 5px 10px; + min-width: $pane_center_btn_group_width; + + .bordered-button-bar { + float: right; + } + } + + .pane-center-inner { + margin-top: 10px; + } +} + + +.container-tree-reorder { + margin-bottom: 24px; + + /*Float reorder buttons to the right */ + .btn-tree-reorder-save { + float: right; + margin-top: 24px; + margin-right: 8px; + } + + .angular-ui-tree-handle { + font-family: $font-family-sans-serif; + color: $ve-slate-base; + padding: 4px 6px; + border-radius: 2px; + font-weight: bold; + @include transition($background_easeout_transition); + + &.grab { + cursor: move; + cursor: -moz-move; + cursor: -webkit-move; + } + + &.no-grab { + font-weight: initial; + color: $ve-light-text; + cursor: default; + &:hover { + background-color:transparent; + } + } + + &:hover{ + background-color: $ve-silver-lighter-0; + } + } + + .angular-ui-tree-placeholder { + margin:0; + min-height:0; + } + + /*Add blue dotted line to visual feedback of where the item will be placed*/ + .angular-ui-tree-placeholder:before{ + background-image: url(../assets/location-feedback.svg); + content: ' '; + background-size: 70px 30px; + height: 30px; + width: 70px; + background-repeat: no-repeat; + position: absolute; + left: 4px; + } +} + + +/* styling for doclib link to the right of the button bar*/ + +.doclib-link { + margin: 0 4px; + float: left; + .btn-tools{ + color: $ve-light-text; + } + + img{ + padding-right:5px; + top: -1px; + position: relative; + } +} + +.fa-folder { + color: lighten($ve-accent, 12%); +} + +.group-reorder-container .highlighted { + background-color: darken($ve-active, 4%); + color: white; + + /*lighten folder against dark blue background*/ + .fa-folder{ + color: lighten($ve-accent, 24%); + } +} + + +.active-editor { + box-shadow: 0 0 0 3px rgba(101, 182,255,0.47); +} + +/* Overwrite angularjs bootstrap's popuover so that the popover's container expands with its content */ +.popover { + max-width: none; +} diff --git a/app/assets/styles/ve/layout/_pane-left.scss b/app/assets/styles/ve/layout/_pane-left.scss new file mode 100755 index 000000000..b01164f6d --- /dev/null +++ b/app/assets/styles/ve/layout/_pane-left.scss @@ -0,0 +1,60 @@ +/************************* + Styles for the View Editor left pane +*************************/ + +$pane_left_btn_group_width: 244px; + +#main-pane { + > .west-tabs { + &.fa-pane-orientation-horizontal { + .fa-pane-handle > .fa-pane-toggle { + @include box-shadow(2px 0 2px 0px rgba(100, 100, 100, 0.2)); + } + } + + .west-tabs { + @include box-shadow(1px 0px 1px 0px rgba(0, 0, 0, 0.2)); + } + } +} + +.container-pane-left { + height: 100%; + width: 100%; + background: $ve-silver-lighter-1; + + .pane-left { + width: 100%; + min-width: $pane_left_btn_group_width; + + .pane-left-toolbar { + padding: 5px 4px; + background: $white; + } + + .tree-options { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + padding: 4px 5px; + background: $white; + border-top: 1px solid $ve-silver-darker-1; + border-bottom: 1px solid $ve-silver-darker-1; + + .ve-plain-input{ + margin: 0 2px; + border-color: $ve-silver-darker-1; + } + + .btn-tools{ + padding: 4px 6px; + background: transparent; + } + } + .fa-folder{ + color: lighten($ve-accent, 12%); + } + } +} diff --git a/app/assets/styles/ve/layout/_pane-right.scss b/app/assets/styles/ve/layout/_pane-right.scss new file mode 100755 index 000000000..b604f3d44 --- /dev/null +++ b/app/assets/styles/ve/layout/_pane-right.scss @@ -0,0 +1,121 @@ +/************************* + Styles for the View Editor right pane +*************************/ + +.pane-right { + > .pane-right { + @include box-shadow(-1px 0px 1px 0px rgba(0, 0, 0, 0.2)); + } + + &.fa-pane-orientation-horizontal { + .fa-pane-handle > .fa-pane-toggle { + @include box-shadow(-2px 0 2px 0px rgba(100, 100, 100, 0.2)); + margin-left: 1px; + } + } + + .container-tags { + .tags-table { + font-size: 14px; + margin-top: 24px; + width: 100%; + } + } + + h4.right-pane-title{ + display: block; + margin: 20px 0; + } + + .container-fluid{ + padding:0 14px 34px; + } + + hr.spec-title-divider{ + margin-left:-18px; + margin-right:-18px; + border-color: $ve-silver-darker-2; + } +} + +.diff-pane-right { + > .pane-right { + @include box-shadow(-1px 0px 1px 0px rgba(0, 0, 0, 0.2)); + z-index: 1; + } + + &.fa-pane-orientation-horizontal { + .fa-pane-handle > .fa-pane-toggle { + @include box-shadow(-2px 0 2px 0px rgba(100, 100, 100, 0.2)); + margin-left: 1px; + } + } + + ul.abn-tree { + cursor: default; + + .shaft, + .shaft-hidden:hover { + background: inherit; + + i { + cursor: pointer; + } + } + } +} + +.htmlDiff { + + [class*="patcher-"] { + position: relative; + } + + [class*="patcher-"]:not(td):not(tr) { + display: inline-block; + } + + .patcher-text-insertion, .patcher-text-deletion { + display: inline !important; + } + + [class*="patcher-"]:not(.patcher-text-diff)::before { + position: absolute; + z-index: 1; + top: -8px; + right: -8px; + content: ' '; + background-size: 16px; + height: 16px; + width: 16px; + background-repeat: no-repeat; + } + + /*Green background to additions*/ + .patcher-replaceIn, .patcher-attribute-replace-in, .patcher-insert, .patcher-text-insertion { + background-color: #dafde0; + } + + /*Plus sign and green border to non textual changes*/ + .patcher-replaceIn, .patcher-attribute-replace-in, .patcher-insert { + &::before{ + background-image: url(../assets/insert.svg); + } + border: 2px dashed #abffb9; + } + + /*Strikethrough and red background to deletions*/ + .patcher-replaceOut, .patcher-delete, .patcher-attribute-replace-out, .patcher-text-deletion { + background-color: #ffe3e3; + text-decoration: rgba(255, 0, 0, 0.4) line-through; /* Ignored in CSS1/CSS2 UAs */ + -webkit-text-decoration: rgba(255, 0, 0, 0.4) line-through; /* Ignored in CSS1/CSS2 UAs */ + } + + /*Delete icon and dotted red border to non textual deletions*/ + .patcher-replaceOut, .patcher-delete, .patcher-attribute-replace-out { + &::before{ + background-image: url(../assets/delete.svg); + } + border: 2px dashed #ffb6b6; + } +} diff --git a/src/styles/ve-app/layout/_panes.scss b/app/assets/styles/ve/layout/_panes.scss old mode 100644 new mode 100755 similarity index 54% rename from src/styles/ve-app/layout/_panes.scss rename to app/assets/styles/ve/layout/_panes.scss index dc306ca0b..d0139737c --- a/src/styles/ve-app/layout/_panes.scss +++ b/app/assets/styles/ve/layout/_panes.scss @@ -1,7 +1,3 @@ -/* VE base styles */ -@use "src/styles/globals"; - - /************************* Includes ng Border Layout mods that follow the MMS app design guide @@ -14,12 +10,12 @@ .pane-center, .pane-right { p { - font-family: globals.$font-family-sans-serif; - font-size: globals.$font-size-base; + font-family: $font-family-sans-serif; + font-size: $font-size-base; } blockquote { - font-weight: globals.$light-font-weight; + font-weight: $light_font_weight; font-style: italic; } @@ -29,7 +25,7 @@ h4, h5, h6 { - font-family: globals.$light-font-family-sans-serif; + font-family: $light-font-family-sans-serif; } } @@ -46,43 +42,43 @@ height: 100vh; } -.ng-pane-orientation-vertical, -.ng-pane-orientation-horizontal { - .ng-pane-handle { - background-color: globals.$white; +.fa-pane-orientation-vertical, +.fa-pane-orientation-horizontal { + .fa-pane-handle { + background-color: $white; height: 100px; top: -webkit-calc(50% - 50px) !important; top: calc(50% - 50px) !important; - > .ng-pane-toggle { + > .fa-pane-toggle { height: 100%; max-height: 100%; cursor: pointer; - background-color: globals.$white; + background-color: $white; z-index: 10; &::before { - font-family: globals.$font-family-icon; + font-family: "FontAwesome"; font-size: 8px; - content: ""; - color: globals.$tertiary-grey; + content: "\f0c9\f0c9"; + color: $tertiary_grey; position: relative; top: 39%; display: inline-block; - @include globals.transform(rotate(90deg)); + @include transform(rotate(90deg)); } } } } -.ng-pane-orientation-vertical { - > .ng-pane-handle { +.fa-pane-orientation-vertical { + > .fa-pane-handle { cursor: row-resize; } } -.ng-pane-orientation-horizontal { - .ng-pane-handle { +.fa-pane-orientation-horizontal { + .fa-pane-handle { cursor: col-resize; } } @@ -95,11 +91,9 @@ } #main-pane { - top: globals.$nav-total; - bottom: globals.$footer-height; + top: $navTotal; } .content-container { - top: globals.$nav-total; - bottom: globals.$footer-height; + top: $navTotal; } diff --git a/src/styles/ve-app/layout/_ve-dropdowns.scss b/app/assets/styles/ve/layout/_ve-dropdowns.scss old mode 100644 new mode 100755 similarity index 55% rename from src/styles/ve-app/layout/_ve-dropdowns.scss rename to app/assets/styles/ve/layout/_ve-dropdowns.scss index 6b6a51e8b..bc52d1eaf --- a/src/styles/ve-app/layout/_ve-dropdowns.scss +++ b/app/assets/styles/ve/layout/_ve-dropdowns.scss @@ -1,10 +1,4 @@ -/* VE base styles */ -@use "src/styles/globals"; - -/* Third-party */ -@use "../../third-party/bootstrap"; - -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ [Table of contents] 1 Dropdown @@ -17,39 +11,38 @@ 1.5 Narrow Dropdown 1.6 Fixed Content Dropdown -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1 Dropdown -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1.1 Lists with selected items or input -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ @mixin fa-menu-content($content, $color) { content: $content; - font-family: globals.$font-family-icon; + font-family: FontAwesome; position: absolute; top: 3px; color: $color; } .dropdown-menu { + // Standardize font size across VE font-size: 14px; // Indicate selected list item - secondary .secondary-checked-list-item::before { - @include fa-menu-content("\f00c", globals.$ve-silver-darker-1); - + @include fa-menu-content("\f00c", $ve-silver-darker-1); left: 10px; } // Indicate selected list item - primary .checked-list-item::before { - @include fa-menu-content("\f00c", globals.$ve-green-lighter-1); - + @include fa-menu-content("\f00c", $ve-green-lighter-1); left: 10px; } @@ -64,30 +57,9 @@ position: relative; } - a.disabled, - li.disabled { - &, - &:hover, - &:focus { - color: bootstrap.$dropdown-link-disabled-color; - } - - // Nuke hover/focus effects - &:hover, - &:focus { - text-decoration: none; - background-color: transparent; - background-image: none; // Remove CSS gradient - - @include bootstrap.reset-filter; - - cursor: bootstrap.$cursor-disabled; - } - } - - /* Clear padding at top of menu when there is input */ + /*Clear padding at top of menu when there is input*/ &.menu-with-input { - padding-top: 0; + padding-top: 0px; } } @@ -100,43 +72,42 @@ } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 1.2 Dark dropdowns -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-dark-dropdown-wide, .ve-dark-dropdown-nav { + button.dropdown-toggle { display: inline; color: white; border: none; border-radius: 2px !important; - - @include globals.transition(globals.$background-easeout-transition); - - letter-spacing: 0.05em; - - /* overwriting user agent stylesheet */ - background-color: globals.$ve-slate-base; + @include transition($background_easeout_transition); + letter-spacing: .05em; + /*overwriting user agent stylesheet */ + background-color: $ve-slate-base; .fa-caret-down { padding: 2px 4px 2px 10px; - color: globals.$ve-white-text-darker-1; + color: $ve-white-text-darker-1; float: right; } &:hover { - background-color: globals.$ve-slate-darker-1; + background-color: $ve-slate-darker-1; } } - /* Darken button when open */ + /*Darken button when open*/ &.btn-group.open button.dropdown-toggle { - background-color: globals.$ve-slate-darker-1; + background-color: $ve-slate-darker-1; } ul.dropdown-menu { - background-color: globals.$ve-slate-lighter-1; + background-color: $ve-slate-lighter-1; border: none; border-radius: 3px; margin-top: 4px; @@ -151,56 +122,54 @@ padding: 6px 8px; word-wrap: normal; width: 100%; - - @include globals.transition(globals.$background-easeout-transition); - + @include transition($background_easeout_transition); cursor: pointer; &:hover { - background-color: globals.$ve-slate-lighter-2; + background-color: $ve-slate-lighter-2; } &.divider { height: 1px; margin: 6px 0; - background-color: globals.$ve-slate-lighter-2; + background-color: $ve-slate-lighter-2; padding: 0; } } - /* Clearing bootstrap styling */ - >li > a, - >li > span { + /*Clearing bootstrap styling*/ + >li>a, + >li>span { padding: 1px 10px; } - - >li > a { + >li>a{ color: white; &:hover { - background-color: globals.$ve-clear; + background-color: $ve-clear; color: white; } } } - /* ------------------------------------------------------------------ + /*------------------------------------------------------------------ 1.2.1 with buttons and selected items (this needs to be generalized) - ------------------------------------------------------------------- */ + -------------------------------------------------------------------*/ - /* Clear padding on top for lists with buttons */ + /*Clear padding on top for lists with buttons*/ ul.list-with-button { padding-top: 0; } - /* set min width for button in a list */ + /* set min width for button in a list*/ .btn-primary { min-width: 260px; } .dropdown-menu.list-with-selected-item { li { - /* When a list item is selected, include a check mark before it. Add additional padding to these lists */ + + /*When a list item is selected, include a check mark before it. Add additional padding to these lists*/ padding-left: 30px; a { @@ -211,46 +180,47 @@ top: 6px; } - /* Clear padding for check mark list items with buttons in them */ + /*Clear padding for check mark list items with buttons in them */ &.button-item { padding-left: 8px; } - /* Clear padding for check mark list items with tabs in them */ + /*Clear padding for check mark list items with tabs in them */ &.tab-item { - padding: 0; + padding: 0px; } } } - /* ------------------------------------------------------------------ + + /*------------------------------------------------------------------ 1.2.2 Branch being created (this needs to be generalized) - ------------------------------------------------------------------- */ + -------------------------------------------------------------------*/ - /* Clear hover on disabled branches */ + /*Clear hover on disabled branches*/ li.branch-disabled { - color: globals.$ve-white-text-darker-1; + color: $ve-white-text-darker-1; &:hover { - background-color: globals.$ve-slate-lighter-1; + background-color: $ve-slate-lighter-1; } - /* Add ... to branch being created */ + /*Add ... to branch being created*/ &::before { - font-family: globals.$font-family-icon; + font-family: FontAwesome; content: "\2026"; position: absolute; left: 10px; top: 3px; - color: globals.$ve-silver-base; + color: $ve-silver-base; } } li.ve-secondary { - color: globals.$ve-white-text-lighter-2; + color: $ve-white-text-lighter-2; &:hover { - background-color: globals.$ve-slate-lighter-1; + background-color: $ve-slate-lighter-1; } } } @@ -258,14 +228,15 @@ @media (max-width: 767px) { .ve-dark-dropdown-nav { .dropdown-menu li.divider { - background-color: globals.$ve-slate-lighter-2 !important; + background-color: $ve-slate-lighter-2 !important; } } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 1.3 Light dropdown -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-light-dropdown { display: block; @@ -275,39 +246,37 @@ .dropdown-toggle { text-align: left; font-size: 14px; - padding: 8px; + padding: 8px 8px; line-height: 13px; display: inline; border: none; border-radius: 2px !important; - - @include globals.transition(globals.$background-easeout-transition); - - letter-spacing: 0.05em; - background-color: globals.$ve-silver-lighter-0; + @include transition($background_easeout_transition); + letter-spacing: .05em; + background-color: $ve-silver-lighter-0; min-height: 30px; width: 100%; &:hover { - background-color: globals.$ve-silver-base; + background-color: $ve-silver-base; } } &.open .dropdown-toggle { - background-color: globals.$ve-silver-darker-1; + background-color: $ve-silver-darker-1; } ul { - border-color: globals.$ve-silver-base; + border-color: $ve-silver-base; min-width: 100%; } li { &.dropdown-input { - border-bottom: 1px solid globals.$ve-silver-base; + border-bottom: 1px solid $ve-silver-base; padding: 6px 0; margin-bottom: 6px; - background: globals.$ve-silver-lighter-1; + background: $ve-silver-lighter-1; } a { @@ -317,15 +286,18 @@ .fa-caret-down { float: right; - color: globals.$ve-white-text-darker-1; + color: $ve-white-text-darker-1 } + } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 1.4 Wide Dropdown -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-dark-dropdown-wide { + &.btn-group { display: block; width: 100%; @@ -339,6 +311,7 @@ padding: 5px 8px; height: 34px; line-height: 18px; + margin-top: 6px; } .dropdown-menu { @@ -347,22 +320,20 @@ } .label-dropdown { - color: globals.$ve-white-text-lighter-2; - font-size: 16px; + color: $ve-white-text-lighter-2; + font-size: 15px; display: block; - margin-bottom: 5px; } - .select-toolbar { - display: flex; - } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 1.5 Narrow Dropdown -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-dark-dropdown-nav { + button.dropdown-toggle { height: 24px; font-size: 14px; @@ -371,7 +342,7 @@ } .label-dropdown { - color: globals.$ve-white-text-lighter-2; + color: $ve-white-text-lighter-2; font-size: 14px; padding: 0 0 0 4px; } @@ -380,7 +351,7 @@ margin: 6px 0 6px 6px; } - /* over write bootstrap */ + /* over write bootstrap*/ li { font-size: 14px; } @@ -390,24 +361,26 @@ } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 1.6 Fixed Content Dropdown -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ span.fixed-content-dropdown { - padding-bottom: 12px; + padding-bottom:12px; ul.dropdown-menu { overflow-y: auto !important; - border: 1px solid globals.$ve-slate-lighter-2; + border: 1px solid $ve-slate-lighter-2; } - &.open > a.dropdown-toggle, - li > a.dropdown-toggle { - color: globals.$white; + &.open>a.dropdown-toggle, + li>a.dropdown-toggle { + color: $white; } .fa-caret-down { float: none; } -} + +} \ No newline at end of file diff --git a/app/assets/styles/ve/layout/_ve-footer.scss b/app/assets/styles/ve/layout/_ve-footer.scss new file mode 100755 index 000000000..914d34787 --- /dev/null +++ b/app/assets/styles/ve/layout/_ve-footer.scss @@ -0,0 +1,15 @@ + footer.footer { + width: 100%; + height: 13px; + border-top: 1px solid $tertiary_grey; + font-size: 9px; + font-weight: $default_font_weight; + color: rgba(64, 64, 64, .7); + position: absolute; + background-color: $ve-silver-lighter-1; + text-align: center; + z-index: 10; + cursor: default; + bottom: 0px; + padding-top: 1px; + } \ No newline at end of file diff --git a/src/styles/ve-app/layout/_ve-nav.scss b/app/assets/styles/ve/layout/_ve-nav.scss old mode 100644 new mode 100755 similarity index 59% rename from src/styles/ve-app/layout/_ve-nav.scss rename to app/assets/styles/ve/layout/_ve-nav.scss index acbf40b63..8933f219d --- a/src/styles/ve-app/layout/_ve-nav.scss +++ b/app/assets/styles/ve/layout/_ve-nav.scss @@ -1,9 +1,5 @@ -@use "sass:math"; -/* VE base styles */ -@use "src/styles/globals"; - -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ [Navigation Table of Contents] 1. General @@ -18,26 +14,26 @@ 3.1 Breadcrumbs 3.2 Dropdowns -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ + -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1.1 General Typography/Layout -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .navbar { color: white; margin: 0; - letter-spacing: 0.05em; + letter-spacing: .05em; font-size: 14px; z-index: 200; - // position: relative; width: 100%; - height: globals.$nav-height; - top: globals.$nav-banner; + height: $navHeight; + top: $navBanner; min-height: 30px; border: 0; - background-color: globals.$ve-slate-base; + background-color: $ve-slate-base; a, a:hover, @@ -45,24 +41,19 @@ text-decoration: none; color: white; } - - .nav-spin { - margin-left: 10px; - margin-top: math.div(globals.$nav-height, 2) - math.div(14px, 2); - } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2. Org/Global Level Header -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ nav.global-header { - background-color: globals.$ve-slate-base; + background-color: $ve-slate-base; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.1 Org Navigation -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ a.switch-org, a.switch-org:hover { @@ -70,22 +61,21 @@ a.switch-org:hover { text-decoration: underline !important; } -/* View Editor logo placement */ -.navbar-brand { +/* View Editor logo placement*/ +.navbar-brand{ float: left; padding: 5px 7px; font-size: 20px; line-height: 22px; - height: globals.$nav-height; + height: $navHeight; - img { + img{ height: 26px; + //border-radius: 50%; + @include transition($background_hover_transition); - // border-radius: 50%; - @include globals.transition(globals.$background-hover-transition); - - &:hover { - background-color: #0096ff; + &:hover{ + background-color: #0096FF; } } } @@ -93,15 +83,15 @@ a.switch-org:hover { .org-title { font-weight: 600; padding-right: 4px; - line-height: globals.$nav-height; + line-height: $navHeight; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.2 Global Navigation -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ #global-navigation { - background-color: globals.$ve-slate-base; + background-color: $ve-slate-base; border: none; float: right; } @@ -115,15 +105,16 @@ a.switch-org:hover { padding: 3px 8px; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.2.1 Menu -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ ul.global-menu { padding: 0 10px; + min-height: 30px; color: white; min-height: 30px; - background-color: globals.$ve-slate-base; + background-color: $ve-slate-base; } .global-menu > li { @@ -131,16 +122,16 @@ ul.global-menu { height: 24px; line-height: 24px; - /* Lighten top level nav to recede it */ + /* Lighten top level nav to recede it*/ span a, span a:visited, - span > a { - color: globals.$ve-white-text-lighter-2; + span > a{ + color: $ve-white-text-lighter-2; background-color: transparent; } - .dropdown-menu > li > a { - color: globals.$white; + .dropdown-menu > li > a{ + color: $white; } span a:hover, @@ -149,16 +140,14 @@ ul.global-menu { } } -.open > a, -.nav .open > a:focus, -.nav .open > a:hover { +.open>a, .nav .open>a:focus, .nav .open>a:hover { background-color: transparent; border: none; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.2.2 Search -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ #global-search { // display: inline; @@ -166,33 +155,32 @@ ul.global-menu { margin: 0; input { - background-color: globals.$ve-slate-darker-2; - border: 1px solid globals.$ve-slate-darker-2; + background-color: $ve-slate-darker-2; + border: 1px solid $ve-slate-darker-2; border-radius: 3px 0 0 3px; width: 300px; padding: 0 8px; height: 26px; margin: 5px 0; - letter-spacing: 0.05em; + letter-spacing: .05em; line-height: 1; - &:focus { outline: none; - background-color: globals.$ve-slate-darker-3; - border: 1px solid globals.$ve-teal-base; + background-color: $ve-slate-darker-3; + border: 1px solid $ve-teal-base; } } button { border-radius: 0 3px 3px 0; height: 26px; - padding: 0 7px; - background-color: globals.$ve-teal-base; - top: 0; + padding: 0px 7px; + background-color: $ve-teal-base; + top: 0px; position: relative; box-sizing: border-box; color: white; - border: none; + border:none; margin: 5px 0 5px -10px; vertical-align: bottom; } @@ -200,46 +188,46 @@ ul.global-menu { button .fa-search { position: relative; color: white; - font-size: 14px; - top: -1px; + font-size:14px; + top:-1px; } button:hover { - background-color: globals.$ve-teal-darker-1; + background-color:$ve-teal-darker-1; } } - @media (max-width: 720px) { #global-search input { width: calc(100% - 30px); } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.3 user Profile -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ #login-dropdown { display: inline-block; border-radius: 50%; width: 24px; height: 24px; - background: globals.$ve-accent; + background:$ve-accent; text-align: center; - color: white; + color:white; &:hover { - background-color: globals.$ve-accent-darker; + background-color:$ve-accent-darker; } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 3. Project Level Header -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ nav.project-level-header { - background-color: globals.$ve-slate-darker-2; - top: globals.$nav-project; + background-color: $ve-slate-darker-2; + top: $navProject; z-index: 150; .navbar-nav { @@ -247,11 +235,11 @@ nav.project-level-header { } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 3.1 Breadcrumbs -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.navbar { +.navbar{ .breadcrumbs { display: inline-block; @@ -265,88 +253,84 @@ nav.project-level-header { li { display: inline; - line-height: globals.$nav-height; + line-height: $navHeight; - a { + a{ padding: 0 7px 0 5px; max-width: 100%; - /* Hover state over links to show it's clickable */ - &:hover { + /*Hover state over links to show it's clickable*/ + &:hover{ text-decoration: underline; } } } - /* adjust folder and file icons for nav */ + /*adjust folder and file icons for nav */ .fa-folder, .fa-file { font-size: 12px; padding: 6px 4px 6px 0; - top: -0.1em; + top: -.1em; position: relative; } - .back-to-proj { + .back-to-proj{ font-size: 1.2em; - top: 0.05em; + top: .05em; position: relative; } } } -/* Hide breadcrumbs for mobile */ -@media (max-width: 1000px) { + +/*Hide breadcrumbs for mobile*/ +@media (max-width: 1000px){ .breadcrumbs { li { - a, - span { + a, span{ display: none; } } - /* Keep home visible */ - li:first-child { - a { + /* Keep home visible*/ + li:first-child{ + a{ display: inline-block; } } } - .project-level-header { - .navbar-right { + .project-level-header{ + .navbar-right{ float: right; } } } -/* Hide all but the last 2 breadcrumbs */ -@media (max-width: 1000px) and (min-width: 700px) { - .breadcrumbs { +/*Hide all but the last 2 breadcrumbs */ +@media (max-width: 1000px) and (min-width: 700px){ + .breadcrumbs{ li:nth-last-child(-n+2) { - a, - span { + a, span{ display: inline-block; } } } } -/* Add an ellipsis after the home to show there's more */ -@media (max-width: 700px) { - .breadcrumbs { - li:nth-last-child(2) { - a, - span { +/*Add an ellipsis after the home to show there's more */ +@media (max-width: 700px){ + .breadcrumbs{ + li:nth-last-child(2){ + a, span{ display: inline-block; } } } - .navbar-right { display: none; } - .project-level-header .ve-dark-dropdown-nav { max-width: calc(100% - 50px); @@ -354,7 +338,6 @@ nav.project-level-header { text-align: left; max-width: 100%; } - & .selected-dropdown { display: block; min-width: 200px; @@ -364,46 +347,45 @@ nav.project-level-header { float: left; text-overflow: ellipsis; } - & .ul.dropdown-menu { max-width: 400px; overflow: hidden; text-align: left; } } + } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 3.2 Dropdowns -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .project-level-header .ve-dark-dropdown-nav ul.dropdown-menu { max-width: 400px; text-align: left; min-width: 260px; - - /* Clearing bootstrap styling so long names can wrap */ - > li > a { + /*Clearing bootstrap styling so long names can wrap*/ + > li > a{ white-space: normal; word-wrap: break-word; } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 4. Banner Header -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ nav.nav-level-banner { - background-color: globals.$ve-slate-darker-2; + background-color: $ve-slate-darker-2; color: white; float: none; - height: globals.$nav-banner; + height: $navBanner; .navbar-nav { margin: 0; } - .navbar-banner-header { display: flex; justify-content: center; } -} +} \ No newline at end of file diff --git a/src/styles/ve-app/layout/_ve-no-panes.scss b/app/assets/styles/ve/layout/_ve-no-panes.scss old mode 100644 new mode 100755 similarity index 51% rename from src/styles/ve-app/layout/_ve-no-panes.scss rename to app/assets/styles/ve/layout/_ve-no-panes.scss index 30daee92b..868641e23 --- a/src/styles/ve-app/layout/_ve-no-panes.scss +++ b/app/assets/styles/ve/layout/_ve-no-panes.scss @@ -1,8 +1,6 @@ -/* VE base styles */ -@use "src/styles/globals"; -/* ------------------------------------------------------------------ -[VE No Panes Tables of Contents] +/*------------------------------------------------------------------ +[VE No Panes Tabls of Contents] 1. General 1.1 Typography/Layout @@ -11,20 +9,22 @@ 2.2 List 2.2.1 Layout 2.2.2 General List Items - 2.2.3 Headers + 2.2.3 Headers 2.3 Detail View 2.3.1 Info table 2.3.1 Header 2.3.2.1 Buttons 2.4 Responsive -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 1.1 General Typography/Layout -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-no-panes { + margin-top: 90px; overflow: auto; height: 90vh; @@ -33,14 +33,14 @@ color: #333; } - .back-to-docs::before { - content: "\f060"; - font-family: globals.$font-family-icon; - padding-right: 4px; + .back-to-docs:before{ + content:"\f060"; + font-family: "FontAwesome"; + padding-right:4px; } - .back-to-docs { - color: globals.$ve-link; + .back-to-docs{ + color:$ve-link; font-weight: 500; font-size: 16px; } @@ -57,30 +57,33 @@ } .panel-default { - border-color: globals.$ve-silver-darker-1; + border-color: $ve-silver-darker-1; } - .nav-tabs { - border-color: globals.$ve-silver-darker-1; + .nav-tabs{ + border-color: $ve-silver-darker-1; } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 2. Panels -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ + .ve-light-list-panels { padding: 0; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.2 List -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ ul.ve-light-list { - /* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 2.2.1 Layout -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ /* Layout and color for left hand list */ padding-left: 0; @@ -88,90 +91,88 @@ ul.ve-light-list { max-height: 300px; overflow-y: auto; width: 100%; - background-color: globals.$ve-silver-lighter-1; - border-right: 1px solid globals.$ve-silver-darker-1; + background-color: $ve-silver-lighter-1; + border-right: 1px solid $ve-silver-darker-1; margin-bottom: 0; - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.2.2 General List Items -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ li { padding: 6px 10px 6px 28px; font-size: 16px; cursor: pointer; - - @include globals.transition(globals.$background-easeout-transition); + @include transition($background_easeout_transition); } li.ref-item:hover { - background: globals.$ve-silver-lighter-0; + background: $ve-silver-lighter-0; } li a, li a:hover, li a:visited { color: #333; - text-decoration: none; + text-decoration:none; } li.selected { - background-color: globals.$ve-silver-darker-1; + background-color: $ve-silver-darker-1; a { font-weight: 600; } } - li.selected:hover { - background-color: globals.$ve-silver-darker-1; + li.selected:hover{ + background-color: $ve-silver-darker-1; } - /* Indicates progress */ - a.ref-duplicating::after { - content: "(In Progress)"; - font-style: italic; - font-weight: 400; - padding-left: 6px; + /*Indicates progress*/ + a.ref-duplicating::after{ + content:"(In Progress)"; + font-style:italic; + font-weight:400; + padding-left:6px; } - li.ve-light-input { - padding: 10px 0; + li.ve-light-input{ + padding:10px 0; } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.2.3 Headers (reference titles) -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ - .ref-title h2 { + .ref-title h2{ margin: 4px; text-transform: uppercase; font-weight: 600; - letter-spacing: 0.14em; + letter-spacing: .14em; font-size: 12px; - color: globals.$ve-light-text; + color: $ve-light-text; + } - .fa, - .fa-solid, - .fa-regular { - padding-right: 4px; - } + .ref-title h2 .fa{ + padding-right:4px; } - li.ref-title { - padding: 8px 10px; + li.ref-title{ + padding: 8px 10px; } - li.ref-title ~ li.ref-title { - margin-top: 16px; + li.ref-title ~ li.ref-title{ + margin-top:16px; } + } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.4 Responsive -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* When mobile, move list to top of detail view */ +/* When mobile, move list to top of detail view*/ @media (min-width: 990px) { ul.ve-light-list { @@ -181,8 +182,8 @@ ul.ve-light-list { .ve-light-panels-detail { height: calc(100vh - 300px); - overflow-y: auto; - padding: 0; + overflow-y:auto; + padding:0; } } @@ -196,16 +197,17 @@ ul.ve-light-list { } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.3 Detail View -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-light-panels-detail { - /* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 2.3.1 Info Table -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ - .ve-light-panels-detail-content { + .ve-light-panels-detail-content{ padding: 10px 26px 20px; dd, @@ -218,27 +220,26 @@ ul.ve-light-list { padding-bottom: 24px; } - dd.link-section > a, - dd.link-section > span { - color: globals.$ve-link; + dd.link-section > a, dd.link-section > span { + color: $ve-link; font-weight: 500; } dd.link-section > a::after { - content: "\f061"; - font-family: globals.$font-family-icon; - padding-left: 4px; + content:"\f061"; + font-family: FontAwesome; + padding-left:4px; } } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.3.2 Header -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ - /* Header with create branches and tags to the right */ +/* Header with create branches and tags to the right */ .panels-detail-title { - border-bottom: 1px solid globals.$ve-silver-darker-1; + border-bottom: 1px solid $ve-silver-darker-1; margin-bottom: 20px; padding: 18px 26px 20px; @@ -246,19 +247,19 @@ ul.ve-light-list { display: inline-block; } - button-bar { + mms-button-bar { float: right; } } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.3.2.1 Buttons -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ - /* Styling for when branches are disabled. */ +/* Styling for when branches are disabled.*/ - span.branch-disabled::before { - font-family: globals.$font-family-icon; + span.branch-disabled::before{ + font-family:FontAwesome; content: "\2026"; top: -4px; color: #d8d8d8; @@ -268,11 +269,13 @@ ul.ve-light-list { position: relative; } - dd.link-section > span.branch-disabled { - color: globals.$ve-light-text; + dd.link-section > span.branch-disabled{ + color:$ve-light-text; } - dd.link-section > span.branch-disabled:hover { - text-decoration: none; + dd.link-section > span.branch-disabled:hover{ + text-decoration:none; } + } + diff --git a/app/assets/styles/ve/layout/_ve-table-filter.scss b/app/assets/styles/ve/layout/_ve-table-filter.scss new file mode 100755 index 000000000..fa66063fc --- /dev/null +++ b/app/assets/styles/ve/layout/_ve-table-filter.scss @@ -0,0 +1,116 @@ + +/*------------------------------------------------------------------ +[VE Table Filter Table of Contents] + +1. Top Level Buttons +2. Filter + 2.1 Layout + 2.2 Buttons + 2.3 Input + 2.4 Status text + +-------------------------------------------------------------------*/ + +.ve-table-filter{ + +/*------------------------------------------------------------------ +1. Top Level Buttons +-------------------------------------------------------------------*/ + .export-csv-button.btn, + .filter-table-button.btn, + .reset-sort-button.btn, + .table-button { + margin: 30px 0 6px; + font-weight:500; + } + +/*------------------------------------------------------------------ +2. Filter +-------------------------------------------------------------------*/ + +/*------------------------------------------------------------------ + 2.1 Layout +-------------------------------------------------------------------*/ + .ve-show-filter{ + margin: 12px 0 4px; + min-width:730px; + } + +/*------------------------------------------------------------------ + 2.2 Buttons +-------------------------------------------------------------------*/ + .ve-apply-filter{ + display: inline; + height: 36px; + padding: 0px 6px; + margin: 0 6px; + box-sizing: border-box; + vertical-align: bottom; + } + + .ve-reset-search{ + background-color: $ve-clear; + color: $ve-silver-darker-1; + font-size: 1.2em; + margin-left: -1.2em; + padding: 0; + position: absolute; + border: 0; + margin-top: .18em; + } + + .ve-reset-search:hover{ + color:$ve-silver-darker-2; + } + +/*------------------------------------------------------------------ + 2.3 Input +-------------------------------------------------------------------*/ + .ve-filter-table-form{ + input{ + border-radius:3px; + border:1px solid $ve-silver-darker-2; + height: 36px; + padding: 0px 6px; + display: inline; + box-sizing: border-box; + } + } + +/*------------------------------------------------------------------ + 2.4 Status text +-------------------------------------------------------------------*/ + .ve-filter-status{ + display:block; + margin: 10px 0; + color:$ve-light-text; + } +} +input[type=checkbox].fixed-header-checkbox { + margin: 3px 0 0; +} +input[type=text].column-input { + margin: 0; + padding: 0; +} +.table-fix-head, .table-fix-column { + table { + border-collapse: separate; + //https://stackoverflow.com/questions/49209548/why-css-transform-translate-leaves-border-of-table-row-where-it-was + } + thead, th { + background-color: $ve-silver-lighter-1; + } + tbody, td, caption { + background-color: $white; + } +} +.table-fix-head { + overflow-y: auto; +} +.table-fix-column { + overflow-x: auto; + td.table-fixed-cell { + background-color: $ve-silver-lighter-1; + } +} \ No newline at end of file diff --git a/app/assets/styles/ve/layout/_ve-tabs.scss b/app/assets/styles/ve/layout/_ve-tabs.scss new file mode 100755 index 000000000..5ca2085f3 --- /dev/null +++ b/app/assets/styles/ve/layout/_ve-tabs.scss @@ -0,0 +1,136 @@ + +/*------------------------------------------------------------------ +[Tabs Table of Contents] + +1. Dark Tabs +2. Light Tabs + 2.1 Silver Inset Tabs for Modals + +-------------------------------------------------------------------*/ + +/*------------------------------------------------------------------ +1. Dark Tabs +-------------------------------------------------------------------*/ + +.ve-dark-dropdown-wide, +.ve-dark-dropdown-nav{ + .nav-tabs { + background-color: $ve-slate-base; + + > li.uib-tab { + width: 50%; + text-align: center; + + > a { + background-color: $ve-slate-base; + border: none; + border-bottom: 3px solid $ve-slate-base; + color: $ve-white-text-lighter-2; + margin: 0; + + &:hover { + background-color: $ve-slate-base; + border-bottom: 3px solid $ve-teal-darker-1; + } + } + + &.active > a { + background-color: $ve-slate-base; + border: none; + border-bottom: 3px solid $ve-teal-base; + color: white; + margin: 0; + } + } + } + + //Clear hoverstate for tabs and list items with buttons in them + .list-with-tabs li.button-item, + .list-with-tabs li.button-item:hover, + .nav-tabs > li.uib-tab { + background-color: $ve-slate-base; + } +} + +/*------------------------------------------------------------------ +2. Light Tabs +-------------------------------------------------------------------*/ + +.ve-light-tabs { + + .nav-tabs{ + border-bottom: none; + + > li { + margin: 0 8px; + + &.uib-tab { + text-align: center; + + > a { + border: none; + color: #333; + margin: 0; + line-height: 21px; + + &:hover, + &:focus{ + background-color: $ve-silver-lighter-0; + border-bottom: 3px solid $ve-teal-lighter-2; + } + } + } + + &.active > a{ + border: none; + border-bottom: 3px solid $ve-teal-lighter-1; + margin: 0; + font-weight: 600; + color: #333; + } + } + } + + .fa{ + opacity: .4; + padding-right: 6px; + } + + //If it's above a well, pull tabs down so it's touching + &~.well{ + margin-top: 0; + } + +/*------------------------------------------------------------------ + 2.1 Silver Inset Tabs for modals +-------------------------------------------------------------------*/ + + &.modal-top-tabs{ + + //Create silver background that extends to edges of modals + background-color: $ve-silver-lighter-0; + margin:-15px -15px 20px; + + .nav-tabs{ + //add bootstrap bottom border back + border-bottom: 1px solid #ddd; + + > li.uib-tab{ + > a{ + background-color: $ve-silver-lighter-0; + border-bottom: 3px solid $ve-silver-lighter-0; + + &:hover, + &:focus{ + background-color: $ve-silver-lighter-0; + border-bottom: 3px solid $ve-teal-lighter-2; + } + } + + &.active > a{ + border-bottom: 3px solid $ve-teal-lighter-1; + } + } + } + } +} diff --git a/app/assets/styles/ve/thirdparty/_autosave-plugin.scss b/app/assets/styles/ve/thirdparty/_autosave-plugin.scss new file mode 100755 index 000000000..53e8583c6 --- /dev/null +++ b/app/assets/styles/ve/thirdparty/_autosave-plugin.scss @@ -0,0 +1,245 @@ +/************************* + Styles to override autosave plugin +*************************/ + +/*------------------------------------------------------------------ +[Table of contents] + +1. Dialogue styling + 1.1 Compare versions prompt modal + 1.2 Diff modal +2. Save success message +3. Firefox table overflow fix +4. Flip buttons so they match the direction of the diff + +-------------------------------------------------------------------*/ + +/*------------------------------------------------------------------ +1. Dialogue styling +-------------------------------------------------------------------*/ + +/*Background color*/ +.cke_dialog_background_cover{ + background:rgba(0,0,0,0.5) !important; + background-color:black !important; + opacity: 0.5 !important; +} + +.autosave{ + + /*Dialog title consistent with VE styles*/ + .cke_dialog_title{ + -moz-user-select: none; + box-sizing: border-box; + position: relative; + z-index: 2; + background: white !important; + margin: 0; + margin: 0; + font-size: 16px; + letter-spacing: .02em; + font-weight: 600; + color: #535353; + padding: 15px !important; + border-bottom: 1px solid #e5e5e5 !important; + border-radius: 6px 6px 0 0 !important; + font-family: "Helvetica Neue",Helvetica,Arial,sans-serif !important; + } + + /*Make Dialog body consistent*/ + .cke_dialog_body{ + border-radius:6px !important; + outline:none !important; + } + + /*Base button consistent with VE styles*/ + .cke_dialog_ui_button{ + font-weight: 600; + letter-spacing: .14em; + font-size: 12px; + @include transition($background_easeout_transition); + border: none !important; + text-transform: uppercase; + border-radius:3px; + box-shadow:none; + padding: 7px 12px !important; + text-shadow:none !important; + } + + /*Make tertiary button consistent with VE styles */ + .cke_dialog_ui_button.cke_dialog_ui_button_cancel{ + color: $ve-light-text !important; + background:$ve-silver-base !important; + &:hover{ + background-color:$ve-silver-darker-2 !important; + color:$ve-light-text-darker-1 !important; + } + } + + /*Make primary button consistent with VE*/ + .cke_dialog_ui_button.cke_dialog_ui_button_ok.cke_dialog_autosave_ok{ + background: $ve-teal-base !important; + color:white !important; + &:hover{ + background-color: $ve-teal-darker-1 !important; + border: none; + } + } + + + /*------------------------------------------------------------------ + 1.1 Compare versions prompt modal + -------------------------------------------------------------------*/ + + .cke_dialog_footer{ + box-sizing: border-box; + -webkit-box-align: center; + -webkit-align-items: center; + align-items: center; + -webkit-box-pack: end; + -webkit-justify-content: flex-end; + justify-content: flex-end; + margin-bottom: 0; + padding-right: 8px; + padding-left: 16px; + overflow: hidden; + padding: 15px; + padding-right: 15px; + padding-left: 15px; + text-align: right; + border-top: 1px solid #e5e5e5 !important; + background:white !important; + border-radius: 0 0 6px 6px !important; + outline:none !important; + padding: 15px !important; + } + + .cke_dialog_footer_buttons{ + margin:0 !important; + } + + /*------------------------------------------------------------------ + 1.1 Compare versions prompt modal + -------------------------------------------------------------------*/ + + /*Should be minimum modal width at desktop and 100% on smaller screens*/ + #autosaveModal .modal-content.autosave{ + width: calc(100% - 20px); + } + + @media (min-width: 768px){ + #autosaveModal .modal-content.autosave{ + width: 600px; + } + } + + + /*------------------------------------------------------------------ + 1.2 Diff modal + -------------------------------------------------------------------*/ + + /*Radio options should be next to each other, not spread out horizontally */ + .cke_dialog_contents_body{ + .cke_dialog_ui_hbox_first, + .cke_dialog_ui_hbox_last{ + float:left !important; + } + } + + /* Set width to 100% when there is no initial content*/ + table.diff{ + width: 100%; + box-sizing: border-box; + + .insert{ + background-color: #dafde0 !important; + } + + .delete{ + background-color: #ffe3e3; + text-decoration: rgba(255,0,0,.4) line-through; + -webkit-text-decoration: rgba(255,0,0,.4) line-through; + } + + td, + th{ + padding: .4em .4em; + + } + + th { + font-weight: bold; + } + + } + + /* Hide credits for plugin author*/ + table.diff th.author{ + display:none; + } + + .cke_dialog_contents_body .cke_dialog_ui_vbox_child{ + table.diff tbody th{ + background-color:white !important; + } + } +} + +/*------------------------------------------------------------------ +2. Save success message +-------------------------------------------------------------------*/ + +/* Remove green coloring from suggess message and minimize*/ +.cke_notification.cke_notification_success{ + display:none !important; +} + +/*------------------------------------------------------------------ +3. Firefox table overflow fix +-------------------------------------------------------------------*/ + +table.diff{ + /* Set table layout to fixed so it doesn't adjust to long strings.*/ + table-layout: fixed !important; + width: 100% !important; + word-wrap: break-word; + + /* Fix the width of the first numbering column*/ + tr > th:first-child{ + width: 20px; + } + + /* Fix the width of the second numbering column in the case of the inline diff view*/ + &.inlinediff{ + tr > th:nth-child(2){ + width: 20px; + } + } + + /*fix the width of the third numbering column in the case of the side by side diff view*/ + &:not(.inlinediff){ + tr > th:nth-child(3){ + width: 20px; + } + } +} + + +/*------------------------------------------------------------------ +4. Flip buttons so they match the direction of the diff +-------------------------------------------------------------------*/ + +.autosave{ + .cke_dialog_ui_hbox.cke_dialog_footer_buttons{ + tr{ + display: block; + float: left; + } + + td:first-child{ + float: right; + margin-left: 10px; + } + } +} + diff --git a/src/styles/ve-app/ve-app-main.scss b/app/assets/styles/ve/ve-main.scss old mode 100644 new mode 100755 similarity index 52% rename from src/styles/ve-app/ve-app-main.scss rename to app/assets/styles/ve/ve-main.scss index ef22da206..dfebeb4f1 --- a/src/styles/ve-app/ve-app-main.scss +++ b/app/assets/styles/ve/ve-main.scss @@ -2,27 +2,24 @@ Main combinator file for View Editor stylesheets *************************/ - -/* VE base styles */ -@use "../globals"; - +/* Variables & mixins */ +@import "base/_globals"; +@import "base/_ve-colors"; /* Overall page design */ -@use "layout/pane-left"; -@use "layout/pane-center"; -@use "layout/pane-right"; -@use "layout/panes"; -@use "layout/login-select"; - +@import "layout/_pane-left"; +@import "layout/_pane-center"; +@import "layout/_pane-right"; +@import "layout/_panes"; +@import "layout/_login-select"; /* Layout directive customizations */ -@use "layout/ve-nav"; -@use "layout/ve-footer"; -@use "layout/ve-no-panes"; -@use "layout/ve-table-filter"; -@use "layout/ve-tabs"; -@use "layout/ve-dropdowns"; - +@import "layout/_ve-nav"; +@import "layout/_ve-footer"; +@import "layout/_ve-no-panes"; +@import "layout/_ve-table-filter"; +@import "layout/_ve-tabs"; +@import "layout/ve-dropdowns"; /* Third party customizations */ -@use "thirdparty/autosave-plugin"; +@import "thirdparty/_autosave-plugin"; .ng-hide { display: none !important; @@ -32,15 +29,14 @@ div.tooltip-inner { white-space: normal; } -.indent { - margin-left: 24px; +.indent{ + margin-left:24px; } @media print { - a[href]::after { + a[href]:after { content: none !important; } - img { max-width: 100%; page-break-inside: avoid; @@ -48,19 +44,16 @@ div.tooltip-inner { page-break-after: auto; display: block; } - - tr, - td, - th { + tr, td, th { page-break-inside: avoid; } - thead { display: table-header-group; } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ [Table of contents] 1. Typography @@ -85,19 +78,21 @@ div.tooltip-inner { 9. Well Customization 10 Custom grid -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ + -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1. Typography -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ #ve-login, #ve-origin-select, .ve-dark-modal, .ve-dark-dropdown-nav, .ve-dark-dropdown-menu { + color: white; - letter-spacing: 0.05em; + letter-spacing: .05em; a, a:hover, @@ -107,22 +102,22 @@ div.tooltip-inner { } } -.ve-secondary-text { - color: globals.$ve-light-text; - font-size: 0.9em; +.ve-secondary-text{ + color: $ve-light-text; + font-size: .9em; } -.ve-font-weight-normal { - font-weight: globals.$default-font-weight; +.ve-font-weight-normal{ + font-weight: $default_font_weight; } -.placeholder { - color: globals.$ve-light-text; - font-style: italic; - text-transform: lowercase; +.placeholder{ + color: $ve-light-text; + font-style: italic; + text-transform: lowercase; } -h4 { +h4{ margin: 0; font-size: 16px; letter-spacing: 0.02em; @@ -130,48 +125,46 @@ h4 { display: inline-block; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2. Global UI Elements -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.1 Buttons -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ + -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.1.2 Small Button -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .btn-sm { - padding: inherit; - font-size: 16px; - - .btn-sm-label { - font-size: 12px; - } + padding: 5px 10px; + font-size: 11px; } .btn-copy { background-color: transparent; - color: globals.$ve-light-text-darker-1; + color: $ve-light-text-darker-1; margin: 0 5px 5px 10px; float: right; &:hover { - color: globals.$ve-silver-base; - background-color: globals.$ve-teal-base; + color: $ve-silver-base; + background-color: $ve-teal-base; } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 2.2 Modals -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .ve-dark-modal { - background-color: globals.$ve-slate-darker-2; + background-color: $ve-slate-darker-2; .modal-content { - background-color: globals.$ve-slate-base; + background-color: $ve-slate-base; border: none; border-radius: 3px; } @@ -183,86 +176,86 @@ h4 { .modal-title { letter-spacing: 0.04em; - color: globals.$ve-white-text-lighter-2; + color: $ve-white-text-lighter-2; } - /* Clearing bootstrap */ + /*Clearing bootstrap*/ .modal-header { - border-bottom: 1px solid globals.$ve-slate-darker-1; + border-bottom: 1px solid $ve-slate-darker-1; } - /* Clearing bootstrap */ + /*Clearing bootstrap*/ .modal-footer { - border-top: 1px solid globals.$ve-slate-darker-1; + border-top: 1px solid $ve-slate-darker-1; } } -/* ------------------------------------------------------------------ + + +/*------------------------------------------------------------------ 2.4 Banners -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.ve-notify-banner { - background-color: globals.$ve-teal-lighter-4; +.ve-notify-banner{ + background-color: $ve-teal-lighter-4; padding: 6px 10px; - border: 1px solid globals.$ve-teal-lighter-3; + border: 1px solid $ve-teal-lighter-3; border-radius: 3px; - color: globals.$ve-teal-base; + color: $ve-teal-base; margin: 4px 10px 14px; } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 2.5 Input -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.5.1 Light Input -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.ve-plain-input { +.ve-plain-input{ background-color: white; padding: 2px 6px; - border: 1px solid globals.$ve-silver-darker-2; - - @include globals.border-radius(3px); - + border: 1px solid $ve-silver-darker-2; + @include border-radius(3px); margin: 2px 10px; width: calc(100% - 20px); font-weight: normal; - &:focus { - border-color: globals.$ve-teal-lighter-2; - box-shadow: inset 0 1px 1px globals.$ve-teal-lighter-3, 0 0 8px globals.$ve-teal-lighter-3; + &:focus{ + border-color: $ve-teal-lighter-2; + box-shadow: inset 0 1px 1px $ve-teal-lighter-3, 0 0 8px $ve-teal-lighter-3; } } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 2.5.2 Minor dark input -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.ve-dark-minor-search input { +.ve-dark-minor-search input{ width: 100%; - border: 1px solid globals.$ve-slate-darker-2; - - @include globals.border-radius(3px); - - background-color: globals.$ve-slate-darker-2; + border: 1px solid $ve-slate-darker-2; + @include border-radius(3px); + background-color: $ve-slate-darker-2; padding: 3px 5px; - letter-spacing: 0.05em; + letter-spacing: .05em; &:focus { - outline: none; - background-color: globals.$ve-slate-darker-3; - border: 1px solid globals.$ve-teal-base; + outline:none; + background-color: $ve-slate-darker-3; + border: 1px solid $ve-teal-base; } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.6 Animation -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ // .fade-in-out.ng-hide-add, // .fade-in-out.ng-hide-remove { -// @include globals.transition(all 0.2s linear); +// @include transition(all 0.2s linear); // /* remember to add this */ // display: flex!important; // opacity: 1; @@ -285,47 +278,59 @@ h4 { // opacity:0; // } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.7 Special Icons -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.7.1 Section icon -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* set pseudoclass and reset italic from */ -.section-icon::before { - content: "\00a7"; +/*set pseudoclass and reset italic from */ +.section-icon::before{ + content:"\00a7"; font-style: normal; font-weight: bold; } -/* display inline block to be same width in tree */ -.section-icon { - display: inline-block; +/*display inline block to be same width in tree*/ +.section-icon{ + display:inline-block; } -i.section-icon { +i.section-icon{ line-height: 14px; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2.7.2 Ref icons -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* add to branch labels */ -.branch-icon::before { +/*add to branch labels*/ +.Branch-icon::before, +.branch-icon::before{ content: "\f126"; - font-family: globals.$font-family-icon; - color: globals.$ve-silver-darker-3; + font-family: FontAwesome; + color: $ve-silver-darker-3; + padding-right: 6px; + top: 1px; + position: relative; +} + +/*add to tag labels*/ +.Tag-icon::before, +.tag-icon::before{ + content: "\f02b"; + font-family: FontAwesome; + color: $ve-silver-darker-3; padding-right: 6px; top: 1px; position: relative; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 3. Table Filtering & Sorting -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .tableSearch > span { display: block; @@ -338,26 +343,25 @@ table caption { } .doc-table-header { - background-color: globals.$ve-silver-lighter-1; + background-color:$ve-silver-lighter-1; } .filter-input { margin: 0; - width: 100%; + width: 100% } .sort-default { - color: globals.$ve-silver-darker-3; + color: $ve-silver-darker-3; float: right; } .sort-activated { - color: globals.$ve-slate-darker-2; + color: $ve-slate-darker-2; float: right; } -.sort-default, -.sort-activated { +.sort-default, .sort-activated { margin: 5px; } @@ -368,19 +372,19 @@ table caption { .export-csv-button::before { content: "\f045"; - font-family: globals.$font-family-icon; + font-family: FontAwesome; padding: 4px 4px 4px 0; } .filter-table-button::before { content: "\f0b0"; - font-family: globals.$font-family-icon; + font-family: FontAwesome; padding: 2px 4px; } .reset-sort-button::before { content: "\f0e2"; - font-family: globals.$font-family-icon; + font-family: FontAwesome; padding: 2px 4px; } @@ -398,32 +402,37 @@ table caption { margin: 0 4px; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 5. Modal Dialog -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.modal-dialog { +.modal-dialog{ max-height: 90%; position: relative; overflow: auto; -webkit-box-orient: vertical; -webkit-box-direction: normal; + -webkit-flex-direction: column; flex-direction: column; + display: -webkit-flex; display: flex; } -.modal-content { +.modal-content{ position: relative; border-radius: 6px; + display: -webkit-box; + display: -webkit-flex; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; + -webkit-flex-direction: column; flex-direction: column; overflow: auto; } .modal.autosave { - background-color: rgb(0 0 0 / 50%); + background-color: rgba(0,0,0,0.5); } .modal-content.autosave { @@ -432,51 +441,58 @@ table caption { top: 100px; } -.modal-body { +.modal-body{ .transclude-modal .transclude-modal-input { width: 80%; margin: 0 auto; } } -.modal-description { - margin-bottom: 18px; +.modal-description{ + margin-bottom:18px; } -/* hack for overriding cut off content in dropdown modal */ -.ve-dropdown-short-modal { +/*hack for overriding cut off content in dropdown modal*/ +.ve-dropdown-short-modal{ .modal-dialog, .modal-content, - .modal-body { + .modal-body{ overflow: visible; } } -.modal-header { +.modal-header{ box-sizing: border-box; position: relative; z-index: 2; min-height: 52px; } -.modal-body { +.modal-body{ position: relative; -webkit-box-ordinal-group: 2; + -webkit-order: 1; order: 1; -webkit-box-orient: vertical; -webkit-box-direction: normal; + -webkit-flex-direction: column; flex-direction: column; overflow: auto; } -.modal-footer { +.modal-footer{ + display: -webkit-box; + display: -webkit-flex; display: flex; -webkit-box-ordinal-group: 3; + -webkit-order: 2; order: 2; box-sizing: border-box; -webkit-box-align: center; + -webkit-align-items: center; align-items: center; -webkit-box-pack: end; + -webkit-justify-content: flex-end; justify-content: flex-end; margin-bottom: 0; padding-right: 8px; @@ -485,105 +501,104 @@ table caption { overflow: hidden; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 4. New Ref -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ + +.ve-new-ref{ -.ve-new-ref { - .commit-table { - width: calc(100% - 24px); + .commit-table{ - td { - padding: 4px; - border: none; + width:calc(100% - 24px); + td{ + padding:4px; + border:none; } - tr { - border: 1px solid #eaeaea; + tr{ + border:1px solid #eaeaea; } - tr:hover { - background-color: #fbfbfb; - font-weight: 400; + tr:hover{ + background-color:#fbfbfb; + font-weight:400; } - tr:first-child { - border: none; - font-weight: 600; + tr:first-child{ + border:none; + font-weight:600; } } - .timestamp-format { + .timestamp-format{ margin-bottom: 10px; } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 5. 404 Bookmark -------------------------------------------------------------------- */ -.account-wall-lg { - max-width: 820px; - margin: 100px auto; - padding: 0 40px; +-------------------------------------------------------------------*/ +.account-wall-lg{ + max-width:820px; + margin:100px auto; + padding:0 40px; - h1 { + h1{ margin: 30px 0; padding-bottom: 20px; font-weight: 200; font-size: 44px; } - h4 { + h4{ font-weight: 300; font-size: 20px; - margin: 20px 0; + margin:20px 0; } - .flex { + .flex{ display: flex; } - .two-thirds-flex { - flex: 3; - padding: 0 28px 0 0; + .two-thirds-flex{ + flex:3; + padding:0 28px 0 0; } - - .one-third-flex { - flex: 2; - padding: 10px 0 0; + .one-third-flex{ + flex:2; + padding:10px 0 0; } } - -@media (max-width: 600px) { - .account-wall-lg .flex { - flex-direction: column; +@media (max-width: 600px){ + .account-wall-lg .flex{ + flex-direction:column; } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 6. Open document button styling -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.btn.open-document { - margin-left: 10px; +.btn.open-document{ + margin-left:10px; a:visited, a:hover, - a { - color: white; - text-decoration: none; + a{ + color:white; + text-decoration:none; } } -.btn.open-document::before { - content: "\f064"; - font-family: globals.$font-family-icon; - padding-right: 6px; +.btn.open-document::before{ + content:"\f064"; + font-family: FontAwesome; + padding-right:6px; } -.docTitle-underlined { +.docTitle-underlined{ text-decoration: underline; - text-decoration-color: rgb(72 133 189); + text-decoration-color: rgb(72, 133, 189); } // Customize exertnal link for view open-document link @@ -592,139 +607,95 @@ h1 .open-document a.external-link { font-size: 0.5em; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 7. Right pane -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -.pane-right .container-fluid { - padding: 0 18px 34px; +.pane-right .container-fluid{ + padding:0 18px 34px; } -hr.right-title-divider { - margin-left: -18px; - margin-right: -18px; - border-color: #ddd; +hr.spec-title-divider{ + margin-left:-18px; + margin-right:-18px; + border-color:#ddd; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 7.1 Modal for revert history -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ -/* Special styling to preview element */ -.element-preview-box { +/* Special styling to preview element*/ +.element-preview-box{ padding: 10px 20px; margin-bottom: 20px; - background-color: globals.$ve-silver-lighter-1; + background-color: $ve-silver-lighter-1; border-radius: 3px; - border: 1px solid globals.$ve-silver-darker-1; + border: 1px solid $ve-silver-darker-1; } -/* Custom styling to keep labels inline with dropdowns */ -span.inline-btn-label { +/*Custom styling to keep labels inline with dropdowns*/ +span.inline-btn-label{ min-height: 28px; margin: 6px 0; padding: 7px 4px; line-height: 13px; - color: globals.$ve-light-text; + color:$ve-light-text; } -.fa-exclamation-triangle { - color: globals.$ve-yellow-base; +.fa-exclamation-triangle{ + color: $ve-yellow-base; } -/* ------------------------------------------------------------------ + +/*------------------------------------------------------------------ 8. Growl notification -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .growl-container > .growl-item.ng-enter, .growl-container > .growl-item.ng-leave { - @include globals.transition(all 0.1s linear); - + @include transition(all 0.1s linear); // -webkit-transition:0.1s linear all; // -moz-transition:0.1s linear all; // -o-transition:0.1s linear all; // transition:0.1s linear all; } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 9. Well customization -------------------------------------------------------------------- */ -.well { +-------------------------------------------------------------------*/ +.well{ clear: both; - border: 1px solid globals.$ve-silver-darker-1; + border: 1px solid $ve-silver-darker-1; border-radius: 3px; - background-color: globals.$ve-silver-lighter-1; + background-color: $ve-silver-lighter-1; padding: 12px; margin: 18px 0; - &.empty-state { + &.empty-state{ padding-top: 20px; padding-bottom: 30px; } } -/* ------------------------------------------------------------------ -10. Custom grids -------------------------------------------------------------------- */ + +/*------------------------------------------------------------------ +10. Custom grids +-------------------------------------------------------------------*/ //Grid with narrower gutter so input can be wider -.row.narrow-gutter-row { +.row.narrow-gutter-row{ margin-left: -3px; margin-right: -3px; - .col-lg-1, - .col-lg-10, - .col-lg-11, - .col-lg-12, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-md-1, - .col-md-10, - .col-md-11, - .col-md-12, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-sm-1, - .col-sm-10, - .col-sm-11, - .col-sm-12, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-xs-1, - .col-xs-10, - .col-xs-11, - .col-xs-12, - .col-xs-2, - .col-xs-3, - .col-xs-4, - .col-xs-5, - .col-xs-6, - .col-xs-7, - .col-xs-8, - .col-xs-9 { + .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { padding-right: 3px; padding-left: 3px; } - - .ve-plain-input { + .ve-plain-input{ margin: 0; width: 100%; } } + + + diff --git a/app/bower.json b/app/bower.json new file mode 100755 index 000000000..2c1a64908 --- /dev/null +++ b/app/bower.json @@ -0,0 +1,58 @@ +{ + "name": "ve", + "version": "3.5.4", + "authors": [ + "Shakeh E Brys " + ], + "description": "View Editor bower dependencies", + "main": "bower.json", + "moduleType": [ + "globals" + ], + "keywords": [ + "mms" + ], + "license": "MIT", + "homepage": "http://www.openmbee.org/", + "private": true, + "ignore": [ + "**/.*", + "node_modules", + "bower_components", + "test", + "tests" + ], + "dependencies": { + "jquery": "~3.4.1", + "angular": "~1.7.8", + "angular-rx": "~1.1.3", + "angular-cookies": "~1.7.8", + "angular-animate": "~1.7.8", + "angular-borderlayout": "https://github.com/dlamoris/angular-borderlayout.git#master", + "angular-ui-router": "~0.4.2", + "angular-ui-bootstrap-bower": "~1.3.3", + "angular-ui-tree": "~2.17.0", + "angular-ui-tree-filter": "~0.1.1", + "angular-growl-v2": "~0.7.4", + "angular-hotkeys": "https://github.com/chieffancypants/angular-hotkeys.git#1.7.0", + "font-awesome-bower": "~4.6.3", + "lodash": "^4.17.12", + "d3": "~5.1.0", + "c3": "~0.5.4", + "angulartics": "~1.1.0", + "angulartics-piwik": "~1.0.4", + "ngstorage": "~0.3.11", + "angular-promise-extras": "^0.1.8", + "HtmlRenderedDiff": "https://github.com/chhaymenghong/HtmlRenderedDiff.git#release", + "moment": "^2.22.0" + }, + "resolutions": { + "lodash": "3.9.3", + "d3": "~5.1.0", + "angular": "~1.7.8" + }, + "devDependencies": { + "angular-mocks": "~1.7.8" + } +} diff --git a/app/config/.gitignore b/app/config/.gitignore new file mode 100755 index 000000000..838944016 --- /dev/null +++ b/app/config/.gitignore @@ -0,0 +1,2 @@ +# config.*.js +# !config.example.js \ No newline at end of file diff --git a/app/config/config.example.js b/app/config/config.example.js new file mode 100755 index 000000000..efb027c0a --- /dev/null +++ b/app/config/config.example.js @@ -0,0 +1,48 @@ +(function () { + //Examples of commonly used banner statements + var label = { + pi: 'PROPRIETARY: Proprietary Information', + export_ctrl: 'EXPORT WARNING: No export controlled documents allowed on this server', + no_public_release: 'Not for Public Release or Redistribution', + unclassified: 'CLASSIFICATION: This system is UNCLASSIFIED' + }; + + //Do not modify, this is necessary to initialize the config + window.__env = window.__env || {}; + + //grab on load token + //parse datae + // call endpoints + //fill database + //pass token for all requests + + //Do not modify the structure of this + //ip address of the backend + window.__env = { + // View Editor Version + version: '4.0.2', + // API url + apiUrl: 'http://localhost:8080', + // Base url + baseUrl: '', + printUrl: 'http://localhost:8080/convert', + enableDebug: true, + // Configuration for the banner below the login modal (only visible at login) + loginBanner: { + labels: [ + label.unclassified, + label.pi + ' - ' + label.no_public_release + ], + background: '#0D47A1', + color: '#e8e8e8' + }, + // Configure the banner that is placed above all content (always visible) + banner: { + message: label.pi + }, + footer: { + message: "OpenMBEE View Editor | Licensed under Apache 2.0" + } + } + +}()); \ No newline at end of file diff --git a/app/config/config.local.js b/app/config/config.local.js new file mode 100755 index 000000000..078881c86 --- /dev/null +++ b/app/config/config.local.js @@ -0,0 +1,57 @@ +(function () { + //Examples of commonly used banner statements + var label = { + pi: 'PROPRIETARY: Proprietary Information', + export_ctrl: 'EXPORT WARNING: No export controlled documents allowed on this server', + no_public_release: 'Not for Public Release or Redistribution', + unclassified: 'CLASSIFICATION: This system is UNCLASSIFIED' + }; + + //Do not modify, this is necessary to initialize the config + window.__env = window.__env || {}; + + //grab on load token + //parse datae + // call endpoints + //fill database + //pass token for all requests + + //Do not modify the structure of this + //ip address of the backend + window.__env = { + // View Editor Version + version: '4.0.2', + // API url + // apiUrl: 'http://openmbee-mms.openmbee.svc.cluster.local:5000', + // apiUrl: 'https://openmbee-mms.apps.arena-workspace.navair.navy.mil', + apiUrl: 'https://localhost:8080', + //KONG API GATEWAY URL, you will need to follow NAVAIR CI/CD Arena Documentation to understand, refer to OpenMBEE_Debrief for documentation link + // apiUrl: 'https://kong-proxy-api.apps.arena-workspace.navair.navy.mil/openmbee-mms/mmsapi/', + //DNS ENTRY for backend + // apiUrl: 'https://mbee-mms.navair.navy.mil', + // Base url + baseUrl: '', + // printUrl: 'https://openmbee-mms.apps.arena-workspace.navair.navy.mil/convert', + // printUr: 'http://openmbee-mms.openmbee.svc.cluster.local:5000', + printUrl: 'https://localhost:8080/convert', + // printUrl: 'https://mbee-mms.navair.navy.mil/convert', + enableDebug: true, + // Configuration for the banner below the login modal (only visible at login) + loginBanner: { + labels: [ + label.unclassified, + label.pi + ' - ' + label.no_public_release + ], + background: '#0D47A1', + color: '#e8e8e8' + }, + // Configure the banner that is placed above all content (always visible) + banner: { + message: label.pi + }, + footer: { + message: "OpenMBEE View Editor | Licensed under Apache 2.0" + } + } + +}()); \ No newline at end of file diff --git a/app/config/config.production.js b/app/config/config.production.js new file mode 100755 index 000000000..011aea25c --- /dev/null +++ b/app/config/config.production.js @@ -0,0 +1,53 @@ +(function () { + //Examples of commonly used banner statements + var label = { + pi: 'PROPRIETARY: Proprietary Information', + export_ctrl: 'EXPORT WARNING: No export controlled documents allowed on this server', + no_public_release: 'Not for Public Release or Redistribution', + unclassified: 'CLASSIFICATION: This system is UNCLASSIFIED' + }; + + //Do not modify, this is necessary to initialize the config + window.__env = window.__env || {}; + + //grab on load token + //parse datae + // call endpoints + //fill database + //pass token for all requests + + //Do not modify the structure of this + //ip address of the backend + window.__env = { + // View Editor Version + version: '4.0.2', + // API url + // Using the DNS entry for the backend + // apiUrl: 'https://mbee-mms.navair.navy.mil', + //KONG API GATEWAY URL, you will need to follow NAVAIR CI/CD Arena Documentation to understand, refer to OpenMBEE_Debrief for documentation link + apiUrl: 'https://kong-proxy-api.apps.arena-workspace.navair.navy.mil/openmbee-mms/mmsapi/', + // Base url + baseUrl: '', + // Using the DNS entry for the backend + // printUrl: 'https://mbee-mms.navair.navy.mil/convert', + printUrl: 'https://kong-proxy-api.apps.arena-workspace.navair.navy.mil/openmbee-mms/mmsapi/convert', + enableDebug: true, + // Configuration for the banner below the login modal (only visible at login) + loginBanner: { + labels: [ + label.unclassified, + label.pi + ' - ' + label.no_public_release + ], + background: '#0D47A1', + color: '#e8e8e8' + }, + // Configure the banner that is placed above all content (always visible) + banner: { + message: label.pi + }, + footer: { + message: "OpenMBEE View Editor | Licensed under Apache 2.0" + } + } + +}()); \ No newline at end of file diff --git a/app/index.html b/app/index.html new file mode 100755 index 000000000..4ce9c5322 --- /dev/null +++ b/app/index.html @@ -0,0 +1,12 @@ + + + + + + MMSRI Module App + + + + Model Management System App + + diff --git a/app/js/mms/app.js b/app/js/mms/app.js new file mode 100755 index 000000000..4ff355c50 --- /dev/null +++ b/app/js/mms/app.js @@ -0,0 +1,852 @@ +'use strict'; + +angular.module('mmsApp', ['mms', 'mms.directives', 'app.tpls', 'fa.directive.borderLayout', 'ui.bootstrap', 'ui.router', 'ui.tree', 'angular-growl', 'cfp.hotkeys', 'angulartics', 'angulartics.piwik', 'ngStorage', 'ngAnimate', 'ngPromiseExtras', 'ngCookies']) +.config(['$stateProvider', '$urlRouterProvider', '$httpProvider', '$provide', 'URLServiceProvider', '$locationProvider', function($stateProvider, $urlRouterProvider, $httpProvider, $provide, URLServiceProvider, $locationProvider) { + // override uibTypeaheadPopup functionality + $provide.decorator('uibTypeaheadPopupDirective', ['$delegate', function($delegate) { + var originalLinkFn = $delegate[0].link; + $delegate[0].compile = function(tElem, tAttr) { + return function newLinkFn(scope, elem, attr) { + // fire the originalLinkFn + originalLinkFn.apply($delegate[0], arguments); + scope.selectActive = function(matchIdx) { + // added behavior + elem.children().removeClass('active'); + // default behavior + scope.active = matchIdx; + }; + }; + }; + // get rid of the old link function since we return a link function in compile + delete $delegate[0].link; + return $delegate; + }]); + + $locationProvider.hashPrefix(''); + + $urlRouterProvider.rule(function ($injector, $location) { + var $state = $injector.get('$state'); + var locationPath = $location.url(); + if (locationPath.indexOf('full%23') > 0) + locationPath = locationPath.replace('full%23', 'full#'); + if (locationPath[0] !== '/') + locationPath = '/' + locationPath; + if (locationPath[locationPath.length-1] == '/') + locationPath = locationPath.substring(0, locationPath.length-1); + + // if loading 'full' route with an anchor id, switch to views route instead + if ( $state.current.name === '' || $state.current.name === 'login.redirect' ) { + var string = '/full#'; + var hash = $location.hash(); + var index = locationPath.indexOf(string); + if ( index !== -1 && hash && !hash.endsWith('_pei')) { + locationPath = locationPath.substr(0, index) + '/views/' + hash; + } + } + if (locationPath !== $location.url()) + $location.url(locationPath); + }); + + console.log(window.__env); + + if(window.__env.baseUrl) { + URLServiceProvider.setBaseUrl(window.__env.baseUrl); + } + else { + URLServiceProvider.setBaseUrl(''); + } + + if(window.__env.apiUrl) { + URLServiceProvider.setMmsUrl(window.__env.apiUrl); + console.log(window.__env.apiUrl); + } + else { + var mmsHost = window.location.protocol + '//' + window.location.host; + URLServiceProvider.setMmsUrl(mmsHost); + } + if (window.__env.printUrl) { + URLServiceProvider.setPrintUrl(window.__env.printUrl); + } + + + + $httpProvider.defaults.withCredentials = true; +// Check if user is logged in, if so redirect to select page otherwise go to login if the url isn't mapped + $urlRouterProvider.otherwise(function($injector, $location) { + var rootScopeSvc = $injector.get('RootScopeService'); + var $state = $injector.get('$state'); + var checkLogin = $injector.get('AuthService').checkLogin(); + if (checkLogin) { + if ($location.url().includes('workspace')) { + rootScopeSvc.veRedirectFromOld(true); + rootScopeSvc.veCrushUrl($location.path()); + $state.go('login.redirect'); + } else { + rootScopeSvc.veRedirectFromOld(false); + $state.go('login.select'); + } + } else { + $state.go('login'); + } + }); + + + $stateProvider + .state('login', { + url: '/login', + resolve: { + bannerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getBanner(); + }], + loginBannerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getLoginBanner(); + }] + }, + views: { + 'banner@': { + template: '', + controller: ['$scope', 'bannerOb', function($scope, bannerOb){ + $scope.banner = bannerOb; + }] + }, + 'login@': { + templateUrl: 'partials/mms/login.html', + controller: ['$scope', '$state', 'AuthService', 'loginBannerOb', 'RootScopeService', 'growl', function ($scope, $state, AuthService, loginBannerOb, RootScopeService, growl) { + const rootScopeSvc = RootScopeService; + $scope.credentials = { + username: '', + password: '' + }; + rootScopeSvc.veTitle('Login'); + $scope.pageTitle = 'View Editor'; + $scope.loginBanner = loginBannerOb; + $scope.spin = false; + $scope.login = function (credentials) { + $scope.spin = true; + var credentialsJSON = {"username":credentials.username, "password":credentials.password}; + AuthService.getAuthorized(credentialsJSON) + .then(function(user) { + if (rootScopeSvc.veRedirect()) { + let veRedirect = rootScopeSvc.veRedirect(); + var toState = veRedirect.toState.name; + var toParams = veRedirect.toParams; + $state.go(toState, toParams); + } else { + $state.go('login.select', {fromLogin: true}); + } + }, function (reason) { + $scope.spin = false; + growl.error(reason.message); + }); + }; + }] + } + } + }) + .state('login.redirect', { + url: '/redirect', + resolve: { + token: ['$window', 'URLService', 'AuthService', '$q', '$cookies', 'ApplicationService', function($window, URLService, AuthService, $q, $cookies, ApplicationService) { + var deferred = $q.defer(); + AuthService.checkLogin().then(function(data) { + ApplicationService.setUserName(data); + URLService.setToken($window.localStorage.getItem('token')); + deferred.resolve($window.localStorage.getItem('token')); + $cookies.put('com.tomsawyer.web.license.user', data, {path: '/'}); + }, function(rejection) { + deferred.reject(rejection); + }); + return deferred.promise; + }] + }, + views: { + 'login@': { + templateUrl: 'partials/mms/redirect.html', + controller: 'RedirectCtrl' + } + } + }) + .state('login.select', { + url: '/select?fromLogin', + resolve: { + token: ['$window', 'URLService', 'AuthService', '$q', 'ApplicationService', function($window, URLService, AuthService, $q, ApplicationService) { + var deferred = $q.defer(); + AuthService.checkLogin().then(function(data) { + ApplicationService.setUserName(data); + URLService.setToken($window.localStorage.getItem('token')); + deferred.resolve($window.localStorage.getItem('token')); + }, function(rejection) { + deferred.reject(rejection); + }); + return deferred.promise; + }], + bannerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getBanner(); + }], + loginBannerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getLoginBanner(); + }], + orgObs: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService, token) { + return ProjectService.getOrgs(); + }] + }, + views: { + 'banner@': { + template: '', + controller: ['$scope', 'bannerOb', function($scope, bannerOb){ + $scope.banner = bannerOb; + }] + }, + 'login@': { + templateUrl: 'partials/mms/select.html', + controller: ['$scope', '$state', '$stateParams', 'orgObs', 'ProjectService', 'AuthService', 'RootScopeService', 'EventService', 'loginBannerOb', 'growl', '$localStorage', function($scope, $state, $stateParams, orgObs, ProjectService, AuthService, RootScopeService, EventService, loginBannerOb, growl, $localStorage) { + const rootScopeSvc = RootScopeService; + const eventSvc = EventService; + eventSvc.$init($scope); + + rootScopeSvc.veTitle('View Editor'); //what to name this? + + $scope.redirect_from_old = rootScopeSvc.veRedirectFromOld(); + $scope.$on(rootScopeSvc.constants.VEREDIRECTFROMOLD, (data) => { + $scope.redirect_from_old = data; + }); + RootScopeService.veTitle('Projects'); + $scope.pageTitle = 'View Editor'; + $scope.fromLogin = $stateParams.fromLogin; + $localStorage.$default({org: orgObs[0]}); + $scope.loginBanner = loginBannerOb; + $scope.spin = false; + $scope.orgs = orgObs; + var orgId, projectId; + $scope.selectOrg = function(org) { + if (org) { + $localStorage.org = org; + orgId = org.id; + $localStorage.org.orgName = org.name; + $scope.selectedOrg = $localStorage.org.name; + $scope.selectedProject = ""; // default here? + ProjectService.getProjects(orgId).then(function(data){ + $scope.projects = data; + if (data.length > 0) { + if($localStorage.project && checkForProject(data, $localStorage.project) === 1){ + $scope.selectedProject = $localStorage.project.name; + projectId = $localStorage.project.id; + }else{ + $scope.selectProject(data[0]); + } + } + }); + } + }; + $scope.selectProject = function(project) { + if (project) { + $localStorage.project = project; + $scope.selectedProject = $localStorage.project.name; + projectId = $localStorage.project.id; + } + }; + if ($localStorage.org) { + $scope.selectOrg($localStorage.org); + } + var checkForProject = function(projectArray, project) { + for (var i = 0; i < projectArray.length; i++) { + if(projectArray[i].id === project.id){ + return 1; + } + } + return 0; + }; + + $scope.continue = function() { + if (orgId && projectId) { + $scope.spin = true; + RootScopeService.veRedirectFromOld(false); + $state.go('project.ref', {orgId: orgId, projectId: projectId, refId: 'master'}).then(function(data) { + }, function(reject) { + $scope.spin = false; + }); + } + }; + $scope.logout = function() { + AuthService.logout().then(function() { + $state.go('login'); + }, function() { + growl.error('You were not logged out'); + }); + }; + }] + } + } + }) + .state('project', { //TODO this will be the ui to diff and merge and manage refs + url: '/projects/:projectId', + resolve: { + token: ['$window', 'URLService', 'AuthService', '$q', 'ApplicationService', '$cookies', function($window, URLService, AuthService, $q, ApplicationService, $cookies) { + var deferred = $q.defer(); + AuthService.checkLogin().then(function(data) { + ApplicationService.setUserName(data); + URLService.setToken($window.localStorage.getItem('token')); + deferred.resolve($window.localStorage.getItem('token')); + $cookies.put('com.tomsawyer.web.license.user', data, {path: '/'}); + }, function(rejection) { + deferred.reject(rejection); + }); + return deferred.promise; + }], + //orgObs: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService, token) { + // return ProjectService.getOrgs(); + //}], + projectOb: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService) { + return ProjectService.getProject($stateParams.projectId); + }], + projectObs: ['$stateParams', 'ProjectService', 'token', 'projectOb', function($stateParams, ProjectService, token, projectOb) { + return ProjectService.getProjects(projectOb.orgId); + }], + orgOb: ['ProjectService', 'projectOb', 'token', function(ProjectService, projectOb) { + return ProjectService.getOrg(projectOb.orgId); + }], + refObs: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService) { + return ProjectService.getRefs($stateParams.projectId); + }], + tagObs: ['refObs', function(refObs) { + var ret = []; + for (var i = 0; i < refObs.length; i++) { + if (refObs[i].type === "Tag") + ret.push(refObs[i]); + } + return ret; + }], + branchObs: ['refObs', function(refObs) { + var ret = []; + for (var i = 0; i < refObs.length; i++) { + if (refObs[i].type === "Branch") + ret.push(refObs[i]); + } + return ret; + }], + bannerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getBanner(); + }], + refOb: function() { return null;}, + tagOb: function() { return null;}, + branchOb: function() { return null;}, + documentOb: function(){ return null;}, + viewOb: function(){ return null;}, + search: function(){ return null;} + }, + views: { + 'banner@': { + template: '', + controller: ['$scope', 'bannerOb', function($scope, bannerOb){ + $scope.banner = bannerOb; + }] + }, + 'nav@': { + template: '', + controller: ['$scope', 'orgOb', 'projectOb', 'projectObs', 'refOb', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'search', 'RootScopeService', function ($scope, orgOb, projectOb, projectObs, refOb, branchOb, branchObs, tagOb, tagObs, search, RootScopeService) { + RootScopeService.veTitle(orgOb.name); + $scope.org = orgOb; + //$scope.orgs = orgObs; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + $scope.search = search; + }] + }, + 'menu@': { + template: '', + controller:['$scope', 'orgOb', 'projectOb', 'projectObs', 'refOb', 'refObs', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'RootScopeService', function ($scope, orgOb, projectOb, projectObs, refOb, refObs, branchOb, branchObs, tagOb, tagObs, RootScopeService) { + RootScopeService.veTitle(projectOb.name); + $scope.org = orgOb; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.refs = refObs; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + }] + }, + 'manageRefs@': { + templateUrl: 'partials/mms/manage-refs.html', + controller: 'RefsCtrl' + } + } + }) + .state('project.ref', { // equivalent to old sites and documents page + url: '/:refId?search', + resolve: { + projectOb: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService, token) { + return ProjectService.getProjectMounts($stateParams.projectId, $stateParams.refId); + }], + refOb: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService, token) { + return ProjectService.getRef($stateParams.refId, $stateParams.projectId); + }], + tagOb: ['refOb', function(refOb) { + if(refOb.type === "Tag") + return refOb; + else { + return []; + } + }], + branchOb: ['refOb', function(refOb) { + if(refOb.type === "Branch") + return refOb; + else { + return []; + } + }], + groupObs: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService, token) { + return ProjectService.getGroups($stateParams.projectId, $stateParams.refId); + }], + groupOb: function(){ return null;}, + documentOb: ['$stateParams', '$q', 'ElementService', 'ViewService', 'refOb', 'projectOb', 'token', function($stateParams, $q, ElementService, ViewService, refOb, projectOb, token) { + var deferred = $q.defer(); + var eid = $stateParams.projectId + '_cover'; + ElementService.getElement({ + projectId: $stateParams.projectId, + refId: $stateParams.refId, + extended: true, + elementId: eid + }, 2).then(function(data) { + deferred.resolve(data); + }, function(reason) { + if (reason.status === 404) { + if (refOb.type === 'Tag') { + deferred.resolve(null); + } else { + ViewService.createView({ + _projectId: $stateParams.projectId, + _refId: $stateParams.refId, + id: 'holding_bin_' + $stateParams.projectId + },{ + viewName: projectOb.name + ' Cover Page', + viewId: eid + }).then(function(data) { + deferred.resolve(data); + }, function(reason2) { + deferred.resolve(null); + }); + } + } else if (reason.status === 410) { //resurrect + var name = projectOb.name + ' Cover Page '; + try { + name = reason.data.deleted[0].name + ' '; + } catch(e) {} + ElementService.updateElements([ + { + _projectId: $stateParams.projectId, + _refId: $stateParams.refId, + id: eid, + name: name + }, + { + _projectId: $stateParams.projectId, + _refId: $stateParams.refId, + id: eid + "_asi", + name: ' ' + } + ]).then(function(data) { + var resolved = false; + if (data.length > 0) { + data.forEach(function(e) { + if (e.id == eid) { + deferred.resolve(e); + resolved = true; + } + }); + } + if (!resolved) { + deferred.resolve(null); + } + }, function(reason2) { + deferred.resolve(null); + }); + } else { + deferred.resolve(null); //let user get into project + } + }); + return deferred.promise; + }], + viewOb: ['documentOb', function(documentOb) { + return documentOb; + }], + search: ['$stateParams', 'ElementService', 'token', function($stateParams, ElementService, token) { + if ($stateParams.search === undefined) { + return null; + } + return $stateParams.search; + }], + bannerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getBanner(); + }], + footerOb: ['BrandingService', function(BrandingService) { + return BrandingService.getFooter(); + }], + docMeta: [function(){ + return {}; + }], + permissions: ['projectOb', 'refOb', 'PermissionsService', function(projectOb, refOb, PermissionsService){ + return PermissionsService.initializePermissions(projectOb, refOb); + }] + }, + views: { + 'banner@': { + template: '', + controller: ['$scope', 'bannerOb', function($scope, bannerOb){ + $scope.banner = bannerOb; + }] + }, + 'nav@': { + template: '', + controller: ['$scope', 'orgOb', 'projectOb', 'projectObs', 'refOb', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'search', 'RootScopeService', function ($scope, orgOb, projectOb, projectObs, refOb, branchOb, branchObs, tagOb, tagObs, search, RootScopeService) { + RootScopeService.veTitle(orgOb.name); + $scope.org = orgOb; + //$scope.orgs = orgObs; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + $scope.search = search; + }] + }, + 'menu@': { + template: '', + controller: ['$scope', 'orgOb', 'groupObs', 'projectOb', 'projectObs', 'refOb', 'refObs', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'RootScopeService', function ($scope, orgOb, groupObs, projectOb, projectObs, refOb, refObs, branchOb, branchObs, tagOb, tagObs, RootScopeService) { + RootScopeService.veTitle(projectOb.name); + $scope.org = orgOb; + $scope.groups = groupObs; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.refs = refObs; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + }] + }, + 'pane-left@': { + templateUrl: 'partials/mms/pane-left.html', + controller: 'TreeCtrl', + controllerAs: 'treeCtrl' + }, + 'pane-center@': { + templateUrl: 'partials/mms/pane-center.html', + controller: 'ViewCtrl' + }, + 'pane-right@': { + templateUrl: 'partials/mms/pane-right.html', + controller: 'ToolCtrl' + }, + 'toolbar-right@': { + template: '', + controller: 'ToolbarCtrl' + }, + 'footer@': { + template: '', + controller: ['$scope', 'footerOb', function ($scope, footerOb) { + $scope.footer = footerOb; + }] + } + } + }) + .state('project.ref.groupReorder', { + url: '/group-reorder', + resolve: { + documentObs: ['ViewService', '$stateParams', 'token', function(ViewService, $stateParams, token) { + return ViewService.getProjectDocuments({ + projectId: $stateParams.projectId, + refId: $stateParams.refId + }); + }] + }, + views: { + 'pane-center@': { + templateUrl: 'partials/mms/reorder-groups.html', + controller: 'ReorderGroupCtrl' + } + } + }) + .state('project.ref.manage', { //not needed right now, for managing mounts + url: '/manage' + }) + .state('project.ref.preview', { + url: '/document/:documentId', + resolve: { + projectOb: ['$stateParams', 'ProjectService', 'token', function($stateParams, ProjectService, token) { + return ProjectService.getProjectMounts($stateParams.projectId, $stateParams.refId); + }], + documentOb: ['$stateParams', '$q', 'ElementService', 'ViewService', 'refOb', 'token', function($stateParams, $q, ElementService, ViewService, refOb, token) { + var deferred = $q.defer(); + var eid = $stateParams.documentId; + var coverIndex = eid.indexOf('_cover'); + if (coverIndex > 0) { + var groupId = eid.substring(5, coverIndex); + ElementService.getElement({ + projectId: $stateParams.projectId, + refId: $stateParams.refId, + extended: true, + elementId: eid + }, 2).then(function(data) { + deferred.resolve(data); + }, function(reason) { + if (reason.status === 404) { + if (refOb.type === 'Tag') { + deferred.resolve(null); + } else { + var viewDoc = '[cf:group docs]'; + ElementService.getElement({projectId: $stateParams.projectId, refId: $stateParams.refId, elementId: groupId}) + .then(function(groupElement) { + ViewService.createView({ + _projectId: $stateParams.projectId, + _refId: $stateParams.refId, + id: groupId + },{ + viewName: groupElement.name + ' Cover Page', + viewId: eid + }, viewDoc) + .then(function(data) { + deferred.resolve(data); + }, function(reason3) { + deferred.resolve(null); + }); + }, function(reason2) { + deferred.resolve(null); + }); + } + } else { + deferred.reject(reason); + } + }); + } else { + ViewService.getProjectDocument({ + projectId: $stateParams.projectId, + refId: $stateParams.refId, + extended: false, + documentId: $stateParams.documentId + }, 2).then(function(data){ + deferred.resolve(data); + }, function(reason) { + deferred.reject(reason); + }); + } + return deferred.promise; + }], + viewOb: ['documentOb', function(documentOb) { + return documentOb; + }], + groupOb: ['groupObs', 'documentOb', 'ProjectService', 'token', function(groupObs, documentOb, ProjectService, token) { + var group = null; + if (documentOb) { + for (var i = 0; i < groupObs.length; i++) { + if (groupObs[i].id == documentOb._groupId) { + group = groupObs[i]; + break; + } + } + } + return group; + }] + }, + views: { + 'menu@': { + template: '', + controller: ['$scope', 'orgOb', 'groupOb', 'groupObs', 'projectOb', 'projectObs', 'refOb', 'refObs', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'documentOb', 'RootScopeService', function ($scope, orgOb, groupOb, groupObs, projectOb, projectObs, refOb, refObs, branchOb, branchObs, tagOb, tagObs, documentOb, RootScopeService) { + RootScopeService.veTitle(documentOb.name); + $scope.org = orgOb; + $scope.ref = refOb; + $scope.group = groupOb; + $scope.groups = groupObs; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.refs = refObs; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + }] + }, + 'pane-center@': { + templateUrl: 'partials/mms/pane-center.html', + controller: 'ViewCtrl' + }, + 'pane-right@': { + templateUrl: 'partials/mms/pane-right.html', + controller: 'ToolCtrl' + } + } + }) + .state('project.ref.document', { + url: '/documents/:documentId', + resolve: { + documentOb: ['$stateParams', 'ViewService', 'token', function($stateParams, ViewService) { + return ViewService.getProjectDocument({ + projectId: $stateParams.projectId, + refId: $stateParams.refId, + extended: false, + documentId: $stateParams.documentId + }, 2); + }], + viewOb: ['documentOb', function(documentOb) { + return documentOb; + }], + groupOb: ['groupObs', 'documentOb', function(groupObs, documentOb) { + var group = null; + if (documentOb) { + for (var i = 0; i < groupObs.length; i++) { + if (groupObs[i].id == documentOb._groupId) { + group = groupObs[i]; + break; + } + } + } + return group; + }], + docMeta: ['ViewService', 'documentOb', function(ViewService, documentOb) { + return ViewService.getDocMetadata({ + projectId: documentOb._projectId, + refId: documentOb._refId, + elementId: documentOb.id + }); + }] + }, + views: { + 'menu@': { + template: '', + controller: ['$scope', 'orgOb', 'groupOb', 'groupObs', 'projectOb', 'projectObs', 'refOb', 'refObs', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'documentOb', 'RootScopeService', function ($scope, orgOb, groupOb, groupObs, projectOb, projectObs, refOb, refObs, branchOb, branchObs, tagOb, tagObs, documentOb, RootScopeService) { + RootScopeService.veTitle(documentOb.name); + $scope.org = orgOb; + $scope.group = groupOb; + $scope.groups = groupObs; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.refs = refObs; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + $scope.document = documentOb; + }] + }, + 'pane-left@': { + templateUrl: 'partials/mms/pane-left.html', + controller: 'TreeCtrl' + }, + 'pane-center@': { + templateUrl: 'partials/mms/pane-center.html', + controller: 'ViewCtrl' + }, + 'pane-right@': { + templateUrl: 'partials/mms/pane-right.html', + controller: 'ToolCtrl' + }, + 'toolbar-right@': { + template: '', + controller: 'ToolbarCtrl' + } + } + }) + .state('project.ref.document.view', { + url: '/views/:viewId', + resolve: { + viewOb: ['$stateParams', 'ElementService', 'token', function($stateParams, ElementService, token) { + return ElementService.getElement({ + projectId: $stateParams.projectId, + refId: $stateParams.refId, + elementId: $stateParams.viewId + }, 2); + }], + groupOb: ['groupObs', 'documentOb', function(groupObs, documentOb) { + var group = null; + if (documentOb) { + for (var i = 0; i < groupObs.length; i++) { + if (groupObs[i].id == documentOb._groupId) { + group = groupObs[i]; + break; + } + } + } + return group; + }] + }, + views: { + 'menu@': { + template: '', + controller: ['$scope', 'orgOb', 'groupOb', 'groupObs', 'projectOb', 'projectObs', 'refOb', 'refObs', 'branchOb', 'branchObs', 'tagOb', 'tagObs', 'documentOb', 'viewOb', 'RootScopeService', function ($scope, orgOb, groupOb, groupObs, projectOb, projectObs, refOb, refObs, branchOb, branchObs, tagOb, tagObs, documentOb, viewOb, RootScopeService) { + RootScopeService.veTitle(documentOb.name); + $scope.org = orgOb; + $scope.group = groupOb; + $scope.groups = groupObs; + $scope.project = projectOb; + $scope.projects = projectObs; + $scope.ref = refOb; + $scope.refs = refObs; + $scope.branch = branchOb; + $scope.branches = branchObs; + $scope.tag = tagOb; + $scope.tags = tagObs; + $scope.document = documentOb; + $scope.view = viewOb; + }] + }, + 'pane-center@': { + templateUrl: 'partials/mms/pane-center.html', + controller: 'ViewCtrl' + } + } + }) + .state('project.ref.document.order', { + url: '/order', + views: { + 'pane-center@': { + templateUrl: 'partials/mms/reorder-views.html', + controller: 'ReorderCtrl' + } + } + }) + .state('project.ref.document.full', { + url: '/full', + views: { + 'pane-center@': { + templateUrl: 'partials/mms/full-doc.html', + controller: 'FullDocCtrl' + } + } + }); + + // anonymous factory intercepts requests + $httpProvider.interceptors.push(['$q', '$location', '$injector', 'URLService', 'EventService', function($q, $location, $injector, URLService, EventService) { + return { + request: function(config) { + config.headers = URLService.getAuthorizationHeader(config.headers); + return config; + }, + 'responseError': function(rejection) { + if(rejection.status === 401){ //rejection.config.url + EventService.$broadcast("mms.unauthorized", rejection); + } + return $q.reject(rejection); + }, + response: function(response) { + if (response.status === 202) { + EventService.$broadcast("mms.working", response); + } + response.status = 501; + return response; + } + }; + }]); + + $httpProvider.useApplyAsync(true); +}]); diff --git a/app/js/mms/controllers/controller.utils.js b/app/js/mms/controllers/controller.utils.js new file mode 100755 index 000000000..855fd9613 --- /dev/null +++ b/app/js/mms/controllers/controller.utils.js @@ -0,0 +1,493 @@ +'use strict'; + +angular.module('mmsApp') +.factory('MmsAppUtils', ['$q', '$uibModal','$timeout', '$location', '$window', 'growl', + '$filter', '$state', 'ElementService','ViewService', 'UtilsService', 'EventService', 'TreeService', 'EditService', '_', MmsAppUtils]); + +/** + * @ngdoc service + * @name mmsApp.MmsAppUtils + * + * @description + * Utilities + */ +function MmsAppUtils($q, $uibModal, $timeout, $location, $window, growl, + $filter, $state, ElementService, ViewService, UtilsService, EventService, TreeService, EditService, _) { + + let eventSvc = EventService; + let tree = TreeService; + let edit = EditService; + + var tableToCsv = function(isDoc) { //Export to CSV button Pop-up Generated Here + var modalInstance = $uibModal.open({ + templateUrl: 'partials/mms/tableExport.html', + controller: ["$scope", "$uibModalInstance", "type", function($scope, $uibModalInstance, type) { + $scope.type = type; + $scope.export = function() { + $uibModalInstance.close('export'); + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }], + resolve: { + type: function() { return isDoc ? 'DOCUMENT' : 'VIEW';} + }, + backdrop: 'static', + keyboard: false + }); + + var string = '' + + ''; + + modalInstance.result.then(function(choice) { + if (choice === 'export') { + var tableCSV = []; + // Grab all tables and run export to csv fnc + angular.element('#print-div').find("table").each(function(elt){ + var tableObj = {}; + if (this.caption) { + tableObj.caption = this.caption.innerHTML; + } else { + tableObj.caption = 'no caption'; + } + tableObj.val = angular.element(this).table2CSV({delivery:'value'}); + tableCSV.push(tableObj); + }); + var exportPopup = function(data) { + var generator = window.open('', 'csv', 'height=600,width=800,scrollbars=1'); + generator.document.write('Tables to CSV'); + generator.document.write(''); + generator.document.write(data); + generator.document.write(''); + generator.document.close(); + return true; + }; + // generate text area content for popup + var genTextArea =''; + var num = 0; + angular.element(tableCSV).each(function(){ + genTextArea += '

'+ this.caption +'

'; + num++; + }); + genTextArea += string; + exportPopup(genTextArea); + } + }); + }; + + /** + * @ngdoc method + * @name mmsApp.MmsAppUtils#printModal + * @methodOf mmsApp.MmsAppUtils + * + * @description + * Click handler for print and export buttons. Opens modal or print + * confirmation and options to select from + * + * @param {Object} viewOrDocOb current document or view object + * @param {Object} refOb current branch/tag object + * @param {Boolean} isDoc viewOrDocOb is view or doc + * @param {Number} mode 1 = print, 2 = word, 3 = pdf + * @returns {Promise} The promise returned from UtilsService.exportHtmlAs - server response + * + */ + var printModal = function(viewOrDocOb, refOb, isDoc, mode) { + var deferred = $q.defer(); + var modalInstance = $uibModal.open({ + templateUrl: 'partials/mms/printConfirm.html', + controller: ["$scope", "$uibModalInstance", function($scope, $uibModalInstance) { + $scope.type = isDoc ? 'DOCUMENT' : 'VIEW'; + $scope.action = mode === 1 ? 'print' : mode === 3 ? 'Generate PDF' : 'Generate word'; + $scope.label = mode === 3 ? 'PDF' : mode === 2 ? 'Word' : ''; + $scope.mode = mode; + $scope.meta = {}; + $scope.customizeDoc = {}; + $scope.customizeDoc.useCustomStyle = false; + var print = angular.element("#print-div"); + if (print.find('.mms-error').length > 0) { + $scope.hasError = true; + } + + if (isDoc) { + // If _printCss, use to set doc css for export/print + $scope.customizeDoc.useCustomStyle = false; + if (viewOrDocOb._printCss) { + // If _printCss, show tab for custom css + $scope.customizeDoc.useCustomStyle = true; + $scope.customizeDoc.customCSS = viewOrDocOb._printCss; + } else { + $scope.customizeDoc.customCSS = UtilsService.getPrintCss(false, false, {}); + } + + // Get/Set document header/footer for PDF generation + $scope.meta = { + 'top-left': 'loading...', top: 'loading...', 'top-right': 'loading...', + 'bottom-left': 'loading...', bottom: 'loading...', 'bottom-right': 'loading...' + }; + ViewService.getDocMetadata({ + elementId: viewOrDocOb.id, + projectId: viewOrDocOb._projectId, + refId: viewOrDocOb._refId + }, 2).then(function(metadata) { + $scope.meta.top = metadata.top ? metadata.top : ''; + $scope.meta.bottom = metadata.bottom ? metadata.bottom : ''; + $scope.meta['top-left'] = metadata.topl ? metadata.topl : ''; + $scope.meta['top-right'] = metadata.topr ? metadata.topr : ''; + if (refOb && refOb.type === 'Tag') { + $scope.meta['top-right'] = $scope.meta['top-right'] + ' ' + refOb.name; + } + var displayTime = refOb.type === 'Tag' ? refOb._timestamp : 'latest'; + if (displayTime === 'latest') { + displayTime = new Date(); + displayTime = $filter('date')(displayTime, 'M/d/yy h:mm a'); + } + $scope.meta['top-right'] = $scope.meta['top-right'] + ' ' + displayTime; + $scope.meta['bottom-left'] = metadata.bottoml ? metadata.bottoml : ''; + $scope.meta['bottom-right'] = metadata.bottomr ? metadata.bottomr : 'counter(page)'; + }, function(reason) { + $scope.meta['top-left'] = $scope.meta.top = $scope.meta['top-right'] = $scope.meta['bottom-left'] = $scope.meta.bottom = ''; + $scope.meta['bottom-right'] = 'counter(page)'; + }); + } + $scope.unsaved = (edit.getAll() && !_.isEmpty(edit.getAll())); + $scope.docOption = (!isDoc && (mode === 3 || mode === 2)); + $scope.model = { genTotf: false, landscape: false, htmlTotf: false }; + + $scope.saveStyleUpdate = function() { + // To only update _printCss, create new ob with doc info + $scope.elementSaving = true; + var docOb = {id: viewOrDocOb.id, _projectId: viewOrDocOb._projectId, _refId: viewOrDocOb._refId}; + docOb._printCss = $scope.customizeDoc.customCSS; + ElementService.updateElement(docOb).then(function() { + $scope.elementSaving = false; + growl.success('Save Successful'); + }, function() { + $scope.elementSaving = false; + growl.warning('Save was not complete. Please try again.'); + }); + }; + $scope.preview = function() { + if (!$scope.previewResult) { + $scope.previewResult = printOrGenerate(viewOrDocOb, 3, true, true, false); + $scope.previewResult.tof = $scope.previewResult.tof + $scope.previewResult.toe; + } + var result = $scope.previewResult; + var htmlArr = ['' + viewOrDocOb.name + '', result.cover]; + if (result.toc != '') htmlArr.push(result.toc); + if (result.tot != '' && $scope.model.genTotf) htmlArr.push(result.tot); + if (result.tof != '' && $scope.model.genTotf) htmlArr.push(result.tof); + htmlArr.push(result.contents, ''); + var htmlString = htmlArr.join(''); + var popupWin = $window.open('about:blank', '_blank', 'width=800,height=600,scrollbars=1,status=1,toolbar=1,menubar=1'); + popupWin.document.open(); + popupWin.document.write(htmlString); + popupWin.document.close(); + }; + $scope.print = function() { + $scope.customization = $scope.customizeDoc.useCustomStyle ? $scope.customizeDoc.customCSS : false; + $uibModalInstance.close(['ok', $scope.model.genTotf, $scope.model.htmlTotf, $scope.model.landscape, $scope.meta, $scope.customization]); + }; + $scope.fulldoc = function() { + $uibModalInstance.close(['fulldoc']); + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }], + backdrop: 'static', + keyboard: false + }); + /* choice: + ['ok', $scope.model.genTotf, $scope.model.htmlTotf, $scope.model.landscape, $scope.meta] + [0] 'ok' - modal button to confirm print/export + [1] Generate List of Tables and Figures option + [2] HTML option checked - used to generate ToC from html + [3] Landscape option + [4] metadata: + bottom, bottom-left, bottom-right, top, top-left, top-right + [5] customization: CSS String || false + */ + modalInstance.result.then(function(choice) { + if (choice[0] === 'ok') { + var result = printOrGenerate(viewOrDocOb, mode, isDoc, choice[1], choice[2]); + var customization = choice[5]; + var css = customization ? customization : UtilsService.getPrintCss(choice[2], choice[3], choice[4]); + result.toe = choice[2] ? '' : result.toe; + if (mode === 1) { + var popupWin = $window.open('about:blank', '_blank', 'width=800,height=600,scrollbars=1,status=1,toolbar=1,menubar=1'); + popupWin.document.open(); + popupWin.document.write('' + viewOrDocOb.name + '' + result.cover + result.toc + result.tot + result.tof + result.toe + result.contents + ''); + popupWin.document.close(); + $timeout(function() { + popupWin.print(); + }, 1000, false); + } else { + result.tof = choice[1] ? result.tof + result.toe : ''; + result.tot = choice[1] ? result.tot : ''; + var htmlArr = ['' + viewOrDocOb.name + '', result.cover]; + if (result.toc != '') htmlArr.push(result.toc); + if (result.tot != '') htmlArr.push(result.tot); + if (result.tof != '') htmlArr.push(result.tof); + htmlArr.push(result.contents, ''); + var htmlString = htmlArr.join(''); + growl.info('Generating, please wait...', {ttl: -1}); + UtilsService.exportHtmlAs(mode, {htmlString: htmlString, name: viewOrDocOb.name, projectId: viewOrDocOb._projectId, refId: viewOrDocOb._refId, css: css}) + .then(function(result) { + growl.success('File Downloaded', {ttl: -1}); + deferred.resolve(result); + }, function(reason){ + deferred.reject(reason); + growl.error('Generation Failed'); + }); + } + } else { + eventSvc.$broadcast('tree-full-document', {search: undefined}); + } + }); + return deferred.promise; + }; + + + /** + * @ngdoc method + * @name mmsApp.MmsAppUtils#printOrGenerate + * @methodOf mmsApp.MmsAppUtils + * + * @description + * Called by printModal to handle cleanup and building content needed for + * print, PDF or word export. + * Cleansup html i.e. removes no-print, ng-hide + * + * @param {Object} viewOrDocOb current document or view object + * @param {Number} mode 1 = print, 2 = word, 3 = pdf + * @param {Boolean} isDoc viewOrDocOb is view or doc + * @param {Boolean} genTotf whether to gen table of figures and tables (option from the modal form) + * @param {Boolean} htmlTotf include DocGen generated tables and rapid tables (option from the modal form) + * @returns {Object} Returns object with content needed for print/word export/PDF generation + *
+     * {
+     *      cover: cover page html,
+     *      contents: main content html,
+     *      toc: table of contents html,
+     *      tof: table of figures html,
+     *      tot: table of tables html,
+     *      toe: table of equations html
+     * }
+     * 
+ */ + var printOrGenerate = function(viewOrDocOb, mode, isDoc, genTotf, htmlTotf) { + var printContents = ''; + var printElementCopy = angular.element("#print-div"); + + // Conversion of canvas to its dataUrl must be done before "clone", because "clone" doesn't preserve + // canvas' content + var mapping = storeTomsawyerDiagramAsImg(printElementCopy); + printElementCopy = printElementCopy.clone(); + replaceMmsTsDiagramWithImg(printElementCopy, mapping); + + var hostname = $location.host(); + var port = $location.port(); + var protocol = $location.protocol(); + var absurl = $location.absUrl(); + var prefix = protocol + '://' + hostname + ((port == 80 || port == 443) ? '' : (':' + port)); + var mmsIndex = absurl.indexOf('mms.html'); + var toc = UtilsService.makeHtmlTOC(tree.treeRows); + + // Conver to proper links for word/pdf + UtilsService.convertViewLinks(printElementCopy); + + // Get correct table/image numbering based on doc hierarchy + var tableAndFigTOC = UtilsService.makeTablesAndFiguresTOC(tree.treeRows, printElementCopy, false, htmlTotf); + var tof = tableAndFigTOC.figures; + var tot = tableAndFigTOC.tables; + var toe = tableAndFigTOC.equations; + + // Customize TOC based on user choice + if (!isDoc) { + toc = tof = tot = toe = ''; + } + if (!genTotf) { + tof = tot = toe = ''; + } + angular.element(printElementCopy).find("a").attr('href', function(index, old) { + if (!old) + return old; + if (old.indexOf('/') === 0) + return prefix + old; + if (old.indexOf('../../') === 0) + return prefix + old.substring(5); + if (old.indexOf('../') === 0) + return prefix + '/alfresco' + old.substring(2); + if (old.indexOf('mms.html') === 0) + return absurl.substring(0, mmsIndex) + old; + return old; + }); + + // Remove comments, table features, and all elements with classes: mms-error, no-print, ng-hide + printElementCopy.find('mms-transclude-com').remove(); + printElementCopy.find('style').remove(); //prevent user inserted styles from interfering + printElementCopy.find('div.tableSearch').remove(); + //printElementCopy.find('.mms-error').html('error'); + printElementCopy.find('.no-print').remove(); + printElementCopy.find('.ng-hide').remove(); + + // word doesn't support svg only png. + if (mode === 2) { + printElementCopy.find('.mms-svg').remove(); + } else { + printElementCopy.find('.mms-png').remove(); + } + // Remove all empty paragraphs + printElementCopy.find('p:empty').remove(); + printElementCopy.find('p').each(function() { + var $this = $(this); + if ($this.html().replace(/\s| /g, '').length === 0) { + $this.remove(); + } + }); + printElementCopy.find('[width]').not('img').not('.ve-fixed-width').removeAttr('width'); + printElementCopy.find('[style]').not('hr').each(function() { + this.style.removeProperty('font-size'); + this.style.removeProperty('width'); + this.style.removeProperty('min-width'); + this.style.removeProperty('height'); + //remove frozen headers and column + this.style.removeProperty('transform'); + this.style.removeProperty('will-change'); + }); + printElementCopy.find('.math').remove(); //this won't work in chrome for popups since chrome can't display mathml + printElementCopy.find('script').remove(); + //printElementCopy.find('.MJX_Assistive_MathML').remove(); //pdf generation need mathml version + + // Get doc cover page by doc ID + var cover = ''; + if (isDoc) { + cover = printElementCopy.find("mms-view[mms-element-id='" + viewOrDocOb.id + "']"); + cover.remove(); + // Add class to style cover page + cover.addClass('ve-cover-page'); + cover = cover[0].outerHTML; + } + printContents = printElementCopy[0].outerHTML; + + return { cover: cover, contents: printContents, toc: toc, tof: tof, tot: tot, toe: toe }; + }; + //TODO: Evaluate moving to Tree Service + var handleChildViews = function(v, aggr, propId, projectId, refId, curItemFunc, childrenFunc, seen) { + var seenViews = seen; + if (!seenViews) + seenViews = {}; + var deferred = $q.defer(); + var curItem = curItemFunc(v, aggr, propId); + seenViews[v.id] = v; + var childIds = []; + var childAggrs = []; + var childPropIds = []; + if (!v._childViews || v._childViews.length === 0 || aggr === 'none') { + if (angular.isObject(curItem) && curItem.loading) { + curItem.loading = false; + } + deferred.resolve(curItem); + return deferred.promise; + } + for (var i = 0; i < v._childViews.length; i++) { + if (seenViews[v._childViews[i].id]) + continue; + childIds.push(v._childViews[i].id); + childAggrs.push(v._childViews[i].aggregation); + childPropIds.push(v._childViews[i].propertyId); + } + ElementService.getElements({ + elementIds: childIds, + projectId: projectId, + refId: refId + }, 2).then(function(childViews) { + var mapping = {}; + for (var i = 0; i < childViews.length; i++) { + mapping[childViews[i].id] = childViews[i]; + } + var childPromises = []; + var childNodes = []; + var processedChildViews = []; + for (i = 0; i < childIds.length; i++) { + var child = mapping[childIds[i]]; + if (child && UtilsService.isView(child)) { //what if not found?? + childPromises.push(handleChildViews(child, childAggrs[i], childPropIds[i], projectId, refId, curItemFunc, childrenFunc, seenViews)); + childNodes.push(curItemFunc(child, childAggrs[i], childPropIds[i])); + processedChildViews.push({id: child.id, aggregation: childAggrs[i], propertyId: childPropIds[i]}); + } + } + v._childViews = processedChildViews; + childrenFunc(curItem, childNodes); + $q.all(childPromises).then(function(childNodes) { + deferred.resolve(curItem); + }, function(reason) { + deferred.reject(reason); + }); + }, function(reason) { + deferred.reject(reason); + }); + return deferred.promise; + }; + + var refreshNumbering = function(tree, centerElement) { + UtilsService.makeTablesAndFiguresTOC(tree, centerElement, true, false); + }; + + /** Store all tomsawyer diagram(canvas) as an img element **/ + function storeTomsawyerDiagramAsImg(originalDom) { + var mapping = {}; + originalDom.find('mms-ts-diagram').each(function(index){ + var tsDom = $(this); + var canvas = tsDom.find('canvas')[0]; + if(canvas) { + var imgElement = $(''); + imgElement.attr({'src': canvas.toDataURL(), 'width': '100%' }); + mapping[index] = imgElement; + } + }); + return mapping; + } + + /** Replace all mms-ts-diagram elements with their corresponding img elements **/ + function replaceMmsTsDiagramWithImg(element, mapping) { + element.find('mms-ts-diagram').each(function(index) { + var imgDom = mapping[index]; + $(this).replaceWith(imgDom); + }); + } + + return { + printModal: printModal, + tableToCsv: tableToCsv, + handleChildViews: handleChildViews, + refreshNumbering: refreshNumbering + }; +} + diff --git a/app/js/mms/controllers/fulldoc.controller.js b/app/js/mms/controllers/fulldoc.controller.js new file mode 100755 index 000000000..faae3adb4 --- /dev/null +++ b/app/js/mms/controllers/fulldoc.controller.js @@ -0,0 +1,329 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('FullDocCtrl', ['$scope', '$state', '$anchorScroll', '$location', '$timeout', '$http', 'FullDocumentService', 'ShortenUrlService', + 'hotkeys', 'growl', '_', 'MmsAppUtils', 'Utils', 'UxService', 'URLService', 'UtilsService', 'search', 'orgOb', 'projectOb', 'refOb', 'groupOb', 'documentOb', + 'PermissionsService', 'RootScopeService', 'TreeService', 'EventService', +function($scope, $state, $anchorScroll, $location, $timeout, $http, FullDocumentService, ShortenUrlService, hotkeys, growl, _, + MmsAppUtils, Utils, UxService, URLService, UtilsService, search, orgOb, projectOb, refOb, groupOb, documentOb, PermissionsService, + RootScopeService, TreeService, EventService) { + + let rootScopeSvc = RootScopeService; + let tree = TreeService.getApi(); + + let eventSvc = EventService; + eventSvc.$init($scope); + + $scope.viewContentLoading = false; + + $scope.subs.push(eventSvc.$on(rootScopeSvc.constants.VEVIEWCONTENTLOADING,(data) => { + $scope.viewContentLoading = data; + })); + + rootScopeSvc.veFullDocMode(true); + if (!rootScopeSvc.veCommentsOn()) + rootScopeSvc.veCommentsOn(false); + if (!rootScopeSvc.veElementsOn()) + rootScopeSvc.veElementsOn(false); + if (!rootScopeSvc.veEditMode()) + rootScopeSvc.veEditMode(false); + + $scope.search = search; + Utils.toggleLeftPane(search); + $scope.buttons = []; + $scope.refOb = refOb; + $scope.projectOb = projectOb; + $scope.latestElement = ''; + $scope.docLibLink = ''; + $scope.bbApi = { + init: function() { + if (documentOb && refOb.type === 'Branch' && PermissionsService.hasBranchEditPermission(refOb)) { + $scope.bbApi.addButton(UxService.getButtonBarButton('show-edits')); + $scope.bbApi.setToggleState('show-edits', rootScopeSvc.veEditMode()); + hotkeys.bindTo($scope) + .add({ + combo: 'alt+d', + description: 'toggle edit mode', + callback: function() {eventSvc.$broadcast('show-edits');} + }); + } + + $scope.bbApi.addButton(UxService.getButtonBarButton('show-elements')); + $scope.bbApi.addButton(UxService.getButtonBarButton('show-comments')); + $scope.bbApi.addButton(UxService.getButtonBarButton('refresh-numbering')); + // $scope.bbApi.addButton(UxService.getButtonBarButton('share-url')); + $scope.bbApi.addButton(UxService.getButtonBarButton('print')); + var exportButtons = UxService.getButtonBarButton('export'); + exportButtons.dropdown_buttons.push(UxService.getButtonBarButton("convert-pdf")); + //exportButtons.dropdown_buttons.push(UxService.getButtonBarButton("word")); + $scope.bbApi.addButton(exportButtons); + $scope.bbApi.setToggleState('show-comments', rootScopeSvc.veCommentsOn()); + $scope.bbApi.setToggleState('show-elements', rootScopeSvc.veElementsOn()); + hotkeys.bindTo($scope) + .add({ + combo: 'alt+c', + description: 'toggle show comments', + callback: function() {eventSvc.$broadcast('show-comments');} + }).add({ + combo: 'alt+e', + description: 'toggle show elements', + callback: function() {eventSvc.$broadcast('show-elements');} + }); + } + }; + $scope.searchOptions = { + emptyDocTxt: 'This field is empty.', + searchInput: search, + getProperties: true, + closeable: true, + callback: function(elementOb) { + let data = { + elementOb: elementOb, + commitId: 'latest' + }; + eventSvc.$broadcast('elementSelected', data); + if (typeof rootScopeSvc.mmsPaneClosed() === 'boolean' && rootScopeSvc.mmsPaneClosed()) + eventSvc.$broadcast('mms-pane-toggle'); + }, + relatedCallback: function (doc, view, elem) {//siteId, documentId, viewId) { + $state.go('project.ref.document.view', {projectId: doc._projectId, documentId: doc.id, viewId: view.id, refId: doc._refId, search: undefined}); + } + }; + $scope.views = []; + // api to communicate with borderlayout library + $scope.scrollApi = { + notifyOnScroll: notifyOnScroll, + isScrollVisible: function(){}, // pane's directive (in borderlayout) resets this to the right function + throttleRate: 500, // how often should the wheel event triggered + threshold : 3000, // how far from the bottom of the page before adding more views + frequency: 100 // how fast to add more views + }; + + + var views = []; + var view2children = {}; + var num = 1; + var seenViewIds = {}; + view2children[documentOb.id] = []; + var fullDocumentService; + _createViews().then(function() { + // The Controller codes get executed before all the directives' + // code in its template ( full-doc.html ). As a result, use $timeout here + // to let them finish first because in this case + // we rely on fa-pane directive to setup isScrollVisible + $timeout(function() { + fullDocumentService = new FullDocumentService(views); + fullDocumentService.addInitialViews($scope.scrollApi.isScrollVisible); + $scope.views = fullDocumentService.viewsBuffer; + }); + }); + + _initializeDocLibLink(); + + $scope.subs.push(eventSvc.$on('mms-tree-click', function(branch) { + fullDocumentService.handleClickOnBranch(branch, function() { + $location.hash(branch.data.id); + $anchorScroll(); + }); + })); + + $scope.subs.push(eventSvc.$on('mms-full-doc-view-deleted', function(deletedBranch) { + fullDocumentService.handleViewDelete(deletedBranch); + })); + + $scope.subs.push(eventSvc.$on('mms-new-view-added', function(data) { + fullDocumentService.handleViewAdd(_buildViewElement(data.vId, data.curSec), data.prevSibId); + })); + + $scope.subs.push(eventSvc.$on('show-comments', function() { + for (var i = 0; i < $scope.views.length; i++) { + $scope.views[i].api.toggleShowComments(); + } + $scope.bbApi.toggleButtonState('show-comments'); + rootScopeSvc.veCommentsOn(!rootScopeSvc.veCommentsOn()); + })); + + $scope.subs.push(eventSvc.$on('show-elements', function() { + for (var i = 0; i < $scope.views.length; i++) { + $scope.views[i].api.toggleShowElements(); + } + $scope.bbApi.toggleButtonState('show-elements'); + rootScopeSvc.veElementsOn(!rootScopeSvc.veElementsOn()); + })); + + $scope.subs.push(eventSvc.$on('show-edits', function() { + var i = 0; + if ((rootScopeSvc.veElementsOn() && rootScopeSvc.veEditMode()) || (!rootScopeSvc.veElementsOn() && !rootScopeSvc.veEditMode()) ){ + for (i = 0; i < $scope.views.length; i++) { + $scope.views[i].api.toggleShowElements(); + } + $scope.bbApi.toggleButtonState('show-elements'); + rootScopeSvc.veElementsOn(!rootScopeSvc.veElementsOn()); + } + $scope.bbApi.toggleButtonState('show-edits'); + rootScopeSvc.veEditMode(!rootScopeSvc.veEditMode()); + for (i = 0; i < $scope.views.length; i++) { + $scope.views[i].api.toggleShowEdits(); + } + })); + + $scope.subs.push(eventSvc.$on('convert-pdf', function() { + fullDocumentService.loadRemainingViews(function() { + MmsAppUtils.printModal(documentOb, refOb, true, 3) + .then(function(ob) { + //growl.info('Exporting as PDF file. Please wait for a completion email.',{ttl: -1}); + }, function(reason){ + //growl.error("Exporting as PDF file Failed: " + reason.message); + }); + }); + })); + + $scope.subs.push(eventSvc.$on('print', function() { + fullDocumentService.loadRemainingViews(function() { + MmsAppUtils.printModal(documentOb, refOb, true, 1); + }); + })); + + $scope.subs.push(eventSvc.$on('word', function() { + fullDocumentService.loadRemainingViews(function() { + MmsAppUtils.printModal(documentOb, refOb, true, 2) + .then(function(ob) { + //growl.info('Exporting as Word file. Please wait for a completion email.',{ttl: -1}); + }, function(reason){ + //growl.error("Exporting as Word file Failed: " + reason.message); + }); + }); + })); + + $scope.subs.push(eventSvc.$on('tabletocsv', function() { + fullDocumentService.loadRemainingViews(function() { + MmsAppUtils.tableToCsv(true); + }); + })); + + $scope.subs.push(eventSvc.$on('refresh-numbering', function() { + fullDocumentService.loadRemainingViews(function() { + MmsAppUtils.refreshNumbering(tree.get_rows(), angular.element("#print-div")); + }); + })); + + // Share URL button settings + $scope.dynamicPopover = ShortenUrlService.dynamicPopover; + $scope.copyToClipboard = ShortenUrlService.copyToClipboard; + $scope.handleShareURL = ShortenUrlService.getShortUrl.bind(null, $location.absUrl(), $scope); + + function _createViews() { + var loadingViewsFromServer = growl.info('Loading data from server!', {ttl: -1}); + views.push({id: documentOb.id, api: { + init: function(dis) { + if (rootScopeSvc.veCommentsOn()) { + dis.toggleShowComments(); + } + if (rootScopeSvc.veElementsOn()) { + dis.toggleShowElements(); + } + if (rootScopeSvc.veEditMode()) { + dis.toggleShowEdits(); + } + }, + elementTranscluded: _elementTranscluded, + elementClicked: _elementClicked + }}); + if (!documentOb._childViews) { + documentOb._childViews = []; + } + return MmsAppUtils.handleChildViews(documentOb, 'composite', undefined, projectOb.id, refOb.id, _handleSingleView, _handleChildren) + .then(function(childIds) { + for (var i = 0; i < childIds.length; i++) { + _constructViews(childIds[i], num); + num = num + 1; + } + }).finally(loadingViewsFromServer.destroy); + } + + function _initializeDocLibLink() { + if (groupOb !== null) { + $scope.docLibLink = groupOb._link; + } else if (documentOb !== null && documentOb._groupId !== undefined && documentOb._groupId !== null) { + $scope.docLibLink = '/share/page/repository#filter=path|/Sites/' + orgOb.id + '/documentLibrary/' + + projectOb.id + '/' + documentOb._groupId; + } else { + $scope.docLibLink = '/share/page/repository#filter=path|/Sites/' + orgOb.id + '/documentLibrary/' + + projectOb.id; + } + } + + function _elementTranscluded(elementOb, type) { + if (elementOb && type !== 'Comment') { + if (elementOb._modified > $scope.latestElement) + $scope.latestElement = elementOb._modified; + } + } + + function _elementClicked(elementOb) { + let data = { + elementOb: elementOb, + commitId: 'latest' + }; + eventSvc.$broadcast('elementSelected', data); + } + + function _buildViewElement(vId, curSec) { + return {id: vId, api: { + init: function(dis) { + if (rootScopeSvc.veCommentsOn()) { + dis.toggleShowComments(); + } + if (rootScopeSvc.veElementsOn()) { + dis.toggleShowElements(); + } + if (rootScopeSvc.veEditMode()) { + dis.toggleShowEdits(); + } + }, + elementTranscluded: _elementTranscluded, + elementClicked: _elementClicked + }, number: curSec, topLevel: (curSec ? (curSec.toString().indexOf('.') === -1) : false), first: curSec == 1}; + } + + function _constructViews(viewId, curSection) { + views.push(_buildViewElement(viewId, curSection)); + + if (view2children[viewId]) { + var num = 1; + for (var i = 0; i < view2children[viewId].length; i++) { + _constructViews(view2children[viewId][i], curSection + '.' + num); + num = num + 1; + } + } + } + + function _handleSingleView(v, aggr) { + var childIds = view2children[v.id]; + if (!childIds) { + childIds = []; + } + view2children[v.id] = childIds; + if (!v._childViews || v._childViews.length === 0 || aggr === 'none') { + return childIds; + } + for (var i = 0; i < v._childViews.length; i++) { + if (seenViewIds[v._childViews[i].id]) { + continue; + } + seenViewIds[v._childViews[i].id] = true; + childIds.push(v._childViews[i].id); + } + return childIds; + } + + function _handleChildren(childIds, childNodes) { + return childIds; + } + + function notifyOnScroll() { + return fullDocumentService.handleDocumentScrolling(); + } +}]); diff --git a/app/js/mms/controllers/main.controller.js b/app/js/mms/controllers/main.controller.js new file mode 100755 index 000000000..2d946d683 --- /dev/null +++ b/app/js/mms/controllers/main.controller.js @@ -0,0 +1,209 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('MainCtrl', ['$scope', '$timeout', '$location', '$rootScope', '$state', '_', '$window', '$uibModal', 'growl', '$http', 'URLService', 'hotkeys', 'growlMessages', 'UtilsService', 'HttpService', 'AuthService', 'ElementService', 'CacheService', 'ApplicationService', 'RootScopeService', 'EditService', 'EventService', '$interval', +function($scope, $timeout, $location, $rootScope, $state, _, $window, $uibModal, growl, $http, URLService, hotkeys, growlMessages, UtilsService, HttpService, AuthService, ElementService, CacheService, ApplicationService, RootScopeService, EditService, EventService, $interval) { + var rootScopeSvc = RootScopeService; + var edit = EditService; + var eventSvc = EventService; + eventSvc.$init($scope); + + var openEdits = {}; + + rootScopeSvc.veViewContentLoading(false); + rootScopeSvc.treeInitialSelection(''); + + $scope.subs.push(eventSvc.$on(rootScopeSvc.constants.VETITLE, (value) => { + $window.document.title = value + ' | View Editor'; + })); + + + + rootScopeSvc.veFn(false); + + var modalOpen = false; + + $scope.subs.push(eventSvc.$on(edit.EVENT, () => { + openEdits = edit.getAll(); + })); + + + $window.addEventListener('beforeunload', function(event) { + if (Object.keys(openEdits).length > 0) { + var message = 'You may have unsaved changes, are you sure you want to leave?'; + event.returnValue = message; + return message; + } + }); + + hotkeys.bindTo($scope) + .add({ + combo: 'alt+m', + description: 'close all messages', + callback: function() {growlMessages.destroyAllMessages();} + }).add({ + combo: '@', + description: 'fast cf in editor', + callback: function() {} + }); + + $scope.$on('$stateChangeError', function(event, toState, toParams, fromState, fromParams, error) { + rootScopeSvc.veStateChanging(false); + rootScopeSvc.veViewContentLoading(false); + //check if error is ticket error + if (!error || error.status === 401 || + (error.status === 404 && error.config && error.config.url && + error.config.url.indexOf('/authentication') !== -1)) { //check if 404 if checking valid ticket + event.preventDefault(); + rootScopeSvc.veRedirect({toState: toState, toParams: toParams}); + $state.go('login', {notify: false}); + return; + } + growl.error('Error: ' + error.message); + }); + + $scope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){ + rootScopeSvc.veViewContentLoading(true); + HttpService.transformQueue(); + rootScopeSvc.veStateChanging(true); + }); + + $scope.subs.push(eventSvc.$on('mms.unauthorized', function(response) { + // add a boolean to the 'or' statement to check for modal window + if ($state.$current.name === 'login' || rootScopeSvc.veStateChanging() || modalOpen) + return; + AuthService.checkLogin().then(function(){}, function() { + if ($state.$current.name === 'login' || modalOpen) + return; + modalOpen = true; + $uibModal.open({ + template: '', + scope: $scope, + backdrop: 'static', + controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) { + $scope.credentials = { + username: '', + password: '' + }; + $scope.spin = false; + $scope.login = function (credentials) { + $scope.spin = true; + var credentialsJSON = {"username":credentials.username, "password":credentials.password}; + AuthService.getAuthorized(credentialsJSON).then(function (user) { + growl.success("Logged in"); + $uibModalInstance.dismiss(); + // Check if user had changes queued before refreshing page data + // add edits to cache + var edits = edit.getAll(); + _.map(edits, function(element, key) { + var cacheKey = UtilsService.makeElementKey(element, true); + CacheService.put(cacheKey, element); + }); + $state.go($state.current, {}, {reload: true}); + }, function (reason) { + $scope.spin = false; + $scope.credentials.password = ''; + growl.error(reason.message); + }); + }; + }], + size: 'md' + }).result.finally(function(){ + modalOpen = false; + }); + }); + })); + // broadcast mms.unauthorized every 10 minutes with interval service + $interval(function() { + eventSvc.$broadcast('mms.unauthorized'); + }, 600000, 0, false); + + $scope.$on('$stateChangeSuccess', + function(event, toState, toParams, fromState, fromParams) { + rootScopeSvc.veStateChanging(false); + $scope.hidePanes = false; + $scope.showManageRefs = false; + $scope.showLogin = false; + if ($state.current.name === 'login' || $state.current.name === 'login.select' || $state.current.name === 'login.redirect') { + $scope.hidePanes = true; + $scope.showLogin = true; + } else if ( $state.includes('project') && !($state.includes('project.ref')) ) { + $scope.hidePanes = true; + $scope.showManageRefs = true; + eventSvc.$broadcast('fromParamChange', fromParams); + } + if ($state.current.name === 'project.ref') { + rootScopeSvc.treeInitialSelection(toParams.refId); + } else if ($state.current.name === 'project.ref.preview') { + var index = toParams.documentId.indexOf('_cover'); + if (index > 0) + rootScopeSvc.treeInitialSelection(toParams.documentId.substring(5, index)); + else + rootScopeSvc.treeInitialSelection(toParams.documentId); + } else if ($state.includes('project.ref.document') && ($state.current.name !== 'project.ref.document.order')) { + if (toParams.viewId !== undefined) + rootScopeSvc.treeInitialSelection(toParams.viewId); + else + rootScopeSvc.treeInitialSelection(toParams.documentId); + } + if ($state.includes('project.ref.document')) { + ApplicationService.getState().inDoc = true; + ApplicationService.getState().currentDoc = toParams.documentId; + if ($state.includes('project.ref.document.full')) { + ApplicationService.getState().fullDoc = true; + } else { + ApplicationService.getState().fullDoc = false; + } + } else { + ApplicationService.getState().inDoc = false; + ApplicationService.getState().fullDoc = false; + } + rootScopeSvc.veViewContentLoading(false); + if ($state.includes('project.ref') && (fromState.name === 'login' || fromState.name === 'login.select' || fromState.name === 'project' || fromState.name === 'login.redirect')) { + $timeout(function() { + eventSvc.$broadcast('tree-pane-toggle'); + }, 1, false); + $timeout(function() { + eventSvc.$broadcast('tree-pane-toggle'); + }, 100, false); + } + } + ); + + var workingModalOpen = false; + $scope.subs.push(eventSvc.$on('mms.working', function(response) { + rootScopeSvc.veViewContentLoading(false); + if (workingModalOpen) { + return; + } + $scope.mmsWorkingTime = response.data; + workingModalOpen = true; + $uibModal.open({ + template: "
Please come back later
The document you're requesting has been requested already at {{mmsWorkingTime.startTime | date:'M/d/yy h:mm a'}} and is currently being cached, please try again later.
", + scope: $scope, + backdrop: true, + controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) { + }], + size: 'md' + }).result.finally(function(){ + workingModalOpen = false; + }); + })); + + $scope.subs.push(eventSvc.$on('element.updated', function(data) { + let element = data.element; + //if element is not being edited and there's a cached edit object, update the edit object also + //so next time edit forms will show updated data (mainly for stomp updates) + var editKey = UtilsService.makeElementKey(element, true); + var veEditsKey = element.id + '|' + element._projectId + '|' + element._refId; + if (edit.getAll() && !edit.get(veEditsKey) && CacheService.exists(editKey)) { + ElementService.cacheElement({projectId: element._projectId, refId: element._refId, elementId: element.id, commitId: 'latest'}, JSON.parse(JSON.stringify(element)), true); + } + })); +}]); diff --git a/app/js/mms/controllers/redirect.controller.js b/app/js/mms/controllers/redirect.controller.js new file mode 100755 index 000000000..d38e239b7 --- /dev/null +++ b/app/js/mms/controllers/redirect.controller.js @@ -0,0 +1,210 @@ +'use strict'; + +/* Controllers */ + // /workspaces/master/sites/{siteid} {siteid}_cover /projects/{projectid}/master/document/{siteid}_cover + // /workspaces/master/sites/{siteid}/document/{docid} {docid} /projects/{projectid}/master/document/{docid} + // /workspaces/master/sites/{siteid}/documents/{docid} {docid} /projects/{projectid}/master/documents/{docid} + // /workspaces/master/sites/{siteid}/documents/{docid}/views/{viewid} + // (view id might be the same as doc id) {docid},{viewid} /projects/{projectid of doc}/master/documents/{docid}/views/{viewid} + // if {viewid} not found, go to doc + // if {docid} not found but view is found, it might be under a different doc + // (see _relatedDocuments of element in search result) + // /workspaces/master/sites/{siteid}/documents/{docid}/full {docid} /projects/{projectid}/master/documents/{docid}/full + +angular.module('mmsApp') +.controller('RedirectCtrl', ['$scope', '$state', '$location', '$timeout', + 'ProjectService', 'ElementService', 'RootScopeService', 'EventService', 'growl', + function($scope, $state, $location, $timeout, ProjectService, ElementService, RootScopeService, EventService, growl) { + const rootScopeSvc = RootScopeService; + const eventSvc = EventService; + eventSvc.$init($scope); + + rootScopeSvc.veTitle('View Editor'); //what to name this? + + $scope.redirect_from_old = rootScopeSvc.veRedirectFromOld(); + $scope.$on(rootScopeSvc.constants.VEREDIRECTFROMOLD, (data) => { + $scope.redirect_from_old = data; + }); + + $scope.redirect_noResults = false; + $scope.redirect_element = null; + $scope.spin = false; + + $scope.resetSelectPage = function() { + $state.go('login.select'); + }; + + var buildQuery = function(idList, projectList) { + var queryOb = { 'query': { 'bool':{ "filter": [] } } }; + //Fitler master ref + queryOb.query.bool.filter.push({ 'terms' : { 'id' : idList } }); + //Fitler project id + queryOb.query.bool.filter.push({ 'terms' : { '_projectId' : projectList } }); + //Fitler master ref + queryOb.query.bool.filter.push({ 'term' : { '_inRefIds' : 'master' } }); + return queryOb; + }; + + var errorHandler = function(reason) { + $state.go('login.select'); + }; + + var oldUrlTest = function(location) { + var segments = location.split('/'); + var searchTermList = [], successRedirectFnc = errorHandler; + var noResultFnc = function() { + // TODO - Search for document was unsucessful. Please select from the following or contact admin to verify that document exists. + $scope.redirect_noResults = true; + }; + + if (segments.length === 5) { + if (location.includes('sites')) { //Search for site + searchTermList.push(segments[4]+'_cover'); + successRedirectFnc = function(data) { + if ( data.length > 0 ) { + $scope.redirect_element = {name: data[0].name, + type: 'group', + link: "project.ref.preview({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "'})" + }; + var redirectFnc = function() { + $state.go('project.ref.preview', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id}); + }; + $timeout(redirectFnc, 10000); + } else { + noResultFnc(); + } + }; + } + } else if (segments.length === 7) { //Search for document + if (location.includes('documents')) { + // ["", "workspaces", "master", "sites", "site__18_0_6_eda034b_1489006578377_52061_121780", "document", "_18_0_6_bec02f9_1489697812908_180368_252005"] + searchTermList.push(segments[6]); + successRedirectFnc = function(data) { + if ( data.length > 0 ) { + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.document({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "'})" + }; + var redirectFnc = function() { + $state.go('project.ref.document', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id}); + }; + $timeout(redirectFnc, 10000); + } else { + noResultFnc(); + } + }; + } else if (location.includes('document')) { + searchTermList.push(segments[6]); + successRedirectFnc = function(data) { + if ( data.length > 0 ) { + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.preview({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "'})" + }; + var redirectFnc = function() { + $state.go('project.ref.preview', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id}); + }; + $timeout(redirectFnc, 10000); + } else { + noResultFnc(); + } + }; + } + } else if (segments.length === 9) { //Search for view + if (location.includes('views')) { + // ["", "workspaces", "master", "sites", "site__18_0_6_eda034b_1489006578377_52061_121780", "documents", "_18_0_6_bec02f9_1489697812908_180368_252005", "views", "MMS_1474405796233_0887698d-1fc7-47ac-87ac-b0f6e7b69d35"] + if (segments[6] == segments[8]) { + searchTermList.push(segments[6]); + successRedirectFnc = function(data) { + if ( data.length > 0 ) { + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.document.view({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "',viewId:'" +data[0].id+ "'})" + }; + var redirectFnc = function() { + $state.go('project.ref.document.view', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id, viewId: data[0].id}); + }; + $timeout(redirectFnc, 10000); + } else { + noResultFnc(); + } + }; + } else { + searchTermList.push(segments[6]); + searchTermList.push(segments[8]); + successRedirectFnc = function(data) { + var redirectFnc; + if (data.length > 1) { + if ( data[0].id === segments[6] && data[1].id === segments[8] ) { + //should check case if data[1] is segent[6] also + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.document.view({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "',viewId:'" +data[1].id+ "'})" + }; + redirectFnc = function() { + $state.go('project.ref.document.view', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id, viewId: data[1].id}); + }; + } else if ( data[0].id === segments[8] && data[1].id === segments[6] ) { + //should check case if data[1] is segent[6] also + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.document.view({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[1].id+ "',viewId:'" +data[0].id+ "'})" + }; + redirectFnc = function() { + $state.go('project.ref.document.view', {projectId: data[0]._projectId, refId: 'master', documentId: data[1].id, viewId: data[0].id}); + }; + } + $timeout(redirectFnc, 10000); + } else if (data.length > 0) { + if ( data[0].id === segments[8] ) { + $scope.elem = data[0]; + $scope.redirect_relatedDocs = data[0]._relatedDocuments; + } else if ( data[0].id === segments[6] ) { + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.document({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "'})" + }; + redirectFnc = function() { + $state.go('project.ref.document', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id}); + }; + $timeout(redirectFnc, 10000); + } + } else { + noResultFnc(); + } + }; + } + } + } else if (segments.length === 8) { //Search for full doc + if (location.includes('full')) { + searchTermList.push(segments[6]); + successRedirectFnc = function(data) { + if ( data.length > 0 ) { + $scope.redirect_element = {name: data[0].name, + type: 'doc', + link: "project.ref.document.full({projectId:'" +data[0]._projectId+ "',refId:'master',documentId:'" +data[0].id+ "'})" + }; + var redirectFnc = function() { + $state.go('project.ref.document.full', {projectId: data[0]._projectId, refId: 'master', documentId: data[0].id}); + }; + $timeout(redirectFnc, 10000); + } else { + noResultFnc(); + } + }; + } + } + // console.log(segments); + var queryOb = buildQuery(searchTermList, projectList); + ElementService.search(reqOb, queryOb) + .then(successRedirectFnc, errorHandler); + }; + + var projectList = []; + var reqOb = {}; + ProjectService.getProjects().then(function(projectObs) { + projectList = projectObs.map(function(a) {return a.id;}); + reqOb = {projectId: projectList[0], refId: 'master'}; + oldUrlTest(rootScopeSvc.veCrushUrl()); + }); +}]); \ No newline at end of file diff --git a/app/js/mms/controllers/refs.controller.js b/app/js/mms/controllers/refs.controller.js new file mode 100755 index 000000000..194913ac3 --- /dev/null +++ b/app/js/mms/controllers/refs.controller.js @@ -0,0 +1,321 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('RefsCtrl', ['$sce', '$q', '$filter', '$location', '$uibModal', '$scope', '$state', '$timeout', '$window', 'growl', '_', 'flatpickr', + 'ElementService', 'ProjectService', 'MmsAppUtils', 'ApplicationService', 'RootScopeService', + 'EventService', + 'orgOb', 'projectOb', 'refOb', 'refObs', 'tagObs', 'branchObs', +function($sce, $q, $filter, $location, $uibModal, $scope, $state, $timeout, $window, growl, _, flatpickr, + ElementService, ProjectService, MmsAppUtils, ApplicationService, RootScopeService, EventService, + orgOb, projectOb, refOb, refObs, tagObs, branchObs) { + + const rootScopeSvc = RootScopeService; + const eventSvc = EventService; + eventSvc.$init($scope); + + rootScopeSvc.mmsRefOb(refOb); + $scope.refManageView = true; + $scope.refData = []; + $scope.bbApi = {}; + $scope.buttons = []; + $scope.branches = branchObs; + $scope.tags = tagObs; + $scope.activeTab = 0; + $scope.refSelected = null; + $scope.search = null; + $scope.view = null; + $scope.fromParams = {}; + + + var selectMasterDefault = function() { + var masterIndex = _.findIndex(refObs, {name: 'master'}); + if (masterIndex > -1) { + $scope.fromParams = refObs[masterIndex]; + $scope.refSelected = refObs[masterIndex]; + } + }; + + if (_.isEmpty(refOb)) { + selectMasterDefault(); + } else { + $scope.fromParams = refOb; + $scope.refSelected = refOb; + } + + $scope.htmlTooltip = $sce.trustAsHtml('Branch temporarily unavailable during duplication.'); + + $scope.addBranch = function(e) { + addItem('Branch'); + }; + $scope.addTag = function(e) { + addItem('Tag'); + }; + $scope.deleteRef = function(e) { + deleteItem(); + }; + $scope.subs.push(eventSvc.$on('fromParamChange', function(fromParams) { + var index = _.findIndex(refObs, {name: fromParams.refId}); + if ( index > -1 ) { + $scope.fromParams = refObs[index]; + } + })); + + $scope.refClickHandler = function(ref) { + ProjectService.getRef(ref.id, projectOb.id).then( + function(data) { + $scope.refSelected = data; + }, + function(error){ + growl.error("Ref click handler error: " + error ); + return; + } + ); + }; + + var addItem = function(itemType) { + $scope.itemType = itemType; + var branch = $scope.refSelected; + var templateUrlStr = ""; + + // Item specific setup: + if (itemType === 'Branch') { + if (!branch) { + growl.warning("Add Branch Error: Select a branch or tag first"); + return; + } + if (branch.type === 'Tag') { + $scope.from = 'Tag ' + branch.name; + } else { + $scope.from = 'Branch ' + branch.name; + } + $scope.createParentRefId = branch.id; + templateUrlStr = 'partials/mms/new-branch.html'; + } else if (itemType === 'Tag') { + if (!branch) { + growl.warning("Add Tag Error: Select a branch or tag first"); + return; + } + $scope.createParentRefId = branch.id; + templateUrlStr = 'partials/mms/new-tag.html'; + } else { + growl.error("Add Item of Type " + itemType + " is not supported"); + return; + } + // Adds the branch: + var instance = $uibModal.open({ + templateUrl: templateUrlStr, + scope: $scope, + controller: ['$scope', '$uibModalInstance', '$filter', addItemCtrl] + }); + instance.result.then(function(data) { + //TODO add load handling once mms returns status + var tag = []; + for (var i = 0; i < refObs.length; i++) { + if (refObs[i].type === "Tag") + tag.push(refObs[i]); + } + $scope.tags = tag; + + var branches = []; + for (var j = 0; j < refObs.length; j++) { + if (refObs[j].type === "Branch") + branches.push(refObs[j]); + } + $scope.branches = branches; + if (data.type === 'Branch') { + //data.loading = true; + //$scope.branches.push(data); + $scope.refSelected = data; + $scope.activeTab = 0; + } else { + //data.loading = true; + //$scope.tags.push(data); + $scope.refSelected = data; + $scope.activeTab = 1; + } + }); + }; + + var addItemCtrl = function($scope, $uibModalInstance, $filter) { + $scope.createForm = true; + $scope.oking = false; + var displayName = ""; + // Item specific setup: + var now = new Date(); + if ($scope.itemType === 'Branch') { + $scope.branch = {}; + $scope.branch.name = ""; + $scope.branch.description = ""; + $scope.branch.permission = "read"; + $scope.branch.lastCommit = true; + $scope.branch.timestamp = now; + displayName = "Branch"; + $scope.updateTimeOpt = function () { + $scope.branch.lastCommit = false; + }; + } else if ($scope.itemType === 'Tag') { + $scope.tag = {}; + $scope.tag.name = ""; + $scope.tag.description = ""; + $scope.tag.lastCommit = true; + $scope.tag.timestamp = now; + displayName = "Tag"; + $scope.updateTimeOpt = function () { + $scope.tag.lastCommit = false; + }; + } + + $timeout(function() { + flatpickr('.datetimepicker', { + enableTime: true, + enableSeconds: true, + defaultDate: now, + dateFormat: 'Y-m-dTH:i:S', + time_24hr: true, + maxDate: new Date(), + onClose: function(selectedDates) { + $scope.$apply(function() { + $scope.updateTimeOpt(); + if ($('.datetimepicker#branch').length ) { + $scope.branch.timestamp = selectedDates[0]; + } else if($('.datetimepicker#tag').length ) { + $scope.tag.timestamp = selectedDates[0]; + } + }); + } + }); + }); + + var handlePromise = function(promise) { + promise.then(function(data) { + growl.success(displayName + " is being created."); + // growl.info('Please wait for a completion email prior to viewing of the '+$scope.itemType+'.', {ttl: -1}); + // refArr.push(refJson); + // var storeArr = refArr.toString(); + // $window.localStorage.setItem('refArr', storeArr); + $uibModalInstance.close(data); //need to figure out a way to cache this stuff + }, function(reason) { + growl.error("Create " + displayName + " : " + reason.message); + }).finally(function() { + $scope.oking = false; + }); + }; + + $scope.ok = function() { + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = true; + var promise, ts; + // Item specific promise: + if ($scope.itemType === 'Branch' && $scope.branch.name !== '') { + var branchObj = {"name": $scope.branch.name, "type": "Branch", + "description": $scope.branch.description}; + branchObj.parentRefId = $scope.createParentRefId; + branchObj.permission = $scope.branch.permission; + branchObj.id = ApplicationService.createUniqueId(); + if (!$scope.branch.lastCommit) { + // Make call to history?maxTimestamp to get closest commit id to branch off + ts = $filter('date')($scope.branch.timestamp, 'yyyy-MM-ddTHH:mm:ss.sssZ'); + ProjectService.getRefHistory(branchObj.parentRefId, projectOb.id, ts) + .then(function(commits) { + branchObj.parentCommitId = commits[0].id; + promise = ProjectService.createRef( branchObj, projectOb.id ); + handlePromise(promise); + }); + } else { + promise = ProjectService.createRef( branchObj, projectOb.id ); + handlePromise(promise); + } + } else if ($scope.itemType === 'Tag' && $scope.tag.name !== '') { + var tagObj = {"name": $scope.tag.name, "type": "Tag", + "description": $scope.tag.description}; + tagObj.parentRefId = $scope.createParentRefId; + tagObj.id = ApplicationService.createUniqueId(); + if (!$scope.tag.lastCommit) { + ts = $filter('date')($scope.tag.timestamp, 'yyyy-MM-ddTHH:mm:ss.sssZ'); + ProjectService.getRefHistory(tagObj.parentRefId, projectOb.id, ts) + .then(function(commits) { + tagObj.parentCommitId = commits[0].id; + promise = ProjectService.createRef( tagObj, projectOb.id ); + handlePromise(promise); + }); + } else { + promise = ProjectService.createRef( tagObj, projectOb.id ); + handlePromise(promise); + } + } else { + growl.error("Add Item of Type " + $scope.itemType + " is not supported"); + $scope.oking = false; + return; + } + }; + + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }; + + var deleteItem = function() { + var branch = $scope.refSelected; + if (!branch) { + growl.warning("Select item to delete."); + return; + } + $scope.deleteBranch = branch; + var instance = $uibModal.open({ + templateUrl: 'partials/mms/confirmDelete.html', + scope: $scope, + controller: ['$scope', '$uibModalInstance', deleteCtrl] + }); + instance.result.then(function(data) { + //TODO $state project with no selected ref + var index; + if ($scope.refSelected.type === 'Branch') { + index = $scope.branches.indexOf($scope.refSelected); + $scope.branches.splice(index, 1); + selectMasterDefault(); + } else if ($scope.refSelected.type === 'Tag') { + index = $scope.tags.indexOf($scope.refSelected); + $scope.tags.splice(index, 1); + } + $scope.refSelected = null; + }); + }; + + var deleteCtrl = function($scope, $uibModalInstance) { + $scope.oking = false; + var branch = $scope.deleteBranch; + if (branch.type === 'Tag') { + $scope.type = 'Tag'; + } else if (branch.type === 'Branch') { + $scope.type = 'Branch'; + } + $scope.name = branch.name; + $scope.ok = function() { + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = true; + var promise = ProjectService.deleteRef(branch.id, projectOb.id); + promise.then(function(data) { + growl.success($scope.type + " Deleted"); + $uibModalInstance.close('ok'); + }, function(reason) { + growl.error($scope.type + ' Delete Error: ' + reason.message); + }).finally(function() { + $scope.oking = false; + }); + }; + + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }; + + +}]); diff --git a/app/js/mms/controllers/reorder.controller.js b/app/js/mms/controllers/reorder.controller.js new file mode 100755 index 000000000..7bcdfb65f --- /dev/null +++ b/app/js/mms/controllers/reorder.controller.js @@ -0,0 +1,172 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('ReorderCtrl', ['$scope', 'documentOb', 'ElementService', 'ViewService', 'MmsAppUtils', 'TreeService', '$state', 'growl', '$q', '_', +function($scope, documentOb, ElementService, ViewService, MmsAppUtils, TreeService, $state, growl, $q, _) { + $scope.doc = documentOb; + + let treeApi = TreeService.getApi(); + + var viewIds2node = {}; + var origViews = {}; + viewIds2node[documentOb.id] = { + name: documentOb.name, + id: documentOb.id, + aggr: 'composite', + children: [] + }; + + var updateNumber = function(node, curSection, key) { + node[key] = curSection; + var num = 1; + for (var i = 0; i < node.children.length; i++) { + updateNumber(node.children[i], curSection + '.' + num, key); + num++; + } + }; + + $scope.treeOptions = { + dropped : function() { + for (var i = 0; i < $scope.tree.length; i++) { + var root = $scope.tree[i]; + root.new = ''; + var num = 1; + for (var j = 0; j < root.children.length; j++) { + updateNumber(root.children[j], num + '', 'new'); + num++; + } + } + }, + accept: function(sourceNodeScope, destNodeScope, destIndex) { + if (destNodeScope.$element.hasClass('root')) + return false; //don't allow moving to outside doc + if (destNodeScope.node.aggr == 'none') + return false; + return true; + } + }; + + var seenViewIds = {}; + function handleSingleView(v, aggr, propId) { + var curNode = viewIds2node[v.id]; + if (!curNode) { + curNode = { + name: v.name, + id: v.id, + aggr: aggr, + propertyId: propId, + children: [] + }; + viewIds2node[v.id] = curNode; + } + origViews[v.id] = v; + return curNode; + } + + function handleChildren(curNode, childNodes) { + var newChildNodes = []; + for (var i = 0; i < childNodes.length; i++) { + var node = childNodes[i]; + if (seenViewIds[node.id]) { + return; + } + seenViewIds[node.id] = node; + newChildNodes.push(node); + } + curNode.children.push.apply(curNode.children, newChildNodes); + } + + MmsAppUtils.handleChildViews(documentOb, 'composite', undefined, documentOb._projectId, + documentOb._refId, handleSingleView, handleChildren) + .then(function(docNode) { + var num = 1; + docNode.children.forEach(function(node) { + updateNumber(node, num + '', 'old'); + updateNumber(node, num + '', 'new'); + num++; + }); + $scope.tree = [docNode]; + }); + + $scope.saveClass = ""; + var saving = false; + $scope.save = function() { + if (saving) { + growl.info("please wait"); + return; + } + if ($scope.tree.length > 1 || $scope.tree[0].id !== documentOb.id) { + growl.error('Views cannot be re-ordered outside the context of the current document.'); + return; + } + saving = true; + $scope.saveClass = "fa fa-spin fa-spinner"; + var toSave = []; + angular.forEach(viewIds2node, function(node, id) { + if (node.aggr == 'none') {//cannot process views whose aggr is none since their children are not shown + return; + } + var childViews = []; + for (var i = 0; i < node.children.length; i++) { + childViews.push({ + id: node.children[i].id, + aggregation: node.children[i].aggr, + propertyId: node.children[i].propertyId + }); + } + var orig = origViews[id]; + if (((!orig._childViews || orig._childViews.length === 0) && childViews.length > 0) || + (orig._childViews && !angular.equals(orig._childViews, childViews))) { + toSave.push({ + id: id, + //name: orig.name, + _childViews: childViews, + _projectId: orig._projectId, + _refId: orig._refId, + type: orig.type + }); + } + }); + if (toSave.length === 0) { + growl.info("No changes to save!"); + saving = false; + $scope.saveClass = ""; + return; + } + ElementService.updateElements(toSave, true) + .then(function() { + growl.success('Reorder Successful'); + navigate(true); + }, function(response) { + var reason = response.failedRequests[0]; + var errorMessage = reason.message; + if (reason.status === 409) { + growl.error("There's a conflict in the views you're trying to change!"); + } else { + growl.error(errorMessage); + } + }).finally(function() { + $scope.saveClass = ""; + saving = false; + }); + }; + + $scope.cancel = function() { + navigate(false); + }; + + function navigate(reload) { + var curBranch = treeApi.get_selected_branch(); + if (!curBranch) { + $state.go('project.ref.document', {}, {reload:true}); + } else { + var goToId = curBranch.data.id; + if (curBranch.type !== 'section' && curBranch.type !== 'view') { + goToId = curBranch.viewId; + } + $state.go('project.ref.document.view', {viewId: goToId}, {reload: reload}); + } + } +}]); diff --git a/app/js/mms/controllers/reorderGroup.controller.js b/app/js/mms/controllers/reorderGroup.controller.js new file mode 100755 index 000000000..687aa5866 --- /dev/null +++ b/app/js/mms/controllers/reorderGroup.controller.js @@ -0,0 +1,191 @@ +'use strict'; + +angular.module('mmsApp') +.controller('ReorderGroupCtrl', ['$scope', '$stateParams', '$state', 'growl', '_', 'ElementService', 'CacheService', 'TreeService', 'projectOb', 'refOb', 'groupObs', 'documentObs', + +function ($scope, $stateParams, $state, growl, _, ElementService, CacheService, TreeService, projectOb, refOb, groupObs, documentObs) { + $scope.isSaving = false; + $scope.targetId = ''; + $scope.treeOptions = { + dropped: function (change) { + sortRecursively(children); + $scope.targetId = ''; + }, + accept: function (sourceNodeScope, destNodeScope, destIndex) { + // allow moving to the root or to a group + var accept = destNodeScope.node && ( destNodeScope.node.type === 'group' || destNodeScope.node.type === 'root' ); + if (accept) { + if(destNodeScope.$nodeScope && destNodeScope.$nodeScope.$modelValue && destNodeScope.$nodeScope.$modelValue.id) { + $scope.targetId = destNodeScope.$nodeScope.$modelValue.id; + } + } + return accept; + }, + dragStart: function(data) { + $scope.targetId = data.dest.nodesScope.$nodeScope.$modelValue.id; + } + }; + $scope.saveReorder = saveReorder; + $scope.cancelReorder = cancelReorder; + + var children = generateTree(); + sortRecursively(children); + var root = createNode('Top Level', 'root', children, {id: 'root'}); + $scope.tree = [root]; + + function generateTree() { + // create a node for each groupOb + var tree = groupObs.map(function (groupOb) { + return createNode(groupOb.name, 'group', [], groupOb); + }); + + // add document to its group + documentObs + .filter(function (documentOb) { + return documentOb._groupId; + }) + .forEach(function (documentOb) { + var parent = _.find(tree, function (node) { + return node.data.id === documentOb._groupId; + }); + if (parent) { + parent.children.push(createNode(documentOb.name, 'view', [], documentOb)); + } + }); + + // for any group that has a parent group, establish that connection + tree.forEach(function (groupNode) { + var foundParent = _.find(tree, function (node) { + return node.data.id === groupNode.data._parentId; + }); + if (foundParent) { + groupNode.isChild = true; + foundParent.children.push(groupNode); + } + return groupNode; + }); + + // only groups that don't have parents show up at root level + tree = tree.filter(function (groupNode) { + return !groupNode.isChild; + }); + + // add all the documents that don't belong to any group + documentObs + .filter(function (documentOb) { + return !documentOb._groupId; + }) + .forEach(function (documentOb) { + tree.push(createNode(documentOb.name, 'view', [], documentOb)); + }); + return tree; + } + + function createNode(name, type, children, data) { + return {name: name, type: type, children: children, data: data, id: data.id}; + } + + function cancelReorder() { + navigateAway(false); + } + + function saveReorder() { + if(!$scope.isSaving) { + $scope.isSaving = true; + var results = []; findNodesToUpdate(results); + var elementsToUpdate = results.map(function(result) { + return { + id: result.node.data.id, + ownerId: result.newOwnerId, + _projectId: projectOb.id, + _refId: refOb.id + }; + }); + ElementService + .updateElements(elementsToUpdate, false) + .then(function() { cleanupCache(results); navigateAway(true); }) + .catch(function() { growl.error('Failed to save the grouping!'); }) + .finally(function() { $scope.isSaving = false; }); + } else { + growl.info("please wait"); + } + } + + function findNodesToUpdate(result) { + // ignore root + var root = $scope.tree[0]; + root.children.forEach(function(node) { + // handle node change at the root level + if ( (node.type === 'group' && node.data._parentId) || (node.type === 'view' && node.data._groupId) ) { + result.push({node: node, newOwnerId: 'holding_bin_' + projectOb.id }); + } + + // handle change at lower level + helper(node, result); + }); + + function helper(node, result) { + node.children.forEach(function (childNode) { + if ((childNode.type === 'group' && childNode.data._parentId !== node.data.id) || (childNode.type === 'view' && childNode.data._groupId !== node.data.id)) { + result.push({node: childNode, newOwnerId: node.data.id}); + } + helper(childNode, result); + }); + } + } + + function cleanupCache(results) { + // update cache for documents list and groups list + var listOfDocInCache = CacheService.get(['documents', projectOb.id, refOb.id]); + var listOfGroupInCache = CacheService.get(['groups', projectOb.id, refOb.id]); + results.forEach(function(result) { + // for group or document that is moved to the root, _parentId for "group" and _groupId for "document" need to be set to undefined + var newOwnerId = result.newOwnerId.indexOf(projectOb.id) !== -1 ? undefined : result.newOwnerId; + + if (result.node.type === 'group') { + var cacheGroupOb =_.find(listOfGroupInCache, function(groupOb) { + return groupOb.id === result.node.data.id; + }); + if (cacheGroupOb) { + cacheGroupOb._parentId = newOwnerId; + } + } else if (result.node.type === 'view') { + var cacheDocument =_.find(listOfDocInCache, function(documentOb) { + return documentOb.id === result.node.data.id; + }); + if(cacheDocument) { + cacheDocument._groupId = newOwnerId; + } + } + }); + } + + function comparator(a, b) { + if (a.type === b.type) { + return a.name.localeCompare(b.name); + } else { + if (a.type === 'group') { + return -1; + } else { + return 1; + } + } + } + + function sortRecursively(nodes) { + nodes.sort(comparator); + nodes.forEach(function (node) { + sortRecursively(node.children); + }); + } + + function navigateAway(reload) { + var curBranch = TreeService.getApi().get_selected_branch(); + if (curBranch) { + var documentId = curBranch.type === 'group' ? 'site_' + curBranch.data.id + '_cover' : curBranch.data.id; + $state.go('project.ref.preview', {documentId: documentId}, {reload: reload}); + } else { + $state.go('project.ref', {}, {reload: reload}); + } + } +}]); diff --git a/app/js/mms/controllers/tool.controller.js b/app/js/mms/controllers/tool.controller.js new file mode 100755 index 000000000..fa374debb --- /dev/null +++ b/app/js/mms/controllers/tool.controller.js @@ -0,0 +1,396 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('ToolCtrl', ['$scope', '$state', '$uibModal', '$q', '$timeout', 'hotkeys', + 'ElementService', 'ProjectService', 'growl', 'projectOb', 'refOb', 'tagObs', 'branchObs', 'documentOb', 'viewOb', 'Utils', + 'PermissionsService', 'RootScopeService', 'EventService', 'EditService', 'ToolbarService', +function($scope, $state, $uibModal, $q, $timeout, hotkeys, + ElementService, ProjectService, growl, projectOb, refOb, tagObs, branchObs, documentOb, viewOb, Utils, + PermissionsService, RootScopeService, EventService, EditService, ToolbarService) { + + const rootScopeSvc = RootScopeService; + const eventSvc = EventService; + const editSvc = EditService; + + const toolbar = ToolbarService; + eventSvc.$init($scope); + $scope.specInfo = { + refId: refOb.id, + commitId: 'latest', + projectId: projectOb.id, + id: null + }; + $scope.projectOb = projectOb; + $scope.editable = documentOb && refOb.type === 'Branch' && PermissionsService.hasBranchEditPermission(refOb); + $scope.viewOb = viewOb; + $scope.documentOb = documentOb; + $scope.refOb = refOb; + $scope.tagObs = tagObs; + $scope.branchObs = branchObs; + + if (viewOb) { + $scope.specInfo.id = viewOb.id; + $scope.viewId = viewOb.id; + } else if (documentOb) { + $scope.specInfo.id = documentOb.id; + $scope.viewId = documentOb.id; + } + + $scope.specApi = {}; + $scope.viewContentsOrderApi = {}; + + rootScopeSvc.mmsPaneClosed($scope.$pane.closed); + $scope.$watch('$pane.closed',() => { + rootScopeSvc.mmsPaneClosed($scope.$pane.closed); + }); + $scope.openEdits = editSvc.openEdits(); + $scope.subs.push(eventSvc.$on(editSvc.EVENT, function() { + $scope.openEdits = editSvc.openEdits(); + })); + $scope.edits = editSvc.getAll(); + + $scope.subs.push(eventSvc.$on('mms-pane-toggle',(paneClosed) => { + if (paneClosed === undefined) { + $scope.$pane.toggle(); + rootScopeSvc.mmsPaneClosed($scope.$pane.closed); + } + else if (paneClosed && !$scope.$pane.closed) { + $scope.$pane.toggle(); + rootScopeSvc.mmsPaneClosed($scope.$pane.closed); + } + else if (!paneClosed && $scope.$pane.closed) { + $scope.$pane.toggle(); + rootScopeSvc.mmsPaneClosed($scope.$pane.closed); + } + })); + + $scope.show = { + element: true, + history: false, + tags: false, + reorder: false + }; + $scope.tracker = {}; + + + $scope.etrackerChange = function() { + $scope.specApi.keepMode(); + var id = $scope.tracker.etrackerSelected; + if (!id) + return; + var info = id.split('|'); + $scope.specInfo.id = info[0]; + $scope.specInfo.projectId = info[1]; + $scope.specInfo.refId = info[2]; + $scope.specInfo.commitId = 'latest'; + eventSvc.$broadcast(toolbar.constants.SETPERMISSION, {id: 'element-editor', value: true}); + }; + + var showPane = function(pane) { + angular.forEach($scope.show, function(value, key) { + if (key === pane) + $scope.show[key] = true; + else + $scope.show[key] = false; + }); + }; + + // Check edit count and toggle appropriate save all and edit/edit-asterisk buttons + var cleanUpSaveAll = function() { + if (editSvc.openEdits() > 0) { + eventSvc.$broadcast(toolbar.constants.SETPERMISSION, {id: 'element-editor-saveall', value: true}); + eventSvc.$broadcast(toolbar.constants.SETICON, {id: 'element-editor', value: 'fa-edit-asterisk'}); + } else { + eventSvc.$broadcast(toolbar.constants.SETPERMISSION, {id: 'element-editor-saveall', value: false}); + eventSvc.$broadcast(toolbar.constants.SETICON, {id: 'element-editor', value: 'fa-edit'}); + } + }; + + $scope.subs.push(eventSvc.$on('element-history', function() { + showPane('history'); + })); + + $scope.subs.push(eventSvc.$on('tags', function() { + showPane('tags'); + })); + + $scope.subs.push(eventSvc.$on('gotoTagsBranches', function(){ + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'tags'}); + showPane('tags'); + })); + + var cleanUpEdit = function(editOb, cleanAll) { + if (!Utils.hasEdits(editOb) || cleanAll) { + var key = editOb.id + '|' + editOb._projectId + '|' + editOb._refId; + editSvc.remove(key); + cleanUpSaveAll(); + } + }; + + $scope.subs.push(eventSvc.$on('presentationElem.edit', function(editOb) { + var key = editOb.id + '|' + editOb._projectId + '|' + editOb._refId; + editSvc.addOrUpdate(key, editOb); + cleanUpSaveAll(); + })); + + $scope.subs.push(eventSvc.$on('presentationElem.save', function(editOb) { + cleanUpEdit(editOb, true); + })); + + $scope.subs.push(eventSvc.$on('presentationElem.cancel', function(editOb) { + cleanUpEdit(editOb); + })); + + $scope.subs.push(eventSvc.$on('elementSelected', function(data) { + let elementOb = data.elementOb; + let commitId = (data.commitId) ? data.commitId : null; + let displayOldContent = (data.displayOldContent) ? data.displayOldContent : null; + $scope.specInfo.id = elementOb.id; + $scope.specInfo.projectId = elementOb._projectId; + $scope.specInfo.refId = elementOb._refId; + $scope.specInfo.commitId = commitId ? commitId : elementOb._commitId; + $scope.specInfo.mmsDisplayOldContent = displayOldContent; + if($scope.show.element) { + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'element-viewer'}); + } + if ($scope.specApi.setEditing) { + $scope.specApi.setEditing(false); + } + var editable = $scope.refOb.type === 'Branch' && commitId === 'latest' && PermissionsService.hasBranchEditPermission($scope.refOb); + eventSvc.$broadcast(toolbar.constants.SETPERMISSION, {id: 'element-editor', value: editable}); + $scope.$apply(); + })); + + $scope.subs.push(eventSvc.$on('element-viewer', function() { + $scope.specApi.setEditing(false); + cleanUpSaveAll(); + showPane('element'); + })); + $scope.subs.push(eventSvc.$on('element-editor', function() { + $scope.specApi.setEditing(true); + showPane('element'); + var editOb = $scope.specApi.getEdits(); + if (editOb) { + var key = editOb.id + '|' + editOb._projectId + '|' + editOb._refId; + $scope.tracker.etrackerSelected = key; + editSvc.addOrUpdate(key, editOb); + cleanUpSaveAll(); + } + ElementService.isCacheOutdated(editOb) + .then(function(data) { + if (data.status && data.server._modified > data.cache._modified) + growl.error('This element has been updated on the server. Please refresh the page to get the latest version.'); + }); + })); + $scope.subs.push(eventSvc.$on('viewSelected', function(data) { + let elementOb = data.elementOb; + let commitId = (data.commitId) ? data.commitId : null; + eventSvc.$broadcast('elementSelected', {elementOb: elementOb, commitId: commitId}); + $scope.viewOb = elementOb; + var editable = $scope.refOb.type === 'Branch' && commitId === 'latest' && PermissionsService.hasBranchEditPermission($scope.refOb); + $scope.viewCommitId = commitId ? commitId : elementOb._commitId; + eventSvc.$broadcast(toolbar.constants.SETPERMISSION, {id: 'view-reorder', value: editable}); + })); + + $scope.subs.push(eventSvc.$on('view-reorder.refresh', function() { + $scope.viewContentsOrderApi.refresh(); + })); + + $scope.subs.push(eventSvc.$on('view-reorder', function() { + $scope.viewContentsOrderApi.setEditing(true); + showPane('reorder'); + })); + + var elementSaving = false; + $scope.subs.push(eventSvc.$on('element-editor-save', function() { + save(false); + })); + $scope.subs.push(eventSvc.$on('element-editor-saveC', function() { + save(true); + })); + var save = function(continueEdit) { + if (elementSaving) { + growl.info('Please Wait...'); + return; + } + var saveEdit = $scope.specApi.getEdits(); + Utils.clearAutosaveContent(saveEdit._projectId + saveEdit._refId + saveEdit.id, saveEdit.type); + elementSaving = true; + if (!continueEdit) + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'element-editor-save'}); + else + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'element-editor-saveC'}); + $timeout(function() { + $scope.specApi.save().then(function(data) { + elementSaving = false; + growl.success('Save Successful'); + if (continueEdit) + return; + var saveEdit = $scope.specApi.getEdits(); + var key = saveEdit.id + '|' + saveEdit._projectId + '|' + saveEdit._refId; + editSvc.remove(key); + if (editSvc.openEdits() > 0) { + var next = Object.keys(editSvc.getAll())[0]; + var id = next.split('|'); + $scope.tracker.etrackerSelected = next; + $scope.specApi.keepMode(); + $scope.specInfo.id = id[0]; + $scope.specInfo.projectId = id[1]; + $scope.specInfo.refId = id[2]; + $scope.specInfo.commitId = 'latest'; + } else { + $scope.specApi.setEditing(false); + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'element-viewer'}); + cleanUpSaveAll(); + } + }, function(reason) { + elementSaving = false; + if (reason.type === 'info') + growl.info(reason.message); + else if (reason.type === 'warning') + growl.warning(reason.message); + else if (reason.type === 'error') + growl.error(reason.message); + }).finally(function() { + if (!continueEdit) + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'element-editor-save'}); + else + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'element-editor-saveC'}); + }); + }, 1000, false); + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'element-editor'}); + }; + + hotkeys.bindTo($scope) + .add({ + combo: 'alt+a', + description: 'save all', + callback: function() {eventSvc.$broadcast('element-editor-saveall');} + }); + var savingAll = false; + $scope.subs.push(eventSvc.$on('element-editor-saveall', function() { + if (savingAll) { + growl.info('Please wait...'); + return; + } + if (editSvc.openEdits() === 0) { + growl.info('Nothing to save'); + return; + } + + Object.values(editSvc.getAll()).forEach(function(ve_edit) { + Utils.clearAutosaveContent(ve_edit._projectId + ve_edit._refId + ve_edit.id, ve_edit.type); + }); + + if ($scope.specApi && $scope.specApi.editorSave) + $scope.specApi.editorSave(); + savingAll = true; + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'element-editor-saveall'}); + ElementService.updateElements(Object.values(editSvc.getAll())) + .then(function(responses) { + responses.forEach(function(elementOb) { + editSvc.remove(elementOb.id + '|' + elementOb._projectId + '|' + elementOb._refId); + let data = {}; + data.element = elementOb; + data.continueEdit = false; + eventSvc.$broadcast('element.updated', data); + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'element-viewer'}); + $scope.specApi.setEditing(false); + }); + growl.success("Save All Successful"); + + }, function(responses) { + // reset the last edit elementOb to one of the existing element + var elementToSelect = Object.values(editSvc.getAll())[0]; + $scope.tracker.etrackerSelected = elementToSelect.id + '|' + elementToSelect._projectId + '|' + elementToSelect._refId; + $scope.specApi.keepMode(); + $scope.specInfo.id = elementToSelect.id; + $scope.specInfo.projectId = elementToSelect._projectId; + $scope.specInfo.refId = elementToSelect._refId; + $scope.specInfo.commitId = 'latest'; + growl.error("Some elements failed to save, resolve individually in edit pane"); + + }).finally(function() { + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'element-editor-saveall'}); + savingAll = false; + cleanUpSaveAll(); + if (editSvc.openEdits() === 0) { + eventSvc.$broadcast(toolbar.constants.SETICON, {id: 'element-editor', value: 'fa-edit'}); + } + }); + })); + $scope.subs.push(eventSvc.$on('element-editor-cancel', function() { + var go = function() { + var rmEdit = $scope.specApi.getEdits(); + editSvc.remove(rmEdit.id + '|' + rmEdit._projectId + '|' + rmEdit._refId); + $scope.specApi.revertEdits(); + if (editSvc.openEdits() > 0) { + var next = Object.keys(editSvc.getAll())[0]; + var id = next.split('|'); + $scope.tracker.etrackerSelected = next; + $scope.specApi.keepMode(); + $scope.specInfo.id = id[0]; + $scope.specInfo.projectId = id[1]; + $scope.specInfo.refId = id[2]; + $scope.specInfo.commitId = 'latest'; + } else { + $scope.specApi.setEditing(false); + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'element-viewer'}); + eventSvc.$broadcast(toolbar.constants.SETICON, {id: 'element-editor', value: 'fa-edit'}); + cleanUpSaveAll(); + } + }; + if ($scope.specApi.hasEdits()) { + var instance = $uibModal.open({ + templateUrl: 'partials/mms/cancelConfirm.html', + scope: $scope, + controller: ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) { + $scope.ok = function() { + var ve_edit = $scope.specApi.getEdits(); + Utils.clearAutosaveContent(ve_edit._projectId + ve_edit._refId + ve_edit.id, ve_edit.type); + + $uibModalInstance.close('ok'); + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }] + }); + instance.result.then(function() { + go(); + }); + } else + go(); + })); + var viewSaving = false; + $scope.subs.push(eventSvc.$on('view-reorder-save', function() { + if (viewSaving) { + growl.info('Please Wait...'); + return; + } + viewSaving = true; + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'view-reorder-save'}); + $scope.viewContentsOrderApi.save().then(function(data) { + viewSaving = false; + $scope.viewContentsOrderApi.refresh(); + growl.success('Save Succesful'); + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'view-reorder-save'}); + eventSvc.$broadcast('view.reorder.saved', {id: $scope.viewOb.id}); + }, function(response) { + $scope.viewContentsOrderApi.refresh(); + viewSaving = false; + var reason = response.failedRequests[0]; + growl.error(reason.message); + eventSvc.$broadcast(toolbar.constants.TOGGLEICONSPINNER, {id: 'view-reorder-save'}); + }); + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'view-reorder'}); + })); + $scope.subs.push(eventSvc.$on('view-reorder-cancel', function() { + $scope.specApi.setEditing(false); + $scope.viewContentsOrderApi.refresh(); + eventSvc.$broadcast(toolbar.constants.SELECT, {id: 'element-viewer'}); + showPane('element'); + })); +}]); diff --git a/app/js/mms/controllers/toolbar.controller.js b/app/js/mms/controllers/toolbar.controller.js new file mode 100755 index 000000000..548474e33 --- /dev/null +++ b/app/js/mms/controllers/toolbar.controller.js @@ -0,0 +1,65 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('ToolbarCtrl', ['$scope', '$state', 'UxService', 'refOb', 'documentOb', 'PermissionsService', + 'EditService', 'EventService', 'ToolbarService', +function($scope, $state, UxService, refOb, documentOb, PermissionsService, EditService, EventService, ToolbarService) { + + let edit = EditService; + + let eventSvc = EventService; + eventSvc.$init($scope); + + let toolbar = ToolbarService; + $scope.buttons = []; + + + + const tbInit = function() + { + let tbApi = $scope.tbApi; + tbApi.addButton(UxService.getToolbarButton("element-viewer")); + tbApi.addButton(UxService.getToolbarButton("element-editor")); + if (edit.openEdits() > 0) { + tbApi.setIcon('element-editor', 'fa-edit-asterisk'); + tbApi.setPermission('element-editor-saveall', true); + } + var editable = false; + tbApi.addButton(UxService.getToolbarButton("element-history")); + tbApi.addButton(UxService.getToolbarButton("tags")); + if ($state.includes('project.ref') && !$state.includes('project.ref.document')) { + editable = refOb.type === 'Branch' && PermissionsService.hasBranchEditPermission(refOb); + tbApi.setPermission('element-editor', editable); + if ($state.includes('project.ref.preview')) { + tbApi.addButton(UxService.getToolbarButton("view-reorder")); + tbApi.setPermission("view-reorder", editable); + } + } else if ($state.includes('project.ref.document')) { + editable = refOb.type === 'Branch' && PermissionsService.hasBranchEditPermission(refOb); + tbApi.addButton(UxService.getToolbarButton("view-reorder")); + tbApi.setPermission('element-editor', editable); + tbApi.setPermission("view-reorder", editable); + } + }; + + $scope.tbApi = ToolbarService.getApi($scope.buttons, tbInit); + + $scope.subs.push(eventSvc.$on(toolbar.constants.SETPERMISSION, (data) => { + $scope.tbApi.setPermission(data.id,data.value); + })); + + $scope.subs.push(eventSvc.$on(toolbar.constants.SETICON, (data) => { + $scope.tbApi.setIcon(data.id,data.value); + })); + + $scope.subs.push(eventSvc.$on(toolbar.constants.TOGGLEICONSPINNER, (data) => { + $scope.tbApi.toggleButtonSpinner(data.id); + })); + + $scope.subs.push(eventSvc.$on(toolbar.constants.SELECT, (data) => { + $scope.tbApi.select(data.id); + })); + +}]); \ No newline at end of file diff --git a/app/js/mms/controllers/tree.controller.js b/app/js/mms/controllers/tree.controller.js new file mode 100755 index 000000000..0794af55d --- /dev/null +++ b/app/js/mms/controllers/tree.controller.js @@ -0,0 +1,934 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') +.controller('TreeCtrl', ['$anchorScroll' , '$q', '$filter', '$location', '$uibModal', '$scope', '$state','$timeout', 'growl', + 'UxService', 'ElementService', 'UtilsService', 'ViewService', 'ProjectService', 'MmsAppUtils', 'documentOb', 'viewOb', + 'orgOb', 'projectOb', 'refOb', 'refObs', 'groupObs', 'docMeta', 'PermissionsService', 'RootScopeService', 'TreeService', + 'EventService', +function($anchorScroll, $q, $filter, $location, $uibModal, $scope, $state, $timeout, growl, + UxService, ElementService, UtilsService, ViewService, ProjectService, MmsAppUtils, documentOb, viewOb, + orgOb, projectOb, refOb, refObs, groupObs, docMeta, PermissionsService, RootScopeService, TreeService, EventService) { + + //Register with the Session Service + let rootScopeSvc = RootScopeService; + let tree = TreeService; + + let eventSvc = EventService; + eventSvc.$init($scope); + + $scope.filterInputPlaceholder = 'Filter groups/docs'; + if ($state.includes('project.ref.document')) { + $scope.filterInputPlaceholder = 'Filter table of contents'; + } + + rootScopeSvc.mmsRefOb(refOb); + + $scope.bbApi = {}; + + $scope.tbApi = {}; + + $scope.treeApi = tree.getApi(); + $scope.treeData = tree.treeData; + + if (tree.treeData.length > 0) { + tree.treeData.length = 0; + tree.treeRows.length = 0; + } + + rootScopeSvc.treePaneClosed($scope.$pane.closed); + $scope.$watch($scope.$pane.closed,() => { + rootScopeSvc.treePaneClosed($scope.$pane.closed); + }); + + $scope.subs.push(eventSvc.$on('tree-pane-toggle',(paneClosed) => { + if (paneClosed === undefined) { + $scope.$pane.toggle(); + rootScopeSvc.treePaneClosed($scope.$pane.closed); + } + else if (paneClosed && !$scope.$pane.closed) { + $scope.$pane.toggle(); + rootScopeSvc.treePaneClosed($scope.$pane.closed); + } + else if (!paneClosed && $scope.$pane.closed) { + $scope.$pane.toggle(); + rootScopeSvc.treePaneClosed($scope.$pane.closed); + } + })); + + if (rootScopeSvc.treeShowPe() === null) { + rootScopeSvc.treeShowPe(false); + } + $scope.buttons = []; + $scope.treeButtons = []; + $scope.projectOb = projectOb; + $scope.refOb = refOb; + + //rootScopeSvc.veFullDocMode(false); + if ($state.includes('project.ref.document.full')) { + rootScopeSvc.veFullDocMode(true); + } + var docEditable = documentOb && refOb && refOb.type === 'Branch' && UtilsService.isView(documentOb) && PermissionsService.hasBranchEditPermission(refOb); + + $scope.tbApi.init = function() { + if ($state.includes('project.ref.document')) { + var viewModeButton = UxService.getButtonBarButton("view-mode-dropdown"); + $scope.tbApi.addButton(viewModeButton); + $scope.tbApi.select(viewModeButton, rootScopeSvc.treeShowPe() ? UxService.getButtonBarButton('tree-show-pe') : UxService.getButtonBarButton('tree-show-views')); + } + }; + + $scope.bbApi.init = function() { + $scope.bbApi.addButton(UxService.getButtonBarButton("tree-expand")); + $scope.bbApi.addButton(UxService.getButtonBarButton("tree-collapse")); + if ($state.includes('project.ref') && !$state.includes('project.ref.document')) { + //$scope.bbApi.addButton(UxService.getButtonBarButton("tree-reorder-group")); + //$scope.bbApi.setPermission("tree-reorder-group", projectOb && PermissionsService.hasProjectEditPermission(projectOb)); + //$scope.bbApi.addButton(UxService.getButtonBarButton("tree-add-document-or-group")); + //$scope.bbApi.addButton(UxService.getButtonBarButton("tree-delete-document")); + //$scope.bbApi.setPermission( "tree-add-document-or-group", (refOb.type === 'Tag' ? false : true) && PermissionsService.hasBranchEditPermission(refOb) ); + //$scope.bbApi.setPermission( "tree-delete-document", (refOb.type === 'Tag' ? false : true) && PermissionsService.hasBranchEditPermission(refOb) ); + } else if ($state.includes('project.ref.document')) { + //$scope.bbApi.addButton(UxService.getButtonBarButton("tree-reorder-view")); + $scope.bbApi.addButton(UxService.getButtonBarButton("tree-full-document")); + //$scope.bbApi.addButton(UxService.getButtonBarButton("tree-add-view")); + //$scope.bbApi.addButton(UxService.getButtonBarButton("tree-delete-view")); + //$scope.bbApi.setPermission("tree-add-view", docEditable); + //$scope.bbApi.setPermission("tree-reorder-view", docEditable); + //$scope.bbApi.setPermission("tree-delete-view", docEditable); + if (rootScopeSvc.veFullDocMode()) { + $scope.bbApi.setToggleState('tree-full-document', true); + } + } + }; + + $scope.subs.push(eventSvc.$on('tree-expand', function () { + $scope.treeApi.expand_all(); + })); + + $scope.subs.push(eventSvc.$on('tree-collapse', function () { + $scope.treeApi.collapse_all(); + })); + + $scope.subs.push(eventSvc.$on('tree-add-document', function () { + addItem('Document'); + })); + + $scope.subs.push(eventSvc.$on('tree-delete-document', function () { + $scope.deleteItem(); + })); + + $scope.subs.push(eventSvc.$on('tree-add-view', function () { + addItem('View'); + })); + + $scope.subs.push(eventSvc.$on('tree-delete', function () { + $scope.deleteItem(); + })); + + $scope.subs.push(eventSvc.$on('tree-delete-view', function () { + $scope.deleteItem(function (deleteBranch) { + eventSvc.$broadcast('mms-full-doc-view-deleted', deleteBranch); + }); + })); + + $scope.subs.push(eventSvc.$on('tree-reorder-view', function () { + rootScopeSvc.veFullDocMode(false); + $scope.bbApi.setToggleState("tree-full-document", false); + $state.go('project.ref.document.order', {search: undefined}); + })); + + $scope.subs.push(eventSvc.$on('tree-reorder-group', function () { + $state.go('project.ref.groupReorder'); + })); + + $scope.subs.push(eventSvc.$on('tree-add-group', function () { + addItem('Group'); + })); + + $scope.subs.push(eventSvc.$on('tree-show-pe', function () { + toggle('showTree'); + rootScopeSvc.treeShowPe(true); + setPeVisibility(viewId2node[documentOb.id]); + $scope.treeApi.refresh(); + })); + + $scope.subs.push(eventSvc.$on('tree-show-views', function () { + toggle('showTree'); + rootScopeSvc.treeShowPe(false); + setPeVisibility(viewId2node[documentOb.id]); + $scope.treeApi.refresh(); + })); + + $scope.tableList = []; + $scope.figureList = []; + $scope.equationList = []; + $scope.treeViewModes = [{ + id: 'table', + title: 'Tables', + icon: 'fa-table', + branchList: $scope.tableList + }, { + id: 'figure', + title: 'Figures', + icon: 'fa-image', + branchList: $scope.figureList + }, { + id: 'equation', + title: 'Equations', + icon: 'fa-superscript', + branchList: $scope.equationList + }]; + + var toggle = function (id) { + $scope.activeMenu = id; + }; + // Set active tree view to tree + toggle('showTree'); + + $scope.subs.push(eventSvc.$on('tree-show-tables', function () { + toggle('table'); + })); + $scope.subs.push(eventSvc.$on('tree-show-figures', function () { + toggle('figure'); + })); + $scope.subs.push(eventSvc.$on('tree-show-equations', function () { + toggle('equation'); + })); + + // Get a list of specific PE type from branch + function getPeTreeList(branch, type, list) { + if (branch.type === type) { + list.push(branch); + } + for (var i = 0; i < branch.children.length; i++) { + getPeTreeList(branch.children[i], type, list); + } + } + + // Function to refresh table and figure list when new item added, deleted or reordered + function resetPeTreeList(elemType) { + if (elemType == 'table' || elemType == 'all') { + $scope.tableList.length = 0; + getPeTreeList(viewId2node[documentOb.id], 'table', $scope.tableList); + } + if (elemType == 'figure' || elemType == 'image' || elemType == 'all') { + $scope.figureList.length = 0; + getPeTreeList(viewId2node[documentOb.id], 'figure', $scope.figureList); + } + if (elemType == 'equation' || elemType == 'all') { + $scope.equationList.length = 0; + getPeTreeList(viewId2node[documentOb.id], 'equation', $scope.equationList); + } + } + + $scope.subs.push(eventSvc.$on('tree-full-document', function () { + $scope.fullDocMode(); + })); + + var groupLevel2Func = function (groupOb, groupNode) { + groupNode.loading = true; + ViewService.getProjectDocuments({ + projectId: projectOb.id, + refId: refOb.id + }, 2).then(function (documentObs) { + var docs = []; + var docOb, i; + for (i = 0; i < documentObs.length; i++) { + docOb = documentObs[i]; + if (docOb._groupId === groupOb.id) { + docs.push(docOb); + } + } + for (i = 0; i < docs.length; i++) { + docOb = docs[i]; + groupNode.children.unshift({ + label: docOb.name, + type: refOb.type === 'Branch' ? 'view' : 'snapshot', + data: docOb, + group: groupOb, + children: [] + }); + } + groupNode.loading = false; + if ($scope.treeApi.initialSelect) { + $scope.treeApi.initialSelect(); + } + }); + }; + + var viewId2node = {}; + var seenViewIds = {}; + var handleSingleView = function (v, aggr) { + var curNode = viewId2node[v.id]; + if (!curNode) { + curNode = { + label: v.name, + type: 'view', + data: v, + children: [], + loading: true, + aggr: aggr + }; + viewId2node[v.id] = curNode; + } + return curNode; + }; + var handleChildren = function (curNode, childNodes) { + var newChildNodes = []; + var node; + for (var i = 0; i < childNodes.length; i++) { + node = childNodes[i]; + if (seenViewIds[node.data.id]) { + growl.error("Warning: View " + node.data.name + " have multiple parents! Duplicates not shown."); + continue; + } + seenViewIds[node.data.id] = node; + newChildNodes.push(node); + } + curNode.children.push.apply(curNode.children, newChildNodes); + curNode.loading = false; + if ($scope.treeApi.refresh) { + $scope.treeApi.refresh(); + } + }; + var processDeletedViewBranch = function (branch) { + var id = branch.data.id; + if (seenViewIds[id]) { + delete seenViewIds[id]; + } + if (viewId2node[id]) { + delete viewId2node[id]; + } + for (var i = 0; i < branch.children.length; i++) { + processDeletedViewBranch(branch.children[i]); + } + }; + if ($state.includes('project.ref') && !$state.includes('project.ref.document')) { + //TODO: Evaluate putting this directly into session service as opposed to handing down + $scope.treeData.push(...UtilsService.buildTreeHierarchy(groupObs, "id", "group", "_parentId", groupLevel2Func)); + ViewService.getProjectDocuments({ + projectId: projectOb.id, + refId: refOb.id + }, 2).then(function (documentObs) { + for (var i = 0; i < documentObs.length; i++) { + if (!documentObs[i]._groupId || documentObs[i]._groupId == projectOb.id) { + $scope.treeData.push({ + label: documentObs[i].name, + type: 'view', + data: documentObs[i], + children: [] + }); + } + } + if ($scope.treeApi.initialSelect) { + $scope.treeApi.initialSelect(); + } + }); + } else { + if (!documentOb._childViews) { + documentOb._childViews = []; + } + MmsAppUtils.handleChildViews(documentOb, 'composite', undefined, projectOb.id, refOb.id, handleSingleView, handleChildren) + .then(function (node) { + var bulkGet = []; + for (var i in viewId2node) { + var view = viewId2node[i].data; + if (view._contents && view._contents.operand) { + for (var j = 0; j < view._contents.operand.length; j++) { + bulkGet.push(view._contents.operand[j].instanceId); + } + } + } + ElementService.getElements({ + elementIds: bulkGet, + projectId: projectOb.id, + refId: refOb.id + }, 0).finally(function () { + for (var i in viewId2node) { + addSectionElements(viewId2node[i].data, viewId2node[i], viewId2node[i], true); + } + $scope.treeApi.refresh(); + }); + }, function (reason) { + console.log(reason); + }); + $scope.treeData.push(viewId2node[documentOb.id]); + } + + function addSectionElements(element, viewNode, parentNode, initial) { + var contents = null; + + var addContentsSectionTreeNode = function (operand) { + var bulkGet = []; + var i = 0; + for (i = 0; i < operand.length; i++) { + bulkGet.push(operand[i].instanceId); + } + ElementService.getElements({ + elementIds: bulkGet, + projectId: projectOb.id, + refId: refOb.id, + }, 0).then(function (ignore) { + var instances = []; + for (var i = 0; i < operand.length; i++) { + instances.push(ElementService.getElement({ + projectId: projectOb.id, + refId: refOb.id, + elementId: operand[i].instanceId, + }, 0)); + } + $q.all(instances).then(function (results) { + var k = results.length - 1; + for (; k >= 0; k--) { + var instance = results[k]; + var hide = !rootScopeSvc.treeShowPe(); + if (ViewService.isSection(instance)) { + var sectionTreeNode = { + label: instance.name, + type: "section", + viewId: viewNode.data.id, + data: instance, + children: [] + }; + viewId2node[instance.id] = sectionTreeNode; + parentNode.children.unshift(sectionTreeNode); + addSectionElements(instance, viewNode, sectionTreeNode, initial); + } else if (ViewService.getTreeType(instance)) { + var otherTreeNode = { + label: instance.name, + type: ViewService.getTreeType(instance), + viewId: viewNode.data.id, + data: instance, + hide: hide, + children: [] + }; + parentNode.children.unshift(otherTreeNode); + } + } + $scope.treeApi.refresh(); + if (initial) { + $scope.treeApi.initialSelect(); + } + resetPeTreeList('all'); + }, function (reason) { + //view is bad + }); + }, function (reason) { + }); + }; + + if (element._contents) { + contents = element._contents; + } else if (ViewService.isSection(element) && element.specification) { + contents = element.specification; // For Sections, the contents expression is the specification + } else { + //bad? + } + if (contents && contents.operand) { + addContentsSectionTreeNode(contents.operand); + } + } + + var treeClickHandler = function (branch) { + if ($state.includes('project.ref') && !$state.includes('project.ref.document')) { + if (branch.type === 'group') { + $state.go('project.ref.preview', { + documentId: 'site_' + branch.data.id + '_cover', + search: undefined + }); + } else if (branch.type === 'view' || branch.type === 'snapshot') { + $state.go('project.ref.preview', {documentId: branch.data.id, search: undefined}); + } + } else if ($state.includes('project.ref.document')) { + var viewId = (branch.type !== 'view') ? branch.viewId : branch.data.id; + // var sectionId = branch.type === 'section' ? branch.data.id : null; + var hash = branch.data.id; + if (rootScopeSvc.veFullDocMode()) { + eventSvc.$broadcast('mms-tree-click', branch); + } else if (branch.type === 'view' || branch.type === 'section') { + $state.go('project.ref.document.view', {viewId: branch.data.id, search: undefined}); + } else { + $state.go('project.ref.document.view', {viewId: viewId, search: undefined}); + $timeout(function () { + $location.hash(hash); + $anchorScroll(); + }, 1000, false); + } + } + }; + + var treeDblclickHandler = function (branch) { + if ($state.includes('project.ref') && !$state.includes('project.ref.document')) { + if (branch.type === 'group') + $scope.treeApi.expand_branch(branch); + else if (branch.type === 'view' || branch.type === 'snapshot') { + $state.go('project.ref.document', {documentId: branch.data.id, search: undefined}); + } + } else if ($state.includes('project.ref.document')) { + $scope.treeApi.expand_branch(branch); + } + }; + + + + $scope.treeOptions = { + types: UxService.getTreeTypes(), + sectionNumbering: $state.includes('project.ref.document') ? true : false, + numberingDepth: 0, + numberingSeparator: '.', + expandLevel: $state.includes('project.ref.document') ? 3 : ($state.includes('project.ref') ? 0 : 1), + search: '', + onSelect: 'tree-click', + onDblclick: 'tree-double-click', + sort: !$state.includes('project.ref.document') + }; + if (documentOb && docMeta) { + $scope.treeOptions.numberingDepth = docMeta.numberingDepth; + $scope.treeOptions.numberingSeparator = docMeta.numberingSeparator; + $scope.treeOptions.startChapter = documentOb._startChapter; + } + + rootScopeSvc.treeOptions($scope.treeOptions); + + $scope.subs.push(eventSvc.$on($scope.treeOptions.onDblclick, (args) => { + treeDblclickHandler(args.branch); + })); + + $scope.subs.push(eventSvc.$on($scope.treeOptions.onSelect, (args) => { + treeClickHandler(args.branch); + })); + + $scope.fullDocMode = function () { + if (rootScopeSvc.veFullDocMode()) { + rootScopeSvc.veFullDocMode(false); + $scope.bbApi.setToggleState("tree-full-document", false); + var curBranch = $scope.treeApi.get_selected_branch(); + if (curBranch) { + var viewId; + if (curBranch.type !== 'view') { + if (curBranch.type === 'section' && curBranch.data.type === 'InstanceSpecification') { + viewId = curBranch.data.id; + } else { + viewId = curBranch.viewId; + } + } else { + viewId = curBranch.data.id; + } + $state.go('project.ref.document.view', {viewId: viewId, search: undefined}); + } + } else { + rootScopeSvc.veFullDocMode(true); + $scope.bbApi.setToggleState("tree-full-document", true); + $state.go('project.ref.document.full', {search: undefined}); + } + }; + + var addItem = function (itemType) { + $scope.itemType = itemType; + $scope.newViewAggr = {type: 'shared'}; + var branch = $scope.treeApi.get_selected_branch(); + var templateUrlStr = ""; + var newBranchType = ""; + + if (itemType === 'Document') { + if (!branch) { + $scope.parentBranchData = {id: "holding_bin_" + projectOb.id}; + } else if (branch.type !== 'group') { + growl.warning("Select a group to add document under"); + return; + } else { + $scope.parentBranchData = branch.data; + } + templateUrlStr = 'partials/mms/new-doc-or-group.html'; + newBranchType = 'view'; + } else if (itemType === 'Group') { + if (branch && branch.type === 'group') { + $scope.parentBranchData = branch.data; + } else { + $scope.parentBranchData = {id: "holding_bin_" + projectOb.id}; + // Always create group at root level if the selected branch is not a group branch + branch = null; + } + templateUrlStr = 'partials/mms/new-doc-or-group.html'; + newBranchType = 'group'; + } else if (itemType === 'View') { + if (!branch) { + growl.warning("Add View Error: Select parent view first"); + return; + } else if (branch.type === "section") { + growl.warning("Add View Error: Cannot add a child view to a section"); + return; + } else if (branch.aggr === 'none') { + growl.warning("Add View Error: Cannot add a child view to a non-owned and non-shared view."); + return; + } + $scope.parentBranchData = branch.data; + templateUrlStr = 'partials/mms/new-view.html'; + newBranchType = 'view'; + } else { + growl.error("Add Item of Type " + itemType + " is not supported"); + return; + } + // Adds the branch: + var instance = $uibModal.open({ + templateUrl: templateUrlStr, + scope: $scope, + controller: ['$scope', '$uibModalInstance', '$filter', addItemCtrl] + }); + instance.result.then(function (data) { + if (!rootScopeSvc.veEditMode()) { + $timeout(function () { + $('.show-edits').click(); + }, 0, false); + } + var newbranch = { + label: data.name, + type: newBranchType, + data: data, + children: [] + }; + var top = itemType === 'Group' ? true : false; + $scope.treeApi.add_branch(branch, newbranch, top); + + var addToFullDocView = function (node, curSection, prevSysml) { + var lastChild = prevSysml; + if (node.children) { + var num = 1; + for (var i = 0; i < node.children.length; i++) { + var cNode = node.children[i]; + var data = { + vId: cNode.data.id, + curSec: curSection + '.' + num, + prevSibId: lastChild + }; + eventSvc.$broadcast('mms-new-view-added', data); + lastChild = addToFullDocView(cNode, curSection + '.' + num, cNode.data.id); + num = num + 1; + } + } + return lastChild; + }; + + if (itemType === 'View') { + viewId2node[data.id] = newbranch; + seenViewIds[data.id] = newbranch; + newbranch.aggr = $scope.newViewAggr.type; + var curNum = branch.children[branch.children.length - 1].section; + var prevBranch = $scope.treeApi.get_prev_branch(newbranch); + while (prevBranch.type !== 'view') { + prevBranch = $scope.treeApi.get_prev_branch(prevBranch); + } + MmsAppUtils.handleChildViews(data, $scope.newViewAggr.type, undefined, projectOb.id, refOb.id, handleSingleView, handleChildren) + .then(function (node) { + // handle full doc mode + if (rootScopeSvc.veFullDocMode()) { + addToFullDocView(node, curNum, newbranch.data.id); + } + addViewSectionsRecursivelyForNode(node); + }); + if (!rootScopeSvc.veFullDocMode()) { + $state.go('project.ref.document.view', {viewId: data.id, search: undefined}); + } else { + if (prevBranch) { + eventSvc.$broadcast('mms-new-view-added', {vId: data.id, curSec: curNum, prevSibId: prevBranch.data.id}); + } else { + eventSvc.$broadcast('mms-new-view-added', {vId: data.id, curSec: curNum, prevSibId: branch.data.id}); + } + } + } + }); + }; + + var addItemCtrl = function ($scope, $uibModalInstance) { + $scope.createForm = true; + $scope.oking = false; + $scope.projectOb = projectOb; + $scope.refOb = refOb; + var displayName = ""; + + if ($scope.itemType === 'Document') { + $scope.newDoc = {name: ''}; + displayName = "Document"; + } else if ($scope.itemType === 'View') { + $scope.newView = {name: ''}; + displayName = "View"; + } else if ($scope.itemType === 'Group') { + $scope.newGroup = {name: ''}; + displayName = "Group"; + } else { + growl.error("Add Item of Type " + $scope.itemType + " is not supported"); + return; + } + + var addExistingView = function (view) { + var viewId = view.id; + if (seenViewIds[viewId]) { + growl.error("Error: View " + view.name + " is already in this document."); + return; + } + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = true; + ViewService.addViewToParentView({ + parentViewId: $scope.parentBranchData.id, + viewId: viewId, + projectId: $scope.parentBranchData._projectId, + refId: $scope.parentBranchData._refId, + aggr: $scope.newViewAggr.type + }).then(function (data) { + ElementService.getElement({ + elementId: viewId, + projectId: view._projectId, + refId: view._refId + }, 2, false) + .then(function (realView) { + $uibModalInstance.close(realView); + }, function () { + $uibModalInstance.close(view); + }).finally(function () { + growl.success("View Added"); + }); + }, function (reason) { + growl.error("View Add Error: " + reason.message); + }).finally(function () { + $scope.oking = false; + }); + }; + + + var queryFilter = function () { + var obj = {}; + obj.terms = {'_appliedStereotypeIds': [UtilsService.VIEW_SID, UtilsService.DOCUMENT_SID].concat(UtilsService.OTHER_VIEW_SID)}; + return obj; + }; + + $scope.searchOptions = { + callback: addExistingView, + itemsPerPage: 200, + filterQueryList: [queryFilter], + hideFilterOptions: true + }; + + $scope.ok = function () { + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = true; + var promise; + + // Item specific promise: //TODO branch and tags + if ($scope.itemType === 'Document') { + promise = ViewService.createDocument({ + _projectId: projectOb.id, + _refId: refOb.id, + id: $scope.parentBranchData.id + }, { + viewName: $scope.newDoc.name, + isDoc: true + }); + } else if ($scope.itemType === 'View') { + $scope.newViewAggr.type = "composite"; + promise = ViewService.createView($scope.parentBranchData, { + viewName: $scope.newView.name + }); + } else if ($scope.itemType === 'Group') { + promise = ViewService.createGroup($scope.newGroup.name, + { + _projectId: projectOb.id, + _refId: refOb.id, + id: $scope.parentBranchData.id + }, orgOb.id + ); + } else { + growl.error("Add Item of Type " + $scope.itemType + " is not supported"); + $scope.oking = false; + return; + } + + promise.then(function (data) { + growl.success(displayName + " Created"); + if ($scope.itemType === 'Tag') { + growl.info('Please wait for a completion email prior to viewing of the tag.'); + } + $uibModalInstance.close(data); + }, function (reason) { + growl.error("Create " + displayName + " Error: " + reason.message); + }).finally(function () { + $scope.oking = false; + }); + }; + + $scope.cancel = function () { + $uibModalInstance.dismiss(); + }; + }; + + $scope.deleteItem = function (cb) { + var branch = $scope.treeApi.get_selected_branch(); + if (!branch) { + growl.warning("Select item to remove."); + return; + } + var type = ViewService.getElementType(branch.data); + if ($state.includes('project.ref.document')) { + if (type == 'Document') { + growl.warning("Cannot remove a document from this view. To remove this item, go to project home."); + return; + } + if (branch.type !== 'view' || (!UtilsService.isView(branch.data))) { + growl.warning("Cannot remove non-view item. To remove this item, open it in the center pane."); + return; + } + } + + // when in project.ref state, allow deletion for view/document/group + if ($state.includes('project.ref') && !$state.includes('project.ref.document')) { + if (branch.type !== 'view' && !UtilsService.isDocument(branch.data) && (branch.type !== 'group' || branch.children.length > 0)) { + growl.warning("Cannot remove group with contents. Empty contents and try again."); + return; + } + } + $scope.deleteBranch = branch; + var instance = $uibModal.open({ + templateUrl: 'partials/mms/confirmRemove.html', + scope: $scope, + controller: ['$scope', '$uibModalInstance', deleteCtrl] + }); + instance.result.then(function (data) { + $scope.treeApi.remove_branch(branch); + if ($state.includes('project.ref.document') && branch.type === 'view') { + processDeletedViewBranch(branch); + } + if (rootScopeSvc.veFullDocMode()) { + cb(branch); + } else { + $scope.treeApi.clear_selected_branch(); + $state.go('^', {search: undefined}); + } + }); + }; + + // TODO: Make this a generic delete controller + var deleteCtrl = function ($scope, $uibModalInstance) { + var branch = $scope.deleteBranch; + $scope.oking = false; + $scope.type = branch.type; + if (UtilsService.isDocument(branch.data)) { + $scope.type = 'Document'; + } + $scope.name = branch.data.name; + $scope.ok = function () { + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = true; + var promise = null; + if (branch.type === 'view') { + var parentBranch = $scope.treeApi.get_parent_branch(branch); + if (!$state.includes('project.ref.document')) { + promise = ViewService.downgradeDocument(branch.data); + } else { + promise = ViewService.removeViewFromParentView({ + projectId: parentBranch.data._projectId, + refId: parentBranch.data._refId, + parentViewId: parentBranch.data.id, + viewId: branch.data.id + }); + } + } else if (branch.type === 'group') { + promise = ViewService.removeGroup(branch.data); + } + + if (promise) { + promise.then(function (data) { + growl.success($scope.type + " Removed"); + $uibModalInstance.close('ok'); + }, function (reason) { + growl.error($scope.type + ' Removal Error: ' + reason.message); + }).finally(function () { + $scope.oking = false; + }); + } else { + $scope.oking = false; + $uibModalInstance.dismiss(); + } + }; + $scope.cancel = function () { + $uibModalInstance.dismiss(); + }; + }; + + function addViewSections(view) { + var node = viewId2node[view.id]; + addSectionElements(view, node, node); + } + + function addViewSectionsRecursivelyForNode(node) { + addViewSections(node.data); + for (var i = 0; i < node.children.length; i++) { + if (node.children[i].type === 'view') { + addViewSectionsRecursivelyForNode(node.children[i]); + } + } + } + + function setPeVisibility(branch) { + if (branch.type === 'figure' || branch.type === 'table' || branch.type === 'equation') { + branch.hide = !rootScopeSvc.treeShowPe(); + } + for (var i = 0; i < branch.children.length; i++) { + setPeVisibility(branch.children[i]); + } + } + + // Utils creates this event when deleting instances from the view + $scope.subs.push(eventSvc.$on('viewctrl.delete.element', function (elementData) { + var branch = $scope.treeApi.get_branch(elementData); + if (branch) { + $scope.treeApi.remove_single_branch(branch); + } + resetPeTreeList(branch.type); + })); + + $scope.subs.push(eventSvc.$on('view.reorder.saved', function (data) { + var node = viewId2node[data.id]; + var viewNode = node; + var newChildren = []; + for (var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + if (child.type === 'view') { + newChildren.push(child); + } + } + node.children = newChildren; + if (node.type === 'section') { + viewNode = viewId2node[node.view]; + if (!viewNode) { + viewNode = node; + } + } + addSectionElements(node.data, viewNode, node); + })); + + //TODO refresh table and fig list when new item added, deleted or reordered + $scope.user_clicks_branch = function (branch) { + $scope.treeApi.user_clicks_branch(branch); + }; + + $scope.searchInputChangeHandler = function () { + if ($scope.treeOptions.search === '') { + $scope.treeApi.collapse_all(); + $scope.treeApi.expandPathToSelectedBranch(); + } else { + // expand all branches so that the filter works correctly + $scope.treeApi.expand_all(); + } + }; + +}]); diff --git a/app/js/mms/controllers/view.controller.js b/app/js/mms/controllers/view.controller.js new file mode 100755 index 000000000..1a50625fb --- /dev/null +++ b/app/js/mms/controllers/view.controller.js @@ -0,0 +1,284 @@ +'use strict'; + +/* Controllers */ + +angular.module('mmsApp') + .controller('ViewCtrl', ['$scope', '$state', '$timeout', '$window', '$location', + '$http', '$element', 'growl', 'hotkeys', 'MmsAppUtils', 'UxService', 'URLService', 'UtilsService', + 'ShortenUrlService', 'Utils', 'search', 'orgOb', 'projectOb', 'refOb', 'groupOb', 'documentOb', 'viewOb', + 'PermissionsService', 'RootScopeService', 'TreeService', 'EventService', + function($scope, $state, $timeout, $window, $location, $http, + $element, growl, hotkeys, MmsAppUtils, UxService, URLService, UtilsService, ShortenUrlService, Utils, + search, orgOb, projectOb, refOb, groupOb, documentOb, viewOb, PermissionsService, RootScopeService, + TreeService, EventService) { + + let rootScopeSvc = RootScopeService; + let tree = TreeService.getApi(); + + let eventSvc = EventService; + eventSvc.$init($scope); + + function isPageLoading() { + if ($element.find('.isLoading').length > 0) { + growl.warning("Still loading!"); + return true; + } + return false; + } + + $scope.vidLink = false; //whether to have go to document link + if ($state.includes('project.ref.preview') && viewOb && viewOb.id.indexOf('_cover') < 0) { + $scope.vidLink = true; + } + + $scope.ve_viewContentLoading = false; + $scope.subs.push(eventSvc.$on(rootScopeSvc.constants.VEVIEWCONTENTLOADING, (newValue) => { + $scope.ve_viewContentLoading = newValue; + })); + + rootScopeSvc.veFullDocMode(false); + if (!rootScopeSvc.veCommentsOn()) + rootScopeSvc.veCommentsOn(false); + if (!rootScopeSvc.veElementsOn()) + rootScopeSvc.veElementsOn(false); + if (!rootScopeSvc.veEditMode()) + rootScopeSvc.veEditMode(false); + + $scope.search = search; + Utils.toggleLeftPane(search); + $scope.viewOb = viewOb; + $scope.projectOb = projectOb; + $scope.refOb = refOb; + + $scope.buttons = []; + $scope.viewApi = { + init: function() { + if (rootScopeSvc.veCommentsOn()) { + $scope.viewApi.toggleShowComments(); + } + if (rootScopeSvc.veElementsOn()) { + $scope.viewApi.toggleShowElements(); + } + if (rootScopeSvc.veEditMode()) { + $scope.viewApi.toggleShowEdits(); + } + }, + elementTranscluded: function(elementOb, type) { + if (type === 'Comment' && !$scope.comments.map.hasOwnProperty(elementOb.id)) { + $scope.comments.map[elementOb.id] = elementOb; + $scope.comments.count++; + if (elementOb._modified > $scope.comments.lastCommented) { + $scope.comments.lastCommented = elementOb._modified; + $scope.comments.lastCommentedBy = elementOb._modifier; + } + } + }, + elementClicked: function(elementOb) { + let data = { + elementOb: elementOb, + commitId: 'latest' + }; + eventSvc.$broadcast('elementSelected', data); + } + }; + $scope.comments = { + count: 0, + lastCommented: '', + lastCommentedBy: '', + map: {} + }; + + $scope.docLibLink = ''; + if (groupOb !== null) { + $scope.docLibLink = groupOb._link; + } else if (documentOb !== null && documentOb._groupId !== undefined && documentOb._groupId !== null) { + $scope.docLibLink = '/share/page/repository#filter=path|/Sites/' + orgOb.id + '/documentLibrary/' + + projectOb.id + '/' + documentOb._groupId; + } else { + $scope.docLibLink = '/share/page/repository#filter=path|/Sites/' + orgOb.id + '/documentLibrary/' + + projectOb.id; + } + + $scope.bbApi = { + init: function() { + if (viewOb && refOb.type === 'Branch' && PermissionsService.hasBranchEditPermission(refOb)) { + $scope.bbApi.addButton(UxService.getButtonBarButton('show-edits')); + $scope.bbApi.setToggleState('show-edits', rootScopeSvc.veEditMode()); + hotkeys.bindTo($scope) + .add({ + combo: 'alt+d', + description: 'toggle edit mode', + callback: function() {eventSvc.$broadcast('show-edits');} + }); + } + $scope.bbApi.addButton(UxService.getButtonBarButton('show-elements')); + $scope.bbApi.setToggleState('show-elements', rootScopeSvc.veElementsOn()); + $scope.bbApi.addButton(UxService.getButtonBarButton('show-comments')); + $scope.bbApi.setToggleState('show-comments', rootScopeSvc.veCommentsOn()); + + // Set hotkeys for toolbar + hotkeys.bindTo($scope) + .add({ + combo: 'alt+c', + description: 'toggle show comments', + callback: function() {eventSvc.$broadcast('show-comments');} + }).add({ + combo: 'alt+e', + description: 'toggle show elements', + callback: function() {eventSvc.$broadcast('show-elements');} + }); + + if ($state.includes('project.ref.preview') || $state.includes('project.ref.document')) { + $scope.bbApi.addButton(UxService.getButtonBarButton('refresh-numbering')); + // $scope.bbApi.addButton(UxService.getButtonBarButton('share-url')); + $scope.bbApi.addButton(UxService.getButtonBarButton('print')); + if ($state.includes('project.ref.document')) { + var exportButtons = UxService.getButtonBarButton('export'); + exportButtons.dropdown_buttons.push(UxService.getButtonBarButton("convert-pdf")); + $scope.bbApi.addButton(exportButtons); + $scope.bbApi.addButton(UxService.getButtonBarButton('center-previous')); + $scope.bbApi.addButton(UxService.getButtonBarButton('center-next')); + // Set hotkeys for toolbar + hotkeys.bindTo($scope) + .add({ + combo: 'alt+.', + description: 'next', + callback: function() {eventSvc.$broadcast('center-next');} + }).add({ + combo: 'alt+,', + description: 'previous', + callback: function() {eventSvc.$broadcast('center-previous');} + }); + } else { + $scope.bbApi.addButton(UxService.getButtonBarButton('export')); + } + } + } + }; + + $scope.subs.push(eventSvc.$on('show-comments', function() { + $scope.viewApi.toggleShowComments(); + $scope.bbApi.toggleButtonState('show-comments'); + rootScopeSvc.veCommentsOn(!rootScopeSvc.veCommentsOn()); + })); + + $scope.subs.push(eventSvc.$on('show-elements', function() { + $scope.viewApi.toggleShowElements(); + $scope.bbApi.toggleButtonState('show-elements'); + rootScopeSvc.veElementsOn(!rootScopeSvc.veElementsOn()); + })); + + $scope.subs.push(eventSvc.$on('show-edits', function() { + if( (rootScopeSvc.veElementsOn() && rootScopeSvc.veEditMode()) || (!rootScopeSvc.veElementsOn() && !rootScopeSvc.veEditMode()) ){ + $scope.viewApi.toggleShowElements(); + $scope.bbApi.toggleButtonState('show-elements'); + rootScopeSvc.veElementsOn(!rootScopeSvc.veElementsOn()); + } + $scope.viewApi.toggleShowEdits(); + $scope.bbApi.toggleButtonState('show-edits'); + rootScopeSvc.veEditMode(!rootScopeSvc.veEditMode()); + })); + + $scope.subs.push(eventSvc.$on('center-previous', function() { + var prev = tree.get_prev_branch(tree.get_selected_branch()); + if (!prev) + return; + while (prev.type !== 'view' && prev.type !== 'section') { + prev = tree.get_prev_branch(prev); + if (!prev) + return; + } + $scope.bbApi.toggleButtonSpinner('center-previous'); + tree.select_branch(prev); + $scope.bbApi.toggleButtonSpinner('center-previous'); + })); + + $scope.subs.push(eventSvc.$on('center-next', function() { + var next = tree.get_next_branch(tree.get_selected_branch()); + if (!next) + return; + while (next.type !== 'view' && next.type !== 'section') { + next = tree.get_next_branch(next); + if (!next) + return; + } + $scope.bbApi.toggleButtonSpinner('center-next'); + tree.select_branch(next); + $scope.bbApi.toggleButtonSpinner('center-next'); + })); + + // Share URL button settings + $scope.dynamicPopover = ShortenUrlService.dynamicPopover; + $scope.copyToClipboard = ShortenUrlService.copyToClipboard; + $scope.handleShareURL = ShortenUrlService.getShortUrl.bind(null, $location.absUrl(), $scope); + + if (viewOb && $state.includes('project.ref')) { + $timeout(function() { + let data = { + elementOb: viewOb, + commitId: 'latest' + }; + eventSvc.$broadcast('viewSelected', data); + }, 1000); + } + + $scope.searchOptions = { + emptyDocTxt: 'This field is empty.', + searchInput: search, + getProperties: true, + closeable: true, + callback: function(elementOb) { + let data = { + elementOb: elementOb, + commitId: 'latest' + }; + eventSvc.$broadcast('elementSelected', data); + if (typeof rootScopeSvc.mmsPaneClosed() === 'boolean' && rootScopeSvc.mmsPaneClosed()) + eventSvc.$broadcast('mms-pane-toggle', false); + }, + relatedCallback: function (doc, view, elem) {//siteId, documentId, viewId) { + $state.go('project.ref.document.view', {projectId: doc._projectId, documentId: doc.id, viewId: view.id, refId: doc._refId, search: undefined}); + } + }; + + $scope.subs.push(eventSvc.$on('convert-pdf', function() { + if (isPageLoading()) + return; + MmsAppUtils.printModal(viewOb, refOb, false, 3) + .then(function(ob) { + // growl.info('Exporting as PDF file. Please wait for a completion email.',{ttl: -1}); + }, function(reason){ + //growl.error("Exporting as PDF file Failed: " + reason.message); + }); + })); + + $scope.subs.push(eventSvc.$on('print', function() { + if (isPageLoading()) + return; + MmsAppUtils.printModal(viewOb, refOb, false, 1); + })); + + $scope.subs.push(eventSvc.$on('word', function() { + if (isPageLoading()) + return; + MmsAppUtils.printModal(viewOb, refOb, false, 2) + .then(function(ob) { + //growl.info('Exporting as Word file. Please wait for a completion email.',{ttl: -1}); + }, function(reason){ + //growl.error("Exporting as Word file Failed: " + reason.message); + }); + })); + + $scope.subs.push(eventSvc.$on('tabletocsv', function() { + if (isPageLoading()) + return; + MmsAppUtils.tableToCsv(false); + })); + + $scope.subs.push(eventSvc.$on('refresh-numbering', function() { + if (isPageLoading()) + return; + var printElementCopy = angular.element("#print-div"); + MmsAppUtils.refreshNumbering(tree.get_rows(), printElementCopy); + })); +}]); diff --git a/app/js/mms/directives/runXlr.js b/app/js/mms/directives/runXlr.js new file mode 100755 index 000000000..7bae4eafa --- /dev/null +++ b/app/js/mms/directives/runXlr.js @@ -0,0 +1,93 @@ +'use strict'; + +angular.module('mmsApp') + .directive('runXlr', ['$http', '$uibModal', '$window', 'growl', 'ApplicationService', runXlr]); + +function runXlr($http, $uibModal, $window, growl, ApplicationService) { + return { + template: '', + scope: { + templateId: '@', + xlrTaskName: '@', + xlrReleaseName: '@' + }, + controller: ['$scope', runXlrCtrl], + link: runXlrLink + }; + function runXlrLink(scope, element, attrs, ctrls) {} + + function runXlrCtrl($scope) { + var modalOpen = false; + $scope.xlrTaskName = $scope.xlrTaskName ? $scope.xlrTaskName : 'Sync FN to JPL Network'; + $scope.runXLR = runXLR; + function runXLR() { + + modalOpen = true; + $uibModal.open({ + template: '', + scope: $scope, + backdrop: 'static', + controller: ['$scope', '$uibModalInstance', function ($scope, $uibModalInstance) { + $scope.credentials = { + username: '', + password: '' + }; + $scope.spin = false; + + function make_base_auth(user, password) { + var tok = user + ':' + password; + var hash = $window.btoa(tok); + return "Basic " + hash; + } + $scope.login = function (credentials) { + $scope.spin = true; + var baseAuth = make_base_auth(credentials.username, credentials.password); + var email = credentials.username + '@jpl.nasa.gov'; + var postBody = { + "releaseTitle": $scope.xlrReleaseName ? $scope.xlrReleaseName : "CAE Portal Sync", + "releaseVariables": { + "contentEditor": credentials.username, + "editorEmail": email + }, + "autoStart": true + }; + + var link = "/xlrapi/v1/templates/Applications/" + $scope.templateId + "/create"; + var config = { + method: 'POST', + url: link, + headers: { + 'Authorization': baseAuth, + "Content-Type": "application/json", + "cache-control": "no-cache", + }, + "data": postBody, + "withCredentials": true, + "async": true, + "crossDomain": true, + "processData": false + }; + $http(config).then(function() { + growl.success($scope.xlrTaskName + ' is running. You will receive a completion email'); + }, function(error){ + growl.error($scope.xlrTaskName + ' has failed.'); + }).finally(function() { + $scope.spin = false; + modalOpen = false; + $uibModalInstance.dismiss(); + }); + }; + }], + size: 'md' + }).result.finally(function(){ + modalOpen = false; + }); + + } + + } +} diff --git a/app/js/mms/directives/veFooter.js b/app/js/mms/directives/veFooter.js new file mode 100755 index 000000000..6466e2435 --- /dev/null +++ b/app/js/mms/directives/veFooter.js @@ -0,0 +1,17 @@ +'use strict'; + +angular.module('mmsApp').directive('veFooter', [ '$templateCache', veFooter]); + +function veFooter($templateCache) { + var template = $templateCache.get('partials/mms/veFooter.html'); + + var veFooterLink = function(scope) { + scope.ve_footer = scope.footer; + }; + + + return { + template: template, + link: veFooterLink + }; +} \ No newline at end of file diff --git a/app/js/mms/directives/veMenu.js b/app/js/mms/directives/veMenu.js new file mode 100755 index 000000000..b90cc80e4 --- /dev/null +++ b/app/js/mms/directives/veMenu.js @@ -0,0 +1,153 @@ +'use strict'; + +angular.module('mmsApp') +.directive('veMenu', ['CacheService','$state','$templateCache','$sce', '$timeout', 'UtilsService',veMenu]); + +/** + * @ngdoc directive + * @name mmsApp.directive:veMenu + * + * @requires mms.CacheService + * @requires $state + * @requires $templateCache + * @requires $sce + * + * @restrict E + * + * @description + * veMenu is responsible for gathering all breadcrumbs for current view and + * displaying breadcrumbs accordingly. Breadcrumb list is truncated to + * to fit window width. + * veMenu is also repsonsible for gathering and displaying all projects, branches + * and tags for selected view. + * + */ +function veMenu(CacheService, $state, $templateCache, $sce, $timeout, UtilsService) { + var template = $templateCache.get('partials/mms/veMenu.html'); + + var veMenuLink = function(scope, element, attrs) { + scope.getHrefForProject = getHrefForProject; + scope.getHrefForBranch = getHrefForBranch; + scope.getHrefForTag = getHrefForTag; + scope.htmlTooltip = $sce.trustAsHtml('Branch temporarily unavailable during duplication.'); + scope.currentProject = scope.projects.filter((e) => {return e.id === scope.project.id; })[0].name; + + if (scope.ref) { + scope.currentRef = scope.ref; + if (scope.ref.type === 'Branch') { + scope.currentBranch = scope.branch.name; + } else if (scope.ref.type === 'Tag') { + scope.currentTag = scope.tag.name; + } + } + + scope.updateProject = function(project) { + if (project) { + $state.go('project.ref', {projectId: project.id, refId: 'master', search: undefined}, {reload: true}); + } + }; + scope.updateBranch = function(branch) { + if (branch.status != 'creating') { + $state.go($state.current.name, {projectId: scope.project.id, refId: branch.id, search: undefined}, {reload: true}); + } + }; + scope.updateTag = function(tag) { + if (tag.status != 'creating') { + $state.go($state.current.name, {projectId: scope.project.id, refId: tag.id, search: undefined}, {reload: true}); + } + }; + scope.refsView = function() { + $state.go('project', {projectId: scope.project.id}, {reload: true}); + }; + scope.isRefsView = function() { + if ( $state.includes('project') && !($state.includes('project.ref')) ) { + return true; + } else { + return false; + } + }; + + var bcrumbs = []; + var child, parentId; + var groups = scope.groups; + var groupsMap = {}; + if (scope.group !== undefined) { + for (var i = 0; i < groups.length; i++) { + groupsMap[groups[i].id] = {id: groups[i].id, name: groups[i].name, parentId: groups[i]._parentId}; + } + child = scope.group; + } + if (scope.document !== undefined) { + child = scope.document; + } + if (child) { + if (child.type === 'Package') {//child.hasOwnProperty('_id')) { + bcrumbs.push({name: child.name, id: child.id, type: "group", alfLink: child._link, link: "project.ref.preview({documentId: 'site_' + breadcrumb.id + '_cover', search: undefined})"}); + if(child._parentId) { + parentId = child._parentId; + } + } else { + bcrumbs.push({name: child.name, id: child.id, type: "doc", link: "project.ref.document({documentId: breadcrumb.id, search: undefined})"}); + if(child._groupId) { + parentId = child._groupId; + } + } + if (parentId) { + while(groupsMap[parentId] !== undefined) { + var id = groupsMap[parentId].id; + bcrumbs.push({name: groupsMap[id].name, id: id, type: "group", link: "project.ref.preview({documentId: 'site_' + breadcrumb.id + '_cover', search: undefined})"}); + parentId = groupsMap[id].parentId; + } + } + scope.breadcrumbs = bcrumbs.reverse(); + $timeout(function() { + var eltChildren = element.children().children(); + var eltWidth = element.parent().width() - eltChildren[0].scrollWidth - eltChildren[2].scrollWidth; + var crumbcount = scope.breadcrumbs.length; + var liWidth = (eltWidth * 0.85)/crumbcount; + scope.truncateStyle = {'max-width': liWidth, 'white-space': 'nowrap', 'overflow': 'hidden', 'text-overflow': 'ellipsis', 'display': 'inline-block'}; + }); + } + + function getHrefForProject(project) { + var refId = project._refId || 'master'; + return UtilsService.PROJECT_URL_PREFIX + project.id + '/' + refId; + } + + function getHrefForBranch(branch) { + var res = UtilsService.PROJECT_URL_PREFIX + scope.project.id + '/' + branch.id; + if (scope.document) { + res += '/documents/' + scope.document.id; + } + if (scope.view) { + res += '/views/' + scope.view.id; + } + return res; + } + + function getHrefForTag(tag) { + return getHrefForBranch(tag); + } + }; + + return { + restrict: 'E', + template: template, + scope: { + org: ' 0) { + $scope.selectProject(data[0]); + } else { + //no projects + } + }); + } + }; + $scope.selectProject = function(project) { + if(project) { + projectId = project.id; + $scope.selectedProject = project.name; + } + }; + $scope.spin = false; + $scope.continue = function() { + if(orgId && projectId) { + // was the same project selected? cancel... + if ($scope.$parent.project.orgId === orgId && + $scope.$parent.project.id === projectId) { + $scope.cancel(); + } + else { + $scope.spin = true; + $state.go('project.ref', {orgId: orgId, projectId: projectId, refId: 'master', search: undefined}).then(function(data) { + }, function(reject) { + $scope.spin = false; + }); + } + } + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }] + }); + }; + scope.toggleHelp = function() { + hotkeys.toggleCheatSheet(); + }; + scope.toggleAbout = function() { + if ($window.__env.version) { + scope.veV = window.__env.version; + } + else { + scope.veV = '3.6.1'; + } + + scope.mmsV = 'Loading...'; + ApplicationService.getMmsVersion().then(function(data) { + scope.mmsV = data; + }, function(reason) { + scope.mmsV = "Could not retrieve due to failure: " + reason.message; + }); + $uibModal.open({ + templateUrl: 'partials/mms/about.html', + scope: scope, + controller: ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) { + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }] + }); + }; + scope.logout = function() { + AuthService.logout().then(function() { + $state.go('login'); + }, function() { + growl.error('You were not logged out'); + }); + }; + + scope.searchClass = ""; + scope.search = function(searchText) { + if ($state.includes('project.ref.document.order')) { + growl.warning("Please finish reorder action first."); + return; + // } else if ($state.includes('project.diff')) { + // growl.warning("Please finish diff action first."); + // return; + } else { + if ($state.params.search === searchText) + return; + scope.searchClass = "fa fa-spin fa-spinner"; + $state.go($state.current.name, {search: searchText}); + } + }; + scope.stagingView = function(){ //changing to something "opencae"? + var hostName = $location.host(); + var address = "https://uatlinkhere"; + if (hostName !== 'localhost' && hostName.split('.')[0].substr(-3) !== 'uat') + address = 'https://' + hostName.split('.')[0] + '-uat.jpl.nasa.gov'; + // TODO (jk) - Move branding into config. + address = "https://mms.openmbee.org"; + window.open(address ,'_blank'); + }; + AuthService.checkLogin().then(function(data) { + scope.username = data.username; + AuthService.getUserData(data.username).then(function(userData){ + scope.user = userData.users[0]; + }, function() { + scope.user = data.username; + }); + }); + + }; + + return { + restrict: 'E', + template: template, + scope: { + title: ' 11)]; + }, + M: function M(date, locale) { + return monthToStr(date.getMonth(), true, locale); + }, + S: function S(date) { + return pad(date.getSeconds()); + }, + U: function U(date) { + return date.getTime() / 1000; + }, + W: function W(date, _, options) { + return options.getWeek(date); + }, + Y: function Y(date) { + return date.getFullYear(); + }, + d: function d(date) { + return pad(date.getDate()); + }, + h: function h(date) { + return date.getHours() % 12 ? date.getHours() % 12 : 12; + }, + i: function i(date) { + return pad(date.getMinutes()); + }, + j: function j(date) { + return date.getDate(); + }, + l: function l(date, locale) { + return locale.weekdays.longhand[date.getDay()]; + }, + m: function m(date) { + return pad(date.getMonth() + 1); + }, + n: function n(date) { + return date.getMonth() + 1; + }, + s: function s(date) { + return date.getSeconds(); + }, + w: function w(date) { + return date.getDay(); + }, + y: function y(date) { + return String(date.getFullYear()).substring(2); + } + }; + + var english = { + weekdays: { + shorthand: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + longhand: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] + }, + months: { + shorthand: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + longhand: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"] + }, + daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], + firstDayOfWeek: 0, + ordinal: function ordinal(nth) { + var s = nth % 100; + if (s > 3 && s < 21) return "th"; + + switch (s % 10) { + case 1: + return "st"; + + case 2: + return "nd"; + + case 3: + return "rd"; + + default: + return "th"; + } + }, + rangeSeparator: " to ", + weekAbbreviation: "Wk", + scrollTitle: "Scroll to increment", + toggleTitle: "Click to toggle", + amPM: ["AM", "PM"], + yearAriaLabel: "Year" + }; + + var createDateFormatter = function createDateFormatter(_ref) { + var _ref$config = _ref.config, + config = _ref$config === void 0 ? defaults : _ref$config, + _ref$l10n = _ref.l10n, + l10n = _ref$l10n === void 0 ? english : _ref$l10n; + return function (dateObj, frmt, overrideLocale) { + var locale = overrideLocale || l10n; + + if (config.formatDate !== undefined) { + return config.formatDate(dateObj, frmt, locale); + } + + return frmt.split("").map(function (c, i, arr) { + return formats[c] && arr[i - 1] !== "\\" ? formats[c](dateObj, locale, config) : c !== "\\" ? c : ""; + }).join(""); + }; + }; + var createDateParser = function createDateParser(_ref2) { + var _ref2$config = _ref2.config, + config = _ref2$config === void 0 ? defaults : _ref2$config, + _ref2$l10n = _ref2.l10n, + l10n = _ref2$l10n === void 0 ? english : _ref2$l10n; + return function (date, givenFormat, timeless, customLocale) { + if (date !== 0 && !date) return undefined; + var locale = customLocale || l10n; + var parsedDate; + var date_orig = date; + if (date instanceof Date) parsedDate = new Date(date.getTime());else if (typeof date !== "string" && date.toFixed !== undefined) parsedDate = new Date(date);else if (typeof date === "string") { + var format = givenFormat || (config || defaults).dateFormat; + var datestr = String(date).trim(); + + if (datestr === "today") { + parsedDate = new Date(); + timeless = true; + } else if (/Z$/.test(datestr) || /GMT$/.test(datestr)) parsedDate = new Date(date);else if (config && config.parseDate) parsedDate = config.parseDate(date, format);else { + parsedDate = !config || !config.noCalendar ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0) : new Date(new Date().setHours(0, 0, 0, 0)); + var matched, + ops = []; + + for (var i = 0, matchIndex = 0, regexStr = ""; i < format.length; i++) { + var token = format[i]; + var isBackSlash = token === "\\"; + var escaped = format[i - 1] === "\\" || isBackSlash; + + if (tokenRegex[token] && !escaped) { + regexStr += tokenRegex[token]; + var match = new RegExp(regexStr).exec(date); + + if (match && (matched = true)) { + ops[token !== "Y" ? "push" : "unshift"]({ + fn: revFormat[token], + val: match[++matchIndex] + }); + } + } else if (!isBackSlash) regexStr += "."; + + ops.forEach(function (_ref3) { + var fn = _ref3.fn, + val = _ref3.val; + return parsedDate = fn(parsedDate, val, locale) || parsedDate; + }); + } + + parsedDate = matched ? parsedDate : undefined; + } + } + + if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) { + config.errorHandler(new Error("Invalid date provided: " + date_orig)); + return undefined; + } + + if (timeless === true) parsedDate.setHours(0, 0, 0, 0); + return parsedDate; + }; + }; + function compareDates(date1, date2, timeless) { + if (timeless === void 0) { + timeless = true; + } + + if (timeless !== false) { + return new Date(date1.getTime()).setHours(0, 0, 0, 0) - new Date(date2.getTime()).setHours(0, 0, 0, 0); + } + + return date1.getTime() - date2.getTime(); + } + var getWeek = function getWeek(givenDate) { + var date = new Date(givenDate.getTime()); + date.setHours(0, 0, 0, 0); + date.setDate(date.getDate() + 3 - (date.getDay() + 6) % 7); + var week1 = new Date(date.getFullYear(), 0, 4); + return 1 + Math.round(((date.getTime() - week1.getTime()) / 86400000 - 3 + (week1.getDay() + 6) % 7) / 7); + }; + var isBetween = function isBetween(ts, ts1, ts2) { + return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2); + }; + var duration = { + DAY: 86400000 + }; + + var HOOKS = ["onChange", "onClose", "onDayCreate", "onDestroy", "onKeyDown", "onMonthChange", "onOpen", "onParseConfig", "onReady", "onValueUpdate", "onYearChange", "onPreCalendarPosition"]; + var defaults = { + _disable: [], + _enable: [], + allowInput: false, + altFormat: "F j, Y", + altInput: false, + altInputClass: "form-control input", + animate: typeof window === "object" && window.navigator.userAgent.indexOf("MSIE") === -1, + ariaDateFormat: "F j, Y", + clickOpens: true, + closeOnSelect: true, + conjunction: ", ", + dateFormat: "Y-m-d", + defaultHour: 12, + defaultMinute: 0, + defaultSeconds: 0, + disable: [], + disableMobile: false, + enable: [], + enableSeconds: false, + enableTime: false, + errorHandler: function errorHandler(err) { + return typeof console !== "undefined" && console.warn(err); + }, + getWeek: getWeek, + hourIncrement: 1, + ignoredFocusElements: [], + inline: false, + locale: "default", + minuteIncrement: 5, + mode: "single", + nextArrow: "", + noCalendar: false, + now: new Date(), + onChange: [], + onClose: [], + onDayCreate: [], + onDestroy: [], + onKeyDown: [], + onMonthChange: [], + onOpen: [], + onParseConfig: [], + onReady: [], + onValueUpdate: [], + onYearChange: [], + onPreCalendarPosition: [], + plugins: [], + position: "auto", + positionElement: undefined, + prevArrow: "", + shorthandCurrentMonth: false, + showMonths: 1, + static: false, + time_24hr: false, + weekNumbers: false, + wrap: false + }; + + function toggleClass(elem, className, bool) { + if (bool === true) return elem.classList.add(className); + elem.classList.remove(className); + } + function createElement(tag, className, content) { + var e = window.document.createElement(tag); + className = className || ""; + content = content || ""; + e.className = className; + if (content !== undefined) e.textContent = content; + return e; + } + function clearNode(node) { + while (node.firstChild) { + node.removeChild(node.firstChild); + } + } + function findParent(node, condition) { + if (condition(node)) return node;else if (node.parentNode) return findParent(node.parentNode, condition); + return undefined; + } + function createNumberInput(inputClassName, opts) { + var wrapper = createElement("div", "numInputWrapper"), + numInput = createElement("input", "numInput " + inputClassName), + arrowUp = createElement("span", "arrowUp"), + arrowDown = createElement("span", "arrowDown"); + numInput.type = "text"; + numInput.pattern = "\\d*"; + if (opts !== undefined) for (var key in opts) { + numInput.setAttribute(key, opts[key]); + } + wrapper.appendChild(numInput); + wrapper.appendChild(arrowUp); + wrapper.appendChild(arrowDown); + return wrapper; + } + + if (typeof Object.assign !== "function") { + Object.assign = function (target) { + if (!target) { + throw TypeError("Cannot convert undefined or null to object"); + } + + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + + var _loop = function _loop() { + var source = args[_i]; + + if (source) { + Object.keys(source).forEach(function (key) { + return target[key] = source[key]; + }); + } + }; + + for (var _i = 0; _i < args.length; _i++) { + _loop(); + } + + return target; + }; + } + + var DEBOUNCED_CHANGE_MS = 300; + + function FlatpickrInstance(element, instanceConfig) { + var self = { + config: Object.assign({}, flatpickr.defaultConfig), + l10n: english + }; + self.parseDate = createDateParser({ + config: self.config, + l10n: self.l10n + }); + self._handlers = []; + self._bind = bind; + self._setHoursFromDate = setHoursFromDate; + self._positionCalendar = positionCalendar; + self.changeMonth = changeMonth; + self.changeYear = changeYear; + self.clear = clear; + self.close = close; + self._createElement = createElement; + self.destroy = destroy; + self.isEnabled = isEnabled; + self.jumpToDate = jumpToDate; + self.open = open; + self.redraw = redraw; + self.set = set; + self.setDate = setDate; + self.toggle = toggle; + + function setupHelperFunctions() { + self.utils = { + getDaysInMonth: function getDaysInMonth(month, yr) { + if (month === void 0) { + month = self.currentMonth; + } + + if (yr === void 0) { + yr = self.currentYear; + } + + if (month === 1 && (yr % 4 === 0 && yr % 100 !== 0 || yr % 400 === 0)) return 29; + return self.l10n.daysInMonth[month]; + } + }; + } + + function init() { + self.element = self.input = element; + self.isOpen = false; + parseConfig(); + setupLocale(); + setupInputs(); + setupDates(); + setupHelperFunctions(); + if (!self.isMobile) build(); + bindEvents(); + + if (self.selectedDates.length || self.config.noCalendar) { + if (self.config.enableTime) { + setHoursFromDate(self.config.noCalendar ? self.latestSelectedDateObj || self.config.minDate : undefined); + } + + updateValue(false); + } + + setCalendarWidth(); + self.showTimeInput = self.selectedDates.length > 0 || self.config.noCalendar; + var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent); + + if (!self.isMobile && isSafari) { + positionCalendar(); + } + + triggerEvent("onReady"); + } + + function bindToInstance(fn) { + return fn.bind(self); + } + + function setCalendarWidth() { + var config = self.config; + if (config.weekNumbers === false && config.showMonths === 1) return;else if (config.noCalendar !== true) { + window.requestAnimationFrame(function () { + self.calendarContainer.style.visibility = "hidden"; + self.calendarContainer.style.display = "block"; + + if (self.daysContainer !== undefined) { + var daysWidth = (self.days.offsetWidth + 1) * config.showMonths; + self.daysContainer.style.width = daysWidth + "px"; + self.calendarContainer.style.width = daysWidth + (self.weekWrapper !== undefined ? self.weekWrapper.offsetWidth : 0) + "px"; + self.calendarContainer.style.removeProperty("visibility"); + self.calendarContainer.style.removeProperty("display"); + } + }); + } + } + + function updateTime(e) { + if (self.selectedDates.length === 0) return; + + if (e !== undefined && e.type !== "blur") { + timeWrapper(e); + } + + var prevValue = self._input.value; + setHoursFromInputs(); + updateValue(); + + if (self._input.value !== prevValue) { + self._debouncedChange(); + } + } + + function ampm2military(hour, amPM) { + return hour % 12 + 12 * int(amPM === self.l10n.amPM[1]); + } + + function military2ampm(hour) { + switch (hour % 24) { + case 0: + case 12: + return 12; + + default: + return hour % 12; + } + } + + function setHoursFromInputs() { + if (self.hourElement === undefined || self.minuteElement === undefined) return; + var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, + minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, + seconds = self.secondElement !== undefined ? (parseInt(self.secondElement.value, 10) || 0) % 60 : 0; + + if (self.amPM !== undefined) { + hours = ampm2military(hours, self.amPM.textContent); + } + + var limitMinHours = self.config.minTime !== undefined || self.config.minDate && self.minDateHasTime && self.latestSelectedDateObj && compareDates(self.latestSelectedDateObj, self.config.minDate, true) === 0; + var limitMaxHours = self.config.maxTime !== undefined || self.config.maxDate && self.maxDateHasTime && self.latestSelectedDateObj && compareDates(self.latestSelectedDateObj, self.config.maxDate, true) === 0; + + if (limitMaxHours) { + var maxTime = self.config.maxTime !== undefined ? self.config.maxTime : self.config.maxDate; + hours = Math.min(hours, maxTime.getHours()); + if (hours === maxTime.getHours()) minutes = Math.min(minutes, maxTime.getMinutes()); + if (minutes === maxTime.getMinutes()) seconds = Math.min(seconds, maxTime.getSeconds()); + } + + if (limitMinHours) { + var minTime = self.config.minTime !== undefined ? self.config.minTime : self.config.minDate; + hours = Math.max(hours, minTime.getHours()); + if (hours === minTime.getHours()) minutes = Math.max(minutes, minTime.getMinutes()); + if (minutes === minTime.getMinutes()) seconds = Math.max(seconds, minTime.getSeconds()); + } + + setHours(hours, minutes, seconds); + } + + function setHoursFromDate(dateObj) { + var date = dateObj || self.latestSelectedDateObj; + if (date) setHours(date.getHours(), date.getMinutes(), date.getSeconds()); + } + + function setDefaultHours() { + var hours = self.config.defaultHour; + var minutes = self.config.defaultMinute; + var seconds = self.config.defaultSeconds; + + if (self.config.minDate !== undefined) { + var min_hr = self.config.minDate.getHours(); + var min_minutes = self.config.minDate.getMinutes(); + hours = Math.max(hours, min_hr); + if (hours === min_hr) minutes = Math.max(min_minutes, minutes); + if (hours === min_hr && minutes === min_minutes) seconds = self.config.minDate.getSeconds(); + } + + if (self.config.maxDate !== undefined) { + var max_hr = self.config.maxDate.getHours(); + var max_minutes = self.config.maxDate.getMinutes(); + hours = Math.min(hours, max_hr); + if (hours === max_hr) minutes = Math.min(max_minutes, minutes); + if (hours === max_hr && minutes === max_minutes) seconds = self.config.maxDate.getSeconds(); + } + + setHours(hours, minutes, seconds); + } + + function setHours(hours, minutes, seconds) { + if (self.latestSelectedDateObj !== undefined) { + self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0); + } + + if (!self.hourElement || !self.minuteElement || self.isMobile) return; + self.hourElement.value = pad(!self.config.time_24hr ? (12 + hours) % 12 + 12 * int(hours % 12 === 0) : hours); + self.minuteElement.value = pad(minutes); + if (self.amPM !== undefined) self.amPM.textContent = self.l10n.amPM[int(hours >= 12)]; + if (self.secondElement !== undefined) self.secondElement.value = pad(seconds); + } + + function onYearInput(event) { + var year = parseInt(event.target.value) + (event.delta || 0); + + if (year / 1000 > 1 || event.key === "Enter" && !/[^\d]/.test(year.toString())) { + changeYear(year); + } + } + + function bind(element, event, handler, options) { + if (event instanceof Array) return event.forEach(function (ev) { + return bind(element, ev, handler, options); + }); + if (element instanceof Array) return element.forEach(function (el) { + return bind(el, event, handler, options); + }); + element.addEventListener(event, handler, options); + + self._handlers.push({ + element: element, + event: event, + handler: handler, + options: options + }); + } + + function onClick(handler) { + return function (evt) { + evt.which === 1 && handler(evt); + }; + } + + function triggerChange() { + triggerEvent("onChange"); + } + + function bindEvents() { + if (self.config.wrap) { + ["open", "close", "toggle", "clear"].forEach(function (evt) { + Array.prototype.forEach.call(self.element.querySelectorAll("[data-" + evt + "]"), function (el) { + return bind(el, "click", self[evt]); + }); + }); + } + + if (self.isMobile) { + setupMobile(); + return; + } + + var debouncedResize = debounce(onResize, 50); + self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS); + if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent)) bind(self.daysContainer, "mouseover", function (e) { + if (self.config.mode === "range") onMouseOver(e.target); + }); + bind(window.document.body, "keydown", onKeyDown); + if (!self.config.static) bind(self._input, "keydown", onKeyDown); + if (!self.config.inline && !self.config.static) bind(window, "resize", debouncedResize); + if (window.ontouchstart !== undefined) bind(window.document, "click", documentClick);else bind(window.document, "mousedown", onClick(documentClick)); + bind(window.document, "focus", documentClick, { + capture: true + }); + + if (self.config.clickOpens === true) { + bind(self._input, "focus", self.open); + bind(self._input, "mousedown", onClick(self.open)); + } + + if (self.daysContainer !== undefined) { + bind(self.monthNav, "mousedown", onClick(onMonthNavClick)); + bind(self.monthNav, ["keyup", "increment"], onYearInput); + bind(self.daysContainer, "mousedown", onClick(selectDate)); + } + + if (self.timeContainer !== undefined && self.minuteElement !== undefined && self.hourElement !== undefined) { + var selText = function selText(e) { + return e.target.select(); + }; + + bind(self.timeContainer, ["increment"], updateTime); + bind(self.timeContainer, "blur", updateTime, { + capture: true + }); + bind(self.timeContainer, "mousedown", onClick(timeIncrement)); + bind([self.hourElement, self.minuteElement], ["focus", "click"], selText); + if (self.secondElement !== undefined) bind(self.secondElement, "focus", function () { + return self.secondElement && self.secondElement.select(); + }); + + if (self.amPM !== undefined) { + bind(self.amPM, "mousedown", onClick(function (e) { + updateTime(e); + triggerChange(); + })); + } + } + } + + function jumpToDate(jumpDate) { + var jumpTo = jumpDate !== undefined ? self.parseDate(jumpDate) : self.latestSelectedDateObj || (self.config.minDate && self.config.minDate > self.now ? self.config.minDate : self.config.maxDate && self.config.maxDate < self.now ? self.config.maxDate : self.now); + + try { + if (jumpTo !== undefined) { + self.currentYear = jumpTo.getFullYear(); + self.currentMonth = jumpTo.getMonth(); + } + } catch (e) { + e.message = "Invalid date supplied: " + jumpTo; + self.config.errorHandler(e); + } + + self.redraw(); + } + + function timeIncrement(e) { + if (~e.target.className.indexOf("arrow")) incrementNumInput(e, e.target.classList.contains("arrowUp") ? 1 : -1); + } + + function incrementNumInput(e, delta, inputElem) { + var target = e && e.target; + var input = inputElem || target && target.parentNode && target.parentNode.firstChild; + var event = createEvent("increment"); + event.delta = delta; + input && input.dispatchEvent(event); + } + + function build() { + var fragment = window.document.createDocumentFragment(); + self.calendarContainer = createElement("div", "flatpickr-calendar"); + self.calendarContainer.tabIndex = -1; + + if (!self.config.noCalendar) { + fragment.appendChild(buildMonthNav()); + self.innerContainer = createElement("div", "flatpickr-innerContainer"); + + if (self.config.weekNumbers) { + var _buildWeeks = buildWeeks(), + weekWrapper = _buildWeeks.weekWrapper, + weekNumbers = _buildWeeks.weekNumbers; + + self.innerContainer.appendChild(weekWrapper); + self.weekNumbers = weekNumbers; + self.weekWrapper = weekWrapper; + } + + self.rContainer = createElement("div", "flatpickr-rContainer"); + self.rContainer.appendChild(buildWeekdays()); + + if (!self.daysContainer) { + self.daysContainer = createElement("div", "flatpickr-days"); + self.daysContainer.tabIndex = -1; + } + + buildDays(); + self.rContainer.appendChild(self.daysContainer); + self.innerContainer.appendChild(self.rContainer); + fragment.appendChild(self.innerContainer); + } + + if (self.config.enableTime) { + fragment.appendChild(buildTime()); + } + + toggleClass(self.calendarContainer, "rangeMode", self.config.mode === "range"); + toggleClass(self.calendarContainer, "animate", self.config.animate === true); + toggleClass(self.calendarContainer, "multiMonth", self.config.showMonths > 1); + self.calendarContainer.appendChild(fragment); + var customAppend = self.config.appendTo !== undefined && self.config.appendTo.nodeType !== undefined; + + if (self.config.inline || self.config.static) { + self.calendarContainer.classList.add(self.config.inline ? "inline" : "static"); + + if (self.config.inline) { + if (!customAppend && self.element.parentNode) self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);else if (self.config.appendTo !== undefined) self.config.appendTo.appendChild(self.calendarContainer); + } + + if (self.config.static) { + var wrapper = createElement("div", "flatpickr-wrapper"); + if (self.element.parentNode) self.element.parentNode.insertBefore(wrapper, self.element); + wrapper.appendChild(self.element); + if (self.altInput) wrapper.appendChild(self.altInput); + wrapper.appendChild(self.calendarContainer); + } + } + + if (!self.config.static && !self.config.inline) (self.config.appendTo !== undefined ? self.config.appendTo : window.document.body).appendChild(self.calendarContainer); + } + + function createDay(className, date, dayNumber, i) { + var dateIsEnabled = isEnabled(date, true), + dayElement = createElement("span", "flatpickr-day " + className, date.getDate().toString()); + dayElement.dateObj = date; + dayElement.$i = i; + dayElement.setAttribute("aria-label", self.formatDate(date, self.config.ariaDateFormat)); + + if (className.indexOf("hidden") === -1 && compareDates(date, self.now) === 0) { + self.todayDateElem = dayElement; + dayElement.classList.add("today"); + dayElement.setAttribute("aria-current", "date"); + } + + if (dateIsEnabled) { + dayElement.tabIndex = -1; + + if (isDateSelected(date)) { + dayElement.classList.add("selected"); + self.selectedDateElem = dayElement; + + if (self.config.mode === "range") { + toggleClass(dayElement, "startRange", self.selectedDates[0] && compareDates(date, self.selectedDates[0], true) === 0); + toggleClass(dayElement, "endRange", self.selectedDates[1] && compareDates(date, self.selectedDates[1], true) === 0); + if (className === "nextMonthDay") dayElement.classList.add("inRange"); + } + } + } else { + dayElement.classList.add("disabled"); + } + + if (self.config.mode === "range") { + if (isDateInRange(date) && !isDateSelected(date)) dayElement.classList.add("inRange"); + } + + if (self.weekNumbers && self.config.showMonths === 1 && className !== "prevMonthDay" && dayNumber % 7 === 1) { + self.weekNumbers.insertAdjacentHTML("beforeend", "" + self.config.getWeek(date) + ""); + } + + triggerEvent("onDayCreate", dayElement); + return dayElement; + } + + function focusOnDayElem(targetNode) { + targetNode.focus(); + if (self.config.mode === "range") onMouseOver(targetNode); + } + + function getFirstAvailableDay(delta) { + var startMonth = delta > 0 ? 0 : self.config.showMonths - 1; + var endMonth = delta > 0 ? self.config.showMonths : -1; + + for (var m = startMonth; m != endMonth; m += delta) { + var month = self.daysContainer.children[m]; + var startIndex = delta > 0 ? 0 : month.children.length - 1; + var endIndex = delta > 0 ? month.children.length : -1; + + for (var i = startIndex; i != endIndex; i += delta) { + var c = month.children[i]; + if (c.className.indexOf("hidden") === -1 && isEnabled(c.dateObj)) return c; + } + } + + return undefined; + } + + function getNextAvailableDay(current, delta) { + var givenMonth = current.className.indexOf("Month") === -1 ? current.dateObj.getMonth() : self.currentMonth; + var endMonth = delta > 0 ? self.config.showMonths : -1; + var loopDelta = delta > 0 ? 1 : -1; + + for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) { + var month = self.daysContainer.children[m]; + var startIndex = givenMonth - self.currentMonth === m ? current.$i + delta : delta < 0 ? month.children.length - 1 : 0; + var numMonthDays = month.children.length; + + for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) { + var c = month.children[i]; + if (c.className.indexOf("hidden") === -1 && isEnabled(c.dateObj) && Math.abs(current.$i - i) >= Math.abs(delta)) return focusOnDayElem(c); + } + } + + self.changeMonth(loopDelta); + focusOnDay(getFirstAvailableDay(loopDelta), 0); + return undefined; + } + + function focusOnDay(current, offset) { + var dayFocused = isInView(document.activeElement || document.body); + var startElem = current !== undefined ? current : dayFocused ? document.activeElement : self.selectedDateElem !== undefined && isInView(self.selectedDateElem) ? self.selectedDateElem : self.todayDateElem !== undefined && isInView(self.todayDateElem) ? self.todayDateElem : getFirstAvailableDay(offset > 0 ? 1 : -1); + if (startElem === undefined) return self._input.focus(); + if (!dayFocused) return focusOnDayElem(startElem); + getNextAvailableDay(startElem, offset); + } + + function buildMonthDays(year, month) { + var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7; + var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12); + var daysInMonth = self.utils.getDaysInMonth(month), + days = window.document.createDocumentFragment(), + isMultiMonth = self.config.showMonths > 1, + prevMonthDayClass = isMultiMonth ? "prevMonthDay hidden" : "prevMonthDay", + nextMonthDayClass = isMultiMonth ? "nextMonthDay hidden" : "nextMonthDay"; + var dayNumber = prevMonthDays + 1 - firstOfMonth, + dayIndex = 0; + + for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) { + days.appendChild(createDay(prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex)); + } + + for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) { + days.appendChild(createDay("", new Date(year, month, dayNumber), dayNumber, dayIndex)); + } + + for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth && (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) { + days.appendChild(createDay(nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex)); + } + + var dayContainer = createElement("div", "dayContainer"); + dayContainer.appendChild(days); + return dayContainer; + } + + function buildDays() { + if (self.daysContainer === undefined) { + return; + } + + clearNode(self.daysContainer); + if (self.weekNumbers) clearNode(self.weekNumbers); + var frag = document.createDocumentFragment(); + + for (var i = 0; i < self.config.showMonths; i++) { + var d = new Date(self.currentYear, self.currentMonth, 1); + d.setMonth(self.currentMonth + i); + frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth())); + } + + self.daysContainer.appendChild(frag); + self.days = self.daysContainer.firstChild; + + if (self.config.mode === "range" && self.selectedDates.length === 1) { + onMouseOver(); + } + } + + function buildMonth() { + var container = createElement("div", "flatpickr-month"); + var monthNavFragment = window.document.createDocumentFragment(); + var monthElement = createElement("span", "cur-month"); + var yearInput = createNumberInput("cur-year", { + tabindex: "-1" + }); + var yearElement = yearInput.getElementsByTagName("input")[0]; + yearElement.setAttribute("aria-label", self.l10n.yearAriaLabel); + if (self.config.minDate) yearElement.setAttribute("data-min", self.config.minDate.getFullYear().toString()); + + if (self.config.maxDate) { + yearElement.setAttribute("data-max", self.config.maxDate.getFullYear().toString()); + yearElement.disabled = !!self.config.minDate && self.config.minDate.getFullYear() === self.config.maxDate.getFullYear(); + } + + var currentMonth = createElement("div", "flatpickr-current-month"); + currentMonth.appendChild(monthElement); + currentMonth.appendChild(yearInput); + monthNavFragment.appendChild(currentMonth); + container.appendChild(monthNavFragment); + return { + container: container, + yearElement: yearElement, + monthElement: monthElement + }; + } + + function buildMonths() { + clearNode(self.monthNav); + self.monthNav.appendChild(self.prevMonthNav); + + for (var m = self.config.showMonths; m--;) { + var month = buildMonth(); + self.yearElements.push(month.yearElement); + self.monthElements.push(month.monthElement); + self.monthNav.appendChild(month.container); + } + + self.monthNav.appendChild(self.nextMonthNav); + } + + function buildMonthNav() { + self.monthNav = createElement("div", "flatpickr-months"); + self.yearElements = []; + self.monthElements = []; + self.prevMonthNav = createElement("span", "flatpickr-prev-month"); + self.prevMonthNav.innerHTML = self.config.prevArrow; + self.nextMonthNav = createElement("span", "flatpickr-next-month"); + self.nextMonthNav.innerHTML = self.config.nextArrow; + buildMonths(); + Object.defineProperty(self, "_hidePrevMonthArrow", { + get: function get() { + return self.__hidePrevMonthArrow; + }, + set: function set(bool) { + if (self.__hidePrevMonthArrow !== bool) { + toggleClass(self.prevMonthNav, "disabled", bool); + self.__hidePrevMonthArrow = bool; + } + } + }); + Object.defineProperty(self, "_hideNextMonthArrow", { + get: function get() { + return self.__hideNextMonthArrow; + }, + set: function set(bool) { + if (self.__hideNextMonthArrow !== bool) { + toggleClass(self.nextMonthNav, "disabled", bool); + self.__hideNextMonthArrow = bool; + } + } + }); + self.currentYearElement = self.yearElements[0]; + updateNavigationCurrentMonth(); + return self.monthNav; + } + + function buildTime() { + self.calendarContainer.classList.add("hasTime"); + if (self.config.noCalendar) self.calendarContainer.classList.add("noCalendar"); + self.timeContainer = createElement("div", "flatpickr-time"); + self.timeContainer.tabIndex = -1; + var separator = createElement("span", "flatpickr-time-separator", ":"); + var hourInput = createNumberInput("flatpickr-hour"); + self.hourElement = hourInput.getElementsByTagName("input")[0]; + var minuteInput = createNumberInput("flatpickr-minute"); + self.minuteElement = minuteInput.getElementsByTagName("input")[0]; + self.hourElement.tabIndex = self.minuteElement.tabIndex = -1; + self.hourElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getHours() : self.config.time_24hr ? self.config.defaultHour : military2ampm(self.config.defaultHour)); + self.minuteElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getMinutes() : self.config.defaultMinute); + self.hourElement.setAttribute("data-step", self.config.hourIncrement.toString()); + self.minuteElement.setAttribute("data-step", self.config.minuteIncrement.toString()); + self.hourElement.setAttribute("data-min", self.config.time_24hr ? "0" : "1"); + self.hourElement.setAttribute("data-max", self.config.time_24hr ? "23" : "12"); + self.minuteElement.setAttribute("data-min", "0"); + self.minuteElement.setAttribute("data-max", "59"); + self.timeContainer.appendChild(hourInput); + self.timeContainer.appendChild(separator); + self.timeContainer.appendChild(minuteInput); + if (self.config.time_24hr) self.timeContainer.classList.add("time24hr"); + + if (self.config.enableSeconds) { + self.timeContainer.classList.add("hasSeconds"); + var secondInput = createNumberInput("flatpickr-second"); + self.secondElement = secondInput.getElementsByTagName("input")[0]; + self.secondElement.value = pad(self.latestSelectedDateObj ? self.latestSelectedDateObj.getSeconds() : self.config.defaultSeconds); + self.secondElement.setAttribute("data-step", self.minuteElement.getAttribute("data-step")); + self.secondElement.setAttribute("data-min", self.minuteElement.getAttribute("data-min")); + self.secondElement.setAttribute("data-max", self.minuteElement.getAttribute("data-max")); + self.timeContainer.appendChild(createElement("span", "flatpickr-time-separator", ":")); + self.timeContainer.appendChild(secondInput); + } + + if (!self.config.time_24hr) { + self.amPM = createElement("span", "flatpickr-am-pm", self.l10n.amPM[int((self.latestSelectedDateObj ? self.hourElement.value : self.config.defaultHour) > 11)]); + self.amPM.title = self.l10n.toggleTitle; + self.amPM.tabIndex = -1; + self.timeContainer.appendChild(self.amPM); + } + + return self.timeContainer; + } + + function buildWeekdays() { + if (!self.weekdayContainer) self.weekdayContainer = createElement("div", "flatpickr-weekdays");else clearNode(self.weekdayContainer); + + for (var i = self.config.showMonths; i--;) { + var container = createElement("div", "flatpickr-weekdaycontainer"); + self.weekdayContainer.appendChild(container); + } + + updateWeekdays(); + return self.weekdayContainer; + } + + function updateWeekdays() { + var firstDayOfWeek = self.l10n.firstDayOfWeek; + var weekdays = self.l10n.weekdays.shorthand.concat(); + + if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) { + weekdays = weekdays.splice(firstDayOfWeek, weekdays.length).concat(weekdays.splice(0, firstDayOfWeek)); + } + + for (var i = self.config.showMonths; i--;) { + self.weekdayContainer.children[i].innerHTML = "\n \n " + weekdays.join("") + "\n \n "; + } + } + + function buildWeeks() { + self.calendarContainer.classList.add("hasWeeks"); + var weekWrapper = createElement("div", "flatpickr-weekwrapper"); + weekWrapper.appendChild(createElement("span", "flatpickr-weekday", self.l10n.weekAbbreviation)); + var weekNumbers = createElement("div", "flatpickr-weeks"); + weekWrapper.appendChild(weekNumbers); + return { + weekWrapper: weekWrapper, + weekNumbers: weekNumbers + }; + } + + function changeMonth(value, is_offset) { + if (is_offset === void 0) { + is_offset = true; + } + + var delta = is_offset ? value : value - self.currentMonth; + if (delta < 0 && self._hidePrevMonthArrow === true || delta > 0 && self._hideNextMonthArrow === true) return; + self.currentMonth += delta; + + if (self.currentMonth < 0 || self.currentMonth > 11) { + self.currentYear += self.currentMonth > 11 ? 1 : -1; + self.currentMonth = (self.currentMonth + 12) % 12; + triggerEvent("onYearChange"); + } + + buildDays(); + triggerEvent("onMonthChange"); + updateNavigationCurrentMonth(); + } + + function clear(triggerChangeEvent) { + if (triggerChangeEvent === void 0) { + triggerChangeEvent = true; + } + + self.input.value = ""; + if (self.altInput !== undefined) self.altInput.value = ""; + if (self.mobileInput !== undefined) self.mobileInput.value = ""; + self.selectedDates = []; + self.latestSelectedDateObj = undefined; + self.showTimeInput = false; + + if (self.config.enableTime === true) { + setDefaultHours(); + } + + self.redraw(); + if (triggerChangeEvent) triggerEvent("onChange"); + } + + function close() { + self.isOpen = false; + + if (!self.isMobile) { + self.calendarContainer.classList.remove("open"); + + self._input.classList.remove("active"); + } + + triggerEvent("onClose"); + } + + function destroy() { + if (self.config !== undefined) triggerEvent("onDestroy"); + + for (var i = self._handlers.length; i--;) { + var h = self._handlers[i]; + h.element.removeEventListener(h.event, h.handler, h.options); + } + + self._handlers = []; + + if (self.mobileInput) { + if (self.mobileInput.parentNode) self.mobileInput.parentNode.removeChild(self.mobileInput); + self.mobileInput = undefined; + } else if (self.calendarContainer && self.calendarContainer.parentNode) { + if (self.config.static && self.calendarContainer.parentNode) { + var wrapper = self.calendarContainer.parentNode; + wrapper.lastChild && wrapper.removeChild(wrapper.lastChild); + + if (wrapper.parentNode) { + while (wrapper.firstChild) { + wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper); + } + + wrapper.parentNode.removeChild(wrapper); + } + } else self.calendarContainer.parentNode.removeChild(self.calendarContainer); + } + + if (self.altInput) { + self.input.type = "text"; + if (self.altInput.parentNode) self.altInput.parentNode.removeChild(self.altInput); + delete self.altInput; + } + + if (self.input) { + self.input.type = self.input._type; + self.input.classList.remove("flatpickr-input"); + self.input.removeAttribute("readonly"); + self.input.value = ""; + } + + ["_showTimeInput", "latestSelectedDateObj", "_hideNextMonthArrow", "_hidePrevMonthArrow", "__hideNextMonthArrow", "__hidePrevMonthArrow", "isMobile", "isOpen", "selectedDateElem", "minDateHasTime", "maxDateHasTime", "days", "daysContainer", "_input", "_positionElement", "innerContainer", "rContainer", "monthNav", "todayDateElem", "calendarContainer", "weekdayContainer", "prevMonthNav", "nextMonthNav", "currentMonthElement", "currentYearElement", "navigationCurrentMonth", "selectedDateElem", "config"].forEach(function (k) { + try { + delete self[k]; + } catch (_) {} + }); + } + + function isCalendarElem(elem) { + if (self.config.appendTo && self.config.appendTo.contains(elem)) return true; + return self.calendarContainer.contains(elem); + } + + function documentClick(e) { + if (self.isOpen && !self.config.inline) { + var isCalendarElement = isCalendarElem(e.target); + var isInput = e.target === self.input || e.target === self.altInput || self.element.contains(e.target) || e.path && e.path.indexOf && (~e.path.indexOf(self.input) || ~e.path.indexOf(self.altInput)); + var lostFocus = e.type === "blur" ? isInput && e.relatedTarget && !isCalendarElem(e.relatedTarget) : !isInput && !isCalendarElement; + var isIgnored = !self.config.ignoredFocusElements.some(function (elem) { + return elem.contains(e.target); + }); + + if (lostFocus && isIgnored) { + self.close(); + + if (self.config.mode === "range" && self.selectedDates.length === 1) { + self.clear(false); + self.redraw(); + } + } + } + } + + function changeYear(newYear) { + if (!newYear || self.config.minDate && newYear < self.config.minDate.getFullYear() || self.config.maxDate && newYear > self.config.maxDate.getFullYear()) return; + var newYearNum = newYear, + isNewYear = self.currentYear !== newYearNum; + self.currentYear = newYearNum || self.currentYear; + + if (self.config.maxDate && self.currentYear === self.config.maxDate.getFullYear()) { + self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth); + } else if (self.config.minDate && self.currentYear === self.config.minDate.getFullYear()) { + self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth); + } + + if (isNewYear) { + self.redraw(); + triggerEvent("onYearChange"); + } + } + + function isEnabled(date, timeless) { + if (timeless === void 0) { + timeless = true; + } + + var dateToCheck = self.parseDate(date, undefined, timeless); + if (self.config.minDate && dateToCheck && compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0 || self.config.maxDate && dateToCheck && compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0) return false; + if (self.config.enable.length === 0 && self.config.disable.length === 0) return true; + if (dateToCheck === undefined) return false; + var bool = self.config.enable.length > 0, + array = bool ? self.config.enable : self.config.disable; + + for (var i = 0, d; i < array.length; i++) { + d = array[i]; + if (typeof d === "function" && d(dateToCheck)) return bool;else if (d instanceof Date && dateToCheck !== undefined && d.getTime() === dateToCheck.getTime()) return bool;else if (typeof d === "string" && dateToCheck !== undefined) { + var parsed = self.parseDate(d, undefined, true); + return parsed && parsed.getTime() === dateToCheck.getTime() ? bool : !bool; + } else if (typeof d === "object" && dateToCheck !== undefined && d.from && d.to && dateToCheck.getTime() >= d.from.getTime() && dateToCheck.getTime() <= d.to.getTime()) return bool; + } + + return !bool; + } + + function isInView(elem) { + if (self.daysContainer !== undefined) return elem.className.indexOf("hidden") === -1 && self.daysContainer.contains(elem); + return false; + } + + function onKeyDown(e) { + var isInput = e.target === self._input; + var allowInput = self.config.allowInput; + var allowKeydown = self.isOpen && (!allowInput || !isInput); + var allowInlineKeydown = self.config.inline && isInput && !allowInput; + + if (e.keyCode === 13 && isInput) { + if (allowInput) { + self.setDate(self._input.value, true, e.target === self.altInput ? self.config.altFormat : self.config.dateFormat); + return e.target.blur(); + } else self.open(); + } else if (isCalendarElem(e.target) || allowKeydown || allowInlineKeydown) { + var isTimeObj = !!self.timeContainer && self.timeContainer.contains(e.target); + + switch (e.keyCode) { + case 13: + if (isTimeObj) updateTime();else selectDate(e); + break; + + case 27: + e.preventDefault(); + focusAndClose(); + break; + + case 8: + case 46: + if (isInput && !self.config.allowInput) { + e.preventDefault(); + self.clear(); + } + + break; + + case 37: + case 39: + if (!isTimeObj) { + e.preventDefault(); + + if (self.daysContainer !== undefined && (allowInput === false || isInView(document.activeElement))) { + var _delta = e.keyCode === 39 ? 1 : -1; + + if (!e.ctrlKey) focusOnDay(undefined, _delta);else { + changeMonth(_delta); + focusOnDay(getFirstAvailableDay(1), 0); + } + } + } else if (self.hourElement) self.hourElement.focus(); + + break; + + case 38: + case 40: + e.preventDefault(); + var delta = e.keyCode === 40 ? 1 : -1; + + if (self.daysContainer && e.target.$i !== undefined) { + if (e.ctrlKey) { + changeYear(self.currentYear - delta); + focusOnDay(getFirstAvailableDay(1), 0); + } else if (!isTimeObj) focusOnDay(undefined, delta * 7); + } else if (self.config.enableTime) { + if (!isTimeObj && self.hourElement) self.hourElement.focus(); + updateTime(e); + + self._debouncedChange(); + } + + break; + + case 9: + if (!isTimeObj) { + self.element.focus(); + break; + } + + var elems = [self.hourElement, self.minuteElement, self.secondElement, self.amPM].filter(function (x) { + return x; + }); + var i = elems.indexOf(e.target); + + if (i !== -1) { + var target = elems[i + (e.shiftKey ? -1 : 1)]; + + if (target !== undefined) { + e.preventDefault(); + target.focus(); + } else { + self.element.focus(); + } + } + + break; + + default: + break; + } + } + + if (self.amPM !== undefined && e.target === self.amPM) { + switch (e.key) { + case self.l10n.amPM[0].charAt(0): + case self.l10n.amPM[0].charAt(0).toLowerCase(): + self.amPM.textContent = self.l10n.amPM[0]; + setHoursFromInputs(); + updateValue(); + break; + + case self.l10n.amPM[1].charAt(0): + case self.l10n.amPM[1].charAt(0).toLowerCase(): + self.amPM.textContent = self.l10n.amPM[1]; + setHoursFromInputs(); + updateValue(); + break; + } + } + + triggerEvent("onKeyDown", e); + } + + function onMouseOver(elem) { + if (self.selectedDates.length !== 1 || elem && (!elem.classList.contains("flatpickr-day") || elem.classList.contains("disabled"))) return; + var hoverDate = elem ? elem.dateObj.getTime() : self.days.firstElementChild.dateObj.getTime(), + initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), + rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), + rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime()), + lastDate = self.daysContainer.lastChild.lastChild.dateObj.getTime(); + var containsDisabled = false; + var minRange = 0, + maxRange = 0; + + for (var t = rangeStartDate; t < lastDate; t += duration.DAY) { + if (!isEnabled(new Date(t), true)) { + containsDisabled = containsDisabled || t > rangeStartDate && t < rangeEndDate; + if (t < initialDate && (!minRange || t > minRange)) minRange = t;else if (t > initialDate && (!maxRange || t < maxRange)) maxRange = t; + } + } + + for (var m = 0; m < self.config.showMonths; m++) { + var month = self.daysContainer.children[m]; + var prevMonth = self.daysContainer.children[m - 1]; + + var _loop = function _loop(i, l) { + var dayElem = month.children[i], + date = dayElem.dateObj; + var timestamp = date.getTime(); + var outOfRange = minRange > 0 && timestamp < minRange || maxRange > 0 && timestamp > maxRange; + + if (outOfRange) { + dayElem.classList.add("notAllowed"); + ["inRange", "startRange", "endRange"].forEach(function (c) { + dayElem.classList.remove(c); + }); + return "continue"; + } else if (containsDisabled && !outOfRange) return "continue"; + + ["startRange", "inRange", "endRange", "notAllowed"].forEach(function (c) { + dayElem.classList.remove(c); + }); + + if (elem !== undefined) { + elem.classList.add(hoverDate < self.selectedDates[0].getTime() ? "startRange" : "endRange"); + + if (month.contains(elem) || !(m > 0 && prevMonth && prevMonth.lastChild.dateObj.getTime() >= timestamp)) { + if (initialDate < hoverDate && timestamp === initialDate) dayElem.classList.add("startRange");else if (initialDate > hoverDate && timestamp === initialDate) dayElem.classList.add("endRange"); + if (timestamp >= minRange && (maxRange === 0 || timestamp <= maxRange) && isBetween(timestamp, initialDate, hoverDate)) dayElem.classList.add("inRange"); + } + } + }; + + for (var i = 0, l = month.children.length; i < l; i++) { + var _ret = _loop(i, l); + + if (_ret === "continue") continue; + } + } + } + + function onResize() { + if (self.isOpen && !self.config.static && !self.config.inline) positionCalendar(); + } + + function open(e, positionElement) { + if (positionElement === void 0) { + positionElement = self._positionElement; + } + + if (self.isMobile === true) { + if (e) { + e.preventDefault(); + e.target && e.target.blur(); + } + + if (self.mobileInput !== undefined) { + self.mobileInput.focus(); + self.mobileInput.click(); + } + + triggerEvent("onOpen"); + return; + } + + if (self._input.disabled || self.config.inline) return; + var wasOpen = self.isOpen; + self.isOpen = true; + + if (!wasOpen) { + self.calendarContainer.classList.add("open"); + + self._input.classList.add("active"); + + triggerEvent("onOpen"); + positionCalendar(positionElement); + } + + if (self.config.enableTime === true && self.config.noCalendar === true) { + if (self.selectedDates.length === 0) { + self.setDate(self.config.minDate !== undefined ? new Date(self.config.minDate.getTime()) : new Date(), false); + setDefaultHours(); + updateValue(); + } + + if (self.config.allowInput === false && (e === undefined || !self.timeContainer.contains(e.relatedTarget))) { + setTimeout(function () { + return self.hourElement.select(); + }, 50); + } + } + } + + function minMaxDateSetter(type) { + return function (date) { + var dateObj = self.config["_" + type + "Date"] = self.parseDate(date, self.config.dateFormat); + var inverseDateObj = self.config["_" + (type === "min" ? "max" : "min") + "Date"]; + + if (dateObj !== undefined) { + self[type === "min" ? "minDateHasTime" : "maxDateHasTime"] = dateObj.getHours() > 0 || dateObj.getMinutes() > 0 || dateObj.getSeconds() > 0; + } + + if (self.selectedDates) { + self.selectedDates = self.selectedDates.filter(function (d) { + return isEnabled(d); + }); + if (!self.selectedDates.length && type === "min") setHoursFromDate(dateObj); + updateValue(); + } + + if (self.daysContainer) { + redraw(); + if (dateObj !== undefined) self.currentYearElement[type] = dateObj.getFullYear().toString();else self.currentYearElement.removeAttribute(type); + self.currentYearElement.disabled = !!inverseDateObj && dateObj !== undefined && inverseDateObj.getFullYear() === dateObj.getFullYear(); + } + }; + } + + function parseConfig() { + var boolOpts = ["wrap", "weekNumbers", "allowInput", "clickOpens", "time_24hr", "enableTime", "noCalendar", "altInput", "shorthandCurrentMonth", "inline", "static", "enableSeconds", "disableMobile"]; + var userConfig = Object.assign({}, instanceConfig, JSON.parse(JSON.stringify(element.dataset || {}))); + var formats$$1 = {}; + self.config.parseDate = userConfig.parseDate; + self.config.formatDate = userConfig.formatDate; + Object.defineProperty(self.config, "enable", { + get: function get() { + return self.config._enable; + }, + set: function set(dates) { + self.config._enable = parseDateRules(dates); + } + }); + Object.defineProperty(self.config, "disable", { + get: function get() { + return self.config._disable; + }, + set: function set(dates) { + self.config._disable = parseDateRules(dates); + } + }); + var timeMode = userConfig.mode === "time"; + + if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) { + formats$$1.dateFormat = userConfig.noCalendar || timeMode ? "H:i" + (userConfig.enableSeconds ? ":S" : "") : flatpickr.defaultConfig.dateFormat + " H:i" + (userConfig.enableSeconds ? ":S" : ""); + } + + if (userConfig.altInput && (userConfig.enableTime || timeMode) && !userConfig.altFormat) { + formats$$1.altFormat = userConfig.noCalendar || timeMode ? "h:i" + (userConfig.enableSeconds ? ":S K" : " K") : flatpickr.defaultConfig.altFormat + (" h:i" + (userConfig.enableSeconds ? ":S" : "") + " K"); + } + + Object.defineProperty(self.config, "minDate", { + get: function get() { + return self.config._minDate; + }, + set: minMaxDateSetter("min") + }); + Object.defineProperty(self.config, "maxDate", { + get: function get() { + return self.config._maxDate; + }, + set: minMaxDateSetter("max") + }); + + var minMaxTimeSetter = function minMaxTimeSetter(type) { + return function (val) { + self.config[type === "min" ? "_minTime" : "_maxTime"] = self.parseDate(val, "H:i"); + }; + }; + + Object.defineProperty(self.config, "minTime", { + get: function get() { + return self.config._minTime; + }, + set: minMaxTimeSetter("min") + }); + Object.defineProperty(self.config, "maxTime", { + get: function get() { + return self.config._maxTime; + }, + set: minMaxTimeSetter("max") + }); + + if (userConfig.mode === "time") { + self.config.noCalendar = true; + self.config.enableTime = true; + } + + Object.assign(self.config, formats$$1, userConfig); + + for (var i = 0; i < boolOpts.length; i++) { + self.config[boolOpts[i]] = self.config[boolOpts[i]] === true || self.config[boolOpts[i]] === "true"; + } + + HOOKS.filter(function (hook) { + return self.config[hook] !== undefined; + }).forEach(function (hook) { + self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance); + }); + self.isMobile = !self.config.disableMobile && !self.config.inline && self.config.mode === "single" && !self.config.disable.length && !self.config.enable.length && !self.config.weekNumbers && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent); + + for (var _i = 0; _i < self.config.plugins.length; _i++) { + var pluginConf = self.config.plugins[_i](self) || {}; + + for (var key in pluginConf) { + if (HOOKS.indexOf(key) > -1) { + self.config[key] = arrayify(pluginConf[key]).map(bindToInstance).concat(self.config[key]); + } else if (typeof userConfig[key] === "undefined") self.config[key] = pluginConf[key]; + } + } + + triggerEvent("onParseConfig"); + } + + function setupLocale() { + if (typeof self.config.locale !== "object" && typeof flatpickr.l10ns[self.config.locale] === "undefined") self.config.errorHandler(new Error("flatpickr: invalid locale " + self.config.locale)); + self.l10n = Object.assign({}, flatpickr.l10ns.default, typeof self.config.locale === "object" ? self.config.locale : self.config.locale !== "default" ? flatpickr.l10ns[self.config.locale] : undefined); + tokenRegex.K = "(" + self.l10n.amPM[0] + "|" + self.l10n.amPM[1] + "|" + self.l10n.amPM[0].toLowerCase() + "|" + self.l10n.amPM[1].toLowerCase() + ")"; + self.formatDate = createDateFormatter(self); + self.parseDate = createDateParser({ + config: self.config, + l10n: self.l10n + }); + } + + function positionCalendar(customPositionElement) { + if (self.calendarContainer === undefined) return; + triggerEvent("onPreCalendarPosition"); + var positionElement = customPositionElement || self._positionElement; + var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, function (acc, child) { + return acc + child.offsetHeight; + }, 0), + calendarWidth = self.calendarContainer.offsetWidth, + configPos = self.config.position.split(" "), + configPosVertical = configPos[0], + configPosHorizontal = configPos.length > 1 ? configPos[1] : null, + inputBounds = positionElement.getBoundingClientRect(), + distanceFromBottom = window.innerHeight - inputBounds.bottom, + showOnTop = configPosVertical === "above" || configPosVertical !== "below" && distanceFromBottom < calendarHeight && inputBounds.top > calendarHeight; + var top = window.pageYOffset + inputBounds.top + (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2); + toggleClass(self.calendarContainer, "arrowTop", !showOnTop); + toggleClass(self.calendarContainer, "arrowBottom", showOnTop); + if (self.config.inline) return; + var left = window.pageXOffset + inputBounds.left - (configPosHorizontal != null && configPosHorizontal === "center" ? (calendarWidth - inputBounds.width) / 2 : 0); + var right = window.document.body.offsetWidth - inputBounds.right; + var rightMost = left + calendarWidth > window.document.body.offsetWidth; + toggleClass(self.calendarContainer, "rightMost", rightMost); + if (self.config.static) return; + self.calendarContainer.style.top = top + "px"; + + if (!rightMost) { + self.calendarContainer.style.left = left + "px"; + self.calendarContainer.style.right = "auto"; + } else { + self.calendarContainer.style.left = "auto"; + self.calendarContainer.style.right = right + "px"; + } + } + + function redraw() { + if (self.config.noCalendar || self.isMobile) return; + updateNavigationCurrentMonth(); + buildDays(); + } + + function focusAndClose() { + self._input.focus(); + + if (window.navigator.userAgent.indexOf("MSIE") !== -1 || navigator.msMaxTouchPoints !== undefined) { + setTimeout(self.close, 0); + } else { + self.close(); + } + } + + function selectDate(e) { + e.preventDefault(); + e.stopPropagation(); + + var isSelectable = function isSelectable(day) { + return day.classList && day.classList.contains("flatpickr-day") && !day.classList.contains("disabled") && !day.classList.contains("notAllowed"); + }; + + var t = findParent(e.target, isSelectable); + if (t === undefined) return; + var target = t; + var selectedDate = self.latestSelectedDateObj = new Date(target.dateObj.getTime()); + var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth || selectedDate.getMonth() > self.currentMonth + self.config.showMonths - 1) && self.config.mode !== "range"; + self.selectedDateElem = target; + if (self.config.mode === "single") self.selectedDates = [selectedDate];else if (self.config.mode === "multiple") { + var selectedIndex = isDateSelected(selectedDate); + if (selectedIndex) self.selectedDates.splice(parseInt(selectedIndex), 1);else self.selectedDates.push(selectedDate); + } else if (self.config.mode === "range") { + if (self.selectedDates.length === 2) self.clear(false); + self.selectedDates.push(selectedDate); + if (compareDates(selectedDate, self.selectedDates[0], true) !== 0) self.selectedDates.sort(function (a, b) { + return a.getTime() - b.getTime(); + }); + } + setHoursFromInputs(); + + if (shouldChangeMonth) { + var isNewYear = self.currentYear !== selectedDate.getFullYear(); + self.currentYear = selectedDate.getFullYear(); + self.currentMonth = selectedDate.getMonth(); + if (isNewYear) triggerEvent("onYearChange"); + triggerEvent("onMonthChange"); + } + + updateNavigationCurrentMonth(); + buildDays(); + updateValue(); + if (self.config.enableTime) setTimeout(function () { + return self.showTimeInput = true; + }, 50); + if (!shouldChangeMonth && self.config.mode !== "range" && self.config.showMonths === 1) focusOnDayElem(target);else self.selectedDateElem && self.selectedDateElem.focus(); + if (self.hourElement !== undefined) setTimeout(function () { + return self.hourElement !== undefined && self.hourElement.select(); + }, 451); + + if (self.config.closeOnSelect) { + var single = self.config.mode === "single" && !self.config.enableTime; + var range = self.config.mode === "range" && self.selectedDates.length === 2 && !self.config.enableTime; + + if (single || range) { + focusAndClose(); + } + } + + triggerChange(); + } + + var CALLBACKS = { + locale: [setupLocale, updateWeekdays], + showMonths: [buildMonths, setCalendarWidth, buildWeekdays] + }; + + function set(option, value) { + if (option !== null && typeof option === "object") Object.assign(self.config, option);else { + self.config[option] = value; + if (CALLBACKS[option] !== undefined) CALLBACKS[option].forEach(function (x) { + return x(); + });else if (HOOKS.indexOf(option) > -1) self.config[option] = arrayify(value); + } + self.redraw(); + jumpToDate(); + updateValue(false); + } + + function setSelectedDate(inputDate, format) { + var dates = []; + if (inputDate instanceof Array) dates = inputDate.map(function (d) { + return self.parseDate(d, format); + });else if (inputDate instanceof Date || typeof inputDate === "number") dates = [self.parseDate(inputDate, format)];else if (typeof inputDate === "string") { + switch (self.config.mode) { + case "single": + case "time": + dates = [self.parseDate(inputDate, format)]; + break; + + case "multiple": + dates = inputDate.split(self.config.conjunction).map(function (date) { + return self.parseDate(date, format); + }); + break; + + case "range": + dates = inputDate.split(self.l10n.rangeSeparator).map(function (date) { + return self.parseDate(date, format); + }); + break; + + default: + break; + } + } else self.config.errorHandler(new Error("Invalid date supplied: " + JSON.stringify(inputDate))); + self.selectedDates = dates.filter(function (d) { + return d instanceof Date && isEnabled(d, false); + }); + if (self.config.mode === "range") self.selectedDates.sort(function (a, b) { + return a.getTime() - b.getTime(); + }); + } + + function setDate(date, triggerChange, format) { + if (triggerChange === void 0) { + triggerChange = false; + } + + if (format === void 0) { + format = self.config.dateFormat; + } + + if (date !== 0 && !date || date instanceof Array && date.length === 0) return self.clear(triggerChange); + setSelectedDate(date, format); + self.showTimeInput = self.selectedDates.length > 0; + self.latestSelectedDateObj = self.selectedDates[0]; + self.redraw(); + jumpToDate(); + setHoursFromDate(); + updateValue(triggerChange); + if (triggerChange) triggerEvent("onChange"); + } + + function parseDateRules(arr) { + return arr.slice().map(function (rule) { + if (typeof rule === "string" || typeof rule === "number" || rule instanceof Date) { + return self.parseDate(rule, undefined, true); + } else if (rule && typeof rule === "object" && rule.from && rule.to) return { + from: self.parseDate(rule.from, undefined), + to: self.parseDate(rule.to, undefined) + }; + + return rule; + }).filter(function (x) { + return x; + }); + } + + function setupDates() { + self.selectedDates = []; + self.now = self.parseDate(self.config.now) || new Date(); + var preloadedDate = self.config.defaultDate || ((self.input.nodeName === "INPUT" || self.input.nodeName === "TEXTAREA") && self.input.placeholder && self.input.value === self.input.placeholder ? null : self.input.value); + if (preloadedDate) setSelectedDate(preloadedDate, self.config.dateFormat); + var initialDate = self.selectedDates.length > 0 ? self.selectedDates[0] : self.config.minDate && self.config.minDate.getTime() > self.now.getTime() ? self.config.minDate : self.config.maxDate && self.config.maxDate.getTime() < self.now.getTime() ? self.config.maxDate : self.now; + self.currentYear = initialDate.getFullYear(); + self.currentMonth = initialDate.getMonth(); + if (self.selectedDates.length > 0) self.latestSelectedDateObj = self.selectedDates[0]; + if (self.config.minTime !== undefined) self.config.minTime = self.parseDate(self.config.minTime, "H:i"); + if (self.config.maxTime !== undefined) self.config.maxTime = self.parseDate(self.config.maxTime, "H:i"); + self.minDateHasTime = !!self.config.minDate && (self.config.minDate.getHours() > 0 || self.config.minDate.getMinutes() > 0 || self.config.minDate.getSeconds() > 0); + self.maxDateHasTime = !!self.config.maxDate && (self.config.maxDate.getHours() > 0 || self.config.maxDate.getMinutes() > 0 || self.config.maxDate.getSeconds() > 0); + Object.defineProperty(self, "showTimeInput", { + get: function get() { + return self._showTimeInput; + }, + set: function set(bool) { + self._showTimeInput = bool; + if (self.calendarContainer) toggleClass(self.calendarContainer, "showTimeInput", bool); + self.isOpen && positionCalendar(); + } + }); + } + + function setupInputs() { + self.input = self.config.wrap ? element.querySelector("[data-input]") : element; + + if (!self.input) { + self.config.errorHandler(new Error("Invalid input element specified")); + return; + } + + self.input._type = self.input.type; + self.input.type = "text"; + self.input.classList.add("flatpickr-input"); + self._input = self.input; + + if (self.config.altInput) { + self.altInput = createElement(self.input.nodeName, self.input.className + " " + self.config.altInputClass); + self._input = self.altInput; + self.altInput.placeholder = self.input.placeholder; + self.altInput.disabled = self.input.disabled; + self.altInput.required = self.input.required; + self.altInput.tabIndex = self.input.tabIndex; + self.altInput.type = "text"; + self.input.setAttribute("type", "hidden"); + if (!self.config.static && self.input.parentNode) self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling); + } + + if (!self.config.allowInput) self._input.setAttribute("readonly", "readonly"); + self._positionElement = self.config.positionElement || self._input; + } + + function setupMobile() { + var inputType = self.config.enableTime ? self.config.noCalendar ? "time" : "datetime-local" : "date"; + self.mobileInput = createElement("input", self.input.className + " flatpickr-mobile"); + self.mobileInput.step = self.input.getAttribute("step") || "any"; + self.mobileInput.tabIndex = 1; + self.mobileInput.type = inputType; + self.mobileInput.disabled = self.input.disabled; + self.mobileInput.required = self.input.required; + self.mobileInput.placeholder = self.input.placeholder; + self.mobileFormatStr = inputType === "datetime-local" ? "Y-m-d\\TH:i:S" : inputType === "date" ? "Y-m-d" : "H:i:S"; + + if (self.selectedDates.length > 0) { + self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr); + } + + if (self.config.minDate) self.mobileInput.min = self.formatDate(self.config.minDate, "Y-m-d"); + if (self.config.maxDate) self.mobileInput.max = self.formatDate(self.config.maxDate, "Y-m-d"); + self.input.type = "hidden"; + if (self.altInput !== undefined) self.altInput.type = "hidden"; + + try { + if (self.input.parentNode) self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling); + } catch (_a) {} + + bind(self.mobileInput, "change", function (e) { + self.setDate(e.target.value, false, self.mobileFormatStr); + triggerEvent("onChange"); + triggerEvent("onClose"); + }); + } + + function toggle(e) { + if (self.isOpen === true) return self.close(); + self.open(e); + } + + function triggerEvent(event, data) { + if (self.config === undefined) return; + var hooks = self.config[event]; + + if (hooks !== undefined && hooks.length > 0) { + for (var i = 0; hooks[i] && i < hooks.length; i++) { + hooks[i](self.selectedDates, self.input.value, self, data); + } + } + + if (event === "onChange") { + self.input.dispatchEvent(createEvent("change")); + self.input.dispatchEvent(createEvent("input")); + } + } + + function createEvent(name) { + var e = document.createEvent("Event"); + e.initEvent(name, true, true); + return e; + } + + function isDateSelected(date) { + for (var i = 0; i < self.selectedDates.length; i++) { + if (compareDates(self.selectedDates[i], date) === 0) return "" + i; + } + + return false; + } + + function isDateInRange(date) { + if (self.config.mode !== "range" || self.selectedDates.length < 2) return false; + return compareDates(date, self.selectedDates[0]) >= 0 && compareDates(date, self.selectedDates[1]) <= 0; + } + + function updateNavigationCurrentMonth() { + if (self.config.noCalendar || self.isMobile || !self.monthNav) return; + self.yearElements.forEach(function (yearElement, i) { + var d = new Date(self.currentYear, self.currentMonth, 1); + d.setMonth(self.currentMonth + i); + self.monthElements[i].textContent = monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + " "; + yearElement.value = d.getFullYear().toString(); + }); + self._hidePrevMonthArrow = self.config.minDate !== undefined && (self.currentYear === self.config.minDate.getFullYear() ? self.currentMonth <= self.config.minDate.getMonth() : self.currentYear < self.config.minDate.getFullYear()); + self._hideNextMonthArrow = self.config.maxDate !== undefined && (self.currentYear === self.config.maxDate.getFullYear() ? self.currentMonth + 1 > self.config.maxDate.getMonth() : self.currentYear > self.config.maxDate.getFullYear()); + } + + function getDateStr(format) { + return self.selectedDates.map(function (dObj) { + return self.formatDate(dObj, format); + }).filter(function (d, i, arr) { + return self.config.mode !== "range" || self.config.enableTime || arr.indexOf(d) === i; + }).join(self.config.mode !== "range" ? self.config.conjunction : self.l10n.rangeSeparator); + } + + function updateValue(triggerChange) { + if (triggerChange === void 0) { + triggerChange = true; + } + + if (self.selectedDates.length === 0) return self.clear(triggerChange); + + if (self.mobileInput !== undefined && self.mobileFormatStr) { + self.mobileInput.value = self.latestSelectedDateObj !== undefined ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr) : ""; + } + + self.input.value = getDateStr(self.config.dateFormat); + + if (self.altInput !== undefined) { + self.altInput.value = getDateStr(self.config.altFormat); + } + + if (triggerChange !== false) triggerEvent("onValueUpdate"); + } + + function onMonthNavClick(e) { + e.preventDefault(); + var isPrevMonth = self.prevMonthNav.contains(e.target); + var isNextMonth = self.nextMonthNav.contains(e.target); + + if (isPrevMonth || isNextMonth) { + changeMonth(isPrevMonth ? -1 : 1); + } else if (self.yearElements.indexOf(e.target) >= 0) { + e.target.select(); + } else if (e.target.classList.contains("arrowUp")) { + self.changeYear(self.currentYear + 1); + } else if (e.target.classList.contains("arrowDown")) { + self.changeYear(self.currentYear - 1); + } + } + + function timeWrapper(e) { + e.preventDefault(); + var isKeyDown = e.type === "keydown", + input = e.target; + + if (self.amPM !== undefined && e.target === self.amPM) { + self.amPM.textContent = self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])]; + } + + var min = parseFloat(input.getAttribute("data-min")), + max = parseFloat(input.getAttribute("data-max")), + step = parseFloat(input.getAttribute("data-step")), + curValue = parseInt(input.value, 10), + delta = e.delta || (isKeyDown ? e.which === 38 ? 1 : -1 : 0); + var newValue = curValue + step * delta; + + if (typeof input.value !== "undefined" && input.value.length === 2) { + var isHourElem = input === self.hourElement, + isMinuteElem = input === self.minuteElement; + + if (newValue < min) { + newValue = max + newValue + int(!isHourElem) + (int(isHourElem) && int(!self.amPM)); + if (isMinuteElem) incrementNumInput(undefined, -1, self.hourElement); + } else if (newValue > max) { + newValue = input === self.hourElement ? newValue - max - int(!self.amPM) : min; + if (isMinuteElem) incrementNumInput(undefined, 1, self.hourElement); + } + + if (self.amPM && isHourElem && (step === 1 ? newValue + curValue === 23 : Math.abs(newValue - curValue) > step)) { + self.amPM.textContent = self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])]; + } + + input.value = pad(newValue); + } + } + + init(); + return self; + } + + function _flatpickr(nodeList, config) { + var nodes = Array.prototype.slice.call(nodeList); + var instances = []; + + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + + try { + if (node.getAttribute("data-fp-omit") !== null) continue; + + if (node._flatpickr !== undefined) { + node._flatpickr.destroy(); + + node._flatpickr = undefined; + } + + node._flatpickr = FlatpickrInstance(node, config || {}); + instances.push(node._flatpickr); + } catch (e) { + console.error(e); + } + } + + return instances.length === 1 ? instances[0] : instances; + } + + if (typeof HTMLElement !== "undefined") { + HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) { + return _flatpickr(this, config); + }; + + HTMLElement.prototype.flatpickr = function (config) { + return _flatpickr([this], config); + }; + } + + var flatpickr = function flatpickr(selector, config) { + if (selector instanceof NodeList) return _flatpickr(selector, config);else if (typeof selector === "string") return _flatpickr(window.document.querySelectorAll(selector), config); + return _flatpickr([selector], config); + }; + + flatpickr.defaultConfig = defaults; + flatpickr.l10ns = { + en: Object.assign({}, english), + default: Object.assign({}, english) + }; + + flatpickr.localize = function (l10n) { + flatpickr.l10ns.default = Object.assign({}, flatpickr.l10ns.default, l10n); + }; + + flatpickr.setDefaults = function (config) { + flatpickr.defaultConfig = Object.assign({}, flatpickr.defaultConfig, config); + }; + + flatpickr.parseDate = createDateParser({}); + flatpickr.formatDate = createDateFormatter({}); + flatpickr.compareDates = compareDates; + + if (typeof jQuery !== "undefined") { + jQuery.fn.flatpickr = function (config) { + return _flatpickr(this, config); + }; + } + + Date.prototype.fp_incr = function (days) { + return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === "string" ? parseInt(days, 10) : days)); + }; + + if (typeof window !== "undefined") { + window.flatpickr = flatpickr; + } + + return flatpickr; + +}))); diff --git a/app/lib/jquery.isonscreen.js b/app/lib/jquery.isonscreen.js new file mode 100755 index 000000000..fea8febbc --- /dev/null +++ b/app/lib/jquery.isonscreen.js @@ -0,0 +1,45 @@ +(function ($) { + + $.fn.isOnScreen = function(x, y){ + + if(x == null || typeof x == 'undefined') x = 1; + if(y == null || typeof y == 'undefined') y = 1; + + var win = $(window); + + var viewport = { + top : win.scrollTop(), + left : win.scrollLeft() + }; + viewport.right = viewport.left + win.width(); + viewport.bottom = viewport.top + win.height(); + + var height = this.outerHeight(); + var width = this.outerWidth(); + + if(!width || !height){ + return false; + } + + var bounds = this.offset(); + bounds.right = bounds.left + width; + bounds.bottom = bounds.top + height; + + var visible = (!(viewport.right < bounds.left || viewport.left > bounds.right || viewport.bottom < bounds.top || viewport.top > bounds.bottom)); + + if(!visible){ + return false; + } + + var deltas = { + top : Math.min( 1, ( bounds.bottom - viewport.top ) / height), + bottom : Math.min(1, ( viewport.bottom - bounds.top ) / height), + left : Math.min(1, ( bounds.right - viewport.left ) / width), + right : Math.min(1, ( viewport.right - bounds.left ) / width) + }; + + return (deltas.left * deltas.right) >= x && (deltas.top * deltas.bottom) >= y; + + }; + +})(jQuery); diff --git a/app/lib/table2CSV.js b/app/lib/table2CSV.js new file mode 100755 index 000000000..3406b2ca1 --- /dev/null +++ b/app/lib/table2CSV.js @@ -0,0 +1,114 @@ +jQuery.fn.table2CSV = function(options) { + var options = jQuery.extend({ + separator: ',', + header: [], + delivery: 'popup' // popup, value + }, + options); + + var csvData = []; + var el = this; + + function handleMatrix(bodyTag, cellTag) { + var spanData = {}; //if spanData[curRow][curCol] is true that means that 'cell' should be "" due to merged cell + var curRow = 0; + $(el).children(bodyTag).children('tr').each(function() { + tmpRow = []; + var curCol = 0; + $(this).children(cellTag).each(function() { + while(spanData[curRow] && spanData[curRow][curCol]) { + tmpRow.push('""'); + curCol++; + } + tmpRow.push(formatData($(this).text())); + var rowspan = $(this).attr('rowspan'); + if (rowspan) { + rowspan = parseInt(rowspan); + if (rowspan > 1) { + for (var i = 1; i < rowspan; i++) { + if (!spanData[curRow + i]) { + spanData[curRow + i] = {}; + } + spanData[curRow + i][curCol] = true; + } + } + } + var colspan = $(this).attr('colspan'); + if (!colspan){ + curCol++; + return; + } + colspan = parseInt(colspan); + while (colspan > 1) { + curCol++; + tmpRow.push('""'); + colspan--; + if (rowspan > 1) { + for (var i = 1; i < rowspan; i++) { + spanData[curRow + i][curCol] = true; + } + } + } + curCol++; + }); + row2CSV(tmpRow); + curRow++; + }); + } + + //header + var numCols = options.header.length; + var tmpRow = []; + if (numCols > 0) { + for (var i = 0; i < numCols; i++) { + tmpRow[tmpRow.length] = formatData(options.header[i]); + } + } else { + handleMatrix('thead', 'th'); + } + // actual data + handleMatrix('tbody', 'td'); + var mydata = csvData.join('\n'); + if (options.delivery == 'popup') { + return popup(mydata); + } else { + return mydata; + } + + function row2CSV(tmpRow) { + var tmp = tmpRow.join(''); // to remove any blank rows + if (tmpRow.length > 0 && tmp != '') { + var mystr = tmpRow.join(options.separator); + csvData[csvData.length] = mystr; + } + } + function formatData(input) { + // replace " with “ + var regexp = new RegExp(/["]/g); + var output = input.replace(regexp, "“"); + //HTML + // var regexp = new RegExp(/\<[^\<]+\>/g); + // var output = output.replace(regexp, ""); + var i = output.search(/\S/); //index of first non whitespace char + if (i > 0) { + output = '_'.repeat(i) + $.trim(output); + } + output = $.trim(output); + if (output == "") return ''; + if (output[0] == '+' || output[0] == '=' || output[0] == '-') { + output = ' ' + output; + } + return '"' + output + '"'; + } + function popup(data) { + var generator = window.open('', 'csv', 'height=400,width=600'); + generator.document.write('CSV'); + generator.document.write(''); + generator.document.write(''); + generator.document.write(''); + generator.document.close(); + return true; + } +}; \ No newline at end of file diff --git a/app/mms.html b/app/mms.html new file mode 100755 index 000000000..871209856 --- /dev/null +++ b/app/mms.html @@ -0,0 +1,114 @@ + + + + + + + + View Editor + + + + + + + + + + + + + + + +
+ +
+ +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/partials/mms/about.html b/app/partials/mms/about.html new file mode 100755 index 000000000..77e6dde4f --- /dev/null +++ b/app/partials/mms/about.html @@ -0,0 +1,12 @@ + + + + + diff --git a/app/partials/mms/add-pe.html b/app/partials/mms/add-pe.html new file mode 100755 index 000000000..960bbe36d --- /dev/null +++ b/app/partials/mms/add-pe.html @@ -0,0 +1,38 @@ + + + + + + + \ No newline at end of file diff --git a/app/partials/mms/cancelConfirm.html b/app/partials/mms/cancelConfirm.html new file mode 100755 index 000000000..536f3e3e0 --- /dev/null +++ b/app/partials/mms/cancelConfirm.html @@ -0,0 +1,15 @@ + + + + + diff --git a/app/partials/mms/cancelModal.html b/app/partials/mms/cancelModal.html new file mode 100755 index 000000000..b1d591585 --- /dev/null +++ b/app/partials/mms/cancelModal.html @@ -0,0 +1,15 @@ +
+ +
\ No newline at end of file diff --git a/app/partials/mms/confirmDelete.html b/app/partials/mms/confirmDelete.html new file mode 100755 index 000000000..c4347a498 --- /dev/null +++ b/app/partials/mms/confirmDelete.html @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/partials/mms/confirmRemove.html b/app/partials/mms/confirmRemove.html new file mode 100755 index 000000000..49a8512ea --- /dev/null +++ b/app/partials/mms/confirmRemove.html @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/partials/mms/docCover.html b/app/partials/mms/docCover.html new file mode 100755 index 000000000..7ff410bdd --- /dev/null +++ b/app/partials/mms/docCover.html @@ -0,0 +1,87 @@ +
+
+
{{meta.project}}
+
{{meta.title}}
+
{{meta.version}} {{tag.name}}
+
















+ +
Paper copies of this document may not be current and should not be relied on for official purposes.
+
{{meta.titlelegal}}
+
{{time | date:'M/d/yy h:mm a'}}
+
{{meta.dnumber}}
+

+
+
{{meta.inst1}}
+
{{meta.inst2}}
+
+ + +
+
{{meta.project}}
+
{{meta.title}}
+
{{meta.version}} {{tag.name}}
+ +
+

+
PREPARED BY:
+
+

+
_____________________________________ ________________
+
{{author.firstname}} {{author.lastname}}Date
+
{{author.title}}, {{author.orgname}} ({{author.orgnum}})
+
+
+ +
+

+
APPROVED BY:
+
+

+
_____________________________________ ________________
+
{{author.firstname}} {{author.lastname}}Date
+
{{author.title}}, {{author.orgname}} ({{author.orgnum}})
+
+
+ +
+

+
CONCURRED BY:
+
+

+
_____________________________________ ________________
+
{{author.firstname}} {{author.lastname}}Date
+
{{author.title}}, {{author.orgname}} ({{author.orgnum}})
+
+
+ +

+
+
{{meta.inst1}}
+
{{meta.inst2}}
+
+ +
+
+
Change Log
+ + + + + + + +
VersionDateSections ChangedAuthor
{{rev.revnum}}{{rev.date}}{{rev.remark}}{{rev.firstname}} {{rev.lastname}}
+
+ +
+
+
Distribution List
+
{{email}}
+
+ +







+
+
{{meta.inst1}}
+
{{meta.inst2}}
+
+
\ No newline at end of file diff --git a/app/partials/mms/full-doc.html b/app/partials/mms/full-doc.html new file mode 100755 index 000000000..a3c39bc0a --- /dev/null +++ b/app/partials/mms/full-doc.html @@ -0,0 +1,41 @@ +
+
+
+ +
+ +
+
+
+
+ +
+ Tags are read only: Switch to a branch to edit +
+
Document Last Modified: {{ latestElement | date:'M/d/yy h:mm a' }}
+ +
+
+ +
+ + +
+ + diff --git a/app/partials/mms/login.html b/app/partials/mms/login.html new file mode 100755 index 000000000..18aa099c9 --- /dev/null +++ b/app/partials/mms/login.html @@ -0,0 +1,27 @@ +
+ +
+ diff --git a/app/partials/mms/manage-refs.html b/app/partials/mms/manage-refs.html new file mode 100755 index 000000000..ed97455bb --- /dev/null +++ b/app/partials/mms/manage-refs.html @@ -0,0 +1,75 @@ +
+
+
+ Back to Project Documents ({{fromParams.name}}) +

Manage Project branches/tags

+
+
+
+ +
+
+
+

{{refSelected.name}}

+
+ + + +
+ +
+
+
+ + +
Id
+
{{refSelected.id}}
+
Type
+
{{refSelected.type}}
+
Description
+
{{refSelected.description}}
+ +
Time Created
+
{{refSelected._created}}
+
Creator
+
{{refSelected._creator}}
+ +
Modifier
+
{{refSelected._modifier}}
+
Parent Ref
+
{{refSelected.parentRefId}}
+
+
+
+
+
+
+
+
\ No newline at end of file diff --git a/app/partials/mms/new-branch.html b/app/partials/mms/new-branch.html new file mode 100755 index 000000000..a0a3c9611 --- /dev/null +++ b/app/partials/mms/new-branch.html @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/app/partials/mms/new-doc-or-group.html b/app/partials/mms/new-doc-or-group.html new file mode 100755 index 000000000..40d6503b7 --- /dev/null +++ b/app/partials/mms/new-doc-or-group.html @@ -0,0 +1,23 @@ + + + + + \ No newline at end of file diff --git a/app/partials/mms/new-tag.html b/app/partials/mms/new-tag.html new file mode 100755 index 000000000..691135aaa --- /dev/null +++ b/app/partials/mms/new-tag.html @@ -0,0 +1,44 @@ + + + + + \ No newline at end of file diff --git a/app/partials/mms/new-view.html b/app/partials/mms/new-view.html new file mode 100755 index 000000000..c96166425 --- /dev/null +++ b/app/partials/mms/new-view.html @@ -0,0 +1,39 @@ +
+ + + + \ No newline at end of file diff --git a/app/partials/mms/pane-center.html b/app/partials/mms/pane-center.html new file mode 100755 index 000000000..dea5b4831 --- /dev/null +++ b/app/partials/mms/pane-center.html @@ -0,0 +1,38 @@ +
+
+
+
+ +
+
+
+
+ +
+
+
+ Tags are read only: Switch to a branch to edit +
+
{{comments.count}} Comments + + , Last Commented {{comments.lastCommented | date:'M/d/yy h:mm a'}} by {{comments.lastCommentedBy}} +
+ +
+
+
+
+ +
+ + +
+ + diff --git a/app/partials/mms/pane-left.html b/app/partials/mms/pane-left.html new file mode 100755 index 000000000..6f812bac0 --- /dev/null +++ b/app/partials/mms/pane-left.html @@ -0,0 +1,39 @@ +
+
+ +
+ + +
+
+
+
+
+ + + + +
+

List of {{view.title}}

+ +
+ +
+
diff --git a/app/partials/mms/pane-right.html b/app/partials/mms/pane-right.html new file mode 100755 index 000000000..c196a0bb5 --- /dev/null +++ b/app/partials/mms/pane-right.html @@ -0,0 +1,43 @@ +
+
+
+

Edit Element

+

Preview Element

+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+

Project Branches/Tags

+
+ +
+ +
+ +
+
diff --git a/app/partials/mms/printConfirm.html b/app/partials/mms/printConfirm.html new file mode 100755 index 000000000..d9c4cdc4e --- /dev/null +++ b/app/partials/mms/printConfirm.html @@ -0,0 +1,112 @@ + + + + + diff --git a/app/partials/mms/redirect.html b/app/partials/mms/redirect.html new file mode 100755 index 000000000..983025e27 --- /dev/null +++ b/app/partials/mms/redirect.html @@ -0,0 +1,38 @@ +
+ +
\ No newline at end of file diff --git a/app/partials/mms/reorder-groups.html b/app/partials/mms/reorder-groups.html new file mode 100755 index 000000000..3162d8327 --- /dev/null +++ b/app/partials/mms/reorder-groups.html @@ -0,0 +1,24 @@ + +
+ + +
+ + +
+

Move group/document to/from a group. Only Grouping is preserved. Ordering is not.

+
+
    +
  1. +
+
+
+
diff --git a/app/partials/mms/reorder-views.html b/app/partials/mms/reorder-views.html new file mode 100755 index 000000000..d14d07fe7 --- /dev/null +++ b/app/partials/mms/reorder-views.html @@ -0,0 +1,23 @@ + + + +
+ + +
+ +

To reorder text, tables, images, equations, and sections, use the in the right pane.

+
+
    +
  1. +
+
+
\ No newline at end of file diff --git a/app/partials/mms/select.html b/app/partials/mms/select.html new file mode 100755 index 000000000..f29314ce5 --- /dev/null +++ b/app/partials/mms/select.html @@ -0,0 +1,84 @@ +
+ + +
diff --git a/app/partials/mms/selectModal.html b/app/partials/mms/selectModal.html new file mode 100755 index 000000000..b9f616eef --- /dev/null +++ b/app/partials/mms/selectModal.html @@ -0,0 +1,39 @@ + \ No newline at end of file diff --git a/app/partials/mms/tableExport.html b/app/partials/mms/tableExport.html new file mode 100755 index 000000000..3ce0283ed --- /dev/null +++ b/app/partials/mms/tableExport.html @@ -0,0 +1,24 @@ + + + + + diff --git a/app/partials/mms/veBanner.html b/app/partials/mms/veBanner.html new file mode 100755 index 000000000..08eaf6354 --- /dev/null +++ b/app/partials/mms/veBanner.html @@ -0,0 +1,7 @@ + diff --git a/app/partials/mms/veFooter.html b/app/partials/mms/veFooter.html new file mode 100755 index 000000000..ba2f61f62 --- /dev/null +++ b/app/partials/mms/veFooter.html @@ -0,0 +1,7 @@ +
+
+ +
+
diff --git a/app/partials/mms/veMenu.html b/app/partials/mms/veMenu.html new file mode 100755 index 000000000..6e12c626a --- /dev/null +++ b/app/partials/mms/veMenu.html @@ -0,0 +1,71 @@ + diff --git a/app/partials/mms/veNav.html b/app/partials/mms/veNav.html new file mode 100755 index 000000000..bce6b1345 --- /dev/null +++ b/app/partials/mms/veNav.html @@ -0,0 +1,71 @@ + diff --git a/config/.gitignore b/config/.gitignore deleted file mode 100644 index 4f4bba48a..000000000 --- a/config/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.json -!example.json -!config.js diff --git a/config/config.js b/config/config.js deleted file mode 100644 index 5adb15e4e..000000000 --- a/config/config.js +++ /dev/null @@ -1,11 +0,0 @@ -;(function () { - $.ajax('config/config.json', { - async: false, - global: false, - dataType: 'json', - success: function (data) { - window.__env = window.__env || {} - window.__env = Object.assign(window.__env, data) - }, - }) -})() diff --git a/config/default.nginx.template b/config/default.nginx.template deleted file mode 100644 index df5eae1a3..000000000 --- a/config/default.nginx.template +++ /dev/null @@ -1 +0,0 @@ -listen ${NGINX_PORT}; diff --git a/test/config/develop/karma.develop.conf.js b/config/develop/karma.develop.conf.js old mode 100644 new mode 100755 similarity index 100% rename from test/config/develop/karma.develop.conf.js rename to config/develop/karma.develop.conf.js diff --git a/test/config/develop/protractor.develop.conf.js b/config/develop/protractor.develop.conf.js old mode 100644 new mode 100755 similarity index 100% rename from test/config/develop/protractor.develop.conf.js rename to config/develop/protractor.develop.conf.js diff --git a/test/config/example.protractor.conf.js b/config/example.protractor.conf.js old mode 100644 new mode 100755 similarity index 100% rename from test/config/example.protractor.conf.js rename to config/example.protractor.conf.js diff --git a/test/config/mms-testing.md b/config/mms-testing.md old mode 100644 new mode 100755 similarity index 100% rename from test/config/mms-testing.md rename to config/mms-testing.md diff --git a/config/example.json b/config/old_example.json old mode 100644 new mode 100755 similarity index 97% rename from config/example.json rename to config/old_example.json index dc5cabe6c..1763ac75d --- a/config/example.json +++ b/config/old_example.json @@ -2,7 +2,7 @@ "apiUrl": "http://localhost:8080", "printUrl": "http://localhost:8081/convert", "basePath": "", - "enableDebug": false, + "enableDebug": true, "customLabels": { "pi": "PROPRIETARY: Proprietary Information", "export_ctrl": "EXPORT WARNING: No export controlled documents allowed on this server", diff --git a/logs/.gitkeep b/logs/.gitkeep old mode 100644 new mode 100755 diff --git a/mocks/documents.yaml b/mocks/documents.yaml new file mode 100755 index 000000000..487651b72 --- /dev/null +++ b/mocks/documents.yaml @@ -0,0 +1,107 @@ +- request: + url: ^/products$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384.json + +- request: + url: ^/products/_17_0_2_3_407019f_1390507581047_689015_29384$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384.json + +- request: + url: ^/products/_17_0_2_3_407019f_1390507581047_689015_29384/views$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384_views.json + +- request: + url: ^/views/_17_0_2_3_407019f_1390507581047_689015_29384$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384.json + +- request: + url: ^/views/_17_0_2_3_407019f_1386871350559_140692_26286$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286.json + +- request: + url: ^/views/_17_0_2_3_407019f_1390507595220_102072_29439$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439.json + +- request: + url: ^/views/_17_0_2_3_407019f_1390507581047_689015_29384/elements$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384_elements.json + +- request: + url: ^/views/_17_0_2_3_407019f_1386871350559_140692_26286/elements$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286_elements.json + +- request: + url: ^/views/_17_0_2_3_407019f_1390507595220_102072_29439/elements$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + file: mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439_elements.json + +- request: + url: ^/elements/_17_0_2_3_407019f_1390507581047_689015_29384/comments$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + body: '{"elements": []}' + +- request: + url: ^/elements/_17_0_2_3_407019f_1386871350559_140692_26286/comments$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + body: '{"elements": []}' + +- request: + url: ^/elements/_17_0_2_3_407019f_1390507595220_102072_29439/comments$ + response: + status: 200 + headers: + content-type: application/json + latency: 500 + body: '{"elements": []}' \ No newline at end of file diff --git a/mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384.json b/mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384.json new file mode 100755 index 000000000..836507d43 --- /dev/null +++ b/mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384.json @@ -0,0 +1,25 @@ +{"products": [{ + "author": "dlam", + "editable": true, + "id": "_17_0_2_3_407019f_1390507581047_689015_29384", + "lastModified": "2014-02-10T11:45:05.390-08:00", + "noSections": [], + "qualifiedName": "/test/Test334/doc/Spacecraft Doc", + "view2view": [ + { + "childrenViews": [ + "_17_0_2_3_407019f_1390507595220_102072_29439", + "_17_0_2_3_407019f_1386871350559_140692_26286" + ], + "id": "_17_0_2_3_407019f_1390507581047_689015_29384" + }, + { + "childrenViews": [], + "id": "_17_0_2_3_407019f_1386871350559_140692_26286" + }, + { + "childrenViews": [], + "id": "_17_0_2_3_407019f_1390507595220_102072_29439" + } + ] +}]} diff --git a/mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384_views.json b/mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384_views.json new file mode 100755 index 000000000..17699fcf0 --- /dev/null +++ b/mocks/json/product_17_0_2_3_407019f_1390507581047_689015_29384_views.json @@ -0,0 +1,231 @@ +{"views": [{ + "allowedElements": [ + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1390507287981_434330_29179", + "_17_0_2_3_407019f_1390507400301_849349_29302", + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507400301_524331_29301", + "_17_0_2_3_407019f_1386871350559_140692_26286", + "_17_0_2_3_407019f_1390507400301_816655_29300", + "_17_0_2_3_407019f_1390507287981_669186_29178", + "_17_0_2_3_407019f_1386871384972_702931_26371", + "_17_0_2_3_407019f_1390507287980_707998_29177" + ], + "author": "dlam", + "contains": [ + { + "sourceType": "text", + "text": "

\"space\"/<\/p>", + "type": "Paragraph" + }, + { + "source": "_17_0_2_3_407019f_1386871350559_140692_26286", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + } + ], + "displayedElements": [ + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1390507287981_434330_29179", + "_17_0_2_3_407019f_1390507400301_849349_29302", + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507400301_524331_29301", + "_17_0_2_3_407019f_1386871350559_140692_26286", + "_17_0_2_3_407019f_1390507400301_816655_29300", + "_17_0_2_3_407019f_1390507287981_669186_29178", + "_17_0_2_3_407019f_1386871384972_702931_26371", + "_17_0_2_3_407019f_1390507287980_707998_29177" + ], + "editable": true, + "id": "_17_0_2_3_407019f_1386871350559_140692_26286", + "lastModified": "2014-02-10T11:45:04.272-08:00", + "qualifiedName": "/test/Test334/components/space" + }, + { + "allowedElements": ["_17_0_2_3_407019f_1390507581047_689015_29384"], + "author": "dlam", + "contains": [{ + "source": "_17_0_2_3_407019f_1390507581047_689015_29384", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "displayedElements": ["_17_0_2_3_407019f_1390507581047_689015_29384"], + "editable": true, + "id": "_17_0_2_3_407019f_1390507581047_689015_29384", + "lastModified": "2014-02-10T11:45:05.390-08:00", + "qualifiedName": "/test/Test334/doc/Spacecraft Doc" + }, + { + "allowedElements": [ + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507595220_102072_29439", + "_17_0_2_3_407019f_1386871384972_702931_26371" + ], + "author": "dlam", + "contains": [ + { + "source": "_17_0_2_3_407019f_1390507595220_102072_29439", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }, + { + "body": [ + [ + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871384972_702931_26371", + "sourceProperty": "name", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871384972_702931_26371", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507334373_78013_29205", + "sourceProperty": "value", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + } + ], + [ + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507392384_798171_29256", + "sourceProperty": "name", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507392384_798171_29256", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507415007_980263_29329", + "sourceProperty": "value", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + } + ], + [ + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871355202_825879_26310", + "sourceProperty": "name", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871355202_825879_26310", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1387309243448_48276_29113", + "sourceProperty": "value", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + } + ] + ], + "header": [[ + { + "colspan": "1", + "content": [{ + "sourceType": "text", + "text": "

Name<\/p>", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "sourceType": "text", + "text": "

Documentation yay<\/p>", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "sourceType": "text", + "text": "

Mass<\/p>", + "type": "Paragraph" + }], + "rowspan": "1" + } + ]], + "style": "normal", + "title": "", + "type": "Table" + } + ], + "displayedElements": [ + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507595220_102072_29439", + "_17_0_2_3_407019f_1386871384972_702931_26371" + ], + "editable": true, + "id": "_17_0_2_3_407019f_1390507595220_102072_29439", + "lastModified": "2014-02-10T11:45:04.310-08:00", + "qualifiedName": "/test/Test334/doc/Components" + } +]} \ No newline at end of file diff --git a/mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286.json b/mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286.json new file mode 100755 index 000000000..ea4eff8b3 --- /dev/null +++ b/mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286.json @@ -0,0 +1,50 @@ +{"views": [{ + "allowedElements": [ + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1390507287981_434330_29179", + "_17_0_2_3_407019f_1390507400301_849349_29302", + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507400301_524331_29301", + "_17_0_2_3_407019f_1386871350559_140692_26286", + "_17_0_2_3_407019f_1390507400301_816655_29300", + "_17_0_2_3_407019f_1390507287981_669186_29178", + "_17_0_2_3_407019f_1386871384972_702931_26371", + "_17_0_2_3_407019f_1390507287980_707998_29177" + ], + "author": "dlam", + "contains": [ + { + "sourceType": "text", + "text": "

\"space\"/<\/p>", + "type": "Paragraph" + }, + { + "source": "_17_0_2_3_407019f_1386871350559_140692_26286", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + } + ], + "displayedElements": [ + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1390507287981_434330_29179", + "_17_0_2_3_407019f_1390507400301_849349_29302", + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507400301_524331_29301", + "_17_0_2_3_407019f_1386871350559_140692_26286", + "_17_0_2_3_407019f_1390507400301_816655_29300", + "_17_0_2_3_407019f_1390507287981_669186_29178", + "_17_0_2_3_407019f_1386871384972_702931_26371", + "_17_0_2_3_407019f_1390507287980_707998_29177" + ], + "editable": true, + "id": "_17_0_2_3_407019f_1386871350559_140692_26286", + "lastModified": "2014-02-10T11:45:04.272-08:00", + "qualifiedName": "/test/Test334/components/space" +}]} diff --git a/mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286_elements.json b/mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286_elements.json new file mode 100755 index 000000000..5f0ad6491 --- /dev/null +++ b/mocks/json/view_17_0_2_3_407019f_1386871350559_140692_26286_elements.json @@ -0,0 +1,166 @@ +{"elements": [ + { + "author": "dlam", + "documentation": "

\nA spacecraft doesn't need wheels, but what the heck.\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1390507392384_798171_29256", + "lastModified": "2014-02-10T11:41:07.086-08:00", + "name": "Wheel", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/Wheel", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507400301_849349_29302", + "isDerived": false, + "lastModified": "2014-02-10T11:41:32.864-08:00", + "name": "", + "owner": "_17_0_2_3_407019f_1390507400301_816655_29300", + "propertyType": "_17_0_2_3_407019f_1386871355202_825879_26310", + "qualifiedName": "/test/Test334/components//", + "type": "Property", + "valueType": "LiteralString" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507415007_980263_29329", + "isDerived": false, + "lastModified": "2014-02-10T11:41:07.245-08:00", + "name": "mass", + "owner": "_17_0_2_3_407019f_1390507392384_798171_29256", + "qualifiedName": "/test/Test334/components/Wheel/mass", + "type": "Property", + "value": [33], + "valueType": "LiteralReal" + }, + { + "author": "dlam", + "documentation": "

\nThis is a thing that flies in space.\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1386871355202_825879_26310", + "lastModified": "2014-02-10T11:41:06.496-08:00", + "name": "Spacecraft", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/Spacecraft", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1387309243448_48276_29113", + "isDerived": false, + "lastModified": "2014-02-10T11:41:06.810-08:00", + "name": "mass", + "owner": "_17_0_2_3_407019f_1386871355202_825879_26310", + "qualifiedName": "/test/Test334/components/Spacecraft/mass", + "type": "Property", + "value": [34.2], + "valueType": "LiteralReal" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507334373_78013_29205", + "isDerived": false, + "lastModified": "2014-02-10T11:41:07.886-08:00", + "name": "mass", + "owner": "_17_0_2_3_407019f_1386871384972_702931_26371", + "qualifiedName": "/test/Test334/components/RTG/mass", + "type": "Property", + "value": [2.3], + "valueType": "LiteralReal" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507287981_434330_29179", + "isDerived": false, + "lastModified": "2014-02-10T11:41:32.653-08:00", + "name": "", + "owner": "_17_0_2_3_407019f_1390507287980_707998_29177", + "propertyType": "_17_0_2_3_407019f_1386871355202_825879_26310", + "qualifiedName": "/test/Test334/components//", + "type": "Property", + "valueType": "LiteralString" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507400301_524331_29301", + "isDerived": false, + "lastModified": "2014-02-10T11:41:32.715-08:00", + "name": "", + "owner": "_17_0_2_3_407019f_1386871355202_825879_26310", + "propertyType": "_17_0_2_3_407019f_1390507392384_798171_29256", + "qualifiedName": "/test/Test334/components/Spacecraft/", + "type": "Property", + "valueType": "LiteralString" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507400301_816655_29300", + "lastModified": "2014-02-10T11:41:07.386-08:00", + "name": "", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "

\ndiagram of stuff\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1386871350559_140692_26286", + "lastModified": "2014-02-10T11:45:04.272-08:00", + "name": "space", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/space", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507287981_669186_29178", + "isDerived": false, + "lastModified": "2014-02-10T11:41:32.732-08:00", + "name": "", + "owner": "_17_0_2_3_407019f_1386871355202_825879_26310", + "propertyType": "_17_0_2_3_407019f_1386871384972_702931_26371", + "qualifiedName": "/test/Test334/components/Spacecraft/", + "type": "Property", + "valueType": "LiteralString" + }, + { + "author": "dlam", + "documentation": "

\nthis is the power source\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1386871384972_702931_26371", + "lastModified": "2014-02-10T11:41:07.696-08:00", + "name": "RTG", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/RTG", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507287980_707998_29177", + "lastModified": "2014-02-10T11:41:08.034-08:00", + "name": "", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/", + "type": "Element" + } +]} \ No newline at end of file diff --git a/mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384.json b/mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384.json new file mode 100755 index 000000000..5108d40c7 --- /dev/null +++ b/mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384.json @@ -0,0 +1,15 @@ +{"views": [{ + "allowedElements": ["_17_0_2_3_407019f_1390507581047_689015_29384"], + "author": "dlam", + "contains": [{ + "source": "_17_0_2_3_407019f_1390507581047_689015_29384", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "displayedElements": ["_17_0_2_3_407019f_1390507581047_689015_29384"], + "editable": true, + "id": "_17_0_2_3_407019f_1390507581047_689015_29384", + "lastModified": "2014-02-10T11:45:05.390-08:00", + "qualifiedName": "/test/Test334/doc/Spacecraft Doc" +}]} \ No newline at end of file diff --git a/mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384_elements.json b/mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384_elements.json new file mode 100755 index 000000000..439198185 --- /dev/null +++ b/mocks/json/view_17_0_2_3_407019f_1390507581047_689015_29384_elements.json @@ -0,0 +1,11 @@ +{"elements": [{ + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507581047_689015_29384", + "lastModified": "2014-02-10T11:45:05.390-08:00", + "name": "Spacecraft Doc", + "owner": "_17_0_2_3_407019f_1390508230826_18392_31223", + "qualifiedName": "/test/Test334/doc/Spacecraft Doc", + "type": "Element" +}]} \ No newline at end of file diff --git a/mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439.json b/mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439.json new file mode 100755 index 000000000..e6844aea2 --- /dev/null +++ b/mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439.json @@ -0,0 +1,165 @@ +{"views": [{ + "allowedElements": [ + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507595220_102072_29439", + "_17_0_2_3_407019f_1386871384972_702931_26371" + ], + "author": "dlam", + "contains": [ + { + "source": "_17_0_2_3_407019f_1390507595220_102072_29439", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }, + { + "body": [ + [ + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871384972_702931_26371", + "sourceProperty": "name", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871384972_702931_26371", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507334373_78013_29205", + "sourceProperty": "value", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + } + ], + [ + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507392384_798171_29256", + "sourceProperty": "name", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507392384_798171_29256", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1390507415007_980263_29329", + "sourceProperty": "value", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + } + ], + [ + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871355202_825879_26310", + "sourceProperty": "name", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1386871355202_825879_26310", + "sourceProperty": "documentation", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "source": "_17_0_2_3_407019f_1387309243448_48276_29113", + "sourceProperty": "value", + "sourceType": "reference", + "type": "Paragraph" + }], + "rowspan": "1" + } + ] + ], + "header": [[ + { + "colspan": "1", + "content": [{ + "sourceType": "text", + "text": "

Name<\/p>", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "sourceType": "text", + "text": "

Documentation yay<\/p>", + "type": "Paragraph" + }], + "rowspan": "1" + }, + { + "colspan": "1", + "content": [{ + "sourceType": "text", + "text": "

Mass<\/p>", + "type": "Paragraph" + }], + "rowspan": "1" + } + ]], + "style": "normal", + "title": "", + "type": "Table" + } + ], + "displayedElements": [ + "_17_0_2_3_407019f_1390507392384_798171_29256", + "_17_0_2_3_407019f_1390507415007_980263_29329", + "_17_0_2_3_407019f_1386871355202_825879_26310", + "_17_0_2_3_407019f_1390507334373_78013_29205", + "_17_0_2_3_407019f_1387309243448_48276_29113", + "_17_0_2_3_407019f_1390507595220_102072_29439", + "_17_0_2_3_407019f_1386871384972_702931_26371" + ], + "editable": true, + "id": "_17_0_2_3_407019f_1390507595220_102072_29439", + "lastModified": "2014-02-10T11:45:04.310-08:00", + "qualifiedName": "/test/Test334/doc/Components" +}]} diff --git a/mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439_elements.json b/mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439_elements.json new file mode 100755 index 000000000..24dce4eae --- /dev/null +++ b/mocks/json/view_17_0_2_3_407019f_1390507595220_102072_29439_elements.json @@ -0,0 +1,88 @@ +{"elements": [ + { + "author": "dlam", + "documentation": "

\nA spacecraft doesn't need wheels, but what the heck.\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1390507392384_798171_29256", + "lastModified": "2014-02-10T11:41:07.086-08:00", + "name": "Wheel", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/Wheel", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "

\nThis is a thing that flies in space.\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1386871355202_825879_26310", + "lastModified": "2014-02-10T11:41:06.496-08:00", + "name": "Spacecraft", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/Spacecraft", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507415007_980263_29329", + "isDerived": false, + "lastModified": "2014-02-10T11:41:07.245-08:00", + "name": "mass", + "owner": "_17_0_2_3_407019f_1390507392384_798171_29256", + "qualifiedName": "/test/Test334/components/Wheel/mass", + "type": "Property", + "value": [33], + "valueType": "LiteralReal" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1387309243448_48276_29113", + "isDerived": false, + "lastModified": "2014-02-10T11:41:06.810-08:00", + "name": "mass", + "owner": "_17_0_2_3_407019f_1386871355202_825879_26310", + "qualifiedName": "/test/Test334/components/Spacecraft/mass", + "type": "Property", + "value": [34.2], + "valueType": "LiteralReal" + }, + { + "author": "dlam", + "documentation": "", + "editable": true, + "id": "_17_0_2_3_407019f_1390507334373_78013_29205", + "isDerived": false, + "lastModified": "2014-02-10T11:41:07.886-08:00", + "name": "mass", + "owner": "_17_0_2_3_407019f_1386871384972_702931_26371", + "qualifiedName": "/test/Test334/components/RTG/mass", + "type": "Property", + "value": [2.3], + "valueType": "LiteralReal" + }, + { + "author": "dlam", + "documentation": "

\nthis is showing components of the spacecraft\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1390507595220_102072_29439", + "lastModified": "2014-02-10T11:45:04.310-08:00", + "name": "Components", + "owner": "_17_0_2_3_407019f_1390508230826_18392_31223", + "qualifiedName": "/test/Test334/doc/Components", + "type": "Element" + }, + { + "author": "dlam", + "documentation": "

\nthis is the power source\n\n <\/p>", + "editable": true, + "id": "_17_0_2_3_407019f_1386871384972_702931_26371", + "lastModified": "2014-02-10T11:41:07.696-08:00", + "name": "RTG", + "owner": "_17_0_2_3_407019f_1386871371493_325781_26346", + "qualifiedName": "/test/Test334/components/RTG", + "type": "Element" + } +]} \ No newline at end of file diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 000000000..9ad83e962 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,162 @@ + + + + + # # Frontend server block + # server { + # # SSL settings + # ssl_protocols TLSv1.2 TLSv1.3; + # ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; + # ssl_prefer_server_ciphers off; + # ssl_session_timeout 1d; + # ssl_session_cache shared:MozSSL:10m; + # ssl_session_tickets off; + # listen 443 ssl; + # server_name openmbee.apps.arena-workspace.navair.navy.mil; + + # ssl_certificate /etc/secrets/ve/tls.crt; + # ssl_certificate_key /etc/secrets/ve/tls.key; + + # location / { + # proxy_pass https://openmbee.apps.arena-workspace.navair.navy.mil; # Replace with the actual location of your frontend service + # proxy_set_header Host $host; + # proxy_set_header X-Real-IP $remote_addr; + # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # proxy_set_header X-Forwarded-Proto $scheme; + # } + # } + + # # Backend server block + # server { + # # SSL settings + # ssl_protocols TLSv1.2 TLSv1.3; + # ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; + # ssl_prefer_server_ciphers off; + # ssl_session_timeout 1d; + # ssl_session_cache shared:MozSSL:10m; + # ssl_session_tickets off; + # listen 443 ssl; + # server_name openmbee-mms.openmbee.svc.cluster.local; + + # ssl_certificate /etc/secrets/mms/tls.crt; + # ssl_certificate_key /etc/secrets/mms/tls.key; + + # location / { + # proxy_pass http://openmbee-mms.openmbee.svc.cluster.local:5000; + # proxy_set_header Host $host; + # proxy_set_header X-Real-IP $remote_addr; + # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + # proxy_set_header X-Forwarded-Proto $scheme; + # } + # } + + + +# # server { +# # listen 8080; +# # server_name openmbee-mms.apps.arena-workspace.navair.navy.mil; + +# # # Serve Angular static files +# # location / { +# # root /usr/share/nginx/html; +# # try_files $uri $uri/ /index.html; +# # proxy_pass https://openmbee-mms.apps.arena-workspace.navair.navy.mil:5000; # Point to your Spring Boot backend +# # proxy_set_header Host $host; +# # proxy_set_header X-Real-IP $remote_addr; +# # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +# # proxy_set_header X-Forwarded-Proto $scheme; +# # } + +# # # SSL configuration, if you're using SSL (recommended) +# # # listen 443 ssl; +# # # ssl_certificate /path/to/your/cert.crt; +# # # ssl_certificate_key /path/to/your/private-key.key; +# # # ... other SSL settings ... +# # } + +# server { +# # listen 8080; +# listen 443 ssl; +# server_name openmbee.apps.arena-workspace.navair.navy.mil; + +# # SSL settings +# ssl_certificate /etc/secrets/tls.crt; +# ssl_certificate_key /etc/secrets/tls.key; + +# # Other SSL settings for security +# ssl_protocols TLSv1.2 TLSv1.3; +# ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384'; +# ssl_prefer_server_ciphers off; +# ssl_session_timeout 1d; +# ssl_session_cache shared:MozSSL:10m; +# ssl_session_tickets off; + +# location / { + +# # Add headers to allow CORS +# add_header 'Access-Control-Allow-Origin' 'openmbee.apps.arena-workspace.navair.navy.mil/' always; +# add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS' always; +# add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization' always; +# add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always; +# add_header 'Access-Control-Allow-Credentials' 'true' always; + +# # Preflight request. Reply successfully: +# if ($request_method = 'OPTIONS') { +# add_header 'Access-Control-Allow-Origin' 'openmbee.apps.arena-workspace.navair.navy.mil/'; +# add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS'; +# add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization'; +# add_header 'Access-Control-Max-Age' 1728000; +# add_header 'Content-Type' 'text/plain; charset=utf-8'; +# add_header 'Content-Length' 0; +# return 204; +# } +# root /usr/share/nginx/html; +# index index.html index.htm; +# # proxy_pass http://openmbee-mms.apps.arena-workspace.navair.navy.mil; +# try_files $uri $uri/ /index.html =404; +# } + + +# gzip on; +# gzip_vary on; +# gzip_min_length 1024; +# gzip_proxied any; +# gzip_types +# text/plain +# text/css +# text/js +# text/xml +# text/javascript +# application/javascript +# application/x-javascript +# application/json +# application/xml +# application/rss+xml +# image/svg+xml; +# gzip_disable "MSIE [1-6]\."; +# } +server { + listen 8080; + location / { + root /usr/share/nginx/html; + index index.html index.htm; + try_files $uri $uri/ /index.html =404; + } + gzip on; + gzip_vary on; + gzip_min_length 1024; + gzip_proxied any; + gzip_types + text/plain + text/css + text/js + text/xml + text/javascript + application/javascript + application/x-javascript + application/json + application/xml + application/rss+xml + image/svg+xml; + gzip_disable "MSIE [1-6]\."; +} \ No newline at end of file diff --git a/old_package-lock.json b/old_package-lock.json new file mode 100644 index 000000000..8ea6fd46e --- /dev/null +++ b/old_package-lock.json @@ -0,0 +1,24346 @@ +{ + "name": "mms-ve", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "mms-ve", + "dependencies": { + "c3": "^0.5.4", + "d3": "^5.1.0", + "ng": "*", + "serve": "^14.2.1" + }, + "devDependencies": { + "babel-polyfill": "^6.26.0", + "compression": "^1.7.1", + "connect-livereload": "^0.6.0", + "connect-modrewrite": "^0.10.2", + "grunt": "^1.0.1", + "grunt-bower-install-simple": "1.2.4", + "grunt-cache-breaker": "^2.0.1", + "grunt-cache-bust": "~1.6.0", + "grunt-concurrent": "^2.3.1", + "grunt-connect-proxy-updated": "^0.2.1", + "grunt-contrib-clean": "^1.1.0", + "grunt-contrib-concat": "^1.0.1", + "grunt-contrib-connect": "~1.0.2", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-cssmin": "^2.1.0", + "grunt-contrib-jshint": "^1.1.0", + "grunt-contrib-sass": "^2.0.0", + "grunt-contrib-uglify": "^5.2.2", + "grunt-contrib-watch": "^1.1.0", + "grunt-html2js": "^0.5.1", + "grunt-karma": "^2.0.0", + "grunt-middleware-proxy": "^1.0.7", + "grunt-mkdir": "^1.1.0", + "grunt-ngdocs": "^0.2.11", + "grunt-protractor-runner": "^5.0.0", + "grunt-sass": "^2.0.0", + "grunt-terser": "^2.0.0", + "grunt-usemin": "^3.0.0", + "grunt-wiredep": "~3.0.1", + "jasmine-core": "~2.8.0", + "jasmine-jquery": "^2.1.1", + "jit-grunt": "~0.10.0", + "karma": "^1.7.1", + "karma-chrome-launcher": "^2.1.1", + "karma-fixture": "^0.2.6", + "karma-html2js-preprocessor": "^1.0.0", + "karma-jasmine": "^1.1.1", + "karma-jasmine-jquery": "^0.1.1", + "karma-json-fixtures-preprocessor": "0.0.6", + "karma-junit-reporter": "^1.2.0", + "karma-nyan-reporter": "^0.2.3", + "karma-phantomjs-launcher": "^1.0.4", + "phantomjs-prebuilt": "^2.1.16", + "protractor": "~5.2.0", + "terser": "^5.10.0", + "time-grunt": "^1.4.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "1.1.2", + "@jridgewell/sourcemap-codec": "1.4.15", + "@jridgewell/trace-mapping": "0.3.19" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "0.3.3", + "@jridgewell/trace-mapping": "0.3.19" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.1", + "@jridgewell/sourcemap-codec": "1.4.15" + } + }, + "node_modules/@types/babel-types": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.11.tgz", + "integrity": "sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==", + "dev": true, + "optional": true + }, + "node_modules/@types/babylon": { + "version": "6.16.6", + "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.6.tgz", + "integrity": "sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w==", + "dev": true, + "optional": true, + "dependencies": { + "@types/babel-types": "7.0.11" + } + }, + "node_modules/@types/node": { + "version": "6.14.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.13.tgz", + "integrity": "sha512-J1F0XJ/9zxlZel5ZlbeSuHW2OpabrUAqpFuC2sm2I3by8sERQ8+KCjNKUcq8QHuzpGMWiJpo9ZxeHrqrP2KzQw==", + "dev": true + }, + "node_modules/@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", + "dev": true + }, + "node_modules/@types/selenium-webdriver": { + "version": "2.53.50", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.50.tgz", + "integrity": "sha512-VLagihTlCKBanWCo+45Sev2anP4OQY8B6ws2aeewAZVrQ0xZ9ZSI0CbeVx08CU2oRNfUdeM6RgZyXkLiL3e+GQ==", + "dev": true + }, + "node_modules/@zeit/schemas": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", + "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "2.1.35", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "dev": true, + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", + "dev": true, + "optional": true, + "dependencies": { + "acorn": "4.0.13" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha512-SYIiqLfr6QvmEM0yw89mD8ba2HjK+duf7oVPEw79+NPDqyQScAU8IgDPZzFt9CVdD2yaAuWJqFQGLkongB6cJQ==", + "dev": true, + "engines": { + "node": ">=0.3.0" + } + }, + "node_modules/after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", + "dev": true + }, + "node_modules/agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha512-oDtZV740o3fr5oJtPLOsgH2hl2TRPscNXIx4VzzBwVlXVkv8RHm7XXqGAYg8t20+Gwu6LNDnx8HRMGqVGPZ8Vw==", + "dev": true, + "dependencies": { + "extend": "3.0.2", + "semver": "5.0.3" + } + }, + "node_modules/agent-base/node_modules/semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha512-5OkOBiw69xqmxOFIXwXsiY1HlE+om8nNptg1ZIf95fzcnfgOv2fLm7pmmGbRJsjJIqPpW5Kwy4wpDBTz5wQlUw==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "3.1.3", + "fast-json-stable-stringify": "2.1.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.4.1" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/align-text/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "dependencies": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "node_modules/anymatch/node_modules/braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "dependencies": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/anymatch/node_modules/micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "dependencies": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/archy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", + "integrity": "sha512-8mMsetjXv4pCPTrMbPPO2cxy9vzJn2jwbd+ug+mf8fEUZG2E78Vo5erJMjrnGuLTKqOLtS5ulFHJSfg1yaCjxA==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dev": true, + "dependencies": { + "delegates": "1.0.0", + "readable-stream": "2.3.8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "1.0.3" + } + }, + "node_modules/argparse/node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "dependencies": { + "arr-flatten": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw==", + "dev": true + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.1.tgz", + "integrity": "sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q==", + "dev": true + }, + "node_modules/array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw==", + "dev": true + }, + "node_modules/array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "dependencies": { + "array-uniq": "1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==", + "dev": true + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "optional": true + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "2.1.2" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true + }, + "node_modules/async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "node_modules/babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "dependencies": { + "babel-runtime": "6.26.0", + "core-js": "2.6.12", + "regenerator-runtime": "0.10.5" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "dependencies": { + "core-js": "2.6.12", + "regenerator-runtime": "0.11.1" + } + }, + "node_modules/babel-runtime/node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "optional": true, + "dependencies": { + "babel-runtime": "6.26.0", + "esutils": "2.0.3", + "lodash": "4.17.21", + "to-fast-properties": "1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "optional": true, + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha512-rz8L+d/xByiB/vLVftPkyY215fqNrmasrcJsYkVcm4TgJNz+YXKrFaFAWibSaHkiKoSgMDCb+lipOIRQNGYesw==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "0.14.5" + } + }, + "node_modules/better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", + "dev": true, + "dependencies": { + "callsite": "1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "dependencies": { + "buffers": "0.1.1", + "chainsaw": "0.1.0" + } + }, + "node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha512-njlCs8XLBIK7LCChTWfzWuIAxkpmmLXcL7/igCofFT1B039Sz0IPnAmosN5QaO22lU4qr8LcUz2ojUlE6pLkRQ==", + "dev": true, + "dependencies": { + "readable-stream": "1.0.34" + } + }, + "node_modules/bl/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha512-YRc9zvVz4wNaxcXmiSgb9LAg7YYwqQ2xd0Sj6osfA7k/PKmIGVlnOYs3wOFdkRC9/JpQu8sGt/zHgJV7xzerfg==", + "dev": true + }, + "node_modules/block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.4" + }, + "engines": { + "node": "0.4 || >=0.5.8" + } + }, + "node_modules/blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "dependencies": { + "minimist": "1.2.8" + }, + "bin": { + "blocking-proxy": "built/lib/bin.js" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "dependencies": { + "continuable-cache": "0.3.1", + "error": "7.2.1", + "raw-body": "1.1.7", + "safe-json-parse": "1.0.1" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "dependencies": { + "side-channel": "1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/body-parser/node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/body-parser/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==", + "dev": true, + "dependencies": { + "hoek": "0.9.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz", + "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==", + "dev": true, + "bin": { + "bower": "bin/bower" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-config": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-1.4.3.tgz", + "integrity": "sha512-MVyyUk3d1S7d2cl6YISViwJBc2VXCkxF5AUFykvN0PQj5FsUiMNSgAYTso18oRFfyZ6XEtjrgg9MAaufHbOwNw==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "minimist": "0.2.4", + "mout": "1.2.4", + "osenv": "0.1.5", + "untildify": "2.1.0", + "wordwrap": "0.0.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-config/node_modules/minimist": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.4.tgz", + "integrity": "sha512-Pkrrm8NjyQ8yVt8Am9M+yUt74zE3iokhzbG1bFVNjLB92vwM71hf40RkEsryg98BujhVOncKm/C1xROxZ030LQ==", + "dev": true + }, + "node_modules/bower-config/node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-endpoint-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", + "integrity": "sha512-YWZHhWkPdXtIfH3VRu3QIV95sa75O9vrQWBOHjexWCLBCTy5qJvRr36LXTqFwTchSXVlzy5piYJOjzHr7qhsNg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-installer": { + "resolved": "git+ssh://git@github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7", + "dev": true, + "dependencies": { + "async": "0.2.10", + "bower": "1.3.12", + "colors": "0.6.2", + "glob": "3.2.11", + "lodash": "0.9.2", + "mkdirp": "0.3.5", + "node-fs": "0.1.7", + "nopt": "2.1.2" + }, + "bin": { + "bower-installer": "bower-installer.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "node_modules/bower-installer/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.9" + } + }, + "node_modules/bower-installer/node_modules/assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bower-installer/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/bower-installer/node_modules/aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==", + "dev": true, + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/bower": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.3.12.tgz", + "integrity": "sha512-YqGbbhwrQHbHI9+M8tVHbq5twIhVfJaQRM3TOmgtz5Dh9sPwYjiT8oo8MIhv0Ma+c4xVsABB+B3ooMJC8hdcbw==", + "dev": true, + "dependencies": { + "abbrev": "1.0.9", + "archy": "0.0.2", + "bower-config": "0.5.3", + "bower-endpoint-parser": "0.2.2", + "bower-json": "0.4.0", + "bower-logger": "0.2.2", + "bower-registry-client": "0.2.4", + "cardinal": "0.4.0", + "chalk": "0.5.0", + "chmodr": "0.1.0", + "decompress-zip": "0.0.8", + "fstream": "1.0.12", + "fstream-ignore": "1.0.5", + "glob": "4.0.6", + "graceful-fs": "3.0.12", + "handlebars": "2.0.0", + "inquirer": "0.7.1", + "insight": "0.4.3", + "is-root": "1.0.0", + "junk": "1.0.3", + "lockfile": "1.0.4", + "lru-cache": "2.5.2", + "mkdirp": "0.5.0", + "mout": "0.9.1", + "nopt": "3.0.6", + "opn": "1.0.2", + "osenv": "0.1.0", + "p-throttler": "0.1.0", + "promptly": "0.2.0", + "q": "1.0.1", + "request": "2.42.0", + "request-progress": "0.3.0", + "retry": "0.6.0", + "rimraf": "2.2.8", + "semver": "2.3.2", + "shell-quote": "1.4.3", + "stringify-object": "1.0.1", + "tar-fs": "0.5.2", + "tmp": "0.0.23", + "update-notifier": "0.2.0", + "which": "1.0.9" + }, + "bin": { + "bower": "bin/bower" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/bower-config": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.3.tgz", + "integrity": "sha512-Ly0EwAJGD5fX7y7vSvgo+yKPh+oME9jYd5Npqecxs5izpjV8aMZGF3j1ZhDDOCBIFDVNk+gGmKZAFAPmr86jLQ==", + "dev": true, + "dependencies": { + "graceful-fs": "2.0.3", + "mout": "0.9.1", + "optimist": "0.6.1", + "osenv": "0.0.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-installer/node_modules/bower-config/node_modules/graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-installer/node_modules/bower-config/node_modules/osenv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha512-VBk1bfdaO4gh3OWO8LBuDY2alp0buL8YzQ6t13xyc8PQPrnUg5AgQvINQx3UkS4dom8UGCL597q4Y2+M4TPvmw==", + "dev": true + }, + "node_modules/bower-installer/node_modules/bower/node_modules/glob": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz", + "integrity": "sha512-D0H1thJnOVgI0zRV3H/Vmb9HWmDgGTTR7PeT8Lk0ri2kMmfK3oKQBolfqJuRpBVpTx5Q5PKGl9hdQEQNTXJI7Q==", + "dev": true, + "dependencies": { + "graceful-fs": "3.0.12", + "inherits": "2.0.4", + "minimatch": "1.0.0", + "once": "1.4.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/bower/node_modules/mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha512-xjjNGy+ry1lhtIKcr2PT6ok3aszhQfgrUDp4OZLHacgRgFmF6XR9XCOJVcXlVGQonIqXcK1DvqgKKQOPWYGSfw==", + "dev": true, + "dependencies": { + "minimist": "0.0.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/bower-installer/node_modules/bower/node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1.0.9" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/bower-installer/node_modules/caseless": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", + "integrity": "sha512-/X9C8oGbZJ95LwJyK4XvN9GSBgw/rqBnUg6mejGhf/GNfJukt5tzOXP+CJicXdWSqAX0ETaufLDxXuN2m4/mDg==", + "dev": true + }, + "node_modules/bower-installer/node_modules/chalk": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.0.tgz", + "integrity": "sha512-rTCcbF0wrwC+kKzA/3SpBc6PrcOx/+PRQVtS3PEDw5tGzqycpB48dRS8ByxFDd8Ij5E1RtafZ34R1X9VLI/vUQ==", + "dev": true, + "dependencies": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/bower-installer/node_modules/combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "dev": true, + "optional": true, + "dependencies": { + "delayed-stream": "0.0.5" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bower-installer/node_modules/delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-installer/node_modules/forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==", + "dev": true, + "optional": true, + "dependencies": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime": "1.2.11" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bower-installer/node_modules/form-data/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "dev": true, + "optional": true + }, + "node_modules/bower-installer/node_modules/glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "dependencies": { + "inherits": "2.0.4", + "minimatch": "0.3.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/glob/node_modules/minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "dev": true, + "dependencies": { + "lru-cache": "2.5.2", + "sigmund": "1.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "dependencies": { + "natives": "1.1.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-installer/node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", + "dev": true, + "optional": true, + "dependencies": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bower-installer/node_modules/lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/bower-installer/node_modules/lru-cache": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", + "integrity": "sha512-wyqfj+623mgqv+bpjTdivSoC/LtY9oOrmKz2Cke0NZcgYW9Kce/qWjd9e5PDYf8wuiKfVeo8VnyOSSyeRiUsLw==", + "dev": true + }, + "node_modules/bower-installer/node_modules/mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==", + "dev": true, + "optional": true + }, + "node_modules/bower-installer/node_modules/mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/bower-installer/node_modules/minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha512-Ejh5Odk/uFXAj5nf/NSXk0UamqcGAfOdHI7nY0zvCHyn4f3nKLFoUTp+lYxDxSih/40uW8lpwDplOWHdWkQXWA==", + "dev": true, + "dependencies": { + "lru-cache": "2.5.2", + "sigmund": "1.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "node_modules/bower-installer/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "node_modules/bower-installer/node_modules/mout": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz", + "integrity": "sha512-mZMABHAQPQ87JDQuxZIndS6XXDYZfeAfcTvHYyEFG4SEUiGNkInNZi/WhesQjCKUWih1bDDkqHw63wyCaczhsw==", + "dev": true + }, + "node_modules/bower-installer/node_modules/node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/bower-installer/node_modules/nopt": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", + "integrity": "sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==", + "dev": true, + "dependencies": { + "abbrev": "1.0.9" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/bower-installer/node_modules/oauth-sign": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", + "integrity": "sha512-vF36cbrUyfy7Yr6kTIzrj3RsuaPYeJKU3IUOC6MglfNTyiGT6leGvEVOa3UsSsgwBzfVfRnvMiMVyUnpXNqN8w==", + "dev": true, + "optional": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/opn": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz", + "integrity": "sha512-4w6LXX5mR/XGoM8QfFOfixA7aCLTUwNXPPAvUM5pXfc/8oGyQx6IskSzjuRvNZvD6tT6SCsBTlw4VBMUR6dA2w==", + "dev": true, + "bin": { + "opn": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/osenv": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz", + "integrity": "sha512-PenJexmyQ/42JhvtcLRdVaWobP+JccHIclnQeTL2t66j6aAB79iVdOzwC1DtRDuv49e/QjFq7CMC5YYPVw1rcg==", + "dev": true + }, + "node_modules/bower-installer/node_modules/q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/bower-installer/node_modules/qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==", + "dev": true + }, + "node_modules/bower-installer/node_modules/request": { + "version": "2.42.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", + "integrity": "sha512-ZpqQyQWQ7AdVurjxpmP/fgpN3wAZBruO2GeD3zDijWmnqg3SYz9YY6uZC8tJF++IhZ/P2VZkZug/fFEshAkD6g==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "dependencies": { + "bl": "0.9.5", + "caseless": "0.6.0", + "forever-agent": "0.5.2", + "hawk": "1.1.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "qs": "1.2.2", + "stringstream": "0.0.6", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.4.3" + }, + "optionalDependencies": { + "aws-sign2": "0.5.0", + "form-data": "0.1.4", + "http-signature": "0.10.1", + "oauth-sign": "0.4.0" + } + }, + "node_modules/bower-installer/node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/bower-installer/node_modules/semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bower-installer/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-installer/node_modules/tmp": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz", + "integrity": "sha512-zR0TtNGw3OoChmmzHNnMVh6LRY7fCkxXnHOEI9/CZE5zn6TzZbyMknZdmQZzD0EhcQVT/9rZHeg1KqiqfAC5jw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-installer/node_modules/tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-installer/node_modules/which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", + "dev": true, + "bin": { + "which": "bin/which" + } + }, + "node_modules/bower-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", + "integrity": "sha512-CiCTvl2OndArvZjWYvaOuQWI/fjeaBz8wPLF8MWadHT+ULaBDqtQIOYqQFsxtzUFw6E206960mlZfiUuR1PPBg==", + "dev": true, + "dependencies": { + "deep-extend": "0.2.11", + "graceful-fs": "2.0.3", + "intersect": "0.0.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-json/node_modules/graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-logger": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz", + "integrity": "sha512-2x4n3GsmV6w3BeMK3zHv6T88HbuMQH2MJ0KZNbQMbJq8XPARdH1p9/CXsdkOBW5sMcnBCOVGxutDJYbkh2A7QQ==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-registry-client": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.2.4.tgz", + "integrity": "sha512-QtwcgMsDMWvCtA1yrOmahanAFMt5IWjF79erdi366r0X/AZxYwsLyHiAsb1o9WVy4kZb2Sp7kpZRiyN1X0rDiA==", + "dev": true, + "dependencies": { + "async": "0.2.10", + "bower-config": "0.5.3", + "graceful-fs": "2.0.3", + "lru-cache": "2.3.1", + "mkdirp": "0.3.5", + "request": "2.51.0", + "request-replay": "0.2.0", + "rimraf": "2.2.8" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bower-registry-client/node_modules/asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==", + "dev": true, + "engines": { + "node": ">=0.4.9" + } + }, + "node_modules/bower-registry-client/node_modules/assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bower-registry-client/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-registry-client/node_modules/bower-config": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.3.tgz", + "integrity": "sha512-Ly0EwAJGD5fX7y7vSvgo+yKPh+oME9jYd5Npqecxs5izpjV8aMZGF3j1ZhDDOCBIFDVNk+gGmKZAFAPmr86jLQ==", + "dev": true, + "dependencies": { + "graceful-fs": "2.0.3", + "mout": "0.9.1", + "optimist": "0.6.1", + "osenv": "0.0.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-registry-client/node_modules/caseless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz", + "integrity": "sha512-RtOAnto0D6IIVC+dU+vHyH0tXs6BfZ/s0kaaT5+6loiwoi9O3+J5iASBkliQHrd8GSRNGERS7f8pgaRc895bAg==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "dev": true, + "dependencies": { + "delayed-stream": "0.0.5" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bower-registry-client/node_modules/delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-registry-client/node_modules/forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-registry-client/node_modules/form-data": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "integrity": "sha512-LkinaG6JazVhYj2AKi67NOIAhqXcBOQACraT0WdhWW4ZO3kTiS0X7C1nJ1jFZf6wak4bVHIA/oOzWkh2ThAipg==", + "dev": true, + "dependencies": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime-types": "2.0.14" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bower-registry-client/node_modules/form-data/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/form-data/node_modules/mime-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "integrity": "sha512-2ZHUEstNkIf2oTWgtODr6X0Cc4Ns/RN/hktdozndiEhhAC2wxXejF1FH0XLHTEImE9h6gr/tcnr3YOnSGsxc7Q==", + "dev": true, + "dependencies": { + "mime-db": "1.12.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bower-registry-client/node_modules/graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/bower-registry-client/node_modules/http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", + "dev": true, + "dependencies": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/bower-registry-client/node_modules/lru-cache": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz", + "integrity": "sha512-EjtmtXFUu+wXm6PW3T6RT1ekQUxobC7B5TDCU0CS0212wzpwKiXs6vLun+JI+OoWmmliWdYqnrpjrlK7W3ELdQ==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/mime-db": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "integrity": "sha512-5aMAW7I4jZoZB27fXRuekqc4DVvJ7+hM8UcWrNj2mqibE54gXgPSonBYBdQW5hyaVNGmiYjY0ZMqn9fBefWYvA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bower-registry-client/node_modules/mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/bower-registry-client/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/mout": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz", + "integrity": "sha512-mZMABHAQPQ87JDQuxZIndS6XXDYZfeAfcTvHYyEFG4SEUiGNkInNZi/WhesQjCKUWih1bDDkqHw63wyCaczhsw==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/bower-registry-client/node_modules/oauth-sign": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz", + "integrity": "sha512-jXeZq5EriUSGdNIePO45lhemfuCBKi5DARdE30v173MPCLymq2DxR477J/RuCXLphNx7OVAqXVyj3JoUaiHpNw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/bower-registry-client/node_modules/osenv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha512-VBk1bfdaO4gh3OWO8LBuDY2alp0buL8YzQ6t13xyc8PQPrnUg5AgQvINQx3UkS4dom8UGCL597q4Y2+M4TPvmw==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A==", + "dev": true + }, + "node_modules/bower-registry-client/node_modules/request": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", + "integrity": "sha512-6pfShjLfn6ThOlPHyQo7nBxEwTa2PzvqHruxQS51TrADjWj3qetRZ2Ae5gRzMF7N2fKG5Ww7su+Z6jA3sFv0Gw==", + "dev": true, + "dependencies": { + "aws-sign2": "0.5.0", + "bl": "0.9.5", + "caseless": "0.8.0", + "combined-stream": "0.0.7", + "forever-agent": "0.5.2", + "form-data": "0.2.0", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.5.0", + "qs": "2.3.3", + "stringstream": "0.0.6", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.4.3" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/bower-registry-client/node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/bower-registry-client/node_modules/tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/boxen/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/boxen/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/boxen/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "1.0.2", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "dependencies": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/c3": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/c3/-/c3-0.5.4.tgz", + "integrity": "sha512-+Ido5E9fAM6Tn+v7MI5VxYbQwCn59WxW+wMfWdgQ4PS3NZu/yG8EwiXW/ZB//kFUmLplEkWabE9kn1ckC6YZ/w==", + "dependencies": { + "d3": "4.13.0" + } + }, + "node_modules/c3/node_modules/d3": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz", + "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==", + "dependencies": { + "d3-array": "1.2.1", + "d3-axis": "1.0.8", + "d3-brush": "1.0.4", + "d3-chord": "1.0.4", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-dsv": "1.0.8", + "d3-ease": "1.0.3", + "d3-force": "1.1.0", + "d3-format": "1.2.2", + "d3-geo": "1.9.1", + "d3-hierarchy": "1.1.5", + "d3-interpolate": "1.1.6", + "d3-path": "1.0.5", + "d3-polygon": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-queue": "3.0.7", + "d3-random": "1.1.0", + "d3-request": "1.0.6", + "d3-scale": "1.0.7", + "d3-selection": "1.3.0", + "d3-shape": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1", + "d3-timer": "1.0.7", + "d3-transition": "1.1.1", + "d3-voronoi": "1.1.2", + "d3-zoom": "1.7.1" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-breaker": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cache-breaker/-/cache-breaker-0.0.4.tgz", + "integrity": "sha512-LPJldJ74iN43nAZl/IRRc9SKtlKymhftnlROHXsUmCLjM/yZHO17zDICoAHyluxmUSkI8A3hrFlR6cDsWwQ95Q==", + "dev": true, + "dependencies": { + "lodash": "2.2.1" + } + }, + "node_modules/cache-breaker/node_modules/lodash": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.2.1.tgz", + "integrity": "sha512-rGaKzxe4Biu8YdCPD/tUkBF4/fnAqgj63A6PeAyQnH/NEKNUHgppGZUgYBYOmAZsBKwwAb343Q1Zew0RDB2jIg==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "1.1.1", + "get-intrinsic": "1.2.1" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "dependencies": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "dependencies": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cardinal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.0.tgz", + "integrity": "sha512-v9AEoI0C3hrH8+zh1qcns1KiAaDWmF8siZMXCS6rHbTL3y+R9oP34KESnSnZL+4/L1wVAKPlCRD+kF4aR4YN+w==", + "dev": true, + "dependencies": { + "redeyed": "0.4.4" + }, + "bin": { + "cdl": "bin/cdl.js" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dev": true, + "dependencies": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "dependencies": { + "traverse": "0.3.9" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "dependencies": { + "chalk": "^4.1.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/chalk-template?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "dependencies": { + "camel-case": "3.0.0", + "constant-case": "2.0.0", + "dot-case": "2.1.1", + "header-case": "1.0.1", + "is-lower-case": "1.1.3", + "is-upper-case": "1.1.2", + "lower-case": "1.1.4", + "lower-case-first": "1.0.2", + "no-case": "2.3.2", + "param-case": "2.1.1", + "pascal-case": "2.0.1", + "path-case": "2.1.1", + "sentence-case": "2.1.1", + "snake-case": "2.1.0", + "swap-case": "1.1.2", + "title-case": "2.1.1", + "upper-case": "1.1.3", + "upper-case-first": "1.1.2" + } + }, + "node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "optional": true, + "dependencies": { + "is-regex": "1.1.4" + } + }, + "node_modules/chmodr": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz", + "integrity": "sha512-TAHgbpLNK/h5D8qvtBUKc892GXWqGLkGmoEv6V2NUDTRCw2nI9IvbFi89cbEAooGwyqAZsePjyuLiWBj+H0twQ==", + "dev": true + }, + "node_modules/chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==", + "dev": true, + "dependencies": { + "anymatch": "1.3.2", + "async-each": "1.0.6", + "glob-parent": "2.0.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1" + }, + "optionalDependencies": { + "fsevents": "1.2.13" + } + }, + "node_modules/chokidar/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chokidar/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "0.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", + "dev": true, + "dependencies": { + "commander": "2.8.1", + "source-map": "0.4.4" + }, + "bin": { + "cleancss": "bin/cleancss" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css/node_modules/commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "dev": true, + "dependencies": { + "graceful-readlink": "1.0.1" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dev": true, + "dependencies": { + "amdefine": "1.0.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "dev": true, + "dependencies": { + "exit": "0.1.2", + "glob": "7.1.7" + }, + "engines": { + "node": ">=0.2.5" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-color": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", + "integrity": "sha512-e8BuO18ajBxfbL2eJldk8VgYDjshE8hV1ECafR0pl5EzgbyK9YnmGWLHylXVrQgaK4J1SJJzWDjIncfVuJvtpg==", + "dev": true, + "dependencies": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "memoizee": "0.3.10", + "timers-ext": "0.1.7" + } + }, + "node_modules/clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "dependencies": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dev": true, + "dependencies": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha512-4Mi0V7N48B9KzC8Zl/U7wiWuxMFEHf44N3/PSoAvWDu8IOPrddNo1y1tC/kXbP7IvVMhgCFMMNzgKb0pWoin9w==", + "dev": true, + "dependencies": { + "lodash": "4.17.21" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "1.3.8", + "bytes": "3.0.0", + "compressible": "2.0.18", + "debug": "2.6.9", + "on-headers": "1.0.2", + "safe-buffer": "5.1.2", + "vary": "1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "2.3.8", + "typedarray": "0.0.6" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "1.3.8", + "proto-list": "1.2.4" + } + }, + "node_modules/configstore": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", + "integrity": "sha512-2aMMi3erDQwgL7BgnW0aIzILAikpVH4TVEz60F/naT+XsPPX6IaPEuF/zD28XSNFWO/mHQ9OVRxkvcSbq6EFdA==", + "dev": true, + "dependencies": { + "graceful-fs": "3.0.12", + "js-yaml": "3.14.1", + "mkdirp": "0.5.6", + "object-assign": "2.1.1", + "osenv": "0.1.5", + "user-home": "1.1.1", + "uuid": "2.0.3", + "xdg-basedir": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/configstore/node_modules/graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "dependencies": { + "natives": "1.1.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/configstore/node_modules/object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/configstore/node_modules/uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", + "dev": true + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/connect-modrewrite": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/connect-modrewrite/-/connect-modrewrite-0.10.2.tgz", + "integrity": "sha512-37+kS9t26vxjW5ErNrr8d04F7Us1EH7XhHtxSm8yE8kO2uDF2DsPI+qI2wCeBSaoakXKit0/88sg4vL2Wl8tDw==", + "dev": true, + "dependencies": { + "qs": "6.11.2" + } + }, + "node_modules/console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "dev": true, + "dependencies": { + "date-now": "0.1.4" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "node_modules/constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "dev": true, + "dependencies": { + "snake-case": "2.1.0", + "upper-case": "1.1.3" + } + }, + "node_modules/constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/babel-types": "7.0.11", + "@types/babylon": "6.16.6", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==", + "dev": true, + "dependencies": { + "lru-cache": "4.1.5", + "which": "1.3.1" + } + }, + "node_modules/cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==", + "dev": true, + "dependencies": { + "boom": "0.4.2" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "node_modules/d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", + "dev": true, + "dependencies": { + "es5-ext": "0.10.62" + } + }, + "node_modules/d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "dependencies": { + "d3-array": "1.2.1", + "d3-axis": "1.0.8", + "d3-brush": "1.0.4", + "d3-chord": "1.0.4", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-contour": "1.3.2", + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-dsv": "1.0.8", + "d3-ease": "1.0.3", + "d3-fetch": "1.2.0", + "d3-force": "1.1.0", + "d3-format": "1.2.2", + "d3-geo": "1.9.1", + "d3-hierarchy": "1.1.5", + "d3-interpolate": "1.1.6", + "d3-path": "1.0.5", + "d3-polygon": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-random": "1.1.0", + "d3-scale": "2.2.2", + "d3-scale-chromatic": "1.5.0", + "d3-selection": "1.3.0", + "d3-shape": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1", + "d3-timer": "1.0.7", + "d3-transition": "1.1.1", + "d3-voronoi": "1.1.2", + "d3-zoom": "1.7.1" + } + }, + "node_modules/d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "node_modules/d3-axis": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", + "integrity": "sha512-K0djTb26iQ6AsuD2d6Ka08wBHf4V30awIxV4XFuB/iLzYtTqqJlE/nIN0DBJJCX7lbOqbt2/oeX3r+sU5k2veg==" + }, + "node_modules/d3-brush": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", + "integrity": "sha512-nUFueDzOlvwFvuOBynGSyJM7Wt1H9fKgJeoWFSg3ScS4c7FJBch92FKUJKum4xtgPYHdgH2C3bRg3GzSVltCJQ==", + "dependencies": { + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-transition": "1.1.1" + } + }, + "node_modules/d3-chord": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", + "integrity": "sha512-o0ExexkK1N0KikUakKrQwttP5Flu8AYD6iBUh3AdPJqnTh6xlvcX5wFRuuo29sLOAr9+T4yZPUH1S3CCQJ1SlQ==", + "dependencies": { + "d3-array": "1.2.1", + "d3-path": "1.0.5" + } + }, + "node_modules/d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha512-+TPxaBFzbzfpLF3Hjz8JPeuStNmJnyWAufu8VUfpDCDn5RieIgY+OQDjhKMDorf2naLgAjjZXLUQN7XFp/kgog==" + }, + "node_modules/d3-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", + "integrity": "sha512-t+rSOrshj6m2AUOe8kHvTwfUQ5TFoInEkBfmsHHAHPof58dmbRXNpicB7XAyPbMQbcC7i09p2BxeCEdgBd8xmw==" + }, + "node_modules/d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "dependencies": { + "d3-array": "1.2.1" + } + }, + "node_modules/d3-dispatch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", + "integrity": "sha512-Qh2DR3neW3lq/ug4oymXHYoIsA91nYt47ERb+fPKjRg6zLij06aP7KqHHl2NyziK9ASxrR3GLkHCtZvXe/jMVg==" + }, + "node_modules/d3-drag": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", + "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", + "dependencies": { + "d3-dispatch": "1.0.3", + "d3-selection": "1.3.0" + } + }, + "node_modules/d3-dsv": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", + "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", + "dependencies": { + "commander": "2.20.3", + "iconv-lite": "0.4.24", + "rw": "1.3.3" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/d3-ease": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", + "integrity": "sha512-io3QwOJwVPAxRF2UXpKpCdz2wm/7VLFCQQ1yy+GzX6YCtt3vi2BGnimI8agSF5jyUrHsADyF303d2S+ps7zU8w==" + }, + "node_modules/d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "dependencies": { + "d3-dsv": "1.0.8" + } + }, + "node_modules/d3-force": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", + "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", + "dependencies": { + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-timer": "1.0.7" + } + }, + "node_modules/d3-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", + "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" + }, + "node_modules/d3-geo": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", + "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", + "dependencies": { + "d3-array": "1.2.1" + } + }, + "node_modules/d3-hierarchy": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz", + "integrity": "sha512-PcsLIhThc60mWnxlojIOH7Sc0tQ2DgLWfEwEAyzCtej5f3H9wSsRmrg5pEhKZLrwiJnI2zyw/pznJxL9a/Eugw==" + }, + "node_modules/d3-interpolate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", + "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", + "dependencies": { + "d3-color": "1.0.3" + } + }, + "node_modules/d3-path": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", + "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" + }, + "node_modules/d3-polygon": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", + "integrity": "sha512-2zP7GOvf4XOWTeQouK7fCO534yQxyhYYTw6GTqcXifIalHgA6qV/es+4GRQii9m6XxEPFcht4loobD/o2iEo1A==" + }, + "node_modules/d3-quadtree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", + "integrity": "sha512-U2Jc3jF3JOBGXIOnvWY9C4ekRwRX9hEVpMMmeduJyaxAwPmoe7t84iZFTLn1RwYOyrXxJF55H/Hrg186TFQQdw==" + }, + "node_modules/d3-queue": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", + "integrity": "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==" + }, + "node_modules/d3-random": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", + "integrity": "sha512-XuMbjx3Jq4EWfJP4g6nR7zns/bZfaVbWHWfR8auDkEiWCzVbWifmasfszV1ZRN3xXK3nY4RUFL2nTIhceGZSFQ==" + }, + "node_modules/d3-request": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", + "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", + "dependencies": { + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-dsv": "1.0.8", + "xmlhttprequest": "1.8.0" + } + }, + "node_modules/d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "dependencies": { + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-format": "1.2.2", + "d3-interpolate": "1.1.6", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "dependencies": { + "d3-color": "1.0.3", + "d3-interpolate": "1.1.6" + } + }, + "node_modules/d3-selection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", + "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" + }, + "node_modules/d3-shape": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", + "integrity": "sha512-LP48zJ9ykPKjCdd0vSu5k2l4s8v1vI6vvdDeJtmgtTa+L6Ery0lzvOaV7pMunFuLv11hwSRZQnSnlhFl801aiw==", + "dependencies": { + "d3-path": "1.0.5" + } + }, + "node_modules/d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + }, + "node_modules/d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "dependencies": { + "d3-time": "1.0.8" + } + }, + "node_modules/d3-timer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", + "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + }, + "node_modules/d3-transition": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", + "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", + "dependencies": { + "d3-color": "1.0.3", + "d3-dispatch": "1.0.3", + "d3-ease": "1.0.3", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-timer": "1.0.7" + } + }, + "node_modules/d3-voronoi": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", + "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" + }, + "node_modules/d3-zoom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", + "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", + "dependencies": { + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-transition": "1.1.1" + } + }, + "node_modules/d3/node_modules/d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "dependencies": { + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-format": "1.2.2", + "d3-interpolate": "1.1.6", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" + } + }, + "node_modules/dargs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz", + "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", + "dev": true + }, + "node_modules/date-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", + "integrity": "sha512-RrxZQ06cdKe7YQ5oqIxs3GMc7W3vXscy7Ds+aZIqmxA59QnVtTiCseA4jbzVUub9xCbo9GuYVZo0OrZLYXnnmw==", + "dev": true, + "dependencies": { + "time-zone": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-zip": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.8.tgz", + "integrity": "sha512-83ZYuMw/GIpxJx8IQMi7xvdFynFJrZkmCTfae26DsPXGaxeDAusP+3LuNYczoA4HCQdWoaZX2w96aZJZdYewBQ==", + "dev": true, + "dependencies": { + "binary": "0.3.0", + "graceful-fs": "3.0.12", + "mkpath": "0.1.0", + "nopt": "2.2.1", + "q": "1.0.1", + "readable-stream": "1.1.14", + "touch": "0.0.2" + }, + "bin": { + "decompress-zip": "bin/decompress-zip" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/decompress-zip/node_modules/graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "dependencies": { + "natives": "1.1.6" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/decompress-zip/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/decompress-zip/node_modules/nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==", + "dev": true, + "dependencies": { + "abbrev": "1.1.1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/decompress-zip/node_modules/q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/decompress-zip/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "node_modules/decompress-zip/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/deep-extend": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz", + "integrity": "sha512-t2N+4ihO7YgydJOUI47I6GdXpONJ+jUZmYeTNiifALaEduiCja1mKcq3tuSp0RhA9mMfxdMN3YskpwB7puMAtw==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", + "dev": true, + "dependencies": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.7.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true, + "optional": true + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "dependencies": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.2", + "void-elements": "2.0.1" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "2.3.0", + "entities": "2.2.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dev": true, + "dependencies": { + "domelementtype": "1.3.1" + } + }, + "node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "dependencies": { + "dom-serializer": "0.2.2", + "domelementtype": "1.3.1" + } + }, + "node_modules/dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "dev": true, + "dependencies": { + "no-case": "2.3.2" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "dependencies": { + "end-of-stream": "1.4.4", + "inherits": "2.0.4", + "readable-stream": "2.3.8", + "stream-shift": "1.0.1" + } + }, + "node_modules/each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha512-0hJGub96skwr+sUojv7zQ0kc9i4jn3SwLiLk8Jr7KDz7aaaMzkN5UX3a/9ZhzC0OfZVyXHhlHcjC0KVOiKZ+HQ==", + "dev": true, + "dependencies": { + "onetime": "1.1.0", + "set-immediate-shim": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "1.4.0" + } + }, + "node_modules/engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha512-VNQ79eqoDiapJ2tDMu+N7SPDm11btXpO7b2gsxBVd1XbxBCx6xLyTESIuFlWUspsbuif6Rq88pYNrQce5G7bqw==", + "dev": true, + "dependencies": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + } + }, + "node_modules/engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha512-260nnbHkYPTPnA9cjH2oCvWmqNwYofsNBkDfViI9iS487oMcl3kUeSgXJCwMxASgOL5DVlQF4hb0NzRNFkUaFg==", + "dev": true, + "dependencies": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "dependencies": { + "ms": "0.7.2" + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha512-lobrh3Dhp6tD1hv7NAIMx+oX/rsH/yd6/4krpBmJ/6ulsMZgQMuttlWTuYVWLV6ZjlpWIOjz55KbQbcKSQywEQ==", + "dev": true, + "dependencies": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "node_modules/engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha512-3UyTJo+5Jbmr7rd3MosTAApK7BOIo4sjx8dJYSHa3Em5R3A9Y2s9GWu4JFJe6Px0VieJC0hKUA5NBytC+O7k2A==", + "dev": true, + "dependencies": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha512-AOPopplFOUlmUugwiZUCDpOwmqvSgdCyE8iJVLWI4NcB7qfMKQN34dn5xYtlUU03XGG5egRWW4NW5gIxpa5hEA==", + "dev": true, + "dependencies": { + "mime-types": "2.1.35", + "negotiator": "0.6.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "dependencies": { + "ms": "0.7.2" + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha512-lobrh3Dhp6tD1hv7NAIMx+oX/rsH/yd6/4krpBmJ/6ulsMZgQMuttlWTuYVWLV6ZjlpWIOjz55KbQbcKSQywEQ==", + "dev": true, + "dependencies": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "node_modules/entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true + }, + "node_modules/error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "dependencies": { + "string-template": "0.2.1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "0.2.1" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "dependencies": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.3", + "next-tick": "1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "dependencies": { + "d": "1.0.1", + "es5-ext": "0.10.62", + "es6-symbol": "3.1.3" + } + }, + "node_modules/es6-iterator/node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "0.10.62", + "type": "1.2.0" + } + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "dependencies": { + "d": "1.0.1", + "ext": "1.7.0" + } + }, + "node_modules/es6-symbol/node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "0.10.62", + "type": "1.2.0" + } + }, + "node_modules/es6-weak-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", + "dev": true, + "dependencies": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "es6-iterator": "0.1.3", + "es6-symbol": "2.0.1" + } + }, + "node_modules/es6-weak-map/node_modules/es6-iterator": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", + "dev": true, + "dependencies": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "es6-symbol": "2.0.1" + } + }, + "node_modules/es6-weak-map/node_modules/es6-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", + "dev": true, + "dependencies": { + "d": "0.1.1", + "es5-ext": "0.10.62" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "dependencies": { + "d": "1.0.1", + "es5-ext": "0.10.62" + } + }, + "node_modules/event-emitter/node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "dependencies": { + "es5-ext": "0.10.62", + "type": "1.2.0" + } + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha512-DOFqA1MF46fmZl2xtzXR3MPCRsXqgoFqdXcrCVYM3JNnfUeHTm/fh/v/iU7gBFpwkuBmoJPAm5GuhdDfSEJMJA==", + "dev": true + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/execa/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha512-zOOsEnAhvIxxd0esCNbYG2xerGf46niZ1egS43eV7Fu4t7VIScgPXMcMabCLaPrqkzwvwo6zZipDiX3t0ILF2w==", + "dev": true, + "dependencies": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-braces/node_modules/array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-braces/node_modules/braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha512-EIMHIv2UXHWFY2xubUGKz+hq9hNkENj4Pjvr7h58cmJgpkK2yMlKA8I484f7MSttkzVAy/lL7X9xDaILd6avzA==", + "dev": true, + "dependencies": { + "expand-range": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-braces/node_modules/expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha512-busOHJ0t7t5UcutcyNDqmaDX+1cb0XlqsAUgTlmplVv0rIqBaMcBSZRLlkDm0nxtl8O3o/EvRRrdQ/WnyPERLQ==", + "dev": true, + "dependencies": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-braces/node_modules/is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha512-la5kPULwIgkSSaZj9w7/A1uHqOBAgOhDUKQ5CkfL8LZ4Si6r4+2D0hI6b4o60MW4Uj2yNJARWIZUDPxlvOYQcw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-braces/node_modules/repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha512-yHeI3F9v20MY+8/5WAUgIWseMZwpLD+l9h5hGyzh6fQjhle2AwjjRDao1m5IozSDuVvMw09/mvE8AU1oDmZKpQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dev": true, + "dependencies": { + "is-posix-bracket": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "dependencies": { + "fill-range": "2.2.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "dependencies": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.1", + "repeat-element": "1.1.4", + "repeat-string": "1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-range/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "dependencies": { + "homedir-polyfill": "1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "dependencies": { + "type": "2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dev": true, + "dependencies": { + "is-extglob": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "dependencies": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.6", + "yauzl": "2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fast-url-parser/node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + }, + "node_modules/faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "dependencies": { + "websocket-driver": "0.7.4" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "1.2.0" + } + }, + "node_modules/figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", + "dev": true + }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "node_modules/filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "statuses": "1.5.0", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "dependencies": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "dependencies": { + "detect-file": "1.0.0", + "is-glob": "4.0.3", + "micromatch": "4.0.5", + "resolve-dir": "1.0.1" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "dependencies": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "dependencies": { + "for-in": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.35" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha512-05cXDIwNbFaoFWaz5gNHlUTbH5whiss/hr/ibzPd4MH3cR4w0ZKeIPiVdbyJurg3O5r/Bjpvn9KOb1/rPMf3nA==", + "dev": true, + "dependencies": { + "null-check": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "jsonfile": "3.0.1", + "universalify": "0.1.2" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "1.5.0", + "nan": "2.17.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "inherits": "2.0.4", + "mkdirp": "0.5.6", + "rimraf": "2.7.1" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha512-VVRuOs41VUqptEGiR0N5ZoWEcfGvbGRqLINyZAhHRnF3DH5wrqjNkYr3VbRoZnI41BZgO7zIVdiobc13TVI1ow==", + "dev": true, + "dependencies": { + "fstream": "1.0.12", + "inherits": "2.0.4", + "minimatch": "3.0.8" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "dev": true, + "dependencies": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.7", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.5" + } + }, + "node_modules/gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "dependencies": { + "globule": "1.3.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "1.1.1", + "has": "1.0.3", + "has-proto": "1.0.1", + "has-symbols": "1.0.3" + } + }, + "node_modules/get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.8", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dev": true, + "dependencies": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-base/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "dependencies": { + "is-glob": "2.0.1" + } + }, + "node_modules/glob-parent/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob-parent/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.3", + "ini": "1.3.8", + "is-windows": "1.0.2", + "which": "1.3.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", + "dev": true, + "dependencies": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.7", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "dependencies": { + "glob": "7.1.7", + "lodash": "4.17.21", + "minimatch": "3.0.8" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/got": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/got/-/got-0.3.0.tgz", + "integrity": "sha512-6DJBU8c+pWPYdajwiqhe22oPkq8FYr6xIPPcoJLfnQZbvrcOBJhoVmvNBxfqfDrJ3EXrd3pXpyVvPRPLv4K+PQ==", + "dev": true, + "dependencies": { + "object-assign": "0.3.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/got/node_modules/object-assign": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", + "integrity": "sha512-4gWmwoU6o9UImLLzq+8R+kzWT0ABYdKXuvSp08JpYzhibFvdUirMfE9nE5yYHcG1k9ClcVueR4TolZpRvwg5og==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "node_modules/grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "dependencies": { + "dateformat": "4.6.3", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "5.0.0", + "glob": "7.1.7", + "grunt-cli": "1.4.3", + "grunt-known-options": "2.0.0", + "grunt-legacy-log": "3.0.0", + "grunt-legacy-util": "2.0.1", + "iconv-lite": "0.6.3", + "js-yaml": "3.14.1", + "minimatch": "3.0.8", + "nopt": "3.0.6" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/grunt-bower-install-simple": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/grunt-bower-install-simple/-/grunt-bower-install-simple-1.2.4.tgz", + "integrity": "sha512-T+jq6ERQjyf4muAxfqthK6XxtJEI28kwbKZTyd6PUw5PT1rzecXfQrA+Y8rnK2wB5nYh/dyIQeOvdtXfUaNAyA==", + "dev": true, + "dependencies": { + "bower": "1.8.14", + "chalk": "1.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-bower-install-simple/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-bower-install-simple/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-bower-install-simple/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-cache-breaker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-cache-breaker/-/grunt-cache-breaker-2.0.1.tgz", + "integrity": "sha512-CXUt/ObRfnxr+//ZjHw18+scIk+cRoDInIlg7KgbjeKhah2qEQIECTaffIsJ2dSgvV3Cjv8LWQm+KDYgbOrI1Q==", + "dev": true, + "dependencies": { + "cache-breaker": "0.0.4", + "lodash.clonedeep": "3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-cache-bust": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/grunt-cache-bust/-/grunt-cache-bust-1.6.0.tgz", + "integrity": "sha512-X72wA793N27yBSGnEFT9+pjpT2eRVg2AGd2pAlx5WH63r/e3iX2QhX/E3P16iJk+d3+pIlFbYm4V5fZnWRqUyg==", + "dev": true, + "dependencies": { + "fs-extra": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-concurrent": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-2.3.1.tgz", + "integrity": "sha512-XPf7f39OPjDZAQmNmlLk52xOKPpfi8Z7kX8Ju6kOkUL4W53monshs3U8UF3ByccHxTML7+6njzvNN0ejUYPMmA==", + "dev": true, + "dependencies": { + "arrify": "1.0.1", + "async": "1.5.2", + "indent-string": "2.1.0", + "pad-stream": "1.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-concurrent/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/grunt-connect-proxy-updated": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/grunt-connect-proxy-updated/-/grunt-connect-proxy-updated-0.2.1.tgz", + "integrity": "sha512-BOUSFoabioNpIxhMVAeyHC1J3gyFebMokF7v+aX5TkdPzASsmeYEaTUmMroW8Vqr5UVHKSsge/XStfuzifmb6A==", + "dev": true, + "dependencies": { + "http-proxy": "1.11.3", + "lodash": "0.9.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-connect-proxy-updated/node_modules/lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/grunt-contrib-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", + "integrity": "sha512-tET+TYTd8vCtKeGwbLjoH8+SdI8ngVzGbPr7vlWkewG7mYYHIccd2Ldxq+PK3DyBp5Www3ugdkfsjoNKUl5MTg==", + "dev": true, + "dependencies": { + "async": "1.5.2", + "rimraf": "2.7.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-contrib-clean/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha512-QdTmcxe8aim2Z0dFeuSJ+f7fHIeY7PZaTMZxgvosjXwyMhpy2GUR5WHkr12lksHfZVE80v2wUwqF56wyfPUwoQ==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "source-map": "0.5.7" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-concat/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-concat/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-concat/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz", + "integrity": "sha512-7OPoyfGrpOYzuiRPzGyzWDe/xFcjttXe1ztVSFS8TAVBtpfXeeOV9RiwuyqA4yN1UeOG2Pnpx8s0DcUDAu21Gw==", + "dev": true, + "dependencies": { + "async": "1.5.2", + "connect": "3.7.0", + "connect-livereload": "0.5.4", + "http2": "3.3.7", + "morgan": "1.10.0", + "opn": "4.0.2", + "portscanner": "1.2.0", + "serve-index": "1.9.1", + "serve-static": "1.15.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-connect/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/grunt-contrib-connect/node_modules/connect-livereload": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha512-3KnRwsWf4VmP01I4hCDQqTc4e2UxOvJIi8i08GiwqX2oymzxNFY7PqjFkwHglYTJ0yzUJkO5yqdPxVaIz3Pbug==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "file-sync-cmp": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-copy/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-cssmin": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz", + "integrity": "sha512-IXNomhQ5ekVZbDbj/ik5YccoD9khU6LT2fDXqO1+/Txjq8cp0tQKjVS8i8EAbHOrSDkL7/UD6A7b+xj98gqh9w==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "clean-css": "4.1.11", + "maxmin": "2.1.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/grunt-contrib-cssmin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-cssmin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-cssmin/node_modules/clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", + "dev": true, + "dependencies": { + "source-map": "0.5.7" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/grunt-contrib-cssmin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-jshint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", + "integrity": "sha512-N8jtQ/FmvuRdJoEGphmGt+ov1oi5bJq4hPBPT/g54ed1glF34l2z5VAdHHhcgOaezBxur3kcMPChB0pfZxxcFw==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "hooker": "0.2.3", + "jshint": "2.9.7" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-jshint/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-jshint/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-jshint/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-sass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-sass/-/grunt-contrib-sass-2.0.0.tgz", + "integrity": "sha512-RxZ3dlZZTX4YBPu2zMu84NPYgJ2AYAlIdEqlBaixNVyLNbgvJBGUr5Gi0ec6IiOQbt/I/z7uZVN9HsRxgznIRw==", + "dev": true, + "dependencies": { + "async": "2.6.4", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "dargs": "6.1.0", + "which": "1.3.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/grunt-contrib-sass/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "1.9.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-sass/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "4.17.21" + } + }, + "node_modules/grunt-contrib-sass/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-sass/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/grunt-contrib-sass/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/grunt-contrib-sass/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.7.2", + "shebang-command": "1.2.0", + "which": "1.3.1" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/grunt-contrib-sass/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-sass/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-sass/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-sass/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-sass/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/grunt-contrib-uglify": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz", + "integrity": "sha512-ITxiWxrjjP+RZu/aJ5GLvdele+sxlznh+6fK9Qckio5ma8f7Iv8woZjRkGfafvpuygxNefOJNc+hfjjBayRn2Q==", + "dev": true, + "dependencies": { + "chalk": "4.1.2", + "maxmin": "3.0.0", + "uglify-js": "3.17.4", + "uri-path": "1.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "dependencies": { + "duplexer": "0.1.2", + "pify": "4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, + "dependencies": { + "chalk": "4.1.2", + "figures": "3.2.0", + "gzip-size": "5.1.1", + "pretty-bytes": "5.6.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/grunt-contrib-uglify/node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", + "dev": true, + "dependencies": { + "async": "2.6.4", + "gaze": "1.1.3", + "lodash": "4.17.21", + "tiny-lr": "1.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-contrib-watch/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "4.17.21" + } + }, + "node_modules/grunt-html2js": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/grunt-html2js/-/grunt-html2js-0.5.1.tgz", + "integrity": "sha512-INlQ9KAvi8SIMoG7WxyE0UXeHejZoR3pZqn3fhBcPWeq6IyRDKMOmJ1rMPkMnRECcbtV+7o/ao/Fm31oEUygpA==", + "dev": true, + "dependencies": { + "chokidar": "1.7.0", + "html-minifier": "3.0.3" + }, + "engines": { + "node": ">= 0.8.0" + }, + "optionalDependencies": { + "pug": "2.0.4" + } + }, + "node_modules/grunt-karma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-karma/-/grunt-karma-2.0.0.tgz", + "integrity": "sha512-/5plsdrES8dWrGhg33Q7AiYU1PUHXtMcZLP2pAppUJJKNmCpiGZXpVfHZ7KO19buVxb555UFbfhhbY7FccXH4g==", + "dev": true, + "dependencies": { + "lodash": "3.10.1" + } + }, + "node_modules/grunt-karma/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "node_modules/grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "dependencies": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "2.1.0", + "hooker": "0.2.3", + "lodash": "4.17.21" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "dependencies": { + "chalk": "4.1.2", + "lodash": "4.17.21" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "dependencies": { + "async": "3.2.4", + "exit": "0.1.2", + "getobject": "1.0.2", + "hooker": "0.2.3", + "lodash": "4.17.21", + "underscore.string": "3.3.6", + "which": "2.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt-legacy-util/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/grunt-middleware-proxy": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/grunt-middleware-proxy/-/grunt-middleware-proxy-1.0.7.tgz", + "integrity": "sha512-QlbSPd/LNhMkDiWAmvv8SAKFEttK9sV5SMwCxxTD/hUk3TnRqP+Tn1JkjgHXqUmFITVxrzgb9Se+uoHxVoxlbw==", + "dev": true + }, + "node_modules/grunt-mkdir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.1.0.tgz", + "integrity": "sha512-FRE17OYVveNbVJFX8GPGa5bzH2ZiAdBx3q0Kwk2Dg6l+TzLGaTdufUxiUWUbS2MERFacnmXZwDDOR5ZbYW0o+Q==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-ngdocs": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/grunt-ngdocs/-/grunt-ngdocs-0.2.11.tgz", + "integrity": "sha512-JUORqj8/Ad6ne8fZlV7CgWF3OxiEtl0VXw9kzeUzXo3ym74M0j/zH6BsFBMMDYOq7DXtD1rZbPnl4s4b/X54iQ==", + "dev": true, + "dependencies": { + "lodash": "4.17.21", + "marked": "0.3.19", + "shelljs": "0.3.0", + "upath": "0.2.0" + } + }, + "node_modules/grunt-protractor-runner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-protractor-runner/-/grunt-protractor-runner-5.0.0.tgz", + "integrity": "sha512-VW28paNRjOEurLhfGwLYHNkma0hIxgeqP5Fk35whCcAmRHHPSDrC3YYnEfrwawwY1+qpHFiKk5zr92xRW/8X4A==", + "dev": true, + "dependencies": { + "protractor": "5.2.2", + "split": "1.0.1", + "through2": "2.0.5" + }, + "engines": { + "node": ">= 6.9.4" + } + }, + "node_modules/grunt-sass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-2.1.0.tgz", + "integrity": "sha512-XkexnQt/9rhReNd+Y7T0n/2g5FqYOQKfi2iSlpwDqvgs7EgEaGTxNhnWzHnbW5oNRvzL9AHopBG3AgRxL0d+DA==", + "dev": true, + "dependencies": { + "each-async": "1.1.1", + "node-sass": "4.14.1", + "object-assign": "4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-terser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-terser/-/grunt-terser-2.0.0.tgz", + "integrity": "sha512-9Rw1TiPsqadCJnEaKz+mZiS4k9ydnkNfrfvEq9SS6MqMXUxBC+sndDCHV05s5/PXQsFjFBhoRVFij5FaV36tYA==", + "dev": true, + "dependencies": { + "grunt": "1.6.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/grunt-usemin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/grunt-usemin/-/grunt-usemin-3.1.1.tgz", + "integrity": "sha512-73g3KOfB2gAxPk5qV1dgfcw/H6cg2S2YPHzt5ssPCiaNXOrN15HzGzP31il+tQymyP/MYYhRAOR+o7F5UGny/A==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "debug": "2.6.9", + "lodash": "3.10.1", + "path-exists": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-usemin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-usemin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-usemin/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "node_modules/grunt-usemin/node_modules/path-exists": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/grunt-usemin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-wiredep": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/grunt-wiredep/-/grunt-wiredep-3.0.1.tgz", + "integrity": "sha512-iI7TjUYyN1s7NY7JDbmF+y8Fa9dYje1xP2kzQYVqL1d24N4+jod6xntM+GQfBOEPF027gahxvhQt1ii3tCaPUw==", + "dev": true, + "dependencies": { + "wiredep": "4.0.0" + }, + "engines": { + "node": ">=0.10.0", + "npm": ">=2.3.0" + } + }, + "node_modules/grunt/node_modules/grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "dependencies": { + "grunt-known-options": "2.0.0", + "interpret": "1.1.0", + "liftup": "3.0.1", + "nopt": "4.0.3", + "v8flags": "3.2.0" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/grunt/node_modules/grunt-cli/node_modules/nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "dependencies": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/grunt/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": "2.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==", + "dev": true, + "dependencies": { + "duplexer": "0.1.2" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/handlebars": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-2.0.0.tgz", + "integrity": "sha512-OdfkaA0M8qGD5EJBkMw3TpguSWl6lz94jdyVmYs5e4TpwepZJ35Y5XlchsIwcN7NP/yzNa3MJYd/dRTO7Nf/fg==", + "dev": true, + "dependencies": { + "optimist": "0.3.7" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "2.3.6" + } + }, + "node_modules/handlebars/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true, + "optional": true + }, + "node_modules/handlebars/node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "dev": true, + "dependencies": { + "wordwrap": "0.0.2" + } + }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "optional": true, + "dependencies": { + "amdefine": "1.0.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/handlebars/node_modules/uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "integrity": "sha512-T2LWWydxf5+Btpb0S/Gg/yKFmYjnX9jtQ4mdN9YRq73BhN21EhU0Dvw3wYDLqd3TooGUJlCKf3Gfyjjy/RTcWA==", + "dev": true, + "optional": true, + "dependencies": { + "async": "0.2.10", + "optimist": "0.3.7", + "source-map": "0.1.43" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "dependencies": { + "ajv": "6.12.6", + "har-schema": "2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha512-k1Umb4/jrBWZbtL+QKSji8qWeoZ7ZTkXdnDXt1wxwBKAFM0//u96wDj43mBIqCIas8rDQMYyrBEvcS8hdGd4Sg==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/has-binary/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "optional": true, + "dependencies": { + "has-symbols": "1.0.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==", + "dev": true, + "dependencies": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha512-am8sVA2bCJIw8fuuVcKvmmNnGFUGW8spTkVtj2fXTEZVkfN42bwFZFtDem57eFi+NSxurJB8EQ7Jd3uCHLn8Vw==", + "dev": true, + "dependencies": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.9.1", + "sntp": "0.2.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dev": true, + "dependencies": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "node_modules/hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "dependencies": { + "parse-passwd": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/html-minifier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.0.3.tgz", + "integrity": "sha512-RLOMzutpO4Mv8ToW2b/CzZQ94IF3Cb6xYGbT+54k8BxQCQuntxdJr99/PkEnLDf92zakibKb5fKHJMSF6t3O/g==", + "dev": true, + "dependencies": { + "change-case": "3.0.2", + "clean-css": "3.4.28", + "commander": "2.9.0", + "he": "1.1.1", + "ncname": "1.0.0", + "relateurl": "0.2.7", + "uglify-js": "2.7.5" + }, + "bin": { + "html-minifier": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/html-minifier/node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "node_modules/html-minifier/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-minifier/node_modules/commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "dependencies": { + "graceful-readlink": "1.0.1" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/html-minifier/node_modules/uglify-js": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha512-RvbIYn4DIadCg1MV7YP7OrpxnVrtEieZzbK0KSQvwWGAHojqWJxInkQhmtYGRo9PTwwkJkljIgzMyA1VitEc4Q==", + "dev": true, + "dependencies": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/html-minifier/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "dependencies": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "node_modules/htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dev": true, + "dependencies": { + "domelementtype": "1.3.1", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + } + }, + "node_modules/htmlparser2/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/htmlparser2/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "node_modules/htmlparser2/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "dependencies": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.5.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.11.3.tgz", + "integrity": "sha512-dVzC6JlPUaRBONwMwVa/x1H5T0Gxn7VEldmfXuA++6+dE1a18VxfZoFIL2qHDVW4Eu+5m9ppPhm9ozeG/EhkmA==", + "dev": true, + "dependencies": { + "eventemitter3": "1.2.0", + "requires-port": "0.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "jsprim": "1.4.2", + "sshpk": "1.17.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/http2": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz", + "integrity": "sha512-puSi8M8WNlFJm9Pk4c/Mbz9Gwparuj3gO9/RRO5zv6piQ0FY+9Qywp0PdWshYgsMJSalixFY7eC6oPu0zRxLAQ==", + "dev": true, + "engines": { + "node": ">=0.12.0 <9.0.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha512-OZhm7//JDnQthMVqlPAfkZyPO2fMhfHY6gY+jZcX8rLfFiGtHiIQrfD80WvCDHNMQ77Ak3r5CiPRDD2rNzo2OQ==", + "dev": true, + "dependencies": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.2" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": "2.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "node_modules/in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true, + "bin": { + "in-install": "in-install.js", + "in-publish": "in-publish.js", + "not-in-install": "not-in-install.js", + "not-in-publish": "not-in-publish.js" + } + }, + "node_modules/indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "dependencies": { + "repeating": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inquirer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.7.1.tgz", + "integrity": "sha512-K7nscvi9u+COKmG4Ft33ohXgZfc9H/SeO86j+0NwIJXqw14oBL5AxnG4Ftgs6ZUjb3YwxHogTj/ZTLFYN4T3ow==", + "dev": true, + "dependencies": { + "chalk": "0.5.1", + "cli-color": "0.3.3", + "figures": "1.7.0", + "lodash": "2.4.2", + "mute-stream": "0.0.4", + "readline2": "0.1.1", + "rx": "2.5.3", + "through": "2.3.8" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "dependencies": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.4.3.tgz", + "integrity": "sha512-19hH6UMVq50cdkhQS3h4k9Y3vhbylAuocoPK7TA1wtB9uCGFCvZ3FdyOqKIkv3YzQD0fNurBLgjBAUsc6Jmefw==", + "dev": true, + "dependencies": { + "async": "0.9.2", + "chalk": "0.5.1", + "configstore": "0.3.2", + "inquirer": "0.6.0", + "lodash.debounce": "2.4.1", + "object-assign": "1.0.0", + "os-name": "1.0.3", + "request": "2.88.2", + "tough-cookie": "0.12.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "dev": true + }, + "node_modules/insight/node_modules/chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "dependencies": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/inquirer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.6.0.tgz", + "integrity": "sha512-bJO/y0P+wJaheeHvzQX0D84zPOKGCA1YB0naPAh11dKQU8cq7wEL5gEimW4WqtrD3Jmx5XBCdyR3N3vAaOiO9w==", + "dev": true, + "dependencies": { + "chalk": "0.5.1", + "cli-color": "0.3.3", + "lodash": "2.4.2", + "mute-stream": "0.0.4", + "readline2": "0.1.1", + "rx": "2.5.3", + "through": "2.3.8" + } + }, + "node_modules/insight/node_modules/lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/insight/node_modules/object-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz", + "integrity": "sha512-LpUkixU1BUMQ6bwUHbOue4IGGbdRbxi+IEZw7zHniw78erlxrKGHbhfLbHIsI35LGbGqys6QOrjVmLnD2ie+1A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/insight/node_modules/tough-cookie": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "integrity": "sha512-+gd4PklNJsxzu1NoNjhGRfOZZ5llND6VtQZGuaDXdmI0Ii79V5+YCa2sLx8Q6lYhYN2+9frCzUwOLQpuwHvO4Q==", + "dev": true, + "dependencies": { + "punycode": "2.3.0" + }, + "engines": { + "node": ">=0.4.12" + } + }, + "node_modules/interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true + }, + "node_modules/intersect": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", + "integrity": "sha512-Bp/mSG9dsq/eOMk2Q7DyjKxY62TTU2RvNvycjXHhi5TjrA72H+I3c5+1nAOAqtENcrQvCb5NDlsoPWJ4Bh01SA==", + "dev": true + }, + "node_modules/is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "dependencies": { + "is-relative": "1.0.0", + "is-windows": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "dependencies": { + "binary-extensions": "1.13.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "1.0.3" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dev": true, + "dependencies": { + "is-primitive": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==", + "dev": true, + "optional": true, + "dependencies": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "optional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "dependencies": { + "number-is-nan": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dev": true, + "dependencies": { + "lower-case": "1.1.4" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "dependencies": { + "is-path-inside": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "dependencies": { + "path-is-inside": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "optional": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "optional": true, + "dependencies": { + "call-bind": "1.0.2", + "has-tostringtag": "1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "dependencies": { + "is-unc-path": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "integrity": "sha512-1d50EJ7ipFxb9bIx213o6KPaJmHN8f+nR48UZWxWVzDx+NA3kpscxi02oQX3rGkEaLBi9m3ZayHngQc3+bBX9w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "dependencies": { + "unc-path-regex": "0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dev": true, + "dependencies": { + "upper-case": "1.1.3" + } + }, + "node_modules/is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "dependencies": { + "buffer-alloc": "1.2.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "node_modules/jasmine": { + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha512-kmuDC+6c9tA8BAZGd7wmucWKrM/aCCBSzCJEqRghvw9lKValw+pg88aN/BFIikmZwRTD57QmHamQ2wRpKb3FDQ==", + "dev": true, + "dependencies": { + "exit": "0.1.2", + "glob": "7.1.7", + "jasmine-core": "2.99.1" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", + "dev": true + }, + "node_modules/jasmine-jquery": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz", + "integrity": "sha512-13d18zXTGeiNAjd4sAhoUGQbCEXTMbUyjrnQ9JFQM/atyyFubHejL5RCE5iyW7jOh1cwjoqVefAAsSA4SFtooQ==", + "dev": true + }, + "node_modules/jasmine/node_modules/jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha512-ra97U4qu3OCcIxvN6eg3kyy8bLrID/TgxafSGMMICg3SFx5C/sUfDPpiOh7yoIsHdtjrOVdtT9rieYhqOsh9Ww==", + "dev": true + }, + "node_modules/jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", + "dev": true, + "engines": { + "node": ">= 6.9.x" + } + }, + "node_modules/jit-grunt": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", + "integrity": "sha512-eT/f4c9wgZ3buXB7X1JY1w6uNtAV0bhrbOGf/mFmBb0CDNLUETJ/VRoydayWOI54tOoam0cz9RooVCn3QY1WoA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true, + "optional": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "1.0.10", + "esprima": "4.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jshint": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", + "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", + "dev": true, + "dependencies": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "4.17.21", + "minimatch": "3.0.8", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + }, + "bin": { + "jshint": "bin/jshint" + } + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "node_modules/json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha512-I5YLeauH3rIaE99EE++UeH2M2gSYo8/2TqDac7oZEH6D/DSQ4Woa628Qrfj1X9/OY5Mk5VvIDQaKCDchXaKrmA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "optional": true, + "dependencies": { + "is-promise": "2.2.2", + "promise": "7.3.1" + } + }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "3.3.0", + "pako": "1.0.11", + "readable-stream": "2.3.8", + "setimmediate": "1.0.5" + } + }, + "node_modules/junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "dependencies": { + "bluebird": "3.7.2", + "body-parser": "1.20.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.7.0", + "core-js": "2.6.12", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.7", + "graceful-fs": "4.2.11", + "http-proxy": "1.18.1", + "isbinaryfile": "3.0.3", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.6.0", + "minimatch": "3.0.8", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.1", + "rimraf": "2.7.1", + "safe-buffer": "5.1.2", + "socket.io": "1.7.3", + "source-map": "0.5.7", + "tmp": "0.0.31", + "useragent": "2.3.0" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": "0.10 || 0.12 || 4 || 5 || 6 || 7 || 8" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "dependencies": { + "fs-access": "1.0.1", + "which": "1.3.1" + } + }, + "node_modules/karma-fixture": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/karma-fixture/-/karma-fixture-0.2.6.tgz", + "integrity": "sha512-7jVtBtUclZ7r6BIn5YK3BQO6Xkgyo/v3K51BwXde9Fn884lHV0Gy+UhCzJxsioMh1jCRr0NO+Mkm6EsxdVxRKA==", + "dev": true + }, + "node_modules/karma-html2js-preprocessor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz", + "integrity": "sha512-SiaPXNxIQjzBnxbi0mOT24zCzjFWBGaxWM/DqnEhp4WbI5kNpiZ35Jb/h7etrob+wiDSuDkltCuxE/fMSayqeQ==", + "dev": true + }, + "node_modules/karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha512-SENGE9DhlIIFTSZWiNq4eGeXL8G6z9cqHIOdkx9jh1qhhQqwEy3tAoLRyER0vOcHqdOlKmGpOuXk+HOipIy7sg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/karma-jasmine-jquery": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine-jquery/-/karma-jasmine-jquery-0.1.1.tgz", + "integrity": "sha512-0cokjpPXKmAH5RtoLacqV/lO3O4Mmm9Lfwv3XWMePQHtl8TcX7rQhczDUL7kHtd3R9md49NWiDDGWPkTxDi29A==", + "dev": true, + "dependencies": { + "bower": "1.8.14", + "bower-installer": "git://github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7" + } + }, + "node_modules/karma-json-fixtures-preprocessor": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/karma-json-fixtures-preprocessor/-/karma-json-fixtures-preprocessor-0.0.6.tgz", + "integrity": "sha512-weEt31YeOgui3Lmw1KYWgvkcjOb3Mr8xvB3SgjKg0wDlAGqCDhhXkff6UHaK5J0fIZzJMur18PqHMgzulM5bzA==", + "dev": true + }, + "node_modules/karma-junit-reporter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz", + "integrity": "sha512-FeuLOKlXNtJhIQK3oQASbO5QOib762CEHV8+L9wwTQpiZJgp7xKg3sNno66rL5bQPV2soG6fJdAFWqqnMJuh2w==", + "dev": true, + "dependencies": { + "path-is-absolute": "1.0.1", + "xmlbuilder": "8.2.2" + } + }, + "node_modules/karma-junit-reporter/node_modules/xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/karma-nyan-reporter": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/karma-nyan-reporter/-/karma-nyan-reporter-0.2.5.tgz", + "integrity": "sha512-t4/2zTMkGINeB+7gIxo7lsoNT4mvaFEuZ1AJIFwFPOpVjiECbXHVqDw9nzIgBG4Qu7Jccb3+SFERX0aLKGdStw==", + "dev": true, + "dependencies": { + "cli-color": "0.3.3" + } + }, + "node_modules/karma-phantomjs-launcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha512-tf4P3plsE7wb5Pqh8GJ6RnElxfI/UM4MtVnjbSIZFpdFJlKnjRzfIx8MLCcSYJBwZ1+qSKFz4uBe3XNoq2t3KA==", + "dev": true, + "dependencies": { + "lodash": "4.17.21", + "phantomjs-prebuilt": "2.1.16" + } + }, + "node_modules/karma/node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/karma/node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "4.0.7", + "follow-redirects": "1.15.2", + "requires-port": "1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/karma/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "node_modules/karma/node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha512-lfyEfOppKvWNeId5CArFLwgwef+iCnbEIy0JWYf1httIEXnx4ndL4Dr1adw7hPgeQfSlTbc/gqn6iaKcROpw5Q==", + "dev": true, + "dependencies": { + "os-tmpdir": "1.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==", + "dev": true + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11" + } + }, + "node_modules/latest-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-0.2.0.tgz", + "integrity": "sha512-tw4eCzlFfcaQcmQBeZTKAh0HTc96ta9kHTud6b2kxoiV1Mpymx2aR4PMFQI0UQDDNUzvuyVfOwq4/Qp1a1/eTw==", + "dev": true, + "dependencies": { + "package-json": "0.2.0" + }, + "bin": { + "latest-version": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "3.0.6" + } + }, + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "dependencies": { + "extend": "3.0.2", + "findup-sync": "4.0.0", + "fined": "1.2.0", + "flagged-respawn": "1.0.1", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.7.1", + "resolve": "1.22.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "1.0.0", + "is-glob": "4.0.3", + "micromatch": "4.0.5", + "resolve-dir": "1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "3.0.0", + "path-exists": "3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/locate-path/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "dev": true, + "dependencies": { + "signal-exit": "3.0.7" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==", + "dev": true + }, + "node_modules/lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==", + "dev": true + }, + "node_modules/lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dev": true, + "dependencies": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "node_modules/lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==", + "dev": true, + "dependencies": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + }, + "node_modules/lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "node_modules/lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==", + "dev": true + }, + "node_modules/lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true + }, + "node_modules/lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "node_modules/lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==", + "dev": true + }, + "node_modules/lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha512-I8MpGh5z+6OixDAAb21teLSZDmqVPjlq02Q7ZFrbn2xnQHYYuJf6on/94SWpF/p0s3p/cEv/53ro4AhDOfCR0g==", + "dev": true, + "dependencies": { + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1" + } + }, + "node_modules/lodash.debounce": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-2.4.1.tgz", + "integrity": "sha512-lzSGKuZQhTFRd4v809TAn1sdMXasHZ1TY3t/NxuXsdcvUcKfnUdnl5E4+g7PWVBdSl1mIe5jCDZbwF8Gu8MD+A==", + "dev": true, + "dependencies": { + "lodash.isfunction": "2.4.1", + "lodash.isobject": "2.4.1", + "lodash.now": "2.4.1" + } + }, + "node_modules/lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "node_modules/lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", + "integrity": "sha512-6XcAB3izeQxPOQQNAJbbdjXbvWEt2Pn9ezPrjr4CwoLwmqsLVbsiEXD19cmmt4mbzOCOCdHzOQiUivUOJLra7w==", + "dev": true + }, + "node_modules/lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==", + "dev": true, + "dependencies": { + "lodash._objecttypes": "2.4.1" + } + }, + "node_modules/lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "dependencies": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "node_modules/lodash.now": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.now/-/lodash.now-2.4.1.tgz", + "integrity": "sha512-KrUkev+xdqFbHHPSiVMnztWVJsHHeEda1IJshDG54m1oEvmO6F37kkMR9fmyeK6yLPg/QSXcyO6L56OmZuNQig==", + "dev": true, + "dependencies": { + "lodash._isnative": "2.4.1" + } + }, + "node_modules/log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha512-Cd+klbx7lkiaamEId9/0odHxv/PFHDz2E12kEfd6/CzIOZD084DzysASR/Dot4i1dYPBQKC3r2XIER+dfbLOmw==", + "dev": true, + "dependencies": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/log4js/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/log4js/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "dependencies": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "node_modules/log4js/node_modules/semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/log4js/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.7" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "node_modules/lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "dev": true, + "dependencies": { + "lower-case": "1.1.4" + } + }, + "node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "dependencies": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "node_modules/lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "dependencies": { + "es5-ext": "0.10.62" + } + }, + "node_modules/make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "node_modules/maxmin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "figures": "1.7.0", + "gzip-size": "3.0.0", + "pretty-bytes": "3.0.1" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/maxmin/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/maxmin/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoizee": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", + "integrity": "sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==", + "dev": true, + "dependencies": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "es6-weak-map": "0.1.4", + "event-emitter": "0.3.5", + "lru-queue": "0.1.0", + "next-tick": "0.2.2", + "timers-ext": "0.1.7" + } + }, + "node_modules/memoizee/node_modules/next-tick": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==", + "dev": true + }, + "node_modules/meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "dependencies": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.8", + "normalize-package-data": "2.5.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "3.0.2", + "picomatch": "2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "dependencies": { + "brace-expansion": "1.1.11" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "1.2.8" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha512-bauHShmaxVQiEvlrAPWxSPn8spSL8gDVRl11r8vLT4r/KdnknLqtqwQbToZ2Oa8sJkExYY1z6/d+X7pNiqo4yg==", + "dev": true + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "dependencies": { + "basic-auth": "2.0.1", + "debug": "2.6.9", + "depd": "2.0.0", + "on-finished": "2.3.0", + "on-headers": "1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/mout": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mout/-/mout-1.2.4.tgz", + "integrity": "sha512-mZb9uOruMWgn/fw28DG4/yE3Kehfk1zKCLhuDU2O3vlKdnBBr4XaOCqVTflJ5aODavGUPqFHZgrFX3NJVuxGhQ==", + "dev": true + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-amvrY4m/7oZamehMoFi1tbwU/kXbVvRTGM2S7F+PZi3n51Jx+9AcSQ3EQsag3tR+hS2higfgOP/Kl8kri/X52A==", + "dev": true + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.3", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "node_modules/ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", + "dev": true, + "dependencies": { + "xml-char-classes": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "node_modules/ng": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ng/-/ng-0.0.0.tgz", + "integrity": "sha512-HwR40IBJa1ZU+CIGyuy7vSCN3xFYlSRfw5eIwwKOdOMNNNIl8KhT6PXKmHuFEFYpfrbOMaCYtr4QOJ3gkkubcg==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node_modules/no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "dependencies": { + "lower-case": "1.1.4" + } + }, + "node_modules/node-fs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "integrity": "sha512-XqDBlmUKgDGe76+lZ/0sRBF3XW2vVcK07+ZPvdpUTK8jrvtPahUd0aBqJ9+ZjB01ANjZLuvK3O/eoMVmz62rpA==", + "dev": true, + "os": [ + "linux", + "darwin", + "freebsd", + "win32", + "smartos", + "sunos" + ], + "engines": { + "node": ">=0.1.97" + } + }, + "node_modules/node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "dependencies": { + "fstream": "1.0.12", + "glob": "7.1.7", + "graceful-fs": "4.2.11", + "mkdirp": "0.5.6", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.88.2", + "rimraf": "2.7.1", + "semver": "5.3.0", + "tar": "2.2.2", + "which": "1.3.1" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/node-gyp/node_modules/semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "dependencies": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.3", + "get-stdin": "4.0.1", + "glob": "7.1.7", + "in-publish": "2.0.1", + "lodash": "4.17.21", + "meow": "3.7.0", + "mkdirp": "0.5.6", + "nan": "2.17.0", + "node-gyp": "3.8.0", + "npmlog": "4.1.2", + "request": "2.88.2", + "sass-graph": "2.2.5", + "stdout-stream": "1.4.1", + "true-case-path": "1.0.3" + }, + "bin": { + "node-sass": "bin/node-sass" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/node-sass/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "dependencies": { + "abbrev": "1.1.1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "2.8.9", + "resolve": "1.22.4", + "semver": "5.7.2", + "validate-npm-package-license": "3.0.4" + } + }, + "node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "dependencies": { + "remove-trailing-separator": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmconf": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz", + "integrity": "sha512-iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==", + "dev": true, + "dependencies": { + "config-chain": "1.1.13", + "inherits": "2.0.4", + "ini": "1.3.8", + "mkdirp": "0.5.6", + "nopt": "3.0.6", + "once": "1.3.3", + "osenv": "0.1.5", + "safe-buffer": "5.1.2", + "semver": "4.3.6", + "uid-number": "0.0.5" + } + }, + "node_modules/npmconf/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "dependencies": { + "wrappy": "1.0.2" + } + }, + "node_modules/npmconf/node_modules/semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "1.1.7", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "node_modules/null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==", + "dev": true + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "0.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "dependencies": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "dependencies": { + "for-own": "1.0.0", + "make-iterator": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "dependencies": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.omit/node_modules/for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "dependencies": { + "for-in": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1.0.2" + } + }, + "node_modules/onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha512-iPBWbPP4OEOzR1xfhpGLDh+ypKBOygunZhM9jBtA7FS5sKjEiMZw0EFb82hnDOmTZX90ZWLoZKUza4cVt8MexA==", + "dev": true, + "dependencies": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "dev": true, + "dependencies": { + "minimist": "0.0.10", + "wordwrap": "0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "dev": true + }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", + "dev": true, + "dependencies": { + "osx-release": "1.1.0", + "win-release": "1.1.1" + }, + "bin": { + "os-name": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "dependencies": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "node_modules/osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", + "dev": true, + "dependencies": { + "minimist": "1.2.8" + }, + "bin": { + "osx-release": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "2.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "2.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-throttler": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.1.0.tgz", + "integrity": "sha512-qjBriqtlwhS2o/Yq4rU7ZQ4+Yy9Vy9d7qss15rof2viXAwwXcxjPq8jLXVJosXygOs3WZtKnLEzRw0FyX/l9PQ==", + "dev": true, + "dependencies": { + "q": "0.9.7" + } + }, + "node_modules/p-throttler/node_modules/q": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "integrity": "sha512-ijt0LhxWClXBtc1RCt8H0WhlZLAdVX26nWbpsJy+Hblmp81d2F/pFsvlrJhJDDruFHM+ECtxP0H0HzGSrARkwg==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-0.2.0.tgz", + "integrity": "sha512-JbTs9F2CwqCEEhNZXsvgQtQpNmzgKlCk4adhYxGObzcc70rU0nzy2FPqgTdP2To5wZKbCv0IJp+zTMYLEn9eMA==", + "dev": true, + "dependencies": { + "got": "0.3.0", + "registry-url": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pad-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-1.2.0.tgz", + "integrity": "sha512-2SSTZIZSdYL+kV4LMKocpynfDGRsW7a9WmdmGYZm6kHhNduSortn3DGCSAEZ3J3XkWu9ZrKWXAdSrUqFmY9WgQ==", + "dev": true, + "dependencies": { + "meow": "3.7.0", + "pumpify": "1.5.1", + "repeating": "2.0.1", + "split2": "1.1.1", + "through2": "2.0.5" + }, + "bin": { + "pad": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "dependencies": { + "no-case": "2.3.2" + } + }, + "node_modules/parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "dependencies": { + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "dependencies": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-glob/node_modules/is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "dependencies": { + "is-extglob": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "dependencies": { + "error-ex": "1.3.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha512-v38ZjVbinlZ2r1Rz06WUZEnGoSRcEGX+roMsiWjHeAe23s2qlQUyfmsPQZvh7d8l0E8AZzTIO/RkUr00LfkSiA==", + "dev": true, + "dependencies": { + "better-assert": "1.0.2" + } + }, + "node_modules/parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==", + "dev": true, + "dependencies": { + "better-assert": "1.0.2" + } + }, + "node_modules/parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==", + "dev": true, + "dependencies": { + "better-assert": "1.0.2" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "dev": true, + "dependencies": { + "camel-case": "3.0.0", + "upper-case-first": "1.1.2" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dev": true, + "dependencies": { + "no-case": "2.3.2" + } + }, + "node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "dependencies": { + "path-root-regex": "0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "node_modules/phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==", + "dev": true, + "dependencies": { + "es6-promise": "4.2.8", + "extract-zip": "1.7.0", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.88.2", + "request-progress": "2.0.1", + "which": "1.3.1" + }, + "bin": { + "phantomjs": "bin/phantomjs" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==", + "dev": true, + "dependencies": { + "throttleit": "1.0.0" + } + }, + "node_modules/phantomjs-prebuilt/node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "dependencies": { + "pinkie": "2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha512-qSnKBSZeDY8ApxwhfVIwKwF36KVJqb1/9nzYYq3j3vdwocULCXT8f8fQGkiw1Nk9BGfxiDagEe/pwakA+bOBqw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/portscanner": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz", + "integrity": "sha512-3MCx40XO6ChNJJHw1tTFukQK/M/8FacGZK/vGbnrKpozObrJzembYtfi7ZdA2hkF2Lojg77XhsKUPvF8eHKcDA==", + "dev": true, + "dependencies": { + "async": "1.5.2" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==", + "dev": true, + "dependencies": { + "number-is-nan": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha512-H2enpsxzDhuzRl3zeSQpQMirn8dB0Z/gxW96j06tMfTviUWvX14gjKb7qd1gtkUyYhDPuoNe00K5PqNvy2oQNg==", + "dev": true, + "dependencies": { + "is-finite": "1.1.0", + "parse-ms": "1.0.1", + "plur": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "dependencies": { + "asap": "2.0.6" + } + }, + "node_modules/promptly": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", + "integrity": "sha512-HG+4CGfxDIcto6WSwa8CNSMxgRYrjOgGbh0JSr3F4yy5aK95qJANaTnRq+U1g/J2h6IIgLD+qRPzDR4AnUh/1g==", + "dev": true, + "dependencies": { + "read": "1.0.7" + } + }, + "node_modules/propprop": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/propprop/-/propprop-0.3.1.tgz", + "integrity": "sha512-EbFINeqVaaw4MKPC9978G5aZhP0Jv49kAQHGlIBd6SKEPBBuf+l4W/zCiL6SCVuxxrOkSdZSB70YXW1xKCSD4Q==", + "dev": true + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/protractor": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.2.2.tgz", + "integrity": "sha512-KxYw0ySvmWFQHpbSRvrHA5HLlyeAkCENSUZvJroKV1u0gWXX9kvHjc9wEK5IoW7h9UfPV1F3R2i+Own0go5s0g==", + "dev": true, + "dependencies": { + "@types/node": "6.14.13", + "@types/q": "0.0.32", + "@types/selenium-webdriver": "2.53.50", + "blocking-proxy": "1.0.1", + "chalk": "1.1.3", + "glob": "7.1.7", + "jasmine": "2.99.0", + "jasminewd2": "2.2.0", + "optimist": "0.6.1", + "q": "1.4.1", + "saucelabs": "1.3.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "0.4.18", + "webdriver-js-extender": "1.0.0", + "webdriver-manager": "12.1.9" + }, + "bin": { + "protractor": "bin/protractor", + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/protractor/node_modules/adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/protractor/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/protractor/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/protractor/node_modules/webdriver-manager": { + "version": "12.1.9", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", + "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", + "dev": true, + "dependencies": { + "adm-zip": "0.5.10", + "chalk": "1.1.3", + "del": "2.2.2", + "glob": "7.1.7", + "ini": "1.3.8", + "minimist": "1.2.8", + "q": "1.4.1", + "request": "2.88.2", + "rimraf": "2.7.1", + "semver": "5.7.2", + "xml2js": "0.4.23" + }, + "bin": { + "webdriver-manager": "bin/webdriver-manager" + }, + "engines": { + "node": ">=6.9.x" + } + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pug": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", + "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "dev": true, + "optional": true, + "dependencies": { + "pug-code-gen": "2.0.3", + "pug-filters": "3.1.1", + "pug-lexer": "4.1.0", + "pug-linker": "3.0.6", + "pug-load": "2.0.12", + "pug-parser": "5.0.1", + "pug-runtime": "2.0.5", + "pug-strip-comments": "1.0.4" + } + }, + "node_modules/pug-attrs": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", + "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "dev": true, + "optional": true, + "dependencies": { + "constantinople": "3.1.2", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.5" + } + }, + "node_modules/pug-code-gen": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz", + "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "dev": true, + "optional": true, + "dependencies": { + "constantinople": "3.1.2", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.4", + "pug-error": "1.3.3", + "pug-runtime": "2.0.5", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "node_modules/pug-error": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", + "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", + "dev": true, + "optional": true + }, + "node_modules/pug-filters": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", + "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "dev": true, + "optional": true, + "dependencies": { + "clean-css": "4.2.4", + "constantinople": "3.1.2", + "jstransformer": "1.0.0", + "pug-error": "1.3.3", + "pug-walk": "1.1.8", + "resolve": "1.22.4", + "uglify-js": "2.8.29" + } + }, + "node_modules/pug-filters/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pug-filters/node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "optional": true, + "dependencies": { + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/pug-filters/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pug-filters/node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dev": true, + "optional": true, + "dependencies": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/pug-filters/node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pug-filters/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "optional": true, + "dependencies": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + }, + "node_modules/pug-lexer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", + "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "dev": true, + "optional": true, + "dependencies": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.3" + } + }, + "node_modules/pug-linker": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", + "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "dev": true, + "optional": true, + "dependencies": { + "pug-error": "1.3.3", + "pug-walk": "1.1.8" + } + }, + "node_modules/pug-load": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", + "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "dev": true, + "optional": true, + "dependencies": { + "object-assign": "4.1.1", + "pug-walk": "1.1.8" + } + }, + "node_modules/pug-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", + "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "dev": true, + "optional": true, + "dependencies": { + "pug-error": "1.3.3", + "token-stream": "0.0.1" + } + }, + "node_modules/pug-runtime": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", + "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", + "dev": true, + "optional": true + }, + "node_modules/pug-strip-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", + "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "dev": true, + "optional": true, + "dependencies": { + "pug-error": "1.3.3" + } + }, + "node_modules/pug-walk": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", + "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", + "dev": true, + "optional": true + }, + "node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "dependencies": { + "end-of-stream": "1.4.4", + "once": "1.4.0" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "dependencies": { + "duplexify": "3.7.1", + "inherits": "2.0.4", + "pump": "2.0.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "dependencies": { + "is-number": "4.0.0", + "kind-of": "6.0.3", + "math-random": "1.0.4" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dev": true, + "dependencies": { + "bytes": "1.0.0", + "string_decoder": "0.10.31" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", + "dev": true + }, + "node_modules/raw-body/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "dependencies": { + "mute-stream": "0.0.4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "dependencies": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "dependencies": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.11", + "micromatch": "3.1.10", + "readable-stream": "2.3.8" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/readdirp/node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.4", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "0.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/expand-brackets/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/extglob/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "dependencies": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readline2": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", + "integrity": "sha512-qs8GGG+hLGMaDOGjd+mDglDoYcHDkjIY7z5RU0/ApsGT0qypyrWskNeemUqD+UxIXiZoMYT5aLwGp4ehoyZhIg==", + "dev": true, + "dependencies": { + "mute-stream": "0.0.4", + "strip-ansi": "2.0.1" + } + }, + "node_modules/readline2/node_modules/ansi-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readline2/node_modules/strip-ansi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ==", + "dev": true, + "dependencies": { + "ansi-regex": "1.1.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "1.22.4" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "dependencies": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha512-pnk1vsaNLu1UAAClKsImKz9HjBvg9i8cbRqTRzJbiCjGF0fZSMqpdcA5W3juO3c4etFvTrabECkq9wjC45ZyxA==", + "dev": true, + "dependencies": { + "esprima": "1.0.4" + } + }, + "node_modules/redeyed/node_modules/esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true + }, + "node_modules/regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "dependencies": { + "is-equal-shallow": "0.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dependencies": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/registry-url": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-0.1.1.tgz", + "integrity": "sha512-b6QxEheOmmIsC5eTFuBZsUucrjn2fqpJoZ84ihwGwh5iw07hiSjeTmrYRKzVHlom2jHlSX3/lNCvQJaDQZlVJg==", + "dev": true, + "dependencies": { + "npmconf": "2.1.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "dependencies": { + "is-finite": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "aws-sign2": "0.7.0", + "aws4": "1.12.0", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.5", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.35", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.3", + "safe-buffer": "5.1.2", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.6.0", + "uuid": "3.4.0" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-progress": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.0.tgz", + "integrity": "sha512-q5GKsnZyTFRi6FuO5GqAjqM6BYYaJ+3kVOpcC8F8qW3kLW/1WFUNENd7GOtyWD8m/7Lsx/MWjLS6pO4DaH7zTg==", + "dev": true, + "dependencies": { + "throttleit": "0.0.2" + } + }, + "node_modules/request-replay": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz", + "integrity": "sha512-7S/WaWWPkEIDLWcSwQoZcZAWrX6A5dpE/6tFGEhap0UCm77E4jjcBUmVlbKKLnEzv+wlsBvSjg11RcceYp+6Ww==", + "dev": true, + "dependencies": { + "retry": "0.6.0" + } + }, + "node_modules/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/requires-port": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-0.0.1.tgz", + "integrity": "sha512-AzPDCliPoWDSvEVYRQmpzuPhGGEnPrQz9YiOEvn+UdB9ixBpw+4IOZWtwctmpzySLZTy7ynpn47V14H4yaowtA==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "2.13.0", + "path-parse": "1.0.7", + "supports-preserve-symlinks-flag": "1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", + "integrity": "sha512-RgncoxLF1GqwAzTZs/K2YpZkWrdIYbXsmesdomi+iPilSzjUyr/wzNIuteoTVaWokzdwZIJ9NHRNQa/RUiOB2g==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dev": true, + "dependencies": { + "align-text": "0.1.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "7.1.7" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "node_modules/rx": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", + "integrity": "sha512-u5qvfulb7NXoY/+OE28920WEgFi6aiDjf5iF9rA2f9tBXejLgTLd0WxkclvIQWjFFHfNJlb7pSTsrjgiDh+Uug==", + "dev": true + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", + "dev": true + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "0.1.15" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "dependencies": { + "glob": "7.1.7", + "lodash": "4.17.21", + "scss-tokenizer": "0.2.3", + "yargs": "13.3.2" + }, + "bin": { + "sassgraph": "bin/sassgraph" + } + }, + "node_modules/sass-graph/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "dependencies": { + "string-width": "3.1.0", + "strip-ansi": "5.2.0", + "wrap-ansi": "5.1.0" + } + }, + "node_modules/sass-graph/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/sass-graph/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "7.0.3", + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "4.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sass-graph/node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "dependencies": { + "cliui": "5.0.0", + "find-up": "3.0.0", + "get-caller-file": "2.0.5", + "require-directory": "2.1.1", + "require-main-filename": "2.0.0", + "set-blocking": "2.0.0", + "string-width": "3.1.0", + "which-module": "2.0.1", + "y18n": "4.0.3", + "yargs-parser": "13.1.2" + } + }, + "node_modules/saucelabs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", + "integrity": "sha512-y1fLynzP8S8BJPgBTzMSvZmZX073FpmyCsJif9w4pT8Je3LutU1/DNX8yVH0ju3sVCo/UD8tRxl+HpgWpi9PSg==", + "dev": true, + "dependencies": { + "https-proxy-agent": "1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==", + "dev": true, + "dependencies": { + "js-base64": "2.6.4", + "source-map": "0.4.4" + } + }, + "node_modules/scss-tokenizer/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dev": true, + "dependencies": { + "amdefine": "1.0.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "dependencies": { + "jszip": "3.10.1", + "rimraf": "2.7.1", + "tmp": "0.0.30", + "xml2js": "0.4.23" + }, + "engines": { + "node": ">= 6.9.0" + } + }, + "node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/semver-diff": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-0.1.0.tgz", + "integrity": "sha512-YZ8p8EFvhPEFhCf9iHGhC8N4xA9kMR8ZufYUMdmaqRsVo50rxLQzhHhI9BAecpPWCXwlOWs4IstHtYlG5S/NGQ==", + "dev": true, + "dependencies": { + "semver": "2.3.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "dev": true, + "dependencies": { + "no-case": "2.3.2", + "upper-case-first": "1.1.2" + } + }, + "node_modules/serve": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", + "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", + "dependencies": { + "@zeit/schemas": "2.29.0", + "ajv": "8.11.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.5", + "update-check": "1.5.4" + }, + "bin": { + "serve": "build/main.js" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "dependencies": { + "accepts": "1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.35", + "parseurl": "1.3.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/serve/node_modules/chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/serve/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.3.tgz", + "integrity": "sha512-0Y4SH6mnoNZNW29pNEC0E1F//X7AmbpOj/j5oTssXFUvg2J9MbKIVH3S5ca8Je1Hr36utXJqlzCbYxEYsPAR4A==", + "dev": true, + "dependencies": { + "array-filter": "0.0.1", + "array-map": "0.0.1", + "array-reduce": "0.0.0", + "jsonify": "0.0.1" + } + }, + "node_modules/shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==", + "dev": true, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "1.0.2", + "get-intrinsic": "1.2.1", + "object-inspect": "1.12.3" + } + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "dev": true, + "dependencies": { + "no-case": "2.3.2" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.3", + "use": "3.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "dependencies": { + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "0.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==", + "dev": true, + "dependencies": { + "hoek": "0.9.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha512-CmZLQTyj5nKKVBoguhisLP5Yl6oEfEWbQQQQ0MdXAazCZdRpGR4FG6rd13ryovTa75S36PgXsAGtzwllCWrgbQ==", + "dev": true, + "dependencies": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + } + }, + "node_modules/socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha512-zmYvlFJay9skt4yk1MffE9p93HKvQtyy0BLZ5dRM73bOXFJXNZWq8qZVdY456sLaxdK6fHGiZ7glxzqvzwGzkw==", + "dev": true, + "dependencies": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + } + }, + "node_modules/socket.io-adapter/node_modules/debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "dependencies": { + "ms": "0.7.2" + } + }, + "node_modules/socket.io-adapter/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "node_modules/socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha512-ZEPOqFboJuuVau/3sMF4PgzJM/X+TDhssgufCnGtPtSL2Nmt4dL3i9JheCT1B45hiYM5cgO+wTO8EYmxbpwHSw==", + "dev": true, + "dependencies": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io-client/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "dependencies": { + "ms": "0.7.2" + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha512-j6l4g/+yWQjmy1yByzg1DPFL4vxQw+NwCJatIxni/AE1wfm17FBtIKSWU4Ay+onrJwDxmC4eK4QS/04ZsqYwZQ==", + "dev": true, + "dependencies": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + } + }, + "node_modules/socket.io-parser/node_modules/component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==", + "dev": true + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "dependencies": { + "ms": "0.7.1" + } + }, + "node_modules/socket.io-parser/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + }, + "node_modules/socket.io/node_modules/debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "dependencies": { + "ms": "0.7.2" + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "node_modules/socket.io/node_modules/object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "dependencies": { + "atob": "2.1.2", + "decode-uri-component": "0.2.2", + "resolve-url": "0.2.1", + "source-map-url": "0.4.1", + "urix": "0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "dependencies": { + "source-map": "0.5.7" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "3.0.1", + "spdx-license-ids": "3.0.13" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "2.3.0", + "spdx-license-ids": "3.0.13" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "dependencies": { + "through": "2.3.8" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.1.1.tgz", + "integrity": "sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==", + "dev": true, + "dependencies": { + "through2": "2.0.5" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "dependencies": { + "asn1": "0.2.6", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "0.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "dependencies": { + "readable-stream": "2.3.8" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + } + }, + "node_modules/string-length": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-0.1.2.tgz", + "integrity": "sha512-Z7ZCUHl1mkGe1v4rybhTTVm0LSWeeX1hJ4pVsX0jcYNCwMJsLByDfVV3PUJ5kyC/ZigzPbUP+nEBNCbZza5VyA==", + "dev": true, + "dependencies": { + "strip-ansi": "0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-length/node_modules/ansi-regex": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.1.0.tgz", + "integrity": "sha512-sKASJ0JEeHkkUN5A7GBQ1JH5EmBGi8dhl9KChCXV40kGmykzW4uLkVB8XbjV7598iK+I/HQOlqJGLCFA+1ZmzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-length/node_modules/strip-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.2.2.tgz", + "integrity": "sha512-1uWiYlJgR31DGid87j930IpH4YUsxX3hOLvdGmnUAm++BWpEkWXMWYcQCUDXUNdEsRA9GZevI4q8UszDfozHxw==", + "dev": true, + "dependencies": { + "ansi-regex": "0.1.0" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "dependencies": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringify-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-1.0.1.tgz", + "integrity": "sha512-RDGXBy5t6y1birIZGEgKW1mE+cG9XqXQT23wKLIcMzvm8zZZrCWWUxLZndhuV2zJ1ZCDjm/QnWED8/6rfIzg4g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "dependencies": { + "is-utf8": "0.2.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "dependencies": { + "get-stdin": "4.0.1" + }, + "bin": { + "strip-indent": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "dev": true, + "dependencies": { + "lower-case": "1.1.4", + "upper-case": "1.1.3" + } + }, + "node_modules/tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "dependencies": { + "block-stream": "0.0.9", + "fstream": "1.0.12", + "inherits": "2.0.4" + } + }, + "node_modules/tar-fs": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz", + "integrity": "sha512-MqmfOi0c4YcprB8WfyE2nKZPE//2253LQueyliGfZ6Hy9L6N4QM9zJNXXSSmp+PfdljyAkHB30Vapm0aFa6G2g==", + "dev": true, + "dependencies": { + "mkdirp": "0.5.6", + "pump": "0.3.5", + "tar-stream": "0.4.7" + } + }, + "node_modules/tar-fs/node_modules/end-of-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "integrity": "sha512-oniaMOoG/dtbvWRLAlkFeJeJPM4IeE6BPFCHv0GTIIONB7A7kz1/liYWQiU7bqAhUlrKy1Z1MBsKa+qBgoVabw==", + "dev": true, + "dependencies": { + "once": "1.3.3" + } + }, + "node_modules/tar-fs/node_modules/end-of-stream/node_modules/once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "dependencies": { + "wrappy": "1.0.2" + } + }, + "node_modules/tar-fs/node_modules/once": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.2.0.tgz", + "integrity": "sha512-WBd9yDi3JRrEsysh0s4px+jinLuW/DGRydS+ZGPTHVKu4JrIBmKj3uDC9LfnwEbXHFVLieUuZvunY74wln6arg==", + "dev": true + }, + "node_modules/tar-fs/node_modules/pump": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/pump/-/pump-0.3.5.tgz", + "integrity": "sha512-U0S7cdRuBLfk1ylK32jc8No8ex3Xj2ok3XOPAYfXXXfVd3zMA2BT5Vl7XxfqXoIioNSxczI0/OGENv68XN7Oyg==", + "dev": true, + "dependencies": { + "end-of-stream": "1.0.0", + "once": "1.2.0" + } + }, + "node_modules/tar-stream": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", + "integrity": "sha512-8/A2iGloynV8Q0cb43ez+aK1PEYWueUr4yPrenbwOJR3Y63VjaIPIravWB6VcYAz4jQfzr4TLX8i3/tDhkzPRw==", + "dev": true, + "dependencies": { + "bl": "0.9.5", + "end-of-stream": "1.4.4", + "readable-stream": "1.1.14", + "xtend": "4.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/tar-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/tar-stream/node_modules/readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "dependencies": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "node_modules/tar-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + }, + "node_modules/terser": { + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", + "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "0.3.5", + "acorn": "8.10.0", + "commander": "2.20.3", + "source-map-support": "0.5.21" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "1.1.2", + "source-map": "0.6.1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha512-HtlTFeyYs1elDM2txiIGsdXHaq8kffVaZH/QEBRbo95zQqzlsBx5ELKhkPOZVad9OK9oxzwx6UrQN8Vfh/+yag==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "dependencies": { + "readable-stream": "2.3.8", + "xtend": "4.0.2" + } + }, + "node_modules/time-grunt": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz", + "integrity": "sha512-u8n+ZOcdNDkrqlyN+x1ayHN0X+hMgg3SS191EE5xO03nRVnVpNp3UJSmUBCQCAbe959LqWttMaELNclfmWM+fQ==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "date-time": "1.1.0", + "figures": "1.7.0", + "hooker": "0.2.3", + "number-is-nan": "1.0.1", + "pretty-ms": "2.1.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-grunt/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-grunt/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/time-grunt/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/time-zone": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz", + "integrity": "sha512-S5CjtVIkeBTnlsaZP3gjsTb78ClBe74sEcgEoBwAVUKnTRDAGqUtLLIZHMsIyqOWjt9DGQpLMMoD8ZKIfP2ddQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "dependencies": { + "es5-ext": "0.10.62", + "next-tick": "1.1.0" + } + }, + "node_modules/tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "dependencies": { + "body": "5.1.0", + "debug": "3.2.7", + "faye-websocket": "0.10.0", + "livereload-js": "2.4.0", + "object-assign": "4.1.1", + "qs": "6.11.2" + } + }, + "node_modules/tiny-lr/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "2.1.3" + } + }, + "node_modules/tiny-lr/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dev": true, + "dependencies": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "node_modules/tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "dev": true, + "dependencies": { + "os-tmpdir": "1.0.2" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "3.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "1.1.6" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==", + "dev": true, + "optional": true + }, + "node_modules/touch": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", + "integrity": "sha512-JUyt3LWZRqkmKH0paN3IqVqhLV11FuXMz0c+/OZED9Abs+sFxSdtgBLknwqZmicSBtue+RGX4jXvbCIjipDMCA==", + "dev": true, + "dependencies": { + "nopt": "1.0.10" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch/node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1.1.1" + }, + "bin": { + "nopt": "bin/nopt.js" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "1.9.0", + "punycode": "2.3.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "dependencies": { + "glob": "7.1.7" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "2.1.35" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "dev": true + }, + "node_modules/uid-number": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz", + "integrity": "sha512-ZiLtQrdrFvWVXW5wickjtHiyOkn+cG74B0r33DQ2vJuz12FsFO7dU2q0dumrrYk6ny4wl2Vjsodpxk0+Z10/rA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==", + "dev": true + }, + "node_modules/unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "dependencies": { + "sprintf-js": "1.1.2", + "util-deprecate": "1.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", + "dev": true, + "dependencies": { + "os-homedir": "1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-0.2.0.tgz", + "integrity": "sha512-Cy5aaZvwbMdU9Hik7SLGQZsZJY/6AJOQ2ORc4XCWa1TCIvhRk46qDEB+HW8JVDnYBrtVvUX4AKWBH/LuyminAw==", + "dev": true, + "dependencies": { + "lodash": "3.10.1", + "underscore.string": "2.3.3" + }, + "engines": { + "node": ">=0.10 <=5" + } + }, + "node_modules/upath/node_modules/lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "node_modules/upath/node_modules/underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "dependencies": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + } + }, + "node_modules/update-check/node_modules/registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "dependencies": { + "rc": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.0.tgz", + "integrity": "sha512-F1Z9wSB3q0a0MAHcfM68LpVjszoc1wVRV7mE0l/vWzoSZv0AcVCfZiLsV5olMXy6jThwu/ZOQyXFIYmq+78Arg==", + "dev": true, + "dependencies": { + "chalk": "0.5.1", + "configstore": "0.3.2", + "latest-version": "0.2.0", + "semver-diff": "0.1.0", + "string-length": "0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "dependencies": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier/node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "dependencies": { + "ansi-regex": "0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-notifier/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "node_modules/upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "dev": true, + "dependencies": { + "upper-case": "1.1.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "2.3.0" + } + }, + "node_modules/uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true, + "bin": { + "user-home": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "dependencies": { + "lru-cache": "4.1.5", + "tmp": "0.0.30" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "dependencies": { + "homedir-polyfill": "1.0.3" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "3.2.0", + "spdx-expression-parse": "3.0.1" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha512-fG8GxPsSj9JDPGcHP0A1XTrUT1uRFbD8U7W9qA169fYJ2Hanvn/n8w4QWXvun1cNU7dZuvRjcLbuPoVqLWsylw==", + "dev": true, + "dependencies": { + "@types/selenium-webdriver": "2.53.50", + "selenium-webdriver": "2.53.3" + } + }, + "node_modules/webdriver-js-extender/node_modules/sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha512-8ip+qnRh7m8OEyvoM1JoSBzlrepp3ajVR8nqgrfTig+TewfyvTijl0am8/anFqgbcdz62ofEUKE1hHNDCdbeSQ==", + "dev": true + }, + "node_modules/webdriver-js-extender/node_modules/selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha512-frrFcVqQEIwn88dTQdlrK1BOB23Hj8wKyEAlyvxGqNItyQqbNfLIBtvXvhvO5l0ePhsak3rtrzRNeTLW3esp1Q==", + "dev": true, + "dependencies": { + "adm-zip": "0.4.4", + "rimraf": "2.7.1", + "tmp": "0.0.24", + "ws": "1.1.5", + "xml2js": "0.4.4" + }, + "engines": { + "node": ">= 4.2.x" + } + }, + "node_modules/webdriver-js-extender/node_modules/tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha512-z6TbUngjp7wMWIKNeUTuA24oRTW+HGCN7LlBgUPfNzCv5J/JsLsuF/qBh6tCUS2+ALGQ/4U5W4L4yUk7qIFWrg==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webdriver-js-extender/node_modules/xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha512-9ERdxLOo4EazMDHAS/vsuZiTXIMur6ydcRfzGrFVJ4qM78zD3ohUgPJC7NYpGwd5rnS0ufSydMJClh6jyH+V0w==", + "dev": true, + "dependencies": { + "sax": "0.6.1", + "xmlbuilder": "11.0.1" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": "0.5.8", + "safe-buffer": "5.1.2", + "websocket-extensions": "0.1.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "1.0.2" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/widest-line/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/widest-line/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/widest-line/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", + "dev": true, + "dependencies": { + "semver": "5.7.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/wiredep": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wiredep/-/wiredep-4.0.0.tgz", + "integrity": "sha512-w4QDvO5bgcpOBHFBCEH4oKKcMBTeG2pMEzkLSAhjKZ0X6+yb1dAS3vUEtjjz6Rg1M3ox3PG6BSCFZJEQh+TF8w==", + "dev": true, + "dependencies": { + "bower-config": "1.4.3", + "glob": "7.1.7", + "lodash": "4.17.21", + "propprop": "0.3.1", + "through2": "2.0.5", + "wiredep-cli": "0.1.0" + } + }, + "node_modules/wiredep-cli": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wiredep-cli/-/wiredep-cli-0.1.0.tgz", + "integrity": "sha512-Gayaqg8UXk5qPH0MuVP35m7h9GvvCE8XJd1AeXOFgjHxxowhjyfeKSd4BNBsbPAy5kRQ1c5A4tJKcNV8LiE6jw==", + "dev": true, + "dependencies": { + "chalk": "1.1.3", + "minimist": "1.2.8", + "wiredep": "4.0.0" + }, + "bin": { + "wiredep": "wiredep-cli.js" + } + }, + "node_modules/wiredep-cli/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wiredep-cli/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wiredep-cli/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==", + "dev": true, + "optional": true, + "dependencies": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "dependencies": { + "ansi-styles": "3.2.1", + "string-width": "3.1.0", + "strip-ansi": "5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "1.9.3" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "7.0.3", + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "4.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "dependencies": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "node_modules/wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha512-qfR6ovmRRMxNHgUNYI9LRdVofApe/eYrv4ggNOvvCP+pPdEo9Ym93QN4jUceGD6PignBbp2zAzgoE7GibAdq2A==", + "dev": true + }, + "node_modules/xdg-basedir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz", + "integrity": "sha512-ugGW++yvGoxr4IrSoxsieH2b/NlZbXsBaL85Off3z487yS9eiiRjrfdkBw1iBvzv/SK0XjjYy+KBix5PIseOtQ==", + "dev": true, + "dependencies": { + "user-home": "1.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "dependencies": { + "sax": "1.2.4", + "xmlbuilder": "11.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha512-kauAa/1btT613pYX92WXR6kx5trYeckB5YMd3pPvtkMo2Twdfhwl683M8NiSqWHHo97xAC6bnvK1DWFKxfmejg==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "dependencies": { + "camelcase": "5.3.1", + "decamelize": "1.2.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.1.0" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", + "dev": true + } + }, + "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "1.1.2", + "@jridgewell/sourcemap-codec": "1.4.15", + "@jridgewell/trace-mapping": "0.3.19" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true + }, + "@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "0.3.3", + "@jridgewell/trace-mapping": "0.3.19" + } + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "3.1.1", + "@jridgewell/sourcemap-codec": "1.4.15" + } + }, + "@types/babel-types": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.11.tgz", + "integrity": "sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==", + "dev": true, + "optional": true + }, + "@types/babylon": { + "version": "6.16.6", + "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.6.tgz", + "integrity": "sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w==", + "dev": true, + "optional": true, + "requires": { + "@types/babel-types": "7.0.11" + } + }, + "@types/node": { + "version": "6.14.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.14.13.tgz", + "integrity": "sha512-J1F0XJ/9zxlZel5ZlbeSuHW2OpabrUAqpFuC2sm2I3by8sERQ8+KCjNKUcq8QHuzpGMWiJpo9ZxeHrqrP2KzQw==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==", + "dev": true + }, + "@types/selenium-webdriver": { + "version": "2.53.50", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.50.tgz", + "integrity": "sha512-VLagihTlCKBanWCo+45Sev2anP4OQY8B6ws2aeewAZVrQ0xZ9ZSI0CbeVx08CU2oRNfUdeM6RgZyXkLiL3e+GQ==", + "dev": true + }, + "@zeit/schemas": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz", + "integrity": "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "2.1.35", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "dev": true, + "optional": true + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", + "dev": true, + "optional": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "optional": true + } + } + }, + "adm-zip": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz", + "integrity": "sha512-SYIiqLfr6QvmEM0yw89mD8ba2HjK+duf7oVPEw79+NPDqyQScAU8IgDPZzFt9CVdD2yaAuWJqFQGLkongB6cJQ==", + "dev": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==", + "dev": true + }, + "agent-base": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz", + "integrity": "sha512-oDtZV740o3fr5oJtPLOsgH2hl2TRPscNXIx4VzzBwVlXVkv8RHm7XXqGAYg8t20+Gwu6LNDnx8HRMGqVGPZ8Vw==", + "dev": true, + "requires": { + "extend": "3.0.2", + "semver": "5.0.3" + }, + "dependencies": { + "semver": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz", + "integrity": "sha512-5OkOBiw69xqmxOFIXwXsiY1HlE+om8nNptg1ZIf95fzcnfgOv2fLm7pmmGbRJsjJIqPpW5Kwy4wpDBTz5wQlUw==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "3.1.3", + "fast-json-stable-stringify": "2.1.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.4.1" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "2.0.1" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + }, + "dependencies": { + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.4" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + } + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + }, + "archy": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz", + "integrity": "sha512-8mMsetjXv4pCPTrMbPPO2cxy9vzJn2jwbd+ug+mf8fEUZG2E78Vo5erJMjrnGuLTKqOLtS5ulFHJSfg1yaCjxA==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.8" + } + }, + "arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + } + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw==", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true + }, + "array-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.1.tgz", + "integrity": "sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q==", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw==", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha512-6ZjfQaBSy6CuIH0+B0NrxMfDE5VIOCP/5gOqSpEIsaAZx9/giszzrXg6PZ7G51U/n88UmlAgYLNQ9wAnII7PJA==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "dev": true + }, + "aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", + "dev": true + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.6.12", + "regenerator-runtime": "0.10.5" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dev": true, + "requires": { + "core-js": "2.6.12", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dev": true, + "optional": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.3", + "lodash": "4.17.21", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true, + "optional": true + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha512-437oANT9tP582zZMwSvZGy2nmSeAb8DW2me3y+Uv1Wp2Rulr8Mqlyrv3E7MLxmsiaPSMMDmiDVzgE+e8zlMx9g==", + "dev": true + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha512-rz8L+d/xByiB/vLVftPkyY215fqNrmasrcJsYkVcm4TgJNz+YXKrFaFAWibSaHkiKoSgMDCb+lipOIRQNGYesw==", + "dev": true + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha512-bYeph2DFlpK1XmGs6fvlLRUN29QISM3GBuUwSFsMY2XRx4AvC0WNCS57j4c/xGrK2RS24C1w3YoBOsw9fT46tQ==", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "requires": { + "buffers": "0.1.1", + "chainsaw": "0.1.0" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "0.9.5", + "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", + "integrity": "sha512-njlCs8XLBIK7LCChTWfzWuIAxkpmmLXcL7/igCofFT1B039Sz0IPnAmosN5QaO22lU4qr8LcUz2ojUlE6pLkRQ==", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha512-YRc9zvVz4wNaxcXmiSgb9LAg7YYwqQ2xd0Sj6osfA7k/PKmIGVlnOYs3wOFdkRC9/JpQu8sGt/zHgJV7xzerfg==", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "dev": true, + "requires": { + "inherits": "2.0.4" + } + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "dev": true, + "requires": { + "minimist": "1.2.8" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "body": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", + "integrity": "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==", + "dev": true, + "requires": { + "continuable-cache": "0.3.1", + "error": "7.2.1", + "raw-body": "1.1.7", + "safe-json-parse": "1.0.1" + } + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dev": true, + "requires": { + "side-channel": "1.0.4" + } + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==", + "dev": true, + "requires": { + "hoek": "0.9.1" + } + }, + "bower": { + "version": "1.8.14", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz", + "integrity": "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==", + "dev": true + }, + "bower-config": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-1.4.3.tgz", + "integrity": "sha512-MVyyUk3d1S7d2cl6YISViwJBc2VXCkxF5AUFykvN0PQj5FsUiMNSgAYTso18oRFfyZ6XEtjrgg9MAaufHbOwNw==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "minimist": "0.2.4", + "mout": "1.2.4", + "osenv": "0.1.5", + "untildify": "2.1.0", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.2.4.tgz", + "integrity": "sha512-Pkrrm8NjyQ8yVt8Am9M+yUt74zE3iokhzbG1bFVNjLB92vwM71hf40RkEsryg98BujhVOncKm/C1xROxZ030LQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true + } + } + }, + "bower-endpoint-parser": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz", + "integrity": "sha512-YWZHhWkPdXtIfH3VRu3QIV95sa75O9vrQWBOHjexWCLBCTy5qJvRr36LXTqFwTchSXVlzy5piYJOjzHr7qhsNg==", + "dev": true + }, + "bower-installer": { + "version": "git+ssh://git@github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7", + "dev": true, + "from": "bower-installer@git://github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7", + "requires": { + "async": "0.2.10", + "bower": "1.3.12", + "colors": "0.6.2", + "glob": "3.2.11", + "lodash": "0.9.2", + "mkdirp": "0.3.5", + "node-fs": "0.1.7", + "nopt": "2.1.2" + }, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==", + "dev": true + }, + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "dev": true, + "optional": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==", + "dev": true, + "optional": true + }, + "bower": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/bower/-/bower-1.3.12.tgz", + "integrity": "sha512-YqGbbhwrQHbHI9+M8tVHbq5twIhVfJaQRM3TOmgtz5Dh9sPwYjiT8oo8MIhv0Ma+c4xVsABB+B3ooMJC8hdcbw==", + "dev": true, + "requires": { + "abbrev": "1.0.9", + "archy": "0.0.2", + "bower-config": "0.5.3", + "bower-endpoint-parser": "0.2.2", + "bower-json": "0.4.0", + "bower-logger": "0.2.2", + "bower-registry-client": "0.2.4", + "cardinal": "0.4.0", + "chalk": "0.5.0", + "chmodr": "0.1.0", + "decompress-zip": "0.0.8", + "fstream": "1.0.12", + "fstream-ignore": "1.0.5", + "glob": "4.0.6", + "graceful-fs": "3.0.12", + "handlebars": "2.0.0", + "inquirer": "0.7.1", + "insight": "0.4.3", + "is-root": "1.0.0", + "junk": "1.0.3", + "lockfile": "1.0.4", + "lru-cache": "2.5.2", + "mkdirp": "0.5.0", + "mout": "0.9.1", + "nopt": "3.0.6", + "opn": "1.0.2", + "osenv": "0.1.0", + "p-throttler": "0.1.0", + "promptly": "0.2.0", + "q": "1.0.1", + "request": "2.42.0", + "request-progress": "0.3.0", + "retry": "0.6.0", + "rimraf": "2.2.8", + "semver": "2.3.2", + "shell-quote": "1.4.3", + "stringify-object": "1.0.1", + "tar-fs": "0.5.2", + "tmp": "0.0.23", + "update-notifier": "0.2.0", + "which": "1.0.9" + }, + "dependencies": { + "glob": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz", + "integrity": "sha512-D0H1thJnOVgI0zRV3H/Vmb9HWmDgGTTR7PeT8Lk0ri2kMmfK3oKQBolfqJuRpBVpTx5Q5PKGl9hdQEQNTXJI7Q==", + "dev": true, + "requires": { + "graceful-fs": "3.0.12", + "inherits": "2.0.4", + "minimatch": "1.0.0", + "once": "1.4.0" + } + }, + "mkdirp": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha512-xjjNGy+ry1lhtIKcr2PT6ok3aszhQfgrUDp4OZLHacgRgFmF6XR9XCOJVcXlVGQonIqXcK1DvqgKKQOPWYGSfw==", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + } + } + }, + "bower-config": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.3.tgz", + "integrity": "sha512-Ly0EwAJGD5fX7y7vSvgo+yKPh+oME9jYd5Npqecxs5izpjV8aMZGF3j1ZhDDOCBIFDVNk+gGmKZAFAPmr86jLQ==", + "dev": true, + "requires": { + "graceful-fs": "2.0.3", + "mout": "0.9.1", + "optimist": "0.6.1", + "osenv": "0.0.3" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true + }, + "osenv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha512-VBk1bfdaO4gh3OWO8LBuDY2alp0buL8YzQ6t13xyc8PQPrnUg5AgQvINQx3UkS4dom8UGCL597q4Y2+M4TPvmw==", + "dev": true + } + } + }, + "caseless": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz", + "integrity": "sha512-/X9C8oGbZJ95LwJyK4XvN9GSBgw/rqBnUg6mejGhf/GNfJukt5tzOXP+CJicXdWSqAX0ETaufLDxXuN2m4/mDg==", + "dev": true + }, + "chalk": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.0.tgz", + "integrity": "sha512-rTCcbF0wrwC+kKzA/3SpBc6PrcOx/+PRQVtS3PEDw5tGzqycpB48dRS8ByxFDd8Ij5E1RtafZ34R1X9VLI/vUQ==", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "dev": true, + "optional": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "dev": true, + "optional": true + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", + "dev": true + }, + "form-data": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "integrity": "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==", + "dev": true, + "optional": true, + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime": "1.2.11" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "requires": { + "inherits": "2.0.4", + "minimatch": "0.3.0" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "dev": true, + "requires": { + "lru-cache": "2.5.2", + "sigmund": "1.0.1" + } + } + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "1.1.6" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true + }, + "lru-cache": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz", + "integrity": "sha512-wyqfj+623mgqv+bpjTdivSoC/LtY9oOrmKz2Cke0NZcgYW9Kce/qWjd9e5PDYf8wuiKfVeo8VnyOSSyeRiUsLw==", + "dev": true + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==", + "dev": true, + "optional": true + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", + "dev": true + }, + "minimatch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz", + "integrity": "sha512-Ejh5Odk/uFXAj5nf/NSXk0UamqcGAfOdHI7nY0zvCHyn4f3nKLFoUTp+lYxDxSih/40uW8lpwDplOWHdWkQXWA==", + "dev": true, + "requires": { + "lru-cache": "2.5.2", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==", + "dev": true + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "mout": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz", + "integrity": "sha512-mZMABHAQPQ87JDQuxZIndS6XXDYZfeAfcTvHYyEFG4SEUiGNkInNZi/WhesQjCKUWih1bDDkqHw63wyCaczhsw==", + "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "dev": true + }, + "nopt": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", + "integrity": "sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==", + "dev": true, + "requires": { + "abbrev": "1.0.9" + } + }, + "oauth-sign": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz", + "integrity": "sha512-vF36cbrUyfy7Yr6kTIzrj3RsuaPYeJKU3IUOC6MglfNTyiGT6leGvEVOa3UsSsgwBzfVfRnvMiMVyUnpXNqN8w==", + "dev": true, + "optional": true + }, + "opn": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz", + "integrity": "sha512-4w6LXX5mR/XGoM8QfFOfixA7aCLTUwNXPPAvUM5pXfc/8oGyQx6IskSzjuRvNZvD6tT6SCsBTlw4VBMUR6dA2w==", + "dev": true + }, + "osenv": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz", + "integrity": "sha512-PenJexmyQ/42JhvtcLRdVaWobP+JccHIclnQeTL2t66j6aAB79iVdOzwC1DtRDuv49e/QjFq7CMC5YYPVw1rcg==", + "dev": true + }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", + "dev": true + }, + "qs": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz", + "integrity": "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==", + "dev": true + }, + "request": { + "version": "2.42.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.42.0.tgz", + "integrity": "sha512-ZpqQyQWQ7AdVurjxpmP/fgpN3wAZBruO2GeD3zDijWmnqg3SYz9YY6uZC8tJF++IhZ/P2VZkZug/fFEshAkD6g==", + "dev": true, + "requires": { + "aws-sign2": "0.5.0", + "bl": "0.9.5", + "caseless": "0.6.0", + "forever-agent": "0.5.2", + "form-data": "0.1.4", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.4.0", + "qs": "1.2.2", + "stringstream": "0.0.6", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.4.3" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true + }, + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true + }, + "tmp": { + "version": "0.0.23", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz", + "integrity": "sha512-zR0TtNGw3OoChmmzHNnMVh6LRY7fCkxXnHOEI9/CZE5zn6TzZbyMknZdmQZzD0EhcQVT/9rZHeg1KqiqfAC5jw==", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==", + "dev": true + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", + "dev": true + } + } + }, + "bower-json": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz", + "integrity": "sha512-CiCTvl2OndArvZjWYvaOuQWI/fjeaBz8wPLF8MWadHT+ULaBDqtQIOYqQFsxtzUFw6E206960mlZfiUuR1PPBg==", + "dev": true, + "requires": { + "deep-extend": "0.2.11", + "graceful-fs": "2.0.3", + "intersect": "0.0.3" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true + } + } + }, + "bower-logger": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz", + "integrity": "sha512-2x4n3GsmV6w3BeMK3zHv6T88HbuMQH2MJ0KZNbQMbJq8XPARdH1p9/CXsdkOBW5sMcnBCOVGxutDJYbkh2A7QQ==", + "dev": true + }, + "bower-registry-client": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.2.4.tgz", + "integrity": "sha512-QtwcgMsDMWvCtA1yrOmahanAFMt5IWjF79erdi366r0X/AZxYwsLyHiAsb1o9WVy4kZb2Sp7kpZRiyN1X0rDiA==", + "dev": true, + "requires": { + "async": "0.2.10", + "bower-config": "0.5.3", + "graceful-fs": "2.0.3", + "lru-cache": "2.3.1", + "mkdirp": "0.3.5", + "request": "2.51.0", + "request-replay": "0.2.0", + "rimraf": "2.2.8" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==", + "dev": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==", + "dev": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "aws-sign2": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "integrity": "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==", + "dev": true + }, + "bower-config": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/bower-config/-/bower-config-0.5.3.tgz", + "integrity": "sha512-Ly0EwAJGD5fX7y7vSvgo+yKPh+oME9jYd5Npqecxs5izpjV8aMZGF3j1ZhDDOCBIFDVNk+gGmKZAFAPmr86jLQ==", + "dev": true, + "requires": { + "graceful-fs": "2.0.3", + "mout": "0.9.1", + "optimist": "0.6.1", + "osenv": "0.0.3" + } + }, + "caseless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz", + "integrity": "sha512-RtOAnto0D6IIVC+dU+vHyH0tXs6BfZ/s0kaaT5+6loiwoi9O3+J5iASBkliQHrd8GSRNGERS7f8pgaRc895bAg==", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==", + "dev": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==", + "dev": true + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==", + "dev": true + }, + "form-data": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz", + "integrity": "sha512-LkinaG6JazVhYj2AKi67NOIAhqXcBOQACraT0WdhWW4ZO3kTiS0X7C1nJ1jFZf6wak4bVHIA/oOzWkh2ThAipg==", + "dev": true, + "requires": { + "async": "0.9.2", + "combined-stream": "0.0.7", + "mime-types": "2.0.14" + }, + "dependencies": { + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "dev": true + }, + "mime-types": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz", + "integrity": "sha512-2ZHUEstNkIf2oTWgtODr6X0Cc4Ns/RN/hktdozndiEhhAC2wxXejF1FH0XLHTEImE9h6gr/tcnr3YOnSGsxc7Q==", + "dev": true, + "requires": { + "mime-db": "1.12.0" + } + } + } + }, + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==", + "dev": true + }, + "http-signature": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "integrity": "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==", + "dev": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.5", + "ctype": "0.5.3" + } + }, + "lru-cache": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz", + "integrity": "sha512-EjtmtXFUu+wXm6PW3T6RT1ekQUxobC7B5TDCU0CS0212wzpwKiXs6vLun+JI+OoWmmliWdYqnrpjrlK7W3ELdQ==", + "dev": true + }, + "mime-db": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz", + "integrity": "sha512-5aMAW7I4jZoZB27fXRuekqc4DVvJ7+hM8UcWrNj2mqibE54gXgPSonBYBdQW5hyaVNGmiYjY0ZMqn9fBefWYvA==", + "dev": true + }, + "mime-types": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz", + "integrity": "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==", + "dev": true + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "mout": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz", + "integrity": "sha512-mZMABHAQPQ87JDQuxZIndS6XXDYZfeAfcTvHYyEFG4SEUiGNkInNZi/WhesQjCKUWih1bDDkqHw63wyCaczhsw==", + "dev": true + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==", + "dev": true + }, + "oauth-sign": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz", + "integrity": "sha512-jXeZq5EriUSGdNIePO45lhemfuCBKi5DARdE30v173MPCLymq2DxR477J/RuCXLphNx7OVAqXVyj3JoUaiHpNw==", + "dev": true + }, + "osenv": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz", + "integrity": "sha512-VBk1bfdaO4gh3OWO8LBuDY2alp0buL8YzQ6t13xyc8PQPrnUg5AgQvINQx3UkS4dom8UGCL597q4Y2+M4TPvmw==", + "dev": true + }, + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A==", + "dev": true + }, + "request": { + "version": "2.51.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.51.0.tgz", + "integrity": "sha512-6pfShjLfn6ThOlPHyQo7nBxEwTa2PzvqHruxQS51TrADjWj3qetRZ2Ae5gRzMF7N2fKG5Ww7su+Z6jA3sFv0Gw==", + "dev": true, + "requires": { + "aws-sign2": "0.5.0", + "bl": "0.9.5", + "caseless": "0.8.0", + "combined-stream": "0.0.7", + "forever-agent": "0.5.2", + "form-data": "0.2.0", + "hawk": "1.1.1", + "http-signature": "0.10.1", + "json-stringify-safe": "5.0.1", + "mime-types": "1.0.2", + "node-uuid": "1.4.8", + "oauth-sign": "0.5.0", + "qs": "2.3.3", + "stringstream": "0.0.6", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.4.3" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==", + "dev": true + } + } + }, + "boxen": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", + "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", + "requires": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.0", + "chalk": "^5.0.1", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + }, + "camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==" + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.2", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "7.0.1" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dev": true, + "requires": { + "buffer-alloc-unsafe": "1.1.0", + "buffer-fill": "1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", + "dev": true + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "c3": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/c3/-/c3-0.5.4.tgz", + "integrity": "sha512-+Ido5E9fAM6Tn+v7MI5VxYbQwCn59WxW+wMfWdgQ4PS3NZu/yG8EwiXW/ZB//kFUmLplEkWabE9kn1ckC6YZ/w==", + "requires": { + "d3": "4.13.0" + }, + "dependencies": { + "d3": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz", + "integrity": "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==", + "requires": { + "d3-array": "1.2.1", + "d3-axis": "1.0.8", + "d3-brush": "1.0.4", + "d3-chord": "1.0.4", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-dsv": "1.0.8", + "d3-ease": "1.0.3", + "d3-force": "1.1.0", + "d3-format": "1.2.2", + "d3-geo": "1.9.1", + "d3-hierarchy": "1.1.5", + "d3-interpolate": "1.1.6", + "d3-path": "1.0.5", + "d3-polygon": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-queue": "3.0.7", + "d3-random": "1.1.0", + "d3-request": "1.0.6", + "d3-scale": "1.0.7", + "d3-selection": "1.3.0", + "d3-shape": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1", + "d3-timer": "1.0.7", + "d3-transition": "1.1.1", + "d3-voronoi": "1.1.2", + "d3-zoom": "1.7.1" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" + } + }, + "cache-breaker": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/cache-breaker/-/cache-breaker-0.0.4.tgz", + "integrity": "sha512-LPJldJ74iN43nAZl/IRRc9SKtlKymhftnlROHXsUmCLjM/yZHO17zDICoAHyluxmUSkI8A3hrFlR6cDsWwQ95Q==", + "dev": true, + "requires": { + "lodash": "2.2.1" + }, + "dependencies": { + "lodash": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.2.1.tgz", + "integrity": "sha512-rGaKzxe4Biu8YdCPD/tUkBF4/fnAqgj63A6PeAyQnH/NEKNUHgppGZUgYBYOmAZsBKwwAb343Q1Zew0RDB2jIg==", + "dev": true + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "1.1.1", + "get-intrinsic": "1.2.1" + } + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "cardinal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-0.4.0.tgz", + "integrity": "sha512-v9AEoI0C3hrH8+zh1qcns1KiAaDWmF8siZMXCS6rHbTL3y+R9oP34KESnSnZL+4/L1wVAKPlCRD+kF4aR4YN+w==", + "dev": true, + "requires": { + "redeyed": "0.4.4" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "requires": { + "traverse": "0.3.9" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "4.3.0", + "supports-color": "7.2.0" + } + }, + "chalk-template": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", + "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", + "requires": { + "chalk": "^4.1.2" + } + }, + "change-case": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz", + "integrity": "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "constant-case": "2.0.0", + "dot-case": "2.1.1", + "header-case": "1.0.1", + "is-lower-case": "1.1.3", + "is-upper-case": "1.1.2", + "lower-case": "1.1.4", + "lower-case-first": "1.0.2", + "no-case": "2.3.2", + "param-case": "2.1.1", + "pascal-case": "2.0.1", + "path-case": "2.1.1", + "sentence-case": "2.1.1", + "snake-case": "2.1.0", + "swap-case": "1.1.2", + "title-case": "2.1.1", + "upper-case": "1.1.3", + "upper-case-first": "1.1.2" + } + }, + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dev": true, + "optional": true, + "requires": { + "is-regex": "1.1.4" + } + }, + "chmodr": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz", + "integrity": "sha512-TAHgbpLNK/h5D8qvtBUKc892GXWqGLkGmoEv6V2NUDTRCw2nI9IvbFi89cbEAooGwyqAZsePjyuLiWBj+H0twQ==", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.6", + "fsevents": "1.2.13", + "glob-parent": "2.0.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", + "dev": true, + "requires": { + "commander": "2.8.1", + "source-map": "0.4.4" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.7" + } + }, + "cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + }, + "cli-color": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz", + "integrity": "sha512-e8BuO18ajBxfbL2eJldk8VgYDjshE8hV1ECafR0pl5EzgbyK9YnmGWLHylXVrQgaK4J1SJJzWDjIncfVuJvtpg==", + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "memoizee": "0.3.10", + "timers-ext": "0.1.7" + } + }, + "clipboardy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", + "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", + "requires": { + "arch": "^2.2.0", + "execa": "^5.1.1", + "is-wsl": "^2.2.0" + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", + "dev": true + }, + "combine-lists": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "integrity": "sha512-4Mi0V7N48B9KzC8Zl/U7wiWuxMFEHf44N3/PSoAvWDu8IOPrddNo1y1tC/kXbP7IvVMhgCFMMNzgKb0pWoin9w==", + "dev": true, + "requires": { + "lodash": "4.17.21" + } + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": "1.52.0" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "1.3.8", + "bytes": "3.0.0", + "compressible": "2.0.18", + "debug": "2.6.9", + "on-headers": "1.0.2", + "safe-buffer": "5.1.2", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "2.3.8", + "typedarray": "0.0.6" + } + }, + "config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "requires": { + "ini": "1.3.8", + "proto-list": "1.2.4" + } + }, + "configstore": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz", + "integrity": "sha512-2aMMi3erDQwgL7BgnW0aIzILAikpVH4TVEz60F/naT+XsPPX6IaPEuF/zD28XSNFWO/mHQ9OVRxkvcSbq6EFdA==", + "dev": true, + "requires": { + "graceful-fs": "3.0.12", + "js-yaml": "3.14.1", + "mkdirp": "0.5.6", + "object-assign": "2.1.1", + "osenv": "0.1.5", + "user-home": "1.1.1", + "uuid": "2.0.3", + "xdg-basedir": "1.0.1" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "1.1.6" + } + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==", + "dev": true + } + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "1.3.3", + "utils-merge": "1.0.1" + } + }, + "connect-livereload": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", + "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", + "dev": true + }, + "connect-modrewrite": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/connect-modrewrite/-/connect-modrewrite-0.10.2.tgz", + "integrity": "sha512-37+kS9t26vxjW5ErNrr8d04F7Us1EH7XhHtxSm8yE8kO2uDF2DsPI+qI2wCeBSaoakXKit0/88sg4vL2Wl8tDw==", + "dev": true, + "requires": { + "qs": "6.11.2" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, + "constant-case": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz", + "integrity": "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==", + "dev": true, + "requires": { + "snake-case": "2.1.0", + "upper-case": "1.1.3" + } + }, + "constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "dev": true, + "optional": true, + "requires": { + "@types/babel-types": "7.0.11", + "@types/babylon": "6.16.6", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true + }, + "continuable-cache": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", + "integrity": "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "dev": true + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==", + "dev": true, + "requires": { + "lru-cache": "4.1.5", + "which": "1.3.1" + } + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==", + "dev": true, + "requires": { + "boom": "0.4.2" + } + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true + }, + "d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", + "dev": true, + "requires": { + "es5-ext": "0.10.62" + } + }, + "d3": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz", + "integrity": "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==", + "requires": { + "d3-array": "1.2.1", + "d3-axis": "1.0.8", + "d3-brush": "1.0.4", + "d3-chord": "1.0.4", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-contour": "1.3.2", + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-dsv": "1.0.8", + "d3-ease": "1.0.3", + "d3-fetch": "1.2.0", + "d3-force": "1.1.0", + "d3-format": "1.2.2", + "d3-geo": "1.9.1", + "d3-hierarchy": "1.1.5", + "d3-interpolate": "1.1.6", + "d3-path": "1.0.5", + "d3-polygon": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-random": "1.1.0", + "d3-scale": "2.2.2", + "d3-scale-chromatic": "1.5.0", + "d3-selection": "1.3.0", + "d3-shape": "1.2.0", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1", + "d3-timer": "1.0.7", + "d3-transition": "1.1.1", + "d3-voronoi": "1.1.2", + "d3-zoom": "1.7.1" + }, + "dependencies": { + "d3-scale": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz", + "integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==", + "requires": { + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-format": "1.2.2", + "d3-interpolate": "1.1.6", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" + } + } + } + }, + "d3-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz", + "integrity": "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + }, + "d3-axis": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz", + "integrity": "sha512-K0djTb26iQ6AsuD2d6Ka08wBHf4V30awIxV4XFuB/iLzYtTqqJlE/nIN0DBJJCX7lbOqbt2/oeX3r+sU5k2veg==" + }, + "d3-brush": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz", + "integrity": "sha512-nUFueDzOlvwFvuOBynGSyJM7Wt1H9fKgJeoWFSg3ScS4c7FJBch92FKUJKum4xtgPYHdgH2C3bRg3GzSVltCJQ==", + "requires": { + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-transition": "1.1.1" + } + }, + "d3-chord": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz", + "integrity": "sha512-o0ExexkK1N0KikUakKrQwttP5Flu8AYD6iBUh3AdPJqnTh6xlvcX5wFRuuo29sLOAr9+T4yZPUH1S3CCQJ1SlQ==", + "requires": { + "d3-array": "1.2.1", + "d3-path": "1.0.5" + } + }, + "d3-collection": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz", + "integrity": "sha512-+TPxaBFzbzfpLF3Hjz8JPeuStNmJnyWAufu8VUfpDCDn5RieIgY+OQDjhKMDorf2naLgAjjZXLUQN7XFp/kgog==" + }, + "d3-color": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz", + "integrity": "sha512-t+rSOrshj6m2AUOe8kHvTwfUQ5TFoInEkBfmsHHAHPof58dmbRXNpicB7XAyPbMQbcC7i09p2BxeCEdgBd8xmw==" + }, + "d3-contour": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz", + "integrity": "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==", + "requires": { + "d3-array": "1.2.1" + } + }, + "d3-dispatch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz", + "integrity": "sha512-Qh2DR3neW3lq/ug4oymXHYoIsA91nYt47ERb+fPKjRg6zLij06aP7KqHHl2NyziK9ASxrR3GLkHCtZvXe/jMVg==" + }, + "d3-drag": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz", + "integrity": "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==", + "requires": { + "d3-dispatch": "1.0.3", + "d3-selection": "1.3.0" + } + }, + "d3-dsv": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz", + "integrity": "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==", + "requires": { + "commander": "2.20.3", + "iconv-lite": "0.4.24", + "rw": "1.3.3" + } + }, + "d3-ease": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz", + "integrity": "sha512-io3QwOJwVPAxRF2UXpKpCdz2wm/7VLFCQQ1yy+GzX6YCtt3vi2BGnimI8agSF5jyUrHsADyF303d2S+ps7zU8w==" + }, + "d3-fetch": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz", + "integrity": "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==", + "requires": { + "d3-dsv": "1.0.8" + } + }, + "d3-force": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz", + "integrity": "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==", + "requires": { + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-quadtree": "1.0.3", + "d3-timer": "1.0.7" + } + }, + "d3-format": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz", + "integrity": "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" + }, + "d3-geo": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz", + "integrity": "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==", + "requires": { + "d3-array": "1.2.1" + } + }, + "d3-hierarchy": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz", + "integrity": "sha512-PcsLIhThc60mWnxlojIOH7Sc0tQ2DgLWfEwEAyzCtej5f3H9wSsRmrg5pEhKZLrwiJnI2zyw/pznJxL9a/Eugw==" + }, + "d3-interpolate": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz", + "integrity": "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==", + "requires": { + "d3-color": "1.0.3" + } + }, + "d3-path": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz", + "integrity": "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" + }, + "d3-polygon": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz", + "integrity": "sha512-2zP7GOvf4XOWTeQouK7fCO534yQxyhYYTw6GTqcXifIalHgA6qV/es+4GRQii9m6XxEPFcht4loobD/o2iEo1A==" + }, + "d3-quadtree": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz", + "integrity": "sha512-U2Jc3jF3JOBGXIOnvWY9C4ekRwRX9hEVpMMmeduJyaxAwPmoe7t84iZFTLn1RwYOyrXxJF55H/Hrg186TFQQdw==" + }, + "d3-queue": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz", + "integrity": "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==" + }, + "d3-random": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz", + "integrity": "sha512-XuMbjx3Jq4EWfJP4g6nR7zns/bZfaVbWHWfR8auDkEiWCzVbWifmasfszV1ZRN3xXK3nY4RUFL2nTIhceGZSFQ==" + }, + "d3-request": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz", + "integrity": "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==", + "requires": { + "d3-collection": "1.0.4", + "d3-dispatch": "1.0.3", + "d3-dsv": "1.0.8", + "xmlhttprequest": "1.8.0" + } + }, + "d3-scale": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz", + "integrity": "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==", + "requires": { + "d3-array": "1.2.1", + "d3-collection": "1.0.4", + "d3-color": "1.0.3", + "d3-format": "1.2.2", + "d3-interpolate": "1.1.6", + "d3-time": "1.0.8", + "d3-time-format": "2.1.1" + } + }, + "d3-scale-chromatic": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz", + "integrity": "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==", + "requires": { + "d3-color": "1.0.3", + "d3-interpolate": "1.1.6" + } + }, + "d3-selection": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz", + "integrity": "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" + }, + "d3-shape": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz", + "integrity": "sha512-LP48zJ9ykPKjCdd0vSu5k2l4s8v1vI6vvdDeJtmgtTa+L6Ery0lzvOaV7pMunFuLv11hwSRZQnSnlhFl801aiw==", + "requires": { + "d3-path": "1.0.5" + } + }, + "d3-time": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz", + "integrity": "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + }, + "d3-time-format": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz", + "integrity": "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==", + "requires": { + "d3-time": "1.0.8" + } + }, + "d3-timer": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz", + "integrity": "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + }, + "d3-transition": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz", + "integrity": "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==", + "requires": { + "d3-color": "1.0.3", + "d3-dispatch": "1.0.3", + "d3-ease": "1.0.3", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-timer": "1.0.7" + } + }, + "d3-voronoi": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz", + "integrity": "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" + }, + "d3-zoom": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz", + "integrity": "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==", + "requires": { + "d3-dispatch": "1.0.3", + "d3-drag": "1.2.1", + "d3-interpolate": "1.1.6", + "d3-selection": "1.3.0", + "d3-transition": "1.1.1" + } + }, + "dargs": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz", + "integrity": "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==", + "dev": true + }, + "date-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", + "integrity": "sha512-RrxZQ06cdKe7YQ5oqIxs3GMc7W3vXscy7Ds+aZIqmxA59QnVtTiCseA4jbzVUub9xCbo9GuYVZo0OrZLYXnnmw==", + "dev": true, + "requires": { + "time-zone": "0.1.0" + } + }, + "dateformat": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true + }, + "decompress-zip": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.8.tgz", + "integrity": "sha512-83ZYuMw/GIpxJx8IQMi7xvdFynFJrZkmCTfae26DsPXGaxeDAusP+3LuNYczoA4HCQdWoaZX2w96aZJZdYewBQ==", + "dev": true, + "requires": { + "binary": "0.3.0", + "graceful-fs": "3.0.12", + "mkpath": "0.1.0", + "nopt": "2.2.1", + "q": "1.0.1", + "readable-stream": "1.1.14", + "touch": "0.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "dev": true, + "requires": { + "natives": "1.1.6" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "nopt": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz", + "integrity": "sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "q": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.0.1.tgz", + "integrity": "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz", + "integrity": "sha512-t2N+4ihO7YgydJOUI47I6GdXpONJ+jUZmYeTNiifALaEduiCja1mKcq3tuSp0RhA9mMfxdMN3YskpwB7puMAtw==", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.7.1" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", + "dev": true, + "optional": true + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "requires": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.2", + "void-elements": "2.0.1" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "requires": { + "domelementtype": "2.3.0", + "entities": "2.2.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==", + "dev": true, + "requires": { + "domelementtype": "1.3.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==", + "dev": true, + "requires": { + "dom-serializer": "0.2.2", + "domelementtype": "1.3.1" + } + }, + "dot-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz", + "integrity": "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "1.4.4", + "inherits": "2.0.4", + "readable-stream": "2.3.8", + "stream-shift": "1.0.1" + } + }, + "each-async": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz", + "integrity": "sha512-0hJGub96skwr+sUojv7zQ0kc9i4jn3SwLiLk8Jr7KDz7aaaMzkN5UX3a/9ZhzC0OfZVyXHhlHcjC0KVOiKZ+HQ==", + "dev": true, + "requires": { + "onetime": "1.1.0", + "set-immediate-shim": "1.0.1" + } + }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "0.1.1", + "safer-buffer": "2.1.2" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "engine.io": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "integrity": "sha512-VNQ79eqoDiapJ2tDMu+N7SPDm11btXpO7b2gsxBVd1XbxBCx6xLyTESIuFlWUspsbuif6Rq88pYNrQce5G7bqw==", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha512-AOPopplFOUlmUugwiZUCDpOwmqvSgdCyE8iJVLWI4NcB7qfMKQN34dn5xYtlUU03XGG5egRWW4NW5gIxpa5hEA==", + "dev": true, + "requires": { + "mime-types": "2.1.35", + "negotiator": "0.6.1" + } + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha512-qTxkr1RoLw5Pz+1+PTJ/66hWuyi2LEOeOuIDJDlx6JF8x75bmD5C7qXTg2UlX5W9rLfkqKP+r8q6Vy6NWdWrbw==", + "dev": true + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha512-lobrh3Dhp6tD1hv7NAIMx+oX/rsH/yd6/4krpBmJ/6ulsMZgQMuttlWTuYVWLV6ZjlpWIOjz55KbQbcKSQywEQ==", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "integrity": "sha512-260nnbHkYPTPnA9cjH2oCvWmqNwYofsNBkDfViI9iS487oMcl3kUeSgXJCwMxASgOL5DVlQF4hb0NzRNFkUaFg==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "ws": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "integrity": "sha512-lobrh3Dhp6tD1hv7NAIMx+oX/rsH/yd6/4krpBmJ/6ulsMZgQMuttlWTuYVWLV6ZjlpWIOjz55KbQbcKSQywEQ==", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "integrity": "sha512-3UyTJo+5Jbmr7rd3MosTAApK7BOIo4sjx8dJYSHa3Em5R3A9Y2s9GWu4JFJe6Px0VieJC0hKUA5NBytC+O7k2A==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", + "dev": true + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==", + "dev": true + }, + "error": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", + "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", + "dev": true, + "requires": { + "string-template": "0.2.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.3", + "next-tick": "1.1.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.62", + "es6-symbol": "3.1.3" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "0.10.62", + "type": "1.2.0" + } + } + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dev": true, + "requires": { + "d": "1.0.1", + "ext": "1.7.0" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "0.10.62", + "type": "1.2.0" + } + } + } + }, + "es6-weak-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "es6-iterator": "0.1.3", + "es6-symbol": "2.0.1" + }, + "dependencies": { + "es6-iterator": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "es6-symbol": "2.0.1" + } + }, + "es6-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.62" + } + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "optional": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dev": true, + "requires": { + "d": "1.0.1", + "es5-ext": "0.10.62" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dev": true, + "requires": { + "es5-ext": "0.10.62", + "type": "1.2.0" + } + } + } + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha512-DOFqA1MF46fmZl2xtzXR3MPCRsXqgoFqdXcrCVYM3JNnfUeHTm/fh/v/iU7gBFpwkuBmoJPAm5GuhdDfSEJMJA==", + "dev": true + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "expand-braces": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "integrity": "sha512-zOOsEnAhvIxxd0esCNbYG2xerGf46niZ1egS43eV7Fu4t7VIScgPXMcMabCLaPrqkzwvwo6zZipDiX3t0ILF2w==", + "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, + "dependencies": { + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==", + "dev": true + }, + "braces": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "integrity": "sha512-EIMHIv2UXHWFY2xubUGKz+hq9hNkENj4Pjvr7h58cmJgpkK2yMlKA8I484f7MSttkzVAy/lL7X9xDaILd6avzA==", + "dev": true, + "requires": { + "expand-range": "0.1.1" + } + }, + "expand-range": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "integrity": "sha512-busOHJ0t7t5UcutcyNDqmaDX+1cb0XlqsAUgTlmplVv0rIqBaMcBSZRLlkDm0nxtl8O3o/EvRRrdQ/WnyPERLQ==", + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } + }, + "is-number": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "integrity": "sha512-la5kPULwIgkSSaZj9w7/A1uHqOBAgOhDUKQ5CkfL8LZ4Si6r4+2D0hI6b4o60MW4Uj2yNJARWIZUDPxlvOYQcw==", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "integrity": "sha512-yHeI3F9v20MY+8/5WAUgIWseMZwpLD+l9h5hGyzh6fQjhle2AwjjRDao1m5IozSDuVvMw09/mvE8AU1oDmZKpQ==", + "dev": true + } + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==", + "dev": true, + "requires": { + "fill-range": "2.2.4" + }, + "dependencies": { + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.1", + "repeat-element": "1.1.4", + "repeat-string": "1.6.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.3" + } + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dev": true, + "requires": { + "type": "2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + } + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "debug": "2.6.9", + "mkdirp": "0.5.6", + "yauzl": "2.10.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "requires": { + "punycode": "^1.3.2" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + } + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==", + "dev": true, + "requires": { + "websocket-driver": "0.7.4" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", + "dev": true + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.3", + "statuses": "1.5.0", + "unpipe": "1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "dev": true, + "requires": { + "detect-file": "1.0.0", + "is-glob": "4.0.3", + "micromatch": "4.0.5", + "resolve-dir": "1.0.1" + } + }, + "fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" + } + }, + "flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true + }, + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.8", + "mime-types": "2.1.35" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "dev": true + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha512-05cXDIwNbFaoFWaz5gNHlUTbH5whiss/hr/ibzPd4MH3cR4w0ZKeIPiVdbyJurg3O5r/Bjpvn9KOb1/rPMf3nA==", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "jsonfile": "3.0.1", + "universalify": "0.1.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "1.5.0", + "nan": "2.17.0" + } + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "inherits": "2.0.4", + "mkdirp": "0.5.6", + "rimraf": "2.7.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha512-VVRuOs41VUqptEGiR0N5ZoWEcfGvbGRqLINyZAhHRnF3DH5wrqjNkYr3VbRoZnI41BZgO7zIVdiobc13TVI1ow==", + "dev": true, + "requires": { + "fstream": "1.0.12", + "inherits": "2.0.4", + "minimatch": "3.0.8" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.7", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.5" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "1.3.4" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "1.1.1", + "has": "1.0.3", + "has-proto": "1.0.1", + "has-symbols": "1.0.3" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", + "dev": true + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true + }, + "getobject": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", + "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.8", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==", + "dev": true, + "requires": { + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.3", + "ini": "1.3.8", + "is-windows": "1.0.2", + "which": "1.3.1" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.7", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "globule": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz", + "integrity": "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==", + "dev": true, + "requires": { + "glob": "7.1.7", + "lodash": "4.17.21", + "minimatch": "3.0.8" + } + }, + "got": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/got/-/got-0.3.0.tgz", + "integrity": "sha512-6DJBU8c+pWPYdajwiqhe22oPkq8FYr6xIPPcoJLfnQZbvrcOBJhoVmvNBxfqfDrJ3EXrd3pXpyVvPRPLv4K+PQ==", + "dev": true, + "requires": { + "object-assign": "0.3.1" + }, + "dependencies": { + "object-assign": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz", + "integrity": "sha512-4gWmwoU6o9UImLLzq+8R+kzWT0ABYdKXuvSp08JpYzhibFvdUirMfE9nE5yYHcG1k9ClcVueR4TolZpRvwg5og==", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==", + "dev": true + }, + "grunt": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", + "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "dev": true, + "requires": { + "dateformat": "4.6.3", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "5.0.0", + "glob": "7.1.7", + "grunt-cli": "1.4.3", + "grunt-known-options": "2.0.0", + "grunt-legacy-log": "3.0.0", + "grunt-legacy-util": "2.0.1", + "iconv-lite": "0.6.3", + "js-yaml": "3.14.1", + "minimatch": "3.0.8", + "nopt": "3.0.6" + }, + "dependencies": { + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "2.0.0", + "interpret": "1.1.0", + "liftup": "3.0.1", + "nopt": "4.0.3", + "v8flags": "3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + } + } + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + } + } + }, + "grunt-bower-install-simple": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/grunt-bower-install-simple/-/grunt-bower-install-simple-1.2.4.tgz", + "integrity": "sha512-T+jq6ERQjyf4muAxfqthK6XxtJEI28kwbKZTyd6PUw5PT1rzecXfQrA+Y8rnK2wB5nYh/dyIQeOvdtXfUaNAyA==", + "dev": true, + "requires": { + "bower": "1.8.14", + "chalk": "1.1.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-cache-breaker": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-cache-breaker/-/grunt-cache-breaker-2.0.1.tgz", + "integrity": "sha512-CXUt/ObRfnxr+//ZjHw18+scIk+cRoDInIlg7KgbjeKhah2qEQIECTaffIsJ2dSgvV3Cjv8LWQm+KDYgbOrI1Q==", + "dev": true, + "requires": { + "cache-breaker": "0.0.4", + "lodash.clonedeep": "3.0.2" + } + }, + "grunt-cache-bust": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/grunt-cache-bust/-/grunt-cache-bust-1.6.0.tgz", + "integrity": "sha512-X72wA793N27yBSGnEFT9+pjpT2eRVg2AGd2pAlx5WH63r/e3iX2QhX/E3P16iJk+d3+pIlFbYm4V5fZnWRqUyg==", + "dev": true, + "requires": { + "fs-extra": "3.0.1" + } + }, + "grunt-concurrent": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-2.3.1.tgz", + "integrity": "sha512-XPf7f39OPjDZAQmNmlLk52xOKPpfi8Z7kX8Ju6kOkUL4W53monshs3U8UF3ByccHxTML7+6njzvNN0ejUYPMmA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "async": "1.5.2", + "indent-string": "2.1.0", + "pad-stream": "1.2.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + } + } + }, + "grunt-connect-proxy-updated": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/grunt-connect-proxy-updated/-/grunt-connect-proxy-updated-0.2.1.tgz", + "integrity": "sha512-BOUSFoabioNpIxhMVAeyHC1J3gyFebMokF7v+aX5TkdPzASsmeYEaTUmMroW8Vqr5UVHKSsge/XStfuzifmb6A==", + "dev": true, + "requires": { + "http-proxy": "1.11.3", + "lodash": "0.9.2" + }, + "dependencies": { + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true + } + } + }, + "grunt-contrib-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", + "integrity": "sha512-tET+TYTd8vCtKeGwbLjoH8+SdI8ngVzGbPr7vlWkewG7mYYHIccd2Ldxq+PK3DyBp5Www3ugdkfsjoNKUl5MTg==", + "dev": true, + "requires": { + "async": "1.5.2", + "rimraf": "2.7.1" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + } + } + }, + "grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha512-QdTmcxe8aim2Z0dFeuSJ+f7fHIeY7PZaTMZxgvosjXwyMhpy2GUR5WHkr12lksHfZVE80v2wUwqF56wyfPUwoQ==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "source-map": "0.5.7" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-connect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz", + "integrity": "sha512-7OPoyfGrpOYzuiRPzGyzWDe/xFcjttXe1ztVSFS8TAVBtpfXeeOV9RiwuyqA4yN1UeOG2Pnpx8s0DcUDAu21Gw==", + "dev": true, + "requires": { + "async": "1.5.2", + "connect": "3.7.0", + "connect-livereload": "0.5.4", + "http2": "3.3.7", + "morgan": "1.10.0", + "opn": "4.0.2", + "portscanner": "1.2.0", + "serve-index": "1.9.1", + "serve-static": "1.15.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + }, + "connect-livereload": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", + "integrity": "sha512-3KnRwsWf4VmP01I4hCDQqTc4e2UxOvJIi8i08GiwqX2oymzxNFY7PqjFkwHglYTJ0yzUJkO5yqdPxVaIz3Pbug==", + "dev": true + } + } + }, + "grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "file-sync-cmp": "0.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-cssmin": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz", + "integrity": "sha512-IXNomhQ5ekVZbDbj/ik5YccoD9khU6LT2fDXqO1+/Txjq8cp0tQKjVS8i8EAbHOrSDkL7/UD6A7b+xj98gqh9w==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "clean-css": "4.1.11", + "maxmin": "2.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "clean-css": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz", + "integrity": "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-jshint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz", + "integrity": "sha512-N8jtQ/FmvuRdJoEGphmGt+ov1oi5bJq4hPBPT/g54ed1glF34l2z5VAdHHhcgOaezBxur3kcMPChB0pfZxxcFw==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "hooker": "0.2.3", + "jshint": "2.9.7" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-contrib-sass": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-sass/-/grunt-contrib-sass-2.0.0.tgz", + "integrity": "sha512-RxZ3dlZZTX4YBPu2zMu84NPYgJ2AYAlIdEqlBaixNVyLNbgvJBGUr5Gi0ec6IiOQbt/I/z7uZVN9HsRxgznIRw==", + "dev": true, + "requires": { + "async": "2.6.4", + "chalk": "2.4.2", + "cross-spawn": "6.0.5", + "dargs": "6.1.0", + "which": "1.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "4.17.21" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.5", + "path-key": "2.0.1", + "semver": "5.7.2", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "grunt-contrib-uglify": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz", + "integrity": "sha512-ITxiWxrjjP+RZu/aJ5GLvdele+sxlznh+6fK9Qckio5ma8f7Iv8woZjRkGfafvpuygxNefOJNc+hfjjBayRn2Q==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "maxmin": "3.0.0", + "uglify-js": "3.17.4", + "uri-path": "1.0.0" + }, + "dependencies": { + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dev": true, + "requires": { + "duplexer": "0.1.2", + "pify": "4.0.1" + } + }, + "maxmin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz", + "integrity": "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "figures": "3.2.0", + "gzip-size": "5.1.1", + "pretty-bytes": "5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + } + } + }, + "grunt-contrib-watch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", + "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", + "dev": true, + "requires": { + "async": "2.6.4", + "gaze": "1.1.3", + "lodash": "4.17.21", + "tiny-lr": "1.1.1" + }, + "dependencies": { + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "4.17.21" + } + } + } + }, + "grunt-html2js": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/grunt-html2js/-/grunt-html2js-0.5.1.tgz", + "integrity": "sha512-INlQ9KAvi8SIMoG7WxyE0UXeHejZoR3pZqn3fhBcPWeq6IyRDKMOmJ1rMPkMnRECcbtV+7o/ao/Fm31oEUygpA==", + "dev": true, + "requires": { + "chokidar": "1.7.0", + "html-minifier": "3.0.3", + "pug": "2.0.4" + } + }, + "grunt-karma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-karma/-/grunt-karma-2.0.0.tgz", + "integrity": "sha512-/5plsdrES8dWrGhg33Q7AiYU1PUHXtMcZLP2pAppUJJKNmCpiGZXpVfHZ7KO19buVxb555UFbfhhbY7FccXH4g==", + "dev": true, + "requires": { + "lodash": "3.10.1" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + } + } + }, + "grunt-known-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", + "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", + "dev": true + }, + "grunt-legacy-log": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", + "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", + "dev": true, + "requires": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "2.1.0", + "hooker": "0.2.3", + "lodash": "4.17.21" + } + }, + "grunt-legacy-log-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", + "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", + "dev": true, + "requires": { + "chalk": "4.1.2", + "lodash": "4.17.21" + } + }, + "grunt-legacy-util": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", + "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", + "dev": true, + "requires": { + "async": "3.2.4", + "exit": "0.1.2", + "getobject": "1.0.2", + "hooker": "0.2.3", + "lodash": "4.17.21", + "underscore.string": "3.3.6", + "which": "2.0.2" + }, + "dependencies": { + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "grunt-middleware-proxy": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/grunt-middleware-proxy/-/grunt-middleware-proxy-1.0.7.tgz", + "integrity": "sha512-QlbSPd/LNhMkDiWAmvv8SAKFEttK9sV5SMwCxxTD/hUk3TnRqP+Tn1JkjgHXqUmFITVxrzgb9Se+uoHxVoxlbw==", + "dev": true + }, + "grunt-mkdir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.1.0.tgz", + "integrity": "sha512-FRE17OYVveNbVJFX8GPGa5bzH2ZiAdBx3q0Kwk2Dg6l+TzLGaTdufUxiUWUbS2MERFacnmXZwDDOR5ZbYW0o+Q==", + "dev": true + }, + "grunt-ngdocs": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/grunt-ngdocs/-/grunt-ngdocs-0.2.11.tgz", + "integrity": "sha512-JUORqj8/Ad6ne8fZlV7CgWF3OxiEtl0VXw9kzeUzXo3ym74M0j/zH6BsFBMMDYOq7DXtD1rZbPnl4s4b/X54iQ==", + "dev": true, + "requires": { + "lodash": "4.17.21", + "marked": "0.3.19", + "shelljs": "0.3.0", + "upath": "0.2.0" + } + }, + "grunt-protractor-runner": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/grunt-protractor-runner/-/grunt-protractor-runner-5.0.0.tgz", + "integrity": "sha512-VW28paNRjOEurLhfGwLYHNkma0hIxgeqP5Fk35whCcAmRHHPSDrC3YYnEfrwawwY1+qpHFiKk5zr92xRW/8X4A==", + "dev": true, + "requires": { + "protractor": "5.2.2", + "split": "1.0.1", + "through2": "2.0.5" + } + }, + "grunt-sass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-sass/-/grunt-sass-2.1.0.tgz", + "integrity": "sha512-XkexnQt/9rhReNd+Y7T0n/2g5FqYOQKfi2iSlpwDqvgs7EgEaGTxNhnWzHnbW5oNRvzL9AHopBG3AgRxL0d+DA==", + "dev": true, + "requires": { + "each-async": "1.1.1", + "node-sass": "4.14.1", + "object-assign": "4.1.1" + } + }, + "grunt-terser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-terser/-/grunt-terser-2.0.0.tgz", + "integrity": "sha512-9Rw1TiPsqadCJnEaKz+mZiS4k9ydnkNfrfvEq9SS6MqMXUxBC+sndDCHV05s5/PXQsFjFBhoRVFij5FaV36tYA==", + "dev": true, + "requires": { + "grunt": "1.6.1" + } + }, + "grunt-usemin": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/grunt-usemin/-/grunt-usemin-3.1.1.tgz", + "integrity": "sha512-73g3KOfB2gAxPk5qV1dgfcw/H6cg2S2YPHzt5ssPCiaNXOrN15HzGzP31il+tQymyP/MYYhRAOR+o7F5UGny/A==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "debug": "2.6.9", + "lodash": "3.10.1", + "path-exists": "1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "path-exists": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz", + "integrity": "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "grunt-wiredep": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/grunt-wiredep/-/grunt-wiredep-3.0.1.tgz", + "integrity": "sha512-iI7TjUYyN1s7NY7JDbmF+y8Fa9dYje1xP2kzQYVqL1d24N4+jod6xntM+GQfBOEPF027gahxvhQt1ii3tCaPUw==", + "dev": true, + "requires": { + "wiredep": "4.0.0" + } + }, + "gzip-size": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", + "integrity": "sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==", + "dev": true, + "requires": { + "duplexer": "0.1.2" + } + }, + "handlebars": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-2.0.0.tgz", + "integrity": "sha512-OdfkaA0M8qGD5EJBkMw3TpguSWl6lz94jdyVmYs5e4TpwepZJ35Y5XlchsIwcN7NP/yzNa3MJYd/dRTO7Nf/fg==", + "dev": true, + "requires": { + "optimist": "0.3.7", + "uglify-js": "2.3.6" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true, + "optional": true + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "dev": true, + "requires": { + "wordwrap": "0.0.2" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "integrity": "sha512-T2LWWydxf5+Btpb0S/Gg/yKFmYjnX9jtQ4mdN9YRq73BhN21EhU0Dvw3wYDLqd3TooGUJlCKf3Gfyjjy/RTcWA==", + "dev": true, + "optional": true, + "requires": { + "async": "0.2.10", + "optimist": "0.3.7", + "source-map": "0.1.43" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "6.12.6", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha512-k1Umb4/jrBWZbtL+QKSji8qWeoZ7ZTkXdnDXt1wxwBKAFM0//u96wDj43mBIqCIas8rDQMYyrBEvcS8hdGd4Sg==", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "optional": true, + "requires": { + "has-symbols": "1.0.3" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + } + }, + "hawk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz", + "integrity": "sha512-am8sVA2bCJIw8fuuVcKvmmNnGFUGW8spTkVtj2fXTEZVkfN42bwFZFtDem57eFi+NSxurJB8EQ7Jd3uCHLn8Vw==", + "dev": true, + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.9.1", + "sntp": "0.2.4" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==", + "dev": true + }, + "header-case": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz", + "integrity": "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==", + "dev": true + }, + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-minifier": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.0.3.tgz", + "integrity": "sha512-RLOMzutpO4Mv8ToW2b/CzZQ94IF3Cb6xYGbT+54k8BxQCQuntxdJr99/PkEnLDf92zakibKb5fKHJMSF6t3O/g==", + "dev": true, + "requires": { + "change-case": "3.0.2", + "clean-css": "3.4.28", + "commander": "2.9.0", + "he": "1.1.1", + "ncname": "1.0.0", + "relateurl": "0.2.7", + "uglify-js": "2.7.5" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "uglify-js": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", + "integrity": "sha512-RvbIYn4DIadCg1MV7YP7OrpxnVrtEieZzbK0KSQvwWGAHojqWJxInkQhmtYGRo9PTwwkJkljIgzMyA1VitEc4Q==", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==", + "dev": true, + "requires": { + "domelementtype": "1.3.1", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dev": true, + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.5.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "dev": true + }, + "http-proxy": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.11.3.tgz", + "integrity": "sha512-dVzC6JlPUaRBONwMwVa/x1H5T0Gxn7VEldmfXuA++6+dE1a18VxfZoFIL2qHDVW4Eu+5m9ppPhm9ozeG/EhkmA==", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "0.0.1" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.2", + "sshpk": "1.17.0" + } + }, + "http2": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz", + "integrity": "sha512-puSi8M8WNlFJm9Pk4c/Mbz9Gwparuj3gO9/RRO5zv6piQ0FY+9Qywp0PdWshYgsMJSalixFY7eC6oPu0zRxLAQ==", + "dev": true + }, + "https-proxy-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz", + "integrity": "sha512-OZhm7//JDnQthMVqlPAfkZyPO2fMhfHY6gY+jZcX8rLfFiGtHiIQrfD80WvCDHNMQ77Ak3r5CiPRDD2rNzo2OQ==", + "dev": true, + "requires": { + "agent-base": "2.1.1", + "debug": "2.6.9", + "extend": "3.0.2" + } + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, + "in-publish": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz", + "integrity": "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.7.1.tgz", + "integrity": "sha512-K7nscvi9u+COKmG4Ft33ohXgZfc9H/SeO86j+0NwIJXqw14oBL5AxnG4Ftgs6ZUjb3YwxHogTj/ZTLFYN4T3ow==", + "dev": true, + "requires": { + "chalk": "0.5.1", + "cli-color": "0.3.3", + "figures": "1.7.0", + "lodash": "2.4.2", + "mute-stream": "0.0.4", + "readline2": "0.1.1", + "rx": "2.5.3", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true + } + } + }, + "insight": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/insight/-/insight-0.4.3.tgz", + "integrity": "sha512-19hH6UMVq50cdkhQS3h4k9Y3vhbylAuocoPK7TA1wtB9uCGFCvZ3FdyOqKIkv3YzQD0fNurBLgjBAUsc6Jmefw==", + "dev": true, + "requires": { + "async": "0.9.2", + "chalk": "0.5.1", + "configstore": "0.3.2", + "inquirer": "0.6.0", + "lodash.debounce": "2.4.1", + "object-assign": "1.0.0", + "os-name": "1.0.3", + "request": "2.88.2", + "tough-cookie": "0.12.1" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true + }, + "async": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "inquirer": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.6.0.tgz", + "integrity": "sha512-bJO/y0P+wJaheeHvzQX0D84zPOKGCA1YB0naPAh11dKQU8cq7wEL5gEimW4WqtrD3Jmx5XBCdyR3N3vAaOiO9w==", + "dev": true, + "requires": { + "chalk": "0.5.1", + "cli-color": "0.3.3", + "lodash": "2.4.2", + "mute-stream": "0.0.4", + "readline2": "0.1.1", + "rx": "2.5.3", + "through": "2.3.8" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "object-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz", + "integrity": "sha512-LpUkixU1BUMQ6bwUHbOue4IGGbdRbxi+IEZw7zHniw78erlxrKGHbhfLbHIsI35LGbGqys6QOrjVmLnD2ie+1A==", + "dev": true + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true + }, + "tough-cookie": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz", + "integrity": "sha512-+gd4PklNJsxzu1NoNjhGRfOZZ5llND6VtQZGuaDXdmI0Ii79V5+YCa2sLx8Q6lYhYN2+9frCzUwOLQpuwHvO4Q==", + "dev": true, + "requires": { + "punycode": "2.3.0" + } + } + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", + "dev": true + }, + "intersect": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz", + "integrity": "sha512-Bp/mSG9dsq/eOMk2Q7DyjKxY62TTU2RvNvycjXHhi5TjrA72H+I3c5+1nAOAqtENcrQvCb5NDlsoPWJ4Bh01SA==", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "1.0.0", + "is-windows": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "requires": { + "binary-extensions": "1.13.1" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "requires": { + "has": "1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==", + "dev": true, + "optional": true, + "requires": { + "acorn": "4.0.13", + "object-assign": "4.1.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "dev": true, + "optional": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz", + "integrity": "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-port-reachable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", + "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==" + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==", + "dev": true + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true, + "optional": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "optional": true, + "requires": { + "call-bind": "1.0.2", + "has-tostringtag": "1.0.0" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" + } + }, + "is-root": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz", + "integrity": "sha512-1d50EJ7ipFxb9bIx213o6KPaJmHN8f+nR48UZWxWVzDx+NA3kpscxi02oQX3rGkEaLBi9m3ZayHngQc3+bBX9w==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-upper-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz", + "integrity": "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==", + "dev": true, + "requires": { + "upper-case": "1.1.3" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, + "jasmine": { + "version": "2.99.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", + "integrity": "sha512-kmuDC+6c9tA8BAZGd7wmucWKrM/aCCBSzCJEqRghvw9lKValw+pg88aN/BFIikmZwRTD57QmHamQ2wRpKb3FDQ==", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.7", + "jasmine-core": "2.99.1" + }, + "dependencies": { + "jasmine-core": { + "version": "2.99.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", + "integrity": "sha512-ra97U4qu3OCcIxvN6eg3kyy8bLrID/TgxafSGMMICg3SFx5C/sUfDPpiOh7yoIsHdtjrOVdtT9rieYhqOsh9Ww==", + "dev": true + } + } + }, + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==", + "dev": true + }, + "jasmine-jquery": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz", + "integrity": "sha512-13d18zXTGeiNAjd4sAhoUGQbCEXTMbUyjrnQ9JFQM/atyyFubHejL5RCE5iyW7jOh1cwjoqVefAAsSA4SFtooQ==", + "dev": true + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==", + "dev": true + }, + "jit-grunt": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", + "integrity": "sha512-eT/f4c9wgZ3buXB7X1JY1w6uNtAV0bhrbOGf/mFmBb0CDNLUETJ/VRoydayWOI54tOoam0cz9RooVCn3QY1WoA==", + "dev": true + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", + "dev": true, + "optional": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jshint": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz", + "integrity": "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "4.17.21", + "minimatch": "3.0.8", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + } + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha512-I5YLeauH3rIaE99EE++UeH2M2gSYo8/2TqDac7oZEH6D/DSQ4Woa628Qrfj1X9/OY5Mk5VvIDQaKCDchXaKrmA==", + "dev": true + }, + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11" + } + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, + "jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dev": true, + "optional": true, + "requires": { + "is-promise": "2.2.2", + "promise": "7.3.1" + } + }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "requires": { + "lie": "3.3.0", + "pako": "1.0.11", + "readable-stream": "2.3.8", + "setimmediate": "1.0.5" + } + }, + "junk": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz", + "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==", + "dev": true + }, + "karma": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.1.tgz", + "integrity": "sha512-k5pBjHDhmkdaUccnC7gE3mBzZjcxyxYsYVaqiL2G5AqlfLyBO5nw2VdNK+O16cveEPd/gIOWULH7gkiYYwVNHg==", + "dev": true, + "requires": { + "bluebird": "3.7.2", + "body-parser": "1.20.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.7.0", + "core-js": "2.6.12", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.7", + "graceful-fs": "4.2.11", + "http-proxy": "1.18.1", + "isbinaryfile": "3.0.3", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.6.0", + "minimatch": "3.0.8", + "optimist": "0.6.1", + "qjobs": "1.2.0", + "range-parser": "1.2.1", + "rimraf": "2.7.1", + "safe-buffer": "5.1.2", + "socket.io": "1.7.3", + "source-map": "0.5.7", + "tmp": "0.0.31", + "useragent": "2.3.0" + }, + "dependencies": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "4.0.7", + "follow-redirects": "1.15.2", + "requires-port": "1.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "tmp": { + "version": "0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "integrity": "sha512-lfyEfOppKvWNeId5CArFLwgwef+iCnbEIy0JWYf1httIEXnx4ndL4Dr1adw7hPgeQfSlTbc/gqn6iaKcROpw5Q==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + } + } + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.1" + } + }, + "karma-fixture": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/karma-fixture/-/karma-fixture-0.2.6.tgz", + "integrity": "sha512-7jVtBtUclZ7r6BIn5YK3BQO6Xkgyo/v3K51BwXde9Fn884lHV0Gy+UhCzJxsioMh1jCRr0NO+Mkm6EsxdVxRKA==", + "dev": true + }, + "karma-html2js-preprocessor": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz", + "integrity": "sha512-SiaPXNxIQjzBnxbi0mOT24zCzjFWBGaxWM/DqnEhp4WbI5kNpiZ35Jb/h7etrob+wiDSuDkltCuxE/fMSayqeQ==", + "dev": true + }, + "karma-jasmine": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz", + "integrity": "sha512-SENGE9DhlIIFTSZWiNq4eGeXL8G6z9cqHIOdkx9jh1qhhQqwEy3tAoLRyER0vOcHqdOlKmGpOuXk+HOipIy7sg==", + "dev": true + }, + "karma-jasmine-jquery": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/karma-jasmine-jquery/-/karma-jasmine-jquery-0.1.1.tgz", + "integrity": "sha512-0cokjpPXKmAH5RtoLacqV/lO3O4Mmm9Lfwv3XWMePQHtl8TcX7rQhczDUL7kHtd3R9md49NWiDDGWPkTxDi29A==", + "dev": true, + "requires": { + "bower": "1.8.14", + "bower-installer": "git://github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7" + } + }, + "karma-json-fixtures-preprocessor": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/karma-json-fixtures-preprocessor/-/karma-json-fixtures-preprocessor-0.0.6.tgz", + "integrity": "sha512-weEt31YeOgui3Lmw1KYWgvkcjOb3Mr8xvB3SgjKg0wDlAGqCDhhXkff6UHaK5J0fIZzJMur18PqHMgzulM5bzA==", + "dev": true + }, + "karma-junit-reporter": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz", + "integrity": "sha512-FeuLOKlXNtJhIQK3oQASbO5QOib762CEHV8+L9wwTQpiZJgp7xKg3sNno66rL5bQPV2soG6fJdAFWqqnMJuh2w==", + "dev": true, + "requires": { + "path-is-absolute": "1.0.1", + "xmlbuilder": "8.2.2" + }, + "dependencies": { + "xmlbuilder": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", + "integrity": "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==", + "dev": true + } + } + }, + "karma-nyan-reporter": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/karma-nyan-reporter/-/karma-nyan-reporter-0.2.5.tgz", + "integrity": "sha512-t4/2zTMkGINeB+7gIxo7lsoNT4mvaFEuZ1AJIFwFPOpVjiECbXHVqDw9nzIgBG4Qu7Jccb3+SFERX0aLKGdStw==", + "dev": true, + "requires": { + "cli-color": "0.3.3" + } + }, + "karma-phantomjs-launcher": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", + "integrity": "sha512-tf4P3plsE7wb5Pqh8GJ6RnElxfI/UM4MtVnjbSIZFpdFJlKnjRzfIx8MLCcSYJBwZ1+qSKFz4uBe3XNoq2t3KA==", + "dev": true, + "requires": { + "lodash": "4.17.21", + "phantomjs-prebuilt": "2.1.16" + } + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11" + } + }, + "latest-version": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-0.2.0.tgz", + "integrity": "sha512-tw4eCzlFfcaQcmQBeZTKAh0HTc96ta9kHTud6b2kxoiV1Mpymx2aR4PMFQI0UQDDNUzvuyVfOwq4/Qp1a1/eTw==", + "dev": true, + "requires": { + "package-json": "0.2.0" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "dev": true + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "requires": { + "immediate": "3.0.6" + } + }, + "liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "requires": { + "extend": "3.0.2", + "findup-sync": "4.0.0", + "fined": "1.2.0", + "flagged-respawn": "1.0.1", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.7.1", + "resolve": "1.22.4" + }, + "dependencies": { + "findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "requires": { + "detect-file": "1.0.0", + "is-glob": "4.0.3", + "micromatch": "4.0.5", + "resolve-dir": "1.0.1" + } + } + } + }, + "livereload-js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", + "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "3.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, + "lockfile": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz", + "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==", + "dev": true, + "requires": { + "signal-exit": "3.0.7" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==", + "dev": true + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._baseclone": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz", + "integrity": "sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==", + "dev": true, + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._baseassign": "3.2.0", + "lodash._basefor": "3.0.3", + "lodash.isarray": "3.0.4", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==", + "dev": true + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==", + "dev": true + }, + "lodash._isnative": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz", + "integrity": "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==", + "dev": true + }, + "lodash._objecttypes": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz", + "integrity": "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==", + "dev": true + }, + "lodash.clonedeep": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz", + "integrity": "sha512-I8MpGh5z+6OixDAAb21teLSZDmqVPjlq02Q7ZFrbn2xnQHYYuJf6on/94SWpF/p0s3p/cEv/53ro4AhDOfCR0g==", + "dev": true, + "requires": { + "lodash._baseclone": "3.3.0", + "lodash._bindcallback": "3.0.1" + } + }, + "lodash.debounce": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-2.4.1.tgz", + "integrity": "sha512-lzSGKuZQhTFRd4v809TAn1sdMXasHZ1TY3t/NxuXsdcvUcKfnUdnl5E4+g7PWVBdSl1mIe5jCDZbwF8Gu8MD+A==", + "dev": true, + "requires": { + "lodash.isfunction": "2.4.1", + "lodash.isobject": "2.4.1", + "lodash.now": "2.4.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==", + "dev": true + }, + "lodash.isfunction": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz", + "integrity": "sha512-6XcAB3izeQxPOQQNAJbbdjXbvWEt2Pn9ezPrjr4CwoLwmqsLVbsiEXD19cmmt4mbzOCOCdHzOQiUivUOJLra7w==", + "dev": true + }, + "lodash.isobject": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz", + "integrity": "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==", + "dev": true, + "requires": { + "lodash._objecttypes": "2.4.1" + } + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.now": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lodash.now/-/lodash.now-2.4.1.tgz", + "integrity": "sha512-KrUkev+xdqFbHHPSiVMnztWVJsHHeEda1IJshDG54m1oEvmO6F37kkMR9fmyeK6yLPg/QSXcyO6L56OmZuNQig==", + "dev": true, + "requires": { + "lodash._isnative": "2.4.1" + } + }, + "log4js": { + "version": "0.6.38", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "integrity": "sha512-Cd+klbx7lkiaamEId9/0odHxv/PFHDz2E12kEfd6/CzIOZD084DzysASR/Dot4i1dYPBQKC3r2XIER+dfbLOmw==", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "dev": true, + "requires": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.7" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", + "dev": true + }, + "lower-case-first": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz", + "integrity": "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "lru-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", + "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", + "dev": true, + "requires": { + "es5-ext": "0.10.62" + } + }, + "make-iterator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, + "maxmin": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", + "integrity": "sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "figures": "1.7.0", + "gzip-size": "3.0.0", + "pretty-bytes": "3.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true + }, + "memoizee": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", + "integrity": "sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==", + "dev": true, + "requires": { + "d": "0.1.1", + "es5-ext": "0.10.62", + "es6-weak-map": "0.1.4", + "event-emitter": "0.3.5", + "lru-queue": "0.1.0", + "next-tick": "0.2.2", + "timers-ext": "0.1.7" + }, + "dependencies": { + "next-tick": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz", + "integrity": "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==", + "dev": true + } + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.8", + "normalize-package-data": "2.5.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "3.0.2", + "picomatch": "2.3.1" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "1.2.8" + } + }, + "mkpath": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz", + "integrity": "sha512-bauHShmaxVQiEvlrAPWxSPn8spSL8gDVRl11r8vLT4r/KdnknLqtqwQbToZ2Oa8sJkExYY1z6/d+X7pNiqo4yg==", + "dev": true + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dev": true, + "requires": { + "basic-auth": "2.0.1", + "debug": "2.6.9", + "depd": "2.0.0", + "on-finished": "2.3.0", + "on-headers": "1.0.2" + } + }, + "mout": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mout/-/mout-1.2.4.tgz", + "integrity": "sha512-mZb9uOruMWgn/fw28DG4/yE3Kehfk1zKCLhuDU2O3vlKdnBBr4XaOCqVTflJ5aODavGUPqFHZgrFX3NJVuxGhQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-amvrY4m/7oZamehMoFi1tbwU/kXbVvRTGM2S7F+PZi3n51Jx+9AcSQ3EQsag3tR+hS2higfgOP/Kl8kri/X52A==", + "dev": true + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==", + "dev": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.3", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + } + } + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", + "dev": true + }, + "ng": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/ng/-/ng-0.0.0.tgz", + "integrity": "sha512-HwR40IBJa1ZU+CIGyuy7vSCN3xFYlSRfw5eIwwKOdOMNNNIl8KhT6PXKmHuFEFYpfrbOMaCYtr4QOJ3gkkubcg==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-fs": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz", + "integrity": "sha512-XqDBlmUKgDGe76+lZ/0sRBF3XW2vVcK07+ZPvdpUTK8jrvtPahUd0aBqJ9+ZjB01ANjZLuvK3O/eoMVmz62rpA==", + "dev": true + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "1.0.12", + "glob": "7.1.7", + "graceful-fs": "4.2.11", + "mkdirp": "0.5.6", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.5", + "request": "2.88.2", + "rimraf": "2.7.1", + "semver": "5.3.0", + "tar": "2.2.2", + "which": "1.3.1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==", + "dev": true + } + } + }, + "node-sass": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz", + "integrity": "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==", + "dev": true, + "requires": { + "async-foreach": "0.1.3", + "chalk": "1.1.3", + "cross-spawn": "3.0.1", + "gaze": "1.1.3", + "get-stdin": "4.0.1", + "glob": "7.1.7", + "in-publish": "2.0.1", + "lodash": "4.17.21", + "meow": "3.7.0", + "mkdirp": "0.5.6", + "nan": "2.17.0", + "node-gyp": "3.8.0", + "npmlog": "4.1.2", + "request": "2.88.2", + "sass-graph": "2.2.5", + "stdout-stream": "1.4.1", + "true-case-path": "1.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "2.8.9", + "resolve": "1.22.4", + "semver": "5.7.2", + "validate-npm-package-license": "3.0.4" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + }, + "npmconf": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz", + "integrity": "sha512-iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==", + "dev": true, + "requires": { + "config-chain": "1.1.13", + "inherits": "2.0.4", + "ini": "1.3.8", + "mkdirp": "0.5.6", + "nopt": "3.0.6", + "once": "1.3.3", + "osenv": "0.1.5", + "safe-buffer": "5.1.2", + "semver": "4.3.6", + "uid-number": "0.0.5" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==", + "dev": true + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.7", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha512-S0sN3agnVh2SZNEIGc0N1X4Z5K0JeFbGBrnuZpsxuUh5XLF0BnvWkMjRXo/zGKLd/eghvNIKcx1pQkmUjXIyrA==", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", + "dev": true, + "requires": { + "for-own": "1.0.0", + "make-iterator": "1.0.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==", + "dev": true + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha512-iPBWbPP4OEOzR1xfhpGLDh+ypKBOygunZhM9jBtA7FS5sKjEiMZw0EFb82hnDOmTZX90ZWLoZKUza4cVt8MexA==", + "dev": true, + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "dev": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", + "dev": true + }, + "os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", + "dev": true, + "requires": { + "osx-release": "1.1.0", + "win-release": "1.1.1" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", + "dev": true, + "requires": { + "minimist": "1.2.8" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "2.2.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "2.3.0" + } + }, + "p-throttler": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/p-throttler/-/p-throttler-0.1.0.tgz", + "integrity": "sha512-qjBriqtlwhS2o/Yq4rU7ZQ4+Yy9Vy9d7qss15rof2viXAwwXcxjPq8jLXVJosXygOs3WZtKnLEzRw0FyX/l9PQ==", + "dev": true, + "requires": { + "q": "0.9.7" + }, + "dependencies": { + "q": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "integrity": "sha512-ijt0LhxWClXBtc1RCt8H0WhlZLAdVX26nWbpsJy+Hblmp81d2F/pFsvlrJhJDDruFHM+ECtxP0H0HzGSrARkwg==", + "dev": true + } + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "package-json": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-0.2.0.tgz", + "integrity": "sha512-JbTs9F2CwqCEEhNZXsvgQtQpNmzgKlCk4adhYxGObzcc70rU0nzy2FPqgTdP2To5wZKbCv0IJp+zTMYLEn9eMA==", + "dev": true, + "requires": { + "got": "0.3.0", + "registry-url": "0.1.1" + } + }, + "pad-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pad-stream/-/pad-stream-1.2.0.tgz", + "integrity": "sha512-2SSTZIZSdYL+kV4LMKocpynfDGRsW7a9WmdmGYZm6kHhNduSortn3DGCSAEZ3J3XkWu9ZrKWXAdSrUqFmY9WgQ==", + "dev": true, + "requires": { + "meow": "3.7.0", + "pumpify": "1.5.1", + "repeating": "2.0.1", + "split2": "1.1.1", + "through2": "2.0.5" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + } + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "parse-ms": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", + "integrity": "sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "dev": true + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha512-v38ZjVbinlZ2r1Rz06WUZEnGoSRcEGX+roMsiWjHeAe23s2qlQUyfmsPQZvh7d8l0E8AZzTIO/RkUr00LfkSiA==", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha512-B3Nrjw2aL7aI4TDujOzfA4NsEc4u1lVcIRE0xesutH8kjeWF70uk+W5cBlIQx04zUH9NTBvuN36Y9xLRPK6Jjw==", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha512-ijhdxJu6l5Ru12jF0JvzXVPvsC+VibqeaExlNoMhWN6VQ79PGjkmc7oA4W1lp00sFkNyj0fx6ivPLdV51/UMog==", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz", + "integrity": "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "upper-case-first": "1.1.2" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true + }, + "path-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz", + "integrity": "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", + "dev": true + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==", + "dev": true, + "requires": { + "es6-promise": "4.2.8", + "extract-zip": "1.7.0", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.88.2", + "request-progress": "2.0.1", + "which": "1.3.1" + }, + "dependencies": { + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + } + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11" + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==", + "dev": true, + "requires": { + "throttleit": "1.0.0" + } + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + } + } + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "plur": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", + "integrity": "sha512-qSnKBSZeDY8ApxwhfVIwKwF36KVJqb1/9nzYYq3j3vdwocULCXT8f8fQGkiw1Nk9BGfxiDagEe/pwakA+bOBqw==", + "dev": true + }, + "portscanner": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz", + "integrity": "sha512-3MCx40XO6ChNJJHw1tTFukQK/M/8FacGZK/vGbnrKpozObrJzembYtfi7ZdA2hkF2Lojg77XhsKUPvF8eHKcDA==", + "dev": true, + "requires": { + "async": "1.5.2" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==", + "dev": true + }, + "pretty-bytes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", + "integrity": "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "pretty-ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", + "integrity": "sha512-H2enpsxzDhuzRl3zeSQpQMirn8dB0Z/gxW96j06tMfTviUWvX14gjKb7qd1gtkUyYhDPuoNe00K5PqNvy2oQNg==", + "dev": true, + "requires": { + "is-finite": "1.1.0", + "parse-ms": "1.0.1", + "plur": "1.0.0" + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "2.0.6" + } + }, + "promptly": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz", + "integrity": "sha512-HG+4CGfxDIcto6WSwa8CNSMxgRYrjOgGbh0JSr3F4yy5aK95qJANaTnRq+U1g/J2h6IIgLD+qRPzDR4AnUh/1g==", + "dev": true, + "requires": { + "read": "1.0.7" + } + }, + "propprop": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/propprop/-/propprop-0.3.1.tgz", + "integrity": "sha512-EbFINeqVaaw4MKPC9978G5aZhP0Jv49kAQHGlIBd6SKEPBBuf+l4W/zCiL6SCVuxxrOkSdZSB70YXW1xKCSD4Q==", + "dev": true + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "protractor": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.2.2.tgz", + "integrity": "sha512-KxYw0ySvmWFQHpbSRvrHA5HLlyeAkCENSUZvJroKV1u0gWXX9kvHjc9wEK5IoW7h9UfPV1F3R2i+Own0go5s0g==", + "dev": true, + "requires": { + "@types/node": "6.14.13", + "@types/q": "0.0.32", + "@types/selenium-webdriver": "2.53.50", + "blocking-proxy": "1.0.1", + "chalk": "1.1.3", + "glob": "7.1.7", + "jasmine": "2.99.0", + "jasminewd2": "2.2.0", + "optimist": "0.6.1", + "q": "1.4.1", + "saucelabs": "1.3.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "0.4.18", + "webdriver-js-extender": "1.0.0", + "webdriver-manager": "12.1.9" + }, + "dependencies": { + "adm-zip": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", + "integrity": "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "webdriver-manager": { + "version": "12.1.9", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz", + "integrity": "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==", + "dev": true, + "requires": { + "adm-zip": "0.5.10", + "chalk": "1.1.3", + "del": "2.2.2", + "glob": "7.1.7", + "ini": "1.3.8", + "minimist": "1.2.8", + "q": "1.4.1", + "request": "2.88.2", + "rimraf": "2.7.1", + "semver": "5.7.2", + "xml2js": "0.4.23" + } + } + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", + "dev": true + }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "pug": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz", + "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "dev": true, + "optional": true, + "requires": { + "pug-code-gen": "2.0.3", + "pug-filters": "3.1.1", + "pug-lexer": "4.1.0", + "pug-linker": "3.0.6", + "pug-load": "2.0.12", + "pug-parser": "5.0.1", + "pug-runtime": "2.0.5", + "pug-strip-comments": "1.0.4" + } + }, + "pug-attrs": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz", + "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "dev": true, + "optional": true, + "requires": { + "constantinople": "3.1.2", + "js-stringify": "1.0.2", + "pug-runtime": "2.0.5" + } + }, + "pug-code-gen": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz", + "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "dev": true, + "optional": true, + "requires": { + "constantinople": "3.1.2", + "doctypes": "1.1.0", + "js-stringify": "1.0.2", + "pug-attrs": "2.0.4", + "pug-error": "1.3.3", + "pug-runtime": "2.0.5", + "void-elements": "2.0.1", + "with": "5.1.1" + } + }, + "pug-error": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz", + "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==", + "dev": true, + "optional": true + }, + "pug-filters": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz", + "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "dev": true, + "optional": true, + "requires": { + "clean-css": "4.2.4", + "constantinople": "3.1.2", + "jstransformer": "1.0.0", + "pug-error": "1.3.3", + "pug-walk": "1.1.8", + "resolve": "1.22.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "dev": true, + "optional": true + }, + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "optional": true + } + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "pug-lexer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz", + "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "dev": true, + "optional": true, + "requires": { + "character-parser": "2.2.0", + "is-expression": "3.0.0", + "pug-error": "1.3.3" + } + }, + "pug-linker": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz", + "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "dev": true, + "optional": true, + "requires": { + "pug-error": "1.3.3", + "pug-walk": "1.1.8" + } + }, + "pug-load": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz", + "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "dev": true, + "optional": true, + "requires": { + "object-assign": "4.1.1", + "pug-walk": "1.1.8" + } + }, + "pug-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz", + "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "dev": true, + "optional": true, + "requires": { + "pug-error": "1.3.3", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz", + "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==", + "dev": true, + "optional": true + }, + "pug-strip-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", + "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "dev": true, + "optional": true, + "requires": { + "pug-error": "1.3.3" + } + }, + "pug-walk": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz", + "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==", + "dev": true, + "optional": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.4", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.7.1", + "inherits": "2.0.4", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==", + "dev": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "1.0.4" + } + }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "4.0.0", + "kind-of": "6.0.3", + "math-random": "1.0.4" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", + "integrity": "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==", + "dev": true, + "requires": { + "bytes": "1.0.0", + "string_decoder": "0.10.31" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + } + } + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "dev": true, + "requires": { + "mute-stream": "0.0.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.5.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "requires": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "4.2.11", + "micromatch": "3.1.10", + "readable-stream": "2.3.8" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.4", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.3", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + } + } + }, + "readline2": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz", + "integrity": "sha512-qs8GGG+hLGMaDOGjd+mDglDoYcHDkjIY7z5RU0/ApsGT0qypyrWskNeemUqD+UxIXiZoMYT5aLwGp4ehoyZhIg==", + "dev": true, + "requires": { + "mute-stream": "0.0.4", + "strip-ansi": "2.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", + "integrity": "sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw==", + "dev": true + }, + "strip-ansi": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", + "integrity": "sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ==", + "dev": true, + "requires": { + "ansi-regex": "1.1.1" + } + } + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "1.22.4" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "redeyed": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz", + "integrity": "sha512-pnk1vsaNLu1UAAClKsImKz9HjBvg9i8cbRqTRzJbiCjGF0fZSMqpdcA5W3juO3c4etFvTrabECkq9wjC45ZyxA==", + "dev": true, + "requires": { + "esprima": "1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true + } + } + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "requires": { + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" + } + }, + "registry-url": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-0.1.1.tgz", + "integrity": "sha512-b6QxEheOmmIsC5eTFuBZsUucrjn2fqpJoZ84ihwGwh5iw07hiSjeTmrYRKzVHlom2jHlSX3/lNCvQJaDQZlVJg==", + "dev": true, + "requires": { + "npmconf": "2.1.3" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", + "dev": true + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==", + "dev": true, + "requires": { + "is-finite": "1.1.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.12.0", + "caseless": "0.12.0", + "combined-stream": "1.0.8", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.3", + "har-validator": "5.1.5", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.35", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.3", + "safe-buffer": "5.1.2", + "tough-cookie": "2.5.0", + "tunnel-agent": "0.6.0", + "uuid": "3.4.0" + }, + "dependencies": { + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + } + } + }, + "request-progress": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-0.3.0.tgz", + "integrity": "sha512-q5GKsnZyTFRi6FuO5GqAjqM6BYYaJ+3kVOpcC8F8qW3kLW/1WFUNENd7GOtyWD8m/7Lsx/MWjLS6pO4DaH7zTg==", + "dev": true, + "requires": { + "throttleit": "0.0.2" + } + }, + "request-replay": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz", + "integrity": "sha512-7S/WaWWPkEIDLWcSwQoZcZAWrX6A5dpE/6tFGEhap0UCm77E4jjcBUmVlbKKLnEzv+wlsBvSjg11RcceYp+6Ww==", + "dev": true, + "requires": { + "retry": "0.6.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "requires-port": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-0.0.1.tgz", + "integrity": "sha512-AzPDCliPoWDSvEVYRQmpzuPhGGEnPrQz9YiOEvn+UdB9ixBpw+4IOZWtwctmpzySLZTy7ynpn47V14H4yaowtA==", + "dev": true + }, + "resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "requires": { + "is-core-module": "2.13.0", + "path-parse": "1.0.7", + "supports-preserve-symlinks-flag": "1.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz", + "integrity": "sha512-RgncoxLF1GqwAzTZs/K2YpZkWrdIYbXsmesdomi+iPilSzjUyr/wzNIuteoTVaWokzdwZIJ9NHRNQa/RUiOB2g==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "7.1.7" + } + }, + "rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + }, + "rx": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz", + "integrity": "sha512-u5qvfulb7NXoY/+OE28920WEgFi6aiDjf5iF9rA2f9tBXejLgTLd0WxkclvIQWjFFHfNJlb7pSTsrjgiDh+Uug==", + "dev": true + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-json-parse": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", + "integrity": "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "dev": true, + "requires": { + "glob": "7.1.7", + "lodash": "4.17.21", + "scss-tokenizer": "0.2.3", + "yargs": "13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "3.1.0", + "strip-ansi": "5.2.0", + "wrap-ansi": "5.1.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "7.0.3", + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "4.1.1" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "5.0.0", + "find-up": "3.0.0", + "get-caller-file": "2.0.5", + "require-directory": "2.1.1", + "require-main-filename": "2.0.0", + "set-blocking": "2.0.0", + "string-width": "3.1.0", + "which-module": "2.0.1", + "y18n": "4.0.3", + "yargs-parser": "13.1.2" + } + } + } + }, + "saucelabs": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz", + "integrity": "sha512-y1fLynzP8S8BJPgBTzMSvZmZX073FpmyCsJif9w4pT8Je3LutU1/DNX8yVH0ju3sVCo/UD8tRxl+HpgWpi9PSg==", + "dev": true, + "requires": { + "https-proxy-agent": "1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==", + "dev": true, + "requires": { + "js-base64": "2.6.4", + "source-map": "0.4.4" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "dev": true, + "requires": { + "jszip": "3.10.1", + "rimraf": "2.7.1", + "tmp": "0.0.30", + "xml2js": "0.4.23" + } + }, + "semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true + }, + "semver-diff": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-0.1.0.tgz", + "integrity": "sha512-YZ8p8EFvhPEFhCf9iHGhC8N4xA9kMR8ZufYUMdmaqRsVo50rxLQzhHhI9BAecpPWCXwlOWs4IstHtYlG5S/NGQ==", + "dev": true, + "requires": { + "semver": "2.3.2" + }, + "dependencies": { + "semver": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", + "integrity": "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==", + "dev": true + } + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "sentence-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz", + "integrity": "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case-first": "1.1.2" + } + }, + "serve": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz", + "integrity": "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==", + "requires": { + "@zeit/schemas": "2.29.0", + "ajv": "8.11.0", + "arg": "5.0.2", + "boxen": "7.0.0", + "chalk": "5.0.1", + "chalk-template": "0.4.0", + "clipboardy": "3.0.0", + "compression": "1.7.4", + "is-port-reachable": "4.0.0", + "serve-handler": "6.1.5", + "update-check": "1.5.4" + }, + "dependencies": { + "ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "chalk": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", + "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, + "serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dev": true, + "requires": { + "accepts": "1.3.8", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.35", + "parseurl": "1.3.3" + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.3.tgz", + "integrity": "sha512-0Y4SH6mnoNZNW29pNEC0E1F//X7AmbpOj/j5oTssXFUvg2J9MbKIVH3S5ca8Je1Hr36utXJqlzCbYxEYsPAR4A==", + "dev": true, + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.1", + "array-reduce": "0.0.0", + "jsonify": "0.0.1" + } + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "1.0.2", + "get-intrinsic": "1.2.1", + "object-inspect": "1.12.3" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "snake-case": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz", + "integrity": "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.3", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.3" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.3" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==", + "dev": true, + "requires": { + "hoek": "0.9.1" + } + }, + "socket.io": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "integrity": "sha512-CmZLQTyj5nKKVBoguhisLP5Yl6oEfEWbQQQQ0MdXAazCZdRpGR4FG6rd13ryovTa75S36PgXsAGtzwllCWrgbQ==", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha512-zmYvlFJay9skt4yk1MffE9p93HKvQtyy0BLZ5dRM73bOXFJXNZWq8qZVdY456sLaxdK6fHGiZ7glxzqvzwGzkw==", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "integrity": "sha512-ZEPOqFboJuuVau/3sMF4PgzJM/X+TDhssgufCnGtPtSL2Nmt4dL3i9JheCT1B45hiYM5cgO+wTO8EYmxbpwHSw==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha512-dCHp4G+F11zb+RtEu7BE2U8R32AYmM/4bljQfut8LipH3PdwsVBVGh083MXvtKkB7HSQUzSwiXz53c4mzJvYfw==", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha512-5NnE67nQSQDJHVahPJna1PQ/zCXMnQop3yUCxjKPNzCxuyPSKWTQ/5Gu5CZmjetwGLWRA+PzeF5thlbOdbQldA==", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha512-j6l4g/+yWQjmy1yByzg1DPFL4vxQw+NwCJatIxni/AE1wfm17FBtIKSWU4Ay+onrJwDxmC4eK4QS/04ZsqYwZQ==", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha512-YhIbp3PJiznERfjlIkK0ue4obZxt2S60+0W8z24ZymOHT8sHloOqWOqZRU2eN5OlY8U08VFsP02letcu26FilA==", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha512-X0rGvJcskG1c3TgSCPqHJ0XJgwlcvOC7elJ5Y0hYuKBZoVqWpAMfLOeIh2UI/DCQ5ruodIjvsugZtjUYUw2pUw==", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha512-lRLiIR9fSNpnP6TC4v8+4OU7oStC01esuNowdQ34L+Gk8e5Puoc88IqJ+XAY/B3Mn2ZKis8l8HX90oU8ivzUHg==", + "dev": true + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.2", + "resolve-url": "0.2.1", + "source-map-url": "0.4.1", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "dev": true + }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.1", + "spdx-license-ids": "3.0.13" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "2.3.0", + "spdx-license-ids": "3.0.13" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "split2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/split2/-/split2-1.1.1.tgz", + "integrity": "sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==", + "dev": true, + "requires": { + "through2": "2.0.5" + } + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "asn1": "0.2.6", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.2", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.2", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "2.3.8" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "string-length": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-0.1.2.tgz", + "integrity": "sha512-Z7ZCUHl1mkGe1v4rybhTTVm0LSWeeX1hJ4pVsX0jcYNCwMJsLByDfVV3PUJ5kyC/ZigzPbUP+nEBNCbZza5VyA==", + "dev": true, + "requires": { + "strip-ansi": "0.2.2" + }, + "dependencies": { + "ansi-regex": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.1.0.tgz", + "integrity": "sha512-sKASJ0JEeHkkUN5A7GBQ1JH5EmBGi8dhl9KChCXV40kGmykzW4uLkVB8XbjV7598iK+I/HQOlqJGLCFA+1ZmzQ==", + "dev": true + }, + "strip-ansi": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.2.2.tgz", + "integrity": "sha512-1uWiYlJgR31DGid87j930IpH4YUsxX3hOLvdGmnUAm++BWpEkWXMWYcQCUDXUNdEsRA9GZevI4q8UszDfozHxw==", + "dev": true, + "requires": { + "ansi-regex": "0.1.0" + } + } + } + }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "stringify-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-1.0.1.tgz", + "integrity": "sha512-RDGXBy5t6y1birIZGEgKW1mE+cG9XqXQT23wKLIcMzvm8zZZrCWWUxLZndhuV2zJ1ZCDjm/QnWED8/6rfIzg4g==", + "dev": true + }, + "stringstream": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz", + "integrity": "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "4.0.0" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "swap-case": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz", + "integrity": "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4", + "upper-case": "1.1.3" + } + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.12", + "inherits": "2.0.4" + } + }, + "tar-fs": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz", + "integrity": "sha512-MqmfOi0c4YcprB8WfyE2nKZPE//2253LQueyliGfZ6Hy9L6N4QM9zJNXXSSmp+PfdljyAkHB30Vapm0aFa6G2g==", + "dev": true, + "requires": { + "mkdirp": "0.5.6", + "pump": "0.3.5", + "tar-stream": "0.4.7" + }, + "dependencies": { + "end-of-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "integrity": "sha512-oniaMOoG/dtbvWRLAlkFeJeJPM4IeE6BPFCHv0GTIIONB7A7kz1/liYWQiU7bqAhUlrKy1Z1MBsKa+qBgoVabw==", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "once": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.2.0.tgz", + "integrity": "sha512-WBd9yDi3JRrEsysh0s4px+jinLuW/DGRydS+ZGPTHVKu4JrIBmKj3uDC9LfnwEbXHFVLieUuZvunY74wln6arg==", + "dev": true + }, + "pump": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/pump/-/pump-0.3.5.tgz", + "integrity": "sha512-U0S7cdRuBLfk1ylK32jc8No8ex3Xj2ok3XOPAYfXXXfVd3zMA2BT5Vl7XxfqXoIioNSxczI0/OGENv68XN7Oyg==", + "dev": true, + "requires": { + "end-of-stream": "1.0.0", + "once": "1.2.0" + } + } + } + }, + "tar-stream": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz", + "integrity": "sha512-8/A2iGloynV8Q0cb43ez+aK1PEYWueUr4yPrenbwOJR3Y63VjaIPIravWB6VcYAz4jQfzr4TLX8i3/tDhkzPRw==", + "dev": true, + "requires": { + "bl": "0.9.5", + "end-of-stream": "1.4.4", + "readable-stream": "1.1.14", + "xtend": "4.0.2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.3", + "inherits": "2.0.4", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true + } + } + }, + "terser": { + "version": "5.19.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz", + "integrity": "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "0.3.5", + "acorn": "8.10.0", + "commander": "2.20.3", + "source-map-support": "0.5.21" + }, + "dependencies": { + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "1.1.2", + "source-map": "0.6.1" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "throttleit": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", + "integrity": "sha512-HtlTFeyYs1elDM2txiIGsdXHaq8kffVaZH/QEBRbo95zQqzlsBx5ELKhkPOZVad9OK9oxzwx6UrQN8Vfh/+yag==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.8", + "xtend": "4.0.2" + } + }, + "time-grunt": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz", + "integrity": "sha512-u8n+ZOcdNDkrqlyN+x1ayHN0X+hMgg3SS191EE5xO03nRVnVpNp3UJSmUBCQCAbe959LqWttMaELNclfmWM+fQ==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "date-time": "1.1.0", + "figures": "1.7.0", + "hooker": "0.2.3", + "number-is-nan": "1.0.1", + "pretty-ms": "2.1.0", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "time-zone": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz", + "integrity": "sha512-S5CjtVIkeBTnlsaZP3gjsTb78ClBe74sEcgEoBwAVUKnTRDAGqUtLLIZHMsIyqOWjt9DGQpLMMoD8ZKIfP2ddQ==", + "dev": true + }, + "timers-ext": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", + "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", + "dev": true, + "requires": { + "es5-ext": "0.10.62", + "next-tick": "1.1.0" + } + }, + "tiny-lr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", + "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", + "dev": true, + "requires": { + "body": "5.1.0", + "debug": "3.2.7", + "faye-websocket": "0.10.0", + "livereload-js": "2.4.0", + "object-assign": "4.1.1", + "qs": "6.11.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "dev": true, + "optional": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==", + "dev": true, + "optional": true + }, + "touch": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz", + "integrity": "sha512-JUyt3LWZRqkmKH0paN3IqVqhLV11FuXMz0c+/OZED9Abs+sFxSdtgBLknwqZmicSBtue+RGX4jXvbCIjipDMCA==", + "dev": true, + "requires": { + "nopt": "1.0.10" + }, + "dependencies": { + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + } + } + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "1.9.0", + "punycode": "2.3.0" + } + }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "dev": true, + "requires": { + "glob": "7.1.7" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", + "dev": true + }, + "type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.35" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "dev": true + }, + "uid-number": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz", + "integrity": "sha512-ZiLtQrdrFvWVXW5wickjtHiyOkn+cG74B0r33DQ2vJuz12FsFO7dU2q0dumrrYk6ny4wl2Vjsodpxk0+Z10/rA==", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==", + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", + "dev": true + }, + "underscore.string": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", + "dev": true, + "requires": { + "sprintf-js": "1.1.2", + "util-deprecate": "1.0.2" + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true + } + } + }, + "untildify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz", + "integrity": "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "upath": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-0.2.0.tgz", + "integrity": "sha512-Cy5aaZvwbMdU9Hik7SLGQZsZJY/6AJOQ2ORc4XCWa1TCIvhRk46qDEB+HW8JVDnYBrtVvUX4AKWBH/LuyminAw==", + "dev": true, + "requires": { + "lodash": "3.10.1", + "underscore.string": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true + } + } + }, + "update-check": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", + "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", + "requires": { + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0" + }, + "dependencies": { + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", + "requires": { + "rc": "^1.0.1" + } + } + } + }, + "update-notifier": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.0.tgz", + "integrity": "sha512-F1Z9wSB3q0a0MAHcfM68LpVjszoc1wVRV7mE0l/vWzoSZv0AcVCfZiLsV5olMXy6jThwu/ZOQyXFIYmq+78Arg==", + "dev": true, + "requires": { + "chalk": "0.5.1", + "configstore": "0.3.2", + "latest-version": "0.2.0", + "semver-diff": "0.1.0", + "string-length": "0.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", + "dev": true + }, + "upper-case-first": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz", + "integrity": "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==", + "dev": true, + "requires": { + "upper-case": "1.1.3" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "2.3.0" + } + }, + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==", + "dev": true + }, + "useragent": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", + "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", + "dev": true, + "requires": { + "lru-cache": "4.1.5", + "tmp": "0.0.30" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.3" + } + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "3.2.0", + "spdx-expression-parse": "3.0.1" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true + }, + "webdriver-js-extender": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz", + "integrity": "sha512-fG8GxPsSj9JDPGcHP0A1XTrUT1uRFbD8U7W9qA169fYJ2Hanvn/n8w4QWXvun1cNU7dZuvRjcLbuPoVqLWsylw==", + "dev": true, + "requires": { + "@types/selenium-webdriver": "2.53.50", + "selenium-webdriver": "2.53.3" + }, + "dependencies": { + "sax": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz", + "integrity": "sha512-8ip+qnRh7m8OEyvoM1JoSBzlrepp3ajVR8nqgrfTig+TewfyvTijl0am8/anFqgbcdz62ofEUKE1hHNDCdbeSQ==", + "dev": true + }, + "selenium-webdriver": { + "version": "2.53.3", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz", + "integrity": "sha512-frrFcVqQEIwn88dTQdlrK1BOB23Hj8wKyEAlyvxGqNItyQqbNfLIBtvXvhvO5l0ePhsak3rtrzRNeTLW3esp1Q==", + "dev": true, + "requires": { + "adm-zip": "0.4.4", + "rimraf": "2.7.1", + "tmp": "0.0.24", + "ws": "1.1.5", + "xml2js": "0.4.4" + } + }, + "tmp": { + "version": "0.0.24", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz", + "integrity": "sha512-z6TbUngjp7wMWIKNeUTuA24oRTW+HGCN7LlBgUPfNzCv5J/JsLsuF/qBh6tCUS2+ALGQ/4U5W4L4yUk7qIFWrg==", + "dev": true + }, + "xml2js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz", + "integrity": "sha512-9ERdxLOo4EazMDHAS/vsuZiTXIMur6ydcRfzGrFVJ4qM78zD3ohUgPJC7NYpGwd5rnS0ufSydMJClh6jyH+V0w==", + "dev": true, + "requires": { + "sax": "0.6.1", + "xmlbuilder": "11.0.1" + } + } + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": "0.5.8", + "safe-buffer": "5.1.2", + "websocket-extensions": "0.1.4" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "requires": { + "string-width": "^5.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", + "dev": true, + "requires": { + "semver": "5.7.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "dev": true + }, + "wiredep": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/wiredep/-/wiredep-4.0.0.tgz", + "integrity": "sha512-w4QDvO5bgcpOBHFBCEH4oKKcMBTeG2pMEzkLSAhjKZ0X6+yb1dAS3vUEtjjz6Rg1M3ox3PG6BSCFZJEQh+TF8w==", + "dev": true, + "requires": { + "bower-config": "1.4.3", + "glob": "7.1.7", + "lodash": "4.17.21", + "propprop": "0.3.1", + "through2": "2.0.5", + "wiredep-cli": "0.1.0" + } + }, + "wiredep-cli": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/wiredep-cli/-/wiredep-cli-0.1.0.tgz", + "integrity": "sha512-Gayaqg8UXk5qPH0MuVP35m7h9GvvCE8XJd1AeXOFgjHxxowhjyfeKSd4BNBsbPAy5kRQ1c5A4tJKcNV8LiE6jw==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "minimist": "1.2.8", + "wiredep": "4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + } + } + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz", + "integrity": "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==", + "dev": true, + "optional": true, + "requires": { + "acorn": "3.3.0", + "acorn-globals": "3.1.0" + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "string-width": "3.1.0", + "strip-ansi": "5.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "7.0.3", + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "5.2.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "4.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha512-qfR6ovmRRMxNHgUNYI9LRdVofApe/eYrv4ggNOvvCP+pPdEo9Ym93QN4jUceGD6PignBbp2zAzgoE7GibAdq2A==", + "dev": true + }, + "xdg-basedir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz", + "integrity": "sha512-ugGW++yvGoxr4IrSoxsieH2b/NlZbXsBaL85Off3z487yS9eiiRjrfdkBw1iBvzv/SK0XjjYy+KBix5PIseOtQ==", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==", + "dev": true + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "dev": true, + "requires": { + "sax": "1.2.4", + "xmlbuilder": "11.0.1" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "dev": true + }, + "xmlhttprequest": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", + "integrity": "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==" + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha512-kauAa/1btT613pYX92WXR6kx5trYeckB5YMd3pPvtkMo2Twdfhwl683M8NiSqWHHo97xAC6bnvK1DWFKxfmejg==", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", + "dev": true + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "5.3.1", + "decamelize": "1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.1.0" + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==", + "dev": true + } + } +} diff --git a/openshift-resources/deploymentconfig-openmbee-ve (4).yaml b/openshift-resources/deploymentconfig-openmbee-ve (4).yaml new file mode 100644 index 000000000..ce0b983e4 --- /dev/null +++ b/openshift-resources/deploymentconfig-openmbee-ve (4).yaml @@ -0,0 +1,195 @@ +kind: DeploymentConfig +apiVersion: apps.openshift.io/v1 +metadata: + name: openmbee-ve + namespace: openmbee + uid: 54344196-94cb-49df-8ed4-d4857b0db33c + resourceVersion: '946560312' + generation: 109 + creationTimestamp: '2023-09-06T19:45:36Z' + annotations: + description: Handles deployment of the openmbee ve. + managedFields: + - manager: Mozilla + operation: Update + apiVersion: apps.openshift.io/v1 + time: '2023-09-26T12:37:22Z' + fieldsType: FieldsV1 + fieldsV1: + 'f:metadata': + 'f:annotations': + .: {} + 'f:description': {} + 'f:spec': + 'f:replicas': {} + 'f:revisionHistoryLimit': {} + 'f:selector': + .: {} + 'f:app': {} + 'f:strategy': + 'f:activeDeadlineSeconds': {} + 'f:recreateParams': + .: {} + 'f:timeoutSeconds': {} + 'f:rollingParams': + .: {} + 'f:intervalSeconds': {} + 'f:maxSurge': {} + 'f:maxUnavailable': {} + 'f:timeoutSeconds': {} + 'f:updatePeriodSeconds': {} + 'f:type': {} + 'f:template': + .: {} + 'f:metadata': + .: {} + 'f:creationTimestamp': {} + 'f:labels': + .: {} + 'f:app': {} + 'f:spec': + .: {} + 'f:containers': + .: {} + 'k:{"name":"openmbee-ve"}': + .: {} + 'f:image': {} + 'f:imagePullPolicy': {} + 'f:name': {} + 'f:ports': + .: {} + 'k:{"containerPort":8080,"protocol":"TCP"}': + .: {} + 'f:containerPort': {} + 'f:protocol': {} + 'f:resources': + .: {} + 'f:limits': + .: {} + 'f:cpu': {} + 'f:memory': {} + 'f:requests': + .: {} + 'f:cpu': {} + 'f:memory': {} + 'f:terminationMessagePath': {} + 'f:terminationMessagePolicy': {} + 'f:dnsPolicy': {} + 'f:imagePullSecrets': + .: {} + 'k:{"name":"nexus-repo-docker-registry"}': {} + 'f:restartPolicy': {} + 'f:schedulerName': {} + 'f:securityContext': {} + 'f:terminationGracePeriodSeconds': {} + 'f:triggers': {} + - manager: openshift-controller-manager + operation: Update + apiVersion: apps.openshift.io/v1 + time: '2023-09-26T12:37:35Z' + fieldsType: FieldsV1 + fieldsV1: + 'f:status': + 'f:updatedReplicas': {} + 'f:readyReplicas': {} + 'f:conditions': + .: {} + 'k:{"type":"Available"}': + .: {} + 'f:lastTransitionTime': {} + 'f:lastUpdateTime': {} + 'f:message': {} + 'f:status': {} + 'f:type': {} + 'k:{"type":"Progressing"}': + .: {} + 'f:lastTransitionTime': {} + 'f:lastUpdateTime': {} + 'f:message': {} + 'f:reason': {} + 'f:status': {} + 'f:type': {} + 'f:details': + .: {} + 'f:causes': {} + 'f:message': {} + 'f:replicas': {} + 'f:availableReplicas': {} + 'f:observedGeneration': {} + 'f:unavailableReplicas': {} + 'f:latestVersion': {} + subresource: status +spec: + strategy: + type: Recreate + recreateParams: + timeoutSeconds: 600 + rollingParams: + updatePeriodSeconds: 1 + intervalSeconds: 1 + timeoutSeconds: 600 + maxUnavailable: 25% + maxSurge: 25% + resources: {} + activeDeadlineSeconds: 1800 + triggers: + - type: ConfigChange + replicas: 1 + revisionHistoryLimit: 10 + test: false + selector: + app: openmbee-ve + template: + metadata: + creationTimestamp: null + labels: + app: openmbee-ve + spec: + containers: + - name: openmbee-ve + image: >- + registry-cli-docker.wseasttest.navair.navy.mil:5000/openmbee/openmbee-ve:VE-VERSION-4.0.2 + ports: + - containerPort: 8080 + protocol: TCP + resources: + limits: + cpu: 500m + memory: 1G + requests: + cpu: 350m + memory: 500M + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + imagePullPolicy: Always + restartPolicy: Always + terminationGracePeriodSeconds: 30 + dnsPolicy: ClusterFirst + securityContext: {} + imagePullSecrets: + - name: nexus-repo-docker-registry + schedulerName: default-scheduler +status: + observedGeneration: 109 + details: + message: config change + causes: + - type: ConfigChange + availableReplicas: 1 + unavailableReplicas: 0 + latestVersion: 106 + updatedReplicas: 1 + conditions: + - type: Available + status: 'True' + lastUpdateTime: '2023-09-26T12:37:35Z' + lastTransitionTime: '2023-09-26T12:37:35Z' + message: Deployment config has minimum availability. + - type: Progressing + status: 'True' + lastUpdateTime: '2023-09-26T12:37:38Z' + lastTransitionTime: '2023-09-26T12:37:27Z' + reason: NewReplicationControllerAvailable + message: replication controller "openmbee-ve-106" successfully rolled out + replicas: 1 + readyReplicas: 1 diff --git a/openshift-resources/route-mbee-ve.yaml b/openshift-resources/route-mbee-ve.yaml new file mode 100644 index 000000000..cc6f8016b --- /dev/null +++ b/openshift-resources/route-mbee-ve.yaml @@ -0,0 +1,58 @@ +kind: Route +apiVersion: route.openshift.io/v1 +metadata: + name: mbee-ve + namespace: openmbee + uid: 22fa24dd-6fec-41ab-91b2-d0579105d0c5 + resourceVersion: '945743259' + creationTimestamp: '2023-09-25T20:47:52Z' + managedFields: + - manager: Mozilla + operation: Update + apiVersion: route.openshift.io/v1 + time: '2023-09-25T20:47:52Z' + fieldsType: FieldsV1 + fieldsV1: + 'f:spec': + 'f:host': {} + 'f:port': + .: {} + 'f:targetPort': {} + 'f:tls': + .: {} + 'f:termination': {} + 'f:to': + 'f:kind': {} + 'f:name': {} + 'f:weight': {} + 'f:wildcardPolicy': {} + - manager: openshift-router + operation: Update + apiVersion: route.openshift.io/v1 + time: '2023-09-25T20:47:52Z' + fieldsType: FieldsV1 + fieldsV1: + 'f:status': + 'f:ingress': {} + subresource: status +spec: + host: mbee.navair.navy.mil + to: + kind: Service + name: openmbee-ve-svc + weight: 100 + port: + targetPort: openmbee-ve + tls: + termination: edge + wildcardPolicy: None +status: + ingress: + - host: mbee.navair.navy.mil + routerName: default + conditions: + - type: Admitted + status: 'True' + lastTransitionTime: '2023-09-25T20:50:14Z' + wildcardPolicy: None + routerCanonicalHostname: router-default.apps.arena-workspace.navair.navy.mil diff --git a/openshift-resources/secret-nexus-repo-docker-registry.yaml b/openshift-resources/secret-nexus-repo-docker-registry.yaml new file mode 100644 index 000000000..a124149f9 --- /dev/null +++ b/openshift-resources/secret-nexus-repo-docker-registry.yaml @@ -0,0 +1,23 @@ +kind: Secret +apiVersion: v1 +metadata: + name: nexus-repo-docker-registry + namespace: openmbee + uid: 86eba8fb-4bf5-4dd0-8aeb-d6aa17e6e132 + resourceVersion: '950096711' + creationTimestamp: '2023-07-18T16:52:37Z' + managedFields: + - manager: Mozilla + operation: Update + apiVersion: v1 + time: '2023-07-18T16:52:37Z' + fieldsType: FieldsV1 + fieldsV1: + 'f:data': + .: {} + 'f:.dockerconfigjson': {} + 'f:type': {} +data: + .dockerconfigjson: >- + eyJhdXRocyI6eyJyZWdpc3RyeS1jbGktZG9ja2VyLndzZWFzdHRlc3QubmF2YWlyLm5hdnkubWlsOjUwMDAiOnsidXNlcm5hbWUiOiJTUzB0QUpvRyIsInBhc3N3b3JkIjoibS0zLVBYcXVTTkJIZjFBMkFvUS1KZTFwcUxRV25CM0RsZk9TNi1BUHBtNGciLCJlbWFpbCI6InVudXNlZCIsImF1dGgiOiJVMU13ZEVGS2IwYzZiUzB6TFZCWWNYVlRUa0pJWmpGQk1rRnZVUzFLWlRGd2NVeFJWMjVDTTBSc1prOVROaTFCVUhCdE5HYz0ifX19 +type: kubernetes.io/dockerconfigjson diff --git a/openshift-resources/service-openmbee-ve-svc.yaml b/openshift-resources/service-openmbee-ve-svc.yaml new file mode 100644 index 000000000..9008dd12c --- /dev/null +++ b/openshift-resources/service-openmbee-ve-svc.yaml @@ -0,0 +1,51 @@ +kind: Service +apiVersion: v1 +metadata: + name: openmbee-ve-svc + namespace: openmbee + uid: 52741a91-5a2d-459a-8ea7-96fa13ac328f + resourceVersion: '936991153' + creationTimestamp: '2023-08-31T18:02:11Z' + annotations: + description: Exposes and load balances the application pods + managedFields: + - manager: Mozilla + operation: Update + apiVersion: v1 + time: '2023-08-31T18:02:11Z' + fieldsType: FieldsV1 + fieldsV1: + 'f:metadata': + 'f:annotations': + .: {} + 'f:description': {} + 'f:spec': + 'f:internalTrafficPolicy': {} + 'f:ports': + .: {} + 'k:{"port":8080,"protocol":"TCP"}': + .: {} + 'f:name': {} + 'f:port': {} + 'f:protocol': {} + 'f:targetPort': {} + 'f:selector': {} + 'f:sessionAffinity': {} + 'f:type': {} +spec: + clusterIP: ipFamilies: + - IPv4 + ports: + - name: openmbee-ve + protocol: TCP + port: 8080 + targetPort: 8080 + internalTrafficPolicy: Cluster + clusterIPs: + - type: ClusterIP + ipFamilyPolicy: SingleStack + sessionAffinity: None + selector: + app: openmbee-ve +status: + loadBalancer: {} diff --git a/package.json b/package.json old mode 100644 new mode 100755 index e90ece357..4c943f1a3 --- a/package.json +++ b/package.json @@ -1,107 +1,49 @@ { - "name": "view-editor", - "version": "5.0.0", - "description": "View Editor Application", + "name": "mms-ve", + "description": "mms ve module", "repository": "https://github.com/Open-MBEE/ve.git", - "main": "main.ts", - "scripts": { - "start": "cd dist && serve", - "format": "prettier --write \"**/*.ts\" \"**/*.js\"", - "lint": "DEBUG=eslint:cli-engine eslint ./src", - "prebuild": "yarn lint && yarn format", - "build": "webpack --config webpack.config.ts --mode=production --bail", - "watch": "webpack --config webpack.config.ts --mode=development --watch --progress", - "test": "yarn prebuild && yarn build" - }, "devDependencies": { - "@babel/core": "^7.0.0", - "@babel/preset-env": "^7.1.6", - "@types/angular": "^1.8.4", - "@types/angular-cookies": "^1.8.1", - "@types/angular-growl-v2": "^0.7.2", - "@types/angular-hotkeys": "^1.7.3", - "@types/angular-sanitize": "^1.8.1", - "@types/angular-ui-bootstrap": "^1.0.1", - "@types/angular-ui-router": "^1.1.41", - "@types/ckeditor4": "^4.20.0", - "@types/diff": "^3.5.0", - "@types/jquery": "3.5.5", - "@types/lodash": "^4.14.181", - "@types/ngstorage": "^0.3.37", - "@types/node": "^18.7.11", - "@types/rx-lite": "^4.0.6", - "@types/stompjs": "2.3.2", - "@types/uuid": "^8.3.4", - "@types/virtual-dom": "^2.1.1", - "@types/webpack": "^5.28.0", - "@typescript-eslint/eslint-plugin": "^5.39.0", - "@typescript-eslint/parser": "^5.39.0", - "alias-hq": "^5.4.0", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.7.1", - "eslint": "^8.24.0", - "eslint-config-prettier": "^8.5.0", - "eslint-import-resolver-typescript": "^3.5.1", - "eslint-plugin-angular": "^4.1.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-prettier": "^4.2.1", - "eslint-plugin-unused-imports": "^2.0.0", - "favicons": "^7.0.2", - "favicons-webpack-plugin": "^6.0.0", - "html-webpack-plugin": "^5.5.0", - "jsdoc": "^3.6.10", - "mathjax": "3", - "mathjax-full": "^3.2.0", - "mini-css-extract-plugin": "^2.6.0", - "node": "^18.7.0", - "postcss": "^8.3.3", - "replace-in-file": "^6.3.2", - "resolve-url-loader": "^5.0.0", - "rimraf": "^2.6.2", - "sass": "^1.49.9", - "sass-loader": "^12.6.0", - "serve": "^10.1.2", - "style-loader": "^3.3.1", - "stylelint": "^14.13.0", - "stylelint-config-standard": "^28.0.0", - "stylelint-config-standard-scss": "^5.0.0", - "ts-loader": "^9.2.8", - "ts-node": "^10.9.1", - "type-fest": "^3.5.1", - "typescript": "^4.6.2", - "webpack": "^5.76.0", - "webpack-cli": "^4.10.0", - "webpack-virtual-modules": "^0.4.3" + "babel-polyfill": "^6.26.0", + "compression": "^1.7.1", + "connect-livereload": "^0.6.0", + "connect-modrewrite": "^0.10.2", + "grunt": "^1.0.1", + "grunt-bower-install-simple": "1.2.4", + "grunt-cache-breaker": "^2.0.1", + "grunt-cache-bust": "~1.6.0", + "grunt-concurrent": "^2.3.1", + "grunt-connect-proxy-updated": "^0.2.1", + "grunt-contrib-clean": "^1.1.0", + "grunt-contrib-concat": "^1.0.1", + "grunt-contrib-connect": "~1.0.2", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-cssmin": "^2.1.0", + "grunt-contrib-jshint": "^1.1.0", + "grunt-contrib-sass": "^2.0.0", + "grunt-contrib-uglify": "^5.2.2", + "grunt-contrib-watch": "^1.1.0", + "grunt-html2js": "^0.5.1", + "grunt-karma": "^2.0.0", + "grunt-middleware-proxy": "^1.0.7", + "grunt-mkdir": "^1.1.0", + "grunt-ngdocs": "^0.2.11", + "grunt-protractor-runner": "^5.0.0", + "grunt-sass": "^2.0.0", + "grunt-terser": "^2.0.0", + "grunt-usemin": "^3.0.0", + "grunt-wiredep": "~3.0.1", + "jasmine-core": "~2.8.0", + "jasmine-jquery": "^2.1.1", + "jit-grunt": "~0.10.0", + "phantomjs-prebuilt": "^2.1.16", + "protractor": "~5.2.0", + "terser": "^5.10.0", + "time-grunt": "^1.4.0" }, "dependencies": { - "@fortawesome/fontawesome-free": "^6.1.0", - "@openmbee/angularjs-dropdown-multiselect": "./lib/openmbee-angularjs-dropdown-multiselect-v1.0.2.tgz", - "@openmbee/html-to-vdom": "^0.9.0", - "@openmbee/pane-layout": "^1.0.40", - "@uirouter/angularjs": "^1.0.30", - "angular": "^1.8.2", - "angular-animate": "^1.8.2", - "angular-cookies": "^1.8.2", - "angular-growl-v2": "^0.7.5", - "angular-hotkeys": "^1.7.0", - "angular-sanitize": "^1.8.2", - "angular-ui-bootstrap": "^2.5.6", - "angular-ui-tree": "^2.22.6", - "angulartics": "^1.6.0", - "angulartics-piwik": "^1.0.6", - "buffer": "^6.0.3", - "diff": "^3.5.0", - "flatpickr": "^4.6.9", - "jquery": "^3.6.2", - "lodash": "^4.17.20", - "moment": "^2.29.1", - "ngstorage": "^0.3.11", - "prettier": "^2.5.1", - "rx-lite": "^4.0.8", - "sass-migrator": "^1.7.1", - "ui-router-visualizer": "3", - "uuid": "^9.0.0", - "vdom-to-html": "^2.3.1", - "virtual-dom": "git+https://github.com/chhaymenghong/virtual-dom.git#master" + "c3": "^0.5.4", + "d3": "^5.1.0", + "ng": "*", + "serve": "^14.2.1" } } diff --git a/packagev2.json b/packagev2.json new file mode 100755 index 000000000..e53a9b1ed --- /dev/null +++ b/packagev2.json @@ -0,0 +1,59 @@ +{ + "name": "mms-ve", + "description": "mms ve module", + "repository": "https://github.com/Open-MBEE/ve.git", + "devDependencies": { + "babel-polyfill": "^6.26.0", + "compression": "^1.7.1", + "connect-livereload": "^0.6.0", + "connect-modrewrite": "^0.10.2", + "grunt": "^1.0.1", + "grunt-bower-install-simple": "1.2.4", + "grunt-cache-breaker": "^2.0.1", + "grunt-cache-bust": "~1.6.0", + "grunt-concurrent": "^2.3.1", + "grunt-connect-proxy-updated": "^0.2.1", + "grunt-contrib-clean": "^1.1.0", + "grunt-contrib-concat": "^1.0.1", + "grunt-contrib-connect": "~1.0.2", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-cssmin": "^2.1.0", + "grunt-contrib-jshint": "^1.1.0", + "grunt-contrib-sass": "^2.0.0", + "grunt-contrib-uglify": "^5.2.2", + "grunt-contrib-watch": "^1.1.0", + "grunt-html2js": "^0.5.1", + "grunt-karma": "^2.0.0", + "grunt-middleware-proxy": "^1.0.7", + "grunt-mkdir": "^1.1.0", + "grunt-ngdocs": "^0.2.11", + "grunt-protractor-runner": "^5.0.0", + "grunt-sass": "^2.0.0", + "grunt-terser": "^2.0.0", + "grunt-usemin": "^3.0.0", + "grunt-wiredep": "~3.0.1", + "jasmine-core": "~2.8.0", + "jasmine-jquery": "^2.1.1", + "jit-grunt": "~0.10.0", + "karma": "^1.7.1", + "karma-chrome-launcher": "^2.1.1", + "karma-fixture": "^0.2.6", + "karma-html2js-preprocessor": "^1.0.0", + "karma-jasmine": "^1.1.1", + "karma-jasmine-jquery": "^0.1.1", + "karma-json-fixtures-preprocessor": "0.0.6", + "karma-junit-reporter": "^1.2.0", + "karma-nyan-reporter": "^0.2.3", + "karma-phantomjs-launcher": "^1.0.4", + "phantomjs-prebuilt": "^2.1.16", + "protractor": "~5.2.0", + "terser": "^5.10.0", + "time-grunt": "^1.4.0" + }, + "dependencies": { + "c3": "^0.5.4", + "d3": "^5.1.0", + "ng": "*" + } + } + \ No newline at end of file diff --git a/scripts/e2e-test.bat b/scripts/e2e-test.bat new file mode 100755 index 000000000..03c8be2fd --- /dev/null +++ b/scripts/e2e-test.bat @@ -0,0 +1,12 @@ +@echo off + +REM Windows script for running e2e tests +REM You have to run server first +REM +REM Requirements: +REM - NodeJS (http://nodejs.org/) +REM - Protractor (npm install -g protractor) + +set BASE_DIR=%~dp0 +webdriver-manager update +protractor "%BASE_DIR%\..\config\protractor-conf.js" %* diff --git a/scripts/e2e-test.sh b/scripts/e2e-test.sh new file mode 100755 index 000000000..b93aa03eb --- /dev/null +++ b/scripts/e2e-test.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +BASE_DIR=`dirname $0` + +echo "" +echo "Updating WebDriver" +echo $BASE_DIR +echo "-------------------------------------------------------------------" + +$BASE_DIR/../node_modules/protractor/bin/webdriver-manager update + + +echo "" +echo "Starting Protractor tests" +echo $BASE_DIR +echo "-------------------------------------------------------------------" + +$BASE_DIR/../node_modules/protractor/bin/protractor $BASE_DIR/../config/protractor-conf.js $* diff --git a/scripts/test-all.sh b/scripts/test-all.sh new file mode 100755 index 000000000..97b6a50c3 --- /dev/null +++ b/scripts/test-all.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -ex + +function cleanUp() { + kill $WEBSERVER_PID +} + +trap cleanUp EXIT + +# Define reasonable set of browsers in case we are running manually from commandline +if [[ -z "$BROWSERS" ]] +then + BROWSERS="Chrome" +fi + +if [[ -z "$BROWSERS_E2E" ]] +then + BROWSERS_E2E="Chrome" +fi + +ROOT_DIR=`dirname $0`/.. + +cd $ROOT_DIR +npm install + +./scripts/web-server.js > /dev/null & +WEBSERVER_PID=$! + + +./node_modules/karma/bin/karma start config/karma.master.conf.js --single-run --browsers $BROWSERS --reporters=dots --no-colors --no-color +./node_modules/karma/bin/karma start config/karma-e2e.conf.js --browsers $BROWSERS_E2E --reporters=dots --no-colors --no-color diff --git a/scripts/test.bat b/scripts/test.bat new file mode 100755 index 000000000..15722b0d3 --- /dev/null +++ b/scripts/test.bat @@ -0,0 +1,11 @@ +@echo off + +REM Windows script for running unit tests +REM You have to run server and capture some browser first +REM +REM Requirements: +REM - NodeJS (http://nodejs.org/) +REM - Karma (npm install -g karma) + +set BASE_DIR=%~dp0 +karma start "%BASE_DIR%\..\config\karma.master.conf.js" %* diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 000000000..e87b17df7 --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +BASE_DIR=`dirname $0` + +echo "" +echo "Starting Karma Server (http://karma-runner.github.io)" +echo "-------------------------------------------------------------------" + +$BASE_DIR/../node_modules/karma/bin/karma start $BASE_DIR/../config/karma.master.conf.js $* diff --git a/scripts/update-angular.sh b/scripts/update-angular.sh new file mode 100755 index 000000000..20ff73bd3 --- /dev/null +++ b/scripts/update-angular.sh @@ -0,0 +1,30 @@ +#! /bin/sh +NG_BUILD_DIR=$1 +if [[ ! -e "$NG_BUILD_DIR/angular.js" ]]; then + echo "Usage: update-angular " + exit 1 +fi + +SCRIPT_DIR=$(dirname $0) +ROOT_DIR=$SCRIPT_DIR/../ +VERSION=$(cat $NG_BUILD_DIR/version.txt) + +cd $ROOT_DIR + +rm -fr app/lib/angular +mkdir app/lib/angular +cp -r $NG_BUILD_DIR/* app/lib/angular +rm -fr app/lib/angular/docs +rm app/lib/angular/*.zip +mv app/lib/angular/angular-mocks.js test/lib/angular +cp app/lib/angular/version.txt test/lib/angular + +# Update the inlined angular-loader in app/index-async.html +sed '/@@NG_LOADER@@/{ + s/@@NG_LOADER@@//g + r app/lib/angular/angular-loader.min.js +}' app/index-async.html.template > app/index-async.html + +git add $ROOT_DIR/app +git add $ROOT_DIR/test +git commit -m "update(angular): bump to $VERSION" diff --git a/scripts/watchr.rb b/scripts/watchr.rb new file mode 100755 index 000000000..89ef656d2 --- /dev/null +++ b/scripts/watchr.rb @@ -0,0 +1,19 @@ +#!/usr/bin/env watchr + +# config file for watchr http://github.com/mynyml/watchr +# install: gem install watchr +# run: watch watchr.rb +# note: make sure that you have jstd server running (server.sh) and a browser captured + +log_file = File.expand_path(File.dirname(__FILE__) + '/../logs/jstd.log') + +`cd ..` +`touch #{log_file}` + +puts "String watchr... log file: #{log_file}" + +watch( '(app/js|test/unit)' ) do + `echo "\n\ntest run started @ \`date\`" > #{log_file}` + `scripts/test.sh &> #{log_file}` +end + diff --git a/scripts/web-server.js b/scripts/web-server.js new file mode 100755 index 000000000..3f74441e3 --- /dev/null +++ b/scripts/web-server.js @@ -0,0 +1,244 @@ +#!/usr/bin/env node + +var util = require('util'), + http = require('http'), + fs = require('fs'), + url = require('url'), + events = require('events'); + +var DEFAULT_PORT = 8000; + +function main(argv) { + new HttpServer({ + 'GET': createServlet(StaticServlet), + 'HEAD': createServlet(StaticServlet) + }).start(Number(argv[2]) || DEFAULT_PORT); +} + +function escapeHtml(value) { + return value.toString(). + replace('<', '<'). + replace('>', '>'). + replace('"', '"'); +} + +function createServlet(Class) { + var servlet = new Class(); + return servlet.handleRequest.bind(servlet); +} + +/** + * An Http server implementation that uses a map of methods to decide + * action routing. + * + * @param {Object} Map of method => Handler function + */ +function HttpServer(handlers) { + this.handlers = handlers; + this.server = http.createServer(this.handleRequest_.bind(this)); +} + +HttpServer.prototype.start = function(port) { + this.port = port; + this.server.listen(port); + util.puts('Http Server running at http://localhost:' + port + '/'); +}; + +HttpServer.prototype.parseUrl_ = function(urlString) { + var parsed = url.parse(urlString); + parsed.pathname = url.resolve('/', parsed.pathname); + return url.parse(url.format(parsed), true); +}; + +HttpServer.prototype.handleRequest_ = function(req, res) { + var logEntry = req.method + ' ' + req.url; + if (req.headers['user-agent']) { + logEntry += ' ' + req.headers['user-agent']; + } + util.puts(logEntry); + req.url = this.parseUrl_(req.url); + var handler = this.handlers[req.method]; + if (!handler) { + res.writeHead(501); + res.end(); + } else { + handler.call(this, req, res); + } +}; + +/** + * Handles static content. + */ +function StaticServlet() {} + +StaticServlet.MimeMap = { + 'txt': 'text/plain', + 'html': 'text/html', + 'css': 'text/css', + 'xml': 'application/xml', + 'json': 'application/json', + 'js': 'application/javascript', + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'gif': 'image/gif', + 'png': 'image/png', +  'svg': 'image/svg+xml' +}; + +StaticServlet.prototype.handleRequest = function(req, res) { + var self = this; + var path = ('./' + req.url.pathname).replace('//','/').replace(/%(..)/g, function(match, hex){ + return String.fromCharCode(parseInt(hex, 16)); + }); + var parts = path.split('/'); + if (parts[parts.length-1].charAt(0) === '.') + return self.sendForbidden_(req, res, path); + fs.stat(path, function(err, stat) { + if (err) + return self.sendMissing_(req, res, path); + if (stat.isDirectory()) + return self.sendDirectory_(req, res, path); + return self.sendFile_(req, res, path); + }); +} + +StaticServlet.prototype.sendError_ = function(req, res, error) { + res.writeHead(500, { + 'Content-Type': 'text/html' + }); + res.write('\n'); + res.write('Internal Server Error\n'); + res.write('

Internal Server Error

'); + res.write('
' + escapeHtml(util.inspect(error)) + '
'); + util.puts('500 Internal Server Error'); + util.puts(util.inspect(error)); +}; + +StaticServlet.prototype.sendMissing_ = function(req, res, path) { + path = path.substring(1); + res.writeHead(404, { + 'Content-Type': 'text/html' + }); + res.write('\n'); + res.write('404 Not Found\n'); + res.write('

Not Found

'); + res.write( + '

The requested URL ' + + escapeHtml(path) + + ' was not found on this server.

' + ); + res.end(); + util.puts('404 Not Found: ' + path); +}; + +StaticServlet.prototype.sendForbidden_ = function(req, res, path) { + path = path.substring(1); + res.writeHead(403, { + 'Content-Type': 'text/html' + }); + res.write('\n'); + res.write('403 Forbidden\n'); + res.write('

Forbidden

'); + res.write( + '

You do not have permission to access ' + + escapeHtml(path) + ' on this server.

' + ); + res.end(); + util.puts('403 Forbidden: ' + path); +}; + +StaticServlet.prototype.sendRedirect_ = function(req, res, redirectUrl) { + res.writeHead(301, { + 'Content-Type': 'text/html', + 'Location': redirectUrl + }); + res.write('\n'); + res.write('301 Moved Permanently\n'); + res.write('

Moved Permanently

'); + res.write( + '

The document has moved here.

' + ); + res.end(); + util.puts('301 Moved Permanently: ' + redirectUrl); +}; + +StaticServlet.prototype.sendFile_ = function(req, res, path) { + var self = this; + var file = fs.createReadStream(path); + res.writeHead(200, { + 'Content-Type': StaticServlet. + MimeMap[path.split('.').pop()] || 'text/plain' + }); + if (req.method === 'HEAD') { + res.end(); + } else { + file.on('data', res.write.bind(res)); + file.on('close', function() { + res.end(); + }); + file.on('error', function(error) { + self.sendError_(req, res, error); + }); + } +}; + +StaticServlet.prototype.sendDirectory_ = function(req, res, path) { + var self = this; + if (path.match(/[^\/]$/)) { + req.url.pathname += '/'; + var redirectUrl = url.format(url.parse(url.format(req.url))); + return self.sendRedirect_(req, res, redirectUrl); + } + fs.readdir(path, function(err, files) { + if (err) + return self.sendError_(req, res, error); + + if (!files.length) + return self.writeDirectoryIndex_(req, res, path, []); + + var remaining = files.length; + files.forEach(function(fileName, index) { + fs.stat(path + '/' + fileName, function(err, stat) { + if (err) + return self.sendError_(req, res, err); + if (stat.isDirectory()) { + files[index] = fileName + '/'; + } + if (!(--remaining)) + return self.writeDirectoryIndex_(req, res, path, files); + }); + }); + }); +}; + +StaticServlet.prototype.writeDirectoryIndex_ = function(req, res, path, files) { + path = path.substring(1); + res.writeHead(200, { + 'Content-Type': 'text/html' + }); + if (req.method === 'HEAD') { + res.end(); + return; + } + res.write('\n'); + res.write('' + escapeHtml(path) + '\n'); + res.write('\n'); + res.write('

Directory: ' + escapeHtml(path) + '

'); + res.write('
    '); + files.forEach(function(fileName) { + if (fileName.charAt(0) !== '.') { + res.write('
  1. ' + + escapeHtml(fileName) + '
  2. '); + } + }); + res.write('
'); + res.end(); +}; + +// Must be last, +main(process.argv); diff --git a/src/assets/images/arrow-change.svg b/src/assets/images/arrow-change.svg old mode 100644 new mode 100755 diff --git a/src/assets/images/arrowhead.svg b/src/assets/images/arrowhead.svg old mode 100644 new mode 100755 diff --git a/src/assets/logo-dark.svg b/src/assets/logo-dark.svg deleted file mode 100644 index 79c0029b4..000000000 --- a/src/assets/logo-dark.svg +++ /dev/null @@ -1,70 +0,0 @@ - - - - - - - - diff --git a/src/assets/logo.svg b/src/assets/logo.svg deleted file mode 100644 index 3efdd76dc..000000000 --- a/src/assets/logo.svg +++ /dev/null @@ -1 +0,0 @@ -sdfArtboard 1 \ No newline at end of file diff --git a/src/assets/styles/base/_mms-colors.scss b/src/assets/styles/base/_mms-colors.scss new file mode 100755 index 000000000..200a2f463 --- /dev/null +++ b/src/assets/styles/base/_mms-colors.scss @@ -0,0 +1,95 @@ +/************************* + Colors for MMS that correspond to + the MMS app design guide +*************************/ + +/* Default color template */ +$brand_base: #2c7e8f; //$base_blue; +$brand_secondary: #bdd3e5; //secondary_blue +$brand_base_dark: #366590; //$dark_blue +$dark_blue: #366590; +$light_blue: #dfeaf3; +$link_blue: #0065bf; + +$red: #d2322d; +$secondary_red: #b94e4b; +$green: #9bbe81; +$yellow: #faf5ac; +$purple: #5b027a; +$light_purple: lighten(#8e47ad, 35%); + +/* Grayscale template */ +$black: #333; +$base_grey: #404040; +$secondary_grey: #505050; +$dark_grey: #606060; +$medium_grey: #707070; +$light_grey: #808080; +$white: #fff; +$ve-slate-darker-2:#313131; +$ve-light-text-darker-1:#535353; + +$tertiary_grey: #d3d3d3; +$quaternary_grey: #f5f5f5; +$quaternary_grey-darker: #fafafa; +$highlight_grey: #f3f3f3; +$ve-silver-lighter-2:#fdfdfd; +$ve-silver-base:#f0f0f0; + + +/* Some specific object coloring */ +$tool_inset: rgba(0,0,0,0.7); +$secondary_link: #2F889A; +$seconday_link_hover:#296f83; + + + +$ve-light-text:#7a7a7a; +$ve-light-text-darker-1:#535353; + +$ve-white-text-darker-1:#a3a3a3; +$ve-white-text-lighter-2:#d0d0d0; + +$ve-slate-lighter-2:#5c5c5c; +$ve-slate-lighter-1:#505050; +$ve-slate-base:#404040; +$ve-slate-darker-1:#383838; +$ve-slate-darker-2:#313131; +$ve-slate-darker-3:#212121; + +$ve-silver-lighter-2:#fdfdfd; +$ve-silver-lighter-1:#f9f9f9; +$ve-silver-lighter-0:#f4f4f4; +$ve-silver-base:#f0f0f0; +$ve-silver-darker-1:#e2e2e2; +$ve-silver-darker-2:#d8d8d8; +$ve-silver-darker-3:#b8b8b8; + +$ve-green-lighter-1:#60b9a6; +$ve-green-base:#439886; +$ve-green-darker-1:#398272; + +$ve-teal-lighter-4:#f4f9fa; +$ve-teal-lighter-3:#bfdae0; +$ve-teal-lighter-2:#58b9cc; +$ve-teal-lighter-1:#369cb1; +$ve-teal-base:#2c7e8f; +$ve-teal-darker-1:#296f83; +$ve-teal-darker-2:#1a5e71; + +$ve-accent:#456e9d; +$ve-accent-darker:#376391; + +$ve-yellow-base:#f8d768; + +$ve-clear:rgba(0,0,0,0); + +/*Light saturated blue for cross referencing and reordering*/ +$ve-active:rgb(0, 153, 255); + +$ve-link:#4885bd; + +$ve-warning: #c5544e; +$ve-warning-darker-1: #b8423c; +$ve-warning-orange: #ffb462; +$ve-warning-orange-light: #fff2e4; diff --git a/src/styles/globals.scss b/src/assets/styles/base/_mms-globals.scss old mode 100644 new mode 100755 similarity index 59% rename from src/styles/globals.scss rename to src/assets/styles/base/_mms-globals.scss index 4165f8e8c..b092e9ec6 --- a/src/styles/globals.scss +++ b/src/assets/styles/base/_mms-globals.scss @@ -1,30 +1,17 @@ /************************* - View Editor variables & mixins + Declarations *************************/ -@use "ve-base/ve-colors" as *; -@use "ve-base/ve-mixins" as *; -@forward "ve-base/ve-typography"; -@forward "ve-base/ve-mixins"; -@forward "ve-base/ve-colors"; - -$background-hover-transition: background-color 0.2s linear; -$background-easeout-transition: background-color 0.1s ease-out; -$nav-height: 36px; -$nav-banner: 20px; -$nav-project: 56px; -$nav-total: 92px; -$footer-height: 13px; -$pane-center-text-width: 10in; +$pane_center_text_width: 10in; @viewport { - width: 100vw; + width: device-width; } @include selection { - background-color: $light-blue !important; + background-color: $light_blue !important; } -$background-hover-transition: background-color .2s linear; +$background_hover_transition: background-color .2s linear; a:hover { cursor: pointer; @@ -66,7 +53,7 @@ img.image-center { figure.image-right { display: block; - max-width: $pane-center-text-width; + max-width: $pane_center_text_width; text-align: right; } @@ -74,7 +61,7 @@ figure.image-right { .image-center, figure.image-center { text-align: center; - max-width: $pane-center-text-width; + max-width: $pane_center_text_width; } table[align="right"] { @@ -92,4 +79,4 @@ table[align="center"] { display: block; float: none; margin: auto; -} +} \ No newline at end of file diff --git a/src/styles/ve-base/_ve-mixins.scss b/src/assets/styles/base/_mms-mixins.scss old mode 100644 new mode 100755 similarity index 100% rename from src/styles/ve-base/_ve-mixins.scss rename to src/assets/styles/base/_mms-mixins.scss diff --git a/src/assets/styles/base/_mms-typography.scss b/src/assets/styles/base/_mms-typography.scss new file mode 100755 index 000000000..53eaaf7ec --- /dev/null +++ b/src/assets/styles/base/_mms-typography.scss @@ -0,0 +1,21 @@ +/************************* + Typography for MMS that correspond to + the MMS app design guide +*************************/ + +/* Sizings */ +$font-size-base: 16px; + +/* Families */ +$font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif !default; +$light-font-family-sans-serif: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, sans-serif; +$icon-font-name: "FontAwesome"; + +/* Weights */ +$light_font_weight: 200; +$default_font_weight: 400; +$bold_font_weight: 700; +$headings-font-weight: $light_font_weight; + +$headings-line-height: 1.18; +$default-line-length: 33em; diff --git a/src/assets/styles/components/_mms-add-pe-button.scss b/src/assets/styles/components/_mms-add-pe-button.scss new file mode 100755 index 000000000..ae6b3db8e --- /dev/null +++ b/src/assets/styles/components/_mms-add-pe-button.scss @@ -0,0 +1,125 @@ +// /************************* +// Button styling for adding PEs +// inline box for dropdowns +// *************************/ +.mms-add-pe-button { + +/*take PE button out of document flow and put to left of content*/ + position: absolute; + margin-top: -18px; + left: 0; + + /*** Add PE dropdown ***/ + + /*Border radius and color to match dropdown*/ + a.dropdown-toggle{ + @include border-radius(4px 0 0 4px); + border: 1px solid transparent; + color: $tertiary-grey; + } + + //Padding, font size, and line height match for the toggle and dropdown + a.dropdown-toggle, + .dropdown-menu a{ + padding: 8px; + font-size: 14px; + text-align: center; + + /*light grey button labels*/ + span{ + display: block; + font-size: 12px; + color: $ve-light-text; + line-height: 18px; + letter-spacing: .03em; + } + } + + /*Special line-height so icons align*/ + .dropdown-menu a::before, + a.dropdown-toggle .fa{ + line-height: 1.5; + padding-right: 0; + } + + /*Special horizontal dropdown menu */ + .dropdown-menu { + position: relative; + padding: 0; + margin: 0; + @include border-radius(4px); + border-color: darken($white, 12%); + @include box-shadow( 6px 6px 12px rgba(0,0,0,.175)); + + /*line to indicate where the presentation element will be added + &::after{ + background-image: url(../assets/location-feedback-inline.svg); + content: ' '; + background-size: 70px 4px; + height: 4px; + width: 70px; + background-repeat: no-repeat; + position: absolute; + right: -70px; + top: 13px; + }*/ + + /*Horizontal menu that should be more consistent across browsers*/ + li{ + display: inline-block; + a{ + padding: 11px 0; + min-width: 62px; + } + } + } + + /*When hovering over the whole menu, set opacity to block*/ + .open > .dropdown-menu, + .dropdown-toggle:hover + .dropdown-menu, + span:hover .dropdown-menu{ + display: block; + margin-top: -11.5px; + } + + /*When hovering over button or opening toggle, darken text and background to show activated*/ + span:hover a.dropdown-toggle, + .open > a.dropdown-toggle, + .open > a.dropdown-toggle:hover{ + background-color: darken($white, 10%); + border-color: darken($white, 12%); + color: darken($tertiary-grey, 42%); + } + + +} +@media (max-width: 640px) { + .mms-add-pe-button { + span.icon-title { + display: none; + } + } +} +/* For section PEs, put the add button back into the document flow so that containment is clear*/ +mms-view-section .mms-add-pe-button { + position: relative; + margin-top: 0; +} + +.add-pe-button-container hr { + visibility: hidden; + border: none; + border-top: 3px dotted $ve-active; + height: 0px; + margin: 0px; +} +//.add-pe-button-container:hover hr { +// visibility: visible; //maybe toggle visibility with js for hover and click? +//} + +mms-view-section .add-pe-button-container hr { + left: 31px; + bottom: 18px; + position: relative; + width: calc(100% - 31px); +} \ No newline at end of file diff --git a/src/styles/ve-components/components/_mms-autocomplete-modal.scss b/src/assets/styles/components/_mms-autocomplete-modal.scss old mode 100644 new mode 100755 similarity index 97% rename from src/styles/ve-components/components/_mms-autocomplete-modal.scss rename to src/assets/styles/components/_mms-autocomplete-modal.scss index 25dfd3329..9c2e7bff0 --- a/src/styles/ve-components/components/_mms-autocomplete-modal.scss +++ b/src/assets/styles/components/_mms-autocomplete-modal.scss @@ -1,6 +1,7 @@ + .mms-autocomplete-modal { .autocomplete-modal-help { font-size: 12px; margin: 5px; } -} +} \ No newline at end of file diff --git a/src/assets/styles/components/_mms-buttons.scss b/src/assets/styles/components/_mms-buttons.scss new file mode 100755 index 000000000..f9014e433 --- /dev/null +++ b/src/assets/styles/components/_mms-buttons.scss @@ -0,0 +1,50 @@ +// /************************* +// Button variables that make Bootstrap +// conform to the MMS app design guide +// *************************/ + +.btn { + text-transform: uppercase; + font-weight: 600; + letter-spacing: .14em; + font-size: 12px; + + .fa { + font-size: 14px; + } +} + +.btn-secondary { + @include button-variant($brand_base, $white, $white); +} + +// Toolbar button style +.btn-tools { + @include button-variant($base_grey, $white, $white); + + .fa { + padding-right: 4px; + font-size: 16px; + } + + &:not(.dropdown-toggle) .fa { + padding-right: 0; + } + + .caret{ + opacity: .4; + } + + &.print, + &.refresh-numbering{ + margin-left: 12px; + } +} + +// Pull center button dropdowns to the right +.pane-center mms-button-bar { + .dropdown-menu { + right: 0; + left: auto; + } +} diff --git a/src/assets/styles/components/_mms-editor.scss b/src/assets/styles/components/_mms-editor.scss new file mode 100755 index 000000000..62474164e --- /dev/null +++ b/src/assets/styles/components/_mms-editor.scss @@ -0,0 +1,43 @@ +.cke { + min-width: 300px; +} + +/** Additional style for ckeditor custom dropdown **/ +.mmsExtraFormat .cke_combo_button, .mmsExtraFeature .cke_combo_button { + width: 30px; +} + +.mmsExtraFormat .cke_combo_open, .mmsExtraFeature .cke_combo_open { + margin-left: 3px !important; +} + +.mmsExtraFormat a.cke_combo_button .cke_combo_inlinelabel, +.mmsExtraFeature a.cke_combo_button .cke_combo_inlinelabel { + width: 17%; + height: 25px; + display: inline-block; +} +.mmsExtraFormat a.cke_combo_button .cke_combo_inlinelabel { + background: url('../assets/format-dropdown.png') no-repeat center !important; + background-size: 16px !important; +} + +.mmsExtraFeature a.cke_combo_button .cke_combo_inlinelabel { + background: url('../assets/mmsplus.png') no-repeat center !important; + background-size: 14px !important; +} + +.cke_button.cke_button__mmscomment:after { + border-right: 0 !important; +} + +.cke_combopanel { + -webkit-box-shadow: 0 6px 12px rgba(0,0,0,.175); + -moz-box-shadow: 0 6px 12px rgba(0,0,0,.175); + box-shadow: 0 6px 12px rgba(0,0,0,.175); + border-radius: 4px; +} + +.cke_combopanel__mmsextraformat { + height: 120px !important; +} diff --git a/src/styles/ve-components/components/_mms-history.scss b/src/assets/styles/components/_mms-history.scss old mode 100644 new mode 100755 similarity index 52% rename from src/styles/ve-components/components/_mms-history.scss rename to src/assets/styles/components/_mms-history.scss index 72b32f460..f65610a3b --- a/src/styles/ve-components/components/_mms-history.scss +++ b/src/assets/styles/components/_mms-history.scss @@ -1,38 +1,34 @@ -/* VE base styles */ -@use "src/styles/globals"; +/*------------------------------------------------------------------ + 1 Diff styling +-------------------------------------------------------------------*/ -/* ------------------------------------------------------------------ - 1 Diff styling -------------------------------------------------------------------- */ - -/* Delete styling */ +/*Delete styling*/ del { background-color: #ffe3e3 !important; } -/* Insert styling */ +/*Insert styling*/ ins { background-color: #dafde0 !important; text-decoration: none !important; } -/* No change styling */ -.match, -.textdiff span { +/*No change styling */ +.match,.textdiff span { color: gray; } -/* ------------------------------------------------------------------ - 1.1 History component styling -------------------------------------------------------------------- */ +/*------------------------------------------------------------------ + 1.1 History component styling +-------------------------------------------------------------------*/ -spec-history { +mms-history { .history-top { position: absolute; height: 300px; overflow: scroll; width: 95%; - border-bottom: 1px solid; + border-bottom: 1px solid } .history-bottom { @@ -40,17 +36,17 @@ spec-history { top: 430px; } - /* SVG arrow for pointing from history to present in spec */ + /*SVG arrow for pointing from history to present in spec*/ .change-connection { height: 18px; margin: 2px 0 3px; } - /* ------------------------------------------------------------------ - 1.2 Commit selection - ------------------------------------------------------------------- */ + /*------------------------------------------------------------------ + 1.2 Commit selection + -------------------------------------------------------------------*/ - /* Arrow connecting former commit to current */ + /*Arrow connecting former commit to current*/ .diff-dotted-connection { position: absolute; height: calc(100% - 40px); @@ -59,48 +55,47 @@ spec-history { width: 8px; top: 20px; border-right: none; - - @include globals.border-radius(8px 0 0 8px); + @include border-radius(8px 0 0 8px); } - /* Flex styling to keep buttons and labels vertically aligned */ + /*Flex styling to keep buttons and labels vertically aligned*/ .inline-diff-buttons { display: flex; align-items: center; } .inline-diff-buttons span:first-child { - padding-left: 0; - width: 5.4em; + padding-left:0; + width: 3.4em; } - /* Custom styling to keep labels inline with dropdowns */ - span.inline-btn-label { + /*Custom styling to keep labels inline with dropdowns*/ + span.inline-btn-label{ min-height: 28px; margin: 6px 0; padding: 7px 4px; line-height: 13px; - color: globals.$ve-light-text; + color:$ve-light-text; } - /* SVG arrow for pointing from history to present */ - .diff-dotted-connection::after { - background-image: url("../../../assets/images/arrowhead.svg"); + /*SVG arrow for pointing from history to present*/ + .diff-dotted-connection:after { + background-image: url(../assets/images/arrowhead.svg); position: absolute; right: -8px; top: calc(50% - 10px); - content: " "; + content: ' '; background-size: 18px 24px; height: 20px; width: 24px; background-repeat: no-repeat; } - /* ------------------------------------------------------------------ + /*------------------------------------------------------------------ 1.3 Footer at bottom of right pane for reverting documentation - ------------------------------------------------------------------- */ + -------------------------------------------------------------------*/ - /* Stick revert section to bottom of right pane */ + /* Stick revert section to bottom of right pane*/ .revert-section { float: right; width: 100%; @@ -110,19 +105,21 @@ spec-history { } .revert-section > div { - float: right; - display: flex; - padding: 16px 0; - text-align: right; + float:right; + display:flex; + padding:16px 0; + text-align:right; align-items: center; } .revert-section .btn { - margin: 0 8px; + margin:0 8px; } + } .revert-dialogue.modal-body { + p { font-size: 16px; margin-bottom: 10px; @@ -133,17 +130,18 @@ spec-history { font-weight: 600; } - /* ------------------------------------------------------------------ + + /*------------------------------------------------------------------ 2. History modal - ------------------------------------------------------------------- */ + -------------------------------------------------------------------*/ - /* Special styling to preview element */ - .element-preview-box { + /* Special styling to preview element*/ + .element-preview-box{ padding: 10px 20px; - background-color: globals.$ve-silver-lighter-1; - - @include globals.border-radius(3px); - - border: 1px solid globals.$ve-silver-darker-1; + background-color: $ve-silver-lighter-1; + @include border-radius(3px); + border: 1px solid $ve-silver-darker-1; } } + + diff --git a/src/assets/styles/components/_mms-jobs.scss b/src/assets/styles/components/_mms-jobs.scss new file mode 100755 index 000000000..62de20fda --- /dev/null +++ b/src/assets/styles/components/_mms-jobs.scss @@ -0,0 +1,87 @@ +#ve-jobs-table, +#ve-branches-tags{ + +/*------------------------------------------------------------------ +VE Jobs Table Table of contents + +1. Typography +2. Icons +3. Layout + 3.1 Table Layout + 3.2 Empty State Layout +-------------------------------------------------------------------*/ + +/*------------------------------------------------------------------ +1. Typography +-------------------------------------------------------------------*/ + + h3{ + font-size: 12px; + font-weight: 600; + color: #8d8d8d; + text-transform: uppercase; + letter-spacing: .1em; + } + + h4{ + font-weight:600; + font-size:16px; + } + +/*------------------------------------------------------------------ +2. Icons +-------------------------------------------------------------------*/ + + .failed-marker{ + padding-right:4px; + color: rgb(255, 107, 107); + } + + .in-progress-marker{ + color:$tertiary_grey; + padding-right:3px; + } + + .completed-marker{ + padding-right:4px; + color: #45c29d; + } + + .fa-pencil{ + color:#d3d3d3; + } + +/*------------------------------------------------------------------ +3. Layout +-------------------------------------------------------------------*/ +/*------------------------------------------------------------------ + 3.1 Table Layout +-------------------------------------------------------------------*/ + td{ + padding:8px 10px; + border: 1px solid $tertiary_grey; + } + + table{ + margin-bottom:44px; + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.1); + width:100%; + } + + thead td{ + font-weight:bolder; + background-color: $quaternary_grey; + color:$medium_grey; + } + + .build-details{ + padding-left: 12px; + } + + /*clear default margin when header is in table*/ + td h3{ + margin: 0; + } +} + + diff --git a/src/styles/ve-components/components/_mms-mention.scss b/src/assets/styles/components/_mms-mention.scss old mode 100644 new mode 100755 similarity index 98% rename from src/styles/ve-components/components/_mms-mention.scss rename to src/assets/styles/components/_mms-mention.scss index 295ecb93e..23c488ecd --- a/src/styles/ve-components/components/_mms-mention.scss +++ b/src/assets/styles/components/_mms-mention.scss @@ -1,5 +1,4 @@ - -.mention { +.mmsMention { .itemContainer { color: grey; @@ -22,7 +21,7 @@ font-weight: bold; color: black; } - + } .rightItem { diff --git a/src/styles/ve-components/components/_mms-misc-components.scss b/src/assets/styles/components/_mms-misc-components.scss old mode 100644 new mode 100755 similarity index 66% rename from src/styles/ve-components/components/_mms-misc-components.scss rename to src/assets/styles/components/_mms-misc-components.scss index b2d214d37..e2ade5515 --- a/src/styles/ve-components/components/_mms-misc-components.scss +++ b/src/assets/styles/components/_mms-misc-components.scss @@ -1,6 +1,3 @@ -/* VE base styles */ -@use "src/styles/globals"; - /************************* Component mods that implement the MMS app design guide @@ -12,7 +9,7 @@ img { } .form-control:focus { - border-color: globals.$brand-base; + border-color: $brand_base; } .radio-with-label { @@ -32,14 +29,14 @@ img { .nav-pills { > li:active { > a { - background-color: globals.$secondary-grey; - color: globals.$white; + background-color: $secondary_grey; + color: $white; } > a:hover, > a:focus { - background-color: globals.$secondary-grey; - color: globals.$white; + background-color: $secondary_grey; + color: $white; } } } @@ -49,33 +46,30 @@ img { // width: auto!important; // } -thead td, -table caption { +thead td, table caption { font-weight: bold; } .table { tr { - @include globals.transition(globals.$background-hover-transition); + @include transition($background_hover_transition); } } .content-table { - @extend .table !optional; - @extend .table-condensed !optional; - @extend .table-bordered !optional; - - width: auto !important; - + @extend .table; + @extend .table-condensed; + @extend .table-bordered; + width: auto!important; p { - margin: 0 0 5px; + margin: 0px 0px 5px; } } // Workaround for tables with no borders -.table[border="0"] { - border: 0; +.table[border='0']{ + border: 0; // Cells > thead, > tbody, @@ -99,17 +93,17 @@ table caption { } } } - // Account for multiple tbody instances > tbody + tbody { border-top: none; } } + .tooltip { .tooltip-inner { font-size: 12px; - font-weight: globals.$default-font-weight; + font-weight: $default_font_weight; } &.bottom-left { @@ -126,21 +120,21 @@ table caption { } .star-mandatory { - color: globals.$red; + color: $red; } // warning icon for errors -.ve-error-icon { - color: globals.$black; +.mms-error-icon{ + color: $black; border: none; padding-left: 11px; } -.ve-error-icon::before { +.mms-error-icon::before{ content: "\f071"; - font-family: globals.$font-family-icon; + font-family: fontAwesome; margin-left: -14px; - color: globals.$ve-warning-orange; + color: $ve-warning-orange; font-size: 12px; position: absolute; } diff --git a/src/styles/ve-components/components/_mms-search.scss b/src/assets/styles/components/_mms-search.scss old mode 100644 new mode 100755 similarity index 54% rename from src/styles/ve-components/components/_mms-search.scss rename to src/assets/styles/components/_mms-search.scss index 39a420db2..4beea0c37 --- a/src/styles/ve-components/components/_mms-search.scss +++ b/src/assets/styles/components/_mms-search.scss @@ -1,14 +1,7 @@ -/* VE base styles */ -@use "src/styles/globals"; - -/* Dependencies */ -@use "src/styles/third-party/bootstrap"; -@use "sass:color"; - .mms-search { position: relative; - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1. Layout 2. Forms (can move most of this to main) @@ -16,29 +9,28 @@ 4. Empty state 5. Small Modals -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 1. Layout -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .search-header { - background: globals.$white; - padding-bottom: 250px; - font-size: 14px; + background: $white; + padding-bottom: 250px; + font-size: 14px; - /* Border with shadow added when search results >= 0 */ + /*Border with shadow added when search results >= 0*/ &.searchresults { - border-bottom: 1px solid globals.$ve-silver-darker-1; - box-shadow: 0 4px 4px -4px rgb(0 0 0 / 10%); + border-bottom: 1px solid $ve-silver-darker-1; + box-shadow: 0 4px 4px -4px rgba(0,0,0,.1); padding-bottom: 0; } .close-button-container { position: absolute; - top: 0.5em; + top: .5em; right: 2em; - &:hover { cursor: pointer; } @@ -47,38 +39,33 @@ .close-button { position: fixed; font-size: 1.5em; - color: globals.$tertiary-grey; + color: $tertiary_grey; } } - /* Spacing for count of results at top of results */ + /*Spacing for count of results at top of results*/ .results-count { padding: 20px 42px; - background: globals.$ve-silver-lighter-2; + background: $ve-silver-lighter-2; font-size: 14px; - border-bottom: 1px solid globals.$ve-silver-darker-1; + border-bottom: 1px solid $ve-silver-darker-1; } .results-filter { padding-left: 20px; } - /* Spaceing for next and previous at bottom of results */ + /*Spaceing for next and previous at bottom of results*/ .search-nav { padding: 38px 38px 60px; } - /* Spaceing for next and previous at bottom of results */ - .search-nav-top { - padding: 38px; - } - .mms-search-input { max-width: 1200px; padding: 30px 36px 30px 42px; position: relative; - /* Navigatiom back to basic search input, with a left back arrow */ + /*Navigatiom back to basic search input, with a left back arrow*/ .search-nav-back { position: absolute; top: 0; @@ -93,63 +80,59 @@ } } - /* Navigatiom to advanced search input */ + /*Navigatiom to advanced search input*/ .advanced-query { margin-bottom: 18px; } - .advanced-views-docs { padding-top: 22px; } } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 2. Forms -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .form-inline { + display: -webkit-box; + display: -moz-box; + display: -ms-flexbox; + display: -webkit-flex; display: flex; - align-items: center; /* Safari 7.0+ */ + -webkit-align-items: center; /* Safari 7.0+ */ + align-items: center; .form-group, .btn { margin: 7px 3px; line-height: 16px; } - .form-group { width: 100%; } - - /* fixed width of medium content so that vertical rhythym is consistent */ + /*fixed width of medium content so that vertical rhythym is consistent*/ .fixed-content-m { width: 150px; flex: none; } - - /* fixed width of small content */ + /*fixed width of small content*/ .fixed-content-s { width: 90px; flex: none; } - .ve-light-dropdown { margin: 0; } - h3 { display: inline-block; font-weight: 500; font-size: 18px; margin: 0 3px 0 0; } - input { min-height: 30px; - - @include globals.border-radius(2px); - - border: 1px solid globals.$tertiary-grey; + @include border-radius(2px); + border: 1px solid $tertiary_grey; padding: 3px 5px; } } @@ -157,72 +140,65 @@ .search-input { width: 100%; - /* feedback for advanced search where user cannot edit */ + /*feedback for advanced search where user cannot edit*/ &.disabled-input { font-size: 14px; padding: 4px 8px; line-height: 13px; border: none; border-radius: 2px !important; - letter-spacing: 0.04em; + letter-spacing: .04em; background-color: #f4f4f4; min-height: 30px; } - &.disabled-input-container { margin-right: 8px; } } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 3. Results styles -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .search-results { max-width: 1200px; } - /* Search result wrapper */ + /*Search result wrapper*/ .elem-wrapper { padding: 44px 0; margin: 0 42px; - border-bottom: 1px solid globals.$ve-silver-darker-1; + border-bottom: 1px solid $ve-silver-darker-1; .elem-name { font-size: 20px; font-weight: 500; } - .elem-qualified-name { font-size: 14px; font-style: italic; - color: globals.$medium-grey; - + color: $medium_grey; &:hover { cursor: pointer; } } - .elem-documentation { - color: globals.$ve-link !important; - + color: $ve-link !important; table { - @extend .content-table !optional; + @extend .content-table; } } - .elem-properties-wrapper { - /* Table styling so values are aligned right and properties are aligned left */ + /*Table styling so values are aligned right and properties are aligned left*/ table { margin-bottom: 0; - color: globals.$ve-light-text; + color: $ve-light-text; } - table > tbody > tr > td { border-top: none; padding: 2px 1px; - /* Float property name right for better readability */ + /*Float property name right for better readability*/ &:first-child { float: right; text-align: right; @@ -232,122 +208,115 @@ .show-more-container { margin-top: 10px; - .show-more-btn { position: relative; padding-left: 17px; - - &::after { - content: "\f0d7"; - font-family: globals.$icon-font-name; + &::after{ + content:"\f0d7"; + font-family: $icon-font-name; } - - &::before { + &::before{ content: "..."; font-size: 16px; - color: globals.$tertiary-grey; + color: $tertiary_grey; position: absolute; top: -19px; } } } - /* Add a grey border to the left of documentation since the preview can get spread out */ - .elem-documentation-wrapper { - .elem-documentation { - border-left: 4px solid globals.$ve-silver-base; + /* Add a grey border to the left of documentation since the preview can get spread out*/ + .elem-documentation-wrapper{ + .elem-documentation{ + border-left: 4px solid $ve-silver-base; padding-left: 14px; } } - /* Indent cross referenceable content so it pops out */ + /*Indent cross referenceable content so it pops out*/ .elem-properties, .elem-specification, .elem-documentation, .elem-properties-wrapper > table > tbody > tr > td:first-child { padding-left: 18px; } - .ellipses { - color: globals.$brand-base; + color: $brand_base; } - .elem-updated-wrapper { - color: globals.$medium-grey; + color: $medium_grey; font-size: 14px; - margin-top: 10px; + margin-top:10px; } } - .ve-search-filter { + .ve-search-filter{ padding-bottom: 10px; - .label-for-filter { + .label-for-filter{ font-weight: 600; - letter-spacing: 0.12em; + letter-spacing: .12em; } } .ve-btn-group-default { - @include bootstrap.button-variant(globals.$ve-light-text, globals.$white, globals.$ve-silver-darker-2); - + @include button-variant($ve-light-text, $white, $ve-silver-darker-2); text-transform: initial; letter-spacing: normal; line-height: 1.6; font-weight: normal; - - .fa .fa-solid .fa-regular { + .fa { padding-right: 4px; + font-size: 16px; } } - .btn-group { - .ve-btn-group-default.active, - .ve-btn-group-default:active { + .ve-btn-group-default.active, .ve-btn-group-default:active { color: #f0f0f0; - background-color: globals.$brand-base; - border-color: color.scale(globals.$brand-base, $lightness: -10%); + background-color: $brand_base; + border-color: darken($brand_base,10%); } } - /* Add light colored presentation element icons to the left of the title */ - .search-results { - .item-type-view, - .item-type-document, - .item-type-group, - .item-type-tag, - .pe-type-paragraph, - .pe-type-paragraph-t, - .pe-type-section, - .pe-type-section-t, - .pe-type-text, - .pe-type-text-t, - .pe-type-table, - .pe-type-table-t, - .pe-type-image, - .pe-type-image-t, - .pe-type-equation, - .pe-type-comment { - position: relative; - - &::before { - color: globals.$ve-silver-darker-3; + /*Add light colored presentation element icons to the left of the title*/ + .search-results{ + .item-type-View, + .item-type-Document, + .item-type-Group, + .pe-type-Paragraph, + .pe-type-ParagraphT, + .pe-type-Section, + .pe-type-SectionT, + .pe-type-Text, + .pe-type-TextT, + .pe-type-Table, + .pe-type-TableT, + .pe-type-Image, + .pe-type-ImageT, + .pe-type-Equation, + .pe-type-Comment{ + + position:relative; + + &::before{ + color: $ve-silver-darker-3; right: 0; + padding: 0; position: absolute; - top: -0.1em; + top: -.1em; font-size: 15px; - padding: 0 6px 0 0; + padding-right: 6px; } } } - /* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 4. Empty state -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ // No results styles .container-no-results { - color: globals.$medium-grey; + color: $medium_grey; min-height: 250px; h3 { @@ -358,9 +327,9 @@ } } -/* ------------------------------------------------------------------ +/*------------------------------------------------------------------ 5. Small modals -------------------------------------------------------------------- */ +-------------------------------------------------------------------*/ .modal-body { .mms-search { @@ -371,10 +340,10 @@ padding-left: 22px; padding-right: 22px; } - .elem-wrapper { margin-left: 22px; margin-right: 22px; } } } + diff --git a/src/assets/styles/components/_mms-spec.scss b/src/assets/styles/components/_mms-spec.scss new file mode 100755 index 000000000..2098c5515 --- /dev/null +++ b/src/assets/styles/components/_mms-spec.scss @@ -0,0 +1,178 @@ +.pane-right, +.revert-spec { + h1.prop, + h1.prop > .form-control { + font-size: 26px; + margin: 30px 0 0; + height: inherit; + width: 100%; + font-weight: $default_font_weight; + } + + h1.prop { + width: 100%; + word-wrap: break-word; + + /*Make presentation element icons smaller and to the top of the name*/ + + .item-type-View, + .item-type-Document, + .item-type-Group, + .pe-type-Paragraph, + .pe-type-ParagraphT, + .pe-type-Section, + .pe-type-SectionT, + .pe-type-Text, + .pe-type-TextT, + .pe-type-Table, + .pe-type-TableT, + .pe-type-Image, + .pe-type-ImageT, + .pe-type-Equation, + .pe-type-Comment{ + + &::before{ + color: $ve-silver-darker-3; + font-size: .6em; + top: -.3em; + padding-right: 6px; + position: relative; + } + } + } + + h2.prop-title{ + padding-top: 24px; + } + + span.prop { + font-size: 16px; + margin-bottom: 20px; + margin-top: 2px; + word-wrap: break-word; + display: block; + } + + h1.element-title { + word-wrap: break-word; + } + + .doc-text { + font-family: $font-family-sans-serif; + + /* Add border to left to delineate*/ + padding-left: 8px; + border-left: 4px solid $ve-silver-base; + max-width: $default-line-length; + margin-top: 2px; + //min-width: 15em; + } + + h2.spec-view-doc-heading, h2.spec-view-value-heading, h2.spec-view-type-heading { + margin-top: 16px; + } + + table { + @extend .content-table; + } + + mms-spec { + mms-transclude-doc { + cursor: auto; + } + } +} + +/*------------------------------------------------------------------ +Styles that apply to both the spec +-------------------------------------------------------------------*/ + +.mms-search, +.pane-right, +.revert-spec{ + .elem-wrapper label, + .prop-title, + .visibility-toggle{ + font-size: 12px; + font-weight: bold; + margin: 8px 0px 0 0; + letter-spacing: .04em; + text-decoration: none; + color: $ve-light-text; + } + + .visibility-toggle{ + list-style: none; + margin: 12px 0 0 -14px; + + td{ + line-height: 2.6em; + position: relative; + } + + //Show more content caret + a{ + + //show more content caret + &:after{ + content:"\f078"; + font-family: $icon-font-name; + font-size: 10px; + padding: 0 2px; + } + + //Show less content caret + &.active::after{ + content:"\f077"; + font-family: $icon-font-name; + } + + //Add ellipses to list before "show more" + &:not(.active):before{ + content: "..."; + font-size: 16px; + color: $tertiary_grey; + position: absolute; + top: -1em; + } + } + } + + /*Light grey boxes for metatype styling*/ + .elem-type{ + letter-spacing: .06em; + margin-right: 6px; + padding: 1px 5px; + white-space: nowrap; + margin: 3px; + display:inline-block; + font-size: 12px; + background: $highlight_grey; + @include border-radius(3px); + color: $ve-light-text-darker-1; + font-weight: 500; + //border: 1px solid $ve-silver-darker-1; + } + + /*pull in metatype wrapper to compensate for padding*/ + .elem-type-wrapper { + margin-left: -3px; + } + + /*Specific styling for last updated*/ + .elem-updated-wrapper { + color: $medium_grey; + font-size: 14px; + display: block; + } + + /*File icon for documents and views*/ + .elem-related-docs-wrapper mms-view-link a::before { + content: "\f15b"; + font-family: $icon-font-name; + padding: 0 4px 0 0; + font-size: .75em; + position: relative; + top: -.1em; + } +} diff --git a/src/assets/styles/components/_mms-toolbar.scss b/src/assets/styles/components/_mms-toolbar.scss new file mode 100755 index 000000000..df37f4da0 --- /dev/null +++ b/src/assets/styles/components/_mms-toolbar.scss @@ -0,0 +1,118 @@ +mms-toolbar { + .right-toolbar { + width: 41px; + height: 100%; + float: right; + background-color: $ve-slate-darker-2; + padding-top: 24px; + position: fixed; + @include calc(left, "100% - 41px"); + } + + .toolbox { + width: 100%; + background-color: $base_grey; + } + + .tools { + display: block; + height: 45px; + margin-bottom: 3px; + color: $black; + background-color: $tertiary_grey; + @include box-shadow(inset 7px 0 9px -7px $tool_inset); + text-align: center; + vertical-align: bottom; + font-size: 20px; + line-height: 45px; + + &:active { + background-color: $white; + @include box-shadow(none); + @include transition(all .2s linear); + } + + &:hover { + text-decoration: none; + color: $black !important; + cursor: pointer; + } + + .fa-edit-asterisk:before { + content:"\f044"; + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle; + } + .fa-edit-asterisk:after { + content:"\f069"; + color: $red; + position:absolute; + left:0; + width:100%; + text-align:right; + float:right; + margin-right:.4em; + margin-top:.4em; + font-size: 12px; + } + + .fa-save, .fa-send-o { + color: $brand_base; + } + + .fa-save-all { + color: $brand_base; + } + + .fa-save-all:before{ + content:"\f0c7"; + position:relative; + display:inline-block; + width:2em; + height:2em; + line-height:2em; + vertical-align:middle; + left:-6px; + bottom:-5px; + } + .fa-save-all:after { + content:"\f0c7"; + position:absolute; + left:0; + width:100%; + text-align:center; + float:right; + margin-left:.3em; + margin-top:.3em + } + .fa-times { + color: $red; + } + + .fa-plus { + color: $green; + } + + .fa-refresh { + color: $brand_base; + } + } + + .selected { + background-color: $white; + @include box-shadow(none); + } + + .dynamic { + @include box-shadow(none); + background-color: $white; + } + + .pulldown { + margin-top: 50px; + } +} diff --git a/src/assets/styles/components/_mms-transclude.scss b/src/assets/styles/components/_mms-transclude.scss new file mode 100755 index 000000000..ddaf7e85a --- /dev/null +++ b/src/assets/styles/components/_mms-transclude.scss @@ -0,0 +1,239 @@ +/* Stylesheet for transclusion-related elements */ +mms-transclude-doc, +mms-transclude-val > span, +mms-transclude-name > span, +mms-transclude-val > p, +mms-transclude-com, +mms-transclude-img { + cursor: pointer; + border-color: transparent; +} + +mms-view { + //set display inline for nested transcluded paragraphs and first p in table cells + //to prevent unwanted newlines and excessive spacing in table cells + mms-cf mms-cf{ + mms-transclude-doc { + > p:first-child { + display: inline; + } + } + } + table td mms-transclude-doc { + > p:first-child, > div:first-child { + display: inline; + } + } +} + +mms-view.outline, +mms-view.editing { + + /* Transclusions borders when editing mode */ + mms-transclude-doc, + mms-transclude-name > span, + mms-transclude-val > span, + mms-transclude-val > p { + @include transition(border .3s); + @include border-radius(5px); + border: 2px solid $ve-silver-darker-1; + cursor: pointer; + + // do we want this animation ? + &:hover{ + border-color: $tertiary_grey; + } + } + + mms-transclude-doc, mms-transclude-com { + display: block; + + .panel { + margin: 0px; + } + } +} + + +/* comments */ +mms-view mms-transclude-com, +mms-view.editing mms-transclude-com { + @include border-radius(5px); + background-color: lighten($yellow, 10%); + border: 2px solid darken($yellow, 10%); + padding: 2px; + display: block +} + +mms-view:not(.editing):not(.outline) { + .placeholder { + visibility: hidden; + } + + mms-view-para > mms-cf > mms-transclude-doc, + mms-view-list-t > mms-cf > mms-transclude-doc, + mms-view-table-t > mms-cf > mms-transclude-doc, + mms-view-figure > mms-cf > mms-transclude-doc, + mms-view-equation > mms-cf > mms-transclude-doc, + mms-view-section { + border: 2px solid white; + display: block; + } + + .view-title mms-transclude-name > span { + border: 2px solid white; + } +} + +mms-view:not(.reviewing) mms-transclude-com { + display: none; +} + +/*Add a name label that is hidden by default*/ +mms-transclude-name .input-group > .input-group-addon.transclude-name-label{ + position: absolute; + top: -1.8em; + display: table; + opacity: 0; + border-radius: 4px 4px 0 0; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + visibility: 0; + opacity: 0; + @include transition(all .3s); +} + +/*Label becomes visible on hover*/ +mms-transclude-name:hover .input-group > .input-group-addon.transclude-name-label{ + visibility: 1; + opacity: 1; +} + +/*------------------------------------------------------------------ +Element not found styling +-------------------------------------------------------------------*/ + +.mms-error{ + background: $ve-warning-orange-light; + background: repeating-linear-gradient(45deg, $white, $white 10px,$ve-warning-orange-light 10px,$ve-warning-orange-light 20px); + color: $black; + border: none; + padding-left: 11px; +} + +.mms-error::before{ + content: "\f071"; + font-family: fontAwesome; + margin-left: -14px; + color: $ve-warning-orange; + font-size: 12px; + position: absolute; +} + +.mms-error:hover{ + background: repeating-linear-gradient(45deg, $white, $white 10px,darken($ve-warning-orange-light, 10%) 10px,darken($ve-warning-orange-light, 10%) 20px); +} + +.pane-right .prop.mms-error { + margin-top: 10px; +} + +.mms-png { + display: none; +} + +figcaption, .mms-equation-caption, caption { + text-align: center; + font-weight: bold; + cursor: pointer; +} + +mms-transclude-img img { + display: block; + margin-left: auto; + margin-right: auto; +} + +.no-padding-panel { + padding: 0px; +} + +.item-type-View, +.item-type-Document, +.item-type-Group, +.pe-type-Paragraph, +.pe-type-ParagraphT, +.pe-type-Text, +.pe-type-TextT, +.pe-type-Table, +.pe-type-TableT, +.pe-type-Image, +.pe-type-ImageT, +.pe-type-Equation, +.pe-type-Comment{ + &::before{ + font-family: $icon-font-name; + padding-right: 4px; + } +} + +.item-type-Document::before, +.item-type-View::before{ + content: "\f15b"; +} +.item-type-Group::before{ + content: "\f07b"; + color: lighten($ve-accent, 20%); +} +.pe-type-Paragraph::before, +.pe-type-ParagraphT::before, +.pe-type-Text::before, +.pe-type-TextT::before{ + content: "\f1dd"; +} +.pe-type-Table::before, +.pe-type-TableT::before{ + content: "\f0ce"; +} +.pe-type-Image::before, +.pe-type-ImageT::before{ + content: "\f03e"; +} +.pe-type-Equation::before{ + content: "\f12b"; +} +.pe-type-Comment::before{ + content: "\f0e5"; +} + +/*set pseudoclass and reset italic from */ +.pe-type-Section::before, .pe-type-SectionT::before{ + content:"\00a7"; + font-style: normal; + font-weight: bold; + padding-right: 4px; +} + +//Make font weight of panel headings more readable +.panel-heading{ + line-height: 22px; + padding: 4px 8px; + h3{ + font-weight: $default_font_weight; + color: $ve-light-text-darker-1; + line-height: 28px; + } +} + +// Transclude edit panel buttons +.transclude-panel-toolbar { + .btn-tools { + @include button-variant($base_grey, $quaternary_grey, $quaternary_grey); + &:not(.dropdown-toggle) .fa { + padding-right: 0; + } + .caret{ + opacity: .4; + } + } +} diff --git a/src/styles/ve-components/components/_mms-tree.scss b/src/assets/styles/components/_mms-tree.scss old mode 100644 new mode 100755 similarity index 64% rename from src/styles/ve-components/components/_mms-tree.scss rename to src/assets/styles/components/_mms-tree.scss index 8d7827a97..e663195e4 --- a/src/styles/ve-components/components/_mms-tree.scss +++ b/src/assets/styles/components/_mms-tree.scss @@ -1,22 +1,19 @@ -@use "src/styles/globals"; - ul.abn-tree { font-size: 14px; cursor: pointer; li.abn-tree-row { width: 100%; - padding: 0; + padding: 0px; line-height: 1.8em; margin-top: 0; - div.tree-item { - @include globals.border-radius(0); - + a.tree-item { + @include border-radius(0); margin-top: 3px; margin-bottom: 3px; - margin-left: 10px; - color: globals.$black; + margin-left: 10px; + color: $black; text-decoration: none; white-space: nowrap; } @@ -42,15 +39,14 @@ ul.abn-tree { .shaft { width: 100%; - background: globals.$tertiary-grey; + background: $tertiary_grey; } .shaft-hidden { background: transparent; - - // @include globals.transition(globals.$background-hover-transition); + //@include transition($background_hover_transition); &:hover { - background: globals.$ve-silver-darker-1; + background: $ve-silver-darker-1; } } diff --git a/src/styles/ve-components/components/_mms-tsp-view.scss b/src/assets/styles/components/_mms-tsp-view.scss old mode 100644 new mode 100755 similarity index 93% rename from src/styles/ve-components/components/_mms-tsp-view.scss rename to src/assets/styles/components/_mms-tsp-view.scss index 6994a43ce..c957ca817 --- a/src/styles/ve-components/components/_mms-tsp-view.scss +++ b/src/assets/styles/components/_mms-tsp-view.scss @@ -3,7 +3,7 @@ // .tsSearchContainingToolbarPanel table.tsSearchBox { // background-color: #FFFFFF; // border: 1px solid #b0b09e; -// @include globals.border-radius(15px); +// @include border-radius(15px); // border-radius: 15px; // padding: 2px; // width: 180px !important; //Note: This should be set as !important when we define the element. Size should be set from Designer. @@ -37,7 +37,7 @@ table.tsSearchBox { // input[type="text"].tsSearchBoxInput { // font-size: 85%; // font-weight: normal; -// border: 0 solid #000000; +// border: 0px solid #000000; // outline: none; // width: 100%; // height: 14px; @@ -49,7 +49,7 @@ table.tsSearchBox { // input[type="text"].tsSearchBoxInput-watermark { // font-size: 85%; // font-weight: normal; -// border: 0 solid #000000; +// border: 0px solid #000000; // width: 100%; // height: 14px; // background-color: transparent; @@ -66,14 +66,14 @@ table.tsSearchBox { // .tsToolBar-horizontal td.tsToolBarSeparator { // width: 1px; -// // padding: 0; +// // padding: 0px; // border-right: 1px solid #c6c6c6; // // background: white; // } // .tsToolBar-vertical td.tsToolBarSeparator { // height: 1px; -// // padding: 0; +// // padding: 0px; // border-bottom: 1px solid #c6c6c6; // // background: white; // } @@ -83,23 +83,23 @@ td.tsToolbarItem { } // table.tsToolbarWidget { -// border: 0; +// border: 0px; // margin: 0em; -// padding: 0; +// padding: 0px; // border-collapse: separate; // } // .tsToolbarWidget table { -// border: 0; +// border: 0px; // margin: 0em; -// padding: 0; +// padding: 0px; // border-collapse: separate; // } // .tsToolbarWidget table>tbody>tr>td { // border: 1px; // margin: 0em; -// padding: 0; +// padding: 0px; // border-collapse: separate; // border-style: solid; // border-color: #cccc9922; @@ -127,9 +127,9 @@ td.tsToolbarItem { // } table.tsSearchBox tbody>tr>td { - border: 0; - margin: 0; - padding: 0; + border: 0px; + margin: 0em; + padding: 0px; border-collapse: separate; // background: transparent; // // border-radius: 15px; @@ -146,7 +146,7 @@ table.tsSearchBox tbody>tr>td { // .tsTree table>tbody>tr>td { // border: 1px; // margin: 0em; -// padding: 0; +// padding: 0px; // border-collapse: collapse; // border-style: none; // } @@ -154,7 +154,7 @@ table.tsSearchBox tbody>tr>td { // .tsTree table { // border: 1px; // margin: 0em; -// padding: 0; +// padding: 0px; // border-collapse: collapse; // border-style: none; // } @@ -250,4 +250,4 @@ table.tsSearchBox tbody>tr>td { // .tsDialogBox label { // margin: 0; -// } +// } \ No newline at end of file diff --git a/src/assets/styles/components/_mms-view.scss b/src/assets/styles/components/_mms-view.scss new file mode 100755 index 000000000..ea09e0823 --- /dev/null +++ b/src/assets/styles/components/_mms-view.scss @@ -0,0 +1,72 @@ +mms-view { + .ve-view-number { + float: left; + margin-right: 10px; + } + + .view-title, .section-title { + font-family: $light-font-family-sans-serif; + font-weight: $light_font_weight; + font-size: 35px; + margin-top: 20px; + margin-bottom: 15px; + } + + // Keep title the same size as reading + .view-title, .section-title { + .form-control{ + height: inherit; + font-size: inherit; + } + } + + &.editing { + mms-view-section { + display: block; + border: 2px solid $ve-silver-darker-1; + @include transition(border, .5s); + @include border-radius(5px); + } + } + &.outline:not(.editing) { + mms-view-section { + display: block; + border: 2px solid white; + } + } + + table { + @extend .table-condensed; + @extend .table-bordered; + p { + margin: 0px 0px 5px; + } + } + + .add-pe-button-container, .last-modified { + //opacity: 0; + display: block; + visibility: hidden; + } + + .read-width { + p, h1, h2, h3, h4, h5, h6, ol, ul { //figure, img, table, div + max-width: $pane_center_text_width; + } + } +} + +mms-view.editing, +mms-view.outline { + .last-modified { + //opacity: 1; + visibility: visible; + } +} + +mms-view.editing { + .add-pe-button-container { + //opacity: 1; + visibility: visible; + } +} diff --git a/src/assets/styles/mms-main.scss b/src/assets/styles/mms-main.scss new file mode 100755 index 000000000..376a061fd --- /dev/null +++ b/src/assets/styles/mms-main.scss @@ -0,0 +1,38 @@ +/************************* + Main combinator file for MMS + stylesheets. Comforms to the + MMS app design guide +*************************/ + +/* Variables & mixins */ +@import "base/mms-mixins"; +@import "base/mms-colors"; +@import "base/mms-typography"; + +/* A minimal Bootstrap file */ +@import "vendors/bootstrap/styles"; + +/* App level customizations */ +@import "base/mms-globals"; + +/* Tom Sawyer Perspectives View customizations */ +@import "components/mms-tsp-view"; + + +/* Other customizations */ +@import "components/mms-add-pe-button"; +@import "components/mms-buttons"; +@import "components/mms-tree"; +@import "components/mms-transclude"; +@import "components/mms-toolbar"; +@import "components/mms-spec"; +@import "components/mms-view"; +// @import "components/mms-cf-modal"; +@import "components/mms-search"; +@import "components/mms-editor"; +@import "components/mms-misc-components"; +@import "components/mms-autocomplete-modal"; +@import "components/mms-history"; +@import "components/mms-jobs"; +@import "../../directives/charts/mms-d3-chart"; +@import "components/mms-mention"; diff --git a/src/styles/third-party/_bootstrap-variables.scss b/src/assets/styles/vendors/bootstrap/_bootstrap-variables.scss old mode 100644 new mode 100755 similarity index 65% rename from src/styles/third-party/_bootstrap-variables.scss rename to src/assets/styles/vendors/bootstrap/_bootstrap-variables.scss index d33e84131..2de08911e --- a/src/styles/third-party/_bootstrap-variables.scss +++ b/src/assets/styles/vendors/bootstrap/_bootstrap-variables.scss @@ -1,105 +1,97 @@ -@use "sass:color"; - -/* VE base styles */ -@use "src/styles/globals"; -@use "src/styles/third-party/bootstrap/variables" as bootstrap; - -@forward "src/styles/third-party/bootstrap/variables"; - // Override Bootstrap variables here (defaults from bootstrap-sass v3.3.7): -/* +// // Variables --------------------------------------------------- */ +// -------------------------------------------------- -// == Colors -// ## Gray and brand colors for use across Bootstrap. +//== Colors +// +//## Gray and brand colors for use across Bootstrap. // $gray-base: #000 -// $gray-darker: color.scale($gray-base, $lightness: 13.5%); // #222 +// $gray-darker: lighten($gray-base, 13.5%) // #222 // $gray-dark: lighten($gray-base, 20%) // #333 -// $gray: color.scale($gray-base, $lightness: 33.5%); // #555 -// $gray-light: color.scale($gray-base, $lightness: 46.7%); // #777 -// $gray-lighter: color.scale($gray-base, $lightness: 93.5%); // #eee +// $gray: lighten($gray-base, 33.5%) // #555 +// $gray-light: lighten($gray-base, 46.7%) // #777 +// $gray-lighter: lighten($gray-base, 93.5%) // #eee -$brand-primary: globals.$brand-base; // #337ab7 +$brand-primary: $brand_base; // #337ab7 // $brand-success: #5cb85c // $brand-info: #5bc0de -$brand-warning: globals.$ve-warning; - +$brand-warning: $ve-warning; // $brand-danger: #d9534f -// == Scaffolding -// ## Settings for some of the most global styles. +//== Scaffolding +// +//## Settings for some of the most global styles. -// ** Background color for ``. +//** Background color for ``. // $body-bg: #fff -// ** Global text color on ``. +//** Global text color on ``. // $text-color: $gray-dark -// ** Global textual link color. -$link-color: globals.$link-blue; - -// ** Link hover color set via `darken()` function. +//** Global textual link color. +$link-color: $link_blue; +//** Link hover color set via `darken()` function. // $link-hover-color: darken($link-color, 15%) -// ** Link hover decoration. +//** Link hover decoration. // $link-hover-decoration: underline -// == Typography -// ## Font, line-height, and color for body text, headings, and more. +//== Typography +// +//## Font, line-height, and color for body text, headings, and more. // $font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif // $font-family-serif: Georgia, "Times New Roman", Times, serif -// ** Default monospace fonts for ``, ``, and `
`.
+//** Default monospace fonts for ``, ``, and `
`.
 // $font-family-monospace:   Menlo, Monaco, Consolas, "Courier New", monospace
 // $font-family-base:        $font-family-sans-serif
 
-$font-size-base: 14px;
-
-// $font-size-large:        math.ceil(($font-size-base * 1.25)) // ~18px
-// $font-size-small:        math.ceil(($font-size-base * 0.85)) // ~12px
+// $font-size-base:          14px
+// $font-size-large:         ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-small:         ceil(($font-size-base * 0.85)) // ~12px
 
-// $font-size-h1:           math.floor(($font-size-base * 2.6)) // ~36px
-// $font-size-h2:           math.floor(($font-size-base * 2.15)) // ~30px
-// $font-size-h3:           math.ceil(($font-size-base * 1.7)) // ~24px
-// $font-size-h4:           math.ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-h1:            floor(($font-size-base * 2.6)) // ~36px
+// $font-size-h2:            floor(($font-size-base * 2.15)) // ~30px
+// $font-size-h3:            ceil(($font-size-base * 1.7)) // ~24px
+// $font-size-h4:            ceil(($font-size-base * 1.25)) // ~18px
 // $font-size-h5:            $font-size-base
-// $font-size-h6:           math.ceil(($font-size-base * 0.85)) // ~12px
+// $font-size-h6:            ceil(($font-size-base * 0.85)) // ~12px
 
-// ** Unit-less `line-height` for use in components like buttons.
+//** Unit-less `line-height` for use in components like buttons.
 // $line-height-base:        1.428571429 // 20/14
-// ** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
-// $line-height-computed:   math.floor(($font-size-base * $line-height-base)) // ~20px
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+// $line-height-computed:    floor(($font-size-base * $line-height-base)) // ~20px
 
-// ** By default, this inherits from the ``.
+//** By default, this inherits from the ``.
 // $headings-font-family:    inherit
-$headings-font-weight: 500;
-$headings-line-height: 1.1;
+// $headings-font-weight:    500
+// $headings-line-height:    1.1
 // $headings-color:          inherit
 
-// == Iconography
 
-// ## Specify custom location and filename of the included Glyphicons icon font.
-// Useful for those including Bootstrap via Bower.
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
 
-// ** Load fonts from this directory.
+//** Load fonts from this directory.
 
 // [converter] If $bootstrap-sass-asset-helper if used, provide path relative to the assets load path.
 // [converter] This is because some asset helpers, such as Sprockets, do not work with file-relative paths.
 // $icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/")
 
-// ** File name for all font files.
+//** File name for all font files.
 // $icon-font-name:          "glyphicons-halflings-regular"
-// ** Element ID within SVG icon file.
-// $icon-font-svg-id:        "glyphicons-halflingsregular"
+//** Element ID within SVG icon file.
+// $icon-font-svg-id:        "glyphicons_halflingsregular"
 
-// == Components
 
-// ## Define common padding and border radius sizes and more.
-// Values based on 14px text and 1.428 line-height (~20px to start).
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
 
 // $padding-base-vertical:     6px
 // $padding-base-horizontal:   12px
@@ -120,45 +112,47 @@ $headings-line-height: 1.1;
 // $border-radius-large:       6px
 // $border-radius-small:       3px
 
-// ** Global color for active items (e.g., navs or dropdowns).
+//** Global color for active items (e.g., navs or dropdowns).
 // $component-active-color:    #fff
-// ** Global background color for active items (e.g., navs or dropdowns).
+//** Global background color for active items (e.g., navs or dropdowns).
 // $component-active-bg:       $brand-primary
 
-// ** Width of the `border` for generating carets that indicate dropdowns.
+//** Width of the `border` for generating carets that indicate dropdowns.
 // $caret-width-base:          4px
-// ** Carets increase slightly in size for larger components.
+//** Carets increase slightly in size for larger components.
 // $caret-width-large:         5px
 
-// == Tables
 
-// ## Customizes the `.table` component with basic values, each used across all table variations.
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
 
-// ** Padding for ``s and ``s.
+//** Padding for ``s and ``s.
 // $table-cell-padding:            8px
-// ** Padding for cells in `.table-condensed`.
+//** Padding for cells in `.table-condensed`.
 // $table-condensed-cell-padding:  5px
 
-// ** Default background color used for all tables.
+//** Default background color used for all tables.
 // $table-bg:                      transparent
-// ** Background color used for `.table-striped`.
+//** Background color used for `.table-striped`.
 // $table-bg-accent:               #f9f9f9
-// ** Background color used for `.table-hover`.
+//** Background color used for `.table-hover`.
 // $table-bg-hover:                #f5f5f5
 // $table-bg-active:               $table-bg-hover
 
-// ** Border color for table and cell borders.
+//** Border color for table and cell borders.
 // $table-border-color:            #ddd
 
-// == Buttons
 
-// ## For each of Bootstrap's buttons, define text, background and border color.
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
 
 // $btn-font-weight:                normal
 
-$btn-default-color: globals.$ve-light-text;
-$btn-default-bg: globals.$ve-silver-base;
-$btn-default-border: globals.$ve-silver-base;
+$btn-default-color:              $ve-light-text;
+$btn-default-bg:                 $ve-silver-base;
+$btn-default-border:             $ve-silver-base;
 
 // $btn-primary-color:              #fff
 // $btn-primary-bg:                 $brand-primary
@@ -168,9 +162,9 @@ $btn-default-border: globals.$ve-silver-base;
 // $btn-success-bg:                 $brand-success
 // $btn-success-border:             darken($btn-success-bg, 5%)
 
-$btn-info-color: globals.$ve-light-text;
-$btn-info-bg: globals.$ve-slate-base;
-$btn-info-border: color.scale($btn-info-bg, $lightness: -5%);
+// $btn-info-color:                 #fff
+// $btn-info-bg:                    $brand-info
+// $btn-info-border:                darken($btn-info-bg, 5%)
 
 // $btn-warning-color:              #fff
 // $btn-warning-bg:                 $brand-warning
@@ -187,95 +181,98 @@ $btn-info-border: color.scale($btn-info-bg, $lightness: -5%);
 // $btn-border-radius-large:        $border-radius-large
 // $btn-border-radius-small:        $border-radius-small
 
-// == Forms
 
-// ##
+//== Forms
+//
+//##
 
-// ** `` background color
+//** `` background color
 // $input-bg:                       #fff
-// ** `` background color
+//** `` background color
 // $input-bg-disabled:              $gray-lighter
 
-// ** Text color for ``s
+//** Text color for ``s
 // $input-color:                    $gray
-// ** `` border color
+//** `` border color
 // $input-border:                   #ccc
 
 // TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
-// ** Default `.form-control` border radius
+//** Default `.form-control` border radius
 // This has no effect on ``s in CSS.
 // $input-border-radius:            $border-radius-base
-// ** Large `.form-control` border radius
+//** Large `.form-control` border radius
 // $input-border-radius-large:      $border-radius-large
-// ** Small `.form-control` border radius
+//** Small `.form-control` border radius
 // $input-border-radius-small:      $border-radius-small
 
-// ** Border color for inputs on focus
+//** Border color for inputs on focus
 // $input-border-focus:             #66afe9
 
-// ** Placeholder text color
+//** Placeholder text color
 // $input-color-placeholder:        #999
 
-// ** Default `.form-control` height
+//** Default `.form-control` height
 // $input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2)
-// ** Large `.form-control` height
+//** Large `.form-control` height
 // $input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2)
-// ** Small `.form-control` height
+//** Small `.form-control` height
 // $input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2)
 
-// ** `.form-group` margin
+//** `.form-group` margin
 // $form-group-margin-bottom:       15px
 
 // $legend-color:                   $gray-dark
 // $legend-border-color:            #e5e5e5
 
-// ** Background color for textual input addons
+//** Background color for textual input addons
 // $input-group-addon-bg:           $gray-lighter
-// ** Border color for textual input addons
+//** Border color for textual input addons
 // $input-group-addon-border-color: $input-border
 
-// ** Disabled cursor for form controls and buttons.
+//** Disabled cursor for form controls and buttons.
 // $cursor-disabled:                not-allowed
 
-// == Dropdowns
 
-// ## Dropdown menu container and contents.
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
 
-// ** Background for the dropdown menu.
+//** Background for the dropdown menu.
 // $dropdown-bg:                    #fff
-// ** Dropdown menu `border-color`.
+//** Dropdown menu `border-color`.
 // $dropdown-border:                rgba(0,0,0,.15)
-// ** Dropdown menu `border-color` **for IE8**.
+//** Dropdown menu `border-color` **for IE8**.
 // $dropdown-fallback-border:       #ccc
-// ** Divider color for between dropdown items.
+//** Divider color for between dropdown items.
 // $dropdown-divider-bg:            #e5e5e5
 
-// ** Dropdown link text color.
+//** Dropdown link text color.
 // $dropdown-link-color:            $gray-dark
-// ** Hover color for dropdown links.
+//** Hover color for dropdown links.
 // $dropdown-link-hover-color:      darken($gray-dark, 5%)
-// ** Hover background for dropdown links.
+//** Hover background for dropdown links.
 // $dropdown-link-hover-bg:         #f5f5f5
 
-// ** Active dropdown menu item text color.
+//** Active dropdown menu item text color.
 // $dropdown-link-active-color:     $component-active-color
-// ** Active dropdown menu item background color.
+//** Active dropdown menu item background color.
 // $dropdown-link-active-bg:        $component-active-bg
 
-// ** Disabled dropdown menu item background color.
-$dropdown-link-disabled-color: bootstrap.$gray-light;
+//** Disabled dropdown menu item background color.
+// $dropdown-link-disabled-color:   $gray-light
 
-// ** Text color for headers within dropdown menus.
+//** Text color for headers within dropdown menus.
 // $dropdown-header-color:          $gray-light
 
-// ** Deprecated `$dropdown-caret-color` as of v3.1.0
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
 // $dropdown-caret-color:           #000
 
-// -- Z-index master list
 
+//-- Z-index master list
+//
 // Warning: Avoid customizing these values. They're used for a bird's eye view
 // of components dependent on the z-axis and are designed to all work together.
-
+//
 // Note: These variables are not generated into the Customizer.
 
 // $zindex-navbar:            1000
@@ -286,37 +283,38 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $zindex-modal-background:  1040
 // $zindex-modal:             1050
 
-// == Media queries breakpoints
 
-// ## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
 
 // Extra small screen / phone
-// ** Deprecated `$screen-xs` as of v3.0.1
+//** Deprecated `$screen-xs` as of v3.0.1
 // $screen-xs:                  480px
-// ** Deprecated `$screen-xs-min` as of v3.2.0
+//** Deprecated `$screen-xs-min` as of v3.2.0
 // $screen-xs-min:              $screen-xs
-// ** Deprecated `$screen-phone` as of v3.0.1
+//** Deprecated `$screen-phone` as of v3.0.1
 // $screen-phone:               $screen-xs-min
 
 // Small screen / tablet
-// ** Deprecated `$screen-sm` as of v3.0.1
+//** Deprecated `$screen-sm` as of v3.0.1
 // $screen-sm:                  768px
 // $screen-sm-min:              $screen-sm
-// ** Deprecated `$screen-tablet` as of v3.0.1
+//** Deprecated `$screen-tablet` as of v3.0.1
 // $screen-tablet:              $screen-sm-min
 
 // Medium screen / desktop
-// ** Deprecated `$screen-md` as of v3.0.1
+//** Deprecated `$screen-md` as of v3.0.1
 // $screen-md:                  992px
 // $screen-md-min:              $screen-md
-// ** Deprecated `$screen-desktop` as of v3.0.1
+//** Deprecated `$screen-desktop` as of v3.0.1
 // $screen-desktop:             $screen-md-min
 
 // Large screen / wide desktop
-// ** Deprecated `$screen-lg` as of v3.0.1
+//** Deprecated `$screen-lg` as of v3.0.1
 // $screen-lg:                  1200px
 // $screen-lg-min:              $screen-lg
-// ** Deprecated `$screen-lg-desktop` as of v3.0.1
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
 // $screen-lg-desktop:          $screen-lg-min
 
 // So media queries don't overlap when required, provide a maximum
@@ -324,61 +322,64 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $screen-sm-max:              ($screen-md-min - 1)
 // $screen-md-max:              ($screen-lg-min - 1)
 
-// == Grid system
 
-// ## Define your custom responsive grid.
+//== Grid system
+//
+//## Define your custom responsive grid.
 
-// ** Number of columns in the grid.
+//** Number of columns in the grid.
 // $grid-columns:              12
-// ** Padding between columns. Gets divided in half for the left and right.
+//** Padding between columns. Gets divided in half for the left and right.
 // $grid-gutter-width:         30px
 // Navbar collapse
-// ** Point at which the navbar becomes uncollapsed.
+//** Point at which the navbar becomes uncollapsed.
 // $grid-float-breakpoint:     $screen-sm-min
-// ** Point at which the navbar begins collapsing.
+//** Point at which the navbar begins collapsing.
 // $grid-float-breakpoint-max: ($grid-float-breakpoint - 1)
 
-// == Container sizes
 
-// ## Define the maximum width of `.container` for different screen sizes.
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
 
 // Small screen / tablet
 // $container-tablet:             (720px + $grid-gutter-width)
-// ** For `$screen-sm-min` and up.
+//** For `$screen-sm-min` and up.
 // $container-sm:                 $container-tablet
 
 // Medium screen / desktop
 // $container-desktop:            (940px + $grid-gutter-width)
-// ** For `$screen-md-min` and up.
+//** For `$screen-md-min` and up.
 // $container-md:                 $container-desktop
 
 // Large screen / wide desktop
 // $container-large-desktop:      (1140px + $grid-gutter-width)
-// ** For `$screen-lg-min` and up.
+//** For `$screen-lg-min` and up.
 // $container-lg:                 $container-large-desktop
 
-// == Navbar
 
-// ##
+//== Navbar
+//
+//##
 
 // Basics of a navbar
 // $navbar-height:                    50px
 // $navbar-margin-bottom:             $line-height-computed
 // $navbar-border-radius:             $border-radius-base
-// $navbar-padding-horizontal:       math.floor(($grid-gutter-width / 2))
+// $navbar-padding-horizontal:        floor(($grid-gutter-width / 2))
 // $navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2)
 // $navbar-collapse-max-height:       340px
 
 // $navbar-default-color:             #777
 // $navbar-default-bg:                #f8f8f8
-// $navbar-default-border:            color.scale($navbar-default-bg, $lightness: -6.5%);
+// $navbar-default-border:            darken($navbar-default-bg, 6.5%)
 
 // Navbar links
 // $navbar-default-link-color:                #777
 // $navbar-default-link-hover-color:          #333
 // $navbar-default-link-hover-bg:             transparent
 // $navbar-default-link-active-color:         #555
-// $navbar-default-link-active-bg:            color.scale($navbar-default-bg, $lightness: -6.5%);
+// $navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%)
 // $navbar-default-link-disabled-color:       #ccc
 // $navbar-default-link-disabled-bg:          transparent
 
@@ -392,7 +393,8 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $navbar-default-toggle-icon-bar-bg:        #888
 // $navbar-default-toggle-border-color:       #ddd
 
-// === Inverted navbar
+
+//=== Inverted navbar
 // Reset inverted navbar basics
 // $navbar-inverse-color:                      lighten($gray-light, 15%)
 // $navbar-inverse-bg:                         #222
@@ -417,18 +419,19 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $navbar-inverse-toggle-icon-bar-bg:         #fff
 // $navbar-inverse-toggle-border-color:        #333
 
-// == Navs
 
-// ##
+//== Navs
+//
+//##
 
-// === Shared nav styles
+//=== Shared nav styles
 // $nav-link-padding:                          10px 15px
 // $nav-link-hover-bg:                         $gray-lighter
 
 // $nav-disabled-link-color:                   $gray-light
 // $nav-disabled-link-hover-color:             $gray-light
 
-// == Tabs
+//== Tabs
 // $nav-tabs-border-color:                     #ddd
 
 // $nav-tabs-link-hover-border-color:          $gray-lighter
@@ -440,14 +443,15 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $nav-tabs-justified-link-border-color:            #ddd
 // $nav-tabs-justified-active-link-border-color:     $body-bg
 
-// == Pills
+//== Pills
 // $nav-pills-border-radius:                   $border-radius-base
 // $nav-pills-active-link-hover-bg:            $component-active-bg
 // $nav-pills-active-link-hover-color:         $component-active-color
 
-// == Pagination
 
-// ##
+//== Pagination
+//
+//##
 
 // $pagination-color:                     $link-color
 // $pagination-bg:                        #fff
@@ -465,9 +469,10 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $pagination-disabled-bg:               #fff
 // $pagination-disabled-border:           #ddd
 
-// == Pager
 
-// ##
+//== Pager
+//
+//##
 
 // $pager-bg:                             $pagination-bg
 // $pager-border:                         $pagination-border
@@ -480,20 +485,22 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 
 // $pager-disabled-color:                 $pagination-disabled-color
 
-// == Jumbotron
 
-// ##
+//== Jumbotron
+//
+//##
 
 // $jumbotron-padding:              30px
 // $jumbotron-color:                inherit
 // $jumbotron-bg:                   $gray-lighter
 // $jumbotron-heading-color:        inherit
-// $jumbotron-font-size:           math.ceil(($font-size-base * 1.5))
-// $jumbotron-heading-font-size:   math.ceil(($font-size-base * 4.5))
+// $jumbotron-font-size:            ceil(($font-size-base * 1.5))
+// $jumbotron-heading-font-size:    ceil(($font-size-base * 4.5))
 
-// == Form states and alerts
 
-// ## Define colors for form feedback states and, by default, alerts.
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
 
 // $state-success-text:             #3c763d
 // $state-success-bg:               #dff0d8
@@ -511,108 +518,113 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $state-danger-bg:                #f2dede
 // $state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%)
 
-// == Tooltips
 
-// ##
+//== Tooltips
+//
+//##
 
-// ** Tooltip max width
+//** Tooltip max width
 // $tooltip-max-width:           200px
-// ** Tooltip text color
+//** Tooltip text color
 // $tooltip-color:               #fff
-// ** Tooltip background color
+//** Tooltip background color
 // $tooltip-bg:                  #000
 // $tooltip-opacity:             .9
 
-// ** Tooltip arrow width
+//** Tooltip arrow width
 // $tooltip-arrow-width:         5px
-// ** Tooltip arrow color
+//** Tooltip arrow color
 // $tooltip-arrow-color:         $tooltip-bg
 
-// == Popovers
 
-// ##
+//== Popovers
+//
+//##
 
-// ** Popover body background color
+//** Popover body background color
 // $popover-bg:                          #fff
-// ** Popover maximum width
+//** Popover maximum width
 // $popover-max-width:                   276px
-// ** Popover border color
+//** Popover border color
 // $popover-border-color:                rgba(0,0,0,.2)
-// ** Popover fallback border color
+//** Popover fallback border color
 // $popover-fallback-border-color:       #ccc
 
-// ** Popover title background color
+//** Popover title background color
 // $popover-title-bg:                    darken($popover-bg, 3%)
 
-// ** Popover arrow width
+//** Popover arrow width
 // $popover-arrow-width:                 10px
-// ** Popover arrow color
+//** Popover arrow color
 // $popover-arrow-color:                 $popover-bg
 
-// ** Popover outer arrow width
+//** Popover outer arrow width
 // $popover-arrow-outer-width:           ($popover-arrow-width + 1)
-// ** Popover outer arrow color
-// $popover-arrow-outer-color:           fade-in($popover-border-color, 0.05)
-// ** Popover outer arrow fallback color
+//** Popover outer arrow color
+// $popover-arrow-outer-color:           fade_in($popover-border-color, 0.05)
+//** Popover outer arrow fallback color
 // $popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%)
 
-// == Labels
 
-// ##
+//== Labels
+//
+//##
 
-// ** Default label background color
+//** Default label background color
 // $label-default-bg:            $gray-light
-// ** Primary label background color
+//** Primary label background color
 // $label-primary-bg:            $brand-primary
-// ** Success label background color
+//** Success label background color
 // $label-success-bg:            $brand-success
-// ** Info label background color
+//** Info label background color
 // $label-info-bg:               $brand-info
-// ** Warning label background color
+//** Warning label background color
 // $label-warning-bg:            $brand-warning
-// ** Danger label background color
+//** Danger label background color
 // $label-danger-bg:             $brand-danger
 
-// ** Default label text color
+//** Default label text color
 // $label-color:                 #fff
-// ** Default text color of a linked label
+//** Default text color of a linked label
 // $label-link-hover-color:      #fff
 
-// == Modals
 
-// ##
+//== Modals
+//
+//##
 
-// ** Padding applied to the modal body
+//** Padding applied to the modal body
 // $modal-inner-padding:         15px
 
-// ** Padding applied to the modal title
+//** Padding applied to the modal title
 // $modal-title-padding:         15px
-// ** Modal title line-height
+//** Modal title line-height
 // $modal-title-line-height:     $line-height-base
 
-// ** Background color of modal content area
+//** Background color of modal content area
 // $modal-content-bg:                             #fff
-// ** Modal content border color
+//** Modal content border color
 // $modal-content-border-color:                   rgba(0,0,0,.2)
-// ** Modal content border color **for IE8**
+//** Modal content border color **for IE8**
 // $modal-content-fallback-border-color:          #999
 
-// ** Modal backdrop background color
+//** Modal backdrop background color
 // $modal-backdrop-bg:           #000
-// ** Modal backdrop opacity
+//** Modal backdrop opacity
 // $modal-backdrop-opacity:      .5
-// ** Modal header border color
+//** Modal header border color
 // $modal-header-border-color:   #e5e5e5
-// ** Modal footer border color
+//** Modal footer border color
 // $modal-footer-border-color:   $modal-header-border-color
 
 // $modal-lg:                    900px
 // $modal-md:                    600px
 // $modal-sm:                    300px
 
-// == Alerts
 
-// ## Define alert colors, border radius, and padding.
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
 
 // $alert-padding:               15px
 // $alert-border-radius:         $border-radius-base
@@ -634,64 +646,67 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $alert-danger-text:           $state-danger-text
 // $alert-danger-border:         $state-danger-border
 
-// == Progress bars
 
-// ##
+//== Progress bars
+//
+//##
 
-// ** Background color of the whole progress component
+//** Background color of the whole progress component
 // $progress-bg:                 #f5f5f5
-// ** Progress bar text color
+//** Progress bar text color
 // $progress-bar-color:          #fff
-// ** Variable for setting rounded corners on progress bar.
+//** Variable for setting rounded corners on progress bar.
 // $progress-border-radius:      $border-radius-base
 
-// ** Default progress bar color
+//** Default progress bar color
 // $progress-bar-bg:             $brand-primary
-// ** Success progress bar color
+//** Success progress bar color
 // $progress-bar-success-bg:     $brand-success
-// ** Warning progress bar color
+//** Warning progress bar color
 // $progress-bar-warning-bg:     $brand-warning
-// ** Danger progress bar color
+//** Danger progress bar color
 // $progress-bar-danger-bg:      $brand-danger
-// ** Info progress bar color
+//** Info progress bar color
 // $progress-bar-info-bg:        $brand-info
 
-// == List group
 
-// ##
+//== List group
+//
+//##
 
-// ** Background color on `.list-group-item`
+//** Background color on `.list-group-item`
 // $list-group-bg:                 #fff
-// ** `.list-group-item` border color
+//** `.list-group-item` border color
 // $list-group-border:             #ddd
-// ** List group border radius
+//** List group border radius
 // $list-group-border-radius:      $border-radius-base
 
-// ** Background color of single list items on hover
+//** Background color of single list items on hover
 // $list-group-hover-bg:           #f5f5f5
-// ** Text color of active list items
+//** Text color of active list items
 // $list-group-active-color:       $component-active-color
-// ** Background color of active list items
+//** Background color of active list items
 // $list-group-active-bg:          $component-active-bg
-// ** Border color of active list elements
+//** Border color of active list elements
 // $list-group-active-border:      $list-group-active-bg
-// ** Text color for content within active list items
+//** Text color for content within active list items
 // $list-group-active-text-color:  lighten($list-group-active-bg, 40%)
 
-// ** Text color of disabled list items
+//** Text color of disabled list items
 // $list-group-disabled-color:      $gray-light
-// ** Background color of disabled list items
+//** Background color of disabled list items
 // $list-group-disabled-bg:         $gray-lighter
-// ** Text color for content within disabled list items
+//** Text color for content within disabled list items
 // $list-group-disabled-text-color: $list-group-disabled-color
 
 // $list-group-link-color:         #555
 // $list-group-link-hover-color:   $list-group-link-color
 // $list-group-link-heading-color: #333
 
-// == Panels
 
-// ##
+//== Panels
+//
+//##
 
 // $panel-bg:                    #fff
 // $panel-body-padding:          15px
@@ -699,7 +714,7 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $panel-footer-padding:        $panel-heading-padding
 // $panel-border-radius:         $border-radius-base
 
-// ** Border color for elements within panels
+//** Border color for elements within panels
 // $panel-inner-border:          #ddd
 // $panel-footer-bg:             #f5f5f5
 
@@ -727,67 +742,72 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 // $panel-danger-border:         $state-danger-border
 // $panel-danger-heading-bg:     $state-danger-bg
 
-// == Thumbnails
 
-// ##
+//== Thumbnails
+//
+//##
 
-// ** Padding around the thumbnail image
+//** Padding around the thumbnail image
 // $thumbnail-padding:           4px
-// ** Thumbnail background color
+//** Thumbnail background color
 // $thumbnail-bg:                $body-bg
-// ** Thumbnail border color
+//** Thumbnail border color
 // $thumbnail-border:            #ddd
-// ** Thumbnail border radius
+//** Thumbnail border radius
 // $thumbnail-border-radius:     $border-radius-base
 
-// ** Custom text color for thumbnail captions
+//** Custom text color for thumbnail captions
 // $thumbnail-caption-color:     $text-color
-// ** Padding around the thumbnail caption
+//** Padding around the thumbnail caption
 // $thumbnail-caption-padding:   9px
 
-// == Wells
 
-// ##
+//== Wells
+//
+//##
 
 // $well-bg:                     #f5f5f5
 // $well-border:                 darken($well-bg, 7%)
 
-// == Badges
 
-// ##
+//== Badges
+//
+//##
 
 // $badge-color:                 #fff
-// ** Linked badge text color on hover
+//** Linked badge text color on hover
 // $badge-link-hover-color:      #fff
 // $badge-bg:                    $gray-light
 
-// ** Badge text color in active nav link
+//** Badge text color in active nav link
 // $badge-active-color:          $link-color
-// ** Badge background color in active nav link
+//** Badge background color in active nav link
 // $badge-active-bg:             #fff
 
 // $badge-font-weight:           bold
 // $badge-line-height:           1
 // $badge-border-radius:         10px
 
-// == Breadcrumbs
 
-// ##
+//== Breadcrumbs
+//
+//##
 
 // $breadcrumb-padding-vertical:   8px
 // $breadcrumb-padding-horizontal: 15px
-// ** Breadcrumb background color
+//** Breadcrumb background color
 // $breadcrumb-bg:                 #f5f5f5
-// ** Breadcrumb text color
+//** Breadcrumb text color
 // $breadcrumb-color:              #ccc
-// ** Text color of current page in the breadcrumb
+//** Text color of current page in the breadcrumb
 // $breadcrumb-active-color:       $gray-light
-// ** Textual separator for between breadcrumb elements
+//** Textual separator for between breadcrumb elements
 // $breadcrumb-separator:          "/"
 
-// == Carousel
 
-// ##
+//== Carousel
+//
+//##
 
 // $carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6)
 
@@ -801,22 +821,24 @@ $dropdown-link-disabled-color: bootstrap.$gray-light;
 
 // $carousel-caption-color:                      #fff
 
-// == Close
 
-// ##
+//== Close
+//
+//##
 
 // $close-font-weight:           bold
 // $close-color:                 #000
 // $close-text-shadow:           0 1px 0 #fff
 
-// == Code
 
-// ##
+//== Code
+//
+//##
 
 // $code-color:                  #c7254e
 // $code-bg:                     #f9f2f4
-$code-color: #000;
-$code-bg: transparent;
+$code-color:                  #000000;
+$code-bg:                     transparent;
 
 // $kbd-color:                   #fff
 // $kbd-bg:                      #333
@@ -826,29 +848,30 @@ $code-bg: transparent;
 // $pre-border-color:            #ccc
 // $pre-scrollable-max-height:   340px
 
-// == Type
 
-// ##
+//== Type
+//
+//##
 
-// ** Horizontal offset for forms and lists.
+//** Horizontal offset for forms and lists.
 // $component-offset-horizontal: 180px
-// ** Text muted color
+//** Text muted color
 // $text-muted:                  $gray-light
-// ** Abbreviations and acronyms border color
+//** Abbreviations and acronyms border color
 // $abbr-border-color:           $gray-light
-// ** Headings small color
+//** Headings small color
 // $headings-small-color:        $gray-light
-// ** Blockquote small color
+//** Blockquote small color
 // $blockquote-small-color:      $gray-light
-// ** Blockquote font size
+//** Blockquote font size
 // $blockquote-font-size:        ($font-size-base * 1.25)
-// ** Blockquote border color
+//** Blockquote border color
 // $blockquote-border-color:     $gray-lighter
-// ** Page header border color
+//** Page header border color
 // $page-header-border-color:    $gray-lighter
-// ** Width of horizontal description list titles
+//** Width of horizontal description list titles
 // $dl-horizontal-offset:        $component-offset-horizontal
-// ** Point at which .dl-horizontal becomes horizontal
+//** Point at which .dl-horizontal becomes horizontal
 // $dl-horizontal-breakpoint:    $grid-float-breakpoint
-// ** Horizontal line color.
+//** Horizontal line color.
 // $hr-border:                   $gray-lighter
diff --git a/src/assets/styles/vendors/bootstrap/styles.sass b/src/assets/styles/vendors/bootstrap/styles.sass
new file mode 100755
index 000000000..32a32191e
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/styles.sass
@@ -0,0 +1,6 @@
+// Import Bootstrap Compass integration
+//@import "bootstrap-compass"
+// Import custom Bootstrap variables
+@import "bootstrap-variables"
+// Import Bootstrap for Sass
+@import "stylesheets/bootstrap"
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-compass.scss b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-compass.scss
new file mode 100755
index 000000000..8fbc3cda5
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-compass.scss
@@ -0,0 +1,9 @@
+@function twbs-font-path($path) {
+  @return font-url($path, true);
+}
+
+@function twbs-image-path($path) {
+  @return image-url($path, true);
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-mincer.scss b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-mincer.scss
new file mode 100755
index 000000000..0c4655e32
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-mincer.scss
@@ -0,0 +1,19 @@
+// Mincer asset helper functions
+//
+// This must be imported into a .css.ejs.scss file.
+// Then, <% %>-interpolations will be parsed as strings by Sass, and evaluated by EJS after Sass compilation.
+
+
+@function twbs-font-path($path) {
+  // do something like following
+  // from "path/to/font.ext#suffix" to "<%- asset_path(path/to/font.ext)) + #suffix %>"
+  // from "path/to/font.ext?#suffix" to "<%- asset_path(path/to/font.ext)) + ?#suffix %>"
+  // or from "path/to/font.ext" just "<%- asset_path(path/to/font.ext)) %>"
+  @return "<%- asset_path("#{$path}".replace(/[#?].*$/, '')) + "#{$path}".replace(/(^[^#?]*)([#?]?.*$)/, '$2') %>";
+}
+
+@function twbs-image-path($file) {
+  @return "<%- asset_path("#{$file}") %>";
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-sprockets.scss b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-sprockets.scss
new file mode 100755
index 000000000..9fffc1eb4
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap-sprockets.scss
@@ -0,0 +1,9 @@
+@function twbs-font-path($path) {
+  @return font-path($path);
+}
+
+@function twbs-image-path($path) {
+  @return image-path($path);
+}
+
+$bootstrap-sass-asset-helper: true;
diff --git a/src/styles/third-party/bootstrap-main.scss b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap.scss
old mode 100644
new mode 100755
similarity index 93%
rename from src/styles/third-party/bootstrap-main.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap.scss
index cc7689c4a..e72d1def2
--- a/src/styles/third-party/bootstrap-main.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/_bootstrap.scss
@@ -5,9 +5,7 @@
  */
 
 // Core variables and mixins
-// @forward "bootstrap-variables";
-// @forward "bootstrap/mixins";
-@import "bootstrap-variables";
+@import "bootstrap/variables";
 @import "bootstrap/mixins";
 
 // Reset and dependencies
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_alerts.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_alerts.scss
new file mode 100755
index 000000000..7d1e1fddd
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_alerts.scss
@@ -0,0 +1,73 @@
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
+
+.alert {
+  padding: $alert-padding;
+  margin-bottom: $line-height-computed;
+  border: 1px solid transparent;
+  border-radius: $alert-border-radius;
+
+  // Headings for larger alerts
+  h4 {
+    margin-top: 0;
+    // Specified for the h4 to prevent conflicts of changing $headings-color
+    color: inherit;
+  }
+
+  // Provide class for links that match alerts
+  .alert-link {
+    font-weight: $alert-link-font-weight;
+  }
+
+  // Improve alignment and spacing of inner content
+  > p,
+  > ul {
+    margin-bottom: 0;
+  }
+
+  > p + p {
+    margin-top: 5px;
+  }
+}
+
+// Dismissible alerts
+//
+// Expand the right padding and account for the close button's positioning.
+
+.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.
+.alert-dismissible {
+  padding-right: ($alert-padding + 20);
+
+  // Adjust close link position
+  .close {
+    position: relative;
+    top: -2px;
+    right: -21px;
+    color: inherit;
+  }
+}
+
+// Alternate styles
+//
+// Generate contextual modifier classes for colorizing the alert.
+
+.alert-success {
+  @include alert-variant($alert-success-bg, $alert-success-border, $alert-success-text);
+}
+
+.alert-info {
+  @include alert-variant($alert-info-bg, $alert-info-border, $alert-info-text);
+}
+
+.alert-warning {
+  @include alert-variant($alert-warning-bg, $alert-warning-border, $alert-warning-text);
+}
+
+.alert-danger {
+  @include alert-variant($alert-danger-bg, $alert-danger-border, $alert-danger-text);
+}
diff --git a/src/styles/third-party/bootstrap/_badges.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_badges.scss
old mode 100644
new mode 100755
similarity index 67%
rename from src/styles/third-party/bootstrap/_badges.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_badges.scss
index d01fb0cd5..70002e085
--- a/src/styles/third-party/bootstrap/_badges.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_badges.scss
@@ -1,22 +1,22 @@
-@use "../bootstrap-variables" as bootstrap;
-
+//
 // Badges
 // --------------------------------------------------
 
+
 // Base class
 .badge {
   display: inline-block;
   min-width: 10px;
   padding: 3px 7px;
-  font-size: bootstrap.$font-size-small;
-  font-weight: bootstrap.$badge-font-weight;
-  color: bootstrap.$badge-color;
-  line-height: bootstrap.$badge-line-height;
+  font-size: $font-size-small;
+  font-weight: $badge-font-weight;
+  color: $badge-color;
+  line-height: $badge-line-height;
   vertical-align: middle;
   white-space: nowrap;
   text-align: center;
-  background-color: bootstrap.$badge-bg;
-  border-radius: bootstrap.$badge-border-radius;
+  background-color: $badge-bg;
+  border-radius: $badge-border-radius;
 
   // Empty badges collapse automatically (not available in IE8)
   &:empty {
@@ -40,8 +40,8 @@
   // Account for badges in navs
   .list-group-item.active > &,
   .nav-pills > .active > a > & {
-    color: bootstrap.$badge-active-color;
-    background-color: bootstrap.$badge-active-bg;
+    color: $badge-active-color;
+    background-color: $badge-active-bg;
   }
 
   .list-group-item > & {
@@ -61,7 +61,7 @@
 a.badge {
   &:hover,
   &:focus {
-    color: bootstrap.$badge-link-hover-color;
+    color: $badge-link-hover-color;
     text-decoration: none;
     cursor: pointer;
   }
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_breadcrumbs.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_breadcrumbs.scss
new file mode 100755
index 000000000..b61f0c731
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_breadcrumbs.scss
@@ -0,0 +1,28 @@
+//
+// Breadcrumbs
+// --------------------------------------------------
+
+
+.breadcrumb {
+  padding: $breadcrumb-padding-vertical $breadcrumb-padding-horizontal;
+  margin-bottom: $line-height-computed;
+  list-style: none;
+  background-color: $breadcrumb-bg;
+  border-radius: $border-radius-base;
+
+  > li {
+    display: inline-block;
+
+    + li:before {
+      // [converter] Workaround for https://github.com/sass/libsass/issues/1115
+      $nbsp: "\00a0";
+      content: "#{$breadcrumb-separator}#{$nbsp}"; // Unicode space added since inline-block means non-collapsing white-space
+      padding: 0 5px;
+      color: $breadcrumb-color;
+    }
+  }
+
+  > .active {
+    color: $breadcrumb-active-color;
+  }
+}
diff --git a/src/styles/third-party/bootstrap/_button-groups.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_button-groups.scss
old mode 100644
new mode 100755
similarity index 76%
rename from src/styles/third-party/bootstrap/_button-groups.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_button-groups.scss
index 271699470..4b385f569
--- a/src/styles/third-party/bootstrap/_button-groups.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_button-groups.scss
@@ -1,8 +1,4 @@
-@use "../bootstrap-variables" as bootstrap;
-@use "./mixins/clearfix";
-@use "./mixins/border-radius";
-@use "./mixins/vendor-prefixes" as vendor;
-
+//
 // Button groups
 // --------------------------------------------------
 
@@ -15,7 +11,6 @@
   > .btn {
     position: relative;
     float: left;
-
     // Bring the "active" button to the front
     &:hover,
     &:focus,
@@ -39,15 +34,13 @@
 // Optional: Group multiple button groups together for a toolbar
 .btn-toolbar {
   margin-left: -5px; // Offset the first child's margin
-
-  @include clearfix.clearfix;
+  @include clearfix;
 
   .btn,
   .btn-group,
   .input-group {
     float: left;
   }
-
   > .btn,
   > .btn-group,
   > .input-group {
@@ -55,44 +48,38 @@
   }
 }
 
-.btn-group > .btn:not(:first-child, :last-child, .dropdown-toggle) {
+.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
   border-radius: 0;
 }
 
-// Set corners individual because sometimes a single button can be in
-// a .btn-group and we need :first-child and :last-child to both match
+// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match
 .btn-group > .btn:first-child {
   margin-left: 0;
-
-  &:not(:last-child, .dropdown-toggle) {
-    @include border-radius.border-right-radius(0);
+  &:not(:last-child):not(.dropdown-toggle) {
+    @include border-right-radius(0);
   }
 }
-
 // Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it
 .btn-group > .btn:last-child:not(:first-child),
 .btn-group > .dropdown-toggle:not(:first-child) {
-  @include border-radius.border-left-radius(0);
+  @include border-left-radius(0);
 }
 
 // Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)
 .btn-group > .btn-group {
   float: left;
 }
-
-.btn-group > .btn-group:not(:first-child, :last-child) > .btn {
+.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {
   border-radius: 0;
 }
-
 .btn-group > .btn-group:first-child:not(:last-child) {
   > .btn:last-child,
   > .dropdown-toggle {
-    @include border-radius.border-right-radius(0);
+    @include border-right-radius(0);
   }
 }
-
 .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  @include border-radius.border-left-radius(0);
+  @include border-left-radius(0);
 }
 
 // On active and open, don't show outline
@@ -101,14 +88,16 @@
   outline: 0;
 }
 
-// Sizing
 
+// Sizing
+//
 // Remix the default button sizing classes into new ones for easier manipulation.
 
 .btn-group-xs > .btn { @extend .btn-xs; }
 .btn-group-sm > .btn { @extend .btn-sm; }
 .btn-group-lg > .btn { @extend .btn-lg; }
 
+
 // Split button dropdowns
 // ----------------------
 
@@ -117,7 +106,6 @@
   padding-left: 8px;
   padding-right: 8px;
 }
-
 .btn-group > .btn-lg + .dropdown-toggle {
   padding-left: 12px;
   padding-right: 12px;
@@ -126,30 +114,30 @@
 // The clickable button for toggling the menu
 // Remove the gradient and set the same inset shadow as the :active state
 .btn-group.open .dropdown-toggle {
-  @include vendor.box-shadow(inset 0 3px 5px rgba(0,0,0,0.125));
+  @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
 
   // Show no shadow for `.btn-link` since it has no other button styles.
   &.btn-link {
-    @include vendor.box-shadow(none);
+    @include box-shadow(none);
   }
 }
 
+
 // Reposition the caret
 .btn .caret {
   margin-left: 0;
 }
-
 // Carets in other button sizes
 .btn-lg .caret {
-  border-width: bootstrap.$caret-width-large bootstrap.$caret-width-large 0;
+  border-width: $caret-width-large $caret-width-large 0;
   border-bottom-width: 0;
 }
-
 // Upside down carets for .dropup
 .dropup .btn-lg .caret {
-  border-width: 0 bootstrap.$caret-width-large bootstrap.$caret-width-large;
+  border-width: 0 $caret-width-large $caret-width-large;
 }
 
+
 // Vertical button groups
 // ----------------------
 
@@ -165,8 +153,7 @@
 
   // Clear floats so dropdown menus can be properly placed
   > .btn-group {
-    @include clearfix.clearfix;
-
+    @include clearfix;
     > .btn {
       float: none;
     }
@@ -182,36 +169,32 @@
 }
 
 .btn-group-vertical > .btn {
-  &:not(:first-child, :last-child) {
+  &:not(:first-child):not(:last-child) {
     border-radius: 0;
   }
-
   &:first-child:not(:last-child) {
-    @include border-radius.border-top-radius(bootstrap.$btn-border-radius-base);
-    @include border-radius.border-bottom-radius(0);
+    @include border-top-radius($btn-border-radius-base);
+    @include border-bottom-radius(0);
   }
-
   &:last-child:not(:first-child) {
-    @include border-radius.border-top-radius(0);
-    @include border-radius.border-bottom-radius(bootstrap.$btn-border-radius-base);
+    @include border-top-radius(0);
+    @include border-bottom-radius($btn-border-radius-base);
   }
 }
-
-.btn-group-vertical > .btn-group:not(:first-child, :last-child) > .btn {
+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {
   border-radius: 0;
 }
-
 .btn-group-vertical > .btn-group:first-child:not(:last-child) {
   > .btn:last-child,
   > .dropdown-toggle {
-    @include border-radius.border-bottom-radius(0);
+    @include border-bottom-radius(0);
   }
 }
-
 .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {
-  @include border-radius.border-top-radius(0);
+  @include border-top-radius(0);
 }
 
+
 // Justified button groups
 // ----------------------
 
@@ -220,14 +203,12 @@
   width: 100%;
   table-layout: fixed;
   border-collapse: separate;
-
   > .btn,
   > .btn-group {
     float: none;
     display: table-cell;
     width: 1%;
   }
-
   > .btn-group .btn {
     width: 100%;
   }
@@ -237,15 +218,16 @@
   }
 }
 
-// Checkbox and radio options
 
+// Checkbox and radio options
+//
 // In order to support the browser's form validation feedback, powered by the
 // `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
 // `display: none;` or `visibility: hidden;` as that also hides the popover.
 // Simply visually hiding the inputs via `opacity` would leave them clickable in
 // certain cases which is prevented by using `clip` and `pointer-events`.
 // This way, we ensure a DOM element is visible to position the popover from.
-
+//
 // See https://github.com/twbs/bootstrap/pull/12794 and
 // https://github.com/twbs/bootstrap/pull/14559 for more information.
 
@@ -255,7 +237,7 @@
     input[type="radio"],
     input[type="checkbox"] {
       position: absolute;
-      clip: rect(0, 0, 0, 0);
+      clip: rect(0,0,0,0);
       pointer-events: none;
     }
   }
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_buttons.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_buttons.scss
new file mode 100755
index 000000000..6452b709f
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_buttons.scss
@@ -0,0 +1,168 @@
+//
+// Buttons
+// --------------------------------------------------
+
+
+// Base styles
+// --------------------------------------------------
+
+.btn {
+  display: inline-block;
+  margin-bottom: 0; // For input.btn
+  font-weight: $btn-font-weight;
+  text-align: center;
+  vertical-align: middle;
+  touch-action: manipulation;
+  cursor: pointer;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid transparent;
+  white-space: nowrap;
+  @include button-size($padding-base-vertical, $padding-base-horizontal, $font-size-base, $line-height-base, $btn-border-radius-base);
+  @include user-select(none);
+
+  &,
+  &:active,
+  &.active {
+    &:focus,
+    &.focus {
+      @include tab-focus;
+    }
+  }
+
+  &:hover,
+  &:focus,
+  &.focus {
+    color: $btn-default-color;
+    text-decoration: none;
+  }
+
+  &:active,
+  &.active {
+    outline: 0;
+    background-image: none;
+    @include box-shadow(inset 0 3px 5px rgba(0,0,0,.125));
+  }
+
+  &.disabled,
+  &[disabled],
+  fieldset[disabled] & {
+    cursor: $cursor-disabled;
+    @include opacity(.65);
+    @include box-shadow(none);
+  }
+
+  // [converter] extracted a& to a.btn
+}
+
+a.btn {
+  &.disabled,
+  fieldset[disabled] & {
+    pointer-events: none; // Future-proof disabling of clicks on `` elements
+  }
+}
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+.btn-default {
+  @include button-variant($btn-default-color, $btn-default-bg, $btn-default-border);
+}
+.btn-primary {
+  @include button-variant($btn-primary-color, $btn-primary-bg, $btn-primary-border);
+}
+// Success appears as green
+.btn-success {
+  @include button-variant($btn-success-color, $btn-success-bg, $btn-success-border);
+}
+// Info appears as blue-green
+.btn-info {
+  @include button-variant($btn-info-color, $btn-info-bg, $btn-info-border);
+}
+// Warning appears as orange
+.btn-warning {
+  @include button-variant($btn-warning-color, $btn-warning-bg, $btn-warning-border);
+}
+// Danger and error appear as red
+.btn-danger {
+  @include button-variant($btn-danger-color, $btn-danger-bg, $btn-danger-border);
+}
+
+
+// Link buttons
+// -------------------------
+
+// Make a button look and behave like a link
+.btn-link {
+  color: $link-color;
+  font-weight: normal;
+  border-radius: 0;
+
+  &,
+  &:active,
+  &.active,
+  &[disabled],
+  fieldset[disabled] & {
+    background-color: transparent;
+    @include box-shadow(none);
+  }
+  &,
+  &:hover,
+  &:focus,
+  &:active {
+    border-color: transparent;
+  }
+  &:hover,
+  &:focus {
+    color: $link-hover-color;
+    text-decoration: $link-hover-decoration;
+    background-color: transparent;
+  }
+  &[disabled],
+  fieldset[disabled] & {
+    &:hover,
+    &:focus {
+      color: $btn-link-disabled-color;
+      text-decoration: none;
+    }
+  }
+}
+
+
+// Button Sizes
+// --------------------------------------------------
+
+.btn-lg {
+  // line-height: ensure even-numbered height of button next to large input
+  @include button-size($padding-large-vertical, $padding-large-horizontal, $font-size-large, $line-height-large, $btn-border-radius-large);
+}
+.btn-sm {
+  // line-height: ensure proper height of button next to small input
+  @include button-size($padding-small-vertical, $padding-small-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
+}
+.btn-xs {
+  @include button-size($padding-xs-vertical, $padding-xs-horizontal, $font-size-small, $line-height-small, $btn-border-radius-small);
+}
+
+
+// Block button
+// --------------------------------------------------
+
+.btn-block {
+  display: block;
+  width: 100%;
+}
+
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+  margin-top: 5px;
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+  &.btn-block {
+    width: 100%;
+  }
+}
diff --git a/src/styles/third-party/bootstrap/_carousel.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_carousel.scss
old mode 100644
new mode 100755
similarity index 63%
rename from src/styles/third-party/bootstrap/_carousel.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_carousel.scss
index 2a5396623..753d881f4
--- a/src/styles/third-party/bootstrap/_carousel.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_carousel.scss
@@ -1,13 +1,8 @@
-@use "../bootstrap-variables" as bootstrap;
-@use "./mixins/vendor-prefixes" as vendor;
-@use "./mixins/image";
-@use "./mixins/gradients";
-@use "./mixins/opacity";
-
-// --------------------------------------------------
+//
 // Carousel
 // --------------------------------------------------
 
+
 // Wrapper for the slide container and indicators
 .carousel {
   position: relative;
@@ -21,43 +16,35 @@
   > .item {
     display: none;
     position: relative;
-
-    @include vendor.transition(0.6s ease-in-out left);
+    @include transition(.6s ease-in-out left);
 
     // Account for jankitude on images
     > img,
     > a > img {
-      @include image.img-responsive;
-
+      @include img-responsive;
       line-height: 1;
     }
 
     // WebKit CSS3 transforms for supported devices
-    // stylelint-disable-next-line media-feature-name-no-unknown
     @media all and (transform-3d), (-webkit-transform-3d) {
-      @include vendor.transition-transform(0.6s ease-in-out);
-      @include vendor.backface-visibility(hidden);
-      @include vendor.perspective(1000px);
-
-      &.active.right,
-      &.next {
-        @include vendor.translate3d(100%, 0, 0);
+      @include transition-transform(0.6s ease-in-out);
+      @include backface-visibility(hidden);
+      @include perspective(1000px);
 
+      &.next,
+      &.active.right {
+        @include translate3d(100%, 0, 0);
         left: 0;
       }
-
       &.prev,
       &.active.left {
-        @include vendor.translate3d(-100%, 0, 0);
-
+        @include translate3d(-100%, 0, 0);
         left: 0;
       }
-
       &.next.left,
       &.prev.right,
       &.active {
-        @include vendor.translate3d(0, 0, 0);
-
+        @include translate3d(0, 0, 0);
         left: 0;
       }
     }
@@ -83,11 +70,9 @@
   > .next {
     left: 100%;
   }
-
   > .prev {
     left: -100%;
   }
-
   > .next.left,
   > .prev.right {
     left: 0;
@@ -96,10 +81,10 @@
   > .active.left {
     left: -100%;
   }
-
   > .active.right {
     left: 100%;
   }
+
 }
 
 // Left/right controls for nav
@@ -110,38 +95,33 @@
   top: 0;
   left: 0;
   bottom: 0;
-  width: bootstrap.$carousel-control-width;
-
-  @include opacity.opacity(bootstrap.$carousel-control-opacity);
-
-  font-size: bootstrap.$carousel-control-font-size;
-  color: bootstrap.$carousel-control-color;
+  width: $carousel-control-width;
+  @include opacity($carousel-control-opacity);
+  font-size: $carousel-control-font-size;
+  color: $carousel-control-color;
   text-align: center;
-  text-shadow: bootstrap.$carousel-text-shadow;
-  background-color: rgb(0 0 0 / 0%); // Fix IE9 click-thru bug
+  text-shadow: $carousel-text-shadow;
+  background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug
   // We can't have this transition here because WebKit cancels the carousel
   // animation if you trip this while in the middle of another animation.
 
   // Set gradients for backgrounds
   &.left {
-    @include gradients.gradient-horizontal($start-color: rgba(0,0,0,0.5), $end-color: rgba(0,0,0,0.0001));
+    @include gradient-horizontal($start-color: rgba(0,0,0,.5), $end-color: rgba(0,0,0,.0001));
   }
-
   &.right {
     left: auto;
     right: 0;
-
-    @include gradients.gradient-horizontal($start-color: rgba(0,0,0,0.0001), $end-color: rgba(0,0,0,0.5));
+    @include gradient-horizontal($start-color: rgba(0,0,0,.0001), $end-color: rgba(0,0,0,.5));
   }
 
   // Hover/focus state
   &:hover,
   &:focus {
     outline: 0;
-    color: bootstrap.$carousel-control-color;
+    color: $carousel-control-color;
     text-decoration: none;
-
-    @include opacity.opacity(0.9);
+    @include opacity(.9);
   }
 
   // Toggles
@@ -155,42 +135,39 @@
     z-index: 5;
     display: inline-block;
   }
-
   .icon-prev,
   .glyphicon-chevron-left {
     left: 50%;
     margin-left: -10px;
   }
-
   .icon-next,
   .glyphicon-chevron-right {
     right: 50%;
     margin-right: -10px;
   }
-
   .icon-prev,
   .icon-next {
-    width: 20px;
+    width:  20px;
     height: 20px;
     line-height: 1;
     font-family: serif;
   }
 
+
   .icon-prev {
-    &::before {
-      content: "\2039";// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
+    &:before {
+      content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
     }
   }
-
   .icon-next {
-    &::before {
-      content: "\203a";// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
+    &:before {
+      content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
     }
   }
 }
 
 // Optional indicator pips
-
+//
 // Add an unordered list with the following class and add a list item for each
 // slide your carousel holds.
 
@@ -207,32 +184,31 @@
 
   li {
     display: inline-block;
-    width: 10px;
+    width:  10px;
     height: 10px;
     margin: 1px;
     text-indent: -999px;
-    border: 1px solid bootstrap.$carousel-indicator-border-color;
+    border: 1px solid $carousel-indicator-border-color;
     border-radius: 10px;
     cursor: pointer;
 
     // IE8-9 hack for event handling
-
+    //
     // Internet Explorer 8-9 does not support clicks on elements without a set
     // `background-color`. We cannot use `filter` since that's not viewed as a
     // background color by the browser. Thus, a hack is needed.
-    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet-Explorer
-
+    // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer
+    //
     // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
     // set alpha transparency for the best results possible.
     background-color: #000 \9; // IE8
-    background-color: rgb(0 0 0 / 0%); // IE9
+    background-color: rgba(0,0,0,0); // IE9
   }
-
   .active {
     margin: 0;
-    width: 12px;
+    width:  12px;
     height: 12px;
-    background-color: bootstrap.$carousel-indicator-active-bg;
+    background-color: $carousel-indicator-active-bg;
   }
 }
 
@@ -247,37 +223,36 @@
   z-index: 10;
   padding-top: 20px;
   padding-bottom: 20px;
-  color: bootstrap.$carousel-caption-color;
+  color: $carousel-caption-color;
   text-align: center;
-  text-shadow: bootstrap.$carousel-text-shadow;
-
+  text-shadow: $carousel-text-shadow;
   & .btn {
     text-shadow: none; // No shadow for button elements in carousel-caption
   }
 }
 
+
 // Scale up controls for tablets and up
-@media screen and (min-width: bootstrap.$screen-sm-min) {
+@media screen and (min-width: $screen-sm-min) {
+
   // Scale up the controls a smidge
   .carousel-control {
     .glyphicon-chevron-left,
     .glyphicon-chevron-right,
     .icon-prev,
     .icon-next {
-      width: (bootstrap.$carousel-control-font-size * 1.5);
-      height: (bootstrap.$carousel-control-font-size * 1.5);
-      margin-top: (bootstrap.$carousel-control-font-size / -2);
-      font-size: (bootstrap.$carousel-control-font-size * 1.5);
+      width: ($carousel-control-font-size * 1.5);
+      height: ($carousel-control-font-size * 1.5);
+      margin-top: ($carousel-control-font-size / -2);
+      font-size: ($carousel-control-font-size * 1.5);
     }
-
     .glyphicon-chevron-left,
     .icon-prev {
-      margin-left: (bootstrap.$carousel-control-font-size / -2);
+      margin-left: ($carousel-control-font-size / -2);
     }
-
     .glyphicon-chevron-right,
     .icon-next {
-      margin-right: (bootstrap.$carousel-control-font-size / -2);
+      margin-right: ($carousel-control-font-size / -2);
     }
   }
 
diff --git a/src/styles/third-party/bootstrap/_close.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_close.scss
old mode 100644
new mode 100755
similarity index 56%
rename from src/styles/third-party/bootstrap/_close.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_close.scss
index 59746624b..3b74d8a97
--- a/src/styles/third-party/bootstrap/_close.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_close.scss
@@ -1,27 +1,23 @@
-@use "../bootstrap-variables" as bootstrap;
-@use "./mixins/opacity";
-
-// --------------------------------------------------
+//
 // Close icons
 // --------------------------------------------------
 
+
 .close {
   float: right;
-  font-size: (bootstrap.$font-size-base * 1.5);
-  font-weight: bootstrap.$close-font-weight;
+  font-size: ($font-size-base * 1.5);
+  font-weight: $close-font-weight;
   line-height: 1;
-  color: bootstrap.$close-color;
-  text-shadow: bootstrap.$close-text-shadow;
-
-  @include opacity.opacity(0.2);
+  color: $close-color;
+  text-shadow: $close-text-shadow;
+  @include opacity(.2);
 
   &:hover,
   &:focus {
-    color: bootstrap.$close-color;
+    color: $close-color;
     text-decoration: none;
     cursor: pointer;
-
-    @include opacity.opacity(0.5);
+    @include opacity(.5);
   }
 
   // [converter] extracted button& to button.close
@@ -30,11 +26,11 @@
 // Additional properties for button version
 // iOS requires the button element instead of an anchor tag.
 // If you want the anchor version, it requires `href="#"`.
-// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari-Mobile
+// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
 button.close {
   padding: 0;
   cursor: pointer;
   background: transparent;
   border: 0;
-  appearance: none;
+  -webkit-appearance: none;
 }
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_code.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_code.scss
new file mode 100755
index 000000000..caa5f0630
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_code.scss
@@ -0,0 +1,69 @@
+//
+// Code (inline and block)
+// --------------------------------------------------
+
+
+// Inline and block code styles
+code,
+kbd,
+pre,
+samp {
+  font-family: $font-family-monospace;
+}
+
+// Inline code
+code {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: $code-color;
+  background-color: $code-bg;
+  border-radius: $border-radius-base;
+}
+
+// User input typically entered via keyboard
+kbd {
+  padding: 2px 4px;
+  font-size: 90%;
+  color: $kbd-color;
+  background-color: $kbd-bg;
+  border-radius: $border-radius-small;
+  box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);
+
+  kbd {
+    padding: 0;
+    font-size: 100%;
+    font-weight: bold;
+    box-shadow: none;
+  }
+}
+
+// Blocks of code
+pre {
+  display: block;
+  padding: (($line-height-computed - 1) / 2);
+  margin: 0 0 ($line-height-computed / 2);
+  font-size: ($font-size-base - 1); // 14px to 13px
+  line-height: $line-height-base;
+  word-break: break-all;
+  word-wrap: break-word;
+  color: $pre-color;
+  background-color: $pre-bg;
+  border: 1px solid $pre-border-color;
+  border-radius: $border-radius-base;
+
+  // Account for some code outputs that place code tags in pre tags
+  code {
+    padding: 0;
+    font-size: inherit;
+    color: inherit;
+    white-space: pre-wrap;
+    background-color: transparent;
+    border-radius: 0;
+  }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+  max-height: $pre-scrollable-max-height;
+  overflow-y: scroll;
+}
diff --git a/src/styles/third-party/bootstrap/_component-animations.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_component-animations.scss
old mode 100644
new mode 100755
similarity index 57%
rename from src/styles/third-party/bootstrap/_component-animations.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_component-animations.scss
index a21552d4c..ca3b43ca7
--- a/src/styles/third-party/bootstrap/_component-animations.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_component-animations.scss
@@ -1,20 +1,15 @@
-@use "../bootstrap-variables" as bootstrap;
-@use "./mixins/vendor-prefixes" as vendor;
-
-// --------------------------------------------------
+//
 // Component animations
 // --------------------------------------------------
 
 // Heads up!
-
+//
 // We don't use the `.opacity()` mixin here since it causes a bug with text
 // fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.
 
 .fade {
   opacity: 0;
-
-  @include vendor.transition(opacity 0.15s linear);
-
+  @include transition(opacity .15s linear);
   &.in {
     opacity: 1;
   }
@@ -23,13 +18,12 @@
 .collapse {
   display: none;
 
-  &.in { display: block; }
-
+  &.in      { display: block; }
   // [converter] extracted tr&.in to tr.collapse.in
   // [converter] extracted tbody&.in to tbody.collapse.in
 }
 
-tr.collapse.in { display: table-row; }
+tr.collapse.in    { display: table-row; }
 
 tbody.collapse.in { display: table-row-group; }
 
@@ -37,8 +31,7 @@ tbody.collapse.in { display: table-row-group; }
   position: relative;
   height: 0;
   overflow: hidden;
-
-  @include vendor.transition-property(height, visibility);
-  @include vendor.transition-duration(0.35s);
-  @include vendor.transition-timing-function(ease);
+  @include transition-property(height, visibility);
+  @include transition-duration(.35s);
+  @include transition-timing-function(ease);
 }
diff --git a/src/styles/third-party/bootstrap/_dropdowns.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_dropdowns.scss
old mode 100644
new mode 100755
similarity index 68%
rename from src/styles/third-party/bootstrap/_dropdowns.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_dropdowns.scss
index 99d9d8293..aac84597a
--- a/src/styles/third-party/bootstrap/_dropdowns.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_dropdowns.scss
@@ -1,12 +1,8 @@
-@use "../bootstrap-variables" as bootstrap;
-@use "./mixins/vendor-prefixes" as vendor;
-@use "./mixins/nav-divider";
-@use "./mixins/reset-filter";
-
-// --------------------------------------------------
+//
 // Dropdown menus
 // --------------------------------------------------
 
+
 // Dropdown arrow/caret
 .caret {
   display: inline-block;
@@ -14,10 +10,10 @@
   height: 0;
   margin-left: 2px;
   vertical-align: middle;
-  border-top: bootstrap.$caret-width-base dashed;
-  border-top: bootstrap.$caret-width-base solid \9; // IE8
-  border-right: bootstrap.$caret-width-base solid transparent;
-  border-left: bootstrap.$caret-width-base solid transparent;
+  border-top:   $caret-width-base dashed;
+  border-top:   $caret-width-base solid \9; // IE8
+  border-right: $caret-width-base solid transparent;
+  border-left:  $caret-width-base solid transparent;
 }
 
 // The dropdown wrapper (div)
@@ -36,25 +32,24 @@
   position: absolute;
   top: 100%;
   left: 0;
-  z-index: bootstrap.$zindex-dropdown;
+  z-index: $zindex-dropdown;
   display: none; // none by default, but block on "open" of the menu
   float: left;
   min-width: 160px;
   padding: 5px 0;
   margin: 2px 0 0; // override default ul
   list-style: none;
-  font-size: bootstrap.$font-size-base;
+  font-size: $font-size-base;
   text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
-  background-color: bootstrap.$dropdown-bg;
-  border: 1px solid bootstrap.$dropdown-border;
-  border-radius: bootstrap.$border-radius-base;
-
-  @include vendor.box-shadow(0 6px 12px rgba(0,0,0,0.175));
-
+  background-color: $dropdown-bg;
+  border: 1px solid $dropdown-fallback-border; // IE8 fallback
+  border: 1px solid $dropdown-border;
+  border-radius: $border-radius-base;
+  @include box-shadow(0 6px 12px rgba(0,0,0,.175));
   background-clip: padding-box;
 
   // Aligns the dropdown menu to right
-
+  //
   // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`
   &.pull-right {
     right: 0;
@@ -63,7 +58,7 @@
 
   // Dividers (basically an hr) within the dropdown
   .divider {
-    @include nav-divider.nav-divider(bootstrap.$dropdown-divider-bg);
+    @include nav-divider($dropdown-divider-bg);
   }
 
   // Links within the dropdown menu
@@ -72,8 +67,8 @@
     padding: 3px 20px;
     clear: both;
     font-weight: normal;
-    line-height: bootstrap.$line-height-base;
-    color: bootstrap.$dropdown-link-color;
+    line-height: $line-height-base;
+    color: $dropdown-link-color;
     white-space: nowrap; // prevent links from randomly breaking onto new lines
   }
 }
@@ -83,8 +78,8 @@
   &:hover,
   &:focus {
     text-decoration: none;
-    color: bootstrap.$dropdown-link-hover-color;
-    background-color: bootstrap.$dropdown-link-hover-bg;
+    color: $dropdown-link-hover-color;
+    background-color: $dropdown-link-hover-bg;
   }
 }
 
@@ -93,22 +88,22 @@
   &,
   &:hover,
   &:focus {
-    color: bootstrap.$dropdown-link-active-color;
+    color: $dropdown-link-active-color;
     text-decoration: none;
     outline: 0;
-    background-color: bootstrap.$dropdown-link-active-bg;
+    background-color: $dropdown-link-active-bg;
   }
 }
 
 // Disabled state
-
+//
 // Gray out text and ensure the hover/focus state remains gray
 
 .dropdown-menu > .disabled > a {
   &,
   &:hover,
   &:focus {
-    color: bootstrap.$dropdown-link-disabled-color;
+    color: $dropdown-link-disabled-color;
   }
 
   // Nuke hover/focus effects
@@ -117,10 +112,8 @@
     text-decoration: none;
     background-color: transparent;
     background-image: none; // Remove CSS gradient
-
-    @include reset-filter.reset-filter;
-
-    cursor: bootstrap.$cursor-disabled;
+    @include reset-filter;
+    cursor: $cursor-disabled;
   }
 }
 
@@ -138,18 +131,17 @@
 }
 
 // Menu positioning
-
+//
 // Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
 // menu with the parent.
 .dropdown-menu-right {
   left: auto; // Reset the default from `.dropdown-menu`
   right: 0;
 }
-
 // With v3, we enabled auto-flipping if you have a dropdown within a right
 // aligned nav component. To enable the undoing of that, we provide an override
 // to restore the default dropdown menu alignment.
-
+//
 // This is only for left-aligning a dropdown menu within a `.navbar-right` or
 // `.pull-right` nav component.
 .dropdown-menu-left {
@@ -161,9 +153,9 @@
 .dropdown-header {
   display: block;
   padding: 3px 20px;
-  font-size: bootstrap.$font-size-small;
-  line-height: bootstrap.$line-height-base;
-  color: bootstrap.$dropdown-header-color;
+  font-size: $font-size-small;
+  line-height: $line-height-base;
+  color: $dropdown-header-color;
   white-space: nowrap; // as with > li > a
 }
 
@@ -174,7 +166,7 @@
   right: 0;
   bottom: 0;
   top: 0;
-  z-index: (bootstrap.$zindex-dropdown - 10);
+  z-index: ($zindex-dropdown - 10);
 }
 
 // Right aligned dropdowns
@@ -184,7 +176,7 @@
 }
 
 // Allow for dropdowns to go bottom up (aka, dropup-menu)
-
+//
 // Just add .dropup after the standard .dropdown class and you're set, bro.
 // TODO: abstract this so that the navbar fixed styles are not placed here?
 
@@ -193,11 +185,10 @@
   // Reverse the caret
   .caret {
     border-top: 0;
-    border-bottom: bootstrap.$caret-width-base dashed;
-    border-bottom: bootstrap.$caret-width-base solid \9; // IE8
+    border-bottom: $caret-width-base dashed;
+    border-bottom: $caret-width-base solid \9; // IE8
     content: "";
   }
-
   // Different positioning for bottom up menu
   .dropdown-menu {
     top: auto;
@@ -206,22 +197,20 @@
   }
 }
 
-// Component alignment
 
+// Component alignment
+//
 // Reiterate per navbar.less and the modified component alignment there.
 
-@media (min-width: bootstrap.$grid-float-breakpoint) {
+@media (min-width: $grid-float-breakpoint) {
   .navbar-right {
     .dropdown-menu {
-      right: 0;
-      left: auto;
+      right: 0; left: auto;
     }
-
     // Necessary for overrides of the default right aligned menu.
     // Will remove come v4 in all likelihood.
     .dropdown-menu-left {
-      left: 0;
-      right: auto;
+      left: 0; right: auto;
     }
   }
 }
diff --git a/src/styles/third-party/bootstrap/_forms.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_forms.scss
old mode 100644
new mode 100755
similarity index 64%
rename from src/styles/third-party/bootstrap/_forms.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_forms.scss
index ae7bb7aff..ac26a6ad8
--- a/src/styles/third-party/bootstrap/_forms.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_forms.scss
@@ -1,23 +1,16 @@
-@use "sass:color";
-@use "sass:math";
-@use "../bootstrap-variables" as bootstrap;
-@use "./mixins/vendor-prefixes" as vendor;
-@use "./mixins/tab-focus";
-@use "./mixins/forms";
-@use "./mixins/grid";
-
+//
 // Forms
 // --------------------------------------------------
 
-// Normalize non-controls
 
+// Normalize non-controls
+//
 // Restyle and baseline non-control form elements.
 
 fieldset {
   padding: 0;
   margin: 0;
   border: 0;
-
   // Chrome and Firefox set a `min-width: min-content;` on fieldsets,
   // so we reset that to ensure it behaves more like a standard block element.
   // See https://github.com/twbs/bootstrap/issues/12359.
@@ -28,12 +21,12 @@ legend {
   display: block;
   width: 100%;
   padding: 0;
-  margin-bottom: bootstrap.$line-height-computed;
-  font-size: (bootstrap.$font-size-base * 1.5);
+  margin-bottom: $line-height-computed;
+  font-size: ($font-size-base * 1.5);
   line-height: inherit;
-  color: bootstrap.$legend-color;
+  color: $legend-color;
   border: 0;
-  border-bottom: 1px solid bootstrap.$legend-border-color;
+  border-bottom: 1px solid $legend-border-color;
 }
 
 label {
@@ -43,15 +36,16 @@ label {
   font-weight: bold;
 }
 
-// Normalize form controls
 
+// Normalize form controls
+//
 // While most of our form styles require extra classes, some basic normalization
 // is required to ensure optimum display with or without those classes to better
 // address browser inconsistencies.
 
 // Override content-box in Normalize (* isn't specific enough)
 input[type="search"] {
-  @include vendor.box-sizing(border-box);
+  @include box-sizing(border-box);
 }
 
 // Position radios and checkboxes better
@@ -82,23 +76,24 @@ select[size] {
 input[type="file"]:focus,
 input[type="radio"]:focus,
 input[type="checkbox"]:focus {
-  @include tab-focus.tab-focus;
+  @include tab-focus;
 }
 
 // Adjust output element
 output {
   display: block;
-  padding-top: (bootstrap.$padding-base-vertical + 1);
-  font-size: bootstrap.$font-size-base;
-  line-height: bootstrap.$line-height-base;
-  color: bootstrap.$input-color;
+  padding-top: ($padding-base-vertical + 1);
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $input-color;
 }
 
-// Common form controls
 
+// Common form controls
+//
 // Shared size and type resets for form controls. Apply `.form-control` to any
 // of the following form controls:
-
+//
 // select
 // textarea
 // input[type="text"]
@@ -119,49 +114,45 @@ output {
 .form-control {
   display: block;
   width: 100%;
-
-  // Make inputs at least the height of their button counterpart (base line-height + padding + border)
-  height: bootstrap.$input-height-base;
-  padding: bootstrap.$padding-base-vertical bootstrap.$padding-base-horizontal;
-  font-size: bootstrap.$font-size-base;
-  line-height: bootstrap.$line-height-base;
-  color: bootstrap.$input-color;
-  background-color: bootstrap.$input-bg;
-
-  // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
-  background-image: none;
-  border: 1px solid bootstrap.$input-border;
-
-  // Note: This has no effect on s in CSS.
-  border-radius: bootstrap.$input-border-radius;
-
-  @include vendor.box-shadow(inset 0 1px 1px rgba(0,0,0,0.075));
-  @include vendor.transition(border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s);
+  height: $input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
+  padding: $padding-base-vertical $padding-base-horizontal;
+  font-size: $font-size-base;
+  line-height: $line-height-base;
+  color: $input-color;
+  background-color: $input-bg;
+  background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
+  border: 1px solid $input-border;
+  border-radius: $input-border-radius; // Note: This has no effect on s in CSS.
+  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+  @include transition(border-color ease-in-out .15s, box-shadow ease-in-out .15s);
 
   // Customize the `:focus` state to imitate native WebKit styles.
-  @include forms.form-control-focus;
-  @include vendor.placeholder;
+  @include form-control-focus;
+
+  // Placeholder
+  @include placeholder;
 
+  // Unstyle the caret on `` background color
+$input-bg:                       #fff !default;
+//** `` background color
+$input-bg-disabled:              $gray-lighter !default;
+
+//** Text color for ``s
+$input-color:                    $gray !default;
+//** `` border color
+$input-border:                   #ccc !default;
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// This has no effect on ``s in CSS.
+$input-border-radius:            $border-radius-base !default;
+//** Large `.form-control` border radius
+$input-border-radius-large:      $border-radius-large !default;
+//** Small `.form-control` border radius
+$input-border-radius-small:      $border-radius-small !default;
+
+//** Border color for inputs on focus
+$input-border-focus:             #66afe9 !default;
+
+//** Placeholder text color
+$input-color-placeholder:        #999 !default;
+
+//** Default `.form-control` height
+$input-height-base:              ($line-height-computed + ($padding-base-vertical * 2) + 2) !default;
+//** Large `.form-control` height
+$input-height-large:             (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2) !default;
+//** Small `.form-control` height
+$input-height-small:             (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2) !default;
+
+//** `.form-group` margin
+$form-group-margin-bottom:       15px !default;
+
+$legend-color:                   $gray-dark !default;
+$legend-border-color:            #e5e5e5 !default;
+
+//** Background color for textual input addons
+$input-group-addon-bg:           $gray-lighter !default;
+//** Border color for textual input addons
+$input-group-addon-border-color: $input-border !default;
+
+//** Disabled cursor for form controls and buttons.
+$cursor-disabled:                not-allowed !default;
+
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+$dropdown-bg:                    #fff !default;
+//** Dropdown menu `border-color`.
+$dropdown-border:                rgba(0,0,0,.15) !default;
+//** Dropdown menu `border-color` **for IE8**.
+$dropdown-fallback-border:       #ccc !default;
+//** Divider color for between dropdown items.
+$dropdown-divider-bg:            #e5e5e5 !default;
+
+//** Dropdown link text color.
+$dropdown-link-color:            $gray-dark !default;
+//** Hover color for dropdown links.
+$dropdown-link-hover-color:      darken($gray-dark, 5%) !default;
+//** Hover background for dropdown links.
+$dropdown-link-hover-bg:         #f5f5f5 !default;
+
+//** Active dropdown menu item text color.
+$dropdown-link-active-color:     $component-active-color !default;
+//** Active dropdown menu item background color.
+$dropdown-link-active-bg:        $component-active-bg !default;
+
+//** Disabled dropdown menu item background color.
+$dropdown-link-disabled-color:   $gray-light !default;
+
+//** Text color for headers within dropdown menus.
+$dropdown-header-color:          $gray-light !default;
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+$dropdown-caret-color:           #000 !default;
+
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+$zindex-navbar:            1000 !default;
+$zindex-dropdown:          1000 !default;
+$zindex-popover:           1060 !default;
+$zindex-tooltip:           1070 !default;
+$zindex-navbar-fixed:      1030 !default;
+$zindex-modal-background:  1040 !default;
+$zindex-modal:             1050 !default;
+
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+$screen-xs:                  480px !default;
+//** Deprecated `$screen-xs-min` as of v3.2.0
+$screen-xs-min:              $screen-xs !default;
+//** Deprecated `$screen-phone` as of v3.0.1
+$screen-phone:               $screen-xs-min !default;
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+$screen-sm:                  768px !default;
+$screen-sm-min:              $screen-sm !default;
+//** Deprecated `$screen-tablet` as of v3.0.1
+$screen-tablet:              $screen-sm-min !default;
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+$screen-md:                  992px !default;
+$screen-md-min:              $screen-md !default;
+//** Deprecated `$screen-desktop` as of v3.0.1
+$screen-desktop:             $screen-md-min !default;
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+$screen-lg:                  1200px !default;
+$screen-lg-min:              $screen-lg !default;
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+$screen-lg-desktop:          $screen-lg-min !default;
+
+// So media queries don't overlap when required, provide a maximum
+$screen-xs-max:              ($screen-sm-min - 1) !default;
+$screen-sm-max:              ($screen-md-min - 1) !default;
+$screen-md-max:              ($screen-lg-min - 1) !default;
+
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+$grid-columns:              12 !default;
+//** Padding between columns. Gets divided in half for the left and right.
+$grid-gutter-width:         30px !default;
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+$grid-float-breakpoint:     $screen-sm-min !default;
+//** Point at which the navbar begins collapsing.
+$grid-float-breakpoint-max: ($grid-float-breakpoint - 1) !default;
+
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+$container-tablet:             (720px + $grid-gutter-width) !default;
+//** For `$screen-sm-min` and up.
+$container-sm:                 $container-tablet !default;
+
+// Medium screen / desktop
+$container-desktop:            (940px + $grid-gutter-width) !default;
+//** For `$screen-md-min` and up.
+$container-md:                 $container-desktop !default;
+
+// Large screen / wide desktop
+$container-large-desktop:      (1140px + $grid-gutter-width) !default;
+//** For `$screen-lg-min` and up.
+$container-lg:                 $container-large-desktop !default;
+
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+$navbar-height:                    50px !default;
+$navbar-margin-bottom:             $line-height-computed !default;
+$navbar-border-radius:             $border-radius-base !default;
+$navbar-padding-horizontal:        floor(($grid-gutter-width / 2)) !default;
+$navbar-padding-vertical:          (($navbar-height - $line-height-computed) / 2) !default;
+$navbar-collapse-max-height:       340px !default;
+
+$navbar-default-color:             #777 !default;
+$navbar-default-bg:                #f8f8f8 !default;
+$navbar-default-border:            darken($navbar-default-bg, 6.5%) !default;
+
+// Navbar links
+$navbar-default-link-color:                #777 !default;
+$navbar-default-link-hover-color:          #333 !default;
+$navbar-default-link-hover-bg:             transparent !default;
+$navbar-default-link-active-color:         #555 !default;
+$navbar-default-link-active-bg:            darken($navbar-default-bg, 6.5%) !default;
+$navbar-default-link-disabled-color:       #ccc !default;
+$navbar-default-link-disabled-bg:          transparent !default;
+
+// Navbar brand label
+$navbar-default-brand-color:               $navbar-default-link-color !default;
+$navbar-default-brand-hover-color:         darken($navbar-default-brand-color, 10%) !default;
+$navbar-default-brand-hover-bg:            transparent !default;
+
+// Navbar toggle
+$navbar-default-toggle-hover-bg:           #ddd !default;
+$navbar-default-toggle-icon-bar-bg:        #888 !default;
+$navbar-default-toggle-border-color:       #ddd !default;
+
+
+//=== Inverted navbar
+// Reset inverted navbar basics
+$navbar-inverse-color:                      lighten($gray-light, 15%) !default;
+$navbar-inverse-bg:                         #222 !default;
+$navbar-inverse-border:                     darken($navbar-inverse-bg, 10%) !default;
+
+// Inverted navbar links
+$navbar-inverse-link-color:                 lighten($gray-light, 15%) !default;
+$navbar-inverse-link-hover-color:           #fff !default;
+$navbar-inverse-link-hover-bg:              transparent !default;
+$navbar-inverse-link-active-color:          $navbar-inverse-link-hover-color !default;
+$navbar-inverse-link-active-bg:             darken($navbar-inverse-bg, 10%) !default;
+$navbar-inverse-link-disabled-color:        #444 !default;
+$navbar-inverse-link-disabled-bg:           transparent !default;
+
+// Inverted navbar brand label
+$navbar-inverse-brand-color:                $navbar-inverse-link-color !default;
+$navbar-inverse-brand-hover-color:          #fff !default;
+$navbar-inverse-brand-hover-bg:             transparent !default;
+
+// Inverted navbar toggle
+$navbar-inverse-toggle-hover-bg:            #333 !default;
+$navbar-inverse-toggle-icon-bar-bg:         #fff !default;
+$navbar-inverse-toggle-border-color:        #333 !default;
+
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+$nav-link-padding:                          10px 15px !default;
+$nav-link-hover-bg:                         $gray-lighter !default;
+
+$nav-disabled-link-color:                   $gray-light !default;
+$nav-disabled-link-hover-color:             $gray-light !default;
+
+//== Tabs
+$nav-tabs-border-color:                     #ddd !default;
+
+$nav-tabs-link-hover-border-color:          $gray-lighter !default;
+
+$nav-tabs-active-link-hover-bg:             $body-bg !default;
+$nav-tabs-active-link-hover-color:          $gray !default;
+$nav-tabs-active-link-hover-border-color:   #ddd !default;
+
+$nav-tabs-justified-link-border-color:            #ddd !default;
+$nav-tabs-justified-active-link-border-color:     $body-bg !default;
+
+//== Pills
+$nav-pills-border-radius:                   $border-radius-base !default;
+$nav-pills-active-link-hover-bg:            $component-active-bg !default;
+$nav-pills-active-link-hover-color:         $component-active-color !default;
+
+
+//== Pagination
+//
+//##
+
+$pagination-color:                     $link-color !default;
+$pagination-bg:                        #fff !default;
+$pagination-border:                    #ddd !default;
+
+$pagination-hover-color:               $link-hover-color !default;
+$pagination-hover-bg:                  $gray-lighter !default;
+$pagination-hover-border:              #ddd !default;
+
+$pagination-active-color:              #fff !default;
+$pagination-active-bg:                 $brand-primary !default;
+$pagination-active-border:             $brand-primary !default;
+
+$pagination-disabled-color:            $gray-light !default;
+$pagination-disabled-bg:               #fff !default;
+$pagination-disabled-border:           #ddd !default;
+
+
+//== Pager
+//
+//##
+
+$pager-bg:                             $pagination-bg !default;
+$pager-border:                         $pagination-border !default;
+$pager-border-radius:                  15px !default;
+
+$pager-hover-bg:                       $pagination-hover-bg !default;
+
+$pager-active-bg:                      $pagination-active-bg !default;
+$pager-active-color:                   $pagination-active-color !default;
+
+$pager-disabled-color:                 $pagination-disabled-color !default;
+
+
+//== Jumbotron
+//
+//##
+
+$jumbotron-padding:              30px !default;
+$jumbotron-color:                inherit !default;
+$jumbotron-bg:                   $gray-lighter !default;
+$jumbotron-heading-color:        inherit !default;
+$jumbotron-font-size:            ceil(($font-size-base * 1.5)) !default;
+$jumbotron-heading-font-size:    ceil(($font-size-base * 4.5)) !default;
+
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+$state-success-text:             #3c763d !default;
+$state-success-bg:               #dff0d8 !default;
+$state-success-border:           darken(adjust-hue($state-success-bg, -10), 5%) !default;
+
+$state-info-text:                #31708f !default;
+$state-info-bg:                  #d9edf7 !default;
+$state-info-border:              darken(adjust-hue($state-info-bg, -10), 7%) !default;
+
+$state-warning-text:             #8a6d3b !default;
+$state-warning-bg:               #fcf8e3 !default;
+$state-warning-border:           darken(adjust-hue($state-warning-bg, -10), 5%) !default;
+
+$state-danger-text:              #a94442 !default;
+$state-danger-bg:                #f2dede !default;
+$state-danger-border:            darken(adjust-hue($state-danger-bg, -10), 5%) !default;
+
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+$tooltip-max-width:           200px !default;
+//** Tooltip text color
+$tooltip-color:               #fff !default;
+//** Tooltip background color
+$tooltip-bg:                  #000 !default;
+$tooltip-opacity:             .9 !default;
+
+//** Tooltip arrow width
+$tooltip-arrow-width:         5px !default;
+//** Tooltip arrow color
+$tooltip-arrow-color:         $tooltip-bg !default;
+
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+$popover-bg:                          #fff !default;
+//** Popover maximum width
+$popover-max-width:                   276px !default;
+//** Popover border color
+$popover-border-color:                rgba(0,0,0,.2) !default;
+//** Popover fallback border color
+$popover-fallback-border-color:       #ccc !default;
+
+//** Popover title background color
+$popover-title-bg:                    darken($popover-bg, 3%) !default;
+
+//** Popover arrow width
+$popover-arrow-width:                 10px !default;
+//** Popover arrow color
+$popover-arrow-color:                 $popover-bg !default;
+
+//** Popover outer arrow width
+$popover-arrow-outer-width:           ($popover-arrow-width + 1) !default;
+//** Popover outer arrow color
+$popover-arrow-outer-color:           fade_in($popover-border-color, 0.05) !default;
+//** Popover outer arrow fallback color
+$popover-arrow-outer-fallback-color:  darken($popover-fallback-border-color, 20%) !default;
+
+
+//== Labels
+//
+//##
+
+//** Default label background color
+$label-default-bg:            $gray-light !default;
+//** Primary label background color
+$label-primary-bg:            $brand-primary !default;
+//** Success label background color
+$label-success-bg:            $brand-success !default;
+//** Info label background color
+$label-info-bg:               $brand-info !default;
+//** Warning label background color
+$label-warning-bg:            $brand-warning !default;
+//** Danger label background color
+$label-danger-bg:             $brand-danger !default;
+
+//** Default label text color
+$label-color:                 #fff !default;
+//** Default text color of a linked label
+$label-link-hover-color:      #fff !default;
+
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+$modal-inner-padding:         15px !default;
+
+//** Padding applied to the modal title
+$modal-title-padding:         15px !default;
+//** Modal title line-height
+$modal-title-line-height:     $line-height-base !default;
+
+//** Background color of modal content area
+$modal-content-bg:                             #fff !default;
+//** Modal content border color
+$modal-content-border-color:                   rgba(0,0,0,.2) !default;
+//** Modal content border color **for IE8**
+$modal-content-fallback-border-color:          #999 !default;
+
+//** Modal backdrop background color
+$modal-backdrop-bg:           #000 !default;
+//** Modal backdrop opacity
+$modal-backdrop-opacity:      .5 !default;
+//** Modal header border color
+$modal-header-border-color:   #e5e5e5 !default;
+//** Modal footer border color
+$modal-footer-border-color:   $modal-header-border-color !default;
+
+$modal-lg:                    1100px !default;
+$modal-md:                    700px !default;
+$modal-sm:                    300px !default;
+
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+$alert-padding:               15px !default;
+$alert-border-radius:         $border-radius-base !default;
+$alert-link-font-weight:      bold !default;
+
+$alert-success-bg:            $state-success-bg !default;
+$alert-success-text:          $state-success-text !default;
+$alert-success-border:        $state-success-border !default;
+
+$alert-info-bg:               $state-info-bg !default;
+$alert-info-text:             $state-info-text !default;
+$alert-info-border:           $state-info-border !default;
+
+$alert-warning-bg:            $state-warning-bg !default;
+$alert-warning-text:          $state-warning-text !default;
+$alert-warning-border:        $state-warning-border !default;
+
+$alert-danger-bg:             $state-danger-bg !default;
+$alert-danger-text:           $state-danger-text !default;
+$alert-danger-border:         $state-danger-border !default;
+
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+$progress-bg:                 #f5f5f5 !default;
+//** Progress bar text color
+$progress-bar-color:          #fff !default;
+//** Variable for setting rounded corners on progress bar.
+$progress-border-radius:      $border-radius-base !default;
+
+//** Default progress bar color
+$progress-bar-bg:             $brand-primary !default;
+//** Success progress bar color
+$progress-bar-success-bg:     $brand-success !default;
+//** Warning progress bar color
+$progress-bar-warning-bg:     $brand-warning !default;
+//** Danger progress bar color
+$progress-bar-danger-bg:      $brand-danger !default;
+//** Info progress bar color
+$progress-bar-info-bg:        $brand-info !default;
+
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+$list-group-bg:                 #fff !default;
+//** `.list-group-item` border color
+$list-group-border:             #ddd !default;
+//** List group border radius
+$list-group-border-radius:      $border-radius-base !default;
+
+//** Background color of single list items on hover
+$list-group-hover-bg:           #f5f5f5 !default;
+//** Text color of active list items
+$list-group-active-color:       $component-active-color !default;
+//** Background color of active list items
+$list-group-active-bg:          $component-active-bg !default;
+//** Border color of active list elements
+$list-group-active-border:      $list-group-active-bg !default;
+//** Text color for content within active list items
+$list-group-active-text-color:  lighten($list-group-active-bg, 40%) !default;
+
+//** Text color of disabled list items
+$list-group-disabled-color:      $gray-light !default;
+//** Background color of disabled list items
+$list-group-disabled-bg:         $gray-lighter !default;
+//** Text color for content within disabled list items
+$list-group-disabled-text-color: $list-group-disabled-color !default;
+
+$list-group-link-color:         #555 !default;
+$list-group-link-hover-color:   $list-group-link-color !default;
+$list-group-link-heading-color: #333 !default;
+
+
+//== Panels
+//
+//##
+
+$panel-bg:                    #fff !default;
+$panel-body-padding:          15px !default;
+$panel-heading-padding:       10px 15px !default;
+$panel-footer-padding:        $panel-heading-padding !default;
+$panel-border-radius:         $border-radius-base !default;
+
+//** Border color for elements within panels
+$panel-inner-border:          #ddd !default;
+$panel-footer-bg:             #f5f5f5 !default;
+
+$panel-default-text:          $gray-dark !default;
+$panel-default-border:        #ddd !default;
+$panel-default-heading-bg:    #f5f5f5 !default;
+
+$panel-primary-text:          #fff !default;
+$panel-primary-border:        $brand-primary !default;
+$panel-primary-heading-bg:    $brand-primary !default;
+
+$panel-success-text:          $state-success-text !default;
+$panel-success-border:        $state-success-border !default;
+$panel-success-heading-bg:    $state-success-bg !default;
+
+$panel-info-text:             $state-info-text !default;
+$panel-info-border:           $state-info-border !default;
+$panel-info-heading-bg:       $state-info-bg !default;
+
+$panel-warning-text:          $state-warning-text !default;
+$panel-warning-border:        $state-warning-border !default;
+$panel-warning-heading-bg:    $state-warning-bg !default;
+
+$panel-danger-text:           $state-danger-text !default;
+$panel-danger-border:         $state-danger-border !default;
+$panel-danger-heading-bg:     $state-danger-bg !default;
+
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+$thumbnail-padding:           4px !default;
+//** Thumbnail background color
+$thumbnail-bg:                $body-bg !default;
+//** Thumbnail border color
+$thumbnail-border:            #ddd !default;
+//** Thumbnail border radius
+$thumbnail-border-radius:     $border-radius-base !default;
+
+//** Custom text color for thumbnail captions
+$thumbnail-caption-color:     $text-color !default;
+//** Padding around the thumbnail caption
+$thumbnail-caption-padding:   9px !default;
+
+
+//== Wells
+//
+//##
+
+$well-bg:                     #f5f5f5 !default;
+$well-border:                 darken($well-bg, 7%) !default;
+
+
+//== Badges
+//
+//##
+
+$badge-color:                 #fff !default;
+//** Linked badge text color on hover
+$badge-link-hover-color:      #fff !default;
+$badge-bg:                    $gray-light !default;
+
+//** Badge text color in active nav link
+$badge-active-color:          $link-color !default;
+//** Badge background color in active nav link
+$badge-active-bg:             #fff !default;
+
+$badge-font-weight:           bold !default;
+$badge-line-height:           1 !default;
+$badge-border-radius:         10px !default;
+
+
+//== Breadcrumbs
+//
+//##
+
+$breadcrumb-padding-vertical:   8px !default;
+$breadcrumb-padding-horizontal: 15px !default;
+//** Breadcrumb background color
+$breadcrumb-bg:                 #f5f5f5 !default;
+//** Breadcrumb text color
+$breadcrumb-color:              #ccc !default;
+//** Text color of current page in the breadcrumb
+$breadcrumb-active-color:       $gray-light !default;
+//** Textual separator for between breadcrumb elements
+$breadcrumb-separator:          "/" !default;
+
+
+//== Carousel
+//
+//##
+
+$carousel-text-shadow:                        0 1px 2px rgba(0,0,0,.6) !default;
+
+$carousel-control-color:                      #fff !default;
+$carousel-control-width:                      15% !default;
+$carousel-control-opacity:                    .5 !default;
+$carousel-control-font-size:                  20px !default;
+
+$carousel-indicator-active-bg:                #fff !default;
+$carousel-indicator-border-color:             #fff !default;
+
+$carousel-caption-color:                      #fff !default;
+
+
+//== Close
+//
+//##
+
+$close-font-weight:           bold !default;
+$close-color:                 #000 !default;
+$close-text-shadow:           0 1px 0 #fff !default;
+
+
+//== Code
+//
+//##
+
+$code-color:                  #c7254e !default;
+$code-bg:                     #f9f2f4 !default;
+
+$kbd-color:                   #fff !default;
+$kbd-bg:                      #333 !default;
+
+$pre-bg:                      #f5f5f5 !default;
+$pre-color:                   $gray-dark !default;
+$pre-border-color:            #ccc !default;
+$pre-scrollable-max-height:   340px !default;
+
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+$component-offset-horizontal: 180px !default;
+//** Text muted color
+$text-muted:                  $gray-light !default;
+//** Abbreviations and acronyms border color
+$abbr-border-color:           $gray-light !default;
+//** Headings small color
+$headings-small-color:        $gray-light !default;
+//** Blockquote small color
+$blockquote-small-color:      $gray-light !default;
+//** Blockquote font size
+$blockquote-font-size:        ($font-size-base * 1.25) !default;
+//** Blockquote border color
+$blockquote-border-color:     $gray-lighter !default;
+//** Page header border color
+$page-header-border-color:    $gray-lighter !default;
+//** Width of horizontal description list titles
+$dl-horizontal-offset:        $component-offset-horizontal !default;
+//** Point at which .dl-horizontal becomes horizontal
+$dl-horizontal-breakpoint:    $grid-float-breakpoint !default;
+//** Horizontal line color.
+$hr-border:                   $gray-lighter !default;
diff --git a/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_wells.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_wells.scss
new file mode 100755
index 000000000..b8657118a
--- /dev/null
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/_wells.scss
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+  background-color: $well-bg;
+  border: 1px solid $well-border;
+  border-radius: $border-radius-base;
+  @include box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+  blockquote {
+    border-color: #ddd;
+    border-color: rgba(0,0,0,.15);
+  }
+}
+
+// Sizes
+.well-lg {
+  padding: 24px;
+  border-radius: $border-radius-large;
+}
+.well-sm {
+  padding: 9px;
+  border-radius: $border-radius-small;
+}
diff --git a/src/styles/third-party/bootstrap/mixins/_alerts.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_alerts.scss
old mode 100644
new mode 100755
similarity index 50%
rename from src/styles/third-party/bootstrap/mixins/_alerts.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_alerts.scss
index f2a3fd8c0..3faf0b5a5
--- a/src/styles/third-party/bootstrap/mixins/_alerts.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_alerts.scss
@@ -1,6 +1,3 @@
-@use "sass:color";
-@use "../../bootstrap-variables" as bootstrap;
-
 // Alerts
 
 @mixin alert-variant($background, $border, $text-color) {
@@ -9,9 +6,9 @@
   color: $text-color;
 
   hr {
-    border-top-color: color.scale($border, $lightness: -5%);
+    border-top-color: darken($border, 5%);
   }
   .alert-link {
-    color: color.scale($text-color, $lightness: -10%);
+    color: darken($text-color, 10%);
   }
 }
diff --git a/src/styles/third-party/bootstrap/mixins/_background-variant.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_background-variant.scss
old mode 100644
new mode 100755
similarity index 59%
rename from src/styles/third-party/bootstrap/mixins/_background-variant.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_background-variant.scss
index 86705848e..4c7769e13
--- a/src/styles/third-party/bootstrap/mixins/_background-variant.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_background-variant.scss
@@ -1,6 +1,3 @@
-@use "sass:color";
-@use "../../bootstrap-variables" as bootstrap;
-
 // Contextual backgrounds
 
 // [converter] $parent hack
@@ -10,6 +7,6 @@
   }
   a#{$parent}:hover,
   a#{$parent}:focus {
-    background-color: color.scale($color, $lightness: -10%);
+    background-color: darken($color, 10%);
   }
 }
diff --git a/src/styles/third-party/bootstrap/mixins/_border-radius.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_border-radius.scss
old mode 100644
new mode 100755
similarity index 100%
rename from src/styles/third-party/bootstrap/mixins/_border-radius.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_border-radius.scss
diff --git a/src/styles/third-party/bootstrap/mixins/_buttons.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_buttons.scss
old mode 100644
new mode 100755
similarity index 64%
rename from src/styles/third-party/bootstrap/mixins/_buttons.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_buttons.scss
index 5a215ecf3..b93f84b2c
--- a/src/styles/third-party/bootstrap/mixins/_buttons.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_buttons.scss
@@ -1,8 +1,5 @@
-@use "sass:color";
-@use "../../bootstrap-variables" as bootstrap;
-
 // Button variants
-
+//
 // Easily pump out default styles, as well as :hover, :focus, :active,
 // and disabled options for all buttons
 
@@ -14,27 +11,27 @@
   &:focus,
   &.focus {
     color: $color;
-    background-color: color.scale($background, $lightness: -10%);
-        border-color: color.scale($border, $lightness: -25%);
+    background-color: darken($background, 10%);
+        border-color: darken($border, 25%);
   }
   &:hover {
     color: $color;
-    background-color: color.scale($background, $lightness: -10%);
-        border-color: color.scale($border, $lightness: -12%);
+    background-color: darken($background, 10%);
+        border-color: darken($border, 12%);
   }
   &:active,
   &.active,
   .open > &.dropdown-toggle {
     color: $color;
-    background-color: color.scale($background, $lightness: -10%);
-        border-color: color.scale($border, $lightness: -12%);
+    background-color: darken($background, 10%);
+        border-color: darken($border, 12%);
 
     &:hover,
     &:focus,
     &.focus {
       color: $color;
-      background-color: color.scale($background, $lightness: -17%);
-          border-color: color.scale($border, $lightness: -25%);
+      background-color: darken($background, 17%);
+          border-color: darken($border, 25%);
     }
   }
   &:active,
diff --git a/src/styles/third-party/bootstrap/mixins/_center-block.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_center-block.scss
old mode 100644
new mode 100755
similarity index 100%
rename from src/styles/third-party/bootstrap/mixins/_center-block.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_center-block.scss
diff --git a/src/styles/third-party/bootstrap/mixins/_clearfix.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_clearfix.scss
old mode 100644
new mode 100755
similarity index 99%
rename from src/styles/third-party/bootstrap/mixins/_clearfix.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_clearfix.scss
index eaca2b335..dc3e2ab42
--- a/src/styles/third-party/bootstrap/mixins/_clearfix.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_clearfix.scss
@@ -1,5 +1,5 @@
 // Clearfix
-
+//
 // For modern browsers
 // 1. The space content is one way to avoid an Opera bug when the
 //    contenteditable attribute is included anywhere else in the document.
@@ -7,7 +7,7 @@
 //    that are clearfixed.
 // 2. The use of `table` rather than `block` is only necessary if using
 //    `:before` to contain the top-margins of child elements.
-
+//
 // Source: http://nicolasgallagher.com/micro-clearfix-hack/
 
 @mixin clearfix() {
diff --git a/src/styles/third-party/bootstrap/mixins/_forms.scss b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_forms.scss
old mode 100644
new mode 100755
similarity index 71%
rename from src/styles/third-party/bootstrap/mixins/_forms.scss
rename to src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_forms.scss
index e1a87db48..277aa5f8e
--- a/src/styles/third-party/bootstrap/mixins/_forms.scss
+++ b/src/assets/styles/vendors/bootstrap/stylesheets/bootstrap/mixins/_forms.scss
@@ -1,9 +1,5 @@
-@use "sass:color";
-@use "../../bootstrap-variables" as bootstrap;
-@use "./vendor-prefixes" as vendor;
-
 // Form validation states
-
+//
 // Used in forms.less to generate the form validation CSS for warnings, errors,
 // and successes.
 
@@ -18,75 +14,60 @@
   &.radio label,
   &.checkbox label,
   &.radio-inline label,
-  &.checkbox-inline label {
+  &.checkbox-inline label  {
     color: $text-color;
   }
-
   // Set the border and box shadow on specific inputs to match
   .form-control {
     border-color: $border-color;
-
-    @include vendor.box-shadow(inset 0 1px 1px rgba(0,0,0,0.075)); // Redeclare so transitions work
+    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
     &:focus {
-      border-color: color.scale($border-color, $lightness: -10%);
-
-      $shadow: inset 0 1px 1px rgb(0 0 0 / 7.5%), 0 0 6px color.scale($border-color, $lightness: 20%);
-
-      @include vendor.box-shadow($shadow);
+      border-color: darken($border-color, 10%);
+      $shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten($border-color, 20%);
+      @include box-shadow($shadow);
     }
   }
-
   // Set validation states also for addons
   .input-group-addon {
     color: $text-color;
     border-color: $border-color;
     background-color: $background-color;
   }
-
   // Optional feedback icon
   .form-control-feedback {
     color: $text-color;
   }
 }
 
-// Form control focus state
 
+// Form control focus state
+//
 // Generate a customized focus state and for any input with the specified color,
 // which defaults to the `$input-border-focus` variable.
-
+//
 // We highly encourage you to not customize the default value, but instead use
 // this to tweak colors on an as-needed basis. This aesthetic change is based on
 // WebKit's default styles, but applicable to a wider range of browsers. Its
 // usability and accessibility should be taken into account with any change.
-
+//
 // Example usage: change the default blue border and shadow to white for better
 // contrast against a dark gray background.
-@mixin form-control-focus($color: bootstrap.$input-border-focus) {
-  $color-rgba: rgba(color.red($color), color.green($color), color.blue($color), 60%);
-
+@mixin form-control-focus($color: $input-border-focus) {
+  $color-rgba: rgba(red($color), green($color), blue($color), .6);
   &:focus {
     border-color: $color;
     outline: 0;
-
-    @include vendor.box-shadow(inset 0 1px 1px rgba(0,0,0,0.075), 0 0 8px $color-rgba);
+    @include box-shadow(inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px $color-rgba);
   }
 }
 
 // Form control sizing
-
+//
 // Relative text size, padding, and border-radii changes for form controls. For
 // horizontal sizing, wrap controls in the predefined grid classes. `
+   
+ */ +function mmsCkeditor($uibModal, $templateCache, $timeout, growl, CKEDITOR, _, CacheService, ElementService, UtilsService, ViewService, URLService, MentionService, Utils) { //depends on angular bootstrap + var generatedIds = 0; + + var mmsCkeditorLink = function(scope, element, attrs, ngModelCtrl) { + if (!attrs.id) { + attrs.$set('id', 'mmsCkEditor' + generatedIds++); + } + + var instance = null; + var transcludeModalTemplate = $templateCache.get('mms/templates/mmsCfModal.html'); + var commentModalTemplate = $templateCache.get('mms/templates/mmsCommentModal.html'); + + // Controller for inserting cross reference + // Defines scope variables for html template and how to handle user click + // Also defines options for search interfaces -- see mmsSearch.js for more info + var transcludeCtrl = function($scope, $uibModalInstance) { + $scope.title = 'Insert cross reference'; + $scope.description = 'Begin by searching for an element, then click a field to cross-reference.'; + $scope.searchExisting = true; + $scope.newE = {name: '', documentation: ''}; + $scope.requestName = false; + $scope.requestDocumentation = false; + $scope.showProposeLink = true; + $scope.nonEditableCheckbox = false; + $scope.showEditableOp = true; + $scope.choose = function(elem, property) { + var tag = '[cf:' + elem.name + '.' + property + ']'; +                $uibModalInstance.close(tag); + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + + // Set search result options + $scope.searchOptions= {}; + $scope.searchOptions.getProperties = true; + $scope.searchOptions.callback = $scope.choose; + $scope.searchOptions.emptyDocTxt = 'This field is empty, but you can still click here to cross-reference a placeholder.'; + + $scope.makeNewAndChoose = function() { + if (!$scope.newE.name) { + growl.error('Error: A name for your new element is required.'); + return; + } else if (!$scope.requestName && !$scope.requestDocumentation) { + growl.error('Error: Selection of a property to cross-reference is required.'); + return; + } + $scope.proposeClass = "fa fa-spin fa-spinner"; + var id = UtilsService.createMmsId(); + var toCreate = { + id: id, + ownerId: "holding_bin_" + scope.mmsProjectId, + name: $scope.newE.name, + documentation: $scope.newE.documentation, + type: 'Class', + _appliedStereotypeIds: [] + }; + toCreate = UtilsService.createClassElement(toCreate); + var reqOb = {element: toCreate, projectId: scope.mmsProjectId, refId: scope.mmsRefId}; + + ElementService.createElement(reqOb) + .then(function(data) { + if ($scope.requestName) { + $scope.choose(data, 'name'); + } else if ($scope.requestDocumentation) { + $scope.choose(data, 'doc'); + } + $scope.proposeClass = ""; + }, function(reason) { + growl.error("Propose Error: " + reason.message); + $scope.proposeClass = ""; + }); + }; + $scope.toggleRadio = function(field) { + if (field === "name") { + $scope.requestName = true; + $scope.requestDocumentation = false; + } else if (field === "documentation") { + $scope.requestName = false; + $scope.requestDocumentation = true; + } + }; + }; + + var transcludeCallback = function(ed) { + var instance = $uibModal.open({ + template: transcludeModalTemplate, + scope: scope, + controller: ['$scope', '$uibModalInstance', transcludeCtrl], + size: 'lg' + }); + instance.result.then(function(tag) { + _addWidgetTag(ed, tag); + }, function() { + var focusManager = new CKEDITOR.focusManager( ed ); + focusManager.focus(); + }); + }; + + // Controller for inserting view link + // Defines scope variables for html template and how to handle user click + // If user selects name or doc, link will be to first related doc + // Also defines options for search interfaces -- see mmsSearch.js for more info + var transcludeViewLinkCtrl = function($scope, $uibModalInstance, ApplicationService) { + $scope.title = 'Insert cross reference as link'; + $scope.description = 'Search for a view or content element, click on its name or its document/section to insert link.'; + $scope.showProposeLink = false; + $scope.searchExisting = true; + $scope.suppressNumbering = false; + $scope.suppressName = true; + $scope.linkType = 1; + $scope.linkText = ''; + + // Function to construct view link + var createViewLink = function (elem, did, vid, peid) { + var tag = ''; + return tag; + }; + + $scope.choose = function(elem) { + var did = null; + var vid = null; + var peid = null; + var currentDoc = ApplicationService.getState().currentDoc; + if (elem._relatedDocuments && elem._relatedDocuments.length > 0) { + var cur = _.find(elem._relatedDocuments, {id: currentDoc}); + if (cur) { + did = currentDoc; + if (cur._parentViews.length > 0) { + vid = cur._parentViews[0].id; + } + } else { + did = elem._relatedDocuments[0].id; + if (elem._relatedDocuments[0]._parentViews.length > 0) { + vid = elem._relatedDocuments[0]._parentViews[0].id; + } + } + } + if (elem.type === 'InstanceSpecification') { + if (ViewService.isSection(elem)) { + vid = elem.id; + } else { + peid = elem.id; + } + } else { + vid = elem.id; + } + var tag = createViewLink(elem, did, vid, peid); + $uibModalInstance.close(tag); + }; + $scope.chooseDoc = function(doc, view, elem) { + var did = doc.id; + var vid = view.id; + var peid = null; + if (ViewService.isSection(elem)) { + vid = elem.id; + } else if (ViewService.getPresentationElementType(elem)) { + peid = elem.id; + } + var tag = createViewLink(elem, did, vid, peid); + $uibModalInstance.close(tag); + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + + var mainSearchFilter = function() { + var stereoQuery = {}; + stereoQuery.terms = {"_appliedStereotypeIds": [UtilsService.VIEW_SID, UtilsService.DOCUMENT_SID].concat(UtilsService.OTHER_VIEW_SID)}; + + var classifierList = []; + var allClassifierIds = ViewService.TYPE_TO_CLASSIFIER_ID; + for (var k in allClassifierIds) { + if (allClassifierIds.hasOwnProperty(k)) { + classifierList.push(allClassifierIds[k]); + } + } + var classifierIdQuery = {}; + classifierIdQuery.terms = {"classifierIds": classifierList}; + return { + "bool": { + "should": [ + stereoQuery, + classifierIdQuery + ] + } + }; + }; + + $scope.searchOptions = { + callback: $scope.choose, + relatedCallback: $scope.chooseDoc, + filterQueryList: [mainSearchFilter], + itemsPerPage: 200 + }; + }; + + var viewLinkCallback = function(ed) { + var instance = $uibModal.open({ + template: transcludeModalTemplate, + scope: scope, + controller: ['$scope', '$uibModalInstance', 'ApplicationService', transcludeViewLinkCtrl], + size: 'lg' + }); + instance.result.then(function(tag) { + _addWidgetTag(ed, tag); + }); + }; + + var commentCtrl = function($scope, $uibModalInstance) { + var id = UtilsService.createMmsId(); + $scope.comment = UtilsService.createClassElement({ + id: id, + name: 'Comment ' + new Date().toISOString(), + documentation: '', + type: 'Class', + ownerId: "holding_bin_" + scope.mmsProjectId, + _appliedStereotypeIds: [] + }); + $scope.oking = false; + $scope.ok = function() { + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = true; + var reqOb = {element: $scope.comment, projectId: scope.mmsProjectId, refId: scope.mmsRefId}; + ElementService.createElement(reqOb) + .then(function(data) { + var tag = 'comment:' + data._creator + ''; + $uibModalInstance.close(tag); + }, function(reason) { + growl.error("Comment Error: " + reason.message); + }).finally(function() { + $scope.oking = false; + }); + }; + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }; + + var commentCallback = function(ed) { + var instance = $uibModal.open({ + template: commentModalTemplate, + scope: scope, + controller: ['$scope', '$uibModalInstance', commentCtrl] + }); + instance.result.then(function(tag) { + _addWidgetTag(ed, tag); + }); + }; + + var resetCrossRef = function(type, typeString) { + angular.forEach(type, function(value, key) { + var transclusionObject = angular.element(value); + var transclusionId = transclusionObject.attr('mms-element-id'); + var transclusionKey = UtilsService.makeElementKey({id: transclusionId, _projectId: scope.mmsProjectId, _refId: scope.mmsRefId}); + var inCache = CacheService.get(transclusionKey); + if (inCache) { + transclusionObject.html('[cf:' + inCache.name + typeString); + } else { + //TODO create Utils function to handle request objects + var reqOb = {elementId: transclusionId, projectId: scope.mmsProjectId, refId: scope.mmsRefId}; + ElementService.getElement(reqOb, 2) + .then(function(data) { + transclusionObject.html('[cf:' + data.name + typeString); + }, function(reason) { + var error; + if (reason.status === 410) + error = 'deleted'; + if (reason.status === 404) + error = 'not found'; + transclusionObject.html('[cf:' + error + typeString); + }); + } + }); + }; + + var mmsResetCallback = function(ed) { + var body = ed.document.getBody(); + resetCrossRef(body.find("mms-cf[mms-cf-type='name']").$, '.name]'); + resetCrossRef(body.find("mms-cf[mms-cf-type='doc']").$, '.doc]'); + resetCrossRef(body.find("mms-cf[mms-cf-type='val']").$, '.val]'); + resetCrossRef(body.find('mms-view-link').$, '.vlink]'); + update(); + }; + + var update = function() { + // getData() returns CKEditor's processed/clean HTML content. + if (angular.isDefined(instance) && instance !== null) + ngModelCtrl.$setViewValue(instance.getData()); + }; + + // Formatting editor toolbar + var stylesToolbar = { name: 'styles', items : ['Styles',/*'Format',*/'FontSize','TextColor','BGColor'] }; + var basicStylesToolbar = { name: 'basicstyles', items : [ 'Bold','Italic','Underline', 'mmsExtraFormat'] }; + var clipboardToolbar = { name: 'clipboard', items : [ 'Undo','Redo' ] }; + var justifyToolbar = { name: 'paragraph', items : [ 'JustifyLeft','JustifyCenter','JustifyRight' ] }; + var editingToolbar = { name: 'editing', items : [ 'Find','Replace' ] }; + var linksToolbar = { name: 'links', items : [ 'Link','Unlink','-' ] }; + var imageToolbar = { name: 'image', items: [ 'Image','Iframe' ] }; + var listToolbar = { name: 'list', items: [ 'NumberedList','BulletedList','Outdent','Indent' ] }; + var equationToolbar = { name: 'equation', items: [ 'Mathjax','SpecialChar' ]}; + var sourceToolbar = { name: 'source', items: [ 'Maximize','Sourcedialog' ] }; + var combinedToolbar = { name: 'combined', items: [{name: 'Mmscf', label: 'Cross Reference', command: 'mmscf'}, + {name: 'Mmsvlink',label: 'View/Element Link',command: 'mmsvlink'}, 'Table', 'Image', 'Iframe', 'Mathjax', 'SpecialChar', {name: 'Mmscomment',label: 'Comment', command: 'mmscomment'}, 'mmsExtraFeature' ]}; + // var tableEquationToolbar = { name: 'tableEquation', items: ['Table', 'Mathjax', 'SpecialChar', '-']}; + + var thisToolbar = [stylesToolbar, basicStylesToolbar, justifyToolbar, listToolbar, linksToolbar, combinedToolbar, clipboardToolbar, editingToolbar, sourceToolbar]; + switch(scope.mmsEditorType) { + case 'TableT': + //thisToolbar = [stylesToolbar, basicStylesToolbar, justifyToolbar, linksToolbar, tableEquationToolbar, dropdownToolbar, clipboardToolbar, editingToolbar, sourceToolbar]; + break; + case 'ListT': + thisToolbar = [stylesToolbar, basicStylesToolbar, justifyToolbar, listToolbar, linksToolbar, equationToolbar, 'mmsExtraFeature', clipboardToolbar, editingToolbar, sourceToolbar]; + break; + case 'Equation': + thisToolbar = [justifyToolbar, equationToolbar, sourceToolbar]; + break; + case 'Figure': + case 'ImageT': + thisToolbar = [justifyToolbar, imageToolbar, sourceToolbar]; + break; + } + + var deb = _.debounce(function(e) { + update(); + }, 1000); + + $timeout(function() { + // Initialize ckeditor and set event handlers + $(element).val(ngModelCtrl.$modelValue); + instance = CKEDITOR.replace(attrs.id, { + //customConfig: '/lib/ckeditor/config.js', not needed, this is default and prevents absolute path + mmscf: {callbackModalFnc: transcludeCallback}, + mmscomment: {callbackModalFnc: commentCallback}, + mmsvlink: {callbackModalFnc: viewLinkCallback}, + mmsreset: {callback: mmsResetCallback}, + contentsCss: CKEDITOR.basePath+'contents.css', + toolbar: thisToolbar + }); + + // Enable Autosave plugin only when provided with unique identifier (autosaveKey) + if ( attrs.autosaveKey ) { + // Configuration for autosave plugin + instance.config.autosave = { + SaveKey: attrs.autosaveKey, + delay: 5, + NotOlderThen: 7200, // 5 days in minutes + enableAutosave: true + }; + } else { + instance.config.autosave = {enableAutosave: false}; + } + + instance.on( 'instanceReady', function() { + addCkeditorHtmlFilterRule(instance); + _addContextMenuItems(instance); + highlightActiveEditor(instance); + } ); + + function highlightActiveEditor(instance) { + var activeEditorClass = 'active-editor'; + $('mms-transclude-doc').children('div').removeClass(activeEditorClass); + $(instance.element.$).closest('mms-transclude-doc').children('div').addClass(activeEditorClass); + + instance.on('focus', function() { + $('mms-transclude-doc').children('div').removeClass(activeEditorClass); + $(instance.element.$).closest('mms-transclude-doc').children('div').addClass(activeEditorClass); + }); + } + + function addCkeditorHtmlFilterRule(instance) { + instance.dataProcessor.htmlFilter.addRules({ + elements: { + $: function (element) { + if (element.name === 'script') { + element.remove(); + return; + } + + if (element.name.startsWith('mms-')) { + if (element.name !== 'mms-view-link' && element.name !== 'mms-cf' && element.name !== 'mms-group-docs' && element.name !== 'mms-diff-attr' && element.name !== 'mms-value-link') { + element.replaceWithChildren(); + return; + } + } + + var attributesToDelete = Object.keys(element.attributes).filter(function(attrKey) { + return attrKey.startsWith('ng-'); + }); + attributesToDelete.forEach(function(attrToDelete) { + delete element.attributes[attrToDelete]; + }); + } + } + }); + instance.dataProcessor.dataFilter.addRules({ + elements: { + $: function (element) { + if (element.name === 'script') { + element.remove(); + return; + } + + if (element.name.startsWith('mms-')) { + if (element.name !== 'mms-view-link' && element.name !== 'mms-cf' && element.name !== 'mms-group-docs' && element.name !== 'mms-diff-attr' && element.name !== 'mms-value-link') { + element.replaceWithChildren(); + return; + } + } + + var attributesToDelete = Object.keys(element.attributes).filter(function(attrKey) { + return attrKey.startsWith('ng-'); + }); + attributesToDelete.forEach(function(attrToDelete) { + delete element.attributes[attrToDelete]; + }); + } + } + }); + } + + instance.on( 'init', function(args) { + ngModelCtrl.$setPristine(); + }); + + instance.on( 'change', deb); + instance.on( 'afterCommandExec', deb); + instance.on( 'resize', deb); + instance.on( 'destroy', deb); + instance.on( 'blur', function(e) { + instance.focusManager.blur(); + }); + instance.on( 'key', _keyHandler , null, null, 31); //priority is after indent list plugin's event handler + + _addInlineMention(); + + if (scope.mmsEditorApi) { + scope.mmsEditorApi.save = function() { + update(); + }; + } + instance.on('fileUploadRequest', function(evt) { + var fileLoader = evt.data.fileLoader; + var formData = new FormData(); + var xhr = fileLoader.xhr; + + xhr.open( 'POST', URLService.getPutArtifactsURL({projectId: scope.mmsProjectId, refId: scope.mmsRefId, elementId: UtilsService.createMmsId().replace('MMS', '_hidden_image')}), true ); + //xhr.withCredentials = true; + xhr.setRequestHeader('Authorization', URLService.getAuthorizationHeaderValue()); + formData.append('file', fileLoader.file, fileLoader.fileName ); + if (fileLoader.fileName) { + formData.append('name', fileLoader.fileName); + } + + fileLoader.xhr.send( formData ); + + // Prevented the default behavior. + evt.stop(); + }); + instance.on( 'fileUploadResponse', function( evt ) { + // Prevent the default response handler. + evt.stop(); + + // Get XHR and response. + var data = evt.data; + var xhr = data.fileLoader.xhr; + var response = JSON.parse(xhr.response); + + if ( !response.elements || response.elements.length == 0 || !response.elements[0]._artifacts || response.elements[0]._artifacts.length == 0) { + // An error occurred during upload. + //data.message = response[ 1 ]; + evt.cancel(); + } else { + //TODO does this need to be smarter? + var element = response.elements[0]; + data.url = URLService.getArtifactEmbedURL({projectId: element._projectId, refId: element._refId, elementId: element.id, artifactExtension: element._artifacts[0].extension }); + } + } ); + }, 0, false); + + ngModelCtrl.$render = function() { //commenting out to see if it helps with cursors jumping problem without adverse effects + //side effect is will not sync if editing in both right pane and center pane at the same time + // if (!instance) { + // instance = CKEDITOR.instances[attrs.id]; + // } else { + // var ranges = instance.getSelection().getRanges(); + // instance.setData(ngModelCtrl.$viewValue || ''); + // instance.getSelection().selectRanges( ranges ); + // } + }; + + scope.$on('$destroy', function() { + if (!instance) { + instance = CKEDITOR.instances[attrs.id]; + } else { + MentionService.removeAllMentionForEditor(instance); + instance.destroy(); + instance = null; + } + }); + + function _addWidgetTag(editor, tag) { + editor.insertHtml( tag ); + Utils.focusOnEditorAfterAddingWidgetTag(editor); + } + + function _addInlineMention() { + var keyupHandler; + CKEDITOR.instances[attrs.id].on('contentDom', function() { + keyupHandler = CKEDITOR.instances[instance.name].document.on('keyup', function(e) { + if(_isMentionKey(e.data.$)) { + MentionService.createMention(instance, scope.mmsProjectId, scope.mmsRefId); + } else { + MentionService.handleInput(e, instance, scope.mmsProjectId, scope.mmsRefId); + } + }); + }); + + CKEDITOR.instances[attrs.id].on('contentDomUnload', function() { + if (keyupHandler) { + keyupHandler.removeListener(); + } + }); + } + + function _keyHandler(e) { + if (_isMentionKey(e.data.domEvent.$)) { + return false; // to prevent "@" from getting written to the editor + } + + // when tab is pressed or any of these special keys is pressed while the mention results show up, ignore default ckeditor's behaviour + var ignoreDefaultBehaviour = _isTabKey(e) || (_isSpecialKey(e) && MentionService.hasMentionResults(instance) ); + if ( ignoreDefaultBehaviour ) { + e.cancel(); e.stop(); + } + + if (_isTabKey(e) && !_isShiftKeyOn(e.data.domEvent.$)) { + instance.insertHtml('    '); + } + + if (!ignoreDefaultBehaviour) { + deb(e); + } + } + + // 13 = enter, 38 = up arrow, 40 = down arrow + function _isSpecialKey(event) { + var key = event.data.domEvent.$.which; + return key === 13 || key === 38 || key === 40; + } + + function _isTabKey(event) { + return event.data.domEvent.$.which === 9; + } + + function _isMentionKey(keyboardEvent) { + return _isShiftKeyOn(keyboardEvent) && keyboardEvent.key === '@'; + } + + function _isShiftKeyOn(keyboardEvent) { + return keyboardEvent.shiftKey; + } + + function _addContextMenuItems(editor) { + _addFormatAsCodeMenuItem(editor); + } + + function _addFormatAsCodeMenuItem(editor) { + editor.addCommand('formatAsCode', { + exec: function (editor) { + var selected_text = editor.getSelection().getSelectedText(); + var newElement = new CKEDITOR.dom.element("code"); + newElement.addClass('inlineCode'); + newElement.setText(selected_text); + editor.insertElement(newElement); + } + }); + editor.addMenuGroup('veGroup'); + editor.addMenuItem('formatAsCode', { + label: 'Format as inline code', + command: 'formatAsCode', + group: 'veGroup', + icon: 'codeSnippet' + }); + editor.contextMenu.addListener(function (element) { + return {formatAsCode: CKEDITOR.TRISTATE_OFF}; + }); + editor.setKeystroke( CKEDITOR.CTRL + 75, 'formatAsCode' ); + } + }; + + return { + priority: 10, + restrict: 'A', + require: 'ngModel', + scope: { + mmsProjectId: '@', + mmsRefId: '@', + autosaveKey: '@', + mmsEditorType: '@', + mmsEditorApi: ' 0) { + diagramNode.isGroup = true; + } + + if (elem.parent) { + diagramNode.group = elem.parent; + } + + components.push(diagramNode); + } + + var $ = go.GraphObject.make; + var myDiagram = // create a Diagram for the given HTML DIV element + $(go.Diagram, element[0], + { + allowDrop: true, + // what to do when a drag-drop occurs in the Diagram's background + mouseDrop: + function(e) { + // when the selection is dropped in the diagram's background, + // make sure the selected Parts no longer belong to any Group + var ok = myDiagram.commandHandler.addTopLevelParts(myDiagram.selection, true); + if (!ok) myDiagram.currentTool.doCancel(); + }, + layout: + $(go.GridLayout, + { wrappingWidth: Infinity, alignment: go.GridLayout.Position, + cellSize: new go.Size(1, 1) }), + initialContentAlignment: go.Spot.Center, + groupSelectionAdornmentTemplate: // this applies to all Groups + $(go.Adornment, go.Panel.Auto, + $(go.Shape, "Rectangle", + { fill: null, stroke: "dodgerblue", strokeWidth: 3 }), + $(go.Placeholder)), + "commandHandler.archetypeGroupData": { isGroup: true, category: "OfNodes" }, + "undoManager.isEnabled": true + }); + + + + + myDiagram.addDiagramListener("ChangedSelection", function(e) { + + var selnode = myDiagram.selection.first(); + myDiagram.model.selectedNodeData = (selnode instanceof go.Node ? selnode.data : null); + scope.$apply(); + + }); + + + function highlightGroup(e, grp, show) { + if (!grp) return; + e.handled = true; + if (show) { + // cannot depend on the grp.diagram.selection in the case of external drag-and-drops; + // instead depend on the DraggingTool.draggedParts or .copiedParts + var tool = grp.diagram.toolManager.draggingTool; + var map = tool.draggedParts || tool.copiedParts; // this is a Map + // now we can check to see if the Group will accept membership of the dragged Parts + if (grp.canAddMembers(map.toKeySet())) { + grp.isHighlighted = true; + return; + } + } + grp.isHighlighted = false; + } + + function finishDrop(e, grp) { + var ok = grp !== null && grp.addMembers(grp.diagram.selection, true); + if (!ok) grp.diagram.currentTool.doCancel(); + } + + myDiagram.groupTemplate = + $(go.Group, "Auto", + { // define the group's internal layout + layout: $(go.TreeLayout, + { angle: 90, arrangement: go.TreeLayout.ArrangementHorizontal, isRealtime: false }), + // the group begins unexpanded; + // upon expansion, a Diagram Listener will generate contents for the group + isSubGraphExpanded: false, + // when a group is expanded, if it contains no parts, generate a subGraph inside of it + subGraphExpandedChanged: function(group) { + if (group.memberParts.count === 0) { + //randomGroup(group.data.key); + } + } + }, + $(go.Shape, "RoundedRectangle", + { fill: null, stroke: "gray", strokeWidth: 2 }), + $(go.Panel, "Vertical", + { defaultAlignment: go.Spot.Left, margin: 4 }, + $(go.Panel, "Horizontal", + { defaultAlignment: go.Spot.Top }, + // the SubGraphExpanderButton is a panel that functions as a button to expand or collapse the subGraph + $("SubGraphExpanderButton"), + $(go.TextBlock, + { font: "Bold 18px Sans-Serif", margin: 4 }, + new go.Binding("text", "text")) + ), + // create a placeholder to represent the area where the contents of the group are + $(go.Placeholder, + { padding: new go.Margin(0, 10) }) + ) + ); // end Group + + + + // whenever a GoJS transaction has finished modifying the model, update all Angular bindings + function updateAngular(e) { + if (e.isTransactionFinished) scope.$apply(); + } + + + + // notice when the value of "model" changes: update the Diagram.model + /* scope.$watch("model", function(var newmodel) { + var oldmodel = diagram.model; + if (oldmodel !== newmodel) { + if (oldmodel) oldmodel.removeChangedListener(updateAngular); + newmodel.addChangedListener(updateAngular); + diagram.model = newmodel; + } + }); */ + // update the model when the selection changes + + // the template for each attribute in a node's array of item data + var itemTempl = + $(go.Panel, "Horizontal", + $(go.Shape, //node's object rendering + { desiredSize: new go.Size(5, 5) }, + new go.Binding("figure", "figure"), + new go.Binding("fill", "color")), + $(go.TextBlock, + { stroke: "$black", + font: "bold 11px sans-serif" }, + new go.Binding("text", "", go.Binding.toString)) + ); + + + + myDiagram.nodeTemplate = + $(go.Node, go.Panel.Auto, + { + selectionAdorned: true, + resizable: true, + layoutConditions: go.Part.LayoutStandard & ~go.Part.LayoutNodeSized, + fromSpot: go.Spot.Right, + toSpot: go.Spot.Left, + isShadowed: true, + // highlight when dragging over a Node that is inside a Group + mouseDragEnter: function(e, nod, prev) { highlightGroup(e, nod.containingGroup, true); }, + mouseDragLeave: function(e, nod, next) { highlightGroup(e, nod.containingGroup, false); }, + // dropping on a Node is the same as dropping on its containing Group, if any + mouseDrop: function(e, nod) { finishDrop(e, nod.containingGroup); } + }, + $(go.Shape, "RoundedRectangle", + { isPanelMain: true, fill: "#ACE600", stroke: "#558000", strokeWidth: 2 }, + new go.Binding("fill", "color")), + $(go.Panel, "Table", + { margin: 4, maxSize: new go.Size(150, NaN) }, + // the two TextBlocks in column 0 both stretch in width + // but align on the left side + $(go.RowColumnDefinition, + { + column: 0, + stretch: go.GraphObject.Horizontal, + alignment: go.Spot.Left + }), + $(go.TextBlock, + { row: 0, column: 0, + maxSize: new go.Size(120, NaN), + margin: 2, + font: "bold 10pt sans-serif", + alignment: go.Spot.Top + }, + new go.Binding("text", "text")),//.makeTwoWay()), + /* $(go.TextBlock, + { + row: 1, column: 0, columnSpan: 2, + font: "8pt sans-serif" + }, + new go.Binding("text", "", theInfoTextConverter)) */ + + //panel for displaying properties + $(go.Panel, "Vertical", + { row: 1, + padding: 3, + alignment: go.Spot.TopLeft, + defaultAlignment: go.Spot.Left, + stretch: go.GraphObject.Horizontal, + itemTemplate: itemTempl }, + new go.Binding("itemArray", "items")) + ) + ); + + //Links organization, keep links from crossing over nodes + myDiagram.linkTemplate = + $(go.Link, + { routing: go.Link.AvoidsNodes, corner: 5, + curve: go.Link.JumpGap }, + $(go.Shape), + $(go.Shape, { toArrow: "Standard" }) + ); + + // Link components to diagram + myDiagram.model = new go.GraphLinksModel( + components, + graph.edges + ); + + myDiagram.model.selectedNodeData = null; + + + }, function(reason) { + growl.error('Block Diagram Error: ' + reason.message); + }); + }; + + return { + restrict: 'E', + template: '
', // just a simple DIV element + replace: true, + scope: { + mmsDid : '@' + }, + controller: ['ElementService', mmsDiagramBlockCtrl], + link: mmsDiagramBlockLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsDiffAttr.js b/src/directives/mmsDiffAttr.js new file mode 100755 index 000000000..bea84ceee --- /dev/null +++ b/src/directives/mmsDiffAttr.js @@ -0,0 +1,214 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsDiffAttr', ['$compile', '$interval', '$templateCache', '$q', 'ElementService', mmsDiffAttr]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsDiffAttr + * + * @requires mms.ElementService + * @requires $compile + * @requires $interval + * @requires ElementService + * + * @restrict E + * + * @description + * Compares a element at two different refs/commits and generates a pretty diff. + * ## Example + * + * + * @param {string} mmsAttr Attribute to use - ie `name`, `doc` or `value` + * @param {string} mmsBaseElementId The id of the element to do comparison of + * @param {string} mmsBaseProjectId Base project ID for original/base element + * @param {string} mmsCompareProjectId Compare project ID for compare element + * @param {string=master} mmsBaseRefId Base ref ID or master, defaults to current ref or master + * @param {string=master} mmsCompareRefId Compare ref ID or master, defaults to base ref ID + * @param {string=latest} mmsBaseCommitId Base commit id, default is latest + * @param {string=latest} mmsCompareCommitId Compare commit id, default is latest + */ +function mmsDiffAttr($compile, $interval, $templateCache, $q, ElementService) { + var template = $templateCache.get('mms/templates/mmsDiffAttr.html'); + + return { + restrict: 'E', + scope: { + mmsAttr: '@', + + mmsBaseProjectId: '@', + mmsCompareProjectId: '@', + + mmsBaseRefId: '@', + mmsCompareRefId: '@', + + mmsBaseCommitId: '@', + mmsCompareCommitId: '@', + + mmsBaseElementId: '@', + mmsCompareElementId: '@' + }, + template: template, + link: mmsDiffAttrLink, + require: '?^^mmsView' + }; + + function mmsDiffAttrLink(scope, element, attrs, mmsViewCtrl) { + var viewOrigin = mmsViewCtrl ? mmsViewCtrl.getElementOrigin() : null; + scope.diffFinish = function() { scope.diffLoading = false; }; + scope.$watch('mmsBaseCommitId', _commitIdChangeHandler); + scope.$watch('mmsCompareCommitId', _commitIdChangeHandler); + + var baseNotFound = false; + var compNotFound = false; + var baseDeleted = false; + var compDeleted = false; + + _setupDiff(); + + function _setupDiff() { + scope.diffLoading = true; + + var baseProjectId = scope.mmsBaseProjectId || (viewOrigin ? viewOrigin.projectId : null); + var compareProjectId = scope.mmsCompareProjectId || baseProjectId; + + var baseRefId = scope.mmsBaseRefId || (viewOrigin ? viewOrigin.refId : 'master'); + var compareRefId = scope.mmsCompareRefId || baseRefId; + + var baseCommitId = scope.mmsBaseCommitId || 'latest'; + var compareCommitId = scope.mmsCompareCommitId || 'latest'; + + var baseElementId = scope.mmsBaseElementId; + var compareElementId = scope.mmsCompareElementId || baseElementId; + + var isSame = _checkSameElement({ + baseElementId: baseElementId, + compareElementId: compareElementId, + + baseCommitId: baseCommitId, + compareCommitId: compareCommitId, + + baseRefId: baseRefId, + compareRefId: compareRefId, + + baseProjectId: baseProjectId, + compareProjectId: compareProjectId + }); + if (isSame) { + return; + } + + var baseElementPromise = _getElementData(baseProjectId, baseRefId, baseCommitId, baseElementId); + var comparedElementPromise = _getElementData(compareProjectId, compareRefId, compareCommitId, compareElementId); + + $q.allSettled([baseElementPromise, comparedElementPromise]).then(function(responses) { + var message; + + var respForBaseElement = responses[0]; + if (respForBaseElement.state === 'fulfilled') { + _fullyRender(respForBaseElement.value, function(baseElementHtml) { + scope.baseElementHtml = baseElementHtml; + }); + } else { + message = respForBaseElement.reason.message; + if (message && message.toLowerCase().includes("deleted")) { + baseDeleted = true; + } else { + baseNotFound = true; + } + scope.baseElementHtml = ''; + } + + var respForComparedElement = responses[1]; + if(respForComparedElement.state === 'fulfilled') { + _fullyRender(respForComparedElement.value, function(comparedElementHtml) { + scope.comparedElementHtml = comparedElementHtml; + }); + } else { + message = respForComparedElement.reason.message; + if (message && message.toLowerCase().includes("deleted")) { + compDeleted = true; + } else { + compNotFound = true; + } + scope.comparedElementHtml = ''; + } + scope.message = _checkElementExistence(); + + }); + } + + function _commitIdChangeHandler(newVal, oldVal) { + if (newVal !== oldVal) { + _setupDiff(); + } + } + + function _getElementData(projectId, refId, commitId, elementId) { + return ElementService.getElement({ + projectId: projectId, + elementId: elementId, + refId: refId, + commitId: commitId + }); + } + + function _fullyRender(data, finishRenderCb) { + var element = _createElement(scope.mmsAttr, data.id, data._projectId, data._refId, data._commitId); + var handler = $interval(function() { + var baseHtml = element.html(); + if (!baseHtml.includes("(loading...)")) { + $interval.cancel(handler); + finishRenderCb(baseHtml); + } + }, 10); + } + + function _createElement(type, mmsElementId, mmsProjectId, mmsRefId, mmsCommitId) { + var html; + var ignoreMathjaxAutoFormatting = type === 'doc' || type === 'val' || type === 'com'; + html = ''; + //Todo: Refactor in Angular to @codehint-ng/html-compiler + var newScope = scope.$new(); + newScope = Object.assign(newScope, { + type: type, + mmsElementId: mmsElementId, + mmsProjectId: mmsProjectId, + mmsRefId: mmsRefId, + mmsCommitId: mmsCommitId, + mmsGenerateForDiff: true + }); + return $compile(html)(newScope); + } + + function _checkElementExistence() { + var message = ''; + if (baseNotFound && compNotFound) { + message = ' Both base and compare elements do not exist.'; + } else if (baseNotFound) { + message = ' This is a new element.'; + } else if (compNotFound) { + message = ' Comparison element does not exist.'; + } + if (baseDeleted && compDeleted) { + message = ' This element has been deleted.'; + } else if (baseDeleted){ + message = ' Base element has been deleted.'; + } else if (compDeleted){ + message = ' Comparison element has been deleted.'; + } + return message; + } + + function _checkSameElement(data) { + if ( (data.baseCommitId !== 'latest' && data.baseCommitId === data.compareCommitId ) || + (data.baseCommitId === 'latest' && data.baseCommitId === data.compareCommitId && data.baseElementId === data.compareElementId && data.baseProjectId === data.compareProjectId && data.baseRefId === data.compareRefId )) { + scope.message = ' Comparing same version.'; + scope.diffLoading = false; + return true; + } + } + } +} diff --git a/src/directives/mmsGroupDocs.js b/src/directives/mmsGroupDocs.js new file mode 100755 index 000000000..286ff8ea1 --- /dev/null +++ b/src/directives/mmsGroupDocs.js @@ -0,0 +1,87 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsGroupDocs', ['ElementService', 'ViewService', 'growl', '$q', '$templateCache', '_', mmsGroupDocs]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsGroupDocs + * + * @requires mms.ElementService + * + * @restrict E + * + * @description + * + * @param {string} mmsGroupId The id of the group to show documents for + * @param {string=master} mmsRefId Ref, defaults to master + * @param {string} mmsProjectId Project Id, if not stated will get from surrounding view + */ +function mmsGroupDocs(ElementService, ViewService, growl, $q, $templateCache, _) { + + var mmsGroupDocsLink = function(scope, element, attrs, controllers) { + var mmsCfCtrl = controllers[0]; + var mmsViewCtrl = controllers[1]; + var update = function(documents) { + var docs = []; + var groupId = scope.mmsGroupId === '' ? undefined : scope.mmsGroupId; + for (var i = 0; i < documents.length; i++) { + if ( (groupId === undefined || groupId === scope.projectId) && !documents[i]._groupId ) { + docs.push(documents[i]); + } else if (documents[i]._groupId == scope.mmsGroupId) { + docs.push(documents[i]); + } + } + scope.docs = docs; + }; + + var projectId = scope.mmsProjectId; + var refId = scope.mmsRefId; + if (mmsCfCtrl) { + var cfVersion = mmsCfCtrl.getElementOrigin(); + if (!projectId) { + projectId = cfVersion.projectId; + } + if (!refId) { + refId = cfVersion.refId; + } + } + if (mmsViewCtrl) { + var viewVersion = mmsViewCtrl.getElementOrigin(); + if (!projectId) { + projectId = viewVersion.projectId; + } + if (!refId) { + refId = viewVersion.refId; + } + } + if (!projectId) { + return; + } + scope.projectId = projectId; + scope.refId = refId ? refId : 'master'; + ViewService.getProjectDocuments({ + projectId: scope.projectId, + refId: scope.refId + }, 2).then(function(documents) { + update(documents); + scope.documents = documents; + scope.$watchCollection('documents', function(newVal, oldVal) { + update(newVal); + }); + }); + }; + + + return { + restrict: 'E', + template: $templateCache.get('mms/templates/mmsGroupDocs.html'), + scope: { + mmsRefId: '@', + mmsProjectId: '@', + mmsGroupId: '@' + }, + require: ['?^^mmsCf', '?^^mmsView'], + link: mmsGroupDocsLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsHistory.js b/src/directives/mmsHistory.js new file mode 100755 index 000000000..187245dc4 --- /dev/null +++ b/src/directives/mmsHistory.js @@ -0,0 +1,171 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsHistory', ['Utils','ElementService', 'ProjectService', '$templateCache', '$q', '$animate', '$uibModal', '_', mmsHistory]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsHistory + * + * @requires mms.ElementService + * @requires mms.ProjectService + * @requires $templateCache + * @requires $q + * @requires _ + * + * @restrict E + * + * @description + * Outputs a history window of the element whose id is specified. History includes + * name of modifier and date of change. Also modified date links to spec output below. + * + * ### template (html) + * ## Example for showing an element history + *
+    
+    
+ * + * @param {string} mmsElementId The id of the element + * @param {string} mmsProjectId The project id for the element + * @param {string=master} mmsRefId Reference to use, defaults to master + */ +function mmsHistory(Utils, ElementService, ProjectService, $templateCache, $q, $animate, $uibModal, _) { + var template = $templateCache.get('mms/templates/mmsHistory.html'); + + var mmsHistoryLink = function(scope, element, attrs) { + var ran = false; + var lastid = null; + scope.historyVer = 'latest'; + scope.compareCommit = { + ref: {id: scope.mmsRefId}, + compareHistory: null, + commitSelected: null, + isopen: false + }; + + + // base data + scope.refList = []; + scope.baseCommit = { + refSelected: {id: scope.mmsRefId}, + baseHistory: null, + commitSelected: null, + isopen: false, + refisopen: false + }; + + + // Get current scope element info + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: scope.mmsRefId}; + ElementService.getElement(reqOb, 2, false) + .then(function(data) { + scope.element = data; + }); + + /** + * @ngdoc function + * @name mms.directives.directive:mmsHistory#changeElement + * @methodOf mms.directives.directive:mmsHistory + * + * @description + * Change scope history when another element is selected + */ + var changeElement = function(newVal, oldVal) { + if (!newVal || (newVal == oldVal && ran)) + return; + ran = true; + lastid = newVal; + scope.gettingHistory = true; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: scope.mmsRefId}; + ElementService.getElementHistory(reqOb, 2) + .then(function(data) { + if (newVal !== lastid) + return; + scope.historyVer = 'latest'; + scope.compareCommit.compareHistory = data; + scope.compareCommit.commitSelected = scope.compareCommit.compareHistory[0]; + getRefs(); + scope.baseCommit.baseHistory = data; + if (data.length > 1) { + scope.baseCommit.commitSelected = scope.compareCommit.compareHistory[1]; + } else if (data.length > 0) { + scope.baseCommit.commitSelected = scope.compareCommit.compareHistory[0]; + } else { + scope.baseCommit.commitSelected = '--- none ---'; + } + }).finally(function() { + scope.gettingHistory = false; + }); + }; + + // Get ref list for project and details on + var getRefs = function() { + ProjectService.getRefs(scope.mmsProjectId) + .then(function(data) { + scope.refList = data; + scope.compareCommit.ref = _.find(data, function(item) { + return item.id == scope.mmsRefId; + }); + scope.baseCommit.refSelected = scope.compareCommit.ref; + }); + }; + + scope.commitClicked = function(version) { + scope.compareCommit.commitSelected = version; + scope.historyVer = scope.compareCommit.commitSelected.id; + scope.compareCommit.isopen = !scope.compareCommit.isopen; + }; + + scope.getElementHistoryByRef = function(ref) { + if (ref) { + scope.disableRevert = false; + // scope.gettingCompareHistory = true; + scope.baseCommit.refSelected = ref; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: ref.id}; + ElementService.getElementHistory(reqOb, 2) + .then(function(data) { + scope.baseCommit.baseHistory = data; + if (data.length > 0) { + scope.baseCommit.commitSelected = scope.baseCommit.baseHistory[0]; + } + }, function(error) { + scope.baseCommit.baseHistory = []; + scope.baseCommit.commitSelected = ''; + scope.disableRevert = true; + }).finally(function() { + // scope.gettingCompareHistory = false; + scope.baseCommit.refisopen = !scope.baseCommit.refisopen; + }); + } + }; + + scope.baseCommitClicked = function(version) { + scope.baseCommit.commitSelected = version; + scope.baseCommit.isopen = !scope.baseCommit.isopen; + }; + + scope.changeElement = changeElement; + scope.$watch('mmsElementId', changeElement); + scope.$watch('mmsRefId', changeElement); + + + //TODO + // check if commit ids are the same - display to user that they are comparing same or disable the commit that matches + scope.revert = function() { + Utils.revertAction(scope, changeElement, element); + }; + + }; + + return { + restrict: 'E', + template: template, + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@' + }, + link: mmsHistoryLink + }; +} diff --git a/src/directives/mmsHtmlDiff.js b/src/directives/mmsHtmlDiff.js new file mode 100755 index 000000000..309ce1f59 --- /dev/null +++ b/src/directives/mmsHtmlDiff.js @@ -0,0 +1,80 @@ +'use strict'; + +angular.module('mms.directives') + .directive('mmsHtmlDiff', ['$templateCache', '$timeout', 'MathJax', 'HtmlRenderedDiff', mmsHtmlDiff]); + +function mmsHtmlDiff($templateCache, $timeout, MathJax, HtmlRenderedDiff) { + var template = $templateCache.get('mms/templates/mmsHtmlDiff.html'); + var htmlDiffIdPrefix = 'htmlDiff-'; + return { + restrict: 'E', + scope: { + mmsBaseHtml: '<', + mmsComparedHtml: '<', + mmsDiffFinish: '<' + }, + template: template, + controller: ['$scope', mmsHtmlDiffCtrl], + link: mmsHtmlDiffLink + }; + + function mmsHtmlDiffCtrl($scope) { + _performDiff($scope, $scope.mmsBaseHtml, $scope.mmsComparedHtml); + } + + function mmsHtmlDiffLink(scope, element, attrs) { + scope.htmlDiffId = htmlDiffIdPrefix + scope.$id; + scope.$watch('mmsBaseHtml', function(newBaseHtml, oldBaseHtml) { + if (newBaseHtml !== oldBaseHtml) { + _performDiff(scope, scope.mmsBaseHtml, scope.mmsComparedHtml); + } + }); + + scope.$watch('mmsComparedHtml', function(newComparedHtml, oldComparedHtml) { + if(newComparedHtml !== oldComparedHtml) { + _performDiff(scope, scope.mmsBaseHtml, scope.mmsComparedHtml); + } + }); + } + + function _performDiff(scope, baseHtml, comparedHtml) { + scope.diffResult = HtmlRenderedDiff.generateDiff(_preformatHtml(baseHtml), _preformatHtml(comparedHtml)); + $timeout(function() { + var diffContainer = $('#' + scope.htmlDiffId); + _formatImgDiff(diffContainer); + _formatRowDiff(diffContainer); + scope.mmsDiffFinish(); + }); + } + + function _preformatHtml(html) { + return html.replace(/\r?\n|\r|\t/g, '').replace('

 

', ''); + } + + function _formatImgDiff(diffContainer) { + diffContainer + .find('img') + .each(function () { + var img$ = $(this); + var imgPatcherClass = img$.hasClass('patcher-insert') ? 'patcher-insert' : img$.hasClass('patcher-delete') ? 'patcher-delete' : null; + if (imgPatcherClass) { + img$.wrap(''); + } + }); + } + + function _formatRowDiff(diffContainer) { + diffContainer + .find('tr') + .each(function () { + var tr$ = $(this); + var trPatcherClass = tr$.hasClass('patcher-insert') ? 'patcher-insert' : tr$.hasClass('patcher-delete') ? 'patcher-delete' : null; + if (trPatcherClass) { + tr$.removeClass(trPatcherClass); + tr$.children().each(function() { + $(this).addClass(trPatcherClass); + }); + } + }); + } +} diff --git a/src/directives/mmsMaturityBar.js b/src/directives/mmsMaturityBar.js new file mode 100755 index 000000000..e8e5b8333 --- /dev/null +++ b/src/directives/mmsMaturityBar.js @@ -0,0 +1,130 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsMaturityBar', ['$window', mmsMaturityBar]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsMaturityBar + * + * @restrict E + * + * @description + * + * @param {string} state The current state of the maturity bar + */ +function mmsMaturityBar($window) { + + var mmsMaturityBarLink = function(scope, element, attrs) { + var d3 = $window.d3; + + var svgContainer = d3.select(element[0]).append('svg') + .attr("width", 520) + .attr("height", 70); + var colorRect; + + if(scope.state == "Identified") { + colorRect = ["brown","#B0B0B0","#B0B0B0","#B0B0B0","#B0B0B0"]; + } else if (scope.state == "Draft") { + colorRect = ["#FF7519","#FF7519","#B0B0B0","#B0B0B0","#B0B0B0"]; + } else if (scope.state == "Prelim") { + colorRect = ["#FFAA00","#FFAA00","#FFAA00","#B0B0B0","#B0B0B0"]; + } else if (scope.state == "Baseline") { + colorRect = ["#04859E","#04859E","#04859E","#04859E","#B0B0B0"]; + } else if (scope.state == "Final") { + colorRect = ["#00BD39","#00BD39","#00BD39","#00BD39","#00BD39"]; + } else { + colorRect = ["#B0B0B0","#B0B0B0","#B0B0B0","#B0B0B0","#B0B0B0"]; + } + + svgContainer.append("rect") + .attr("x", 10) + .attr("y", 10) + .attr("width", 100) + .attr("height", 50) + .style("fill",colorRect[0]) + .style("stroke","#fff") + .style("stroke-width",3); + svgContainer.append("text") + .text("Identified") + .attr("x",60) + .attr("y",35) + .attr("dy", ".35em") + .attr("fill","#fff") + .attr("font-family","sans-serif") + .style("text-anchor", "middle"); + svgContainer.append("rect") + .attr("x", 110) + .attr("y", 10) + .attr("width", 100) + .attr("height", 50) + .style("fill",colorRect[1]) + .style("stroke","#fff") + .style("stroke-width",3); + svgContainer.append("text") + .text("Draft") + .attr("x",160) + .attr("y",35) + .attr("dy", ".35em") + .attr("fill","#fff") + .attr("font-family","sans-serif") + .style("text-anchor", "middle"); + svgContainer.append("rect") + .attr("x", 210) + .attr("y", 10) + .attr("width", 100) + .attr("height", 50) + .style("fill",colorRect[2]) + .style("stroke","#fff") + .style("stroke-width",3); + svgContainer.append("text") + .text("Prelim") + .attr("x",260) + .attr("y",35) + .attr("dy", ".35em") + .attr("fill","#fff") + .attr("font-family","sans-serif") + .style("text-anchor", "middle"); + svgContainer.append("rect") + .attr("x", 310) + .attr("y", 10) + .attr("width", 100) + .attr("height", 50) + .style("fill",colorRect[3]) + .style("stroke","#fff") + .style("stroke-width",3); + svgContainer.append("text") + .text("Baseline") + .attr("x",360) + .attr("y",35) + .attr("dy", ".35em") + .attr("fill","#fff") + .attr("font-family","sans-serif") + .style("text-anchor", "middle"); + svgContainer.append("rect") + .attr("x", 410) + .attr("y", 10) + .attr("width", 100) + .attr("height", 50) + .style("fill",colorRect[4]) + .style("stroke","#fff") + .style("stroke-width",3); + svgContainer.append("text") + .text("Final") + .attr("x",460) + .attr("y",35) + .attr("dy", ".35em") + .attr("fill","#fff") + .attr("font-family","sans-serif") + .style("text-anchor", "middle"); + }; + + return { + restrict: 'E', + template: '', + scope: { + state: '@' + }, + link: mmsMaturityBarLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsMention.js b/src/directives/mmsMention.js new file mode 100755 index 000000000..74996864d --- /dev/null +++ b/src/directives/mmsMention.js @@ -0,0 +1,60 @@ +'use strict'; + +angular.module('mms.directives') + .directive('mmsMention', ['$templateCache', 'MentionService', 'Utils', mmsMention]); + +function mmsMention($templateCache, MentionService, Utils) { + return { + template: $templateCache.get('mms/templates/mmsMention.html'), + scope: { + mmsEditor: '<', + mmsMentionValue: '<', + mmsMentionId: '<', + mmsProjectId: '<', + mmsRefId: '<' + }, + controller: ['$scope', mmsMentionCtrl], + link: mmsMentionLink + }; + function mmsMentionLink(scope, element, attrs, ctrls) {} + + function mmsMentionCtrl($scope) { + $scope.fastCfListing = MentionService.getFastCfListing($scope.mmsProjectId, $scope.mmsRefId); + // expose this api on the controller itself so that it can be accessed by codes that use $compile service to construct this directive. + this.selectMentionItem = selectMentionItem; + $scope.selectMentionItem = selectMentionItem; + + function selectMentionItem($item) { + _createCf($item); + MentionService.handleMentionSelection($scope.mmsEditor, $scope.mmsMentionId); + } + + function _createCf($item) { + var tag = '[cf:' + $item.name + '.' + $item.type + ']'; + $scope.mmsEditor.insertHtml(tag); + Utils.focusOnEditorAfterAddingWidgetTag($scope.mmsEditor); + } + } +} + +// Used to sync value between input from the ckeditor and the uib-typeahead directive +angular.module('mms.directives') + .directive('mmsMentionIntercept', ['$templateCache', mmsMentionIntercept]); + +function mmsMentionIntercept() { + return { + scope: { + mmsMentionInterceptValue: '<' + }, + controller: ['$scope', mmsTestingController], + require: ['ngModel'], + link: function(scope, el, attrs, ctls) { + scope.$watch('mmsMentionInterceptValue', function(newV, oldV) { + var ngModelCtrl = ctls[0]; + ngModelCtrl.$setViewValue(newV); + ngModelCtrl.$render(); + }); + } + }; + function mmsTestingController($scope) {} +} diff --git a/src/directives/mmsRefList.js b/src/directives/mmsRefList.js new file mode 100755 index 000000000..caff4ef39 --- /dev/null +++ b/src/directives/mmsRefList.js @@ -0,0 +1,120 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsRefList', ['$templateCache', '$http', 'growl', '_', '$q', '$uibModal', + 'UtilsService', 'ElementService', 'URLService', 'PermissionsService', mmsRefList]); +/** + * @ngdoc directive + * @name mms.directives.directive:mmsRefList + * + * @requires $templateCache + * @requires $http + * @requires $location + * @requires _ + * + * @restrict E + * + * @description + * Displays a list of branches/tags with details. Provides options for taking action on ref. + * For the time being it only allows for running a doc merge job on current document. + * + * @param {string=master} mmsProjectId Current project + * @param {string=master} mmsRefId Current branch + * @param {string=null} mmsDocId the id of the current document + */ +function mmsRefList($templateCache, $http, growl, _ , $q, $uibModal, + UtilsService, ElementService, URLService, PermissionsService) { + + var template = $templateCache.get('mms/templates/mmsRefList.html'); + + var mmsRefListLink = function (scope, element, attrs) { + var ran; + scope.showMerge = URLService.getMmsServer().indexOf('opencae.jpl.nasa.gov') == -1; + scope.runCleared = true; + scope.docEditable = false; + scope.currentRefOb = _.find(scope.mmsBranches, { 'id': scope.mmsRefId }); + if (scope.currentRefOb == undefined){ + scope.currentRefOb = _.find(scope.mmsTags, { 'id': scope.mmsRefId }); + } + + //Callback function for document change + var changeDocument = function (newVal, oldVal) { + if (!newVal || (newVal == oldVal && ran)) + return; + ran = true; + var reqOb = {elementId: scope.mmsDocId, projectId: scope.mmsProjectId, refId: scope.mmsRefId}; + ElementService.getElement(reqOb, 2, false) + .then(function (document) { + if (!UtilsService.isDocument(document)) { + scope.isDoc = false; + return; + } else { + scope.isDoc = true; + } + scope.doc = document; + scope.docName = document.name; + scope.docEditable = scope.mmsRefType != 'Tag' && PermissionsService.hasProjectIdBranchIdEditPermission(scope.mmsProjectId, scope.mmsRefId); + }); + }; + + // watch for the document to change + scope.$watch('mmsDocId', changeDocument); + + + scope.docMergeAction = function (srcRef) { + var templateUrlStr = 'mms/templates/mergeConfirm.html'; + scope.srcRefOb = srcRef; + + var instance = $uibModal.open({ + templateUrl: templateUrlStr, + scope: scope, + controller: ['$scope', '$uibModalInstance', '$filter', mergeDocCtrl] + }); + instance.result.then(function(data) { + // TODO: do anything here? + }); + }; + + var mergeDocCtrl = function($scope, $uibModalInstance, $filter) { + $scope.oking = false; + $scope.commitMessage = ''; + $scope.createForm = true; + + $scope.ok = function() { + if ($scope.oking) { + growl.info("Please wait..."); + return; + } + $scope.oking = false; + // $scope.createJobandRun($scope.srcRefOb.id, $scope.commitMessage) + // .then(function(data) { + // growl.success("Creating job to merge documents... please see the jobs pane for status updates"); + // $uibModalInstance.close(data); + // }, function(reason) { + // growl.error("Could not merge document: " + reason.message); + // }).finally(function() { + // $scope.oking = false; + // }); + }; + + $scope.cancel = function() { + $uibModalInstance.dismiss(); + }; + }; + + + }; + return { + restrict: 'E', + template: template, + scope: { + mmsProjectId: '@', + mmsRefId: '@', + mmsRefType: '@', + mmsDocId:'@', + mmsBranches: '<', + mmsTags: '<' + }, + link: mmsRefListLink + }; +} diff --git a/src/directives/mmsSearch.js b/src/directives/mmsSearch.js new file mode 100755 index 000000000..5672ecd7f --- /dev/null +++ b/src/directives/mmsSearch.js @@ -0,0 +1,789 @@ +'use strict'; + +angular.module('mms.directives') + .directive('mmsSearch', ['$window', '$anchorScroll', 'CacheService', 'ElementService', 'ProjectService', 'UtilsService', 'ViewService', '_', 'growl', '$templateCache', '$timeout', mmsSearch]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsSearch + * + * @restrict E + * + * @description + * TBA + * + * @scope + * + */ +function mmsSearch($window, $anchorScroll, CacheService, ElementService, ProjectService, UtilsService, ViewService, _, growl, $templateCache, $timeout) { + var template = $templateCache.get('mms/templates/mmsSearch.html'); + return { + restrict: 'E', + template: template, + link: mmsSearchLink, + scope: { + mmsOptions: '<', + mmsProjectId: '@', + mmsRefId: '@' + } + }; + + + function mmsSearchLink(scope, element, attrs) { + // Main search variables + var baseSearchResults = []; + scope.showFilterOptions = !scope.mmsOptions.hideFilterOptions; + scope.searchLoading = false; + scope.mainSearch = { + searchText: '', + searchType: { + id: 'all', + label: 'All Fields' + }, + selectedSearchMetatypes: [] + }; + scope.docsviews = { + selected: false + }; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + + scope.qualifiedNameFormatter = function(qualifiedName) { + if (qualifiedName) { + var parts = qualifiedName.split('/'); + var result = qualifiedName; + if (parts.length > 7) { + result = parts.slice(0, 4).join('/') + '/.../' + parts.slice(parts.length - 3, parts.length).join('/'); + } + return result; + } + }; + + scope.expandQualifiedName = function($event, qualifiedName) { + $event.currentTarget.innerHTML = qualifiedName; + }; + + scope.showMoreRelatedViews = function(element) { + element.remainingRelatedDocuments = element.allRelatedDocuments.slice(3, element.allRelatedDocuments.length); + }; + // Search resulte settings + scope.activeFilter = []; + + // Pagination settings + scope.totalResults = 0; + scope.paginationCache = []; + scope.currentPage = 0; + scope.itemsPerPage = 100; + + // Advanced search settings + scope.advanceSearch = false; + scope.advanceSearchRows = []; + scope.stringQuery = scope.mainSearch.searchText; + + // View propery settings + scope.showSearchResultProps = false; + scope.switchText = 'More'; + scope.limitForProps = 6; + + scope.closeSearch = function () { + $window.history.back(); + }; + + // Set functions + ProjectService.getProjectMounts(scope.mmsProjectId, scope.refId); //ensure project mounts object is cached + // Function used to get string value of metatype names for advanced search + var getMetatypeSelection = function (id) { + var mainElement = angular.element(id); + return mainElement.find('div').attr('value'); + }; + + // Get metatypes for dropdown options + var getMetaTypes = function () { + // scope.metatypeSearch = "fa fa-spin fa-spinner"; + // ProjectService.getMetatypes(scope.mmsProjectId, scope.refId) + // .then(function (data) { + // // cache metatypes + // scope.metatypeList = data; + // }, function (reason) { + // growl.error("Search Error: " + reason.message); + // }).finally(function () { + // scope.metatypeSearch = ""; + // }); + }; + getMetaTypes(); + + scope.getTypeClass = function (element) { + // Get Type + return UtilsService.getElementTypeClass(element, ViewService.getElementType(element)); + }; + + // Set search options + scope.fieldTypeList = [{ + id: 'all', + label: 'All Fields' + }, + { + id: 'name', + label: 'Name' + }, + { + id: 'documentation', + label: 'Documentation' + }, + { + id: 'value', + label: 'Value' + }, + { + id: 'id', + label: 'ID' + }, + { + id: 'metatype', + label: 'Metatype' + } + ]; + + scope.operatorList = ['And', 'Or', 'And Not']; + + // settings for multiselect metatype dropdown + scope.metatypeSettings = { + scrollableHeight: '300px', + scrollable: true, + enableSearch: true, + displayProp: 'name', + showCheckAll: false, + smartButtonMaxItems: 10, + buttonClasses: '' + }; + + // event handler for multiselect metatype dropdown + scope.multiselectEvent = { + onItemSelect: function (ob) { + $timeout(function () { + scope.stringQueryUpdate(); + }, 500); + }, + onItemDeselect: function (ob) { + $timeout(function () { + scope.stringQueryUpdate(); + }, 500); + }, + onDeselectAll: function (ob) { + $timeout(function () { + scope.stringQueryUpdate(); + }, 500); + } + }; + + // Filter options + scope.getActiveFilterClass = function (item) { + if (!scope.activeFilter.length) { + return ''; + } + return _.includes(scope.activeFilter, item); + }; + + scope.filterSearchResults = function (type) { + var tempArr = _.clone(scope.activeFilter); + if (_.includes(scope.activeFilter, type) ) { + _.pull(scope.activeFilter, type); + } else { + scope.activeFilter.push(type); + } + _applyFilters(); + }; + + var _applyFilters = function () { + if (!scope.activeFilter.length) { + scope.searchResults = baseSearchResults; + } else { + scope.searchResults = _.filter(baseSearchResults, function (item) { + return _.includes(scope.activeFilter, ViewService.getElementType(item)); + }); + } + }; + + scope.filterOptions = [ + { display: "Documents", icon: null, type: "Document" }, + // { display: "Sections/Views", icon: null, type: "View", "Section" }, + { display: 'Text', icon:"pe-type-Paragraph", type: "Paragraph" }, + { display: 'Tables', icon:"pe-type-Table", type: "Table" }, + { display: 'Images', icon:"pe-type-Image", type: "Image" }, + { display: 'Equations', icon:"pe-type-Equation", type: "Equation" }, + { display: 'Comments', icon:"pe-type-Comment", type: "Comment" }, + { display: 'Sections', icon:"pe-type-Section", type: "Section" }, + { display: 'Views', icon:"pe-type-View", type: "View" }, + { display: 'Requirements', icon:"pe-type-Req", type: "Requirement" } + ]; + + // var findRefineOptions = function (results) { + // var presentationElements = _.map(results, ViewService.getElementType); + // var uniqTypes = _.uniq(presentationElements); + // scope.filterOptions = _.difference(uniqTypes, [false, undefined, '']); + // }; + + scope.$watch('searchResults', function (newVal) { + if (!newVal) + return; + if (!scope.mmsOptions.getProperties) { + return; + } + newVal.forEach(function (elem) { + if (elem._properties) { + return; + } + // mms does not return properties will need to make a call for the results whose type is Class + // Call ElementService.getOwnedElements with depth of 2 + // filter out results that have type = to Property and Slot + // for Property check that ownerId is same as the class id + if (elem.type === 'Class' || elem.type === 'Component') { + var reqOb = { + elementId: elem.id, + projectId: elem._projectId, + refId: elem._refId, + depth: 2 + }; + ElementService.getOwnedElements(reqOb, 2) + .then(function (data) { + var properties = []; + //TODO might not be elements + angular.forEach(data, function (elt) { + if (elt.type === 'Property' && elt.ownerId == elem.id) { + properties.push(elt); + } else if (elt.type === 'Slot') { + properties.push(elt); + } + }); + elem._properties = properties; + // OLD CODE - splits into 3cols + // if (elem._properties && elem._properties[0]) { + // var properties2 = []; + // for (var i = 0; i < elem._properties.length; i++) { + // if (i % 3 === 0) { + // properties2.push([]); + // } + // properties2[properties2.length - 1].push(elem._properties[i]); + // } + // elem._properties2 = properties2; + // } + }); + } + }); + }); + + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#stringQueryUpdate + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Updates advanced search main query input + */ + scope.stringQueryUpdate = function () { + var rowLength = scope.advanceSearchRows.length; + scope.stringQuery = Array(rowLength + 1).join('('); + scope.stringQuery += scope.mainSearch.searchType.label + ':'; + if (scope.mainSearch.searchType.id === 'metatype') { + scope.stringQuery += getMetatypeSelection('#searchMetatypeSelectAdvance'); + } else { + scope.stringQuery += scope.mainSearch.searchText; + } + for (var i = 0; i < rowLength; i++) { + scope.stringQuery += ' ' + scope.advanceSearchRows[i].operator.toUpperCase() + ' ' + scope.advanceSearchRows[i].searchType.label + ':'; + if (scope.advanceSearchRows[i].searchType.id === 'metatype') { + scope.stringQuery += getMetatypeSelection('#searchMetatypeSelect-' + i) + ')'; + } else { + scope.stringQuery += scope.advanceSearchRows[i].searchText + ')'; + } + } + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#addAdvanceSearchRow + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Adds new row with empty fields and updates advanced search main query input + */ + scope.addAdvanceSearchRow = function () { + scope.advanceSearchRows.push({ + operator: 'And', + searchType: { + id: 'all', + label: 'All Fields' + }, + searchText: '', + selectedSearchMetatypes: [] + }); + scope.stringQueryUpdate(); + }; + scope.addAdvanceSearchRow(); // Second row created by default + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#removeRowAdvanceSearch + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Removes selected row and updates advanced search main query input + * + * @param {objecy} row advanced search row + */ + scope.removeRowAdvanceSearch = function (row) { + scope.advanceSearchRows = _.without(scope.advanceSearchRows, row); + scope.stringQueryUpdate(); + }; + + scope.modifyAdvanceSearch = function () { + scope.advanceSearch = !scope.advanceSearch; + scope.advancedSearchResults = !scope.advancedSearchResults; + }; + + scope.nextPage = function () { + if (scope.paginationCache[scope.currentPage + 1]) { + baseSearchResults = scope.paginationCache[scope.currentPage + 1]; + scope.currentPage += 1; + _applyFilters(); + } else { + scope.search(scope.mainSearch, scope.currentPage + 1, scope.itemsPerPage); + } + $anchorScroll('ve-search-results'); + + }; + + scope.prevPage = function () { + if (scope.paginationCache[scope.currentPage - 1]) { + baseSearchResults = scope.paginationCache[scope.currentPage - 1]; + scope.currentPage -= 1; + _applyFilters(); + } else { + scope.search(scope.mainSearch, scope.currentPage - 1, scope.itemsPerPage); + } + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#search + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Call ElementService to make search post and get search results. Check for filterCallback + * to further filter search results. Reassign pagination variables. + * + * @param {object} query search type and keyword from user input + * @param {number} page page number of search results + * @param {number} numItems number of items to return per page + */ + scope.search = function (query, page, numItems) { + scope.searchLoading = true; + var queryOb = buildQuery(query); + queryOb.from = page * numItems + page; + queryOb.size = numItems; + var reqOb = { + projectId: scope.mmsProjectId, + refId: scope.refId, + checkType: true + }; + ElementService.search(reqOb, queryOb, 2) + .then(function (data) { + var elements = data.elements; + if (scope.mmsOptions.filterCallback) { + scope.searchResults = scope.mmsOptions.filterCallback(elements); + baseSearchResults = scope.searchResults; + } else { + scope.searchResults = elements; + baseSearchResults = elements; + } + //combineRelatedViews(scope); + scope.totalResults = data.total; + scope.maxPages = Math.ceil(scope.totalResults/scope.itemsPerPage); + scope.currentPage = page; + scope.paginationCache.push(scope.searchResults); + if (scope.advanceSearch) { + // scope.advanceSearch = !scope.advanceSearch; + scope.advancedSearchResults = true; + } + _applyFilters(); + // scope.refineOptions = findRefineOptions(baseSearchResults); + }, function (reason) { + growl.error("Search Error: " + reason.message); + }).finally(function () { + scope.searchLoading = false; + }); + }; + + scope.newSearch = function (query) { + scope.paginationCache = []; + scope.search(query, 0, scope.itemsPerPage); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#getProjectMountsQuery + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Create a JSON object that returns a term key with a list of all mounted + * project ids within the current project. + * + * Elastic format + * + * @return {object} Elastic query JSON object with list of project mounts + */ + // var getProjectMountsQuery = function () { + // var projList = []; + // var projectTermsOb = {}; + + // var mountCacheKey = ['project-mounts', scope.mmsProjectId, scope.refId]; + // if (CacheService.exists(mountCacheKey)) { + // projList = CacheService.get(mountCacheKey); + // } else { + // // Get project element data to gather mounted project list + // var cacheKey = ['project', scope.mmsProjectId, scope.refId]; + // var cachedProj = CacheService.get(cacheKey); + // if (cachedProj) { + // getAllMountsAsArray(cachedProj, projList); + // } else { + // var project = { + // 'id': scope.mmsProjectId, + // '_refId': scope.refId + // }; + // getAllMountsAsArray(project, projList); + // } + // CacheService.put(mountCacheKey, projList, false); + // } + + // // Create Elastic filter + // var q = {}; + // q._projectId = projList; + // projectTermsOb.bool = { + // should: projList + // }; + // return projectTermsOb; + // }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#getAllMountsAsArray + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Use projectsList to populate list with all the mounted project ids for + * specified project. + * + */ + var getAllMountsAsArray = function (project, projectsList) { + projectsList.push({ + bool: { + must: [{ + term: { + _projectId: project.id + } + }, { + term: { + _inRefIds: project._refId + } + }] + } + }); + var mounts = project._mounts; + if (angular.isArray(mounts) && mounts.length !== 0) { + for (var i = 0; i < mounts.length; i++) { + if (mounts[i]._mounts) { + getAllMountsAsArray(mounts[i], projectsList); + } + } + } + return; + }; + + // var buildSearchClause = function (query) { + // var clause = {}; + // var q = {}; + // var valueSearchFields = ["defaultValue.value^3", "value.value^3", "specification.value^3"]; + // if (query.searchType.id === 'all') { + // // Set query term for ID + // var idQuery = {}; + // idQuery.term = { + // "id": { + // "value": query.searchText, + // "boost": 10.0 + // } + // }; + + // // Set query for value,doc,name fields + // var allQuery = {}; + // q.query = query.searchText; + // q.fields = valueSearchFields.slice(); + // q.fields.push('name^5', 'documentation'); + // q.fuzziness = 'AUTO'; + // allQuery.multi_match = q; + // clause = { + // "bool": { + // "should": [ + // idQuery, + // allQuery + // ] + // } + // }; + // } else if (query.searchType.id === 'name' || query.searchType.id === 'documentation') { + // // "{"query":{"bool":{"must":[{"match":{"name":"val"}}]}}}" + // // "{"query":{"bool":{"must":[{"match":{"documentation":"val"}}]}}}" + // var type = query.searchType.id; + // q[type] = { + // query: query.searchText, + // fuzziness: 'AUTO' + // }; + // clause.match = q; + // } else if (query.searchType.id === 'id') { + // // "{"query":{"bool":{"must":[{"term":{"id":"val"}}]}}}" + // clause.term = { + // "id": query.searchText + // }; + // } else if (query.searchType.id === 'value') { + // // "{"query":{"bool":{"must":[{"multi_match":{"query":"val","fields":["defaultValue.value","value.value","specification.value"]}}]}}}" + // q.query = query.searchText; + // q.fields = valueSearchFields; + // q.fuzziness = 'AUTO'; + // clause.multi_match = q; + // } else if (query.searchType.id === 'metatype') { + // var metatypeFilterList = _.pluck(query.selectedSearchMetatypes, 'id'); + + // // Get all _appliedStereotypeIds, which have `_` + // var appliedStereotypeFilter = [], + // typeFilter = []; + // for (var i = 0; i < metatypeFilterList.length; i++) { + // //if underscore = appliedsterortype otherwise 'type' + // if (metatypeFilterList[i].includes('_')) { + // console.log(metatypeFilterList[i]); + // appliedStereotypeFilter.push(metatypeFilterList[i]); + // } else { + // typeFilter.push(metatypeFilterList[i]); + // } + // } + // // metatype clause + // clause = { + // "bool": { + // "should": [{ + // "terms": { + // "_appliedStereotypeIds": appliedStereotypeFilter + // } + // }, + // { + // "terms": { + // "type": typeFilter + // } + // } + // ], + // "minimum_should_match": 1 + // } + // }; + // } + // return clause; + // }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSearch#buildQuery + * @methodOf mms.directives.directive:mmsSearch + * + * @description + * Build JSON object for Elastic query. + * + * + * @return {object} Basic Search JSON. + */ + var buildQuery = function (query) { + var result = { + "params": {} + }; + var field = query.searchType.id; + if(field == 'all') { + field = '*'; + } + result.params[field] = query.searchText; + return result; + }; + + // /** + // * @ngdoc function + // * @name mms.directives.directive:mmsSearch#buildQuery + // * @methodOf mms.directives.directive:mmsSearch + // * + // * @description + // * Build JSON object for Elastic query. + // * + // * + // * @return {object} {{query: {bool: {must: *[]}}}} JSON object from post data. + // */ + // var buildQuery = function (query) { + // $window.alert(query); + // // Set project and mounted projects filter + // var projectTermsOb = getProjectMountsQuery(); + // var filterList = [projectTermsOb]; + + // // Set custom filter options for query + // if (scope.mmsOptions.filterQueryList) { + // angular.forEach(scope.mmsOptions.filterQueryList, function (filterOb) { + // filterList.push(filterOb()); + // }); + // } + + // // Set filter for all views and docs, if selected + // if (scope.docsviews.selected) { + // var viewsAndDocs = { + // terms: { + // '_appliedStereotypeIds': [UtilsService.VIEW_SID, UtilsService.DOCUMENT_SID].concat(UtilsService.OTHER_VIEW_SID) + // } + // }; + // filterList.push(viewsAndDocs); + // } + // filterList.push({ + // "type": { + // "value": "element" + // } + // }); + + // // Set main query + // var mainBoolQuery = {}; + // var jsonQueryOb = {}; + // var rowLength = scope.advanceSearchRows.length; + // if (!scope.advanceSearch || rowLength === 0) { + // mainBoolQuery = buildSearchClause(query); + // mainBoolQuery = { + // "bool": { + // "must": mainBoolQuery, + // } + // }; + // } else { + // var clause2, clause1 = buildSearchClause(scope.mainSearch); + // for (var i = 0; i < rowLength; i++) { + // // if must, must_not or should + // var row = scope.advanceSearchRows[i]; + // var operator = row.operator; + // clause2 = buildSearchClause(row); + // if (operator === "And") { + // clause1 = { + // "bool": { + // "must": [clause1, clause2] + // } + // }; + // } else if (operator === "Or") { + // clause1 = { + // "bool": { + // "should": [clause1, clause2], + // "minimum_should_match": 1 + // } + // }; + // } else if (operator === "And Not") { + // clause1 = { + // "bool": { + // "must": [clause1, { + // "bool": { + // "must_not": clause2 + // } + // }] + // } + // }; + // } + // } + // mainBoolQuery = clause1; + // } + + // jsonQueryOb = { + // "sort": [ + // "_score", + // { + // "_modified": { + // "order": "desc" + // } + // } + // ], + // "query": {}, + // "indices_boost" : [ {} ] + // }; + // jsonQueryOb.query = mainBoolQuery; + // jsonQueryOb.query.bool.filter = filterList; + // jsonQueryOb.indices_boost[0][scope.mmsProjectId.toLowerCase()] = 2; + // jsonQueryOb.aggs = getAggs(); + // return jsonQueryOb; + // }; + + // var getAggs = function () { + // return { + // "elements": { + // "filter": { + // "bool": { + // "must": [{ + // "term": { + // "_projectId": 'PROJECT-5d574aa8-bc06-4e95-bf71-3f2151833e09' + // } + // }, + // { + // "term": { + // "_inRefIds": 'master' + // } + // } + // ] + // } + // }, + // "aggs": { + // "types": { + // "terms": { + // "field": "type", + // "size": 20 + // } + // } + // } + // } + // }; + // }; + + // var combineRelatedViews = function(scope) { + // scope.searchResults.forEach(function(element) { + // var allRelatedDocuments = []; + // if (element._relatedDocuments) { + // element._relatedDocuments.forEach(function(relatedDoc) { + // relatedDoc._parentViews.forEach(function(parentView) { + // allRelatedDocuments.push({ + // relatedDocument: relatedDoc, + // relatedView: parentView + // }); + // }); + // }); + // } + // element.allRelatedDocuments = allRelatedDocuments; + // element.someRelatedDocuments = allRelatedDocuments.slice(0, 3); + // }); + // }; + + // Set options + if (scope.mmsOptions.searchResult) { + var data1 = scope.mmsOptions.searchResult; + scope.searchResults = data1; + scope.paginationCache.push(data1); + } + if (scope.mmsOptions.searchInput) { + scope.mainSearch.searchText = scope.mmsOptions.searchInput; + scope.newSearch(scope.mainSearch); + } + if (scope.mmsOptions.itemsPerPage) { + scope.itemsPerPage = scope.mmsOptions.itemsPerPage; + } + scope.emptyDocTxt = scope.mmsOptions.emptyDocTxt; + scope.userResultClick = function (elem, property) { + if (scope.mmsOptions.callback) { + scope.mmsOptions.callback(elem, property); + } + }; + scope.userRelatedClick = function (event, doc, view, elem) { + event.preventDefault(); + event.stopPropagation(); + if (scope.mmsOptions.relatedCallback) + scope.mmsOptions.relatedCallback(doc, view, elem); + }; + } + +} diff --git a/src/directives/mmsSpec.js b/src/directives/mmsSpec.js new file mode 100755 index 000000000..46afa437f --- /dev/null +++ b/src/directives/mmsSpec.js @@ -0,0 +1,399 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsSpec', ['Utils', 'URLService', 'AuthService', 'ElementService', 'UtilsService', 'ViewService', + 'PermissionsService', 'EventService', '$templateCache', 'growl', '_', mmsSpec]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsSpec + * + * @requires mms.Utils + * @required mms.URLService + * @requires mms.AuthService + * @requires mms.ElementService + * @requires mms.ViewService + * @requires mms.PermissionsService + * @requires $compile + * @requires $templateCache + * @requires growl + * @requires _ + * + * @restrict E + * + * @description + * Outputs a "spec window" of the element whose id is specified. Spec includes name, + * documentation, and value if the element is a property. Also last modified time, + * last user, element id. Editability is determined by a param and also element + * editability. Documentation and string values can have html and can transclude other + * element properties. Conflict can occur during save based on last server read time + * and offers choice of force save, discard edit or simple merge. To control saving + * or editing pass in an api object that will be populated with methods (see methods seciton): + * + * ## Example spec with full edit (given permission) + * ### controller (js) + *
+    angular.module('app', ['mms.directives'])
+    .controller('SpecCtrl', ['$scope', function($scope) {
+        $scope.api = {}; //empty object to be populated by the spec api
+        $scope.edit = function() {
+            $scope.api.setEditing(true);
+        };
+        $scope.save = function() {
+            $scope.api.save()
+            .then(function(e) {
+                //success
+            }, function(reason) {
+                //failed
+            });
+        };
+    }]);
+    
+ * ### template (html) + *
+    
+ + + +
+
+ * ## Example for showing an element spec at a certain time + *
+    
+    
+ * ## Example for showing a current element with nothing editable + *
+    
+    
+ * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + * @param {Object=} mmsSpecApi An empty object that'll be populated with api methods + * @param {Object=} mmsElement An element object, if this is provided, a read only + * element spec for it would be shown, this will not use mms services to get the element + */ +function mmsSpec(Utils, URLService, AuthService, ElementService, UtilsService, ViewService, PermissionsService, + EventService, $templateCache, growl, _) { + + const eventSvc = EventService; + + var template = $templateCache.get('mms/templates/mmsSpec.html'); + + var mmsSpecLink = function(scope, domElement, attrs) { + var ran = false; + var lastid = null; //race condition check + var keepMode = false; + scope.editing = false; + scope.editable = true; + scope.gettingSpec = false; + scope.isEnumeration = false; + //TODO pass proper args + scope.propertyTypeClicked = function(id) { + var elementOb = {id: id, _projectId: scope.mmsProjectId, _refId: scope.mmsRefId}; + eventSvc.$broadcast('elementSelected', {elementOb: elementOb}); + }; + + var getModifier = function(modifier) { + return modifier; + /*AuthService.getUserData(modifier).then(function(modifierData){ + return modifierData.users[0]; + }, function() { + return modifier; + });*/ + }; + + if (scope.mmsElement) { + scope.element = scope.mmsElement; + scope.modifier = getModifier(scope.mmsElement._modifier); + Utils.setupValCf(scope); + scope.editable = false; + return; + } + scope.addHtml = function(value) { + value.value = "

" + value.value + "

"; + }; + scope.editorApi = {}; + + var getTypeClass = function(element) { + // Get Type + scope.elementTypeClass = UtilsService.getElementTypeClass(element, ViewService.getElementType(element)); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#changeElement + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * change element in the spec, this would reevaluate whether it's editable + * + * @param {string} newVal new element id + */ + var changeElement = function(newVal, oldVal) { + if (!newVal || (newVal === oldVal && ran) || !scope.mmsProjectId) { + return; + } + scope.relatedDocuments = null; + ran = true; + lastid = newVal; + if (scope.edit && scope.editorApi.save) { + scope.editorApi.save(); + } + scope.isEnumeration = false; + scope.isSlot = false; + scope.gettingSpec = true; + var extended = true; + if (scope.mmsCommitId && scope.mmsCommitId !== 'latest') { + extended = false; + } + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: scope.mmsRefId, commitId: scope.mmsCommitId, extended: extended}; + ElementService.getElement(reqOb, 2, false) + .then(function(data) { + if (newVal !== lastid) { + return; + } + scope.element = data; + scope.modifier = data._modifier; + /*AuthService.getUserData(data._modifier).then(function(modifierData){ + scope.modifier = modifierData.users[0]; + }, function() { + scope.modifier = data._modifier; + });*/ + Utils.setupValCf(scope); + if (!scope.mmsCommitId || scope.mmsCommitId === 'latest') { + /*ElementService.search(reqOb, { + size: 1, + sort : [{ _modified : {order : "desc"}}], + query: {bool: {filter: [{term: {id: data.id}}, {term: {'_projectId': data._projectId}}]}} + }, 2).then(function(searchResultOb) { + if (newVal !== lastid) { + return; + } + var searchResult = searchResultOb.elements; + if (searchResult && searchResult.length == 1 && searchResult[0].id === data.id && searchResult[0]._relatedDocuments.length > 0) { + scope.relatedDocuments = searchResult[0]._relatedDocuments; + } + });*/ + } + PermissionsService.initializePermissions({id: scope.element._projectId}, {id: scope.element._refId, _projectId: scope.element._projectId}) + .finally(function(data) { + if ((scope.mmsCommitId !== 'latest' && scope.mmsCommitId) || !PermissionsService.hasProjectIdBranchIdEditPermission(scope.element._projectId, scope.element._refId)) { + scope.editable = false; + scope.edit = null; + scope.editing = false; + } else { + ElementService.getElementForEdit(reqOb) + .then(function(data) { + if (newVal !== lastid) + return; + scope.edit = data; + scope.editable = true; + if (!keepMode) + scope.editing = false; + keepMode = false; + if (scope.edit.type === 'Property' || scope.edit.type === 'Port' || scope.edit.type === 'Slot') {// angular.isArray(scope.edit.value)) { + if (scope.edit.defaultValue) + scope.editValues = [scope.edit.defaultValue]; + else if (scope.edit.value) + scope.editValues = scope.edit.value; + else + scope.editValues = []; + Utils.getPropertySpec(scope.element) + .then( function(value) { + scope.isEnumeration = value.isEnumeration; + scope.isSlot = value.isSlot; + scope.options = value.options; + }, function(reason) { + growl.error('Failed to get property spec: ' + reason.message); + }); + } + if (scope.edit.type === 'Constraint' && scope.edit.specification) { + scope.editValues = [scope.edit.specification]; + } + }); + } + }); + getTypeClass(scope.element); + scope.elementDataLink = URLService.getRoot() + '/projects/'+scope.element._projectId+'/refs/'+scope.element._refId+'/elements/'+scope.element.id+'?commitId='+scope.element._commitId+'&token='+AuthService.getToken(); + scope.gettingSpec = false; + }, function(reason) { + scope.gettingSpec = false; + //growl.error("Getting Element Error: " + reason.message); + }); + }; + scope.changeElement = changeElement; + scope.$watch('mmsElementId', changeElement); + scope.$watch('mmsProjectId', changeElement); + scope.$watch('mmsCommitId', changeElement); + scope.$watch('mmsRefId', changeElement); + + scope.copyToClipboard = function($event, selector) { + UtilsService.copyToClipboard(domElement.find(selector), $event); + }; + + scope.cleanupVal = function(obj) { + obj.value = parseInt(obj.value); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#revertEdits + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * reset editing object back to base element values for name, doc, values + * + */ + scope.revertEdits = function() { + Utils.revertEdits(scope, scope.edit, scope.editorApi); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#save + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * save edited element + * + * @return {Promise} promise would be resolved with updated element if save is successful. + * For unsuccessful saves, it will be rejected with an object with type and message. + * Type can be error or info. In case of conflict, there is an option to discard, merge, + * or force save. If the user decides to discord or merge, type will be info even though + * the original save failed. Error means an actual error occured. + */ + scope.save = function() { + return Utils.save(scope.edit, scope.editorApi, scope, false); + }; + + scope.hasHtml = function(s) { + return Utils.hasHtml(s); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#hasEdits + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * whether editing object has changes compared to base element, + * currently compares name, doc, property values, if element is not + * editable, returns false + * + * @return {boolean} has changes or not + */ + scope.hasEdits = function() { + return Utils.hasEdits(scope.edit); + }; + + Utils.setupValEditFunctions(scope); + + if (angular.isObject(scope.mmsSpecApi)) { + var api = scope.mmsSpecApi; + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#toggleEditing + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * toggles editing + * + * @return {boolean} toggle successful + */ + api.toggleEditing = function() { + if (!scope.editing) { + if (scope.editable) + scope.editing = true; + else + return false; + } else { + scope.editing = false; + } + return true; + }; + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#setEditing + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * sets editing state + * + * @param {boolean} mode true or false + * @return {boolean} set successful + */ + api.setEditing = function(mode) { + if (mode) { + if (scope.editable) + scope.editing = true; + else + return false; + } else + scope.editing = false; + return true; + }; + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#getEditing + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * get editing state + * + * @return {boolean} editing or not + */ + api.getEditing = function() { + return scope.editing; + }; + api.save = scope.save; + api.revertEdits = scope.revertEdits; + api.changeElement = scope.changeElement; + api.hasEdits = scope.hasEdits; + /** + * @ngdoc function + * @name mms.directives.directive:mmsSpec#getEdits + * @methodOf mms.directives.directive:mmsSpec + * + * @description + * get current edit object + * + * @return {Object} may be null or undefined, if not, is + * current element object that can be edited (may include changes) + */ + api.getEdits = function() { + return scope.edit; + }; + + api.setEdit = function(id) { + scope.mmsElementId = id; + }; + + api.keepMode = function() { + keepMode = true; + }; + + api.editorSave = function() { + if (scope.edit && scope.editorApi.save) + scope.editorApi.save(); + }; + } + }; + + return { + restrict: 'E', + template: template, + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsElement: ' { + return $scope.mmsTbApi; + },() => { + if (!$scope.mmsTbApi){ + return null; + } + if ($scope.init === false && ToolbarService.isApi($scope.mmsTbApi)) { + if ($scope.mmsTbApi.init) { + $scope.mmsTbApi.init(); + } + $scope.init = true; + } + }); + }; + + var mmsToolbarLink = function(scope, element, attrs) + { + + scope.clicked = function(button) + { + + if (!button.permission) { + return; + } + if (!button.active) { + return; + } + + var toggleDecativeFlag = false; + if (typeof rootScopeSvc.mmsPaneClosed() === 'boolean' && rootScopeSvc.mmsPaneToggleable() !== false) + { + if (button.selected || rootScopeSvc.mmsPaneClosed()) + { + if (button.selected && !rootScopeSvc.mmsPaneClosed()) toggleDecativeFlag = true; + eventSvc.$broadcast('mms-pane-toggle'); + } + } + + if (scope.mmsTbApi) scope.mmsTbApi.select(button.id); + + if (button.onClick) { + button.onClick(); + } else if (scope.onClick) { + scope.onClick({ button: button }); + } + + if (toggleDecativeFlag && scope.mmsTbApi) { + scope.mmsTbApi.deactivate(button.id); + } + +/*if (! button.dynamic) + { + scope.buttons.forEach(function(b) { + if (b === button) { + b.selected = true; + } else + b.selected = false; + }); + + // de-activate all dynamic buttons + scope.buttons.forEach(function(b) { + if (b.dynamic) { + b.active = false; + } + }); + + if (button.dynamic_buttons) { + button.dynamic_buttons.forEach(function(b) { + b.active = true; + }); + } + }*/ + + }; + }; + + + + return { + restrict: 'E', + template: template, + controller: ['$scope', mmsToolbarCtrl], + link: mmsToolbarLink, + scope: { + buttons: '<', + mmsTbApi: '<', + onClick: '&', + direction: '@' + } + }; +} \ No newline at end of file diff --git a/src/directives/mmsTranscludeArt.js b/src/directives/mmsTranscludeArt.js new file mode 100755 index 000000000..9c118f6a5 --- /dev/null +++ b/src/directives/mmsTranscludeArt.js @@ -0,0 +1,86 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTranscludeArt', ['ElementService','AuthService','URLService', mmsTranscludeArt]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTranscludeArt + * + * @requires mms.AuthService + * @requires mms.ElementService + * @requires mms.URLService + * @requires growl + * + * @restrict E + * + * @description + * Given an artifact id, puts in an img or link to artifact. + * + * @param {string} mmsElementId The id of the artifact + * @param {string} mmsProjectId The project id + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + */ +function mmsTranscludeArt(ElementService, AuthService, URLService) { + + var mmsTranscludeArtLink = function(scope, element, attrs, controllers) { + // var mmsViewCtrl = controllers[0]; + var processed = false; + + scope.$watch('mmsElementId', function(newVal, oldVal) { + if (!newVal || (newVal === oldVal && processed) || !scope.mmsProjectId) { + return; + } + processed = true; + scope.projectId = scope.mmsProjectId; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + scope.commitId = scope.mmsCommitId ? scope.mmsCommitId : 'latest'; + scope.artExt = scope.mmsArtExt; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId}; + + element.addClass('isLoading'); + + // Get the artifacts of the element + ElementService.getElement(reqOb, 1, false) + .then(function(data) { + scope.element = data; + var artifacts = data._artifact; + if (artifacts !== undefined) { + var allExt = artifacts.map(a => a.extension); + var includeExt = allExt; + if (scope.artExt !== '' || scope.artExt !== undefined) { + includeExt = scope.artExt.split(',').filter(a => allExt.includes(a)); + } + scope.artifacts = artifacts.filter(a => includeExt.includes(a.extension)) + .map(a => { + return { + url: URLService.getArtifactURL(reqOb, a.extension), + image: (a.mimetype.indexOf('image') > -1), + ext: a.extension + }; + }); + } + }, function(reason) { + console.log('Error getting artifacts for ' + scope.mmsElementId); + }).finally(function() { + element.removeClass('isLoading'); + }); + }); + }; + + return { + restrict: 'E', + template: '
', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsCfLabel: '@', + mmsArtExt: '@' + }, + require: ['?^^mmsView'], + link: mmsTranscludeArtLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsTranscludeCom.js b/src/directives/mmsTranscludeCom.js new file mode 100755 index 000000000..128f183a8 --- /dev/null +++ b/src/directives/mmsTranscludeCom.js @@ -0,0 +1,202 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTranscludeCom', ['Utils', 'ElementService', 'UtilsService', 'ViewService', 'UxService', 'EventService', '$templateCache', '$compile', 'growl', 'MathJax', mmsTranscludeCom]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTranscludeCom + * + * @requires mms.ElementService + * @requires mms.UtilsService + * @requires mms.ViewService + * @requires mms.UxService + * @requires mms.Utils + * @requires $compile + * @requires $templateCache + * @requires growl + * @requires MathJax + * + * @restrict E + * + * @description + * Given an element id, puts in the element's documentation binding, if there's a parent + * mmsView directive, will notify parent view of transclusion on init and doc change, + * and on click. Nested transclusions inside the documentation will also be registered. + * (This is different from mmsTranscludeDoc because of special styles applied to comments) + * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + */ +function mmsTranscludeCom(Utils, ElementService, UtilsService, ViewService, UxService, EventService, $templateCache, $compile, growl, MathJax) { + + const eventSvc = EventService; + + var template = $templateCache.get('mms/templates/mmsTranscludeDoc.html'); + + var mmsTranscludeComCtrl = function ($scope) { + eventSvc.$init($scope); + $scope.bbApi = {}; + $scope.buttons = []; + $scope.buttonsInit = false; + + $scope.bbApi.init = function() { + if (!$scope.buttonsInit) { + $scope.buttonsInit = true; + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-preview", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-save", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-saveC", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-cancel", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-delete", $scope)); + $scope.bbApi.setPermission("presentation-element-delete", $scope.isDirectChildOfPresentationElement); + } + }; + }; + + var mmsTranscludeComLink = function(scope, domElement, attrs, controllers) { + var mmsViewCtrl = controllers[0]; + var mmsViewPresentationElemCtrl = controllers[1]; + scope.recompileScope = null; + scope.cfType = 'doc'; + + domElement.click(function(e) { + if (scope.startEdit && !scope.nonEditable) + scope.startEdit(); + + if (mmsViewCtrl) + mmsViewCtrl.transcludeClicked(scope.element); + if (scope.nonEditable && mmsViewCtrl && mmsViewCtrl.isEditable()) { + growl.warning("Comment is not editable."); + } + e.stopPropagation(); + }); + + var recompile = function(preview) { + if (scope.recompileScope) { + scope.recompileScope.$destroy(); + } + scope.isEditing = false; + domElement.empty(); + var doc = (preview ? scope.edit.documentation : scope.element.documentation) || '(No comment)'; + doc += ' - Comment by ' + scope.element._creator + ''; + if (preview) { + domElement[0].innerHTML = '
'+doc+'
'; + } else { + domElement[0].innerHTML = doc; + } + if (MathJax && !scope.mmsGenerateForDiff) { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, domElement[0]]); + } + scope.recompileScope = scope.$new(); + $compile(domElement.contents())(scope.recompileScope); + if (mmsViewCtrl) { + mmsViewCtrl.elementTranscluded(scope.element, 'Comment'); + } + }; + + var idwatch = scope.$watch('mmsElementId', function(newVal, oldVal) { + if (!newVal || !scope.mmsProjectId) { + return; + } + idwatch(); + if (UtilsService.hasCircularReference(scope, scope.mmsElementId, 'doc')) { + domElement.html('Circular Reference!'); + return; + } + scope.projectId = scope.mmsProjectId; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + scope.commitId = scope.mmsCommitId ? scope.mmsCommitId : 'latest'; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId, includeRecentVersionElement: true}; + ElementService.getElement(reqOb, 1, false) + .then(function(data) { + scope.element = data; + recompile(); + scope.panelType = "Comment"; + if (scope.commitId === 'latest') { + scope.subs.push(eventSvc.$on('element.updated', function () { + let elementOb = data.element; + let continueEdit = data.continueEdit; + if (elementOb.id === scope.element.id && elementOb._projectId === scope.element._projectId && + elementOb._refId === scope.element._refId && !continueEdit) { + recompile(); + } + })); + } + }, function(reason) { + domElement.html(''); + $compile(domElement.contents())(Object.assign(scope.$new(), { + reqOb: reqOb, + recentElement: reason.data.recentVersionOfElement, + type: ViewService.AnnotationType.mmsTranscludeCom, + cfLabel: scope.mmsCfLabel + })); + }); + }); + + if (mmsViewCtrl) { + + scope.isEditing = false; + scope.elementSaving = false; + scope.view = mmsViewCtrl.getView(); + scope.isDirectChildOfPresentationElement = Utils.isDirectChildOfPresentationElementFunc(domElement, mmsViewCtrl); + + scope.save = function() { + Utils.saveAction(scope, domElement, false); + }; + + scope.saveC = function() { + Utils.saveAction(scope, domElement, true); + }; + + scope.cancel = function() { + Utils.cancelAction(scope, recompile, domElement); + }; + + scope.startEdit = function() { + Utils.startEdit(scope, mmsViewCtrl, domElement, template, false); + }; + + scope.preview = function() { + Utils.previewAction(scope, recompile, domElement); + }; + } + + if (mmsViewPresentationElemCtrl) { + + scope.delete = function() { + Utils.deleteAction(scope,scope.bbApi,mmsViewPresentationElemCtrl.getParentSection()); + }; + + scope.instanceSpec = mmsViewPresentationElemCtrl.getInstanceSpec(); + scope.instanceVal = mmsViewPresentationElemCtrl.getInstanceVal(); + scope.presentationElem = mmsViewPresentationElemCtrl.getPresentationElement(); + var auto = [ViewService.TYPE_TO_CLASSIFIER_ID.Image, ViewService.TYPE_TO_CLASSIFIER_ID.Paragraph, + ViewService.TYPE_TO_CLASSIFIER_ID.List, ViewService.TYPE_TO_CLASSIFIER_ID.Table]; + + if (auto.indexOf(scope.instanceSpec.classifierIds[0]) >= 0) + //do not allow model generated to be deleted + scope.isDirectChildOfPresentationElement = false; + if (scope.isDirectChildOfPresentationElement) + scope.panelTitle = scope.instanceSpec.name; + scope.panelType = 'Comment'; + } + }; + + return { + restrict: 'E', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + nonEditable: '<', + mmsCfLabel: '@', + mmsGenerateForDiff: '<' + }, + require: ['?^mmsView', '?^mmsViewPresentationElem'], + controller: ['$scope', mmsTranscludeComCtrl], + link: mmsTranscludeComLink + }; +} diff --git a/src/directives/mmsTranscludeDoc.js b/src/directives/mmsTranscludeDoc.js new file mode 100755 index 000000000..3c66fd7a7 --- /dev/null +++ b/src/directives/mmsTranscludeDoc.js @@ -0,0 +1,261 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTranscludeDoc', ['Utils','ElementService', 'UtilsService', 'ViewService', 'UxService', 'AuthService', + 'EventService', '$compile', '$templateCache', 'growl', '_', 'MathJax', mmsTranscludeDoc]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTranscludeDoc + * + * @requires mms.ElementService + * @requires mms.UtilsService + * @requires mms.ViewService + * @requires mms.UxService + * @requires mms.Utils + * @requires $compile + * @requires $templateCache + * @requires growl + * @requires _ + * @requires MathJax + * + * @restrict E + * + * @description + * Given an element id, puts in the element's documentation binding, if there's a parent + * mmsView directive, will notify parent view of transclusion on init and doc change, + * and on click. Nested transclusions inside the documentation will also be registered. + * + * ## Example + *
+    
+    
+ * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + * @param {bool} mmsWatchId set to true to not destroy element ID watcher + * @param {boolean=false} nonEditable can edit inline or not + */ +function mmsTranscludeDoc(Utils, ElementService, UtilsService, ViewService, UxService, AuthService, EventService, $compile, $templateCache, growl, _, MathJax) { + + const eventSvc = EventService; + + var template = $templateCache.get('mms/templates/mmsTranscludeDoc.html'); + + var fixPreSpanRegex = /<\/span>\s*\s*]*>/g; + var emptyRegex = /^\s*$/; + var spacePeriod = />(?:\s| )\./g; + var spaceSpace = />(?:\s| )(?:\s| )/g; + var spaceComma = />(?:\s| ),/g; + + var mmsTranscludeDocCtrl = function($scope) { + + eventSvc.$init($scope); + + $scope.bbApi = {}; + $scope.buttons = []; + $scope.buttonsInit = false; + + $scope.bbApi.init = function() { + if (!$scope.buttonsInit) { + $scope.buttonsInit = true; + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-preview", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-save", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-saveC", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-cancel", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-delete", $scope)); + $scope.bbApi.setPermission("presentation-element-delete", $scope.isDirectChildOfPresentationElement); + } + }; + }; + + var mmsTranscludeDocLink = function(scope, domElement, attrs, controllers) { + var mmsViewCtrl = controllers[0]; + var mmsViewPresentationElemCtrl = controllers[1]; + scope.recompileScope = null; + scope.cfType = 'doc'; + scope.editorApi = {}; + domElement.click(function(e) { + if (scope.startEdit && !scope.nonEditable) + scope.startEdit(); + + if (mmsViewCtrl) + mmsViewCtrl.transcludeClicked(scope.element); + if (scope.nonEditable && mmsViewCtrl && mmsViewCtrl.isEditable()) { + growl.warning("Cross Reference is not editable."); + } + e.stopPropagation(); + }); + + var recompile = function(preview) { + if (scope.recompileScope) { + scope.recompileScope.$destroy(); + } + domElement.empty(); + var doc = preview ? scope.edit.documentation : scope.element.documentation; + if (!doc || emptyRegex.test(doc)) { + doc = '

(no ' + scope.panelType + ')

'; + } + doc = doc.replace(fixPreSpanRegex, ""); + doc = doc.replace(spacePeriod, '>.'); + doc = doc.replace(spaceSpace, '> '); + doc = doc.replace(spaceComma, '>,'); + if (preview) { + domElement[0].innerHTML = '
'+doc+'
'; + } else { + scope.isEditing = false; + domElement[0].innerHTML = doc; + } + $(domElement[0]).find('img').each(function(index) { + Utils.fixImgSrc($(this)); + }); + if (mmsViewPresentationElemCtrl) { + var peSpec = mmsViewPresentationElemCtrl.getPresentationElement(); + var pe = mmsViewPresentationElemCtrl.getInstanceSpec(); + if (pe && pe._veNumber && peSpec && (peSpec.type === 'TableT' || peSpec.type === 'Figure' || peSpec.type === 'Equation' || peSpec.type === 'ImageT')) { + var type = (peSpec.type === 'TableT') ? 'table' : peSpec.type.toLowerCase(); + if (type === 'imaget') { + type = 'figure'; + } + UtilsService.addLiveNumbering(pe, $('#' + pe.id), type); + } + } + if (MathJax && !scope.mmsGenerateForDiff) { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, domElement[0]]); + } + scope.recompileScope = scope.$new(); + $compile(domElement.contents())(scope.recompileScope); + if (mmsViewCtrl) { + mmsViewCtrl.elementTranscluded(scope.element); + } + }; + + var idwatch = scope.$watch('mmsElementId', function(newVal) { + if (!newVal || !scope.mmsProjectId) { + return; + } + if (!scope.mmsWatchId) { + idwatch(); + } + if (UtilsService.hasCircularReference(scope, scope.mmsElementId, 'doc')) { + domElement.html('Circular Reference!'); + return; + } + scope.projectId = scope.mmsProjectId; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + scope.commitId = scope.mmsCommitId ? scope.mmsCommitId : 'latest'; + domElement.html('(loading...)'); + domElement.addClass("isLoading"); + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId, includeRecentVersionElement: true}; + ElementService.getElement(reqOb, 1, false) + .then(function(data) { + scope.element = data; + if (!scope.panelTitle) { + scope.panelTitle = scope.element.name + " Documentation"; + scope.panelType = "Text"; + } + recompile(); + Utils.reopenUnsavedElts(scope, "documentation"); + + if (scope.commitId === 'latest') { + scope.subs.push(eventSvc.$on('element.updated', function (data) { + let elementOb = data.element; + let continueEdit = data.continueEdit; + if (elementOb.id === scope.element.id && elementOb._projectId === scope.element._projectId && + elementOb._refId === scope.element._refId && !continueEdit) { + recompile(); + } + })); + } + }, function(reason) { + domElement.html(''); + $compile(domElement.contents())(Object.assign(scope.$new(), { + reqOb: reqOb, + recentElement: reason.data.recentVersionOfElement, + type: ViewService.AnnotationType.mmsTranscludeDoc, + cfLabel: scope.mmsCfLabel + })); + }).finally(function() { + domElement.removeClass("isLoading"); + }); + }); + + if (mmsViewCtrl) { + scope.isEditing = false; + scope.elementSaving = false; + scope.view = mmsViewCtrl.getView(); + //TODO remove this when deleting in parent PE directive + scope.isDirectChildOfPresentationElement = Utils.isDirectChildOfPresentationElementFunc(domElement, mmsViewCtrl); + + scope.save = function() { + Utils.saveAction(scope, domElement, false); + }; + + scope.saveC = function() { + Utils.saveAction(scope, domElement, true); + }; + + scope.cancel = function() { + Utils.cancelAction(scope, recompile, domElement); + }; + + scope.startEdit = function() { + Utils.startEdit(scope, mmsViewCtrl, domElement, template, false); + }; + + scope.preview = function() { + Utils.previewAction(scope, recompile, domElement); + }; + } + + if (mmsViewPresentationElemCtrl) { + scope.delete = function() { + Utils.deleteAction(scope, scope.bbApi, mmsViewPresentationElemCtrl.getParentSection()); + }; + + scope.instanceSpec = mmsViewPresentationElemCtrl.getInstanceSpec(); + scope.instanceVal = mmsViewPresentationElemCtrl.getInstanceVal(); + scope.presentationElem = mmsViewPresentationElemCtrl.getPresentationElement(); + var auto = [ViewService.TYPE_TO_CLASSIFIER_ID.Image, ViewService.TYPE_TO_CLASSIFIER_ID.Paragraph, + ViewService.TYPE_TO_CLASSIFIER_ID.List, ViewService.TYPE_TO_CLASSIFIER_ID.Table]; + + if (auto.indexOf(scope.instanceSpec.classifierIds[0]) >= 0) + //do not allow model generated to be deleted + scope.isDirectChildOfPresentationElement = false; + if (scope.isDirectChildOfPresentationElement) { + scope.panelTitle = scope.instanceSpec.name; + scope.panelType = scope.presentationElem.type; //this is hack for fake table/list/equation until we get actual editors + if (scope.panelType.charAt(scope.panelType.length-1) === 'T') + scope.panelType = scope.panelType.substring(0, scope.panelType.length-1); + if (scope.panelType === 'Paragraph') + scope.panelType = 'Text'; + if (scope.panelType === 'Figure' || scope.panelType === 'ImageT') + scope.panelType = 'Image'; + } + if (scope.presentationElem) { + scope.editorType = scope.presentationElem.type; + } + } + }; + + return { + restrict: 'E', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsWatchId: '@', + nonEditable: '<', + mmsCfLabel: '@', + mmsGenerateForDiff: '<' + }, + require: ['?^^mmsView','?^^mmsViewPresentationElem'], + controller: ['$scope', mmsTranscludeDocCtrl], + link: mmsTranscludeDocLink + }; +} diff --git a/src/directives/mmsTranscludeImg.js b/src/directives/mmsTranscludeImg.js new file mode 100755 index 000000000..2077e5b52 --- /dev/null +++ b/src/directives/mmsTranscludeImg.js @@ -0,0 +1,93 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTranscludeImg', ['AuthService','ElementService','URLService','growl', mmsTranscludeImg]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTranscludeImg + * + * @requires mms.AuthService + * @requires mms.ElementService + * @requires mms.URLService + * @requires growl + * + * @restrict E + * + * @description + * Given an image id, puts in an img tag for the image url. + * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + */ +function mmsTranscludeImg(AuthService, ElementService, URLService, growl) { + + var mmsTranscludeImgLink = function(scope, element, attrs, controllers) { + var mmsViewCtrl = controllers[0]; + var processed = false; + element.click(function(e) { + if (!mmsViewCtrl) + return false; + //TODO get element somehow + mmsViewCtrl.transcludeClicked(scope.element); + return false; + }); + + var changeElement = function(newVal, oldVal) { + if (!newVal || (newVal === oldVal && processed) || !scope.mmsProjectId) { + return; + } + processed = true; + scope.projectId = scope.mmsProjectId; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + scope.commitId = scope.mmsCommitId ? scope.mmsCommitId : 'latest'; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId}; + element.addClass('isLoading'); + ElementService.getElement(reqOb, 1, false) + .then(function(data) { + scope.element = data; + var includeExt = [ + 'svg', 'png' + ]; + var artifacts = data._artifacts; + if (artifacts !== undefined) { + scope.artifacts = artifacts.filter(a => includeExt.includes(a.extension)) + .map(a => { + return { + url: URLService.getArtifactURL(reqOb, a.extension), + image: (a.mimetype.indexOf('image') > -1), + ext: a.extension + }; + }); + scope.svg = scope.artifacts.filter(a => a.ext === 'svg'); + scope.png = scope.artifacts.filter(a => a.ext === 'png'); + } + + }, function(reason) { + console.log('Cf Artifacts Error: ' + reason.message + ': ' + scope.mmsElementId); + }).finally(function() { + element.removeClass('isLoading'); + }); + }; + + scope.$watch('mmsElementId', changeElement); + scope.$watch('mmsRefId', changeElement); + scope.$watch('mmsCommitId', changeElement); + }; + + return { + restrict: 'E', + template: '', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsCfLabel: '@' + }, + require: ['?^^mmsView'], + link: mmsTranscludeImgLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsTranscludeName.js b/src/directives/mmsTranscludeName.js new file mode 100755 index 000000000..e954d39c9 --- /dev/null +++ b/src/directives/mmsTranscludeName.js @@ -0,0 +1,172 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTranscludeName', ['ElementService', 'UxService', '$compile', 'growl', '$templateCache', 'Utils', 'ViewService', 'EventService', mmsTranscludeName]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTranscludeName + * + * @requires mms.ElementService + * @requires mms.UxService + * @requires mms.Utils + * @requires $compile + * @requires $templateCache + * @requires growl + * + * @restrict E + * + * @description + * Given an element id, puts in the element's name binding, if there's a parent + * mmsView directive, will notify parent view of transclusion on init and name change, + * and on click + * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + * @param {bool} mmsWatchId set to true to not destroy element ID watcher + * @param {boolean=false} nonEditable can edit inline or not + */ +function mmsTranscludeName(ElementService, UxService, $compile, growl, $templateCache, Utils, ViewService, EventService) { + + const eventSvc = EventService; + + var template = $templateCache.get('mms/templates/mmsTranscludeName.html'); + var defaultTemplate = '{{element.name}}(no name)'; + var editTemplate = '{{edit.name}}(no name)'; + + var mmsTranscludeNameCtrl = function($scope) { + eventSvc.$init($scope); + }; + + var mmsTranscludeNameLink = function(scope, domElement, attrs, controllers) { + var mmsViewCtrl = controllers[0]; + scope.recompileScope = null; + domElement.click(function(e) { + if (scope.noClick) + return; + + if (scope.clickHandler) { + scope.clickHandler(); + return; + } + if (scope.startEdit && !scope.nonEditable) + scope.startEdit(); + + if (!mmsViewCtrl) + return false; + + if (scope.nonEditable && mmsViewCtrl && mmsViewCtrl.isEditable()) { + growl.warning("Cross Reference is not editable."); + } + mmsViewCtrl.transcludeClicked(scope.element); + e.stopPropagation(); + }); + + var recompile = function(preview) { + if (scope.recompileScope) { + scope.recompileScope.$destroy(); + } + domElement.empty(); + if (preview) { + domElement[0].innerHTML = '
'+editTemplate+'
'; + } else { + scope.isEditing = false; + domElement[0].innerHTML = defaultTemplate; + } + scope.recompileScope = scope.$new(); + $compile(domElement.contents())(scope.recompileScope); + if (mmsViewCtrl) { + mmsViewCtrl.elementTranscluded(scope.element); + } + }; + + var idwatch = scope.$watch('mmsElementId', function(newVal, oldVal) { + if (!newVal || !scope.mmsProjectId) { + return; + } + if (!scope.mmsWatchId) { + idwatch(); + } + scope.projectId = scope.mmsProjectId; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + scope.commitId = scope.mmsCommitId ? scope.mmsCommitId : 'latest'; + + domElement.html('(loading...)'); + domElement.addClass("isLoading"); + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId, includeRecentVersionElement: true}; + ElementService.getElement(reqOb, 1, false) + .then(function(data) { + scope.element = data; + recompile(); + Utils.reopenUnsavedElts(scope, "name"); + if (mmsViewCtrl) { + mmsViewCtrl.elementTranscluded(scope.element); + } + if (scope.commitId === 'latest') { + scope.subs.push(eventSvc.$on('element.updated', function (data) { + let elementOb = data.element; + let continueEdit = data.continueEdit; + if (elementOb.id === scope.element.id && elementOb._projectId === scope.element._projectId && + elementOb._refId === scope.element._refId && !continueEdit) { + recompile(); + } + })); + } + }, function(reason) { + domElement.html(''); + $compile(domElement.contents())(Object.assign(scope.$new(), { + reqOb: reqOb, + recentElement: reason.data.recentVersionOfElement, + type: ViewService.AnnotationType.mmsTranscludeName, + cfLabel: scope.mmsCfLabel + })); + }).finally(function() { + domElement.removeClass("isLoading"); + }); + }); + + + + if (mmsViewCtrl) { + + scope.isEditing = false; + scope.elementSaving = false; + scope.view = mmsViewCtrl.getView(); + + scope.save = function(e) { + e.stopPropagation(); + Utils.saveAction(scope, domElement, false); + }; + + scope.cancel = function(e) { + e.stopPropagation(); + Utils.cancelAction(scope, recompile, domElement); + }; + + scope.startEdit = function() { + Utils.startEdit(scope, mmsViewCtrl, domElement, template, false); + }; + + } + }; + + return { + restrict: 'E', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsWatchId: '@', + noClick: '@', + nonEditable: '<', + clickHandler: '&?', + mmsCfLabel: '@' + }, + require: ['?^^mmsView'], + controller: ['$scope', mmsTranscludeNameCtrl], + link: mmsTranscludeNameLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsTranscludeVal.js b/src/directives/mmsTranscludeVal.js new file mode 100755 index 000000000..24b2190e9 --- /dev/null +++ b/src/directives/mmsTranscludeVal.js @@ -0,0 +1,281 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTranscludeVal', ['ElementService', 'UtilsService', 'UxService', 'Utils', 'URLService', 'AuthService', + '$http', '_', '$compile', '$templateCache', 'growl', 'MathJax', 'ViewService', 'EventService', mmsTranscludeVal]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTranscludeVal + * + * @requires mms.ElementService + * @requires mms.UtilsService + * @requires mms.URLService + * @requires mms.UxService + * @requires mms.Utils + * @requires $compile + * @requires $http + * @requires $templateCache + * @requires growl + * @requires _ + * @requires MathJax + * + * @restrict E + * + * @description + * Given an element id, puts in the element's value binding, if there's a parent + * mmsView directive, will notify parent view of transclusion on init and val change, + * and on click. The element should be a Property. Nested transclusions within + * string values will also be registered. + * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + */ +function mmsTranscludeVal(ElementService, UtilsService, UxService, Utils, URLService, AuthService, $http, + _, $compile, $templateCache, growl, MathJax, ViewService, EventService) { + + let eventSvc = EventService; + + var valTemplate = $templateCache.get('mms/templates/mmsTranscludeVal.html'); + var frameTemplate = $templateCache.get('mms/templates/mmsTranscludeValFrame.html'); + var editTemplate = $templateCache.get('mms/templates/mmsTranscludeValEdit.html'); + var emptyRegex = /^\s*$/; + var spacePeriod = />(?:\s| )\./g; + var spaceSpace = />(?:\s| )(?:\s| )/g; + var spaceComma = />(?:\s| ),/g; + + var mmsTranscludeCtrl = function ($scope) { + + + $scope.bbApi = {}; + $scope.buttons = []; + $scope.buttonsInit = false; + + $scope.bbApi.init = function() { + if (!$scope.buttonsInit) { + $scope.buttonsInit = true; + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-preview", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-save", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-saveC", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-cancel", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-delete", $scope)); + $scope.bbApi.setPermission("presentation-element-delete", $scope.isDirectChildOfPresentationElement); + } + }; + }; + + var mmsTranscludeValLink = function(scope, domElement, attrs, controllers) { + + eventSvc.$init(scope); + + var mmsViewCtrl = controllers[0]; + var mmsViewPresentationElemCtrl = controllers[1]; + scope.recompileScope = null; + scope.cfType = 'val'; + domElement.click(function(e) { + if (scope.startEdit && !scope.nonEditable) { + scope.startEdit(); + } + if (mmsViewCtrl) { + mmsViewCtrl.transcludeClicked(scope.element); + } + if (scope.nonEditable && mmsViewCtrl && mmsViewCtrl.isEditable()) { + growl.warning("Cross Reference is not editable."); + } + e.stopPropagation(); + }); + + scope.addHtml = function(value) { + value.value = "

" + value.value + "

"; + }; + + scope.cleanupVal = function(obj) { + obj.value = parseInt(obj.value); + }; + + var recompile = function(preview) { + if (scope.recompileScope) { + scope.recompileScope.$destroy(); + } + var toCompileList = []; + var areStrings = false; + var values = scope.values; + if (preview) { + values = scope.editValues; + } else { + scope.isEditing = false; + } + for (var i = 0; i < values.length; i++) { + if (values[i].type === 'LiteralString') { + areStrings = true; + var s = values[i].value; + if (s.indexOf('

') === -1) { + s = s.replace('<', '<'); + } + toCompileList.push(s); + } else { + break; + } + } + domElement.empty(); + scope.recompileScope = scope.$new(); + if (values.length === 0 || Object.keys(values[0]).length < 2) { + domElement[0].innerHTML = '(no value)'; + } else if (areStrings) { + var toCompile = toCompileList.join(' '); + if (toCompile === '' || emptyRegex.test(toCompile)) { + domElement[0].innerHTML = '(no value)'; + return; + } + toCompile = toCompile.replace(spacePeriod, '>.'); + toCompile = toCompile.replace(spaceSpace, '> '); + toCompile = toCompile.replace(spaceComma, '>,'); + if (preview) { + domElement[0].innerHTML = '

'+toCompile+'
'; + } else { + domElement[0].innerHTML = toCompile; + } + $(domElement[0]).find('img').each(function(index) { + Utils.fixImgSrc($(this)); + }); + if (MathJax && !scope.mmsGenerateForDiff ) { + MathJax.Hub.Queue(["Typeset", MathJax.Hub, domElement[0]]); + } + $compile(domElement.contents())(scope.recompileScope); + } else { + if (preview) { + domElement[0].innerHTML = editTemplate; + } else { + domElement[0].innerHTML = valTemplate; + } + $compile(domElement.contents())(scope.recompileScope); + } + if (mmsViewCtrl) { + mmsViewCtrl.elementTranscluded(scope.element); + } + }; + + var idwatch = scope.$watch('mmsElementId', function(newVal, oldVal) { + if (!newVal || !scope.mmsProjectId) { + return; + } + idwatch(); + if (UtilsService.hasCircularReference(scope, scope.mmsElementId, 'val')) { + domElement.html('Circular Reference!'); + return; + } + domElement.html('(loading...)'); + domElement.addClass("isLoading"); + + scope.projectId = scope.mmsProjectId; + scope.refId = scope.mmsRefId ? scope.mmsRefId : 'master'; + scope.commitId = scope.mmsCommitId ? scope.mmsCommitId : 'latest'; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId, includeRecentVersionElement: true}; + ElementService.getElement(reqOb, 1) + .then(function(data) { + scope.element = data; + Utils.setupValCf(scope); + recompile(); + Utils.reopenUnsavedElts(scope, 'value'); + if (scope.commitId === 'latest') { + scope.subs.push(eventSvc.$on('element.updated', function (data) { + let elementOb = data.element; + let continueEdit = data.continueEdit; + if (elementOb.id === scope.element.id && elementOb._projectId === scope.element._projectId && + elementOb._refId === scope.element._refId && !continueEdit) { + Utils.setupValCf(scope); + recompile(); + } + })); + } + }, function(reason) { + domElement.html(''); + $compile(domElement.contents())(Object.assign(scope.$new(), { + reqOb: reqOb, + recentElement: reason.data.recentVersionOfElement, + type: ViewService.AnnotationType.mmsTranscludeVal, + cfLabel: scope.mmsCfLabel + })); + }).finally(function() { + domElement.removeClass("isLoading"); + }); + }); + + scope.hasHtml = function(s) { + return Utils.hasHtml(s); + }; + + Utils.setupValEditFunctions(scope); + + if (mmsViewCtrl) { + scope.isEditing = false; + scope.elementSaving = false; + scope.isDirectChildOfPresentationElement = Utils.isDirectChildOfPresentationElementFunc(domElement, mmsViewCtrl); + scope.view = mmsViewCtrl.getView(); + + scope.save = function() { + Utils.saveAction(scope, domElement, false); + }; + + scope.saveC = function() { + Utils.saveAction(scope, domElement, true); + }; + + scope.cancel = function() { + Utils.cancelAction(scope, recompile, domElement); + }; + + scope.startEdit = function() { + var id = scope.element.typeId; + if (scope.element.type === 'Slot') + id = scope.element.definingFeatureId; + if (!id || (scope.isEnumeration && scope.options)) { + Utils.startEdit(scope, mmsViewCtrl, domElement, frameTemplate, false); + return; + } + Utils.getPropertySpec(scope.element) + .then( function(value) { + scope.isEnumeration = value.isEnumeration; + scope.isSlot = value.isSlot; + scope.options = value.options; + Utils.startEdit(scope, mmsViewCtrl, domElement, frameTemplate, false); + }, function(reason) { + Utils.startEdit(scope, mmsViewCtrl, domElement, frameTemplate, false); + growl.error('Failed to get property spec: ' + reason.message); + }); + }; + + scope.preview = function() { + Utils.previewAction(scope, recompile, domElement); + }; + } + + if (mmsViewPresentationElemCtrl) { + scope.delete = function() { + Utils.deleteAction(scope,scope.bbApi,mmsViewPresentationElemCtrl.getParentSection()); + }; + scope.instanceSpec = mmsViewPresentationElemCtrl.getInstanceSpec(); + scope.instanceVal = mmsViewPresentationElemCtrl.getInstanceVal(); + scope.presentationElem = mmsViewPresentationElemCtrl.getPresentationElement(); + } + }; + + return { + restrict: 'E', + //template: template, + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + nonEditable: '<', + mmsCfLabel: '@', + mmsGenerateForDiff: '<' + }, + require: ['?^^mmsView','?^^mmsViewPresentationElem'], + controller: ['$scope', mmsTranscludeCtrl], + link: mmsTranscludeValLink + }; +} diff --git a/src/directives/mmsTree.js b/src/directives/mmsTree.js new file mode 100755 index 000000000..ca57dea7c --- /dev/null +++ b/src/directives/mmsTree.js @@ -0,0 +1,257 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTree', ['ApplicationService', '$timeout', '$log', '$templateCache', '$filter', + 'UtilsService', 'TreeService', 'RootScopeService', 'EventService', mmsTree]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTree + * + * @requires $timeout + * @requires $templateCache + * + * @restrict E + * + * @description + * Outputs a tree with customizable icons for different types of nodes and callback + * for node branch clicked. Includes api, see methods section. (the name display is + * angular data binded) + * Object for tree model require (can have multiple roots): + *
+    [
+        {
+            label: 'root node name',
+            type: 'a type',
+            data: {name: 'name will be shown', ...},
+            children: [{...}]
+        },
+        {
+            label: 'another root node',
+            type: 'another type',
+            data: {name: 'another name', ...},
+            children: [{...}]
+        }
+    ]
+    
+ * Tree options: + *
+    {
+        types: {
+            'a type': 'fa fa-file-o',
+            'another type': 'fa fa-file'
+        }
+    }
+    
+ * + * ## Example + * ### controller (js) + *
+    angular.module('app', ['mms.directives'])
+    .controller('TreeCtrl', ['$scope', function($scope) {
+        $scope.api = {}; //empty object to be populated by the spec api
+        $scope.handler = function(branch) {
+            //branch selected
+        };
+        $tree.treeData = [
+            {
+                label: 'Root',
+                type: 'Package',
+                data: {
+                    name: 'Root',
+                    sysmlId: 'id',
+                    //any other stuff
+                },
+                children: [
+                    {
+                        label: 'Child',
+                        type: 'Class',
+                        data: {
+                            name: 'Child',
+                            sysmlId: 'blah',
+                            //other stuff
+                        },
+                        children: []
+                    }
+                ]
+            }
+        ];
+        $scope.options = {
+            types: {
+                'Package': 'fa fa-folder',
+                'Class': 'fa fa-bomb'
+            }
+        };
+    }]);
+    
+ * ### template (html) + *
+    
+ +
+
+ * + * @param {Array} treeData Array of root nodes + * @param {Object=} treeControl Empty object to populate with api + * @param {Object=} options Options object to customize icons for types and statuses + * @param {string='fa fa-caret-right'} iconExpand icon to use when branch is collapsed + * @param {string='fa fa-caret-down'} iconCollapse icon to use when branch is expanded + * @param {string='fa fa-file'} iconDefault default icon to use for nodes + */ +function mmsTree(ApplicationService, $timeout, $log, $templateCache, $filter, UtilsService, TreeService, RootScopeService, EventService) { + + const eventSvc = EventService; + const rootScopeSvc = RootScopeService; + const tree = TreeService; + + var mmsTreeCtrl = function($scope) { + + eventSvc.$init($scope); + $scope.treeApi = tree.getApi(); + $scope.treeData = tree.treeData; + $scope.treeRows = tree.treeRows; + + + $scope.selected_branch = $scope.treeApi.get_selected_branch(); + + if (!$scope.options) { + $scope.options = { + expandLevel: 1, + search: '' + }; + } + + let icons = rootScopeSvc.treeIcons(); + if (!icons) + icons = {}; + if (!icons.iconExpand) + icons.iconExpand = 'fa fa-caret-right fa-lg fa-fw'; + if (!icons.iconCollapse) + icons.iconCollapse = 'fa fa-caret-down fa-lg fa-fw'; + if (!icons.iconDefault) + icons.iconDefault = 'fa fa-file fa-fw'; + rootScopeSvc.treeIcons(icons); + + if (!$scope.options.expandLevel && $scope.options.expandLevel !== 0) + $scope.options.expandLevel = 1; + var expand_level = $scope.options.expandLevel; + if (!angular.isArray($scope.treeData)) { + $log.warn('treeData is not an array!'); + return; + } + + $scope.treeApi.on_treeData_change(); + + $scope.$watch(() => { return $scope.treeOptions; },() => { + rootScopeSvc.treeOptions($scope.treeOptions); + }); + + $scope.subs.push(eventSvc.$on('tree-get-branch-element', (args) => { + $timeout(function() { + var el = angular.element('#tree-branch-' + args.id); + if (!el.isOnScreen() && el.get(0) !== undefined) { + el.get(0).scrollIntoView(); + } + }, 500, false); + })); + + + + $scope.treeFilter = $filter('uiTreeFilter'); + + $scope.subs.push(eventSvc.$on(rootScopeSvc.constants.TREEINITIALSELECTION, () => { + $scope.treeApi.on_initialSelection_change(); + })); + + $scope.treeApi.for_each_branch(function(b, level) { + b.level = level; + b.expanded = b.level <= expand_level; + }); + + $scope.$on('$destroy', (() => { + //rootScopeSvc.treeRows([]); + rootScopeSvc.treeInitialSelection(rootScopeSvc.constants.DELETEKEY); + $scope.treeData.length = 0; + $scope.treeRows.length = 0; + })); + + if (rootScopeSvc.treeInitialSelection()) { + //Triggers Event + $scope.treeApi.on_initialSelection_change(); + }else { + $scope.treeApi.on_treeData_change(); + } + + }; + + var mmsTreeLink = function(scope, element, attrs) { + + scope.getHref = getHref; + + //scope.$watch('initialSelection', rootScopeSvc.treeInitialSelection(scope.initialSelection)); + + scope.expandCallback = function(obj, e){ + if(!obj.branch.expanded && scope.options.expandCallback) { + scope.options.expandCallback(obj.branch.data.id, obj.branch, false); + } + obj.branch.expanded = !obj.branch.expanded; + if (e) { + e.stopPropagation(); + scope.treeApi.on_treeData_change(); + } + }; + + scope.user_clicks_branch = function(branch) { + scope.treeApi.select_branch(branch); + }; + + scope.user_dblclicks_branch = function(branch) { + if (branch.onDblclick) { + eventSvc.$broadcast(branch.onDblclick,{ branch: branch }); + } else if (scope.options.onDblclick) { + eventSvc.$broadcast(scope.options.onDblclick,{ branch: branch }); + } + }; + + + }; + + + + + function getHref(row) { + //var data = row.branch.data; + /*if (row.branch.type !== 'group' && UtilsService.isDocument(data) && !ApplicationService.getState().fullDoc) { + var ref = data._refId ? data._refId : 'master'; + return UtilsService.PROJECT_URL_PREFIX + data._projectId + '/' + ref+ '/documents/' + data.id + '/views/' + data.id; + }*/ + } + + return { + restrict: 'E', + template: ` + + `, + // replace: true, + scope: { + //treeData: '=', + //initialSelection: '@', + options: '<' + }, + controller: ['$scope', mmsTreeCtrl], + link: mmsTreeLink + }; +} diff --git a/src/directives/mmsTsDiagram.js b/src/directives/mmsTsDiagram.js new file mode 100755 index 000000000..46f15f004 --- /dev/null +++ b/src/directives/mmsTsDiagram.js @@ -0,0 +1,427 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsTsDiagram', ['ElementService', '$templateCache', '$window', '$timeout', 'growl', 'ApplicationService', 'AuthService', 'URLService', mmsTsDiagram]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsTsDiagram + * + * @requires mms.ElementService + * @requires $templateCache + * @requires $window + * @requires growl + * @requires ApplicationService + * @requires AuthService + * + * @restrict E + * + * @description + * //TODO - update + * + */ +function mmsTsDiagram(ElementService, $templateCache, $window, $timeout, growl, ApplicationService, AuthService, URLService) { + var importedTsJs = false; + var template = $templateCache.get('mms/templates/mmsTsDiagram.html'); + var mapping = {}; + // var deferreds = {}; + var projectId2PeId = {}; + var peId2projectId = {}; + var projectIdLoaded = {}; + var viewNameMapping = { + IBD: 'Internal Block Diagram', + BDD: 'Block Definition Diagram', + STM: 'State Machine', + ACT: 'Activity Diagram', + SD: 'Sequence Diagram', + PKG: 'Package Diagram', + PAR: 'Parametric Diagram', + REQ: 'Requirement Diagram', + UC: 'Use Case Diagram' + }; + var controlMapping = { + IBD: 'IBD Controls', + BDD: 'BDD Controls', + STM: 'STM Controls', + ACT: 'ACT Controls', + SD: 'Controls', + PKG: 'PKG Controls', + PAR: 'PAR Controls', + REQ: 'REQ Controls', + UC: 'UC Controls' + }; + var elementTableMapping = { + IBD: 'IBD Elements', + BDD: 'BDD Elements', + STM: 'STM Elements', + ACT: 'ACT Elements', + SD: 'Elements', + PKG: 'PKG Elements', + PAR: 'PAR Elements', + REQ: 'REQ Elements', + UC: 'UC Elements' + }; + var relTableMapping = { + IBD: 'IBD Relationships', + BDD: 'BDD Relationships', + STM: 'STM Relationships', + ACT: 'ACT Relationships', + SD: 'Associations', + PKG: 'PKG Relationships', + PAR: 'PAR Relationships', + REQ: 'REQ Relationships', + UC: 'UC Relationships' + }; + + $window.onPerspectivesCommandSuccess = function(successfulCommand) { + console.log("Perspectives command: " + successfulCommand.command + " completed successfully"); + $window.hidePerspectivesProgressIndicator(); + }; + $window.onPerspectivesCommandFailure = function(failedCommand, message, callstack) { + console.log("Perspectives command " + failedCommand.commmand + " failed. Reason is: " + message); + $window.hidePerspectivesProgressIndicator(); + console.log(callstack); + }; + $window.onPerspectivesProjectLoad = function(projectID) { + console.log("All project UI elements should now be on the DOM for " + projectID); + }; + $window.onPerspectivesProjectReady = function(projectID) { + console.log("All project RPC calls are complete and you can now access all project resources via the DOM. " + projectID); + if (!projectIdLoaded[projectID]) { + $window.showPerspectivesProgressIndicator(); + $window.invokePerspectivesCommand(mapping[projectID]); + projectIdLoaded[projectID] = true; + } + }; + $window.onPerspectivesViewLoaded = function(projectID, moduleName, modelID, viewID, viewName) { + console.log("The Perspectives view " + viewID + " is now on the DOM."); + }; + $window.onPerspectivesViewUpdated = function(projectID, moduleName, modelID, viewID, viewNamem, viewData) { + console.log("The Perspectives view" + viewID + " was udpdated with data " + viewData); + }; + $window.onPerspectivesViewCanvasRendered = function(projectID, moduleName, modelID, viewID, viewName) { + console.log("The Perspectives canvas for view" + viewID + " was rendered"); + }; + $window.onPerspectivesMouseClickOnObject = function(data) { + if (data) { + console.log("JavaScript Callback = Mouse clicked on object with ID = " + data.objectID); + } + }; + $window.onPerspectivesMouseDoubleClickOnObject = function(data) { + if (data) { + console.log("JavaScript Callback = Mouse double clicked on object with ID = " + data.objectID); + } + }; + $window.PerspectivesErrorDialogHandler = function(message, callStackString) { + //prevent ts error dialog from appearing for any js exception + console.log(message); + console.log(callStackString); + }; + //store global mapping of project name to hash, on*** functions can lookup the hash + var mmsTsDiagramLink = function(scope, element, attrs) { + if (!$window.invokePerspectivesCommand && !importedTsJs) { + $('body').append( + '\n' + + '\n' + + '\n' + + ''); + + importedTsJs = true; + } + var id = ApplicationService.createUniqueId(); + if (peId2projectId[scope.mmsPeId]) { + id = peId2projectId[scope.mmsPeId]; + } else { + peId2projectId[scope.mmsPeId] = id; + } + projectId2PeId[id] = scope.mmsPeId; + + scope.containerId = "tabContainer-" + id; + scope.viewId = "view-" + id; + scope.tableId = "table-" + id; + scope.edgeTableId = "edgeTable-" + id; + scope.inspectorId = "inspector-" + id; + scope.controlsId = "controls-" + id; + scope.initElements = []; + + var params = { + viewName: viewNameMapping[scope.mmsTspSpec.diagramType], + viewType: 'tsDrawingView', + tableName: elementTableMapping[scope.mmsTspSpec.diagramType], + edgeTableName: relTableMapping[scope.mmsTspSpec.diagramType], + inspectorName: 'Details', + controlsName: controlMapping[scope.mmsTspSpec.diagramType] + }; + + if (scope.mmsTspSpec && scope.mmsTspSpec.elements) + scope.initElements = scope.mmsTspSpec.elements; + if (scope.mmsTspSpec && scope.mmsTspSpec.context) + scope.context = scope.mmsTspSpec.context; + + + var webProjectCommand = _createWebProjectCommand(scope, params, id); + mapping[id] = _createUpdateCommand(scope, params.viewName, id); + + function tryInvokeCommand() { + if (!$window.invokePerspectivesCommand) { + $timeout(tryInvokeCommand, 1000, false); + } else { + $window.invokePerspectivesCommand(webProjectCommand); + } + } + tryInvokeCommand(); + }; + + function _getElementsArrayString(elements) { + return '[{"id": "' + elements.join('"}, {"id": "') + '"}]'; + } + + function _createWebProjectCommand(scope, params, id) { + var webProjectCommand = { + "command": "WebProject", + "onload": "onPerspectivesProjectLoad", + "onready": "onPerspectivesProjectReady", //quirk? + "onfailure": "onPerspectivesCommandFailure", + "onsuccess": "onPerspectivesCommandSuccess", + "data": [ + { + "command": "LoadProject", + "data": { + "project": id, + "filename": "project/MMS.tsp" + } + }, + { + "command": "NewDefaultModel", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id + } + }, + { + "command": "NewIntegrator", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id, + "integratorName": "MMS ADD", + "integratorID": "int-add-" + id + } + }, + { + "command": "NewIntegrator", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id, + "integratorName": "Filter Control Data", + "integratorID": "int-fcd-" + id, + "integratorFileLocation": "data/SysMLFilterDefaults.xlsx" + } + }, + { + "command": "NewView", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id, + "viewID": "view-" + id, + "viewName": params.viewName, + "viewClass": params.viewType, + "onload": "onPerspectivesViewLoaded", + "onupdate": "onPerspectivesViewUpdated", + "oncanvasrendered": "onPerspectivesViewCanvasRendered" + } + }, + { + "command": "NewView", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id, + "viewID": "table-" + id, + "viewName": params.tableName, + "viewClass": 'tsTableView', + "onload": "onPerspectivesViewLoaded", + "onupdate": "onPerspectivesViewUpdated", + "oncanvasrendered": "onPerspectivesViewCanvasRendered" + } + }, + { + "command": "NewView", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id, + "viewID": "edgeTable-" + id, + "viewName": params.edgeTableName, + "viewClass": 'tsTableView', + "onload": "onPerspectivesViewLoaded", + "onupdate": "onPerspectivesViewUpdated", + "oncanvasrendered": "onPerspectivesViewCanvasRendered" + } + }, + { + "command": "NewView", + "data": { + "project": id, + "module": "SysML", + "modelID":"model-" + id, + "viewID": "" + scope.inspectorId, + "viewName": params.inspectorName, + "viewClass": 'tsInspectorView', + "onload": "onPerspectivesViewLoaded", + "onupdate": "onPerspectivesViewUpdated", + "oncanvasrendered": "onPerspectivesViewCanvasRendered" + } + }, + { + "command": "NewView", + "data": { + "project": id, + "module": "SysML", + "modelID":"model-" + id, + "viewID": "" + scope.controlsId, + "viewName": params.controlsName, + "viewClass": 'tsTreeView', + "onload": "onPerspectivesViewLoaded", + "onupdate": "onPerspectivesViewUpdated", + "oncanvasrendered": "onPerspectivesViewCanvasRendered" + } + }, + { + "command": "NewTabPanel", + "data": { + "project": id, + "module": "SysML", + "modelID": "model-" + id, + "id": "tabContainer-" + id, + "widgetIDs": [scope.viewId, scope.tableId, scope.edgeTableId, + scope.inspectorId, scope.controlsId] + } + } + + ] + }; + return webProjectCommand; + } + + function _createUpdateCommand(scope, viewName, id) { + var updateCommand = { + "command": "Group", + "onsuccess": "onPerspectivesCommandSuccess", + "data": [ + { + "command": "Custom", + "data": { + "serverClassName": "gov.nasa.jpl.mbee.ems.action.SetMmsRestBaseUrlCommandImpl", + "args": ["int-add-" + id, URLService.getMmsServer() + URLService.getRoot()], + "modelID": 'model-' + id, + "module": "SysML", + "project": id, + "viewID": "view-" + id, + "viewName": viewName + } + }, + { + "command": "SetModelAttribute", + "data": { + "attributeName": "Ticket", + "attributeValue": AuthService.getToken(), + "modelID": 'model-' + id, + "module": "SysML", + "project": id, + "viewID": "view-" + id, + "viewName": viewName + }, + "onfailure": "onPerspectivesCommandFailure", + }, + { + "command": "SetModelAttribute", + "data": { + "attributeName": "MMSRefId", + "attributeValue": scope.mmsRefId, + "modelID": 'model-' + id, + "module": "SysML", + "project": id, + "viewID": "view-" + id, + "viewName": viewName + }, + "onfailure": "onPerspectivesCommandFailure", + }, + { + "command": "SetModelAttribute", + "data": { + "attributeName": "MMSProjectId", + "attributeValue": scope.mmsProjectId, + "modelID": 'model-' + id, + "module": "SysML", + "project": id, + "viewID": "view-" + id, + "viewName": viewName + }, + "onfailure": "onPerspectivesCommandFailure", + } + ] + }; + if (scope.context || (scope.initElements.length > 0)) { + var initialIntegratorIds = []; + if (scope.initElements.length > 0) { + updateCommand.data.push({ + "command": "SetModelAttribute", + "data": { + "attributeName": "AddElements", + "attributeValue": _getElementsArrayString(scope.initElements), + "modelID": 'model-' + id, + "module": "SysML", + "project": id, + "viewID": "view-" + id, + "viewName": viewName + }, + "onfailure":"onPerspectivesCommandFailure", + }); + initialIntegratorIds.push('int-add-' + id); + } + initialIntegratorIds.push('int-fcd-' + id); + updateCommand.data.push({ + "command": "Update", + "onsuccess": "onPerspectivesCommandSuccess", + "onfailure": "onPerspectivesCommandFailure", + "data": { + "project": id, + "module": "SysML", + "integratorIDs": initialIntegratorIds + } + }); + if (scope.context) { + updateCommand.data.push({ + "command": "Custom", + "data": { + "project": id, + "module": "SysML", + "modelID": 'model-' + id, + "serverClassName": "gov.nasa.jpl.mbee.ems.command.NewContextCommand", + "viewID": "view-" + id, + "viewName": viewName, + "args": ["" + scope.context] + }, + "onfailure": "onPerspectivesCommandFailure", + }); + } + } + return updateCommand; + } + + return { + restrict: 'E', + template: template, + scope: { + mmsProjectId: '@', + mmsRefId: '@', + mmsTspSpec: '<', + mmsPeId: '@' + }, + link: mmsTsDiagramLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsValueLink.js b/src/directives/mmsValueLink.js new file mode 100755 index 000000000..2b13aa3cc --- /dev/null +++ b/src/directives/mmsValueLink.js @@ -0,0 +1,98 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsValueLink', ['ElementService', mmsValueLink]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsValueLink + * + * @requires mms.ElementService + * + * @restrict E + * + * @description + * Given an element id, generates a hyperlink with a cross-reference value + * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + * @param {string} mmsErrorText Text to display when element is not found + * @param {string} mmsLinkText Text to display for hyperlink + */ +function mmsValueLink(ElementService, $compile, growl) { + + var mmsValueLinkLink = function(scope, element, attrs, controllers) { + var mmsCfCtrl = controllers[0]; + var mmsViewCtrl = controllers[1]; + var projectId = scope.mmsProjectId; + var refId = scope.mmsRefId; + var commitId = scope.mmsCommitId; + if (mmsCfCtrl) { + var cfVersion = mmsCfCtrl.getElementOrigin(); + if (!projectId) + projectId = cfVersion.projectId; + if (!refId) + refId = cfVersion.refId; + if (!commitId) + commitId = cfVersion.commitId; + } + if (mmsViewCtrl) { + var viewVersion = mmsViewCtrl.getElementOrigin(); + if (!projectId) + projectId = viewVersion.projectId; + if (!refId) + refId = viewVersion.refId; + if (!commitId) + commitId = viewVersion.commitId; + } + if (!projectId) { + return; + } + scope.projectId = projectId; + scope.refId = refId ? refId : 'master'; + scope.commitId = commitId ? commitId : 'latest'; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.projectId, refId: scope.refId, commitId: scope.commitId}; + + ElementService.getElement(reqOb) + .then(function(data) { + if (data.type === 'Property') { + var value = data.defaultValue; + if (value && value.type === 'LiteralString') + scope.url = value.value; + } else if (data.type === 'Slot') { + if (angular.isArray(data.value) && data.value.length > 0 && data.value[0].type === 'LiteralString') { + scope.url = data.value[0].value; + } + } else { + if (scope.mmsErrorText){ + element.html(''+ scope.mmsErrorText +''); + } else { + if (scope.mmsErrorText){ + element.html(''+ scope.mmsErrorText +''); + } else { + element.html('Element does not provide link value.'); + } + } + } + }, function(reason) { + element.html('Element was not found.'); + }); + }; + + return { + restrict: 'E', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsErrorText: '@', + mmsLinkText: '@', + }, + require: ['?^^mmsCf', '?^^mmsView'], + template: '{{mmsLinkText}}', + link: mmsValueLinkLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsView.js b/src/directives/mmsView.js new file mode 100755 index 000000000..8c53aa28d --- /dev/null +++ b/src/directives/mmsView.js @@ -0,0 +1,350 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsView', ['Utils', 'AuthService', 'ViewService', 'ElementService', '$templateCache', 'growl', mmsView]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsView + * + * @requires mms.ViewService + * @requires mms.ElementService + * @requires $templateCache + * @requires growl + * + * @restrict E + * + * @description + * Given a view id, renders the view according to the json given by mms.ViewService + * The view has a text edit mode, where transclusions can be clicked. The view's last + * modified time and author is the latest of any transcluded element modified time. + * For available api methods, see methods section. + * + * ## Example + * ### controller (js) + *
+    angular.module('app', ['mms.directives'])
+    .controller('ViewCtrl', ['$scope', function($scope) {
+        $scope.api = {}; //empty object to be populated by the view directive
+        $scope.handler = function(elementId) {
+            //element with elementId clicked in view
+        };
+        $scope.showComments = function() {
+            $scope.api.setShowComments(true);
+        };
+    }]);
+    
+ * ### template (html) + *
+    
+ + +
+
+ * ## Example view at a certain commit + *
+    
+    
+ * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + * @param {expression=} mmsCfClicked The expression to handle transcluded elements in the + * view being clicked, this should be a function whose argument is 'elementId' + */ + +function mmsView(Utils, AuthService, ViewService, ElementService, $templateCache, growl) { + var template = $templateCache.get('mms/templates/mmsView.html'); + + var mmsViewCtrl = function($scope) { + $scope.presentationElemCleanUpFncs = []; + + this.isTranscludedElement = function(elementName) { + if (elementName === 'MMS-TRANSCLUDE-COM' || + elementName === 'MMS-TRANSCLUDE-DOC' || + elementName === 'MMS-TRANSCLUDE-ART' || + elementName === 'MMS-TRANSCLUDE-IMG' || + elementName === 'MMS-TRANSCLUDE-NAME' || + elementName === 'MMS-TRANSCLUDE-VAL') { + return true; + } + return false; + }; + + this.isViewElement = function(elementName) { + if (elementName === 'MMS-VIEW-IMG' || + elementName === 'MMS-VIEW-LIST' || + elementName === 'MMS-VIEW-PARA' || + elementName === 'MMS-VIEW-TABLE' || + elementName === 'MMS-VIEW-TABLE-T' || + elementName === 'MMS-VIEW-LIST-T' || + elementName === 'MMS-VIEW-EQUATION') { + return true; + } + return false; + }; + + this.isPresentationElement = function(elementName) { + if (elementName === 'MMS-VIEW-PRESENTATION-ELEM') { + return true; + } + return false; + }; + + this.isEditable = function() { + return $scope.showEdits; + }; + + this.transcludeClicked = function(elementOb) { + if ($scope.mmsViewApi && $scope.mmsViewApi.elementClicked && elementOb) + $scope.mmsViewApi.elementClicked(elementOb); + }; + + this.elementTranscluded = function(elem, type) { + if (elem) { + if (elem._modified > $scope.modified && type !== 'Comment') { + $scope.modified = elem._modified; + if (elem._modifier) { + $scope.modifier = elem._modifier; + /*AuthService.getUserData(elem._modifier).then(function(modifierData){ + $scope.modifier = modifierData.users[0]; + }, function() { + $scope.modifier = elem._modifier; + });*/ + } + } + if ($scope.mmsViewApi && $scope.mmsViewApi.elementTranscluded) + $scope.mmsViewApi.elementTranscluded(elem, type); + } + }; + + //INFO this was getWsAndVersion + this.getElementOrigin = function() { + return { + projectId: $scope.mmsProjectId, + refId: $scope.mmsRefId, + commitId: $scope.mmsCommitId + }; + }; + + this.getView = function() { + // scope view gets set in the viewlink fnc + return $scope.view; + }; + + $scope.hoverIn = function() { + $scope.isHover = true; + }; + $scope.hoverOut = function() { + $scope.isHover = false; + }; + }; + + var mmsViewLink = function(scope, element, attrs) { + // Build request object + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: scope.mmsRefId, commitId: scope.mmsCommitId}; + var processed = false; + scope.setPeLineVisibility = function($event) { + window.setTimeout(function() { + var peContainer = $($event.currentTarget).closest('.add-pe-button-container'); + if (peContainer.find('.dropdown-menu').css('display') == 'none') { + peContainer.find('hr').css('visibility', 'hidden'); + } else { + peContainer.find('hr').css('visibility', 'visible'); + } + }); + }; + scope.isSection = false; + + var changeView = function(newVal, oldVal) { + if (!newVal || (newVal === oldVal && processed)) + return; + processed = true; + element.addClass('isLoading'); + ElementService.getElement(reqOb, 1) + .then(function(data) { + //view accepts a section element + if (data.type === 'InstanceSpecification') { + scope.isSection = true; + } + var operand = []; + if (data._contents && data._contents.operand) { + operand = data._contents.operand; + } + if (data.specification && data.specification.operand) { + operand = data.specification.operand; + } + var dups = Utils.checkForDuplicateInstances(operand); + if (dups.length > 0) { + growl.warning("There are duplicates in this view, dupilcates ignored!"); + } + if (data._veNumber) { + scope.level = data._veNumber.split('.').length; + } + if (//data._numElements && data._numElements > 5000 && + scope.mmsCommitId && scope.mmsCommitId !== 'latest') { + //threshold where getting view elements in bulk takes too long and it's not latest + //getting cached individual elements should be faster + scope.view = data; + scope.modified = data._modified; + scope.modifier = data._modifier; + /*AuthService.getUserData(data._modifier).then(function(modifierData){ + scope.modifier = modifierData.users[0]; + }, function() { + scope.modifier = data._modifier; + });*/ + return; + } + ViewService.getViewElements(reqOb, 1) + .finally(function() { + scope.view = data; + scope.modified = data._modified; + scope.modifier = data._modifier; + /*AuthService.getUserData(data._modifier).then(function(modifierData){ + scope.modifier = modifierData.users[0]; + }, function() { + scope.modifier = data._modifier; + });*/ + element.removeClass('isLoading'); + }); + }, function(reason) { + growl.error('Getting View Error: ' + reason.message + ': ' + scope.mmsElementId); + }).finally(function() { + if (scope.view) + element.removeClass('isLoading'); + }); + }; + scope.$watch('mmsElementId', changeView); + scope.showElements = false; + scope.showComments = false; + scope.showEdits = false; + + + /** + * @ngdoc function + * @name mms.directives.directive:mmsView#addEltAction + * @methodOf mms.directives.directive:mmsView + * + * @description + * Add specified element at the defined 'index' + */ + scope.addEltAction = function (index, type) { + if (!scope.showEdits) { + return; + } + scope.addPeIndex = index; + Utils.addPresentationElement(scope, type, scope.view); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsView#toggleShowElements + * @methodOf mms.directives.directive:mmsView + * + * @description + * toggle elements highlighting + */ + scope.toggleShowElements = function() { + scope.showElements = !scope.showElements; + element.toggleClass('outline'); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsView#toggleShowComments + * @methodOf mms.directives.directive:mmsView + * + * @description + * toggle comments visibility + */ + scope.toggleShowComments = function() { + scope.showComments = !scope.showComments; + element.toggleClass('reviewing'); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsView#toggleShowEdits + * @methodOf mms.directives.directive:mmsView + * + * @description + * toggle elements editing panel + */ + scope.toggleShowEdits = function() { + scope.showEdits = !scope.showEdits; + element.toggleClass('editing'); + // Call the callback functions to clean up frames, show edits, and + // re-open frames when needed: + for (var i = 0; i < scope.presentationElemCleanUpFncs.length; i++) { + scope.presentationElemCleanUpFncs[i](); + } + }; + + if (angular.isObject(scope.mmsViewApi)) { + var api = scope.mmsViewApi; + api.toggleShowElements = scope.toggleShowElements; + api.toggleShowEdits = scope.toggleShowEdits; + api.toggleShowComments = scope.toggleShowComments; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsView#setShowElements + * @methodOf mms.directives.directive:mmsView + * + * @description + * self explanatory + * + * @param {boolean} mode arg + */ + api.setShowElements = function(mode) { + scope.showElements = mode; + if (mode) + element.addClass('outline'); + else + element.removeClass('outline'); + }; + + /** + * @ngdoc function + * @name mms.directives.directive:mmsView#setShowComments + * @methodOf mms.directives.directive:mmsView + * + * @description + * self explanatory + * + * @param {boolean} mode arg + */ + api.setShowComments = function(mode) { + scope.showComments = mode; + if (mode) + element.addClass('reviewing'); + else + element.removeClass('reviewing'); + }; + + api.changeView = function(vid) { + scope.changeView(vid); + }; + + if (api.init) { + api.init(api); + } + } + }; + + return { + restrict: 'E', + template: template, + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsLink: '<', + mmsViewApi: '<' + }, + controller: ['$scope', mmsViewCtrl], + link: mmsViewLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsViewEquation.js b/src/directives/mmsViewEquation.js new file mode 100755 index 000000000..21fec5d41 --- /dev/null +++ b/src/directives/mmsViewEquation.js @@ -0,0 +1,15 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsViewEquation', [mmsViewEquation]); + +function mmsViewEquation() { + + return { + restrict: 'E', + template: '', + scope: { + para: '
', + scope: { + para: 'view link doesn't refer to a view"); + } + scope.loading = false; + if (ApplicationService.getState().fullDoc) { + scope.href = UtilsService.PROJECT_URL_PREFIX + scope.projectId + '/' + scope.refId + '/documents/' + scope.docid + '/full' + scope.hash; + } else { + scope.href = UtilsService.PROJECT_URL_PREFIX + scope.projectId + '/' + scope.refId + '/documents/' + scope.docid + '/views/' + scope.vid; + } + scope.showNum = ApplicationService.getState().inDoc && (ApplicationService.getState().currentDoc === scope.docid) && !scope.suppressNumbering; + }, function(reason) { + element.html(''); + $compile(element.contents())(Object.assign(scope.$new(), { + reqOb: reqOb, + recentElement: reason.data.recentVersionOfElement, + type: ViewService.AnnotationType.mmsViewLink + })); + scope.loading = false; + }); + }); + }; + + return { + restrict: 'E', + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsDocId: '@', + mmsPeId: '@', + linkText: '@?', + linkClass: '@?', + linkIconClass: '@?', + linkTarget: '@?', + mmsExternalLink: '{{linkText}}{{type}}{{element._veNumber}}{{suffix}} - {{name || "Unnamed View"}}{{type}}{{element._veNumber}}{{suffix}}{{name || "Unnamed View"}}' + + '', + link: mmsViewLinkLink + }; +} diff --git a/src/directives/mmsViewList.js b/src/directives/mmsViewList.js new file mode 100755 index 000000000..ba18dd8fd --- /dev/null +++ b/src/directives/mmsViewList.js @@ -0,0 +1,23 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsViewList', ['$compile', 'UtilsService', 'Utils', mmsViewList]); + +function mmsViewList($compile, UtilsService, Utils) { + + return { + restrict: 'E', + scope: { + list: '', + scope: { + para: '
{{plot.title}}
'; + $compile(domElement.contents())(scope); + } + }; + return { + restrict: 'E', + require: '?^mmsView', + scope: { + plot: 'Reference is null'); + return; + } + var projectId = null; + var refId = null; + var commitId = null; + if (mmsViewCtrl) { + var viewVersion = mmsViewCtrl.getElementOrigin(); + projectId = viewVersion.projectId; + refId = viewVersion.refId; + commitId = viewVersion.commitId; + } + // Parse the element reference tree for the presentation element: + element.addClass("isLoading"); + var reqOb = {elementId: scope.mmsInstanceVal.instanceId, projectId: projectId, refId: refId, commitId: commitId, includeRecentVersionElement: true}; + ElementService.getElement(reqOb, 1) + .then(function(instanceSpec) { + scope.presentationElem = ViewService.getPresentationElementSpec(instanceSpec); + scope.instanceSpec = instanceSpec; + ViewService.getViewElements(reqOb, 0) // bulk get and cache elements incase of table instead of 1 by 1 + .finally(function() { + scope.presentationElemLoading = false; + var hash = $location.hash(); + if (hash === instanceSpec.id) { + $timeout(function() { + $anchorScroll(); + }, 1000, false); + } + if (mmsViewCtrl) { + mmsViewCtrl.elementTranscluded(instanceSpec); + } + element.click(function(e) { + if (mmsViewCtrl) + mmsViewCtrl.transcludeClicked(instanceSpec); + e.stopPropagation(); + }); + }); + }, function(reason) { + if (reason.status === 500) { + element.html('View element reference error: ' + scope.mmsInstanceVal.instanceId + ' invalid specification'); + } else { + element.html(''); + $compile(element.contents())(Object.assign(scope.$new(), { + reqOb: reqOb, + recentElement: reason.data.recentVersionOfElement, + type: ViewService.AnnotationType.mmsPresentationElement + })); + } + }).finally(function() { + element.removeClass("isLoading"); + }); + } + }; + + return { + restrict: 'E', + template: template, + require: '?^^mmsView', + scope: { + mmsInstanceVal: '<', + mmsParentSection: '<', + }, + controller: ['$scope', mmsViewPresentationElemCtrl], + link: mmsViewPresentationElemLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsViewReorder.js b/src/directives/mmsViewReorder.js new file mode 100755 index 000000000..07ff49dba --- /dev/null +++ b/src/directives/mmsViewReorder.js @@ -0,0 +1,231 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsViewReorder', ['ElementService', 'ViewService', 'PermissionsService', '$templateCache', 'growl', '$q', '_', mmsViewReorder]); + +/** + * @ngdoc directive + * @name mms.directives.directive:mmsViewReorder + * + * @requires mms.ViewService + * @requires $templateCache + * + * @restrict E + * + * @description + * Visualize and edit the structure of a view + * + * @param {string} mmsElementId The id of the view + * @param {string} mmsProjectId The project id for the view + * @param {string=master} mmsRefId Reference to use, defaults to master + * @param {string=latest} mmsCommitId Commit ID, default is latest + */ +function mmsViewReorder(ElementService, ViewService, PermissionsService, $templateCache, growl, $q, _) { + var template = $templateCache.get('mms/templates/mmsViewReorder.html'); + + var mmsViewReorderCtrl = function($scope, ViewService) { + this.getEditing = function() { + return $scope.editing; + }; + $scope.treeOptions = { + accept: function(sourceNodeScope, destNodeScope, destIndex) { + if (sourceNodeScope.element.isOpaque) + return false; + if (destNodeScope.$element.hasClass('root')) + return true; + if (ViewService.isSection(destNodeScope.element.presentationElement)) + return true; + return false; + } + }; + }; + + var mmsViewReorderLink = function(scope, element, attrs) { + var ran = false; + var lastid = null; //race condition if view id changes fast and getting data for old id returns later than last id + scope.$watch('mmsElementId', function(newVal, oldVal) { + if (!newVal || newVal == oldVal && ran) + return; + ran = true; + lastid = newVal; + var commitId = scope.mmsCommitId; + commitId = commitId ? commitId : 'latest'; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: scope.mmsRefId, commitId: commitId}; + ElementService.getElement(reqOb) + .then(function(data) { + if (newVal !== lastid) + return; + scope.view = data; + scope.editable = commitId === 'latest' && PermissionsService.hasProjectIdBranchIdEditPermission(scope.mmsProjectId, scope.mmsRefId); + + var contents = data._contents || data.specification; + if (contents) { + ViewService.getElementReferenceTree(reqOb, contents) + .then(function(elementReferenceTree) { + if (newVal !== lastid) + return; + scope.elementReferenceTree = elementReferenceTree; + scope.originalElementReferenceTree = _.cloneDeep(elementReferenceTree, function(value, key, object) { + if (key === 'instanceId' || key === 'instanceSpecification' || key === 'presentationElement' || key === 'instanceVal') + return value; + return undefined; + }); + }, function(reason) { + if (newVal !== lastid) + return; + scope.elementReferenceTree = []; + scope.originalElementReferenceTree = []; + }); + } else { + scope.elementReferenceTree = []; + scope.originalElementReferenceTree = []; + } + + }, function(reason) { + if (newVal !== lastid) + return; + growl.error('View Error: ' + reason.message); + scope.elementReferenceTree = []; + scope.originalElementReferenceTree = []; + }); + }); + + scope.editing = false; + scope.elementReferenceTree = []; + scope.originalElementReferenceTree = []; + + scope.toggleEditing = function() { + if (!scope.editable) + return false; + scope.editing = !scope.editing; + return true; + }; + + scope.save = function() { + var elementObsToUpdate = []; + var updateSectionElementOrder = function(elementReference) { + var sectionEdit = { + id: elementReference.instanceId, + //_modified: elementReference.instanceSpecification._modified, + _projectId: elementReference.instanceSpecification._projectId, + _refId: elementReference.instanceSpecification._refId, + type: elementReference.instanceSpecification.type, + specification: { + type: "Expression" + } + }; + //sectionEdit.specialization = _.cloneDeep(elementReference.instanceSpecification.specialization); + var operand = sectionEdit.specification.operand = []; + var origOperand = elementReference.instanceSpecification.specification.operand; + for (var i = 0; i < elementReference.sectionElements.length; i++) { + operand.push(elementReference.sectionElements[i].instanceVal); + if (elementReference.sectionElements[i].sectionElements.length > 0) + updateSectionElementOrder(elementReference.sectionElements[i]); + } + if (!angular.equals(operand, origOperand)) { + elementObsToUpdate.push(sectionEdit); + } + }; + + var deferred = $q.defer(); + if (!scope.editable || !scope.editing) { + deferred.reject({type: 'error', message: "View isn't editable and can't be saved."}); + return deferred.promise; + } + if (scope.elementReferenceTree.length === 0) { + deferred.reject({type: 'error', message: 'View contents were not initialized properly or is empty.'}); + return deferred.promise; + } + var viewEdit = { + id: scope.view.id, + //_modified: scope.view._modified, + _projectId: scope.view._projectId, + _refId: scope.view._refId, + type: scope.view.type + }; + //viewEdit.specialization = _.cloneDeep(scope.view.specialization); + if (scope.view._contents) + viewEdit._contents = JSON.parse(JSON.stringify(scope.view._contents)); + if (scope.view.specification) + viewEdit.specification = JSON.parse(JSON.stringify(scope.view.specification)); + var contents = viewEdit._contents || viewEdit.specification; + var origContents = scope.view._contents || scope.view.specification; + // Update the View edit object on Save + if (contents) { + contents.operand = []; + for (var i = 0; i < scope.elementReferenceTree.length; i++) { + contents.operand.push(scope.elementReferenceTree[i].instanceVal); + } + } + if (viewEdit.view2view) + delete viewEdit.view2view; + if (contents && !angular.equals(contents.operand, origContents.operand)) { + elementObsToUpdate.push(viewEdit); + } + // promises.push(ViewService.updateView(viewEdit, scope.mmsRefId)); + for (var j = 0; j < scope.elementReferenceTree.length; j++) { + if (scope.elementReferenceTree[j].sectionElements.length > 0) + updateSectionElementOrder(scope.elementReferenceTree[j]); + } + + return ElementService.updateElements(elementObsToUpdate, false); + }; + + scope.revert = function() { + scope.elementReferenceTree = _.cloneDeep(scope.originalElementReferenceTree, function(value, key, object) { + if (key === 'instanceId' || key === 'instanceSpecification' || key === 'presentationElement' || key === 'instanceVal') + return value; + return undefined; + }); + }; + + scope.refresh = function() { + var contents = scope.view._contents || scope.view.specification; + var reqOb = {elementId: scope.mmsElementId, projectId: scope.mmsProjectId, refId: scope.mmsRefId, commitId: scope.mmsCommitId}; + if (contents) { + ViewService.getElementReferenceTree(reqOb, contents) + .then(function(elementReferenceTree) { + scope.elementReferenceTree = elementReferenceTree; + scope.originalElementReferenceTree = _.cloneDeep(elementReferenceTree, function(value, key, object) { + if (key === 'instanceId' || key === 'instanceSpecification' || key === 'presentationElement' || key === 'instanceVal') + return value; + return undefined; + }); + }, function(reason) { + scope.elementReferenceTree = []; + scope.originalElementReferenceTree = []; + }); + } else { + scope.elementReferenceTree = []; + scope.originalElementReferenceTree = []; + } + }; + + if (angular.isObject(scope.mmsViewReorderApi)) { + var api = scope.mmsViewReorderApi; + api.toggleEditing = scope.toggleEditing; + api.save = scope.save; + api.refresh = scope.refresh; + api.setEditing = function(mode) { + if (!scope.editable && mode) + return false; + scope.editing = mode; + }; + api.revertEdits = scope.revert; + } + }; + + return { + restrict: 'E', + template: template, + scope: { + mmsElementId: '@', + mmsProjectId: '@', + mmsRefId: '@', + mmsCommitId: '@', + mmsViewReorderApi: '<' + }, + controller: ['$scope', 'ViewService', mmsViewReorderCtrl], + link: mmsViewReorderLink + }; +} \ No newline at end of file diff --git a/src/directives/mmsViewSection.js b/src/directives/mmsViewSection.js new file mode 100755 index 000000000..082fa412f --- /dev/null +++ b/src/directives/mmsViewSection.js @@ -0,0 +1,168 @@ +'use strict'; + +angular.module('mms.directives') +.directive('mmsViewSection', ['$compile', '$templateCache', 'ViewService', 'UxService', 'Utils', 'EventService', 'growl', mmsViewSection]); + +function mmsViewSection($compile, $templateCache, ViewService, UxService, Utils, EventService, growl) { + + const eventSvc = EventService; + + var defaultTemplate = $templateCache.get('mms/templates/mmsViewSection.html'); + + var mmsViewSectionCtrl = function($scope) { + + + eventSvc.$init($scope); + $scope.sectionInstanceVals = []; + $scope.bbApi = {}; + $scope.buttons = []; + $scope.buttonsInit = false; + //$scope.element = $scope.section; + + $scope.bbApi.init = function() { + if (!$scope.buttonsInit) { + $scope.buttonsInit = true; + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-preview", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-save", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-saveC", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-cancel", $scope)); + $scope.bbApi.addButton(UxService.getButtonBarButton("presentation-element-delete", $scope)); + $scope.bbApi.setPermission("presentation-element-delete", $scope.isDirectChildOfPresentationElement); + } + }; + + }; + + var mmsViewSectionLink = function(scope, domElement, attrs, controllers) { + scope.element = scope.section; // This is for methods in Utils + var mmsViewCtrl = controllers[0]; + var mmsViewPresentationElemCtrl = controllers[1]; + scope.setPeLineVisibility = function($event) { + window.setTimeout(function() { + var peContainer = $($event.currentTarget).closest('.add-pe-button-container'); + if (peContainer.find('.dropdown-menu').css('display') == 'none') { + peContainer.find('hr').css('visibility', 'hidden'); + } else { + peContainer.find('hr').css('visibility', 'visible'); + } + }); + }; + domElement.click(function(e) { + //should not do anything if section is not an instancespec + if (scope.startEdit) + scope.startEdit(); + if (mmsViewCtrl && mmsViewPresentationElemCtrl) + mmsViewCtrl.transcludeClicked(scope.section); //show instance spec if clicked + e.stopPropagation(); + }); + + var recompile = function() { + scope.isEditing = false; + scope.inPreviewMode = false; + }; + + var recompileEdit = function() { + // do nothing + }; + + if (scope.section.specification && scope.section.specification.operand) { + var dups = Utils.checkForDuplicateInstances(scope.section.specification.operand); + if (dups.length > 0) { + growl.warning("There are duplicates in this section, dupilcates ignored!"); + } + } + if (scope.section._veNumber) { + scope.level = scope.section._veNumber.split('.').length; + } + domElement.append(defaultTemplate); + $compile(domElement.contents())(scope); + + var projectId = scope.mmsProjectId; + var refId = scope.mmsRefId; + var commitId = scope.mmsCommitId; + + if (mmsViewCtrl) { + var viewVersion = mmsViewCtrl.getElementOrigin(); + if (!projectId) + projectId = viewVersion.projectId; + if (!refId) + refId = viewVersion.refId; + if (!commitId) + commitId = viewVersion.commitId; + } + scope.projectId = projectId; + scope.refId = refId ? refId : 'master'; + scope.commitId = commitId ? commitId : 'latest'; + + if (mmsViewCtrl && mmsViewPresentationElemCtrl) { + + scope.isEditing = false; + scope.inPreviewMode = false; + scope.elementSaving = false; + scope.cleanUp = false; + scope.instanceSpec = mmsViewPresentationElemCtrl.getInstanceSpec(); + scope.instanceVal = mmsViewPresentationElemCtrl.getInstanceVal(); + scope.presentationElem = mmsViewPresentationElemCtrl.getPresentationElement(); + scope.view = mmsViewCtrl.getView(); + scope.isDirectChildOfPresentationElement = Utils.isDirectChildOfPresentationElementFunc(domElement, mmsViewCtrl); + if (scope.instanceSpec.classifierIds[0] === ViewService.TYPE_TO_CLASSIFIER_ID.Section) + scope.isDirectChildOfPresentationElement = false; + var type = "name"; + + if (scope.commitId === 'latest') { + scope.subs.push(eventSvc.$on('element.updated', function(data) { + let elementOb = data.element; + let continueEdit = data.continueEdit; + if (elementOb.id === scope.element.id && elementOb._projectId === scope.element._projectId && + elementOb._refId === scope.element._refId && !continueEdit) { + recompile(); + } + })); + } + + scope.save = function() { + Utils.saveAction(scope, domElement, false); + }; + + scope.saveC = function() { + Utils.saveAction(scope, domElement, true); + }; + + scope.cancel = function() { + Utils.cancelAction(scope, recompile, domElement); + }; + + scope.delete = function() { + Utils.deleteAction(scope, scope.bbApi, mmsViewPresentationElemCtrl.getParentSection()); + }; + + scope.startEdit = function() { + Utils.startEdit(scope,mmsViewCtrl,domElement,null,scope.section); + }; + + scope.preview = function() { + Utils.previewAction(scope, recompileEdit, recompile, type); + }; + } + + scope.addEltAction = function(index, type, e) { + if (!mmsViewCtrl || !mmsViewCtrl.isEditable()) { + return; + } + e.stopPropagation(); + scope.addPeIndex = index; + Utils.addPresentationElement(scope, type, scope.section); + }; + + }; + + return { + restrict: 'E', + scope: { + section: 'Export CSV ' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + '' + + '' + + '
' + + 'Showing {{numFiltered}} of {{numTotal}} Rows:
' + + '
' + html + '
'; + + scope.makeCsv = function() { + var csvString = element.find('.table-wrapper').children('table').table2CSV({delivery:'value'}); + // var bom = "\xEF\xBB\xBF"; //just for excel + var bom2 = "\uFEFF"; //just for excel + var blob = new Blob([bom2 + csvString], { + type: "text/csv;charset=utf-8;" + }); + + if (window.navigator.msSaveOrOpenBlob) { + navigator.msSaveBlob(blob,'TableData.csv'); + } else { + var downloadContainer = angular.element('
'); + var downloadLink = angular.element(downloadContainer.children()[0]); + downloadLink.attr('href', window.URL.createObjectURL(blob)); + downloadLink.attr('download', 'TableData.csv'); + downloadLink.attr('target', '_blank'); + + $document.find('body').append(downloadContainer); + $timeout(function () { + downloadLink[0].click(); + downloadLink.remove(); + }, null); + } + }; + + var fixedHeaders = null; + scope.fixedHeaders = false; + var fixedColumns = null; + scope.fixedColumns = false; + scope.numFixedColumns = 2; + var scroll = function() { + if (fixedColumns) { + fixedColumns.css('transform', 'translateX('+ this.scrollLeft +'px)'); + } + if (fixedHeaders) { + fixedHeaders.css('transform', 'translateY('+ this.scrollTop +'px)'); + } + if (fixedHeaders && fixedColumns) { + element.find('caption').css('transform', 'translate(' + this.scrollLeft + 'px, ' + this.scrollTop + 'px)'); + } + }; + scope.makeFixedHeader = function() { + if (!scope.fixedHeaders) { + element.find('.table-wrapper').removeClass('table-fix-head').css('height', ''); + fixedHeaders.css('transform', '').css('will-change', ''); + fixedHeaders = null; + $window.localStorage.setItem('ve-table-header-' + scope.mmsPe.id, 'false'); + return; + } + element.find('.table-wrapper').addClass('table-fix-head').css('height', $window.innerHeight - 36*3); + //heights for navbar, menu, toolbar + fixedHeaders = element.find('thead, caption'); + fixedHeaders.css('will-change', 'transform'); //browser optimization + element.find('.table-fix-head').on('scroll', scroll); + $window.localStorage.setItem('ve-table-header-' + scope.mmsPe.id, 'true'); + }; + scope.makeFixedColumn = function() { + if (!scope.fixedColumns) { + element.find('.table-wrapper').removeClass('table-fix-column').css('width', ''); + fixedColumns.css('transform', '').css('will-change', '').removeClass('table-fixed-cell'); + fixedColumns = null; + $window.localStorage.setItem('ve-table-column-' + scope.mmsPe.id, 'false'); + return; + } + element.find('.table-wrapper').addClass('table-fix-column').css('width', $window.innerWidth - 400); + fixedColumns = findColumnCells('thead', 'th', scope.numFixedColumns); + fixedColumns = fixedColumns.add(findColumnCells('tbody', 'td', scope.numFixedColumns)); + fixedColumns = fixedColumns.add(element.find('.table-fix-column caption')); + fixedColumns.css('will-change', 'transform'); //browser optimization + fixedColumns.addClass('table-fixed-cell'); + element.find('.table-fix-column').on('scroll', scroll); + $window.localStorage.setItem('ve-table-column-' + scope.mmsPe.id, scope.numFixedColumns); + }; + scope.updateFixedColumns = function() { + scope.fixedColumns = false; + scope.makeFixedColumn(); + scope.fixedColumns = true; + scope.makeFixedColumn(); + }; + var findColumnCells = function(bodyTag, cellTag, n) { + var spanData = {}; //if spanData[curRow][curCol] is true that means that 'cell' should be "" due to merged cell + var curRow = 0; + var data = $(); + element.find('.table-fix-column table').children(bodyTag).children('tr').each(function() { + var curCol = 0; + $(this).children(cellTag).each(function() { + while(spanData[curRow] && spanData[curRow][curCol]) { + curCol++; + } + if (curCol >= n) { + return; + } + data = data.add($(this)); + var rowspan = $(this).attr('rowspan'); + if (rowspan) { + rowspan = parseInt(rowspan); + if (rowspan > 1) { + for (var i = 1; i < rowspan; i++) { + if (!spanData[curRow + i]) { + spanData[curRow + i] = {}; + } + spanData[curRow + i][curCol] = true; + } + } + } + var colspan = $(this).attr('colspan'); + if (!colspan) { + curCol++; + return; + } + colspan = parseInt(colspan); + while (colspan > 1) { + curCol++; + colspan--; + if (rowspan > 1) { + for (var j = 1; j < rowspan; j++) { + spanData[curRow + j][curCol] = true; + } + } + } + curCol++; + }); + curRow++; + }); + return data; + }; + + element[0].innerHTML = html; + $(element[0]).find('img').each(function(index) { + Utils.fixImgSrc($(this)); + }); + var nextIndex = 0; + var thead = element.find('thead'); + $compile(thead)(scope); + var searchbar = element.children('div')[0]; + $compile(searchbar)(scope); + $compile(element.find('caption'))(scope); + //Add the search input here (before the TRS, aka the columns/rows) + var tbody = element.find('.table-wrapper').children('table').children('tbody'); + var trs = tbody.children('tr'); + + var lastIndex = trs.length; + scope.numFiltered = lastIndex; + scope.numTotal = lastIndex; + function compile() { + $timeout(function() { + var first = nextIndex; + if (first > lastIndex) + return; + var now = trs.slice(first, first + 300); + $compile(now)(scope); + nextIndex = first + 300; + if (nextIndex < lastIndex) + compile(); + else { + if ($window.localStorage.getItem('ve-table-header-' + scope.mmsPe.id) == 'true') { + scope.fixedHeaders = true; + scope.makeFixedHeader(); + } + var columnFix = $window.localStorage.getItem('ve-table-column-' + scope.mmsPe.id); + if (columnFix != 'false' && columnFix != null && columnFix != 'null') { + scope.fixedColumns = true; + scope.numFixedColumns = columnFix; + scope.makeFixedColumn(); + } + } + }, 100, false); + } + compile(); + + ctrl.addFullTableFilter(trs); + ctrl.addColumnsWiseFilter(tableConfig, trs); + ctrl.addSorting(trs, tbody); + }; + + var mmsViewTableController = ['$scope', function ($scope) { + var vm = this; + + /** Full Table Filter **/ + vm.addFullTableFilter = addFullTableFilter; + vm._addWatcherToFullTableFilterInput = _addWatcherToFullTableFilterInput; + vm._displaySomeRows = _displaySomeRows; + vm._fullTableFilter = _fullTableFilter; + + /** Add Full Table Filter ability **/ + function addFullTableFilter(trs) { + vm._fullTableFilterWatcherUnregisterFn = vm._addWatcherToFullTableFilterInput(function(){vm._fullTableFilter(trs);}); + } + + /** Add a watcher to the Full Table Filter Input **/ + function _addWatcherToFullTableFilterInput(performFilter) { + return $scope.$watch('searchTerm', function (newInputVal, oldInputVal) { + if (newInputVal !== oldInputVal) { + performFilter(); + } + }); + } + + /** Filter rows by search term **/ + function _fullTableFilter(trs) { + vm._resetColumnWiseFilterInputs(); + if ( $scope.searchTerm === '' ) { + $scope.numFiltered = trs.length; + trs.show(); + } else { + $scope.numFiltered = 0; + vm._displaySomeRows(trs, function() { $scope.numFiltered++; }); + } + } + + /** Display rows that match the filter term **/ + function _displaySomeRows(trs, increaseNumOfRowToShow) { + var searchTerm = $scope.searchTerm; + var regExp = new RegExp(searchTerm, 'i'); + for (var i = 0, numRows = trs.length; i < numRows; i++) { + var string = $(trs[i]).text(); + if (regExp.test(string)) { + $(trs[i]).show(); + increaseNumOfRowToShow(); + } else { + $(trs[i]).hide(); + } + } + } + /** End of Full Table Filter **/ + + + + /** Column(s)-Wise Filter **/ + vm.addColumnsWiseFilter = addColumnsWiseFilter; + vm._addWatchersForAllHeaderColumnsInput = _addWatchersForAllHeaderColumnsInput; + vm._addWatcherToColumnInput = _addWatcherToColumnInput; + vm._displayRowsMatchingAllColumnsFilterTerms = _displayRowsMatchingAllColumnsFilterTerms; + vm._storeColumnWiseFilterTerm = _storeColumnWiseFilterTerm; + vm._addNewColumnWiseFilterTerm = _addNewColumnWiseFilterTerm; + vm._updateExistingColumnWiseFilterTerm = _updateExistingColumnWiseFilterTerm; + vm._getCellValueForFiltering = _getCellValueForFiltering; + vm._resetColumnWiseFilterInputs = _resetColumnWiseFilterInputs; + vm._resetFullTableFilterInput = _resetFullTableFilterInput; + + /** Add column(s)-wise filter ability **/ + function addColumnsWiseFilter(tableConfig, trs) { + vm._columnsInputWatchers = vm._addWatchersForAllHeaderColumnsInput(tableConfig); + /** + * _filterTermForColumns is used to keep track of filter terms on each header's column for multi-columns + * filtering. Some header columns could be a merged column, and have children columns. "columns" property + * keeps track, of all the children columns number that it is a parent of. ie: + * {filterTermForColumn01: {filterTerm: 'A', columns: [0,1}], filterTermForColumn11: {filterTerm: 'B', columns: [1}]} **/ + vm._filterTermForColumns = {}; + $scope.filterByColumn = function (filterTerm, startColNum, endColNum, filterInputBinding) { + vm._resetFullTableFilterInput(trs); + vm._storeColumnWiseFilterTerm(vm._filterTermForColumns, filterInputBinding, startColNum, endColNum, filterTerm); + $scope.numFiltered = 0; + vm._displayRowsMatchingAllColumnsFilterTerms(trs, vm._filterTermForColumns, function() {$scope.numFiltered++;}); + }; + } + + /** Add watchers to all header columns inputs for filtering **/ + function _addWatchersForAllHeaderColumnsInput(tableConfig) { + var columnsInputWatchers = {}; + if (!$scope.table.header) { + return; + } + $scope.table.header.forEach(function (headerRow) { + headerRow.forEach(function(cell) { + var filterInputBinding = tableConfig.filterTermColumnPrefixBinding + cell.startCol + cell.endCol; + vm._addWatcherToColumnInput(columnsInputWatchers, filterInputBinding, cell ); + }); + }); + return columnsInputWatchers; + } + + /** Add a watcher to one header column's input for filtering **/ + function _addWatcherToColumnInput(columnsInputWatchers, filterInputBinding, cell) { + columnsInputWatchers[filterInputBinding] = { + deRegistration: $scope.$watch(filterInputBinding, function (newInputVal, oldInputVal) { + if (newInputVal !== oldInputVal) { + $scope.filterByColumn(newInputVal, cell.startCol, cell.endCol, filterInputBinding); + } + }), + cell: cell + }; + } + + /** Clear out the filter term from the Full Table Filter input **/ + function _resetFullTableFilterInput(trs) { + if ($scope.searchTerm !== '') { + vm._fullTableFilterWatcherUnregisterFn(); + $scope.searchTerm = ''; + vm._fullTableFilterWatcherUnregisterFn = vm._addWatcherToFullTableFilterInput(function(){vm._fullTableFilter(trs);}); + } + } + + /** Only show the rows that has contents matching all currently outstanding filter terms **/ + function _displayRowsMatchingAllColumnsFilterTerms(trs, filterTermForColumns, increaseNumOfRowToShow) { + trs.toArray().forEach(function (row) { + var shouldKeepRow = Object.keys(filterTermForColumns).every(function(k) { + var regExp = new RegExp(filterTermForColumns[k].filterTerm, 'i'); + return filterTermForColumns[k].columns.some(function(colNum) { + return regExp.test(vm._getCellValueForFiltering(row, colNum)); + }); + }); + if (shouldKeepRow) { + $(row).show(); + increaseNumOfRowToShow(); + } else { + $(row).hide(); + } + }); + } + + /** Update or add a new filter term for a header column with the given filterInputBinding **/ + function _storeColumnWiseFilterTerm(filterTermForColumns, filterInputBinding, startColNum, endColNum, filterTerm) { + if (filterTermForColumns[filterInputBinding]) { + vm._updateExistingColumnWiseFilterTerm(filterTermForColumns, filterInputBinding, filterTerm); + } else { + vm._addNewColumnWiseFilterTerm(filterTermForColumns, filterInputBinding, startColNum, endColNum, filterTerm); + } + } + + /** Add a new filter term to a header column with the given filterInputBinding **/ + function _addNewColumnWiseFilterTerm(filterTermForColumns, filterInputBinding, startColNum, endColNum, filterTerm) { + filterTermForColumns[filterInputBinding] = {filterTerm: filterTerm, columns: startColNum === endColNum ? [startColNum] : [startColNum, endColNum] }; + } + + /** Update a filter term for a header column with the given filterInputBinding **/ + function _updateExistingColumnWiseFilterTerm(filterTermForColumns, filterInputBinding, filterTerm) { + filterTermForColumns[filterInputBinding].filterTerm = filterTerm; + } + + /** Return the content of a cell given a row & columnIndex **/ + function _getCellValueForFiltering(row, columnIndex) { + var cell = $(row).children('td').eq(columnIndex); + return cell.text().trim(); + } + + /** Clear out filter term(s) for all header's columns that used to be filtered by before **/ + function _resetColumnWiseFilterInputs() { + var listOfFilterInputBindings = Object.keys(vm._filterTermForColumns); + if ( listOfFilterInputBindings.length > 0 ) { + listOfFilterInputBindings.forEach(function(filterInputBinding) { + if (vm._filterTermForColumns[filterInputBinding].filterTerm !== '' ) { + vm._columnsInputWatchers[filterInputBinding].deRegistration(); + } + $scope[filterInputBinding] = ''; + vm._addWatcherToColumnInput(vm._columnsInputWatchers, filterInputBinding, vm._columnsInputWatchers[filterInputBinding].cell ); + }); + vm._filterTermForColumns = {}; + } + } + /** End of Column(s)-Wise Filter **/ + + + + /** Sorting feature **/ + vm.addSorting = addSorting; + vm._addDefaultSortOrder = _addDefaultSortOrder; + vm._addSortingBinding = _addSortingBinding; + vm._addSortResetBinding = _addSortResetBinding; + vm._comparator = _generalComparator; + vm._getCellValueForSorting = _getCellValueForSorting; + vm._displaySortedRows = _displaySortedRows; + vm._comparatorForSortReset = _comparatorForSortReset; + vm._rowSortOrderAttrName = 'data-original-row-num'; + vm.__areAllCellValidNumber = _areAllCellValidNumber; + + /** Add sorting ability **/ + function addSorting(trs, tbody) { + vm._addDefaultSortOrder(trs); + vm._addSortingBinding(trs, tbody); + vm._addSortResetBinding(trs, tbody); + } + + /** Remember the original row number for each row. Used to restore sort order **/ + function _addDefaultSortOrder(trs) { + trs.each(function (rowNumber, tr) { + $(tr).attr(vm._rowSortOrderAttrName, rowNumber ); + }); + } + + /** Used to sort columns(s). Add sort binding to each header columns of the outermost table **/ + function _addSortingBinding(trs, tbody) { + var tableConfig = UtilsService.tableConfig; + + $scope[tableConfig.showBindingForSortIcon] = -1; + + $scope[tableConfig.sortByColumnFn] = function (sortColumnNum) { + $scope[tableConfig.showBindingForSortIcon] = sortColumnNum; + var rows = trs.toArray(); + var sortedRows = _areAllCellValidNumber(rows, sortColumnNum) ? + rows.sort(_numericalComparator(sortColumnNum)) : rows.sort(_generalComparator(sortColumnNum)); + + $scope.isAscending = !$scope.isAscending; + + if (!$scope.isAscending) { + sortedRows = sortedRows.reverse(); + } + + vm._displaySortedRows(sortedRows, tbody); + $scope.showSortReset = true; + }; + } + + /** Used to restore the sort order of table's rows **/ + function _addSortResetBinding(trs, tbody) { + $scope.resetSort = function() { + var sortedRows = trs.toArray().sort(vm._comparatorForSortReset()); + vm._displaySortedRows(sortedRows, tbody); + + $scope.showSortReset = false; + $scope[UtilsService.tableConfig.showBindingForSortIcon] = -1; + }; + } + + /** A comparator for sorting table's rows. When one of them is null ( null is reserved for non-sortable content + * such as image, list, table ), that content is pushed to the end of the final sorted list regardless of + * whether sorting asc or dsc **/ + function _generalComparator(columnIndex) { + return function(rowA, rowB) { + var cellValueA = _getCellValueForSorting(rowA, columnIndex); + var cellValueB = _getCellValueForSorting(rowB, columnIndex); + + if (cellValueA === null && cellValueB === null) { + return 0; + } + + if (cellValueA === null && cellValueB !== null) { + return $scope.isAscending ? 1 : -1; + } + + if (cellValueA !== null && cellValueB === null) { + return $scope.isAscending ? -1 : 1; + } + + if (cellValueA !== null && cellValueB !== null) { + cellValueA = cellValueA.toLowerCase(); + cellValueB = cellValueB.toLowerCase(); + return cellValueA < cellValueB ? -1 : cellValueA > cellValueB ? 1 : 0; + } + }; + } + + /** Return true if and only if all cells' value can be converted to a valid number **/ + function _areAllCellValidNumber(rows, columnIndex) { + return rows.every(function(row) { + return _isValidNumber(_getCellValueForSorting(row, columnIndex)); + }); + } + + function _numericalComparator(columnIndex) { + return function(rowA, rowB) { + var cellValueA = Number(_getCellValueForSorting(rowA, columnIndex)); + var cellValueB = Number(_getCellValueForSorting(rowB, columnIndex)); + return cellValueA - cellValueB; + }; + } + + function _isValidNumber(val) { + return val !== null && !isNaN(Number(val)); + } + + /** Get content of a cell given its row and its columnIndex. Return null for a cell that contains non-sortable + * content such as image, table, list **/ + function _getCellValueForSorting(row, columnIndex) { + var cell = $(row).children('td').eq(columnIndex); + var containerDivContent = cell.children('div').contents(); + // if there is no content, think of it as empty string + if (containerDivContent.length === 0) { + return ''; + } else if(!containerDivContent.prop('tagName')) { + return cell.text().trim(); + } else { + var cf = 'mms-cf'; + var contentTag = containerDivContent.prop('tagName').toLowerCase(); + var contentTagAttr = containerDivContent.attr('mms-cf-type'); + if ( contentTag === 'img' || contentTag === 'table' || contentTag === cf && ( contentTagAttr === 'img' || contentTagAttr === 'table' )) { + return null; + } else { + return cell.text().trim(); + } + } + } + + /** Display newly sorted rows **/ + function _displaySortedRows(sortedRows, tbody) { + $(sortedRows).detach().appendTo(tbody); + } + + /** This special comparator is used to turn the table's rows into its original sort order **/ + function _comparatorForSortReset() { + return function(rowA, rowB) { + var rowARowNumber = Number($(rowA).attr(vm._rowSortOrderAttrName)); + var rowBRowNumber = Number($(rowB).attr(vm._rowSortOrderAttrName)); + return rowARowNumber < rowBRowNumber ? -1 : rowARowNumber > rowBRowNumber ? 1 : 0; + }; + } + /** End of Sorting feature **/ + }]; + + return { + restrict: 'E', + scope: { + table: '', + scope: { + para: ''; + template += '
  • {{texts.checkAll}}'; + template += '
  • {{texts.uncheckAll}}
  • '; + //template += '
  • '; + template += ''; + //template += '
  • '; + + if (groups) { + template += ''; + template += '
  • '; + } else { + template += '
  • '; + } + + template += ''; + + if (checkboxes) { + template += '
    '; + } else { + template += ' {{getPropertyForObject(option, settings.displayProp)}}'; + } + + template += '
  • '; + + template += '
  • '; + template += '
  • {{selectedModel.length}} {{texts.selectionOf}} {{settings.selectionLimit}} {{texts.selectionCount}}
  • '; + + template += ''; + template += ''; + + element.html(template); + }, + link: function ($scope, $element, $attrs) { + var $dropdownTrigger = $element.children()[0]; + + $scope.toggleDropdown = function () { + $scope.open = !$scope.open; + }; + + $scope.checkboxClick = function ($event, id) { + $scope.setSelectedItem(id); + $event.stopImmediatePropagation(); + }; + + $scope.externalEvents = { + onItemSelect: angular.noop, + onItemDeselect: angular.noop, + onSelectAll: angular.noop, + onDeselectAll: angular.noop, + onInitDone: angular.noop, + onMaxSelectionReached: angular.noop + }; + + $scope.settings = { + dynamicTitle: true, + scrollable: false, + scrollableHeight: '300px', + closeOnBlur: true, + displayProp: 'label', + idProp: 'id', + externalIdProp: 'id', + enableSearch: false, + selectionLimit: 0, + showCheckAll: true, + showUncheckAll: true, + closeOnSelect: false, + buttonClasses: 'btn btn-default', + closeOnDeselect: false, + groupBy: $attrs.groupBy || undefined, + groupByTextProvider: null, + smartButtonMaxItems: 0, + smartButtonTextConverter: angular.noop + }; + + $scope.texts = { + checkAll: 'Check All', + uncheckAll: 'Uncheck All', + selectionCount: 'checked', + selectionOf: '/', + searchPlaceholder: 'Search...', + buttonDefaultText: 'Select', + dynamicButtonTextSuffix: 'checked' + }; + + $scope.searchFilter = $scope.searchFilter || ''; + + if (angular.isDefined($scope.settings.groupBy)) { + $scope.$watch('options', function (newValue) { + if (angular.isDefined(newValue)) { + $scope.orderedItems = $filter('orderBy')(newValue, $scope.settings.groupBy); + } + }); + } + + angular.extend($scope.settings, $scope.extraSettings || []); + angular.extend($scope.externalEvents, $scope.events || []); + angular.extend($scope.texts, $scope.translationTexts); + + $scope.singleSelection = $scope.settings.selectionLimit === 1; + + function getFindObj(id) { + var findObj = {}; + + if ($scope.settings.externalIdProp === '') { + findObj[$scope.settings.idProp] = id; + } else { + findObj[$scope.settings.externalIdProp] = id; + } + + return findObj; + } + + function clearObject(object) { + for (var prop in object) { + delete object[prop]; + } + } + + if ($scope.singleSelection) { + if (angular.isArray($scope.selectedModel) && $scope.selectedModel.length === 0) { + clearObject($scope.selectedModel); + } + } + + if ($scope.settings.closeOnBlur) { + $document.on('click', function (e) { + var target = e.target.parentElement; + var parentFound = false; + + while (angular.isDefined(target) && target !== null && !parentFound) { + // LoDash 3.7 + // if (_.contains(target.className.split(' '), 'multiselect-parent') && !parentFound) { + //LoDash 4.11 + if (_.includes(target.className.split(' '), 'multiselect-parent') && !parentFound) { + if (target === $dropdownTrigger) { + parentFound = true; + } + } + target = target.parentElement; + } + + if (!parentFound) { + $scope.$apply(function () { + $scope.open = false; + }); + } + }); + } + + $scope.getGroupTitle = function (groupValue) { + if ($scope.settings.groupByTextProvider !== null) { + return $scope.settings.groupByTextProvider(groupValue); + } + + return groupValue; + }; + + $scope.getButtonText = function () { + if ($scope.settings.dynamicTitle && ($scope.selectedModel.length > 0 || (angular.isObject($scope.selectedModel) && _.keys($scope.selectedModel).length > 0))) { + if ($scope.settings.smartButtonMaxItems > 0) { + var itemsText = []; + + angular.forEach($scope.options, function (optionItem) { + if ($scope.isChecked($scope.getPropertyForObject(optionItem, $scope.settings.idProp))) { + var displayText = $scope.getPropertyForObject(optionItem, $scope.settings.displayProp); + var converterResponse = $scope.settings.smartButtonTextConverter(displayText, optionItem); + + itemsText.push(converterResponse ? converterResponse : displayText); + } + }); + + if ($scope.selectedModel.length > $scope.settings.smartButtonMaxItems) { + itemsText = itemsText.slice(0, $scope.settings.smartButtonMaxItems); + itemsText.push('...'); + } + + return itemsText.join(', '); + } else { + var totalSelected; + + if ($scope.singleSelection) { + totalSelected = ($scope.selectedModel !== null && angular.isDefined($scope.selectedModel[$scope.settings.idProp])) ? 1 : 0; + } else { + totalSelected = angular.isDefined($scope.selectedModel) ? $scope.selectedModel.length : 0; + } + + if (totalSelected === 0) { + return $scope.texts.buttonDefaultText; + } else { + return totalSelected + ' ' + $scope.texts.dynamicButtonTextSuffix; + } + } + } else { + return $scope.texts.buttonDefaultText; + } + }; + + $scope.getPropertyForObject = function (object, property) { + if (angular.isDefined(object) && object.hasOwnProperty(property)) { + return object[property]; + } + + return ''; + }; + + $scope.selectAll = function () { + $scope.deselectAll(false); + $scope.externalEvents.onSelectAll(); + + angular.forEach($scope.options, function (value) { + $scope.setSelectedItem(value[$scope.settings.idProp], true); + }); + }; + + $scope.deselectAll = function (sendEvent) { + sendEvent = sendEvent || true; + + if (sendEvent) { + $scope.externalEvents.onDeselectAll(); + } + + if ($scope.singleSelection) { + clearObject($scope.selectedModel); + } else { + $scope.selectedModel.splice(0, $scope.selectedModel.length); + } + }; + + $scope.setSelectedItem = function (id, dontRemove) { + var findObj = getFindObj(id); + var finalObj = null; + + if ($scope.settings.externalIdProp === '') { + finalObj = _.find($scope.options, findObj); + } else { + finalObj = findObj; + } + + if ($scope.singleSelection) { + clearObject($scope.selectedModel); + angular.extend($scope.selectedModel, finalObj); + $scope.externalEvents.onItemSelect(finalObj); + if ($scope.settings.closeOnSelect) $scope.open = false; + + return; + } + + dontRemove = dontRemove || false; + + var exists = _.findIndex($scope.selectedModel, findObj) !== -1; + + if (!dontRemove && exists) { + $scope.selectedModel.splice(_.findIndex($scope.selectedModel, findObj), 1); + $scope.externalEvents.onItemDeselect(findObj); + } else if (!exists && ($scope.settings.selectionLimit === 0 || $scope.selectedModel.length < $scope.settings.selectionLimit)) { + $scope.selectedModel.push(finalObj); + $scope.externalEvents.onItemSelect(finalObj); + } + if ($scope.settings.closeOnSelect) $scope.open = false; + }; + + $scope.isChecked = function (id) { + if ($scope.singleSelection) { + return $scope.selectedModel !== null && angular.isDefined($scope.selectedModel[$scope.settings.idProp]) && $scope.selectedModel[$scope.settings.idProp] === getFindObj(id)[$scope.settings.idProp]; + } + + return _.findIndex($scope.selectedModel, getFindObj(id)) !== -1; + }; + + $scope.externalEvents.onInitDone(); + } + }; +}]); \ No newline at end of file diff --git a/src/directives/templates/mergeConfirm.html b/src/directives/templates/mergeConfirm.html new file mode 100755 index 000000000..1081fbf35 --- /dev/null +++ b/src/directives/templates/mergeConfirm.html @@ -0,0 +1,28 @@ + + + + + diff --git a/src/directives/templates/mmsAddPeButton.html b/src/directives/templates/mmsAddPeButton.html new file mode 100755 index 000000000..98e6d980c --- /dev/null +++ b/src/directives/templates/mmsAddPeButton.html @@ -0,0 +1,40 @@ + +
    \ No newline at end of file diff --git a/src/directives/templates/mmsAnnotation.html b/src/directives/templates/mmsAnnotation.html new file mode 100755 index 000000000..f50840e5c --- /dev/null +++ b/src/directives/templates/mmsAnnotation.html @@ -0,0 +1,10 @@ + + diff --git a/src/directives/templates/mmsButtonBar.html b/src/directives/templates/mmsButtonBar.html new file mode 100755 index 000000000..da5ee0472 --- /dev/null +++ b/src/directives/templates/mmsButtonBar.html @@ -0,0 +1,24 @@ + + + + + {{button.text}} + + + + + + + + diff --git a/src/directives/templates/mmsCfModal.html b/src/directives/templates/mmsCfModal.html new file mode 100755 index 000000000..89fd3f007 --- /dev/null +++ b/src/directives/templates/mmsCfModal.html @@ -0,0 +1,64 @@ + + + \ No newline at end of file diff --git a/src/directives/templates/mmsCommentModal.html b/src/directives/templates/mmsCommentModal.html new file mode 100755 index 000000000..52ba48258 --- /dev/null +++ b/src/directives/templates/mmsCommentModal.html @@ -0,0 +1,24 @@ + + + + + \ No newline at end of file diff --git a/src/directives/templates/mmsDiffAttr.html b/src/directives/templates/mmsDiffAttr.html new file mode 100755 index 000000000..570532d0b --- /dev/null +++ b/src/directives/templates/mmsDiffAttr.html @@ -0,0 +1,7 @@ + + + + + {{message}} + + \ No newline at end of file diff --git a/src/directives/templates/mmsGroupDocs.html b/src/directives/templates/mmsGroupDocs.html new file mode 100755 index 000000000..d049e02f3 --- /dev/null +++ b/src/directives/templates/mmsGroupDocs.html @@ -0,0 +1,6 @@ + + + + + +
    Document(s)
    \ No newline at end of file diff --git a/src/directives/templates/mmsHistory.html b/src/directives/templates/mmsHistory.html new file mode 100755 index 000000000..15cf4ce1d --- /dev/null +++ b/src/directives/templates/mmsHistory.html @@ -0,0 +1,140 @@ +

    Element History + +

    + +
    + Compare versions +
    + +
    +
    + Before: +
    + + +
    + + Element does not exist + + on + +
    + + +
    +
    + +
    +
    + After: +
    + + +
    + on + {{compareCommit.ref.type}}: {{compareCommit.ref.name}} +
    +
    + +
    + +
    +
    + Element does not exist on {{baseCommit.refSelected.type}}: {{baseCommit.refSelected.name}} +
    +
    +

    + + +

    + +

    Documentation

    + + + +
    +

    Property Value

    + + + + +
    +

    Commit

    + {{baseCommit.commitSelected.id}}
    +
    + {{compareCommit.commitSelected.id}}
    +
    +
    + + +
    + +
    + +
    +
    + Cannot make changes on a Tag. +
    +
    +
    +
    + To revert documentation, name, and value to before content ({{baseCommit.commitSelected._created | date:'M/d/yy h:mm a'}} by {{baseCommit.commitSelected._creator}}): + +
    +
    diff --git a/src/directives/templates/mmsHtmlDiff.html b/src/directives/templates/mmsHtmlDiff.html new file mode 100755 index 000000000..60093dea5 --- /dev/null +++ b/src/directives/templates/mmsHtmlDiff.html @@ -0,0 +1 @@ +
    diff --git a/src/directives/templates/mmsMention.html b/src/directives/templates/mmsMention.html new file mode 100755 index 000000000..30cf65b84 --- /dev/null +++ b/src/directives/templates/mmsMention.html @@ -0,0 +1,34 @@ + + +
    + +
    diff --git a/src/directives/templates/mmsRefList.html b/src/directives/templates/mmsRefList.html new file mode 100755 index 000000000..f848ace24 --- /dev/null +++ b/src/directives/templates/mmsRefList.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    Tag

    Created

    + {{tag.name}} +
    {{tag.description}}
    +
    {{tag._created | date:'M/d/yy h:mm a'}} +
    + + +
    +
    No tags found
    No tags in current project.

    Branch

    Created

    + {{branch.name}} +
    {{branch.description}}
    +
    {{branch._created | date:'M/d/yy h:mm a'}} +
    + + +
    +
    No branches found
    \ No newline at end of file diff --git a/src/directives/templates/mmsSearch.html b/src/directives/templates/mmsSearch.html new file mode 100755 index 000000000..7b1298a07 --- /dev/null +++ b/src/directives/templates/mmsSearch.html @@ -0,0 +1,177 @@ + + diff --git a/src/directives/templates/mmsSearchResults.html b/src/directives/templates/mmsSearchResults.html new file mode 100755 index 000000000..25738d2bb --- /dev/null +++ b/src/directives/templates/mmsSearchResults.html @@ -0,0 +1,140 @@ + +
    +
    + FILTER: +
    + +
    +
    + +
    Showing {{searchResults.length}} search results. (Page {{currentPage + 1}})
    +
    + + +
    +
    + +
    +
    + {{qualifiedNameFormatter(elem._qualifiedName)}} +
    +
    +
    + +
    +
    + +
    +
    + +
    + {{elem.documentation.length > 270 ? ' ...' : ''}} + + {{emptyDocTxt}} + +
    +
    + + + + + +
    + +
    + {{elem.type}} + + + + + +
    +
    +
    +
    Last modified {{elem._modified | date:'M/d/yy h:mm a'}} by {{elem._modifier}}
    +
    +
    +
    diff --git a/src/directives/templates/mmsSpec.html b/src/directives/templates/mmsSpec.html new file mode 100755 index 000000000..2df28eb5a --- /dev/null +++ b/src/directives/templates/mmsSpec.html @@ -0,0 +1,221 @@ + +
    + +

    + Last modified {{element._modified | date:'M/d/yy h:mm a'}} by {{ modifier.email }}{{ modifier }} + +
    +

    Property Value

    +
    +
    + + +
    +
    +
    +
    +   + +
    + +
    +
    +
    +   + +
    + +
    +
     {{value.value}} 
    +
    +
    +   +
    +
    +
    + +
    + +
    +
    + +
    +
    Editing not supported for now
    +
    +
    + +
    +
    +
    + +
    +
    + +
    +
    + +
    +

    Constraint Specification

    +
    +
    +
    +
    +
    +
    + +
    +
    + +
    +
    Editing not supported for now
    +
    +
    + +

    Documentation

    + + +

    Metatypes

    + + {{element.type}} +
    +
    +

    Location

    + {{element._qualifiedName}} +

    ID

    + {{element.id}} +

    Branch/Tag

    + {{element._refId}} +

    Project

    + {{element._projectId}} +

    Formatted Modified Time

    + {{element._modified}} +

    Commit

    + {{element._commitId}} +
    + +
    +

    + +
    +
    + Element not found: displaying last found content +
    +

    {{element.name}}

    + Last modified {{element._modified | date:'M/d/yy h:mm a'}} by {{ modifier.email }}{{ modifier }} + +
    +

    Property Value

    +
    + {{value.value}} + {{value.value}} + {{value.value | veRealNum}} + {{value.value}} + + + + {{value.body[0]}} + {{value}} +
    +

    Property Type

    + + +
    + +
    +

    Source

    + +

    Target

    + +
    + +
    +

    Path 1

    + +

    Path 2

    + +
    + +
    +

    Role 1

    + +

    Role 2

    + +
    + +
    +

    Constraint Specification

    +
    + {{values[0].value}} + {{values[0].value}} + {{values[0].value | veRealNum}} + {{values[0].value}} + + + {{values[0].body[0]}} + {{values}} +
    +
    + +
    + +
    +
    + +
    +

    Documentation

    +

    + +

    +
    {{element.documentation}}
    + +
    +

    Used by Documents/Views

    + +
    + + + >
    +
    +
    +
    +
    + + +

    Metatypes

    + + {{element.type}} +
    +
    + +
    +

    Classifiers

    + +
    + +

    Location

    + {{element._qualifiedName}} +

    ID  + +

    + + {{element.id}} + +

    Branch/Tag

    + {{element._refId}} +

    Project

    + {{element._projectId}} +

    Formatted Modified Time

    + {{element._modified}} +

    Commit

    + + + {{element._commitId}}  + + + +
    +
    diff --git a/src/directives/templates/mmsToolbar.html b/src/directives/templates/mmsToolbar.html new file mode 100755 index 000000000..9a92aa49a --- /dev/null +++ b/src/directives/templates/mmsToolbar.html @@ -0,0 +1,11 @@ +
    +
    +
    + +
    +
    +
    diff --git a/src/directives/templates/mmsTranscludeDoc.html b/src/directives/templates/mmsTranscludeDoc.html new file mode 100755 index 000000000..61e034334 --- /dev/null +++ b/src/directives/templates/mmsTranscludeDoc.html @@ -0,0 +1,18 @@ +
    +
    +

    +
    +
    + {{panelType}} : + {{panelTitle}} + +
    +

    +
    + +
    +
    +
    + +
    +
    \ No newline at end of file diff --git a/src/directives/templates/mmsTranscludeName.html b/src/directives/templates/mmsTranscludeName.html new file mode 100755 index 000000000..ce80a5037 --- /dev/null +++ b/src/directives/templates/mmsTranscludeName.html @@ -0,0 +1,9 @@ +
    + + Name + + + + + +
    diff --git a/src/directives/templates/mmsTranscludeVal.html b/src/directives/templates/mmsTranscludeVal.html new file mode 100755 index 000000000..bd02e7162 --- /dev/null +++ b/src/directives/templates/mmsTranscludeVal.html @@ -0,0 +1,10 @@ + + {{::value.value}} + {{::value.value}} + {{::value.value | veRealNum}} + {{::value.value}} + + + {{::value.body[0]}} + {{::value}} + \ No newline at end of file diff --git a/src/directives/templates/mmsTranscludeValEdit.html b/src/directives/templates/mmsTranscludeValEdit.html new file mode 100755 index 000000000..5cd963679 --- /dev/null +++ b/src/directives/templates/mmsTranscludeValEdit.html @@ -0,0 +1,12 @@ +
    + + {{value.value}} + {{value.value}} + {{value.value | veRealNum}} + {{value.value}} + + + {{value.body[0]}} + {{value}} + +
    \ No newline at end of file diff --git a/src/directives/templates/mmsTranscludeValFrame.html b/src/directives/templates/mmsTranscludeValFrame.html new file mode 100755 index 000000000..9c96920d5 --- /dev/null +++ b/src/directives/templates/mmsTranscludeValFrame.html @@ -0,0 +1,61 @@ + +
    +
    +

    Value : {{element.name}}

    +
    + +
    +
    +
    +
    +
    + + +
    + +
    +
    + + +
    + +
    +
    +
    + + +
    + +
    +
     {{value.value}} 
    +
    +
    +   +
    +
    +
    + +
    + +
    +
    + +
    +
    Editing not supported for now
    +
    +
    + +
    +
    + +
    + + +
    +
    + +
    +
    +
    + + diff --git a/src/directives/templates/mmsTsDiagram.html b/src/directives/templates/mmsTsDiagram.html new file mode 100755 index 000000000..3e64187f4 --- /dev/null +++ b/src/directives/templates/mmsTsDiagram.html @@ -0,0 +1,6 @@ +
    +
    +
    +
    +
    +
    diff --git a/src/directives/templates/mmsView.html b/src/directives/templates/mmsView.html new file mode 100755 index 000000000..505084ab1 --- /dev/null +++ b/src/directives/templates/mmsView.html @@ -0,0 +1,34 @@ +
    + +

    + {{view._veNumber}} + +

    + +

    + {{view._veNumber}} +

    + +
    + Last Modified: {{modified | date:'M/d/yy h:mm a'}} by {{ modifier.email }}{{ modifier }} +
    + + + +
    +
    + +
    + +
    +
    +
    +
    + +
    + +
    +
    +
    +
    \ No newline at end of file diff --git a/src/directives/templates/mmsViewPresentationElem.html b/src/directives/templates/mmsViewPresentationElem.html new file mode 100755 index 000000000..8ed913340 --- /dev/null +++ b/src/directives/templates/mmsViewPresentationElem.html @@ -0,0 +1,16 @@ +
    +
    + + + + + + + + + + + + + +
    \ No newline at end of file diff --git a/src/directives/templates/mmsViewReorder.html b/src/directives/templates/mmsViewReorder.html new file mode 100755 index 000000000..4f204a5dc --- /dev/null +++ b/src/directives/templates/mmsViewReorder.html @@ -0,0 +1,25 @@ + + +
    +

    Reorder contents

    +
    +
    View contents loading or unavailable +
    +
    Bold view contents are reorderable
    +
    +
      +
    1. +
    +
    +
    diff --git a/src/directives/templates/mmsViewSection.html b/src/directives/templates/mmsViewSection.html new file mode 100755 index 000000000..3afe58db1 --- /dev/null +++ b/src/directives/templates/mmsViewSection.html @@ -0,0 +1,23 @@ +
    +
    +

    {{section._veNumber}} {{section.name}}

    +

    {{section._veNumber}} {{edit.name}}

    +
    +
    +
    +

    +
    +

    +
    + +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    diff --git a/src/directives/templates/revertConfirm.html b/src/directives/templates/revertConfirm.html new file mode 100755 index 000000000..e482088ac --- /dev/null +++ b/src/directives/templates/revertConfirm.html @@ -0,0 +1,34 @@ + + + + + diff --git a/src/directives/templates/saveConflict.html b/src/directives/templates/saveConflict.html new file mode 100755 index 000000000..191b4cb8d --- /dev/null +++ b/src/directives/templates/saveConflict.html @@ -0,0 +1,16 @@ + + + diff --git a/src/errors/configError.html b/src/errors/configError.html deleted file mode 100644 index 24cb93aed..000000000 --- a/src/errors/configError.html +++ /dev/null @@ -1,15 +0,0 @@ - - - Configuration Error - - -

    Configuration Error

    -
    -

    There was a problem loading View Editor due to a configuration error, please contact your administrator.

    -

    Error:

    - - - \ No newline at end of file diff --git a/src/filters/underlineMatch.js b/src/filters/underlineMatch.js old mode 100644 new mode 100755 index 97255c318..7446c0d9e --- a/src/filters/underlineMatch.js +++ b/src/filters/underlineMatch.js @@ -1,9 +1,11 @@ -angular.module('ve-utils').filter('underlineMatch', ['$filter', partialMatch]) +'use strict'; + +angular.module('mms').filter('underlineMatch', ['$filter', partialMatch]); function partialMatch($filter) { - var uibTypeaheadHighlightFn = $filter('uibTypeaheadHighlight') - return function (match, query) { - var result = uibTypeaheadHighlightFn(match, query) - result = result.replace('', '').replace('', '') - return result + var uibTypeaheadHighlightFn = $filter('uibTypeaheadHighlight'); + return function(match, query) { + var result = uibTypeaheadHighlightFn(match, query); + result = result.replace('', '').replace('', ''); + return result; } } diff --git a/src/index.ejs b/src/index.ejs deleted file mode 100644 index b94cc7d83..000000000 --- a/src/index.ejs +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - - - - - - - -
    - - - - - - - - diff --git a/src/index.html b/src/index.html deleted file mode 100644 index e4c3245ee..000000000 --- a/src/index.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - View Editor - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/lib/angular-flatpickr/ngFlatpickr.main.ts b/src/lib/angular-flatpickr/ngFlatpickr.main.ts deleted file mode 100644 index 9dce981e6..000000000 --- a/src/lib/angular-flatpickr/ngFlatpickr.main.ts +++ /dev/null @@ -1 +0,0 @@ -import './ngFlatpickr.module' diff --git a/src/lib/angular-flatpickr/ngFlatpickr.module.ts b/src/lib/angular-flatpickr/ngFlatpickr.module.ts deleted file mode 100644 index 273e73fbe..000000000 --- a/src/lib/angular-flatpickr/ngFlatpickr.module.ts +++ /dev/null @@ -1,84 +0,0 @@ -import angular, { IComponentController } from 'angular'; -import flatpickr from 'flatpickr'; - -import { VeComponentOptions } from '@ve-types/angular'; - -export interface ngFlatpickrOptions extends flatpickr.Options.Options { - placeholder: string; -} - -export type ngFlatpickrCallback = (fpInstance: flatpickr.Instance) => void; - -const ngFlatpickrComponent: VeComponentOptions = { - selector: 'ngFlatpickr', - template: ` - - -
    -
    -`, - transclude: true, - bindings: { - fpOpts: '<', - fpOnSetup: '&', - }, - controller: class ngFlatpickrCtrl implements IComponentController { - static $inject = ['$element', '$timeout', '$scope']; - - //Bindings - private fpOpts: ngFlatpickrOptions; - private fpOnSetup: ngFlatpickrCallback; - - private inputDate: number; - - constructor(private $element: JQuery, private $timeout: angular.ITimeoutService) {} - - $onInit(): void { - this.fpOpts.placeholder = this.fpOpts.placeholder || 'Select Date..'; - } - - $postLink(): void { - this.grabElementAndRunFlatpickr(); - } - - $onChanges(): void { - this.grabElementAndRunFlatpickr(); - } - - grabElementAndRunFlatpickr = (): void => { - void this.$timeout( - () => { - const transcludeEl = this.$element.find('ng-transclude')[0]; - const element = transcludeEl.children[0]; - - this.setDatepicker(element); - }, - 0, - true - ); - }; - - setDatepicker = (element: Element): void => { - if (!flatpickr) { - return console.warn('Unable to find any flatpickr installation'); - } - - const fpInstance: flatpickr.Instance = flatpickr(element, this.fpOpts); - - if (this.fpOnSetup) { - this.fpOnSetup(fpInstance); - } - - // If has ngModel set the date - if (this.inputDate) { - fpInstance.setDate(this.inputDate); - } - - // destroy the flatpickr instance when the dom element is removed - angular.element(element).on('$destroy', () => { - fpInstance.destroy(); - }); - }; - }, -}; -angular.module('angular-flatpickr', []).component(ngFlatpickrComponent.selector, ngFlatpickrComponent); diff --git a/src/lib/angular-promise-extras/angular-promise-extras.d.ts b/src/lib/angular-promise-extras/angular-promise-extras.d.ts deleted file mode 100644 index e94b9231b..000000000 --- a/src/lib/angular-promise-extras/angular-promise-extras.d.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { VePromise } from '@ve-types/angular' - -declare module 'angular' { - type PromiseState = 'pending' | 'fulfilled' | 'rejected' - - interface PromiseValue { - state: PromiseState - value?: T | undefined - reason?: unknown - } - - // tslint:disable-next-line interface-name - interface IQService { - // tslint:disable:max-line-length - allSettled( - values: [ - T1 | VePromise, - T2 | VePromise, - T3 | VePromise, - T4 | VePromise, - T5 | VePromise, - T6 | VePromise, - T7 | VePromise, - T8 | VePromise, - T9 | VePromise, - T10 | VePromise - ] - ): VePromise< - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ], - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ] - > - allSettled( - values: [ - T1 | VePromise, - T2 | VePromise, - T3 | VePromise, - T4 | VePromise, - T5 | VePromise, - T6 | VePromise, - T7 | VePromise, - T8 | VePromise, - T9 | VePromise - ] - ): VePromise< - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ], - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ] - > - allSettled( - values: [ - T1 | VePromise, - T2 | VePromise, - T3 | VePromise, - T4 | VePromise, - T5 | VePromise, - T6 | VePromise, - T7 | VePromise, - T8 | VePromise - ] - ): VePromise< - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ], - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ] - > - allSettled( - values: [ - T1 | VePromise, - T2 | VePromise, - T3 | VePromise, - T4 | VePromise, - T5 | VePromise, - T6 | VePromise, - T7 | VePromise - ] - ): VePromise< - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ], - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ] - > - allSettled( - values: [ - T1 | VePromise, - T2 | VePromise, - T3 | VePromise, - T4 | VePromise, - T5 | VePromise, - T6 | VePromise - ] - ): VePromise< - [ - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue, - PromiseValue - ], - [PromiseValue, PromiseValue, PromiseValue, PromiseValue, PromiseValue, PromiseValue] - > - allSettled( - values: [ - T1 | VePromise, - T2 | VePromise, - T3 | VePromise, - T4 | VePromise, - T5 | VePromise - ] - ): VePromise< - [PromiseValue, PromiseValue, PromiseValue, PromiseValue, PromiseValue], - [PromiseValue, PromiseValue, PromiseValue, PromiseValue, PromiseValue] - > - allSettled( - values: [T1 | VePromise, T2 | VePromise, T3 | VePromise, T4 | VePromise] - ): VePromise< - [PromiseValue, PromiseValue, PromiseValue, PromiseValue], - [PromiseValue, PromiseValue, PromiseValue, PromiseValue] - > - allSettled( - values: [T1 | VePromise, T2 | VePromise, T3 | VePromise] - ): VePromise< - [PromiseValue, PromiseValue, PromiseValue], - [PromiseValue, PromiseValue, PromiseValue] - > - allSettled( - values: [T1 | VePromise, T2 | VePromise] - ): VePromise<[PromiseValue, PromiseValue], [PromiseValue, PromiseValue]> - // tslint:enable:max-line-length - - allSettled( - promises: Array> - ): VePromise>, Array>> - - allSettled(promises: { - [K in keyof T]: T[K] | VePromise - }): VePromise<{ [K in keyof T]: PromiseValue }> - - isFulfilledState(promise: PromiseValue): boolean - isRejectedState(promise: PromiseValue): boolean - } -} diff --git a/src/lib/angular-promise-extras/angular-promise-extras.js b/src/lib/angular-promise-extras/angular-promise-extras.js deleted file mode 100644 index 1fe2f2b67..000000000 --- a/src/lib/angular-promise-extras/angular-promise-extras.js +++ /dev/null @@ -1,118 +0,0 @@ -;(function (angular) { - 'use strict' - - /** - * Called with an array this acts like map, otherwise it acts like _.mapValues - * in lodash. - * @return {Array|Object} The same type as the input argument. - */ - var mapValues = function (obj, callback) { - if (Array.isArray(obj)) return obj.map(callback) - - var ret = {} - Object.keys(obj).forEach(function (key, val) { - ret[key] = callback(obj[key], key) - }) - return ret - } - - angular - .module('ngPromiseExtras', []) - .config([ - '$provide', - function ($provide) { - $provide.decorator('$q', [ - '$delegate', - function ($delegate) { - var $q = $delegate - - $q.allSettled = function (promises) { - return $q.all( - mapValues(promises, function (promiseOrValue) { - if (!promiseOrValue.then) - return { - state: 'pending', - value: promiseOrValue, - } - - return promiseOrValue.then( - function (value) { - return { - state: 'fulfilled', - value: value, - } - }, - function (reason) { - return { - state: 'rejected', - reason: reason, - } - } - ) - }) - ) - } - - $q.map = function (values, callback) { - return $q.all(mapValues(values, callback)) - } - - $q.mapSettled = function (values, callback) { - return $q.allSettled(mapValues(values, callback)) - } - - if (!$q.resolve) { - /** - * Like Bluebird.resolve (was introduced in angular 1.4). - */ - $q.resolve = function (value) { - if (value && value.then) return value - else - return $q(function (resolve) { - resolve(value) - }) - } - } - - return $q - }, - ]) - }, - ]) - .run([ - '$q', - '$window', - function ($q, $window) { - $window.Promise = function (executor) { - return $q(executor) - } - - $window.Promise.all = $q.all.bind($q) - $window.Promise.reject = $q.reject.bind($q) - $window.Promise.resolve = $q.when.bind($q) - $window.Promise.allSettled = $q.allSettled.bind($q) - - $window.Promise.race = function (promises) { - var promiseMgr = $q.defer() - - for (var i = 0; i < promises.length; i++) { - promises[i].then(function (result) { - if (promiseMgr) { - promiseMgr.resolve(result) - promiseMgr = null - } - }) - - promises[i].catch(function (result) { - if (promiseMgr) { - promiseMgr.reject(result) - promiseMgr = null - } - }) - } - - return promiseMgr.promise - } - }, - ]) -})(window.angular) diff --git a/src/lib/angular-ui-tree-filter/angular-ui-tree-filter.d.ts b/src/lib/angular-ui-tree-filter/angular-ui-tree-filter.d.ts deleted file mode 100644 index 0ecc1cf32..000000000 --- a/src/lib/angular-ui-tree-filter/angular-ui-tree-filter.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare namespace angular { - namespace uiTreeFilter { - interface IFilterUiTree { - (collection: T, pattern: string, address?: string): T - } - } -} diff --git a/src/lib/angular-ui-tree-filter/angular-ui-tree-filter.js b/src/lib/angular-ui-tree-filter/angular-ui-tree-filter.js deleted file mode 100644 index 92502337d..000000000 --- a/src/lib/angular-ui-tree-filter/angular-ui-tree-filter.js +++ /dev/null @@ -1,126 +0,0 @@ -import angular from 'angular' -;('use strict') - -angular - .module('ui.tree-filter', []) - /** - * @name ui.tree-filter.provider:uiTreeFilterSettings - */ - .provider('uiTreeFilterSettings', function () { - var uiTreeFilterSettings = this - - this.addresses = ['title'] - this.regexFlags = 'gi' - this.descendantCollection = 'items' - - this.$get = () => { - return { - addresses: uiTreeFilterSettings.addresses, - regexFlags: uiTreeFilterSettings.regexFlags, - descendantCollection: uiTreeFilterSettings.descendantCollection, - } - } - }) - /** - * @name ui.tree-filter.factory:uiTreeFilter - */ - .filter('uiTreeFilter', [ - 'uiTreeFilterSettings', - function (uiTreeFilterSettings) { - /** - * Iterates through given collection if flag is not true and sets a flag to true on first match. - * - * @param {Array} collection - * @param {string} pattern - * @param {string} address - * - * @returns {boolean} - */ - function visit(collection, pattern, address) { - collection = collection || [] - var foundSoFar = false - - collection.forEach((collectionItem) => { - foundSoFar = - foundSoFar || - testForField(collectionItem, pattern, address) - }) - - return foundSoFar - } - - /** - * Resolves object value from dot-delimited address. - * - * @param object - * @param path - * @returns {*} - */ - function resolveAddress(object, path) { - var parts = path.split('.') - - if (object === undefined) { - return - } - - return parts.length < 2 - ? object[parts[0]] - : resolveAddress(object[parts[0]], parts.slice(1).join('.')) - } - - /** - * Checks if object or its children matches a pattern on a given field - * - * First it resolves the property address and gets the value. - * If the value is a string it matches it against provided pattern. - * If item matches because its property matches it's children are not checked. - * Otherwise all item descendants are checked as well - * - * @param {Object} item - * @param {string} pattern - * @param {string} address property name or dot-delimited path to property. - * - * @returns {boolean} - */ - function testForField(item, pattern, address) { - var value = resolveAddress(item, address) - var found = - typeof value === 'string' - ? !!value.match( - new RegExp( - pattern, - uiTreeFilterSettings.regexFlags - ) - ) - : false - return ( - found || - visit( - item[uiTreeFilterSettings.descendantCollection], - pattern, - address - ) - ) - } - - /** - * Checks if pattern matches any of addresses - * - * @param {object} item - * @param {string} pattern - * - * @returns {boolean} - */ - return (item, pattern, addresses) => { - addresses = addresses || uiTreeFilterSettings.addresses - return ( - pattern === undefined || - addresses.reduce((foundSoFar, fieldName) => { - return ( - foundSoFar || testForField(item, pattern, fieldName) - ) - }, false) - ) - } - }, - ]) diff --git a/src/lib/ckeditor-plugins/autosave/plugin.js b/src/lib/ckeditor-plugins/autosave/plugin.js deleted file mode 100644 index d613ec795..000000000 --- a/src/lib/ckeditor-plugins/autosave/plugin.js +++ /dev/null @@ -1,606 +0,0 @@ -/** - * @license Copyright (c) CKSource - Frederico Knabben. All rights reserved. - * For licensing, see LICENSE.html or http://ckeditor.com/license - * - * This is a fork of CKEditor's autosave plugin. - * The fork repository is maintained at the following url: - * https://github.com/chhaymenghong/CKEditor-AutoSave-Plugin - */ -CKEDITOR.MmsAutosavePlugin = (function () { - if (!supportsLocalStorage()) { - CKEDITOR.plugins.add('autosave', {}) //register a dummy plugin to pass CKEditor plugin initialization process - return - } - - CKEDITOR.plugins.add('autosave', { - lang: 'ca,cs,de,en,es,fr,it,ja,nl,pl,pt-br,ru,sk,sv,zh,zh-cn', // %REMOVE_LINE_CORE% - requires: 'notification', - version: '0.18.0', - init: (editor) => { - if (!editor.config.autosave.enableAutosave) { - return - } - - // Look for autosave from config.js - this is a bit redundant but necessary - editor.config.autosave = 'autosave' in editor.config ? editor.config.autosave : {} - - // Prepare temp vars for constructing local storage SaveKey name - var _saveKeyPrefix = - 'saveKeyPrefix' in editor.config.autosave ? editor.config.autosave.saveKeyPrefix : 'autosave', - _saveKeyIgnoreProto = - 'saveKeyIgnoreProtocol' in editor.config.autosave - ? editor.config.autosave.saveKeyIgnoreProtocol - : false, - _saveKeyUrl = _saveKeyIgnoreProto - ? window.location.href.replace(/https?:\/\//, '') - : window.location.href, - _saveKeyDelimiter = - 'saveKeyDelimiter' in editor.config.autosave ? editor.config.autosave.saveKeyDelimiter : '_', - _saveKeyAttribute = - 'saveKeyAttribute' in editor.config.autosave ? editor.config.autosave.saveKeyAttribute : 'name' - - if ('saveKeyIgnoreParams' in editor.config.autosave) { - $(editor.config.autosave.saveKeyIgnoreParams).each(function () { - _saveKeyUrl = autosaveRemoveUrlParam(this, null, _saveKeyUrl) - }) - } - - // Construct default configuration - var defaultConfig = { - delay: 10, - messageType: 'notification', - saveDetectionSelectors: "a[href^='javascript:__doPostBack'][id*='Save'],a[id*='Cancel']", - saveOnDestroy: false, - NotOlderThen: 1440, - SaveKey: - _saveKeyPrefix + - _saveKeyDelimiter + - _saveKeyUrl + - _saveKeyDelimiter + - $(document.getElementById('#' + editor.name)).attr(_saveKeyAttribute), - diffType: 'sideBySide', - autoLoad: false, - } - - // Extend CKEDITOR config and lang - config also available at loadPlugin() - var config = CKEDITOR.tools.extend(defaultConfig, editor.config.autosave || {}, true) - - if (editor.plugins.wordcount && config.messageType == 'statusbar') { - config.messageType = 'notification' - } - - CKEDITOR.document.appendStyleSheet( - CKEDITOR.getUrl(CKEDITOR.plugins.getPath('autosave') + 'css/autosave.min.css') - ) - - editor.on( - 'uiSpace', - function (event) { - if ( - event.data.space == 'bottom' && - config.messageType != null && - config.messageType == 'statusbar' - ) { - event.data.html += - '
    ' - } - }, - editor, - null, - 100 - ) - - editor.on( - 'instanceReady', - function () { - if (typeof jQuery === 'undefined') { - CKEDITOR.scriptLoader.load( - '//ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js', - function () { - jQuery.noConflict() - - loadPlugin(editor, config) - } - ) - } else { - CKEDITOR.scriptLoader.load( - CKEDITOR.getUrl(CKEDITOR.plugins.getPath('autosave') + 'js/extensions.min.js'), - function () { - loadPlugin(editor, config) - } - ) - } - }, - editor, - null, - 100 - ) - }, - }) - - function loadPlugin(editorInstance, config) { - CKEDITOR.scriptLoader.load( - CKEDITOR.getUrl(CKEDITOR.plugins.getPath('autosave') + 'js/extensions.min.js'), - function () { - GenerateAutoSaveDialog(editorInstance, config, config.SaveKey) - - CheckForAutoSavedContent(editorInstance, config, config.SaveKey, config.NotOlderThen) - } - ) - - jQuery(config.saveDetectionSelectors).click(function () { - RemoveStorage(config.SaveKey, editorInstance) - }) - - editorInstance.on('change', function () { - startTimer(config, editorInstance) - }) - - editorInstance.on('destroy', function () { - if (config.saveOnDestroy) { - SaveData(config.SaveKey, editorInstance, config) - } - }) - } - - function autoSaveMessageId(editorInstance) { - return 'cke_autoSaveMessage_' + editorInstance.name - } - - const startTimer = (configAutosave, editorInstance) => { - if (editorInstance.config.autosave_timeOutId == null) { - var delay = configAutosave.delay != null ? configAutosave.delay : 10 - editorInstance.config.autosave_timeOutId = setTimeout(function () { - onTimer(configAutosave, editorInstance) - }, delay * 1000) - } - } - const onTimer = (configAutosave, editorInstance) => { - if (editorInstance.checkDirty() || editorInstance.plugins.bbcode) { - var editor = editorInstance, - autoSaveKey = - configAutosave.SaveKey != null - ? configAutosave.SaveKey - : 'autosave_' + - window.location + - '_' + - $(document.getElementById('#' + editor.name)).attr('name') - - SaveData(autoSaveKey, editor, configAutosave) - - clearTimeout(editorInstance.config.autosave_timeOutId) - - editorInstance.config.autosave_timeOutId = null - } - } - - // localStorage detection - function supportsLocalStorage() { - if (typeof Storage === 'undefined') { - return false - } - - try { - localStorage.getItem('___test_key') - return true - } catch (e) { - return false - } - } - - function GenerateAutoSaveDialog(editorInstance, config, autoSaveKey) { - CKEDITOR.dialog.add('autosaveDialog', function () { - return { - title: editorInstance.lang.autosave.title, - minHeight: 155, - height: 300, - width: 800, - onShow: function () { - RenderDiff(this, editorInstance, autoSaveKey) - }, - onOk: function () { - if (localStorage.getItem(autoSaveKey)) { - var jsonSavedContent = LoadData(autoSaveKey) - editorInstance.setData(jsonSavedContent.data) - - RemoveStorage(autoSaveKey, editorInstance) - } - }, - onCancel: function () { - RemoveStorage(autoSaveKey, editorInstance) - }, - contents: [ - { - label: '', - id: 'general', - elements: [ - { - type: 'radio', - id: 'diffType', - label: editorInstance.lang.autosave.diffType, - items: [ - [editorInstance.lang.autosave.sideBySide, 'sideBySide'], - [editorInstance.lang.autosave.inline, 'inline'], - ], - default: config.diffType, - onClick: function () { - RenderDiff(this._.dialog, editorInstance, autoSaveKey) - }, - }, - { - type: 'html', - id: 'diffContent', - html: '', - }, - ], - }, - ], - buttons: [ - { - id: 'ok', - type: 'button', - label: editorInstance.lang.autosave.ok, - class: 'cke_dialog_ui_button_ok cke_dialog_autosave_ok', - onClick: function (evt) { - var dialog = evt.data.dialog - if (dialog.fire('ok', { hide: true }).hide !== false) dialog.hide() - }, - }, - { - id: 'cancel', - type: 'button', - label: editorInstance.lang.autosave.no, - class: 'cke_dialog_ui_button_cancel', - onClick: function (evt) { - var dialog = evt.data.dialog - if (dialog.fire('cancel', { hide: true }).hide !== false) dialog.hide() - }, - }, - ], - } - }) - } - - function CheckForAutoSavedContent(editorInstance, config, autoSaveKey, notOlderThen) { - // Checks If there is data available and load it - if (localStorage.getItem(autoSaveKey)) { - var jsonSavedContent = LoadData(autoSaveKey) - - var autoSavedContent = jsonSavedContent.data - var autoSavedContentDate = jsonSavedContent.saveTime - - var editorLoadedContent = editorInstance.getData() - - // check if the loaded editor content is the same as the autosaved content - if (editorLoadedContent === autoSavedContent) { - localStorage.removeItem(autoSaveKey) - return - } - - // Ignore if autosaved content is older then x minutes - if (moment(new Date()).diff(new Date(autoSavedContentDate), 'minutes') > notOlderThen) { - RemoveStorage(autoSaveKey, editorInstance) - - return - } - - if (config.autoLoad) { - if (localStorage.getItem(autoSaveKey)) { - editorInstance.setData(autoSavedContent) - RemoveStorage(autoSaveKey, editorInstance) - } - } else { - var confirmMessage = editorInstance.lang.autosave.loadSavedContent.replace( - '{0}', - moment(autoSavedContentDate) - .locale(editorInstance.config.language) - .format(editorInstance.lang.autosave.dateFormat) - ) - - _handleAutosaveConfirmationDialog(confirmMessage, editorInstance, autoSaveKey) - } - } - } - - function _handleAutosaveConfirmationDialog(confirmMessage, editorInstance, autoSaveKey) { - var autosaveModalId = 'autosaveModal' - var autosaveMessageId = 'autosaveMessage' - var autosaveModal = $('#' + autosaveModalId) - if (autosaveModal.length) { - autosaveModal.find('#' + autosaveMessageId).html(confirmMessage) - } else { - var dialogDom = _createDialogDom(confirmMessage, autosaveModalId, autosaveMessageId) - dialogDom.appendTo('body') - autosaveModal = $('#' + autosaveModalId) - } - - $('#autosave-confirm') - .unbind('click') - .click(function () { - autosaveModal.css('display', 'none') - var dialog = editorInstance.openDialog('autosaveDialog') - var dialogDom = dialog.getElement()['$'] - var contentDom = $(dialogDom).children(':first') - contentDom.addClass('autosave') - }) - $('#autosave-cancel') - .unbind('click') - .click(function () { - RemoveStorage(autoSaveKey, editorInstance) - autosaveModal.css('display', 'none') - }) - autosaveModal.css('display', 'block') - } - - function _createDialogDom(message, autosaveModalId, autosaveMessageId) { - var dialogHtml = - '' - var dialogDom = $(dialogHtml) - dialogDom.find('#' + autosaveMessageId).html(message) - return dialogDom - } - - function LoadData(autoSaveKey) { - var compressedJSON = LZString.decompressFromUTF16(localStorage.getItem(autoSaveKey)) - return JSON.parse(compressedJSON) - } - - function SaveData(autoSaveKey, editorInstance, config) { - var compressedJSON = LZString.compressToUTF16( - JSON.stringify({ - data: editorInstance.getData(), - saveTime: new Date(), - isAutosaveContent: true, - }) - ) - - var quotaExceeded = _trySavingContentToLocalStorage( - localStorage, - moment, - LZString, - config.NotOlderThen, - autoSaveKey, - compressedJSON - ) - /* - if (quotaExceeded) { - console.log(editorInstance.lang.autosave.localStorageFull); - var notificationError = new CKEDITOR.plugins.notification(editorInstance, { message: editorInstance.lang.autosave.localStorageFull, type: 'warning', duration:5000 }); - notificationError.show(); - _changeAutosavePopupStyle(editorInstance, notificationError); - } else { - var messageType = config.messageType != null ? config.messageType : "notification"; - - if (editorInstance.plugins.wordcount && messageType == "statusbar") { - messageType = "notification"; - } - - if (messageType == "statusbar") { - var autoSaveMessage = document.getElementById(autoSaveMessageId(editorInstance)); - - if (autoSaveMessage) { - autoSaveMessage.className = "show"; - - setTimeout(() => { - autoSaveMessage.className = "hidden"; - }, 2000); - } - } else if (messageType == "notification") { - var notification = new CKEDITOR.plugins.notification(editorInstance, { message: editorInstance.lang.autosave.autoSaveMessage, type: 'success', duration:5000 }); - notification.show(); - _changeAutosavePopupStyle(editorInstance, notification); - } - } - */ - } - - function _changeAutosavePopupStyle(editorInstance, notification) { - // Allow changing style for "autosave" popup - var editorElement = $(editorInstance.container['$']) - editorElement.css('position', 'relative') - var autosavePopupElement = $('#' + notification.id) - autosavePopupElement.appendTo(editorElement) - autosavePopupElement.css({ - position: 'absolute', - }) - autosavePopupElement.css({ - left: editorElement.outerWidth(true) - autosavePopupElement.outerWidth(true), - top: editorElement.outerHeight(true) - autosavePopupElement.outerHeight(true), - }) - } - - function RemoveStorage(autoSaveKey, editor) { - if (editor.config.autosave_timeOutId) { - clearTimeout(editor.config.autosave_timeOutId) - } - - localStorage.removeItem(autoSaveKey) - } - - function RenderDiff(dialog, editorInstance, autoSaveKey) { - var jsonSavedContent = LoadData(autoSaveKey) - - var base = difflib.stringAsLines(editorInstance.getData()) - var newtxt = difflib.stringAsLines(jsonSavedContent.data) - var sm = new difflib.SequenceMatcher(base, newtxt) - var opcodes = sm.get_opcodes() - - dialog - .getContentElement('general', 'diffContent') - .getElement() - .setHtml( - '
    ' + - diffview.buildView({ - baseTextLines: base, - newTextLines: newtxt, - opcodes: opcodes, - baseTextName: editorInstance.lang.autosave.loadedContent, - newTextName: - editorInstance.lang.autosave.autoSavedContent + - moment(jsonSavedContent.saveTime) - .locale(editorInstance.config.language) - .format(editorInstance.lang.autosave.dateFormat) + - "'", - contextSize: 3, - viewType: dialog.getContentElement('general', 'diffType').getValue() == 'inline' ? 1 : 0, - }).outerHTML + - '
    ' - ) - } - - function isQuotaExceeded(e) { - var quotaExceeded = false - if (e) { - if (e.code) { - switch (e.code) { - case 22: - quotaExceeded = true - break - case 1014: - // Firefox - if (e.name === 'NS_ERROR_DOM_QUOTA_REACHED') { - quotaExceeded = true - } - break - } - } else if (e.number === -2147024882) { - // Internet Explorer 8 - quotaExceeded = true - } - } - return quotaExceeded - } - // Querystring mitigator - Quick and dirty paste. - // I don't know who original author is for creds. - // https://stackoverflow.com/a/11654436/2418655 - function autosaveRemoveUrlParam(key, value, url) { - if (!url) url = window.location.href - var re = new RegExp('([?&])' + key + '=.*?(&|#|$)(.*)', 'gi'), - hash - - if (re.test(url)) { - if (typeof value !== 'undefined' && value !== null) { - return url.replace(re, '$1' + key + '=' + value + '$2$3') - } else { - hash = url.split('#') - url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '') - if (typeof hash[1] !== 'undefined' && hash[1] !== null) { - url += '#' + hash[1] - } - return url - } - } else { - if (typeof value !== 'undefined' && value !== null) { - var separator = url.indexOf('?') !== -1 ? '&' : '?' - hash = url.split('#') - url = hash[0] + separator + key + '=' + value - if (typeof hash[1] !== 'undefined' && hash[1] !== null) { - url += '#' + hash[1] - } - return url - } else { - return url - } - } - } - - function _jsonParse(contentToParse) { - try { - var parseValue = JSON.parse(contentToParse.value) - if (typeof parseValue === 'object' && parseValue !== null) { - return { key: contentToParse.key, value: parseValue } - } - } catch (e) {} - return {} - } - - function _removeAllExpiredAutosave(localStorage, listOfExpiredAutosave) { - listOfExpiredAutosave.forEach(function (expiredAutosave) { - localStorage.removeItem(expiredAutosave.key) - }) - } - - function _getAllExpiredAutosave(listOfAutosave, minutesTillExpired, currentDate, moment) { - return listOfAutosave.filter(function (autosave) { - return moment(currentDate).diff(new Date(autosave.value.saveTime), 'minutes') > minutesTillExpired - }) - } - - function _getAllAutosave(localStorage, LZString) { - return Object.keys(localStorage) - .map(function (autosaveKey) { - return { - key: autosaveKey, - value: LZString.decompressFromUTF16(localStorage.getItem(autosaveKey)), - } - }) - .map(_jsonParse) - .filter(function (jsonObj) { - return jsonObj.value && jsonObj.value.isAutosaveContent - }) - } - - function _clearExpiredLocalStorageContents(localStorage, moment, LZString, minutesTillExpired) { - var listOfAutosave = _getAllAutosave(localStorage, LZString) - var listOfExpiredAutosave = _getAllExpiredAutosave(listOfAutosave, minutesTillExpired, new Date(), moment) - _removeAllExpiredAutosave(localStorage, listOfExpiredAutosave) - } - - function _trySavingContentToLocalStorage( - localStorage, - moment, - LZString, - minutesTillExpired, - autosaveKey, - compressedJSON - ) { - var quotaExceeded = false - try { - localStorage.setItem(autosaveKey, compressedJSON) - } catch (e) { - if (isQuotaExceeded(e)) { - // need to use "customHelpers" at the front. If not, jasmine's spy wont work on this function - // since it will be "_clearExpiredLocalStorageContents" in this local scope and not "_clearExpiredLocalStorageContents" - // on "customHelpers" object where the spy is set - customHelpers._clearExpiredLocalStorageContents(localStorage, moment, LZString, minutesTillExpired) - try { - localStorage.setItem(autosaveKey, compressedJSON) - } catch (e) { - quotaExceeded = true - } - } - } - return quotaExceeded - } - - var customHelpers = { - _jsonParse: _jsonParse, - _removeExpiredAutosave: _removeAllExpiredAutosave, - _getAllExpiredAutosave: _getAllExpiredAutosave, - _getAllAutosave: _getAllAutosave, - _clearExpiredLocalStorageContents: _clearExpiredLocalStorageContents, - _trySavingContentToLocalStorage: _trySavingContentToLocalStorage, - } - return customHelpers -})() diff --git a/src/lib/ckeditor-plugins/mathjax/plugin.js b/src/lib/ckeditor-plugins/mathjax/plugin.js deleted file mode 100644 index 09d596b3c..000000000 --- a/src/lib/ckeditor-plugins/mathjax/plugin.js +++ /dev/null @@ -1,497 +0,0 @@ -/** - * @license Copyright (c) 2003-2023, CKSource Holding sp. z o.o. All rights reserved. - * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license - */ - -/** - * @fileOverview The [Mathematical Formulas](https://ckeditor.com/cke4/addon/mathjax) plugin that allows you to create and modify mathematical equations written in TeX directly in CKEditor.. - */ - -'use strict' -;(function () { - CKEDITOR.plugins.add('mathjax', { - // jscs:disable maximumLineLength - lang: 'af,ar,az,bg,ca,cs,cy,da,de,de-ch,el,en,en-au,en-gb,eo,es,es-mx,et,eu,fa,fi,fr,gl,he,hr,hu,id,it,ja,km,ko,ku,lt,lv,nb,nl,no,oc,pl,pt,pt-br,ro,ru,sk,sl,sq,sr,sr-latn,sv,tr,tt,ug,uk,vi,zh,zh-cn', // %REMOVE_LINE_CORE% - // jscs:enable maximumLineLength - requires: 'widget,dialog', - icons: 'mathjax', - hidpi: true, // %REMOVE_LINE_CORE% - - isSupportedEnvironment: function () { - return !CKEDITOR.env.ie || CKEDITOR.env.version > 8 - }, - - init: function (editor) { - var cls = editor.config.mathJaxClass || 'math-tex' - - if (!editor.config.mathJaxLib) { - CKEDITOR.error('mathjax-no-config') - } - - editor.widgets.add('mathjax', { - inline: true, - dialog: 'mathjax', - button: editor.lang.mathjax.button, - mask: true, - allowedContent: 'span(!' + cls + ')', - // Allow style classes only on spans having mathjax class. - styleToAllowedContentRules: function (style) { - var classes = style.getClassesArray() - if (!classes) return null - classes.push('!' + cls) - - return 'span(' + classes.join(',') + ')' - }, - pathName: editor.lang.mathjax.pathName, - - template: '', - - parts: { - span: 'span', - }, - - defaults: { - math: '\\(x = {-b \\pm \\sqrt{b^2-4ac} \\over 2a}\\)', - }, - - init: function () { - var iframe = this.parts.span.getChild(0) - - // Check if span contains iframe and create it otherwise. - if (!iframe || iframe.type != CKEDITOR.NODE_ELEMENT || !iframe.is('iframe')) { - iframe = new CKEDITOR.dom.element('iframe') - iframe.setAttributes({ - style: 'border:0;width:0;height:0', - scrolling: 'no', - frameborder: 0, - allowTransparency: true, - src: CKEDITOR.plugins.mathjax.fixSrc, - }) - this.parts.span.append(iframe) - } - - // Wait for ready because on some browsers iFrame will not - // have document element until it is put into document. - // This is a problem when you crate widget using dialog. - this.once('ready', function () { - // Src attribute must be recreated to fix custom domain error after undo - // (see iFrame.removeAttribute( 'src' ) in frameWrapper.load). - if (CKEDITOR.env.ie) iframe.setAttribute('src', CKEDITOR.plugins.mathjax.fixSrc) - - this.frameWrapper = new CKEDITOR.plugins.mathjax.frameWrapper(iframe, editor) - this.frameWrapper.setValue(this.data.math) - }) - }, - - data: function () { - if (this.frameWrapper) this.frameWrapper.setValue(this.data.math) - }, - - upcast: function (el, data) { - if (!(el.name == 'span' && el.hasClass(cls))) return - - if (el.children.length > 1 || el.children[0].type != CKEDITOR.NODE_TEXT) return - - data.math = CKEDITOR.tools.htmlDecode(el.children[0].value) - - // Add style display:inline-block to have proper height of widget wrapper and mask. - var attrs = el.attributes - - if (attrs.style) attrs.style += ';display:inline-block' - else attrs.style = 'display:inline-block' - - // Add attribute to prevent deleting empty span in data processing. - attrs['data-cke-survive'] = 1 - - el.children[0].remove() - - return el - }, - - downcast: function (el) { - el.children[0].replaceWith(new CKEDITOR.htmlParser.text(CKEDITOR.tools.htmlEncode(this.data.math))) - - // Remove style display:inline-block. - var attrs = el.attributes - attrs.style = attrs.style.replace(/display:\s?inline-block;?\s?/, '') - if (attrs.style === '') delete attrs.style - - return el - }, - }) - - // Add dialog. - CKEDITOR.dialog.add('mathjax', this.path + 'dialogs/mathjax.js') - - // Add MathJax script to page preview. - editor.on('contentPreview', function (evt) { - evt.data.dataValue = evt.data.dataValue.replace( - /<\/head>/, - '' - ) - }) - - editor.on('paste', function (evt) { - // Firefox does remove iFrame elements from pasted content so this event do the same on other browsers. - // Also iFrame in paste content is reason of "Unspecified error" in IE9 (https://dev.ckeditor.com/ticket/10857). - var regex = new RegExp(']*?' + cls + '.*?', 'ig') - evt.data.dataValue = evt.data.dataValue.replace(regex, function (match) { - return match.replace(/()/i, '') - }) - }) - }, - }) - - /** - * @private - * @singleton - * @class CKEDITOR.plugins.mathjax - */ - CKEDITOR.plugins.mathjax = {} - - /** - * A variable to fix problems with `iframe`. This variable is global - * because it is used in both the widget and the dialog window. - * - * @private - * @property {String} fixSrc - */ - CKEDITOR.plugins.mathjax.fixSrc = - // In Firefox src must exist and be different than about:blank to emit load event. - CKEDITOR.env.gecko - ? 'javascript:true' // jshint ignore:line - : // Support for custom document.domain in IE. - CKEDITOR.env.ie - ? 'javascript:' + // jshint ignore:line - 'void((function(){' + - encodeURIComponent('document.open();' + '(' + CKEDITOR.tools.fixDomain + ')();' + 'document.close();') + - '})())' - : // In Chrome src must be undefined to emit load event. - 'javascript:void(0)' // jshint ignore:line - - /** - * Loading indicator image generated by http://preloaders.net. - * - * @private - * @property {String} loadingIcon - */ - CKEDITOR.plugins.mathjax.loadingIcon = CKEDITOR.plugins.get('mathjax').path + 'images/loader.gif' - - /** - * Computes predefined styles and copies them to another element. - * - * @private - * @param {CKEDITOR.dom.element} from Copy source. - * @param {CKEDITOR.dom.element} to Copy target. - */ - CKEDITOR.plugins.mathjax.copyStyles = function (from, to) { - var stylesToCopy = ['color', 'font-family', 'font-style', 'font-weight', 'font-variant', 'font-size'] - - for (var i = 0; i < stylesToCopy.length; i++) { - var key = stylesToCopy[i], - val = from.getComputedStyle(key) - if (val) to.setStyle(key, val) - } - } - - /** - * Trims MathJax value from '\(1+1=2\)' to '1+1=2'. - * - * @private - * @param {String} value String to trim. - * @returns {String} Trimed string. - */ - CKEDITOR.plugins.mathjax.trim = function (value) { - var begin = value.indexOf('\\(') + 2, - end = value.lastIndexOf('\\)') - - return value.substring(begin, end) - } - - /** - * FrameWrapper is responsible for communication between the MathJax library - * and the `iframe` element that is used for rendering mathematical formulas - * inside the editor. - * It lets you create visual mathematics by using the - * {@link CKEDITOR.plugins.mathjax.frameWrapper#setValue setValue} method. - * - * @private - * @class CKEDITOR.plugins.mathjax.frameWrapper - * @constructor Creates a class instance. - * @param {CKEDITOR.dom.element} iFrame The `iframe` element to be wrapped. - * @param {CKEDITOR.editor} editor The editor instance. - */ - if (!(CKEDITOR.env.ie && CKEDITOR.env.version === 8)) { - CKEDITOR.plugins.mathjax.frameWrapper = function (iFrame, editor) { - var buffer, - preview, - value, - newValue, - doc = iFrame.getFrameDocument(), - // Is MathJax loaded and ready to work. - isInit = false, - // Is MathJax parsing Tex. - isRunning = false, - // Function called when MathJax is loaded. - loadedHandler = CKEDITOR.tools.addFunction(function () { - preview = doc.getById('preview') - buffer = doc.getById('buffer') - isInit = true - - if (newValue) update() - - // Private! For test usage only. - CKEDITOR.fire('mathJaxLoaded', iFrame) - }), - // Function called when MathJax finish his job. - updateDoneHandler = CKEDITOR.tools.addFunction(function () { - CKEDITOR.plugins.mathjax.copyStyles(iFrame, preview) - - preview.setHtml(buffer.getHtml()) - - editor.fire('lockSnapshot') - - iFrame.setStyles({ - height: 0, - width: 0, - }) - - // Set iFrame dimensions. - var height = Math.max(doc.$.body.offsetHeight, doc.$.documentElement.offsetHeight), - width = Math.max(preview.$.offsetWidth, doc.$.body.scrollWidth) - - iFrame.setStyles({ - height: height + 'px', - width: width + 'px', - }) - - editor.fire('unlockSnapshot') - - // Private! For test usage only. - CKEDITOR.fire('mathJaxUpdateDone', iFrame) - - // If value changed in the meantime update it again. - if (value != newValue) update() - else isRunning = false - }) - // Function called to run MathJax on update and star - - iFrame.on('load', load) - - load() - - function load() { - doc = iFrame.getFrameDocument() - - if (doc.getById('preview')) return - - // Because of IE9 bug in a src attribute can not be javascript - // when you undo (https://dev.ckeditor.com/ticket/10930). If you have iFrame with javascript in src - // and call insertBefore on such element then IE9 will see crash. - if (CKEDITOR.env.ie) iFrame.removeAttribute('src') - - doc.write( - ` - - - - - - - - - - - ` - ) - } - - // Run MathJax parsing Tex. - function update() { - isRunning = true - - value = newValue - - editor.fire('lockSnapshot') - - buffer.setHtml(value) - - // Set loading indicator. - preview.setHtml( - ' + editor.lang.mathjax.loading + ' - ) - - iFrame.setStyles({ - height: '16px', - width: '16px', - display: 'inline', - 'vertical-align': 'middle', - }) - - editor.fire('unlockSnapshot') - - // Run MathJax. - doc.getWindow().$.update(value) - } - - return { - /** - * Sets the TeX value to be displayed in the `iframe` element inside - * the editor. This function will activate the MathJax - * library which interprets TeX expressions and converts them into - * their representation that is displayed in the editor. - * - * @param {String} value TeX string. - */ - setValue: function (value) { - newValue = CKEDITOR.tools.htmlEncode(value) - - if (isInit && !isRunning) update() - }, - } - } - } else { - // In IE8 MathJax does not work stable so instead of using standard - // frame wrapper it is replaced by placeholder to show pure TeX in iframe. - CKEDITOR.plugins.mathjax.frameWrapper = function (iFrame, editor) { - iFrame - .getFrameDocument() - .write( - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' + - '' - ) - - return { - setValue: function (value) { - var doc = iFrame.getFrameDocument(), - tex = doc.getById('tex') - - tex.setHtml(CKEDITOR.plugins.mathjax.trim(CKEDITOR.tools.htmlEncode(value))) - - CKEDITOR.plugins.mathjax.copyStyles(iFrame, tex) - - editor.fire('lockSnapshot') - - iFrame.setStyles({ - width: Math.min(250, tex.$.offsetWidth) + 'px', - height: doc.$.body.offsetHeight + 'px', - display: 'inline', - 'vertical-align': 'middle', - }) - - editor.fire('unlockSnapshot') - }, - } - } - } -})() - -/** - * Sets the path to the MathJax library. It can be both a local resource and a location different than the default CDN. - * - * Please note that this must be a full or absolute path. - * - * Read more in the {@glink features/mathjax documentation} - * and see the {@glink examples/mathjax example}. - * - * config.mathJaxLib = '//cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.4/MathJax.js?config=TeX-AMS_HTML'; - * - * **Note:** Since CKEditor 4.5.0 this option does not have a default value, so it must - * be set in order to enable the MathJax plugin. - * - * @since 4.3.0 - * @cfg {String} mathJaxLib - * @member CKEDITOR.config - */ - -/** - * Sets the default class for `span` elements that will be - * converted into [Mathematical Formulas](https://ckeditor.com/cke4/addon/mathjax) - * widgets. - * - * If you set it to the following: - * - * config.mathJaxClass = 'my-math'; - * - * The code below will be recognized as a Mathematical Formulas widget. - * - * \( \sqrt{4} = 2 \) - * - * Read more in the {@glink features/mathjax documentation} - * and see the {@glink examples/mathjax example}. - * - * @cfg {String} [mathJaxClass='math-tex'] - * @member CKEDITOR.config - */ diff --git a/src/lib/ckeditor-plugins/mmscf/plugin.js b/src/lib/ckeditor-plugins/mmscf/plugin.js deleted file mode 100644 index 5bdc07577..000000000 --- a/src/lib/ckeditor-plugins/mmscf/plugin.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Plugin for inserting cross-reference elements into the CKEditor editing area. - */ - -// Register the plugin within the editor. -CKEDITOR.plugins.add('mmscf', { - requires: 'widget', - // Register the icons. - icons: 'mmscf', - - init: (editor) => { - // Register mmscf widget to opens CF search window and insert mmscf tag as widget. - editor.widgets.add('mmscf', { - button: 'Insert Cross Reference', - - allowedContent: 'mms-cf[*];', - inline: true, - insert: () => { - var defaultConfig = { - callbackModalFnc: () => { - console.log('There is no callback function defined') - }, - } - var config = CKEDITOR.tools.extend(defaultConfig, editor.config.mmscf || {}, true) - var tag = config.callbackModalFnc(editor, false) - }, - // Check the elements that need to be converted to widgets. - upcast: (element) => { - // Return "true" (that element needs to converted to a mmscf widget) - // for all elements. - return element.name === 'mms-cf' && element.attributes['mms-cf-type'] !== 'com' - }, - }) - }, -}) diff --git a/src/lib/ckeditor-plugins/mmscomment/plugin.js b/src/lib/ckeditor-plugins/mmscomment/plugin.js deleted file mode 100644 index 253e8cac3..000000000 --- a/src/lib/ckeditor-plugins/mmscomment/plugin.js +++ /dev/null @@ -1,38 +0,0 @@ -/** - * Plugin for inserting Comment elements into the CKEditor editing area. - */ - -// Register the plugin within the editor. -CKEDITOR.plugins.add('mmscomment', { - requires: 'widget', - // Register the icons. - icons: 'mmscomment', - - init: (editor) => { - // Register mmscomment widget to opens CF search window and insert mmscomment tag as widget. - editor.widgets.add('mmscomment', { - button: 'Insert Comment', - inline: true, - allowedContent: 'mms-cf[*];mms-transclude-com[*];transclude-com[*]', - insert: () => { - var defaultConfig = { - callbackModalFnc: () => { - console.log('There is no callback function defined') - }, - } - var config = CKEDITOR.tools.extend(defaultConfig, editor.config.mmscomment || {}, true) - var tag = config.callbackModalFnc(editor) - }, - // Check the elements that need to be converted to widgets. - upcast: (element) => { - // Return "true" (that element needs to converted to a mmscomment widget) - // for all elements. - return ( - element.name === 'transclude-com' || - element.name === 'mms-transclude-com' || - (element.name === 'mms-cf' && element.attributes['mms-cf-type'] === 'com') - ) - }, - }) - }, -}) diff --git a/src/lib/ckeditor-plugins/mmsdropdown/plugin.js b/src/lib/ckeditor-plugins/mmsdropdown/plugin.js deleted file mode 100644 index b4e3291df..000000000 --- a/src/lib/ckeditor-plugins/mmsdropdown/plugin.js +++ /dev/null @@ -1,239 +0,0 @@ -CKEDITOR.plugins.add('mmsdropdown', { - requires: ['richcombo'], - init: (editor) => { - var config = editor.config, - lang = editor.lang.format - function createItem(options) { - return options.isMmsCustomPlugin - ? ' ' + - options.label + - ' ' - : ' ' + - options.label + - ' ' - } - editor.ui.addRichCombo('mmsExtraFeature', { - title: 'Insert more content', - className: 'mmsExtraFeature', - multiSelect: false, - panel: { - css: [CKEDITOR.skin.getPath('editor')].concat( - config.contentsCss - ), - }, - - init: () => { - this.add( - 'mmscf', - createItem({ - isMmsCustomPlugin: true, - imgSrc: - window.CKEDITOR_BASEPATH + - 'plugins/mmscf/icons/mmscf.png', - label: 'Cross Reference', - }), - 'Insert Cross Reference' - ) - this.add( - 'mmsvlink', - createItem({ - isMmsCustomPlugin: true, - imgSrc: - window.CKEDITOR_BASEPATH + - 'plugins/mmsvlink/icons/mmsvlink.png', - label: 'Cross Reference as link', - }), - 'Insert Cross Reference as link (View Link)' - ) - this.add('', '
    ', 'mms-br') - - this.add( - 'link', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'link', - label: 'Link', - }), - 'Insert link' - ) - this.add( - 'table', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'table', - label: 'Table', - }), - 'Insert table' - ) - this.add( - 'image', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'image', - label: 'Image', - }), - 'Insert image' - ) - this.add( - 'iframe', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'iframe', - label: 'Iframe', - }), - 'Insert iframe' - ) - this.add( - 'mathjax', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'mathjax', - label: 'Math', - }), - 'Insert math' - ) - this.add( - 'specialchar', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'specialchar', - label: 'Special Character', - }), - 'Insert symbol' - ) - this.add('', '
    ', 'mms-br') - - this.add( - 'mmscomment', - createItem({ - isMmsCustomPlugin: true, - imgSrc: - window.CKEDITOR_BASEPATH + - 'plugins/mmscomment/icons/mmscomment.png', - label: 'Comment', - }), - 'Insert comment' - ) - this.add('', '
    ', 'mms-br') - - this.add( - 'codeSnippet', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'codesnippet', - label: 'Code Snippet', - }), - 'Insert code snippet' - ) - this.add( - 'blockquote', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'blockquote', - label: 'Quote', - }), - 'Insert quote' - ) - this.add('', '
    ', 'mms-br') - - this.add( - 'pagebreak', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'pagebreak', - label: 'Page break for printing', - }), - 'Insert page break' - ) - this.add( - 'horizontalrule', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'horizontalrule', - label: 'Horizontal Rule', - }), - 'Insert horizontal rule' - ) - this.add('', '
    ', 'mms-br') - - this.add( - 'mmssignature', - createItem({ - isMmsCustomPlugin: true, - imgSrc: - window.CKEDITOR_BASEPATH + - 'plugins/mmssignature/icons/mmssignature.png', - label: 'Signature template', - }), - 'Insert signature template' - ) - }, - - onClick: (command) => { - if (command !== '') { - editor.execCommand(command) - } - }, - }) - editor.ui.addRichCombo('mmsExtraFormat', { - title: 'Extra formatting', - className: 'mmsExtraFormat', - multiSelect: false, - panel: { - css: [CKEDITOR.skin.getPath('editor')].concat( - config.contentsCss - ), - }, - init: () => { - this.add( - 'strike', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'strike', - label: 'Strikethrough', - }), - 'Strikethrough' - ) - this.add( - 'superscript', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'superscript', - label: 'Superscript', - }), - 'Superscript' - ) - this.add( - 'subscript', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'subscript', - label: 'Subscript', - }), - 'Subscript' - ) - this.add('', '
    ', 'mms-br') - - this.add( - 'removeFormat', - createItem({ - isMmsCustomPlugin: false, - iconClass: 'removeformat', - label: 'Clear Formatting', - }), - 'Clear Formatting' - ) - }, - - onClick: (command) => { - if (command !== '') { - editor.execCommand(command) - } - }, - }) - }, -}) diff --git a/src/lib/ckeditor-plugins/mmsreset/plugin.js b/src/lib/ckeditor-plugins/mmsreset/plugin.js deleted file mode 100644 index f6e4ad433..000000000 --- a/src/lib/ckeditor-plugins/mmsreset/plugin.js +++ /dev/null @@ -1,31 +0,0 @@ -/** - * Plugin for resetting cross reference elements into the CKEditor editing area. - */ - -// Register the plugin within the editor. -CKEDITOR.plugins.add('mmsreset', { - // Register the icons. - icons: 'mmsreset', - init: (editor) => { - editor.addCommand('mmsreset', { - exec: (editor) => { - var defaultConfig = { - callbackModalFnc: () => { - console.log('There is no callback function defined') - }, - } - var config = CKEDITOR.tools.extend( - defaultConfig, - editor.config.mmsreset || {}, - true - ) - config.callback(editor) - }, - }) - - editor.ui.addButton('mmsreset', { - label: 'Update Cross Ref', - command: 'mmsreset', - }) - }, -}) diff --git a/src/lib/ckeditor-plugins/mmsvlink/plugin.js b/src/lib/ckeditor-plugins/mmsvlink/plugin.js deleted file mode 100644 index 8fa36c9da..000000000 --- a/src/lib/ckeditor-plugins/mmsvlink/plugin.js +++ /dev/null @@ -1,35 +0,0 @@ -/** - * Plugin for inserting view link elements into the CKEditor editing area. - */ - -// Register the plugin within the editor. -CKEDITOR.plugins.add('mmsvlink', { - requires: 'widget', - // Register the icons. - icons: 'mmsvlink', - - init: (editor) => { - // Register mmsvlink widget to opens view link search window - // and insert mmsvlink tag as widget. - editor.widgets.add('mmsvlink', { - button: 'Insert Cross Reference as link', - allowedContent: 'mms-view-link[*]', - inline: true, - insert: () => { - var defaultConfig = { - callbackModalFnc: () => { - console.log('There is no callback function defined') - }, - } - var config = CKEDITOR.tools.extend(defaultConfig, editor.config.mmsvlink || {}, true) - var tag = config.callbackModalFnc(editor, false) - }, - // Check the elements that need to be converted to widgets. - upcast: (element) => { - // Return "true" (that element needs to converted to a mmsvlink widget) - // for all elements. - return element.name === 'mms-view-link' - }, - }) - }, -}) diff --git a/src/lib/ckeditor-plugins/ve-ckeditor-plugins.d.ts b/src/lib/ckeditor-plugins/ve-ckeditor-plugins.d.ts deleted file mode 100644 index f001593b9..000000000 --- a/src/lib/ckeditor-plugins/ve-ckeditor-plugins.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -declare namespace CKEDITOR { - namespace plugins { - interface autoSaveConfig { - delay?: number - messageType?: string - saveOnDestroy?: boolean - saveDetectionSelectors?: string - diffType?: string - autoLoad?: boolean - NotOlderThen?: number - enableAutosave?: boolean - SaveKey? - } - } - - interface config { - //MMS Specific - autosave?: plugins.autoSaveConfig - mmscf?: { callbackModalFnc: (ed: editor) => void } - mmscomment?: { callbackModalFnc: (ed: editor) => void } - mmsvlink?: { callbackModalFnc: (ed: editor) => void } - mmsreset?: { callback: (ed: editor) => void } - } -} diff --git a/src/lib/ckeditor/CHANGES.md b/src/lib/ckeditor/CHANGES.md old mode 100644 new mode 100755 index 4f20ea8c8..9f37e50fb --- a/src/lib/ckeditor/CHANGES.md +++ b/src/lib/ckeditor/CHANGES.md @@ -1,550 +1,17 @@ CKEditor 4 Changelog ==================== -## CKEditor 4.19.1 - -Fixed Issues: - -* [#5125](https://github.com/ckeditor/ckeditor4/issues/5125): Fixed: Deleting a widget with disabled [autoParagraph](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-autoParagraph) by the keyboard `backspace` key removes the editor editable area and crashes the editor. -* [#5135](https://github.com/ckeditor/ckeditor4/issues/5135): Fixed: The [`checkbox.setValue`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_dialog_checkbox.html#method-setValue) and [`radio.setValue`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_dialog_radio.html#method-setValue) methods are not chainable as stated in the documentation. Thanks to [Jordan Bradford](https://github.com/LordPachelbel)! -* [#5085](https://github.com/ckeditor/ckeditor4/issues/5085): Fixed: The [Language](https://ckeditor.com/cke4/addon/language) plugin removes the element marking the text in foreign language if said element does not have an information about the text direction. -* [#4284](https://github.com/ckeditor/ckeditor4/issues/4284): Fixed: [Tableselection](https://ckeditor.com/cke4/addon/tableselection) Merging cells with a rowspan throws an unexpected error and does not create an undo step. -* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Fixed: The [Editor Placeholder](https://ckeditor.com/cke4/addon/wysiwygarea) plugin degrades typing performance. -* [#5158](https://github.com/ckeditor/ckeditor4/issues/5158): Fixed: [`CKEDITOR.tools#convertToPx()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx) gives invalid results if the helper calculator element was deleted from the DOM. -* [#5234](https://github.com/ckeditor/ckeditor4/issues/5234): Fixed: [Easy Image](https://ckeditor.com/cke4/addon/easyimage) doesn't allow to upload images files using toolbar button. -* [#438](https://github.com/ckeditor/ckeditor4/issues/438): Fixed: It is impossible to navigate to the [elementspath](https://ckeditor.com/cke4/addon/elementspath) from the [toolbar](https://ckeditor.com/cke4/addon/toolbar) by keyboard and vice versa. -* [#4449](https://github.com/ckeditor/ckeditor4/issues/4449): Fixed: [`dialog.validate#functions`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) incorrectly composes functions that return an optional error message, like e.g. [`dialog.validate.number`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-number) due to unnecessary return type coercion. -* [#4473](https://github.com/ckeditor/ckeditor4/issues/4473): Fixed: The [dialog.validate](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html) method does not accept parameter value. The issue originated in [dialog.validate.functions](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) method that did not properly propagate parameter value to validator. Affected validators: - * [`functions`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-functions) - * [`equals`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-equals) - * [`notEqual`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-notEqual) - * [`cssLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-cssLength) - * [`htmlLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-htmlLength) - * [`inlineStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_validate.html#method-inlineStyle) -* [#5147](https://github.com/ckeditor/ckeditor4/issues/5147): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog does not contain info about focus being moved back to the editing area upon leaving dialogs. -* [#5144](https://github.com/ckeditor/ckeditor4/issues/5144): Fixed: [Menu buttons](https://ckeditor.com/cke4/addon/menubutton) and [panel buttons](https://ckeditor.com/cke4/addon/panelbutton) incorrectly indicate the open status of their associated pop-up menus in the browser's accessibility tree. -* [#5022](https://github.com/ckeditor/ckeditor4/issues/5022): Fixed: [Find and Replace](https://ckeditor.com/cke4/addon/find) does not respond to the `Enter` key. - -API changes: - -* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Added the [`config.editorplaceholder_delay`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-editorplaceholder_delay) configuration option allowing to delay placeholder before it is toggled when changing editor content. -* [#5184](https://github.com/ckeditor/ckeditor4/issues/5184): Added the [`CKEDITOR.tools#debounce()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-debounce) function allowing to postpone a passed function execution until the given milliseconds have elapsed since the last time it was invoked. - -## CKEditor 4.19.0 - -New features: - -* [#2444](https://github.com/ckeditor/ckeditor4/issues/2444): Togglable toolbar buttons are now exposed as toggle buttons in the browser's accessibility tree. -* [#4641](https://github.com/ckeditor/ckeditor4/issues/4641): Added an option allowing to cancel the [Delayed Editor Creation](https://ckeditor.com/docs/ckeditor4/latest/features/delayed_creation.html) feature as a function handle for editor creators ([`CKEDITOR.replace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace), [`CKEDITOR.inline`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inline), [`CKEDITOR.appendTo`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo)). -* [#4986](https://github.com/ckeditor/ckeditor4/issues/4986): Added [`config.shiftLineBreaks`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-shiftLineBreaks) allowing to preserve inline elements formatting when the `shift`+`enter` keystroke is used. -* [#2445](https://github.com/ckeditor/ckeditor4/issues/2445): Added [`config.applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-applicationTitle) configuration option allowing to customize or disable the editor's application region label. This option, combined with [`config.title`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-title), gives much better control over the editor's labels read by screen readers. - -Fixed Issues: - -* [#4543](https://github.com/ckeditor/ckeditor4/issues/4543): Fixed: Toolbar buttons toggle state is not correctly announced by screen readers lacking the information whether the feature is on or off. -* [#4052](https://github.com/ckeditor/ckeditor4/issues/4052): Fixed: Editor labels are read incorrectly by screen readers due to invalid editor control type for the [Iframe Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) editors. -* [#1904](https://github.com/ckeditor/ckeditor4/issues/1904): Fixed: Screen readers are not announcing the read-only editor state. -* [#4904](https://github.com/ckeditor/ckeditor4/issues/4904): Fixed: Table cell selection and navigation with the `tab` key behavior is inconsistent after adding a new row. -* [#3394](https://github.com/ckeditor/ckeditor4/issues/3394): Fixed: [Enhanced image](https://ckeditor.com/cke4/addon/image2) plugin dialog is not supporting URL with query string parameters. Thanks to [Simon Urli](https://github.com/surli)! -* [#5049](https://github.com/ckeditor/ckeditor4/issues/5049): Fixed: The editor fails in strict mode due to not following the `use strict` directives in a core editor module. -* [#5095](https://github.com/ckeditor/ckeditor4/issues/5095): Fixed: The [clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin shows notification about unsupported file format when the file type is different than `jpg`, `gif`, `png`, not respecting [supported types](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-supportedTypes) by the [Upload Widget](https://ckeditor.com/cke4/addon/uploadwidget) plugin. -* [#4855](https://github.com/ckeditor/ckeditor4/issues/4855): [iOS] Fixed: Focusing toolbar buttons with an enabled VoiceOver screen reader moves the browser focus into an editable area and interrupts button functionality. - -API changes: - -* [#4641](https://github.com/ckeditor/ckeditor4/issues/4641): The [`CKEDITOR.replace`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-replace), [`CKEDITOR.inline`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inline), [`CKEDITOR.appendTo`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTo) functions are now returning a handle function allowing to cancel the [Delayed Editor Creation](https://ckeditor.com/docs/ckeditor4/latest/features/delayed_creation.html) feature. -* [#5095](https://github.com/ckeditor/ckeditor4/issues/5095): Added the [CKEDITOR.plugins.clipboard.addFileMatcher](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard.html#method-addFileMatcher) function allowing to define file formats supported by the [clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. Trying to paste unsupported files will result in a notification that a file cannot be dropped or pasted into the editor. -* [#2445](https://github.com/ckeditor/ckeditor4/issues/2445): Added [`config.applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-applicationTitle) alongside [`CKEDITOR.editor#applicationTitle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-applicationTitle) to allow customizing editor's application region label. - -## CKEditor 4.18.0 - -**Security Updates:** - -* Fixed an XSS vulnerability in the core module reported by GitHub Security Lab team member [Kevin Backhouse](https://github.com/kevinbackhouse). - - Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing a JavaScript code. See [CVE-2022-24728](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-4fc4-4p5g-6w89) for more details. - -* Fixed a Regular expression Denial of Service (ReDoS) vulnerability in dialog plugin discovered by the CKEditor 4 team during our regular security audit. - - Issue summary: The vulnerability allowed to abuse a dialog input validator regular expression, which could cause a significant performance drop resulting in a browser tab freeze. See [CVE-2022-24729](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-f6rf-9m92-x2hh) for more details. - -You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions. - -**An upgrade is highly recommended!** - -**Highlights:** - -[Web Spell Checker](https://webspellchecker.com/) ended support for WebSpellChecker Dialog on December 31st, 2021. This means the plugin is not supported any longer. Therefore, we decided to deprecate and remove the WebSpellChecker Dialog plugin from CKEditor 4 presets. - -We strongly encourage everyone to choose one of the other available spellchecking solutions - [Spell Check As You Type (SCAYT)](https://ckeditor.com/cke4/addon/scayt) or [WProofreader](https://ckeditor.com/cke4/addon/wproofreader). - -Fixed issues: - -* [#5097](https://github.com/ckeditor/ckeditor4/issues/5097): [Chrome] Fixed: Incorrect conversion of points to pixels while using [`CKEDITOR.tools.convertToPx()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx). -* [#5044](https://github.com/ckeditor/ckeditor4/issues/5044): Fixed: `select` elements with `multiple` attribute had incorrect styling. Thanks to [John R. D'Orazio](https://github.com/JohnRDOrazio)! - -Other changes: - -* [#5093](https://github.com/ckeditor/ckeditor4/issues/5093): Deprecated and removed WebSpellChecker Dialog from presets. -* [#5127](https://github.com/ckeditor/ckeditor4/issues/5127): Deprecated the [`CKEDITOR.rnd`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-rnd) property to discourage using it in a security-sensitive context. -* [#5087](https://github.com/ckeditor/ckeditor4/issues/5087): Improved the jQuery adapter by replacing a deprecated jQuery API with existing counterparts. Thanks to [Fran Boon](https://github.com/flavour)! -* [#5128](https://github.com/ckeditor/ckeditor4/issues/5128): Improved the [Emoji](https://ckeditor.com/cke4/addon/emoji) definitions encoding set by the [`config.emoji_emojiListUrl`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-emoji_emojiListUrl) configuration option. - -## CKEditor 4.17.2 - -Fixed issues: - -* [#4934](https://github.com/ckeditor/ckeditor4/issues/4934): Fixed: Active focus in dialog tabs is not visible in the High Contrast mode. -* [#547](https://github.com/ckeditor/ckeditor4/issues/547): Fixed: Dragging and dropping elements like images within a table is no longer available. -* [#4875](https://github.com/ckeditor/ckeditor4/issues/4875): Fixed: It is not possible to delete multiple selected lists. -* [#4873](https://github.com/ckeditor/ckeditor4/issues/4873): Fixed: Pasting content from MS Word and Outlook with horizontal lines prevents images from being uploaded. -* [#4952](https://github.com/ckeditor/ckeditor4/issues/4952): Fixed: Dragging and dropping images within a table cell appends additional elements. -* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): Fixed: Some CSS files are missing unique timestamp used to prevent browser to cache static resources between editor releases. -* [#4987](https://github.com/ckeditor/ckeditor4/issues/4987): Fixed: [Find/Replace](https://ckeditor.com/cke4/addon/find) is not recognizing more than one space character. -* [#5061](https://github.com/ckeditor/ckeditor4/issues/5061): Fixed: [Find/Replace](https://ckeditor.com/cke4/addon/find) plugin incorrectly handles multiple whitespace during replacing text. -* [#5004](https://github.com/ckeditor/ckeditor4/issues/5004): Fixed: `MutationObserver` used in [IFrame Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) plugin causes memory leaks. -* [#4994](https://github.com/ckeditor/ckeditor4/issues/4994): Fixed: [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin caused content pasted from Word to turn into an image. - -API changes: - -* [#4918](https://github.com/ckeditor/ckeditor4/issues/4918): Explicitly set the [`config.useComputedState`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-useComputedState) default value to `true`. Thanks to [Shabab Karim](https://github.com/shabab477)! -* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): The [`CKEDITOR.appendTimestamp()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTimestamp) function was added. -* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): [`CKEDITOR.dom.document#appendStyleSheet()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_document.html#method-appendStyleSheet) and [`CKEDITOR.tools.buildStyleHtml()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-buildStyleHtml) now use the newly added [`CKEDITOR.appendTimestamp()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-appendTimestamp) function to correctly handle caching of CSS files. - -Other changes: - -* [#5014](https://github.com/ckeditor/ckeditor4/issues/5014): Fixed: Toolbar configurator fails when plugin does not define a toolbar group. Thanks to [SuperPat](https://github.com/SuperPat45)! - -## CKEditor 4.17.1 - -**Highlights:** - -Due to a regression in CKEeditor 4.17.0 version that was only revealed after the release and affected a limited area of operation, CSS assets loaded via relative links started to point into invalid location when loaded from external resources. - -We have therefore decided to immediately release CKEditor 4.17.1 that fixed this problem. If you have already upgraded to v4.17.0, make sure to upgrade to v4.17.1 to avoid this regression. - -Fixed issues: - -* [#4979](https://github.com/ckeditor/ckeditor4/issues/3757): Fixed: Added cache key in [#4761](https://github.com/ckeditor/ckeditor4/issues/4761) started to breaking relative links for external CSS resources. The fix has been reverted and will be corrected in the next editor version. - -## CKEditor 4.17 - -**Security Updates:** - -* Fixed XSS vulnerability in the core module reported by [William Bowling](https://github.com/wbowling). - - Issue summary: The vulnerability allowed to inject malformed comments HTML bypassing content sanitization, which could result in executing JavaScript code. See [CVE-2021-41165](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7h26-63m7-qhf2) for more details. - -* Fixed XSS vulnerability in the core module reported by [Maurice Dauer](https://twitter.com/laytonctf). - - Issue summary: The vulnerability allowed to inject malformed HTML bypassing content sanitization, which could result in executing JavaScript code. See [CVE-2021-41164](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-pvmx-g8h5-cprj) for more details. - -You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions. - -**An upgrade is highly recommended!** - -**Highlights:** - -Adobe [ended support of Flash Player](https://www.adobe.com/products/flashplayer/end-of-life.html) on December 31, 2020 and blocked Flash content from running in Flash Player beginning January 12, 2021. -We have decided to deprecate and remove the [Flash](https://ckeditor.com/cke4/addon/flash) plugin from CKEditor 4 to help protect users' systems and discourage using insecure software. - -New Features: - -* [#3433](https://github.com/ckeditor/ckeditor4/issues/3433): Marked required fields in dialogs with asterisk (`*`) symbol. -* [#4374](https://github.com/ckeditor/ckeditor4/issues/4374): Integrated the [Maximize](https://ckeditor.com/cke4/addon/maximize) plugin with browser's History API. -* [#4461](https://github.com/ckeditor/ckeditor4/issues/4461): Introduced the possibility to delay editor initialization while it is in a detached DOM element. -* [#4462](https://github.com/ckeditor/ckeditor4/issues/4462): Introduced support for reattaching editor container element to DOM. -* [#4612](https://github.com/ckeditor/ckeditor4/issues/4612): Allow pasting images as Base64 from [clipboard](https://ckeditor.com/cke4/addon/clipboard) in all browsers except IE. -* [#4681](https://github.com/ckeditor/ckeditor4/issues/4681): Allow drag and drop images as Base64. -* [#4750](https://github.com/ckeditor/ckeditor4/issues/4750): Added notification for pasting and dropping unsupported file types into the editor. -* [#4807](https://github.com/ckeditor/ckeditor4/issues/4807): [Chrome] Improved the performance of pasting large images. Thanks to [FlowIT-JIT](https://github.com/FlowIT-JIT)! -* [#4850](https://github.com/ckeditor/ckeditor4/issues/4850): Added support for loading [content templates](https://ckeditor.com/cke4/addon/templates) from HTML files. Thanks to [Fynn96](https://github.com/Fynn96)! -* [#4874](https://github.com/ckeditor/ckeditor4/issues/4874): Added the [`config.clipboard_handleImages`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-clipboard_handleImages) configuration option for enabling and disabling built-in support for pasting and dropping images in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. Thanks to [FlowIT-JIT](https://github.com/FlowIT-JIT)! -* [#4026](https://github.com/ckeditor/ckeditor4/issues/4026): [Preview](https://ckeditor.com/cke4/addon/preview) plugin now uses the [`editor#title`](http://localhost/ckeditor4-docs/build/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-title) property for the title of the preview window. Thanks to [Ely](https://github.com/Elyasin)! -* [#4467](https://github.com/ckeditor/ckeditor4/issues/4467): Added support for inserting content next to a block [widgets](https://ckeditor.com/cke4/addon/widget) using keyboard navigation. Thanks to [bunglegrind](https://github.com/bunglegrind)! - -Fixed Issues: - -* [#3757](https://github.com/ckeditor/ckeditor4/issues/3757): [Firefox] Fixed: images pasted from [clipboard](https://ckeditor.com/cke4/addon/clipboard) are not inserted as Base64-encoded images. -* [#3876](https://github.com/ckeditor/ckeditor4/issues/3876): Fixed: The [Print](https://ckeditor.com/cke4/addon/print) plugin incorrectly prints links and images. -* [#4444](https://github.com/ckeditor/ckeditor4/issues/4444): [Firefox] Fixed: Print preview is incorrectly loaded from CDN. -* [#4596](https://github.com/ckeditor/ckeditor4/issues/4596): Fixed: Incorrect handling of HSL/HSLA values in [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html). -* [#4597](https://github.com/ckeditor/ckeditor4/issues/4597): Fixed: Incorrect color conversion for HSL/HSLA values in [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html). -* [#4604](https://github.com/ckeditor/ckeditor4/issues/4604): Fixed: [`CKEDITOR.plugins.clipboard.dataTransfer#getTypes()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard_dataTransfer.html#method-getTypes) returns no types. -* [#4761](https://github.com/ckeditor/ckeditor4/issues/4761): Fixed: Not all resources loaded by the editor respect the cache key. -* [#4783](https://github.com/ckeditor/ckeditor4/issues/4783): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog does not contain info about focus being moved back to the editing area upon activating a toolbar button. -* [#4790](https://github.com/ckeditor/ckeditor4/issues/4790): Fixed: Printing page is invoked before the printed page is fully loaded. -* [#4874](https://github.com/ckeditor/ckeditor4/issues/4874): Fixed: Built-in support for pasting and dropping images in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin restricts third party plugins from handling image pasting. Thanks to [FlowIT-JIT](https://github.com/FlowIT-JIT)! -* [#4888](https://github.com/ckeditor/ckeditor4/issues/4888): Fixed: The [`CKEDITOR.dialog#setState()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog.html#method-setState) method throws error when there is no "OK" button in the dialog. -* [#4858](https://github.com/ckeditor/ckeditor4/issues/4858): Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin incorrectly escapes the `&` characters when pasting links into the editor. -* [#4892](https://github.com/ckeditor/ckeditor4/issues/4892): Fixed: Focus of buttons in dialogs is not visible enough in High Contrast mode. -* [#3858](https://github.com/ckeditor/ckeditor4/issues/3858): Fixed: Pasting content in `ENTER_BR` [enter mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode) crashes the editor. -* [#4891](https://github.com/ckeditor/ckeditor4/issues/4891): Fixed: The [Autogrow](https://ckeditor.com/cke4/addon/autogrow) plugin applies fixed width to the editor. - -API Changes: - -* [#4462](https://github.com/ckeditor/ckeditor4/issues/4462): [`CKEDITOR.editor#getSelection()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getSelection) now returns `null` if the editor is in recreating state. -* [#4583](https://github.com/ckeditor/ckeditor4/issues/4583): Added support for new, comma-less color syntax to [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html). -* [#4604](https://github.com/ckeditor/ckeditor4/issues/4604): Added the [`CKEDITOR.plugins.clipboard.dataTransfer#isFileTransfer()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_clipboard_dataTransfer.html#method-isFileTransfer) method. -* [#4790](https://github.com/ckeditor/ckeditor4/issues/4790): Added `callback` parameter to [`CKEDITOR.plugins.preview#createPreview()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_preview.html#method-createPreview) method. - -Other Changes: - -* [#4866](https://github.com/ckeditor/ckeditor4/issues/#4866): The [Flash](https://ckeditor.com/cke4/addon/flash) plugin is now deprecated and has been removed from CKEditor 4. -* [#4901](https://github.com/ckeditor/ckeditor4/issues/4901): Redesigned buttons placement in the [Content templates](https://ckeditor.com/cke4/addon/templates) dialog to make it more UX friendly. Thanks to [Fynn96](https://github.com/Fynn96)! - -## CKEditor 4.16.2 - -**Security Updates:** - -* Fixed XSS vulnerability in the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin reported by [Anton Subbotin](https://github.com/skavans). - - Issue summary: The vulnerability allowed to abuse paste functionality using malformed HTML, which could result in injecting arbitrary HTML into the editor. See [CVE-2021-32809](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-7889-rm5j-hpgg) for more details. - -* Fixed XSS vulnerability in the [Widget](https://ckeditor.com/cke4/addon/widget) plugin reported by [Anton Subbotin](https://github.com/skavans). - - Issue summary: The vulnerability allowed to abuse undo functionality using malformed [Widget](https://ckeditor.com/cke4/addon/widget) HTML, which could result in executing JavaScript code. See [CVE-2021-32808](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-6226-h7ff-ch6c) for more details. - -* Fixed XSS vulnerability in the [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) plugin reported by [Mika Kulmala](https://github.com/kulmik). - - Issue summary: The vulnerability allowed to inject malformed [Fake Objects](https://ckeditor.com/cke4/addon/fakeobjects) HTML, which could result in executing JavaScript code. See [CVE-2021-37695](https://github.com/ckeditor/ckeditor4/security/advisories/GHSA-m94c-37g6-cjhc) for more details. - -You can read more details in the relevant security advisory and [contact us](security@cksource.com) if you have more questions. - -**An upgrade is highly recommended!** - -Fixed Issues: -* [#4777](https://github.com/ckeditor/ckeditor4/issues/4777): Fixed: HTML comments in widgets not processed correctly. -* [#4733](https://github.com/ckeditor/ckeditor4/pull/4733): Fixed: [Link](https://ckeditor.com/cke4/addon/link) prevent duplicate anchors in text with styles. - * [#4728](https://github.com/ckeditor/ckeditor4/issues/4728): Fixed: Multiple anchors in one line and multi-line with text style. - * [#3863](https://github.com/ckeditor/ckeditor4/issues/3863): Fixed: Multiple anchors in single word with text style. -* [#3819](https://github.com/ckeditor/ckeditor4/issues/3819): [Chrome] Fixed: After removing one of the two consecutive spaces, the ` ` character appears in the editor instead of a space. -* [#4666](https://github.com/ckeditor/ckeditor4/pull/4666): [IE] Introduce CSS.escape polyfill. Thanks to [limingli0707](https://github.com/limingli0707)! - * [#681](https://github.com/ckeditor/ckeditor4/issues/681): Fixed: Table elements (td, tr, th, ..) with an id that starts with dot (.) causes javascript runtime err. - * [#641](https://github.com/ckeditor/ckeditor4/issues/641): Fixed: UploadImage Plugin Widgets not working in IE, Opera, Safari, PhantomJS. -* [#3638](https://github.com/ckeditor/ckeditor4/issues/3638): Fixed: Opening the same dialog twice causes it to become hidden under the dialog's page cover. -* [#4247](https://github.com/ckeditor/ckeditor4/issues/4247): Fixed: [Color Button](https://ckeditor.com/cke4/addon/colorbutton)'s incorrect rendering on the first opening. -* [#4555](https://github.com/ckeditor/ckeditor4/issues/4555): Fixed: [Font](https://ckeditor.com/cke4/addon/font) styles with attributes are not applied correctly when used multiple times over the same selection. -* [#4782](https://github.com/ckeditor/ckeditor4/issues/4782): [Firefox] Fixed: `TypeError` is thrown when switching to Source View and back while [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) plugin is enabled. - -## CKEditor 4.16.1 - -Fixed Issues: -* [#4617](https://github.com/ckeditor/ckeditor4/issues/4617): Fixed: [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) is not accessible in inline editors. -* [#4493](https://github.com/ckeditor/ckeditor4/issues/4493): Fixed: The [drop-down](https://ckeditor.com/cke4/addon/richcombo) label does not reflect the current value of the drop-down. -* [#1572](https://github.com/ckeditor/ckeditor4/issues/1572): Fixed: A paragraph before or after a [widget](https://ckeditor.com/cke4/addon/widget) cannot be removed. Thanks to [bunglegrind](https://github.com/bunglegrind)! -* [#4301](https://github.com/ckeditor/ckeditor4/issues/4301): Fixed: Pasted content is overwritten when pasted in an initially empty editor with the [`div` Enter mode](https://ckeditor.com/docs/ckeditor4/latest/features/enterkey.html). -* [#4351](https://github.com/ckeditor/ckeditor4/issues/4351): Fixed: Incorrect values for RGBA/HSLA colors in [Color Dialog](https://ckeditor.com/cke4/addon/colordialog). -* [#4509](https://github.com/ckeditor/ckeditor4/issues/4509): Fixed: Incorrect handling of drag & drop inside [widgets](https://ckeditor.com/cke4/addon/widget) and nested editables. -* [#4611](https://github.com/ckeditor/ckeditor4/issues/4611): [Android, iOS] Fixed: Incorrect hover styles for buttons in the toolbar on mobile devices. -* [#4652](https://github.com/ckeditor/ckeditor4/issues/4652): Fixed: [Event data](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_eventInfo.html) set to `false` is treated as an event cancellation. -* [#4659](https://github.com/ckeditor/ckeditor4/issues/4659): Fixed: [`CKEDITOR.htmlParser`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_htmlParser.html) does not treat `--!>` as a comment end tag correctly. - -## CKEditor 4.16 - -**Security Updates:** - -* Fixed ReDoS vulnerability in the [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin. - - Issue summary: It was possible to execute a ReDoS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted URL-like text into the editor and press Enter or Space. - -* Fixed ReDoS vulnerability in the [Advanced Tab for Dialogs](https://ckeditor.com/cke4/addon/dialogadvtab) plugin. - - Issue summary: It was possible to execute a ReDoS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted text into the Styles dialog. - -**An upgrade is highly recommended!** - -New Features: - -* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Unsupported image formats are now gracefully handled by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin on paste, additionally showing descriptive error messages. -* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Unsupported image formats are now gracefully handled by the [Paste from LibreOffice](https://ckeditor.com/cke4/addon/pastefromlibreoffice) plugin on paste, additionally showing descriptive error messages. -* [#3582](https://github.com/ckeditor/ckeditor4/issues/3582): Introduced smart positioning of the [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) panel used by the [Mentions](https://ckeditor.com/cke4/addon/mentions) and [Emoji](https://ckeditor.com/cke4/addon/emoji) plugins. The panel will now be additionally positioned related to the browser viewport to be always fully visible. -* [#4388](https://github.com/ckeditor/ckeditor4/issues/4388): Added the option to remove an iframe created with the [IFrame Dialog](https://ckeditor.com/cke4/addon/iframe) plugin from the sequential keyboard navigation using the `tabindex` attribute. Thanks to [Timo Kirkkala](https://github.com/kirkkala)! - -Fixed Issues: - -* [#1134](https://github.com/ckeditor/ckeditor4/issues/1134): [Safari] Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not embed images. -* [#2800](https://github.com/ckeditor/ckeditor4/issues/2800): Fixed: No images are imported from Microsoft Word when the content is pasted via the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin if there is at least one image of unsupported format. -* [#4379](https://github.com/ckeditor/ckeditor4/issues/4379): [Edge] Fixed: Incorrect detection of the [high contrast mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_a11y.html#high-contrast-mode). -* [#4422](https://github.com/ckeditor/ckeditor4/issues/4422): Fixed: Missing space between the button name and the keyboard shortcut inside the button label in the [high contrast mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_a11y.html#high-contrast-mode). -* [#2208](https://github.com/ckeditor/ckeditor4/issues/2208): [IE] Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin duplicates the native browser implementation. -* [#1824](https://github.com/ckeditor/ckeditor4/issues/1824): Fixed: The [Autolink](https://ckeditor.com/cke4/addon/autolink) plugin should require the [Link](https://ckeditor.com/cke4/addon/link) plugin. -* [#4253](https://github.com/ckeditor/ckeditor4/issues/4253): Fixed: The [Editor Placeholder](https://ckeditor.com/cke4/addon/editorplaceholder) plugin throws an error during the editor initialization with [`config.fullPage`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-fullPage) enabled when there is no `` tag in the editor content. -* [#4372](https://github.com/ckeditor/ckeditor4/issues/4372): Fixed: The [Autogrow](https://ckeditor.com/cke4/addon/autogrow) plugin changes the editor's width when used with an absolute [`config.width`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-width) value. - -API Changes: - -* [#4358](https://github.com/ckeditor/ckeditor4/issues/4358): Introduced the [`CKEDITOR.tools.color`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_color.html) class which adds colors validation and methods for converting colors between various formats: named colors, HEX, RGB, RGBA, HSL and HSLA. -* [#3782](https://github.com/ckeditor/ckeditor4/issues/3782): Moved the [`CKEDITOR.plugins.pastetools.filters.word.images`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters_word_images.html) filters to the [`CKEDITOR.plugins.pastetools.filters.image`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters_image.html) namespace. -* [#4297](https://github.com/ckeditor/ckeditor4/issues/4297): All [`CKEDITOR.plugins.pastetools.filters`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_pastetools_filters.html) are now available under the [`CKEDITOR.pasteTools`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#property-pasteTools) alias. -* [#4394](https://github.com/ckeditor/ckeditor4/issues/4394): Introduced [`CKEDITOR.ajax`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html) specialized loading methods for loading binary ([`CKEDITOR.ajax.loadBinary()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html#method-loadBinary)) and text ([`CKEDITOR.ajax.loadText()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ajax.html#method-loadText)) data. - -Other Changes: - -* The [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugin is now disabled by default in [Standard and Full presets](https://ckeditor.com/cke4/presets). It can be enabled via [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins) configuration option. - -## CKEditor 4.15.1 - -**Security Updates:** - -* Fixed XSS vulnerability in the [Color History feature](https://ckeditor.com/docs/ckeditor4/latest/features/colorbutton.html#color-history) reported by [Mark Wade](https://github.com/mark-wade). - - Issue summary: It was possible to execute an XSS-type attack inside CKEditor 4 by persuading a victim to paste a specially crafted HTML code into the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) dialog. - -**An upgrade is highly recommended!** - -Fixed Issues: - -* [#4293](https://github.com/ckeditor/ckeditor4/issues/4293): Fixed: The [`CKEDITOR.inlineAll()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-inlineAll) method tries to initialize inline editor also on elements with an editor already attached to them. -* [#3961](https://github.com/ckeditor/ckeditor4/issues/3961): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin prevents editing of merged cells. -* [#3649](https://github.com/ckeditor/ckeditor4/issues/3649): Fixed: Applying a [block format](https://ckeditor.com/docs/ckeditor4/latest/features/format.html) should remove existing block styles. -* [#4282](https://github.com/ckeditor/ckeditor4/issues/4282): Fixed: The [script loader](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_scriptLoader.html) does not execute callback for scripts already loaded when called for the second time. Thanks to [Alexander Korotkevich](https://github.com/aldoom)! -* [#4273](https://github.com/ckeditor/ckeditor4/issues/4273): Fixed: A memory leak in the [`CKEDITOR.domReady()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-domReady) method connected with not removing `load` event listeners. Thanks to [rohit1](https://github.com/rohit1)! -* [#1330](https://github.com/ckeditor/ckeditor4/issues/1330): Fixed: Incomplete CSS margin parsing if an `auto` or `0` value is used. -* [#4286](https://github.com/ckeditor/ckeditor4/issues/4286): Fixed: The [Auto Grow](https://ckeditor.com/cke4/addon/autogrow) plugin causes the editor width to be set to `0` on editor resize. -* [#848](https://github.com/ckeditor/ckeditor4/issues/848): Fixed: Arabic text not being "bound" correctly when pasting. Thanks to [Thomas Hunkapiller](https://github.com/devoidfury) and [J. Ivan Duarte Rodríguez](https://github.com/jidrone-mbm)! - -API Changes: - -* [#3649](https://github.com/ckeditor/ckeditor4/issues/3649): Added a new [`stylesRemove`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-stylesRemove) editor event. - -Other Changes: - -* [#4262](https://github.com/ckeditor/ckeditor4/issues/4262): Removed the global reference to the `stylesLoaded` variable. Thanks to [Levi Carter](https://github.com/swiftMessenger)! -* Updated the [Export to PDF](https://ckeditor.com/cke4/addon/exportpdf) plugin to `1.0.1` version: - * Improved external CSS support for [classic editor](https://ckeditor.com/docs/ckeditor4/latest/examples/classic.html) by handling exceptions and displaying convenient [error messages](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_errors.html#exportpdf-stylesheets-incaccessible). - -## CKEditor 4.15 - -New features: - -* [#3940](https://github.com/ckeditor/ckeditor4/issues/3940): Introduced the `colorName` property for customizing foreground and background styles in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin via the [`config.colorButton_foreStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_foreStyle) and [`config.colorButton_backStyle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_backStyle) configuration options. -* [#3793](https://github.com/ckeditor/ckeditor4/issues/3793): Introduced the [Editor Placeholder](https://ckeditor.com/cke4/addon/editorplaceholder) plugin. -* [#1795](https://github.com/ckeditor/ckeditor4/issues/1795): The colors picked from the [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) are now stored in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) palette and can be reused easily. -* [#3783](https://github.com/ckeditor/ckeditor4/issues/3783): The colors used in the document are now displayed as a part of the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) palette. - -Fixed Issues: - -* [#4060](https://github.com/ckeditor/ckeditor4/issues/4060): Fixed: The content inside a [widget](https://ckeditor.com/cke4/addon/widget) nested editable is escaped twice. -* [#4183](https://github.com/ckeditor/ckeditor4/issues/4183): [Safari] Fixed: Incorrect image dimensions when using the [Easy Image](https://ckeditor.com/cke4/addon/easyimage) plugin alongside the [IFrame Editing Area](https://ckeditor.com/cke4/addon/wysiwygarea) plugin. -* [#3693](https://github.com/ckeditor/ckeditor4/issues/3693): Fixed: Incorrect default values for several [Color Button](https://ckeditor.com/cke4/addon/colorbutton) configuration variables in the API documentation. -* [#3795](https://github.com/ckeditor/ckeditor4/issues/3795): Fixed: Setting the [`config.dataIndentationChars`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-dataIndentationChars) configuration option to an empty string is ignored and replaced by a tab (`\t`) character. Thanks to [Thomas Grinderslev](https://github.com/Znegl)! -* [#4107](https://github.com/ckeditor/ckeditor4/issues/4107): Fixed: Multiple [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) instances cause keyboard navigation issues. -* [#4041](https://github.com/ckeditor/ckeditor4/issues/4041): Fixed: The[`selection.scrollIntoView`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_selection.html#method-scrollIntoView) method throws an error when the editor selection is not set. -* [#3361](https://github.com/ckeditor/ckeditor4/issues/3361): Fixed: Loading multiple [custom editor configurations](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-customConfig) is prone to a race condition between these. -* [#4007](https://github.com/ckeditor/ckeditor4/issues/4007): Fixed: Screen readers do not announce the [Rich Combo](https://ckeditor.com/cke4/addon/richcombo) plugin is collapsed or expanded. -* [#4141](https://github.com/ckeditor/ckeditor4/issues/4141): Fixed: The styles are incorrectly applied when there is a ` - -

    - Example CSS customizations -

    - - - - - - - - - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: PrintConfirmModalController, -}; - -veApp.component(PrintConfirmModalComponent.selector, PrintConfirmModalComponent); diff --git a/src/ve-app/main/modals/select-modal.component.ts b/src/ve-app/main/modals/select-modal.component.ts deleted file mode 100644 index e4ca4584d..000000000 --- a/src/ve-app/main/modals/select-modal.component.ts +++ /dev/null @@ -1,209 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import angular from 'angular'; - -import { ProjectService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { OrgObject, ProjectObject } from '@ve-types/mms'; -import { - VeModalComponent, - VeModalResolve, - VeModalController, - VeModalInstanceService, - VeModalResolveFn, -} from '@ve-types/view-editor'; - -interface SelectModalResolve extends VeModalResolve { - mmsOrgs: OrgObject[]; - mmsOrg: OrgObject; - mmsProjects: ProjectObject[]; - mmsProject: ProjectObject; -} - -export interface SelectModalResolveFn extends VeModalResolveFn { - mmsOrgs(): OrgObject[]; - mmsOrg(): OrgObject; - mmsProjects(): ProjectObject[]; - mmsProject(): ProjectObject; -} - -class SelectModalController implements VeModalController { - static $inject = ['$scope', '$state', 'ProjectService']; - - //bindings - public modalInstance: VeModalInstanceService; - private resolve: SelectModalResolve; - - //local - public spin = false; - public orgId: string; - public projectId: string = ''; - public selectedOrg: string; - public selectedProject: string; - public orgs: OrgObject[]; - public projects: ProjectObject[]; - protected orgSpin: boolean; - protected projSpin: boolean; - - constructor(private $scope: angular.IScope, private $state: StateService, private projectSvc: ProjectService) {} - - $onInit(): void { - this.orgs = this.resolve.mmsOrgs; - this.projects = this.resolve.mmsProjects; - - this.orgId = this.resolve.mmsOrg.id; - this.projectId = this.resolve.mmsProject.id; - - this.selectedOrg = this.resolve.mmsOrg.name; - this.selectedProject = this.resolve.mmsProject.name; - } - - public selectOrg = (org: OrgObject): void => { - if (org) { - this.orgId = org.id; - this.selectedOrg = org.name; - this.selectedProject = ''; - this.projSpin = true; - this.refreshProjects(); - } - }; - - public selectProject = (project: ProjectObject): void => { - if (project) { - this.projectId = project.id; - this.selectedProject = project.name; - } - }; - - public continue = (): void => { - if (this.orgId && this.projectId) { - // was the same project selected? cancel... - if (this.resolve.mmsProject.orgId === this.orgId && this.resolve.mmsProject.id === this.projectId) { - this.cancel(); - } else { - this.spin = true; - this.$state - .go('main.project.ref.portal', { - orgId: this.orgId, - projectId: this.projectId, - refId: 'master', - keywords: undefined, - }) - .finally(() => { - this.spin = false; - this.modalInstance.close(); - }); - } - } - }; - - public refreshOrgs = (): void => { - this.orgSpin = true; - this.orgs.length = 0; - this.projectSvc - .getOrgs(true) - .then((data) => { - this.orgs.push(...data); - }) - .finally(() => { - this.orgSpin = false; - }); - }; - - public refreshProjects = (): void => { - this.projSpin = true; - this.projects.length = 0; - this.projectSvc - .getProjects(this.orgId, true) - .then((data) => { - this.projects.push(...data); - if ( - data && - data.length > 0 && - this.projects.filter((p) => { - return p.id === this.projectId; - }).length === 0 - ) { - this.selectProject(data[0]); - } else { - //no projects - } - }) - .finally(() => { - this.projSpin = false; - }); - }; - - public cancel = (): void => { - this.modalInstance.dismiss(); - }; -} - -const SelectModalComponent: VeModalComponent = { - selector: 'selectModal', - template: ` - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: SelectModalController, -}; - -veApp.component(SelectModalComponent.selector, SelectModalComponent); diff --git a/src/ve-app/main/modals/table-export-modal.component.ts b/src/ve-app/main/modals/table-export-modal.component.ts deleted file mode 100644 index 8e98b6f8e..000000000 --- a/src/ve-app/main/modals/table-export-modal.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { VeModalControllerImpl } from '@ve-utils/modals/ve-modal.controller'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { VeModalController, VeModalResolve, VeModalResolveFn } from '@ve-types/view-editor'; - -interface TableExportModalResolve extends VeModalResolve { - type: string; -} - -export interface TableExportModalResolveFn extends VeModalResolveFn { - type(): string; -} - -class TableExportModalController extends VeModalControllerImpl implements VeModalController { - //bindings - resolve: TableExportModalResolve; - //local - type; - - $onInit(): void { - this.type = this.resolve.type; - } - - public export(): void { - this.modalInstance.close('export'); - } - - public cancel(): void { - this.modalInstance.dismiss(); - } -} - -const TableExportModalComponent: VeComponentOptions = { - selector: 'tableExport', - template: ` - - - - - - - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: TableExportModalController, -}; - -veApp.component(TableExportModalComponent.selector, TableExportModalComponent); diff --git a/src/ve-app/main/modals/working-modal.component.ts b/src/ve-app/main/modals/working-modal.component.ts deleted file mode 100644 index 30b2e54de..000000000 --- a/src/ve-app/main/modals/working-modal.component.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { VeModalControllerImpl } from '@ve-utils/modals/ve-modal.controller'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { VeModalController, VeModalResolve, VeModalResolveFn } from '@ve-types/view-editor'; - -export interface WorkingTimeObject { - startTime: Date; -} - -export interface WorkingTimeModalResolveFn extends VeModalResolveFn { - getWorkingTime(): WorkingTimeObject; -} - -interface WorkingTimeModalResolve extends VeModalResolve { - getWorkingTime: WorkingTimeObject; -} - -const WorkingModalComponent: VeComponentOptions = { - selector: 'workingModal', - template: ` - - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: class WorkingModalController - extends VeModalControllerImpl - implements VeModalController - { - public workingTime; - - $onInit(): void { - this.workingTime = this.resolve.getWorkingTime; - } - }, -}; - -veApp.component(WorkingModalComponent.selector, WorkingModalComponent); diff --git a/src/ve-app/main/services/AppUtils.service.ts b/src/ve-app/main/services/AppUtils.service.ts deleted file mode 100644 index fba969bdc..000000000 --- a/src/ve-app/main/services/AppUtils.service.ts +++ /dev/null @@ -1,462 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import angular from 'angular'; - -import { PrintConfirmResult, PrintModalResolveFn } from '@ve-app/main/modals/print-confirm-modal.component'; -import { TableExportModalResolveFn } from '@ve-app/main/modals/table-export-modal.component'; -import { Table2CSVService } from '@ve-components/presentations/services/Table2CSV.service'; -import { TreeService } from '@ve-components/trees'; -import { UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { RefObject, ViewObject } from '@ve-types/mms'; -import { VeModalService, VeModalSettings } from '@ve-types/view-editor'; - -export interface DocumentStructure { - cover: string; - contents: string; - tot: string; - toc: string; - tof: string; - toe: string; -} - -/** - * @ngdoc service - * @name AppUtilsService - * * Utilities - */ -export class AppUtilsService implements angular.Injectable { - static $inject = [ - '$q', - '$uibModal', - '$timeout', - '$location', - '$window', - 'growl', - '$filter', - '$state', - 'ElementService', - 'ViewService', - 'UtilsService', - 'EventService', - 'TreeService', - ]; - constructor( - private $q: VeQService, - private $uibModal: VeModalService, - private $timeout: angular.ITimeoutService, - private $location: angular.ILocationService, - private $window: angular.IWindowService, - private growl: angular.growl.IGrowlService, - private $filter: angular.IFilterService, - private $state: StateService, - private elementSvc: ElementService, - private viewSvc: ViewService, - private utilsSvc: UtilsService, - private eventSvc: EventService, - private treeSvc: TreeService - ) {} - - public tableToCsv = (tables: JQLite, isDoc: boolean): void => { - //Export to CSV button Pop-up Generated Here - const modalInstance = this.$uibModal.open({ - component: 'tableExport', - resolve: { - type: () => { - return isDoc ? 'DOCUMENT' : 'VIEW'; - }, - }, - backdrop: 'static', - keyboard: false, - }); - - const string = ` - - -`; - - void modalInstance.result.then((data) => { - if (data === 'export') { - const tableCSV: { caption: string; val: string }[] = []; - // Grab all tables and run export to csv fnc - tables.find('table').each((index: number, elt: HTMLTableElement) => { - const tableObj = { - caption: 'no caption', - val: Table2CSVService.export(angular.element(elt), { delivery: 'value' }), - }; - if (elt.caption) { - tableObj.caption = elt.caption.innerHTML; - } - tableCSV.push(tableObj); - }); - const exportPopup = (data: string): void => { - const generator = window.open('', 'csv', 'height=600,width=800,scrollbars=1'); - if (generator) { - generator.document.write('Tables to CSV'); - generator.document.write(''); - generator.document.write(data); - generator.document.write(''); - generator.document.close(); - } else { - this.growl.error('Popup Window Failed to open. Allow popups and try again'); - } - //return true - }; - // generate text area content for popup - let genTextArea = string; - let num = 0; - tableCSV.forEach((element: { caption: string; val: string }) => { - genTextArea += ` -

    ${element.caption}

    -
    - -`; - num++; - }); - exportPopup(genTextArea); - } - }); - }; - - /** - * @name veApp.AppUtilsService#printModal - * Click handler for print and export buttons. Opens modal or print - * confirmation and options to select from - * - * @param {JQLite} printElement current angular.element - * @param {Object} viewOrDocOb current document or view object - * @param {Object} refOb current branch/tag object - * @param {Boolean} isDoc viewOrDocOb is view or doc - * @param {Number} mode 1 = print, 2 = word, 3 = pdf - * @returns {Promise} The promise returned from this.utilsSvc.exportHtmlAs - server response - * - */ - public printModal( - printElement: JQLite, - viewOrDocOb: ViewObject, - refOb: RefObject, - isDoc: boolean, - mode: number - ): VePromise { - const deferred = this.$q.defer(); - const settings: VeModalSettings = { - component: 'printConfirmModal', - resolve: { - print: () => { - return printElement; - }, - refOb: () => { - return refOb; - }, - viewOrDocOb: () => { - return viewOrDocOb; - }, - isDoc: () => { - return isDoc; - }, - mode: () => { - return mode; - }, - }, - backdrop: 'static', - keyboard: false, - }; - const modalInstance = this.$uibModal.open(settings); - /* choice: - ['ok', $scope.model.genTotf, $scope.model.htmlTotf, $scope.model.landscape, $scope.meta] - [0] 'ok' - modal button to confirm print/export - [1] Generate List of Tables and Figures option - [2] HTML option checked - used to generate ToC from html - [3] Landscape option - [4] metadata: - bottom, bottom-left, bottom-right, top, top-left, top-right - [5] customization: CSS String || false - */ - void modalInstance.result.then((choice) => { - if (choice.status === 'ok') { - const result = this.printOrGenerate( - viewOrDocOb, - mode, - isDoc, - choice.model.genTotf, - choice.model.htmlTotf - ); - const css = choice.customization - ? choice.customCSS - : this.utilsSvc.getPrintCss(choice.model.htmlTotf, choice.model.landscape, choice.meta); - result.toe = choice.model.htmlTotf ? '' : result.toe; - if (mode === 1) { - const popupWin = this.$window.open( - 'about:blank', - '_blank', - 'width=800,height=600,scrollbars=1,status=1,toolbar=1,menubar=1' - ); - if (popupWin) { - const popup: Window = popupWin; - popup.document.open(); - popup.document.write(` - - - ${viewOrDocOb.name} - - - - ${result.cover} - ${result.toc} - ${result.tot} - ${result.tof} - ${result.toe} - ${result.contents} - - -`); - popup.document.close(); - void this.$timeout( - () => { - popup.print(); - }, - 1000, - false - ); - } else { - this.growl.error('Popup Window Failed to open. Allow popups and try again'); - } - } else { - result.tof = choice.model.genTotf ? result.tof + result.toe : ''; - result.tot = choice.model.genTotf ? result.tot : ''; - const htmlArr = [ - '' + viewOrDocOb.name + '', - result.cover, - ]; - if (result.toc != '') htmlArr.push(result.toc); - if (result.tot != '') htmlArr.push(result.tot); - if (result.tof != '') htmlArr.push(result.tof); - htmlArr.push(result.contents, ''); - const htmlString = htmlArr.join(''); - this.growl.info('Generating, please wait...', { ttl: -1 }); - this.utilsSvc - .exportHtmlAs(mode, { - htmlString: htmlString, - name: viewOrDocOb.name, - projectId: viewOrDocOb._projectId, - refId: viewOrDocOb._refId, - css: css, - }) - .then( - () => { - this.growl.success('File Downloaded', { ttl: -1 }); - deferred.resolve(); - }, - (reason) => { - this.growl.error('Generation Failed'); - deferred.reject(reason); - } - ); - } - } else { - void this.$state.go('main.project.ref.view.present.document', { - display: 'document', - keywords: undefined, - }); - deferred.reject({ message: 'User Cancelled' }); - } - }); - return deferred.promise; - } - - /** - * @name veApp.AppUtilsService#printOrGenerate - * Called by printModal to handle cleanup and building content needed for - * print, PDF or word export. - * Cleansup html i.e. removes no-print, ng-hide - * - * @param {Object} viewOrDocOb current document or view object - * @param {Number} mode 1 = print, 2 = word, 3 = pdf - * @param {Boolean} isDoc viewOrDocOb is view or doc - * @param {Boolean} genTotf whether to gen table of figures and tables (option from the modal form) - * @param {Boolean} htmlTotf include DocGen generated tables and rapid tables (option from the modal form) - * @returns {Object} Returns object with content needed for print/word export/PDF generation - *
    -     * {
    -     *      cover: cover page html,
    -     *      contents: main content html,
    -     *      toc: table of contents html,
    -     *      tof: table of figures html,
    -     *      tot: table of tables html,
    -     *      toe: table of equations html
    -     * }
    -     * 
    - */ - public printOrGenerate = ( - viewOrDocOb: ViewObject, - mode: number, - isDoc: boolean, - genTotf: boolean, - htmlTotf: boolean - ): DocumentStructure => { - let printContents = ''; - let printElementCopy = angular.element('#print-div'); - - // Conversion of canvas to its dataUrl must be done before "clone", because "clone" doesn't preserve - // canvas' content - const mapping = this._storeTomsawyerDiagramAsImg(printElementCopy); - printElementCopy = printElementCopy.clone(); - this._replaceMmsTsDiagramWithImg(printElementCopy, mapping); - - const hostname = this.$location.host(); - const port = this.$location.port(); - const protocol = this.$location.protocol(); - const absurl = this.$location.absUrl(); - const prefix = protocol + ':// hostname' + (port == 80 || port == 443 ? '' : `:${port}`); - const mmsIndex = absurl.indexOf('index.html'); - let toc = this.utilsSvc.makeHtmlTOC(this.treeSvc.getTreeData()[0]); - - // Conver to proper links for word/pdf - this.utilsSvc.convertViewLinks(printElementCopy); - - // Get correct table/image numbering based on doc hierarchy - const tableAndFigTOC = this.utilsSvc.makeTablesAndFiguresTOC( - this.treeSvc.getTreeData()[0], - printElementCopy, - false, - htmlTotf - ); - let tof = tableAndFigTOC.figures; - let tot = tableAndFigTOC.tables; - let toe = tableAndFigTOC.equations; - - // Customize TOC based on user choice - if (!isDoc) { - toc = tof = tot = toe = ''; - } - if (!genTotf) { - tof = tot = toe = ''; - } - angular - .element(printElementCopy) - .find('a') - .attr('href', (index, old) => { - if (!old) return old; - if (old.indexOf('/') === 0) return prefix + old; - if (old.indexOf('../../') === 0) return prefix + old.substring(5); - if (old.indexOf('../') === 0) return prefix + '/alfresco' + old.substring(2); - if (old.indexOf('mms.html') === 0) return absurl.substring(0, mmsIndex) + old; - return old; - }); - - // Remove comments, table features, and all elements with classes: ve-error, no-print, ng-hide - printElementCopy.find('transclude-com').remove(); - printElementCopy.find('style').remove(); //prevent user inserted styles from interfering - printElementCopy.find('div.tableSearch').remove(); - //printElementCopy.find('.ve-error').html('error'); - printElementCopy.find('.no-print').remove(); - printElementCopy.find('.ng-hide').remove(); - - // word doesn't support svg only png. - if (mode === 2) { - printElementCopy.find('.mms-svg').remove(); - } else { - printElementCopy.find('.mms-png').remove(); - } - // Remove all empty paragraphs - printElementCopy.find('p:empty').remove(); - printElementCopy.find('p').each((index, element) => { - const $this = $(element); - if ($this.html().replace(/\s| /g, '').length === 0) { - $this.remove(); - } - }); - printElementCopy.find('[width]').not('img').not('.ve-fixed-width').removeAttr('width'); - printElementCopy - .find('[style]') - .not('hr') - .each((index, element) => { - element.style.removeProperty('font-size'); - element.style.removeProperty('width'); - element.style.removeProperty('min-width'); - element.style.removeProperty('height'); - //remove frozen headers and column - element.style.removeProperty('transform'); - element.style.removeProperty('will-change'); - }); - printElementCopy.find('.math').remove(); //this won't work in chrome for popups since chrome can't display mathml - printElementCopy.find('script').remove(); - //printElementCopy.find('.MJX_Assistive_MathML').remove(); //pdf generation need mathml version - - // Get doc cover page by doc ID - let coverHtml = ''; - if (isDoc) { - const cover = printElementCopy.find("view[mms-element-id='" + viewOrDocOb.id + "']"); - cover.remove(); - // Add class to style cover page - cover.addClass('ve-cover-page'); - coverHtml = cover[0].outerHTML; - } - printContents = printElementCopy[0].outerHTML; - - return { - cover: coverHtml, - contents: printContents, - toc: toc, - tof: tof, - tot: tot, - toe: toe, - }; - }; - - /** Store all tomsawyer diagram(canvas) as an img element **/ - private _storeTomsawyerDiagramAsImg(originalDom: JQuery): JQuery[] { - const mapping: JQuery[] = []; - originalDom.find('mms-ts-diagram').each((index, element) => { - const tsDom = $(element); - const canvas = tsDom.find('canvas')[0]; - if (canvas) { - const imgElement = $(''); - imgElement.attr({ src: canvas.toDataURL(), width: '100%' }); - mapping[index] = imgElement; - } - }); - return mapping; - } - - /** Replace all mms-ts-diagram elements with their corresponding img elements **/ - private _replaceMmsTsDiagramWithImg(element: JQuery, mapping: JQuery[]): void { - element.find('mms-ts-diagram').each((index) => { - const imgDom = mapping[index]; - $(this).replaceWith(imgDom); - }); - } -} - -veApp.service('AppUtilsService', AppUtilsService); diff --git a/src/ve-app/main/services/FullDocument.service.ts b/src/ve-app/main/services/FullDocument.service.ts deleted file mode 100644 index d1fbdecc7..000000000 --- a/src/ve-app/main/services/FullDocument.service.ts +++ /dev/null @@ -1,210 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; - -import { ViewData } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { TreeBranch } from '@ve-types/tree'; - -export class FullDocumentApi { - public viewsBuffer: ViewData[] = []; - public views: ViewData[] = []; - - private _isLoadingRemaingViews: boolean = false; - _isFullDocFullyLoaded: boolean = false; - _loadingRemainingViewsMessage: angular.growl.IGrowlMessage; - - constructor( - private $timeout: angular.ITimeoutService, - private $interval: angular.IIntervalService, - private $http: angular.IHttpService, - private growl: angular.growl.IGrowlService - ) {} - - public handleClickOnBranch = (viewId: string, callback: () => void): boolean => { - const isViewLoadedBefore = this._loadViewsUntilViewWith(viewId); // load some views if necessary - if (isViewLoadedBefore) { - callback(); - } else { - const message = this.growl.info('Loading more views!', { ttl: -1 }); - this._waitTillAfterDigestCycle(() => { - // wait for digest to finish and for content to finish rendering - message.destroy(); - callback(); - }); - } - return isViewLoadedBefore; - }; - - public loadRemainingViews = (callback?: () => void): void => { - if (this._isFullDocFullyLoaded && callback) { - callback(); - } else { - let handler: angular.IPromise; - if (!this._loadingRemainingViewsMessage) { - this._loadingRemainingViewsMessage = this.growl.info('Loading more views!', { - ttl: -1, - onclose: () => { - delete this._loadingRemainingViewsMessage; - }, - }); - } - if (!this._isLoadingRemaingViews) { - this._isLoadingRemaingViews = true; - handler = this.$interval(() => { - let nextIndex = this.viewsBuffer.length + 9; - if (nextIndex >= this.views.length) { - nextIndex = this.views.length - 1; - } - this._pushNewViewsToBuffer(this.viewsBuffer.length, nextIndex); - if (nextIndex === this.views.length - 1) { - this.$interval.cancel(handler); - this._waitTillAfterDigestCycle(() => { - callback(); - this._isLoadingRemaingViews = false; - if (this._loadingRemainingViewsMessage) { - this._loadingRemainingViewsMessage.destroy(); - delete this._loadingRemainingViewsMessage; - } - }); - } - }, 1000); - } - } - }; - - public handleDocumentScrolling = (): boolean => { - return this._pushNewViewsToBuffer(this.viewsBuffer.length, this.viewsBuffer.length); - }; - - public addInitialViews = (isScrollbarVisible: () => boolean): void => { - const message = this.growl.info('Loading initial view!', { ttl: -1 }); - const destroyMessage = (): void => { - message.destroy(); - }; - this._incrementallyAddViewTillScroll(destroyMessage, isScrollbarVisible); - }; - - public handleViewAdd = (view: ViewData, prevSiblingViewId: string): void => { - // load the new view into the original views right after its sibling - const siblingIndex = this._findViewFromOriginalViews(prevSiblingViewId); - this.views.splice(siblingIndex + 1, 0, view); - - // load the new view into the viewsBuffer - const siblingIndexFromLoadedViews = this._findViewFromLoadedViews(prevSiblingViewId); - if (siblingIndexFromLoadedViews === -1) { - // load all views up until the sibling view plus the new view - this._pushNewViewsToBuffer(this.viewsBuffer.length, siblingIndex + 1); - } else { - // load the new view right after its sibling - this._addNewViewToBufferAt(siblingIndexFromLoadedViews + 1); - } - }; - - public handleViewDelete = (deletedBranch: TreeBranch): void => { - const viewIdsToDelete: string[] = []; - this._getAllViewsStartingAt(deletedBranch, viewIdsToDelete); - this._deleteViewsFrom(this.views, viewIdsToDelete); - this._deleteViewsFrom(this.viewsBuffer, viewIdsToDelete); - }; - - private _addNewViewToBufferAt = (index: number): void => { - this.viewsBuffer.splice(index, 0, this.viewsBuffer[index]); - }; - - private _pushNewViewsToBuffer = (startIndex: number, endIndex: number): boolean => { - let isLoadedBefore = true; - if (startIndex < this.views.length && endIndex < this.views.length) { - Array.prototype.push.apply(this.viewsBuffer, this.views.slice(startIndex, endIndex + 1)); - isLoadedBefore = false; - if (endIndex === this.views.length - 1) { - this._waitTillAfterDigestCycle(() => { - this._isFullDocFullyLoaded = true; - }); - } - } - return isLoadedBefore; - }; - - private _loadViewsUntilViewWith = (viewId: string): boolean => { - let isViewLoadedBefore = true; - // if not, find the index of that view and load starting from lastLoadedViewIndex till that view + 1 - if (this._findViewFromLoadedViews(viewId) === -1) { - const index = this._findViewFromOriginalViews(viewId); - if (index !== -1) { - this._pushNewViewsToBuffer(this.viewsBuffer.length, index); - } - isViewLoadedBefore = false; - } - return isViewLoadedBefore; - }; - - private _incrementallyAddViewTillScroll = (callback: () => void, isScrollbarVisible: () => boolean): void => { - const isNoMoreToLoad = this._pushNewViewsToBuffer(this.viewsBuffer.length, this.viewsBuffer.length); - this._waitTillAfterDigestCycle(() => { - //const isScrollBarVisible = isScrollbarVisible() - // the scrollbar logic no longer work, error in pane, just load a view and stop - const isScrollBarVisible = true; - if (isScrollBarVisible || isNoMoreToLoad) { - callback(); - } else { - this._incrementallyAddViewTillScroll(callback, isScrollbarVisible); - } - }); - }; - - private _getAllViewsStartingAt(branch: TreeBranch, results: string[]): void { - if (branch.type === 'view') { - results.push(branch.data.id); - branch.children.forEach((childBranch) => { - this._getAllViewsStartingAt(childBranch, results); - }); - } - } - - private _deleteViewsFrom(viewListToDeleteFrom: ViewData[], viewIdsToDelete: string[]): void { - _.remove(viewListToDeleteFrom, (view: ViewData) => { - return viewIdsToDelete.indexOf(view.id) !== -1; - }); - } - - private _findViewFromLoadedViews = (viewId: string): number => { - return _.findIndex(this.viewsBuffer, { id: viewId }); - }; - - private _findViewFromOriginalViews = (viewId: string): number => { - return _.findIndex(this.views, { id: viewId }); - }; - - private _waitTillAfterDigestCycle = (callback: () => void): void => { - void this.$timeout(() => { - if (this._isViewsFullyLoaded()) { - callback(); - } else { - this._waitTillAfterDigestCycle(callback); - } - }, 500); - }; - - private _isViewsFullyLoaded = (): boolean => { - return this.$http.pendingRequests.length === 0; - }; -} - -export class FullDocumentService { - static $inject = ['$timeout', '$interval', '$http', 'growl']; - - constructor( - private $timeout: angular.ITimeoutService, - private $interval: angular.IIntervalService, - private $http: angular.IHttpService, - private growl: angular.growl.IGrowlService - ) {} - - get(): FullDocumentApi { - return new FullDocumentApi(this.$timeout, this.$interval, this.$http, this.growl); - } -} - -veUtils.service('FullDocumentService', FullDocumentService); diff --git a/src/ve-app/main/services/Resolve.service.ts b/src/ve-app/main/services/Resolve.service.ts deleted file mode 100644 index 9c7db33b6..000000000 --- a/src/ve-app/main/services/Resolve.service.ts +++ /dev/null @@ -1,510 +0,0 @@ -import { UIRouter } from '@uirouter/angularjs'; - -import { BrandingService, BrandingStyle, ShortUrlService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { - AuthService, - ElementService, - PermissionCache, - PermissionsService, - ProjectService, - URLService, - ViewService, -} from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { - CheckAuthResponse, - DocumentObject, - GenericResponse, - GroupObject, - GroupsResponse, - MountObject, - OrgObject, - OrgsResponse, - PackageObject, - ParamsObject, - PermissionsResponse, - ProjectObject, - ProjectsResponse, - RefObject, - RefsResponse, - ViewObject, -} from '@ve-types/mms'; -import { VeStorageService } from '@ve-types/view-editor'; - -export class ResolveService { - static $inject = [ - '$localStorage', - '$q', - 'growl', - '$cookies', - '$uiRouter', - 'ShortUrlService', - 'BrandingService', - 'URLService', - 'AuthService', - 'ProjectService', - 'ViewService', - 'ElementService', - 'PermissionsService', - 'EventService', - ]; - - constructor( - private $localStorage: VeStorageService, - private $q: VeQService, - private growl: angular.growl.IGrowlService, - private $cookies: angular.cookies.ICookiesService, - private $uiRouter: UIRouter, - private shortUrlSvc: ShortUrlService, - private brandingSvc: BrandingService, - private uRLSvc: URLService, - private authSvc: AuthService, - private projectSvc: ProjectService, - private viewSvc: ViewService, - private elementSvc: ElementService, - private permissionsSvc: PermissionsService, - private eventSvc: EventService - ) {} - - public getBanner(params?: ParamsObject): VePromise { - return this.brandingSvc.getBanner(params); - } - - public getLoginBanner(): VePromise { - return this.brandingSvc.getLoginBanner(); - } - - public getFooter(params?: ParamsObject): VePromise { - return this.brandingSvc.getFooter(params); - } - - public getToken(): VePromise { - const deferred = this.$q.defer(); - this.authSvc.checkLogin().then( - (data) => { - this.uRLSvc.setToken(this.$localStorage.token); - deferred.resolve(this.$localStorage.token); - this.$cookies.put('com.tomsawyer.web.license.user', data.username, { path: '/' }); - }, - (rejection) => { - deferred.reject(rejection); - } - ); - return deferred.promise; - } - - public getOrg(projectOb: ProjectObject): VePromise { - const promise = this.projectSvc.getOrg(projectOb.orgId); - promise.then( - (result) => { - this.eventSvc.resolve('mmsOrg', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getOrgs(): VePromise { - const promise = this.projectSvc.getOrgs(); - promise.then( - (result) => { - this.eventSvc.resolve('mmsOrgs', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getProject(params: ParamsObject): VePromise { - const promise = this.projectSvc.getProject(params.projectId); - promise.then( - (result) => { - this.eventSvc.resolve('mmsProject', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getProjects(projectOb: ProjectObject, refresh?: boolean): VePromise { - const promise = this.projectSvc.getProjects(projectOb.orgId, refresh); - promise.then( - (result) => { - this.eventSvc.resolve('mmsProjects', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getProjectMounts(params: ParamsObject, refresh?: boolean): VePromise { - const promise = this.projectSvc.getProjectMounts(params.projectId, params.refId, refresh); - - promise.then( - (result) => { - this.eventSvc.resolve('mmsProject', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getRef(params: ParamsObject): VePromise { - const promise = this.projectSvc.getRef(params.refId, params.projectId); - promise.then( - (result) => { - this.eventSvc.resolve('mmsRef', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getRefs(params: ParamsObject): VePromise { - const promise = this.projectSvc.getRefs(params.projectId); - promise.then( - (result) => { - this.eventSvc.resolve('mmsRefs', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getGroups(params: ParamsObject, refresh?: boolean): VePromise { - return this.$q((resolve, reject) => { - this.projectSvc.getGroups(params.projectId, params.refId, refresh).then( - (result) => { - resolve(result); - this.eventSvc.resolve('mmsGroups', result); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - public getGroup(groupObs: GroupObject[], documentOb: DocumentObject): GroupObject { - let group: GroupObject = null; - if (documentOb) { - for (let i = 0; i < groupObs.length; i++) { - if (groupObs[i].id == documentOb._groupId) { - group = groupObs[i]; - break; - } - } - } - this.eventSvc.resolve('mmsGroup', group); - return group; - } - - public getProjectRoot(params: ParamsObject): VePromise { - return this.elementSvc.getElement({ - projectId: params.projectId, - refId: params.refId, - elementId: params.projectId + '_pm', - }); - } - - public getCoverDocument( - params: ParamsObject, - refOb: RefObject, - projectOb: ProjectObject, - refresh?: boolean - ): VePromise { - const deferred = this.$q.defer(); - const eid = params.projectId + '_cover'; - this.elementSvc - .getElement( - { - projectId: params.projectId, - refId: params.refId, - elementId: eid, - }, - 2, - refresh - ) - .then( - (data) => { - this.eventSvc.resolve('mmsDocument', data); - if (!data._groupId) data._groupId = params.projectId + '_pm'; - deferred.resolve(data); - }, - (reason) => { - if (reason.status === 404) { - if (refOb.type === 'Tag') { - deferred.resolve(null); - } else { - this.viewSvc - .createView( - { - _projectId: params.projectId, - _refId: params.refId, - id: 'holding_bin_' + params.projectId, - }, - { - name: projectOb.name + ' Cover Page', - id: eid, - _projectId: params.projectId, - _refId: params.refId, - documentation: '', - _groupId: params.projectId + '_pm', - } - ) - .then( - (data) => { - this.eventSvc.resolve('mmsDocument', data); - deferred.resolve(data); - }, - (reason2) => { - deferred.resolve(null); - } - ); - } - } else if (reason.status === 410) { - //resurrect - let name = projectOb.name + ' Cover Page '; - try { - name = `${reason.data.deleted[0].name} `; - } catch (e) {} - this.elementSvc - .updateElements([ - { - _projectId: params.projectId, - _refId: params.refId, - id: eid, - name: name, - type: 'Class', - } - ]) - .then( - (data) => { - let resolved = false; - if (data.length > 0) { - data.forEach((e) => { - if (e.id == eid) { - deferred.resolve(e); - resolved = true; - } - }); - } - if (!resolved) { - deferred.resolve(null); - } - }, - () => { - deferred.resolve(null); - } - ); - } else { - deferred.resolve(null); //let user get into project - } - } - ); - return deferred.promise; - } - - public getPreviewDocument(params: ParamsObject, refOb: RefObject, refresh?: boolean): VePromise { - const deferred = this.$q.defer(); - const eid: string = params.preview; - const coverIndex = eid.indexOf('_cover'); - if (coverIndex > 0) { - const groupId = eid.substring(5, coverIndex); - this.elementSvc - .getElement( - { - projectId: params.projectId, - refId: params.refId, - extended: true, - elementId: eid, - }, - 2, - refresh - ) - .then( - (data) => { - this.eventSvc.resolve('mmsDocument', data); - deferred.resolve(data); - }, - (reason) => { - if (reason.status === 404) { - if (refOb.type === 'Tag') { - deferred.resolve(null); - } else { - const viewDoc = - '[cf:group docs]'; - this.elementSvc - .getElement( - { - projectId: params.projectId, - refId: params.refId, - elementId: groupId, - }, - 2, - refresh - ) - .then( - (groupElement) => { - this.viewSvc - .createView( - { - _projectId: params.projectId, - _refId: params.refId, - id: groupId, - }, - { - name: groupElement.name + ' Cover Page', - id: eid, - _projectId: params.projectId, - _refId: params.refId, - type: 'Class', - documentation: viewDoc, - } - ) - .then( - (data) => { - this.eventSvc.resolve('mmsDocument', data); - deferred.resolve(data); - }, - (reason3) => { - deferred.reject(reason); - } - ); - }, - (reason2) => { - deferred.reject(reason2); - } - ); - } - } else { - deferred.reject(reason); - } - } - ); - } else { - this.getProjectDocument(params, refresh).then( - (data) => { - deferred.resolve(data); - }, - (reason) => { - deferred.reject(reason); - } - ); - } - return deferred.promise; - } - - public getProjectDocument(params: ParamsObject, refresh?: boolean): VePromise { - const promise = this.elementSvc.getElement( - { - projectId: params.projectId, - refId: params.refId, - elementId: params.preview ? params.preview : params.documentId, - }, - 2, - refresh - ); - - promise.then( - (result) => { - this.eventSvc.resolve('mmsDocument', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getProjectDocuments( - params: ParamsObject, - refresh?: boolean - ): VePromise> { - return new this.$q((resolve, reject) => { - this.viewSvc - .getProjectDocuments( - { - projectId: params.projectId, - refId: params.refId, - }, - 2, - refresh - ) - .then( - (result) => { - resolve(result); - this.eventSvc.resolve('mmsDocuments', result); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - public getView(params: ParamsObject, refresh?: boolean): VePromise { - const promise = this.elementSvc.getElement( - { - projectId: params.projectId, - refId: params.refId, - elementId: params.viewId, - }, - 2, - refresh - ); - - promise.then( - (result) => { - this.eventSvc.resolve('mmsView', result); - }, - (reason) => { - this.growl.error('Resolve Error: ' + reason.message); - } - ); - return promise; - } - - public getSearch = (params: ParamsObject): string => { - if (params.search === undefined) { - return null; - } - return params.search; - }; - - public getField = (params: ParamsObject): string => { - if (params.field === undefined) { - return 'all'; - } - return params.field; - }; - - public initializePermissions( - projectOb: ProjectObject, - refOb: RefObject - ): VePromise { - return this.permissionsSvc.initializePermissions(projectOb, refOb); - } -} - -veApp.service('ResolveService', ResolveService); diff --git a/src/ve-app/main/services/index.ts b/src/ve-app/main/services/index.ts deleted file mode 100644 index d8eab8020..000000000 --- a/src/ve-app/main/services/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import './AppUtils.service'; -import './Resolve.service'; -import './FullDocument.service'; - -export * from './AppUtils.service'; -export * from './Resolve.service'; -export * from './FullDocument.service'; diff --git a/src/ve-app/pane-center/document.component.ts b/src/ve-app/pane-center/document.component.ts deleted file mode 100644 index 87ebeb7a5..000000000 --- a/src/ve-app/pane-center/document.component.ts +++ /dev/null @@ -1,556 +0,0 @@ -import { IPaneScrollApi } from '@openmbee/pane-layout/lib/components/ng-pane'; -import { HookResult, Ng1Controller, StateService, TransitionService, UIRouterGlobals } from '@uirouter/angularjs'; -import { Transition } from '@uirouter/core'; -import angular, { IComponentController } from 'angular'; -import Rx from 'rx-lite'; - -import { veAppEvents } from '@ve-app/events'; -import { AppUtilsService, FullDocumentApi, FullDocumentService } from '@ve-app/main/services'; -import { pane_center_buttons } from '@ve-app/pane-center/pane-center-buttons.config'; -import { ContentWindowService } from '@ve-app/pane-center/services/ContentWindow.service'; -import { TreeService } from '@ve-components/trees'; -import { IButtonBarButton, ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { veCoreEvents } from '@ve-core/events'; -import { RootScopeService, ShortUrlService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { PermissionsService, ViewData, ViewService, URLService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { DocumentObject, ElementObject, ParamsObject, ProjectObject, RefObject, ViewObject } from '@ve-types/mms'; -import { TreeBranch, View2NodeMap } from '@ve-types/tree'; - -class FullDocumentController implements IComponentController, Ng1Controller { - //Bindings - public mmsView: ViewObject; - public mmsDocument: DocumentObject; - public mmsProject: ProjectObject; - public mmsRef: RefObject; - // - // //Locals - // public document: DocumentObject - // public project: ProjectObject - // public ref: RefObject - - public subs: Rx.IDisposable[]; - bars: string[]; - bbApi: ButtonBarApi; - bbId = 'full-doc'; - fullDocumentApi: FullDocumentApi; - viewContentLoading: boolean; - buttons: IButtonBarButton[] = []; - latestElement: string = ''; - scrollApi: IPaneScrollApi; - views: ViewData[] = []; - viewsBuffer: ViewData[] = []; - view2Children: { [key: string]: string[] } = {}; - view2Node: View2NodeMap = {}; - num = 1; - seenViewIds = {}; - shortUrl: string = ''; - processed: string; - - private dynamicPopover: { - templateUrl: string; - title: string; - }; - - static $inject = [ - '$q', - '$scope', - '$element', - '$state', - '$uiRouterGlobals', - '$transitions', - '$anchorScroll', - '$location', - '$timeout', - '$http', - 'hotkeys', - 'growl', - 'FullDocumentService', - 'ShortUrlService', - 'AppUtilsService', - 'ContentWindowService', - 'URLService', - 'UtilsService', - 'PermissionsService', - 'RootScopeService', - 'ViewService', - 'TreeService', - 'EventService', - 'ButtonBarService', - ]; - constructor( - private $q: VeQService, - private $scope: angular.IScope, - private $element: JQuery, - private $state: StateService, - private $uiRouterGlobals: UIRouterGlobals, - private $transitions: TransitionService, - private $anchorScroll: angular.IAnchorScrollService, - private $location: angular.ILocationService, - private $timeout: angular.ITimeoutService, - private $http: angular.IHttpService, - private hotkeys: angular.hotkeys.HotkeysProvider, - private growl: angular.growl.IGrowlService, - private fullDocumentSvc: FullDocumentService, - private shortUrlSvc: ShortUrlService, - private appUtilsSvc: AppUtilsService, - private contentWindowSvc: ContentWindowService, - private uRLSvc: URLService, - private utilsSvc: UtilsService, - private permissionsSvc: PermissionsService, - private rootScopeSvc: RootScopeService, - private viewSvc: ViewService, - private treeSvc: TreeService, - private eventSvc: EventService, - private buttonBarSvc: ButtonBarService - ) {} - - $onInit(): void { - this.rootScopeSvc.veFullDocMode(true); - this.rootScopeSvc.veHideLeft(false); - this.rootScopeSvc.veHideRight(false); - this.rootScopeSvc.veNumberingOn(true); - this.eventSvc.$init(this); - - //Init/Reset Tree Updated Subject - this.eventSvc.resolve(TreeService.events.UPDATED, false); - - this.bbApi = this.buttonBarSvc.initApi(this.bbId, this.bbInit, pane_center_buttons); - - this.view2Node[this.mmsDocument.id] = { - label: this.mmsDocument.name, - data: this.mmsDocument, - type: 'view', - children: [], - }; - this.view2Children[this.mmsDocument.id] = []; - - // Share URL button settings - this.dynamicPopover = this.shortUrlSvc.dynamicPopover; - - this.shortUrl = this.shortUrlSvc.getShortUrl({ - orgId: this.mmsProject.orgId, - projectId: this.mmsProject.id, - refId: this.mmsRef.id, - documentId: this.mmsDocument.id, - }); - - this.viewContentLoading = this.rootScopeSvc.veViewContentLoading(false); - - this.$transitions.onSuccess({}, (transition) => { - this._scroll(transition.params().viewId as string); - }); - - this.subs.push( - this.eventSvc.binding(this.rootScopeSvc.constants.VEVIEWCONTENTLOADING, (data) => { - this.viewContentLoading = data; - }) - ); - - // api to communicate with borderlayout library, no longer works - this.scrollApi = { - notifyOnScroll: this.notifyOnScroll, - isScrollVisible: (): boolean => { - return false; - }, // pane's directive (in borderlayout) resets this to the right function - throttleRate: 500, // how often should the wheel event triggered - threshold: 3000, // how far from the bottom of the page before adding more views - frequency: 100, // how fast to add more views - }; - - this.subs.push( - this.eventSvc.$on('view.deleted', (deletedBranch: TreeBranch) => { - this.fullDocumentApi.handleViewDelete(deletedBranch); - }) - ); - - this.subs.push( - this.eventSvc.$on('view.added', (data: veAppEvents.viewAddedData) => { - this.fullDocumentApi.handleViewAdd(this._buildViewData(data.vId, data.curSec), data.prevSibId); - this._scroll(data.vId); - this.eventSvc.$broadcast('view.selected'); - }) - ); - - this.subs.push( - // this.eventSvc.$on('view.scroll', (viewId) => { - // this._scroll(viewId) - // }), - this.eventSvc.$on(this.bbId, (data) => { - switch (data.clicked) { - case 'show-comments': - this.bbApi.toggleButton( - 'show-comments', - this.rootScopeSvc.veCommentsOn(!this.rootScopeSvc.veCommentsOn()) - ); - break; - - case 'show-elements': - this.bbApi.toggleButton( - 'show-elements', - this.rootScopeSvc.veElementsOn(!this.rootScopeSvc.veElementsOn()) - ); - if (!this.rootScopeSvc.veElementsOn() && this.rootScopeSvc.veEditMode()) { - this.bbApi.toggleButton('show-edits', false); - this.rootScopeSvc.veEditMode(false); - } - break; - - case 'show-edits': - this.bbApi.toggleButton( - 'show-edits', - this.rootScopeSvc.veEditMode(!this.rootScopeSvc.veEditMode()) - ); - if (this.rootScopeSvc.veElementsOn() !== this.rootScopeSvc.veEditMode()) { - this.bbApi.toggleButton('show-elements', this.rootScopeSvc.veEditMode()); - this.rootScopeSvc.veElementsOn(this.rootScopeSvc.veEditMode()); - } - break; - case 'show-numbering': - this.bbApi.toggleButton( - 'show-numbering', - this.rootScopeSvc.veNumberingOn(!this.rootScopeSvc.veNumberingOn()) - ); - break; - case 'convert-pdf': - this.fullDocumentApi.loadRemainingViews(() => { - void this.appUtilsSvc.printModal( - angular.element('#print-div'), - this.mmsDocument, - this.mmsRef, - true, - 3 - ); - }); - break; - case 'print': - this.fullDocumentApi.loadRemainingViews(() => { - void this.appUtilsSvc.printModal( - angular.element('#print-div'), - this.mmsDocument, - this.mmsRef, - true, - 1 - ); - }); - break; - case 'word': - this.fullDocumentApi.loadRemainingViews(() => { - void this.appUtilsSvc.printModal( - angular.element('#print-div'), - this.mmsDocument, - this.mmsRef, - true, - 2 - ); - }); - break; - - case 'tabletocsv': - this.fullDocumentApi.loadRemainingViews(() => { - this.appUtilsSvc.tableToCsv(angular.element('#print-div'), true); - }); - break; - - case 'refresh-numbering': - this.fullDocumentApi.loadRemainingViews(() => { - this.utilsSvc.makeTablesAndFiguresTOC(this.treeSvc.getFirstBranch(), angular.element('#print-div'), true, false); - }); - break; - } - }) - ); - this.initViews(); - } - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - this.buttonBarSvc.destroy(this.bbId); - } - - initViews(): void { - // Send view to kick off tree compilation - const data: veCoreEvents.elementSelectedData = { - rootId: this.mmsDocument.id, - elementId: this.mmsView ? this.mmsView.id : this.mmsDocument.id, - commitId: 'latest', - projectId: this.mmsProject.id, - refId: this.mmsRef.id, - refType: this.mmsRef.type, - refresh: this.$uiRouterGlobals.transition.$from().name === '', - }; - - this.eventSvc.$broadcast('view.selected', data); - this.fullDocumentApi = this.fullDocumentSvc.get(); - this.views = this.fullDocumentApi.views; - this.viewsBuffer = this.fullDocumentApi.viewsBuffer; - this._createViews().then( - () => { - this.fullDocumentApi.addInitialViews(scrollVisible); - if (this.mmsView && this.mmsView.id !== this.mmsDocument.id) { - this.fullDocumentApi.handleClickOnBranch(this.mmsView.id, () => { - this._scroll(this.mmsView.id); - this.fullDocumentApi.loadRemainingViews(); //remove if scroll works - }); - } else { - this.fullDocumentApi.loadRemainingViews(); //remove if scroll works - } - }, - (reason) => { - this.growl.error(reason.message); - } - ); - const scrollVisible = (): boolean => { - return this.scrollApi.isScrollVisible(); - }; - } - - uiOnParamsChanged(newValues: ParamsObject, $transition$: Transition): void { - if (newValues.viewId !== this.processed) this._scroll(newValues.viewId); - } - uiCanExit(transition: Transition): HookResult { - //Do nothing - } - public bbInit = (api: ButtonBarApi): void => { - if ( - this.mmsDocument && - this.mmsRef.type === 'Branch' && - this.permissionsSvc.hasBranchEditPermission(this.mmsProject.id, this.mmsRef.id) - ) { - api.addButton(this.buttonBarSvc.getButtonBarButton('show-edits')); - api.toggleButton('show-edits', this.rootScopeSvc.veEditMode()); - - this.hotkeys.bindTo(this.$scope).add({ - combo: 'alt+d', - description: 'toggle edit mode', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'show-edits', - }); - }, - }); - } - - api.addButton(this.buttonBarSvc.getButtonBarButton('show-elements')); - api.toggleButton('show-elements', this.rootScopeSvc.veElementsOn()); - api.addButton(this.buttonBarSvc.getButtonBarButton('show-comments')); - api.toggleButton('show-comments', this.rootScopeSvc.veCommentsOn()); - api.addButton(this.buttonBarSvc.getButtonBarButton('show-numbering')); - api.toggleButton('show-numbering', this.rootScopeSvc.veNumberingOn()); - api.addButton(this.buttonBarSvc.getButtonBarButton('refresh-numbering')); - api.addButton(this.buttonBarSvc.getButtonBarButton('print')); - api.addButton(this.buttonBarSvc.getButtonBarButton('export')); - - this.hotkeys - .bindTo(this.$scope) - .add({ - combo: 'alt+c', - description: 'toggle show comments', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'show-comments', - }); - }, - }) - .add({ - combo: 'alt+e', - description: 'toggle show elements', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'show-elements', - }); - }, - }); - }; - - private _scroll = (viewId: string): void => { - if (this.view2Children[viewId]) { - const data = { - rootId: this.$state.includes('**.portal.**') ? null : this.mmsDocument.id, - elementId: viewId, - commitId: 'latest', - projectId: this.mmsProject.id, - refId: this.mmsRef.id, - refType: this.mmsRef.type, - }; - - this.eventSvc.$broadcast('element.selected', data); - if (viewId === this.processed) return; - this.processed = viewId; - this.fullDocumentApi.handleClickOnBranch(viewId, () => { - document.getElementById(viewId).scrollIntoView(true); - }); - } - }; - - private _createViews = (): VePromise => { - const message = this._loadingViewsFromServer(); - return new this.$q((resolve, reject) => { - this.views.push({ - id: this.mmsDocument.id, - api: { - elementTranscluded: this._elementTranscluded, - elementClicked: this._elementClicked, - }, - }); - if (!this.mmsDocument._childViews) { - this.mmsDocument._childViews = []; - } - this.viewSvc - .handleChildViews( - this.mmsDocument, - 'composite', - undefined, - this.mmsProject.id, - this.mmsRef.id, - this.view2Node, - this._handleSingleView - ) - .then((childIds: string[]) => { - for (let i = 0; i < childIds.length; i++) { - this._constructViews(childIds[i], this.num.toString(10)); - this.num = this.num + 1; - } - resolve(); - }, reject) - .finally(() => { - message.destroy(); - }); - }); - }; - - private _loadingViewsFromServer = (): angular.growl.IGrowlMessage => { - return this.growl.info('Loading data from server!', { ttl: -1 }); - }; - - private _elementTranscluded = (elementOb: ElementObject, type: string): void => { - if (elementOb && type !== 'Comment') { - if (elementOb._modified && elementOb._modified > this.latestElement) - this.latestElement = elementOb._modified; - } - }; - - private _elementClicked = (elementOb: ElementObject): void => { - const data = { - rootOb: this.$state.includes('**.portal.**') ? null : this.mmsDocument.id, - elementId: elementOb.id, - projectId: elementOb._projectId, - refId: elementOb._refId, - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - }; - - private _buildViewData = (vId: string, curSec: string): ViewData => { - return { - id: vId, - api: { - elementTranscluded: this._elementTranscluded, - elementClicked: this._elementClicked, - }, - number: curSec, - topLevel: curSec ? curSec.toString().indexOf('.') === -1 : false, - first: curSec == '1', - }; - }; - - private _constructViews = (viewId: string, curSection: string): void => { - this.views.push(this._buildViewData(viewId, curSection)); - - if (this.view2Children[viewId] && Array.isArray(this.view2Children[viewId])) { - let num = 1; - const childIds = this.view2Children[viewId]; - for (let i = 0; i < childIds.length; i++) { - this._constructViews(this.view2Children[viewId][i], `${curSection}.${num}`); - num = num + 1; - } - } - }; - - private _handleSingleView = (v: ViewObject, aggr: string): string[] => { - let childIds = this.view2Children[v.id]; - if (!childIds) { - childIds = []; - } - this.view2Children[v.id] = childIds; - if (!v._childViews || v._childViews.length === 0 || aggr === 'none') { - return childIds; - } - for (let i = 0; i < v._childViews.length; i++) { - if (this.seenViewIds[v._childViews[i].id]) { - continue; - } - this.seenViewIds[v._childViews[i].id] = true; - childIds.push(v._childViews[i].id); - } - return childIds; - }; - - public notifyOnScroll = (): boolean => { - return this.fullDocumentApi.handleDocumentScrolling(); - }; - - public copyToClipboard = ($event: JQuery.ClickEvent): void => { - this.shortUrlSvc.copyToClipboard(this.$element, $event).then( - () => { - this.growl.info('Copied to clipboard!', { ttl: 2000 }); - }, - (err) => { - this.growl.error('Unable to copy: ' + err.message); - } - ); - }; -} - -/* Controller */ -const DocumentComponent: VeComponentOptions = { - selector: 'document', - template: ` -
    - -
    - -
    - -
    -
    -
    - - -
    - Tags are read only: Switch to a branch to edit -
    -
    Document Last Modified: {{ $ctrl.latestElement | date:'M/d/yy h:mm a' }}
    - -
    -
    - - -`, - bindings: { - mmsProject: '<', - mmsRef: '<', - mmsView: '<', - mmsDocument: '<', - }, - controller: FullDocumentController, -}; - -veApp.component(DocumentComponent.selector, DocumentComponent); diff --git a/src/ve-app/pane-center/index.ts b/src/ve-app/pane-center/index.ts deleted file mode 100644 index cddc45cdc..000000000 --- a/src/ve-app/pane-center/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import './services/ContentWindow.service'; - -import './document.component'; -import './slideshow.component'; -import './search.component'; -import './refs.component'; -import './reorder.component'; -import './reorder-group.component'; diff --git a/src/ve-app/pane-center/pane-center-buttons.config.ts b/src/ve-app/pane-center/pane-center-buttons.config.ts deleted file mode 100644 index ca370ccb8..000000000 --- a/src/ve-app/pane-center/pane-center-buttons.config.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { IButtonBarButton } from '@ve-core/button-bar'; - -export const pane_center_buttons: IButtonBarButton[] = [ - { - id: 'show-edits', - icon: 'fa-regular fa-pen-to-square', - selectable: false, - tooltip: 'Enable Edits (alt + d)', - toggle: { - tooltip: 'Disable Edits (alt + d)', - }, - }, - { - id: 'show-elements', - icon: 'fa-brands fa-codepen', - selectable: false, - tooltip: 'Show Elements (alt + e)', - toggle: { - tooltip: 'Hide Elements (alt + e)', - }, - }, - { - id: 'show-comments', - icon: 'fa-regular fa-comment', - selectable: false, - tooltip: 'Show Comments (alt + c)', - toggle: { - tooltip: 'Hide Comments (alt + c)', - }, - }, - { - id: 'show-numbering', - icon: 'fa-solid fa-list-ol', - selectable: false, - tooltip: 'Show Numbering', - toggle: { - tooltip: 'Hide Numbering', - }, - }, - { - id: 'refresh-numbering', - icon: 'fa-solid fa-sort-numeric-asc', - selectable: false, - tooltip: 'Refresh Figure Numbering', - }, - { - id: 'share-url', - icon: 'fa-solid fa-arrow-up-right-from-square', - selectable: false, - tooltip: 'Share Short URL', - }, - { - id: 'center-previous', - icon: 'fa-solid fa-chevron-left', - selectable: false, - tooltip: 'Previous (alt + ,)', - }, - { - id: 'center-next', - icon: 'fa-solid fa-chevron-right', - selectable: false, - tooltip: 'Next (alt + .)', - }, - { - id: 'export', - icon: 'fa-solid fa-download', - selectable: false, - tooltip: 'Export', - button_content: 'Export', - toggle: true, - dropdown: { - ids: ['convert-pdf', 'word', 'tabletocsv'], - icon: 'fa-solid fa-caret-down', - toggle_icon: 'fa-solid fa-caret-up', - }, - }, - { - id: 'print', - icon: 'fa-solid fa-print', - selectable: false, - tooltip: 'Print', - }, - { - id: 'convert-pdf', - icon: 'fa-regular fa-file-pdf', - selectable: false, - tooltip: 'Export to PDF', - }, - { - id: 'word', - icon: 'fa-regular fa-file-word', - selectable: false, - tooltip: 'Export to Word', - }, - { - id: 'tabletocsv', - icon: 'fa-solid fa-table', - selectable: false, - tooltip: 'Table to CSV', - }, -]; diff --git a/src/ve-app/pane-center/refs.component.ts b/src/ve-app/pane-center/refs.component.ts deleted file mode 100644 index 39cf1eb22..000000000 --- a/src/ve-app/pane-center/refs.component.ts +++ /dev/null @@ -1,358 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import angular, { IWindowService } from 'angular'; -import _ from 'lodash'; -import Rx from 'rx-lite'; - -import { AppUtilsService } from '@ve-app/main/services'; -import { ContentWindowService } from '@ve-app/pane-center/services/ContentWindow.service'; -import { InsertRefData } from '@ve-components/insertions/components/insert-ref.component'; -import { ConfirmDeleteModalResolveFn } from '@ve-core/modals'; -import { ApplicationService, RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ProjectService, ElementService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; -import { InsertResolveFn } from '@ve-types/components'; -import { ProjectObject, RefObject } from '@ve-types/mms'; -import { VeModalService, VeModalSettings } from '@ve-types/view-editor'; - -class RefsController { - static $inject = [ - '$sce', - '$q', - '$filter', - '$location', - '$uibModal', - '$state', - '$timeout', - '$window', - 'growl', - 'ElementService', - 'ProjectService', - 'AppUtilsService', - 'ContentWindowService', - 'ApplicationService', - 'RootScopeService', - 'EventService', - ]; - - public subs: Rx.IDisposable[]; - - //Bindings - mmsRefs: RefObject[]; - mmsProject: ProjectObject; - mmsRef: RefObject; - - //Local - public refManageView: boolean; - isLoading: boolean; - refData; - bbApi; - buttons; - project: ProjectObject; - refs: RefObject[]; - branches: RefObject[]; - tags: RefObject[]; - refSelected: RefObject; - search; - view; - htmlTooltip: string; - - constructor( - private $sce: angular.ISCEService, - private $q: VeQService, - private $filter: angular.IFilterService, - private $location: angular.ILocationService, - private $uibModal: VeModalService, - private $state: StateService, - private $timeout: angular.ITimeoutService, - private $window: IWindowService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private projectSvc: ProjectService, - private appUtilsSvc: AppUtilsService, - private contentWindowSvc: ContentWindowService, - private applicationSvc: ApplicationService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - this.contentWindowSvc.toggleLeftPane(true); - this.rootScopeSvc.veHideLeft(true); - this.rootScopeSvc.veHideRight(true); - this.refManageView = true; - this.refData = []; - this.bbApi = {}; - this.buttons = []; - this.refSelected = this.mmsRef; - this.search = null; - this.view = null; - - this.refs = this.mmsRefs; - this.branches = this.refs.filter((ref) => { - return ref.type === 'Branch'; - }); - this.tags = this.refs.filter((ref) => { - return ref.type === 'Tag'; - }); - - this.project = this.mmsProject; - - this.htmlTooltip = this.$sce.trustAsHtml('Branch temporarily unavailable during duplication.') as string; - } - - selectMasterDefault = (): void => { - const masterIndex = _.findIndex(this.refs, { name: 'master' }); - if (masterIndex > -1) { - this.refSelected = this.refs[masterIndex]; - } - }; - - addBranch = (e: JQuery.ClickEvent): void => { - e.stopPropagation(); - this.insert('Branch'); - }; - - addTag = (e: JQuery.ClickEvent): void => { - e.stopPropagation(); - this.insert('Tag'); - }; - - deleteRef = (e: JQuery.ClickEvent): void => { - e.stopPropagation(); - this.deleteItem(); - }; - - refClickHandler = (ref: RefObject): void => { - this.projectSvc.getRef(ref.id, this.project.id).then( - (data) => { - this.refSelected = data; - }, - (error) => { - this.growl.error('Ref click handler error: ' + error.message); - return; - } - ); - }; - - insert = (itemType: string): void => { - const insertData: InsertRefData = { - type: itemType, - parentRefId: '', - parentTitle: '', - insertType: 'ref', - lastCommit: true, - }; - const branch = this.refSelected; - // Item specific setup: - if (itemType === 'Branch') { - if (!branch) { - this.growl.warning('Add Branch Error: Select a branch or tag first'); - return; - } - if (branch.type === 'Tag') { - insertData.parentTitle = 'Tag ' + branch.name; - } else { - insertData.parentTitle = 'Branch ' + branch.name; - } - insertData.parentRefId = branch.id; - } else if (itemType === 'Tag') { - if (!branch) { - this.growl.warning('Add Tag Error: Select a branch or tag first'); - return; - } - insertData.parentRefId = branch.id; - } else { - this.growl.error('Add Item of Type ' + itemType + ' is not supported'); - return; - } - const instance = this.$uibModal.open, RefObject>({ - component: 'insertElementModal', - resolve: { - getInsertData: () => { - return insertData; - }, - getFilter: () => { - return this.$filter; - }, - getProjectId: () => { - return this.project.id; - }, - getRefId: () => { - return null; - }, - getOrgId: () => { - return this.project.orgId; - }, - getSeenViewIds: () => { - return null; - }, - }, - }); - instance.result.then( - (data) => { - if (data.type === 'Branch') { - this.branches.push(data); - this.refSelected = data; - } else { - this.tags.push(data); - this.refSelected = data; - } - }, - (reason?) => { - if (reason && reason.status !== 444) { - this.growl.error('Ref Creation Error:' + reason.message); - } else { - this.growl.info('Ref Creation Cancelled', { - ttl: 1000, - }); - } - } - ); - }; - - deleteItem = (): void => { - const branch = this.refSelected; - if (!branch) { - this.growl.warning('Select item to delete.'); - return; - } - const settings: VeModalSettings = { - component: 'confirmDeleteModal', - resolve: { - getName: () => { - return branch.name; - }, - getType: () => { - if (branch.type === 'Tag') { - return 'Tag'; - } else if (branch.type === 'Branch') { - return 'Branch'; - } - }, - finalize: () => { - return () => { - return this.projectSvc.deleteRef(branch.id, this.project.id); - }; - }, - }, - }; - const instance = this.$uibModal.open(settings); - instance.result.then( - () => { - //TODO $state project with no selected ref - let index: number; - if (this.refSelected.type === 'Branch') { - index = this.branches.indexOf(this.refSelected); - this.branches.splice(index, 1); - } else if (this.refSelected.type === 'Tag') { - index = this.tags.indexOf(this.refSelected); - this.tags.splice(index, 1); - } - this.refSelected = null; - }, - (reason?) => { - if (reason) { - this.growl.error('Ref Deletion Error:' + reason.message); - } else { - this.growl.info('Ref Deletion Cancelled', { - ttl: 1000, - }); - } - } - ); - }; -} - -const RefsComponent: VeComponentOptions = { - selector: 'refs', - template: ` -
    -
    -
    - Back to Project Documents ({{$ctrl.mmsRef.name}}) -

    Manage Project branches/tags

    -
    -
    -
    - -
    -
    -
    -

    {{$ctrl.refSelected.name}}

    -
    - - - -
    - -
    -
    -
    - - -
    Id
    -
    {{$ctrl.refSelected.id}}
    -
    Type
    -
    {{$ctrl.refSelected.type}}
    -
    Description
    -
    {{$ctrl.refSelected.description}}
    - -
    Time Created
    -
    {{$ctrl.refSelected._created}}
    -
    Creator
    -
    {{$ctrl.refSelected._creator}}
    - -
    Parent Ref
    -
    {{$ctrl.refSelected.parentRefId}}
    -
    Parent Commit
    -
    {{$ctrl.refSelected.parentCommitId}}
    -
    -
    -
    -
    -
    -
    -
    -
    -`, - bindings: { - mmsProject: '<', - mmsRef: '<', - mmsRefs: '<', - }, - controller: RefsController, -}; - -veApp.component(RefsComponent.selector, RefsComponent); diff --git a/src/ve-app/pane-center/reorder-group.component.ts b/src/ve-app/pane-center/reorder-group.component.ts deleted file mode 100644 index a5b27d810..000000000 --- a/src/ve-app/pane-center/reorder-group.component.ts +++ /dev/null @@ -1,338 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import { IComponentController } from 'angular'; -import _ from 'lodash'; - -import { TreeService } from '@ve-components/trees'; -import { CacheService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; -import { DocumentObject, ElementObject, GroupObject, ParamsObject, ProjectObject, RefObject } from '@ve-types/mms'; -import { AngularUITree, VeTreeNodeScope } from '@ve-types/tree'; - -interface ReorderGroupNode { - data: GroupObject | DocumentObject; - children: ReorderGroupNode[]; - name: string; - id: string; - type: string; - isChild?: boolean; -} - -interface ReorderGroupResult { - node: ReorderGroupNode; - newOwnerId: string; -} - -class ReorderGroupController implements IComponentController { - params: ParamsObject; - mmsProject: ProjectObject; - mmsRef: RefObject; - mmsGroups: GroupObject[]; - mmsDocuments: DocumentObject[]; - - //Locals - groups: GroupObject[]; - documents: DocumentObject[]; - isSaving = false; - targetId = ''; - - treeOptions: AngularUITree.ICallbacks; - - static $inject = ['$q', '$scope', '$state', 'growl', 'ElementService', 'CacheService', 'TreeService']; - private tree: ReorderGroupNode[]; - - constructor( - private $q: VeQService, - private $scope: angular.IScope, - private $state: StateService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private cacheSvc: CacheService, - private treeSvc: TreeService - ) {} - - $onInit(): void { - this.groups = this.mmsGroups; - this.documents = this.mmsDocuments; - - const children = this.generateTree(); - this.sortRecursively(children); - const root = this.createNode('Top Level', 'root', children, { - id: 'root', - _projectId: this.params.projectId, - _refId: this.params.refId, - }); - this.tree = [root]; - - this.treeOptions = { - dropped: (change): void => { - this.sortRecursively(children); - this.targetId = ''; - }, - accept: (sourceNodeScope: VeTreeNodeScope, destNodeScope: VeTreeNodeScope, destIndex): boolean => { - // allow moving to the root or to a group - const accept = - destNodeScope.node && (destNodeScope.node.type === 'group' || destNodeScope.node.type === 'root'); - if (accept) { - if ( - destNodeScope.$nodeScope && - destNodeScope.$nodeScope.$modelValue && - ( - destNodeScope.$nodeScope.$modelValue as { - id: string; - } - ).id - ) { - this.targetId = ( - destNodeScope.$nodeScope.$modelValue as { - id: string; - } - ).id; - } - } - return accept; - }, - dragStart: (data): void => { - this.targetId = ( - data.dest.nodesScope.$nodeScope.$modelValue as { - id: string; - } - ).id; - }, - }; - } - - public generateTree(): ReorderGroupNode[] { - // create a node for each groupOb - let tree = this.groups.map((groupOb) => { - return this.createNode(groupOb.name, 'group', [], groupOb); - }); - - // add document to its group - this.documents - .filter((documentOb) => { - return documentOb._groupId; - }) - .forEach((documentOb) => { - const parent = _.find(tree, (node) => { - return node.data.id === documentOb._groupId; - }); - if (parent) { - parent.children.push(this.createNode(documentOb.name, 'view', [], documentOb)); - } - }); - - // for any group that has a parent group, establish that connection - tree.forEach((groupNode) => { - const foundParent = _.find(tree, (node) => { - return node.data.id === groupNode.data._parentId; - }); - if (foundParent) { - groupNode.isChild = true; - foundParent.children.push(groupNode); - } - return groupNode; - }); - - // only groups that don't have parents show up at root level - tree = tree.filter((groupNode) => { - return !groupNode.isChild; - }); - - // add all the documents that don't belong to any group - this.documents - .filter((documentOb) => { - return !documentOb._groupId; - }) - .forEach((documentOb) => { - this.tree.push(this.createNode(documentOb.name, 'view', [], documentOb)); - }); - return tree; - } - - public createNode( - name: string, - type: string, - children: ReorderGroupNode[], - data: GroupObject | DocumentObject - ): ReorderGroupNode { - return { - name: name, - type: type, - children: children, - data: data, - id: data.id, - }; - } - - public cancelReorder = (): void => { - this.navigateAway(false); - }; - - public saveReorder = (): void => { - if (!this.isSaving) { - this.isSaving = true; - const results: ReorderGroupResult[] = []; - this.findNodesToUpdate(results); - const elementsToUpdate: ElementObject[] = results.map((result) => { - return { - id: result.node.data.id, - ownerId: result.newOwnerId, - _projectId: this.params.projectId, - _refId: this.params.refId, - type: result.node.data.type, - }; - }); - this.elementSvc - .updateElements(elementsToUpdate, false) - .then(() => { - this.cleanupCache(results); - this.navigateAway(true); - }) - .catch(() => { - this.growl.error('Failed to save the grouping!'); - }) - .finally(() => { - this.isSaving = false; - }); - } else { - this.growl.info('please wait'); - } - }; - - public findNodesToUpdate = (result: ReorderGroupResult[]): void => { - // ignore root - const root = this.tree[0]; - root.children.forEach((node) => { - // handle node change at the root level - if ((node.type === 'group' && node.data._parentId) || (node.type === 'view' && node.data._groupId)) { - result.push({ - node: node, - newOwnerId: 'holding_bin_' + this.params.projectId, - }); - } - - // handle change at lower level - helper(node, result); - }); - - const helper = (node: ReorderGroupNode, result: ReorderGroupResult[]): void => { - node.children.forEach((childNode) => { - if ( - (childNode.type === 'group' && childNode.data._parentId !== node.data.id) || - (childNode.type === 'view' && childNode.data._groupId !== node.data.id) - ) { - result.push({ - node: childNode, - newOwnerId: node.data.id, - }); - } - helper(childNode, result); - }); - }; - }; - - public cleanupCache = (results: ReorderGroupResult[]): void => { - // update cache for documents list and groups list - const listOfDocInCache = this.cacheSvc.get([ - 'documents', - this.params.projectId, - this.params.refId, - ]); - const listOfGroupInCache = this.cacheSvc.get([ - 'groups', - this.params.projectId, - this.params.refId, - ]); - results.forEach((result) => { - // for group or document that is moved to the root, _parentId for "group" and _groupId for "document" need to be set to undefined - const newOwnerId = result.newOwnerId.indexOf(this.params.projectId) !== -1 ? undefined : result.newOwnerId; - - if (result.node.type === 'group') { - const cacheGroupOb = _.find(listOfGroupInCache, (groupOb) => { - return groupOb.id === result.node.data.id; - }); - if (cacheGroupOb) { - cacheGroupOb._parentId = newOwnerId; - } - } else if (result.node.type === 'view') { - const cacheDocument = _.find(listOfDocInCache, (documentOb) => { - return documentOb.id === result.node.data.id; - }); - if (cacheDocument) { - cacheDocument._groupId = newOwnerId; - } - } - }); - }; - - public comparator = (a: ReorderGroupNode, b: ReorderGroupNode): number => { - if (a.type === b.type) { - return a.name.localeCompare(b.name); - } else { - if (a.type === 'group') { - return -1; - } else { - return 1; - } - } - }; - - public sortRecursively = (nodes: ReorderGroupNode[]): void => { - nodes.sort(this.comparator); - nodes.forEach((node) => { - this.sortRecursively(node.children); - }); - }; - - public navigateAway = (reload: boolean): void => { - const curBranch = this.treeSvc.getSelectedBranch(); - if (curBranch) { - const documentId = curBranch.type === 'group' ? 'site_' + curBranch.data.id + '_cover' : curBranch.data.id; - void this.$state.go('main.project.ref.portal.preview', { preview: documentId }, { reload: reload }); - } else { - void this.$state.go('main.project.ref.portal', {}, { reload: reload }); - } - }; -} - -const ReorderGroupComponent: VeComponentOptions = { - selector: 'reorderGroup', - template: ` - -
    - - -
    - - -
    -

    Move group/document to/from a group. Only Grouping is preserved. Ordering is not.

    -
    -
      -
    1. -
    -
    -
    -
    - -`, - bindings: { - mmsGroups: '<', - mmsDocuments: '<', - }, - controller: ReorderGroupController, -}; - -veApp.component(ReorderGroupComponent.selector, ReorderGroupComponent); diff --git a/src/ve-app/pane-center/reorder.component.ts b/src/ve-app/pane-center/reorder.component.ts deleted file mode 100644 index 1a1129372..000000000 --- a/src/ve-app/pane-center/reorder.component.ts +++ /dev/null @@ -1,320 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import angular, { IComponentController } from 'angular'; -import _ from 'lodash'; - -import { AppUtilsService } from '@ve-app/main/services'; -import { TreeService } from '@ve-components/trees'; -import { EventService } from '@ve-utils/core'; -import { ViewService, ElementService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions, VePromise } from '@ve-types/angular'; -import { DocumentObject, ViewObject } from '@ve-types/mms'; -import { AngularUITree, TreeBranch, VeTreeNodeScope, View2NodeMap } from '@ve-types/tree'; - -/* Controllers */ -/** - * @name veApp/ReorderController * Controller for reordering view's in the tree - * - * - * @requires StateService - * @requires growl - * @requires $scope - * @requires veUtils/ElementService - * @requires veUtils/ViewService - * @requires veUtils/AppUtilsService - * @requires veUtils/TreeService - */ -class ReorderController implements IComponentController { - //bindings - private mmsDocument: VePromise; - - //local - protected doc: ViewObject; - private viewIds2node: View2NodeMap = {}; - private origViews: { [key: string]: ViewObject } = {}; - public tree: TreeBranch[]; - public treeOptions: AngularUITree.ICallbacks; - private seenViewIds: View2NodeMap = {}; - public saveClass: string = ''; - private saving: boolean = false; - - //injectables - public subs: Rx.IDisposable[]; - - static $inject = [ - '$state', - '$timeout', - 'growl', - '$scope', - 'ElementService', - 'ViewService', - 'AppUtilsService', - 'TreeService', - 'EventService', - ]; - - constructor( - private $state: StateService, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private $scope: angular.IScope, - private elementSvc: ElementService, - private viewSvc: ViewService, - private appUtilsSvc: AppUtilsService, - private treeSvc: TreeService, - private eventSvc: EventService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - this.mmsDocument.then( - (doc) => { - this.doc = doc; - const name = this.doc.name ? this.doc.name : this.doc.id; - - this.viewIds2node[this.doc.id] = { - label: name, - type: 'view', - data: this.doc, - aggr: 'composite', - children: [], - }; - - this.viewSvc - .handleChildViews( - this.doc, - 'composite', - undefined, - this.doc._projectId, - this.doc._refId, - this.viewIds2node, - this.handleSingleView, - this.handleChildren - ) - .then( - (docNode: TreeBranch) => { - let num = 1; - docNode.children.forEach((node) => { - this.updateNumber(node, `${num}`, 'old'); - this.updateNumber(node, `${num}`, 'new'); - num++; - }); - this.tree = [docNode]; - }, - (reason) => { - this.growl.error('Error Getting Child Views: ' + reason.message); - } - ); - }, - (reason) => { - this.growl.error('Error Getting Child Views: ' + reason.message); - } - ); - - this.subs.push( - this.eventSvc.$on('foobar', () => { - const root = this.tree; - console.log(root); - }) - ); - this.treeOptions = { - dropped: (e): void => { - void this.$timeout(() => { - for (let i = 0; i < this.tree.length; i++) { - const root = this.tree[i]; - root.new = ''; - let num = 1; - for (let j = 0; j < root.children.length; j++) { - this.updateNumber(root.children[j], `${num}`, 'new'); - num++; - } - } - }, 1); - }, - // dragStop: (e) => { - // for (let i = 0; i < this.tree.length; i++) { - // var root = this.tree[i]; - // root.new = ''; - // var num = 1; - // for (var j = 0; j < root.children.length; j++) { - // this.updateNumber(root.children[j], num + '', 'new'); - // num++; - // } - // } - // }, - dragStart: (): void => { - //Do Nothing - }, - accept: (sourceNodeScope: VeTreeNodeScope, destNodeScope: VeTreeNodeScope, destIndex): boolean => { - if (destNodeScope.$element.hasClass('root')) return false; //don't allow moving to outside doc - return destNodeScope.node.aggr != 'none'; - }, - }; - } - - public updateNumber = (node: TreeBranch, curSection: string, key: string): void => { - node[key] = curSection; - let num = 1; - for (let i = 0; i < node.children.length; i++) { - this.updateNumber(node.children[i], `${curSection}.${num}`, key); - num++; - } - }; - - public handleSingleView = (v: ViewObject, aggr: string, propId: string): TreeBranch => { - let curNode: TreeBranch = this.viewIds2node[v.id]; - if (!curNode) { - curNode = { - label: v.name ? v.name : v.id, - data: v, - aggr: aggr, - propertyId: propId, - type: v.type, - children: [], - }; - this.viewIds2node[v.id] = curNode; - } - this.origViews[v.id] = v; - return curNode; - }; - - public handleChildren = (curNode: TreeBranch, childNodes: TreeBranch[]): void => { - const newChildNodes: TreeBranch[] = []; - for (let i = 0; i < childNodes.length; i++) { - const node: TreeBranch = childNodes[i]; - if (this.seenViewIds[node.data.id]) { - return; - } - this.seenViewIds[node.data.id] = node; - newChildNodes.push(node); - } - curNode.children.push(...newChildNodes); - }; - - public save = (): void => { - if (this.saving) { - this.growl.info('please wait'); - return; - } - if (this.tree.length > 1 || this.tree[0].data.id !== this.doc.id) { - this.growl.error('Views cannot be re-ordered outside the context of the current document.'); - return; - } - this.saving = true; - this.saveClass = 'fa fa-spin fa-spinner'; - const toSave: ViewObject[] = []; - for (const [id, node] of Object.entries(this.viewIds2node)) { - if (node.aggr == 'none') { - //cannot process views whose aggr is none since their children are not shown - return; - } - const childViews: ViewObject[] = []; - for (let i = 0; i < node.children.length; i++) { - childViews.push({ - id: node.children[i].data.id, - aggregation: node.children[i].aggr, - propertyId: node.children[i].propertyId, - _projectId: node.data._projectId, - _refId: node.data._refId, - type: node.data.type, - }); - } - const orig = this.origViews[id]; - if ( - ((!orig._childViews || orig._childViews.length === 0) && childViews.length > 0) || - (orig._childViews && !_.isEqual(orig._childViews, childViews)) - ) { - toSave.push({ - id: id, - name: orig.name, - _childViews: childViews, - _projectId: orig._projectId, - _refId: orig._refId, - type: orig.type, - }); - } - } - - if (toSave.length === 0) { - this.growl.info('No changes to save!'); - this.saving = false; - this.saveClass = ''; - return; - } - this.elementSvc - .updateElements(toSave, true) - .then( - () => { - this.growl.success('Reorder Successful'); - this.navigate(true); - }, - (response) => { - const reason = response.data.failedRequests[0]; - const errorMessage = reason.message; - if (reason.status === 409) { - this.growl.error("There's a conflict in the views you're trying to change!"); - } else { - this.growl.error(errorMessage); - } - } - ) - .finally(() => { - this.saveClass = ''; - this.saving = false; - }); - }; - - public cancel = (): void => { - this.navigate(false); - }; - - public navigate = (reload: boolean): void => { - const curBranch = this.treeSvc.getSelectedBranch(); - if (!curBranch) { - void this.$state.go('main.project.ref.view.present', {}, { reload: true }); - } else { - let goToId: string = curBranch.data.id; - if (curBranch.type !== 'section' && curBranch.type !== 'view') { - goToId = curBranch.viewId ? curBranch.viewId : ''; - } - void this.$state.go('main.project.ref.view.present', { viewId: goToId }, { reload: reload }); - } - }; -} - -const ReorderComponent: VeComponentOptions = { - selector: 'reorderDocument', - template: ` - - -
    - - -
    - -

    To reorder text, tables, images, equations, and sections, use the in the right pane.

    -
    -
      -
    1. -
    -
    -
    -`, - bindings: { - mmsDocument: '<', - }, - controller: ReorderController, -}; - -veApp.component(ReorderComponent.selector, ReorderComponent); diff --git a/src/ve-app/pane-center/search.component.ts b/src/ve-app/pane-center/search.component.ts deleted file mode 100644 index c59025b28..000000000 --- a/src/ve-app/pane-center/search.component.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; - -import { ContentWindowService } from '@ve-app/pane-center/services/ContentWindow.service'; -import { veCoreEvents } from '@ve-core/events'; -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject, ParamsObject } from '@ve-types/mms'; -import { VeSearchOptions } from '@ve-types/view-editor'; - -class SearchController { - params: ParamsObject; - - searchContentLoading: boolean = true; - searchOptions: VeSearchOptions; - - static $inject = ['$state', 'ContentWindowService', 'RootScopeService', 'EventService']; - - constructor( - private $state: StateService, - private contentWindowSvc: ContentWindowService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService - ) {} - - $onInit(): void { - this.searchContentLoading = false; - - this.contentWindowSvc.toggleLeftPane(true); - this.rootScopeSvc.veHideLeft(true); - - this.searchOptions = { - emptyDocTxt: 'This field is empty.', - searchInput: this.params.keywords ? this.params.keywords : '', - searchField: this.params.field ? this.params.field : 'name', - getProperties: true, - closeable: true, - callback: (elementOb: ElementObject): void => { - const data = { - elementId: elementOb.id, - projectId: elementOb._projectId, - refId: elementOb._refId, - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - if (typeof this.rootScopeSvc.rightPaneClosed() === 'boolean' && this.rootScopeSvc.rightPaneClosed()) - this.eventSvc.$broadcast('right-pane.toggle', false); - }, - relatedCallback: (doc, view, elem): void => { - //siteId, documentId, viewId) { - void this.$state.go('main.project.ref.view.present', { - projectId: doc._projectId, - documentId: doc.id, - viewId: view.id, - refId: doc._refId, - keywords: undefined, - }); - }, - }; - } -} - -const SearchComponent: VeComponentOptions = { - selector: 'search', - template: ` -
    - - -
    - -
    -
    -
    -`, - bindings: { - params: '<', - keywords: '<', - field: '<', - }, - controller: SearchController, -}; - -veApp.component(SearchComponent.selector, SearchComponent); diff --git a/src/ve-app/pane-center/services/ContentWindow.service.ts b/src/ve-app/pane-center/services/ContentWindow.service.ts deleted file mode 100644 index 37febfe3f..000000000 --- a/src/ve-app/pane-center/services/ContentWindow.service.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veApp } from '@ve-app'; - -export class ContentWindowService { - static $inject = ['RootScopeService', 'EventService']; - - constructor(private rootScopeSvc: RootScopeService, private eventSvc: EventService) {} - public toggleLeftPane = (closed): void => { - if (closed && !this.rootScopeSvc.leftPaneClosed()) { - this.eventSvc.$broadcast('left-pane.toggle', true); - } - - if (!closed && this.rootScopeSvc.leftPaneClosed()) { - this.eventSvc.$broadcast('left-pane.toggle', false); - } - }; -} - -veApp.service('ContentWindowService', ContentWindowService); diff --git a/src/ve-app/pane-center/slideshow.component.ts b/src/ve-app/pane-center/slideshow.component.ts deleted file mode 100644 index 15a8e2a2d..000000000 --- a/src/ve-app/pane-center/slideshow.component.ts +++ /dev/null @@ -1,490 +0,0 @@ -import { HookResult, Ng1Controller, StateService, UIRouterGlobals } from '@uirouter/angularjs'; -import { Transition } from '@uirouter/core'; - -import { AppUtilsService, ResolveService } from '@ve-app/main/services'; -import { pane_center_buttons } from '@ve-app/pane-center/pane-center-buttons.config'; -import { ContentWindowService } from '@ve-app/pane-center/services/ContentWindow.service'; -import { TreeService } from '@ve-components/trees'; -import { ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { veCoreEvents } from '@ve-core/events'; -import { RootScopeService, ShortUrlService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { PermissionsService, URLService, ViewApi } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; -import { - DocumentObject, - ElementObject, - GroupObject, - ParamsObject, - ProjectObject, - RefObject, - ViewObject, -} from '@ve-types/mms'; - -/** - * Note: This controller is intended for navigating between 'views' and 'sections' only. If you wish to navigate between - * other tree object types you will need to create a new one or modify this one to be more generic. - */ -class SlideshowController implements angular.IComponentController, Ng1Controller { - //Bindings - mmsParams: ParamsObject; - mmsProject: ProjectObject; - mmsRef: RefObject; - mmsGroup: GroupObject; - mmsDocument: DocumentObject; - mmsView: ViewObject; - - subs: Rx.IDisposable[]; - vidLink: boolean; - viewContentLoading: boolean; - init: boolean = false; - - public bbApi: ButtonBarApi; - bbId = 'view-ctrl'; - bars: string[] = []; - comments: { - count: number; - lastCommented: string; - lastCommentedBy: string; - map: object; - } = { - count: 0, - lastCommented: null, - lastCommentedBy: '', - map: {}, - }; - dynamicPopover: { templateUrl: string; title: string }; - shortUrl: string; - viewApi: ViewApi; - number: string; - private viewId: string; - private params: ParamsObject; - - static $inject = [ - '$q', - '$scope', - '$state', - '$timeout', - '$window', - '$location', - '$http', - '$element', - '$uiRouterGlobals', - 'growl', - 'hotkeys', - 'AppUtilsService', - 'URLService', - 'UtilsService', - 'ShortUrlService', - 'ContentWindowService', - 'PermissionsService', - 'RootScopeService', - 'ResolveService', - 'TreeService', - 'EventService', - 'ButtonBarService', - ]; - - constructor( - public $q: VeQService, - private $scope: angular.IScope, - private $state: StateService, - private $timeout: angular.ITimeoutService, - private $window: angular.IWindowService, - private $location: angular.ILocationService, - private $http: angular.IHttpService, - private $element: JQuery, - private $uiRouterGlobals: UIRouterGlobals, - private growl: angular.growl.IGrowlService, - private hotkeys: angular.hotkeys.HotkeysProvider, - private appUtilsSvc: AppUtilsService, - private uRLSvc: URLService, - private utilsSvc: UtilsService, - private shortUrlSvc: ShortUrlService, - private contentWindowSvc: ContentWindowService, - private permissionsSvc: PermissionsService, - private rootScopeSvc: RootScopeService, - private resolveSvc: ResolveService, - private treeSvc: TreeService, - public eventSvc: EventService, - private buttonBarSvc: ButtonBarService - ) {} - - $onInit(): void { - this.params = this.mmsParams; - this.rootScopeSvc.veFullDocMode(false); - this.rootScopeSvc.veHideLeft(false); - this.rootScopeSvc.veHideRight(false); - this.eventSvc.$init(this); - - this.bbApi = this.buttonBarSvc.initApi(this.bbId, this.bbInit, pane_center_buttons); - - //Init/Reset Tree Updated Subject - this.eventSvc.resolve(TreeService.events.UPDATED, false); - - this.subs.push( - this.eventSvc.binding(this.rootScopeSvc.constants.VEVIEWCONTENTLOADING, (newValue) => { - this.viewContentLoading = newValue; - }) - ); - - this.initView(); - - this.subs.push( - this.eventSvc.$on(this.bbId, (data) => { - if (data.clicked === 'show-comments') { - this.bbApi.toggleButton( - 'show-comments', - this.rootScopeSvc.veCommentsOn(!this.rootScopeSvc.veCommentsOn()) - ); - return; - } else if (data.clicked === 'show-numbering') { - this.bbApi.toggleButton( - 'show-numbering', - this.rootScopeSvc.veNumberingOn(!this.rootScopeSvc.veNumberingOn()) - ); - return; - } else if (data.clicked === 'show-elements') { - this.bbApi.toggleButton( - 'show-elements', - this.rootScopeSvc.veElementsOn(!this.rootScopeSvc.veElementsOn()) - ); - if (!this.rootScopeSvc.veElementsOn() && this.rootScopeSvc.veEditMode()) { - this.bbApi.toggleButton('show-edits', false); - this.rootScopeSvc.veEditMode(false); - } - return; - } else if (data.clicked === 'show-edits') { - this.bbApi.toggleButton( - 'show-edits', - this.rootScopeSvc.veEditMode(!this.rootScopeSvc.veEditMode()) - ); - if (this.rootScopeSvc.veElementsOn() !== this.rootScopeSvc.veEditMode()) { - this.bbApi.toggleButton('show-elements', this.rootScopeSvc.veEditMode()); - this.rootScopeSvc.veElementsOn(this.rootScopeSvc.veEditMode()); - } - return; - } else if (data.clicked === 'center-previous') { - this.treeSvc.getPrevBranch(this.treeSvc.getSelectedBranch(), ['view', 'section']).then( - (prev) => { - this.bbApi.toggleButtonSpinner('center-previous'); - this.treeSvc.selectBranch(prev).catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - this.bbApi.toggleButtonSpinner('center-previous'); - }, - (reason) => { - if (reason.status === 200) this.growl.info(reason.message); - else this.growl.error(reason.message); - } - ); - return; - } else if (data.clicked === 'center-next') { - this.treeSvc.getNextBranch(this.treeSvc.getSelectedBranch(), ['view', 'section']).then( - (next) => { - this.bbApi.toggleButtonSpinner('center-next'); - this.treeSvc.selectBranch(next).catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - this.bbApi.toggleButtonSpinner('center-next'); - }, - (reason) => { - if (reason.status === 200) this.growl.info(reason.message); - else this.growl.error(reason.message); - } - ); - return; - } else if (data.clicked === 'convert-pdf') { - if (this.isPageLoading()) return; - void this.appUtilsSvc.printModal( - angular.element('#print-div'), - this.mmsView, - this.mmsRef, - false, - 3 - ); - return; - } else if (data.clicked === 'print') { - if (this.isPageLoading()) return; - void this.appUtilsSvc.printModal( - angular.element('#print-div'), - this.mmsView, - this.mmsRef, - false, - 1 - ); - return; - } else if (data.clicked === 'word') { - if (this.isPageLoading()) return; - void this.appUtilsSvc.printModal( - angular.element('#print-div'), - this.mmsView, - this.mmsRef, - false, - 2 - ); - return; - } else if (data.clicked === 'tabletocsv') { - if (this.isPageLoading()) return; - this.appUtilsSvc.tableToCsv(angular.element('#print-div'), false); - return; - } else if (data.clicked === 'refresh-numbering') { - this.utilsSvc.makeTablesAndFiguresTOC(this.treeSvc.getFirstBranch(), angular.element('#print-div'), true, false); - return; - } - }) - ); - } - - uiOnParamsChanged(newValues: ParamsObject, $transition$: Transition): void { - if (newValues.viewId && newValues.viewId !== this.params.viewId) - this.initView($transition$.params() as ParamsObject); - } - uiCanExit(transition: Transition): HookResult { - //Do nothing - } - - initView = (params?: ParamsObject): void => { - this.rootScopeSvc.veViewContentLoading(true); - - if (params) { - this.params = params; - this.viewId = params.viewId; - } else if (this.mmsDocument || this.mmsView) { - this.viewId = this.mmsView ? this.mmsView.id : this.mmsDocument.id; - } else { - return; - } - - this.rootScopeSvc.veViewContentLoading(false); - - this.vidLink = false; //whether to have go to document link - if ( - this.$state.includes('main.project.ref.portal.preview') && - this.mmsDocument && - this.mmsDocument.id.indexOf('_cover') < 0 - ) { - this.vidLink = true; - } - - this.shortUrl = this.shortUrlSvc.getShortUrl({ - orgId: this.mmsProject.orgId, - documentId: this.params.documentId ? this.params.documentId : '', - viewId: this.params.viewId && !this.params.documentId.endsWith('_cover') ? this.params.viewId : '', - projectId: this.params.projectId, - refId: this.params.refId, - }); - - if (this.$state.includes('main.project.ref')) { - const data = { - rootId: this.$state.includes('**.portal.**') ? this.mmsProject.id : this.mmsDocument.id, - elementId: this.viewId, - commitId: 'latest', - projectId: this.mmsProject.id, - refId: this.mmsRef.id, - refType: this.mmsRef.type, - refresh: this.$uiRouterGlobals.transition.from().name === '', - }; - this.eventSvc.$broadcast('view.selected', data); - } - - this.contentWindowSvc.toggleLeftPane(false); - - this.rootScopeSvc.veNumberingOn(true); - - // Share URL button settings - this.dynamicPopover = this.shortUrlSvc.dynamicPopover; - - this.viewApi = { - elementClicked: this.elementClicked, - elementTranscluded: this.elementTranscluded, - }; - }; - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - this.buttonBarSvc.destroy(this.bbId); - } - - public bbInit = (api: ButtonBarApi): void => { - if (this.mmsRef.type === 'Branch') { - api.addButton(this.buttonBarSvc.getButtonBarButton('show-edits')); - api.setPermission( - 'show-edits', - this.permissionsSvc.hasBranchEditPermission(this.mmsProject.id, this.mmsRef.id) - ); - api.toggleButton('show-edits', this.rootScopeSvc.veEditMode()); - this.hotkeys.bindTo(this.$scope).add({ - combo: 'alt+d', - description: 'toggle edit mode', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'show-edits', - }); - }, - }); - } - api.addButton(this.buttonBarSvc.getButtonBarButton('show-elements')); - api.toggleButton('show-elements', this.rootScopeSvc.veElementsOn()); - api.addButton(this.buttonBarSvc.getButtonBarButton('show-comments')); - api.toggleButton('show-comments', this.rootScopeSvc.veCommentsOn()); - api.addButton(this.buttonBarSvc.getButtonBarButton('show-numbering')); - api.toggleButton('show-numbering', this.rootScopeSvc.veNumberingOn()); - - // Set hotkeys for toolbar - this.hotkeys - .bindTo(this.$scope) - .add({ - combo: 'alt+c', - description: 'toggle show comments', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'show-comments', - }); - }, - }) - .add({ - combo: 'alt+e', - description: 'toggle show elements', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'show-elements', - }); - }, - }); - - if (this.$state.includes('**.present.**')) { - api.addButton(this.buttonBarSvc.getButtonBarButton('refresh-numbering')); - api.addButton(this.buttonBarSvc.getButtonBarButton('print')); - api.addButton(this.buttonBarSvc.getButtonBarButton('export')); - api.addButton(this.buttonBarSvc.getButtonBarButton('center-previous')); - api.addButton(this.buttonBarSvc.getButtonBarButton('center-next')); - // Set hotkeys for toolbar - this.hotkeys - .bindTo(this.$scope) - .add({ - combo: 'alt+.', - description: 'next', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'center-next', - }); - }, - }) - .add({ - combo: 'alt+,', - description: 'previous', - callback: () => { - this.eventSvc.$broadcast(this.bbId, { - clicked: 'center-previous', - }); - }, - }); - } else { - api.addButton(this.buttonBarSvc.getButtonBarButton('export')); - } - }; - - public copyToClipboard = ($event: JQuery.ClickEvent): void => { - this.shortUrlSvc.copyToClipboard(this.$element, $event).then( - () => { - this.growl.info('Copied to clipboard!', { ttl: 2000 }); - }, - (err) => { - this.growl.error('Unable to copy: ' + err.message); - } - ); - }; - - public elementTranscluded = (elementOb: ElementObject, type): void => { - if (type === 'Comment' && !this.comments.map.hasOwnProperty(elementOb.id)) { - this.comments.map[elementOb.id] = elementOb; - this.comments.count++; - if (elementOb._modified > this.comments.lastCommented) { - this.comments.lastCommented = elementOb._modified; - this.comments.lastCommentedBy = elementOb._modifier; - } - } - }; - - public elementClicked = (elementOb: ElementObject): void => { - const data = { - rootOb: this.$state.includes('**.portal.**') ? null : this.mmsDocument.id, - elementId: elementOb.id, - projectId: elementOb._projectId, - refId: elementOb._refId, - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - }; - - public isPageLoading = (): boolean => { - if (this.$element.find('.isLoading').length > 0) { - this.growl.warning('Still loading!'); - return true; - } - return false; - }; -} - -/* Controllers */ -const SlideshowComponent: VeComponentOptions = { - selector: 'slideshow', - template: ` -
    - -
    - -
    - -
    -
    -
    - - -
    -
    -
    - Tags are read only: Switch to a branch to edit -
    -
    {{$ctrl.comments.count}} Comments - - , Last Commented {{$ctrl.comments.lastCommented | date:'M/d/yy h:mm a'}} by {{$ctrl.comments.lastCommentedBy}} -
    - -
    -
    -
    -
    - - - - - -`, - bindings: { - mmsParams: '<', - mmsProject: '<', - mmsRef: '<', - mmsGroup: '<', - mmsDocument: '<', - mmsView: '<', - }, - controller: SlideshowController, -}; - -veApp.component(SlideshowComponent.selector, SlideshowComponent); diff --git a/src/ve-app/pane-left/index.ts b/src/ve-app/pane-left/index.ts deleted file mode 100644 index 054a9a58a..000000000 --- a/src/ve-app/pane-left/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import './left-pane.component'; -import './left-toolbar.component'; diff --git a/src/ve-app/pane-left/left-buttons.config.ts b/src/ve-app/pane-left/left-buttons.config.ts deleted file mode 100644 index 3339eb147..000000000 --- a/src/ve-app/pane-left/left-buttons.config.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { IButtonBarButton } from '@ve-core/button-bar'; -import { IToolBarButton } from '@ve-core/toolbar'; - -export const left_default_toolbar: IToolBarButton[] = [ - { - id: 'tree-of-favorites', - icon: 'fa-star', - selected: false, - active: false, - permission: true, - tooltip: 'Favorite Documents', - spinner: false, - category: 'portal', - enabledFor: ['**.portal.**'], - }, - { - id: 'tree-of-documents', - icon: 'fa-folder-tree', - selected: true, - active: true, - permission: true, - tooltip: 'Project Document Tree', - spinner: false, - enabledFor: ['**.portal.**'], - }, - { - id: 'tree-of-contents', - icon: 'fa-folder-tree', - selected: true, - active: false, - permission: true, - tooltip: 'View Tree', - spinner: false, - enabledFor: ['**.present.**'], - }, - { - id: 'tree-of-tables', - icon: 'fa-table', - selected: false, - active: false, - permission: true, - tooltip: 'List of Tables', - spinner: false, - enabledFor: ['**.present.**'], - }, - { - id: 'tree-of-figures', - icon: 'fa-image', - selected: false, - active: false, - permission: true, - tooltip: 'List of Figures', - spinner: false, - enabledFor: ['**.present.**'], - }, - { - id: 'tree-of-equations', - icon: 'fa-superscript', - selected: false, - active: false, - permission: true, - tooltip: 'List of Equations', - spinner: false, - enabledFor: ['**.present.**'], - }, -]; - -export const left_dynamic_toolbar: IToolBarButton[] = []; - -export const left_default_buttons: IButtonBarButton[] = [ - { - id: 'tree-expand', - icon: 'fa-regular fa-caret-square-down', - selectable: true, - tooltip: 'Expand All', - placement: 'bottom-left', - }, - { - id: 'tree-collapse', - icon: 'fa-regular fa-caret-square-up', - selectable: true, - tooltip: 'Collapse All', - }, - { - id: 'tree-filter', - icon: 'fa-solid fa-filter', - selectable: true, - tooltip: 'Filter', - }, - { - id: 'tree-add', - icon: 'fa-solid fa-plus', - selectable: true, - tooltip: 'Add', - placement: 'bottom-right', - dropdown: { - icon: '', - toggle_icon: '', - ids: ['tree-add.group', 'tree-add.document', 'tree-add.view', 'tree-add.tag'], - }, - }, - { - id: 'tree-add.view', - icon: 'fa-solid fa-plus', - selectable: false, - tooltip: 'Add View', - enabledFor: ['**.present.**'], - }, - { - id: 'tree-add.group', - icon: 'fa-solid fa-folder', - selectable: false, - tooltip: 'Add Group', - enabledFor: ['**.portal.**'], - }, - { - id: 'tree-clear-select', - icon: 'fa-regular fa-folder', - selectable: false, - tooltip: 'Clear Selection', - enabledFor: ['**.portal.**'], - }, - { - id: 'tree-add.document', - icon: 'fa-solid fa-file', - selectable: false, - tooltip: 'Add Document', - enabledFor: ['**.portal.**'], - }, - { - id: 'tree-refresh', - icon: 'fa-solid fa-refresh', - selectable: false, - tooltip: 'Refresh Tree Data', - }, - { - id: 'tree-add.tag', - icon: 'fa-solid fa-tag', - selectable: false, - tooltip: 'Add Tag', - enabledFor: ['**.refs.**'], - }, - { - id: 'tree-add.branch', - icon: 'fa-solid fa-plus', - selectable: false, - tooltip: 'Add Branch', - enabledFor: ['**.refs.**'], - }, - { - id: 'tree-delete', - icon: 'fa-solid fa-trash', - selectable: false, - tooltip: 'Remove', - }, - { - id: 'tree-reorder-view', - icon: 'fa-solid fa-arrows-v', - selectable: false, - tooltip: 'Reorder Views', - enabledFor: ['**.present.**'], - }, - { - id: 'tree-reorder-group', - icon: 'fa-solid fa-arrows-v', - selectable: false, - tooltip: 'Organize Groups/Docs', - enabledFor: ['**.portal.**'], - }, - { - id: 'tree-full-document', - icon: 'fa-regular fa-file-text', - selectable: false, - tooltip: 'Full Document', - toggle: { - tooltip: 'View Mode', - }, - enabledFor: ['**.present.**'], - }, - { - id: 'tree-show-pe', - icon: 'fa-regular fa-image', - selectable: false, - tooltip: 'Show PE', - toggle: { - tooltip: 'Hide PE', - }, - enabledFor: ['**.present.**'], - }, -]; diff --git a/src/ve-app/pane-left/left-pane.component.ts b/src/ve-app/pane-left/left-pane.component.ts deleted file mode 100644 index 0d7b7f3bd..000000000 --- a/src/ve-app/pane-left/left-pane.component.ts +++ /dev/null @@ -1,679 +0,0 @@ -import { IPane } from '@openmbee/pane-layout'; -import { IPaneManagerService } from '@openmbee/pane-layout/lib/PaneManagerService'; -import { StateService, TransitionService, UIRouterGlobals } from '@uirouter/angularjs'; - -import { veAppEvents } from '@ve-app/events'; -import { AppUtilsService } from '@ve-app/main/services'; -import { TreeService } from '@ve-components/trees'; -import { ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { veCoreEvents } from '@ve-core/events'; -import { ConfirmDeleteModalResolveFn } from '@ve-core/modals'; -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ApiService, ElementService, PermissionsService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veApp } from '@ve-app'; - -import { left_default_buttons } from './left-buttons.config'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { - ElementObject, - ElementsRequest, - ElementsResponse, - InstanceSpecObject, - ParamsObject, - ProjectObject, - RefObject, - RefsResponse, - ViewObject, -} from '@ve-types/mms'; -import { TreeApi, TreeBranch } from '@ve-types/tree'; -import { VeModalService } from '@ve-types/view-editor'; - -class LeftPaneController implements angular.IComponentController { - //Scope - public subs: Rx.IDisposable[]; - - private $pane: IPane; - - public bbApi: ButtonBarApi; - public bbSize: string; - public bars: string[]; - private headerSize: string = '83px'; - protected squishSize: number = 250; - - //Bindings - private mmsProject: ProjectObject; - private mmsRef: RefObject; - private mmsRoot: ElementObject; - - //Tree Api - private treeApi: TreeApi; - - //Local Variables - toolbarId: string = 'left-toolbar'; - buttonId: string = 'tree-button-bar'; - - schema = 'cameo'; - filterInputPlaceholder = 'Filter'; - treeFilter = ''; - - static $inject = [ - '$q', - '$compile', - '$element', - '$anchorScroll', - '$filter', - '$location', - '$uibModal', - '$scope', - '$state', - '$transitions', - '$uiRouterGlobals', - '$paneManager', - '$timeout', - 'growl', - 'ElementService', - 'ApiService', - 'SchemaService', - 'ViewService', - 'ProjectService', - 'AppUtilsService', - 'TreeService', - 'PermissionsService', - 'RootScopeService', - 'EventService', - 'ButtonBarService', - ]; - - constructor( - private $q: VeQService, - private $compile: angular.ICompileService, - private $element: JQuery, - private $anchorScroll: angular.IAnchorScrollService, - private $filter: angular.IFilterService, - private $location: angular.ILocationService, - private $uibModal: VeModalService, - private $scope: angular.IScope, - private $state: StateService, - private $transitions: TransitionService, - private $uiRouterGlobals: UIRouterGlobals, - private $paneManager: IPaneManagerService, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private apiSvc: ApiService, - private schemaSvc: SchemaService, - private viewSvc: ViewService, - private projectSvc: ProjectService, - private appUtilsSvc: AppUtilsService, - private treeSvc: TreeService, - private permissionsSvc: PermissionsService, - private rootScopeSvc: RootScopeService, - public eventSvc: EventService, - private buttonBarSvc: ButtonBarService - ) {} - - $onInit(): void { - //Init/Reset Tree Updated Subject - this.eventSvc.resolve(TreeService.events.UPDATED, false); - - this.transitionCallback(); - - this.eventSvc.$init(this); - - this.bbSize = '83px'; - - this.$transitions.onSuccess({}, () => { - this.transitionCallback(); - }); - - //Init Pane Toggle Controls - this.rootScopeSvc.leftPaneClosed(this.$pane.closed); - - this.subs.push( - this.$pane.$toggled.subscribe(() => { - this.rootScopeSvc.leftPaneClosed(this.$pane.closed); - }) - ); - - this.subs.push( - this.eventSvc.binding(this.rootScopeSvc.constants.LEFTPANECLOSED, (paneClosed) => { - if (paneClosed !== this.$pane.closed) { - this.$pane.toggle(); - } - }) - ); - - // Start listening to change events - this.subs.push( - this.eventSvc.$on('view.selected', this.changeData), - this.eventSvc.$on('view.deleted', (data) => { - let goto = '^.currentState'; - let documentId = this.treeApi.rootId; - let viewId: string; - if (this.$state.includes('**.portal.**')) { - if (data.parentBranch) { - documentId = data.parentBranch.data.id; - } else { - goto = 'main.project.ref.portal'; - documentId = null; - } - } else if (this.$state.includes('**.present.**')) { - if (data.prevBranch) { - viewId = data.prevBranch.viewId ? data.prevBranch.viewId : data.prevBranch.data.id; - } else if (data.parentBranch) { - viewId = data.parentBranch.viewId ? data.parentBranch.viewId : data.parentBranch.data.id; - } - } - void this.$state.go(goto, { - documentId, - viewId, - search: undefined, - }); - }), - this.eventSvc.$on('view.reordered', (viewOrSection) => { - this.treeSvc.getBranch(viewOrSection).then((b) => { - const old = b.children; - const newChildren = []; - let viewBranch = b; - for (const c of old) { - if (c.type === 'view') { - newChildren.push(c); - } - } - if (b.type === 'section') { - viewBranch = this.treeSvc.viewId2node[b.viewId]; - if (!viewBranch) { - viewBranch = b; - } - } - b.children = newChildren; - this.treeSvc.addSectionElements(viewOrSection, viewBranch, b, false); - }) - }) - ); - /* - this.subs.push( - this.eventSvc.$on('tree.ready', () => { - if (!this.bbApi) { - this.bbApi = this.buttonBarSvc.initApi(this.buttonId, this.bbInit, left_default_buttons) - this.subs.push( - this.eventSvc.$on(this.bbApi.WRAP_EVENT, (data: ButtonWrapEvent) => { - if (data.oldSize != data.newSize) { - const treeOptions = $('.tree-options').outerHeight() - const buttonSize = $('.tree-view-buttons').outerHeight() - const calcSize = Math.round(treeOptions + buttonSize) - this.headerSize = calcSize.toString(10) + 'px' - this.$scope.$apply() - } - }) - ) - } - }) - ) -*/ - this.bbApi = this.buttonBarSvc.initApi(this.buttonId, this.bbInit, left_default_buttons); - this.buttonBarSvc.waitForApi(this.buttonId).then( - (api) => { - this.bbApi = api; - this.subs.push( - this.eventSvc.$on(this.buttonId, (data) => { - switch (data.clicked) { - case 'tree-reorder-view': { - this.bbApi.toggleButton('tree-full-document', false); - void this.$state.go('main.project.ref.view.reorder', { - search: undefined, - }); - break; - } - case 'tree-reorder-group': { - void this.$state.go('main.project.ref.groupReorder'); - break; - } - case 'tree-full-document': { - this.fullDocMode(); - break; - } - case 'tree-refresh': { - this.reloadData(); - break; - } - case 'tree-delete': { - this.deleteItem(); - break; - } - case 'tree-show-pe': { - this.bbApi.toggleButton('tree-show-pe'); - } - } - }) - ); - }, - (reason) => { - console.log(reason.message); - } - ); - } - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - this.buttonBarSvc.destroy(this.buttonId); - } - - bbInit = (api: ButtonBarApi): void => { - api.buttons.length = 0; - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-expand')); - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-collapse')); - /*api.addButton(this.buttonBarSvc.getButtonBarButton('tree-add')) - api.setPermission('tree-add', this.treeSvc.treeApi.refType !== 'Tag' && this.treeSvc.treeEditable) - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-delete')) - api.setPermission('tree-delete', this.treeSvc.treeApi.refType !== 'Tag' && this.treeSvc.treeEditable) - api.setPermission( - 'tree-add.group', - this.permissionsSvc.hasProjectEditPermission(this.treeSvc.treeApi.projectId) - ) - api.setPermission('tree-add.document', this.treeSvc.treeApi.refType !== 'Tag' && this.treeSvc.treeEditable) - - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-reorder-group')) - api.setPermission( - 'tree-reorder-group', - this.permissionsSvc.hasProjectEditPermission(this.treeSvc.treeApi.projectId) - ) - api.setPermission('tree-add.view', this.treeSvc.treeApi.refType !== 'Tag' && this.treeSvc.treeEditable) - - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-reorder-view'))*/ - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-full-document')); - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-show-pe')); - //api.setPermission('tree-reorder-view', this.treeSvc.treeEditable) - if (this.rootScopeSvc.veFullDocMode()) { - api.toggleButton('tree-full-document', true); - } - api.addButton(this.buttonBarSvc.getButtonBarButton('tree-refresh')); - api.checkActive((state: string) => { - return this.$state.includes(state); - }); - }; - - changeData = (data: veCoreEvents.elementSelectedData): void => { - //If the transitioning state detects a refresh, it will let us know to regenerate the tree - if (data.refresh) this.treeSvc.processedRoot = ''; - const rootId = !data.rootId && data.elementId.endsWith('_cover') ? data.projectId + '_pm' : data.rootId; - const elementId = data.elementId; - const refId = data.refId; - const projectId = data.projectId; - const commitId = data.commitId ? data.commitId : null; - if ((rootId && this.treeSvc.processedRoot !== rootId && rootId != '') || !this.treeApi) { - new this.$q((resolve, reject) => { - if ( - !this.treeApi || - !this.treeApi.refType || - refId != this.treeApi.refId || - projectId != this.treeApi.projectId - ) { - this.projectSvc.getRef(refId, projectId).then((ref) => { - resolve(ref.type); - }, reject); - } else { - resolve(this.treeApi.refType); - } - }).then( - (refType) => { - this.treeApi = { - rootId, - elementId, - projectId, - refType, - refId, - commitId, - }; - - this.treeApi.onSelect = this.treeClickCallback; - this.treeApi.onDblClick = this.treeDblClickCallback; - - this.treeSvc.treeApi = this.treeApi; - this.treeSvc.treeEditable = this.permissionsSvc.hasBranchEditPermission( - this.mmsProject.id, - this.mmsRef.id - ); - - this.treeApi.sectionNumbering = this.$state.includes('**.present.**'); - this.treeApi.expandLevel = this.$state.includes('**.present.**') - ? 3 - : this.$state.includes('**.portal.**') - ? 0 - : 1; - this.treeApi.sort = !this.$state.includes('**.present.**'); - - new this.$q>((resolve, reject) => { - if (this.$state.includes('**.present.**')) { - const reqOb: ElementsRequest = { - elementId: this.treeApi.rootId, - refId: this.treeApi.refId, - projectId: this.treeApi.projectId, - }; - this.elementSvc.getElement(reqOb).then((root) => { - // TODO this call is taking a long time that keeps the tree from being visible, need - // to see if it can be moved to a resolve or faster - /*if (this.apiSvc.isDocument(root) && this.$state.includes('**.present.**')) { - this.viewSvc - .getDocumentMetadata({ - elementId: root.id, - refId: root._refId, - projectId: root._projectId, - }) - .then((result) => { - this.treeApi.numberingDepth = result.numberingDepth - this.treeApi.numberingSeparator = result.numberingSeparator - this.treeApi.startChapter = (root as DocumentObject)._startChapter - ? (root as DocumentObject)._startChapter - : 1 - - if (!(root as DocumentObject)._childViews) - (root as DocumentObject)._childViews = [] - resolve(root) - }, reject) - } else {*/ - this.treeApi.numberingDepth = 0; - this.treeApi.numberingSeparator = '.'; - this.treeApi.startChapter = 1; - resolve(root); - //} - }, reject); - } else { - resolve(null); - } - }).then( - (root) => { - this.treeApi.elementId = elementId; - this.treeSvc.changeRoots(root).catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - } else { - this.treeApi.elementId = elementId; - this.treeSvc.changeElement().catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - } - }; - - transitionCallback = (): void => { - this.buttonBarSvc.waitForApi(this.buttonId).then( - (api) => { - this.bbApi = api; - }, - (reason) => { - console.log(reason.message); - } - ); - }; - - treeClickCallback = (branch: TreeBranch): void => { - if (this.$state.includes('**.portal.**')) { - if (branch.type === 'group') { - void this.$state.go('main.project.ref.portal.preview', { - preview: 'site_' + branch.data.id + '_cover', - search: undefined, - }); - } else if (branch.type === 'view' || branch.type === 'snapshot') { - void this.$state.go('main.project.ref.portal.preview', { - preview: branch.data.id, - search: undefined, - }); - } - } else if (this.$state.includes('**.present.**')) { - const viewId = branch.type !== 'view' ? branch.viewId : branch.data.id; - - // If clicked on a PE send the element.selected event for Tool Pane - if (!(branch.type === 'view' || branch.type === 'section')) { - const data = { - elementId: branch.data.id, - projectId: branch.data._projectId, - refId: branch.data._refId, - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - } - - void this.$state.go( - 'main.project.ref.view.present.' + (this.$uiRouterGlobals.params as ParamsObject).display, - { - viewId, - search: undefined, - } - ); - } - }; - - treeDblClickCallback = (branch: TreeBranch): void => { - if (this.$state.includes('**.portal.**')) { - if (branch.type === 'view' || branch.type === 'snapshot') { - void this.$state.go( - 'main.project.ref.view.present.' + (this.$uiRouterGlobals.params as ParamsObject).display, - { - documentId: branch.data.id, - search: undefined, - } - ); - } - } else if (this.$state.includes('**.present.**')) { - this.treeSvc.expandBranch(branch).catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - } - }; - - filterInputChangeHandler = (): void => { - this.eventSvc.$broadcast(TreeService.events.FILTER, this.treeFilter); - }; - - public fullDocMode = (): void => { - let display = ''; - this.bbApi.toggleButton( - 'tree-full-document', - this.rootScopeSvc.veFullDocMode(!this.rootScopeSvc.veFullDocMode()) - ); - if (this.rootScopeSvc.veFullDocMode()) { - display = 'document'; - } else { - display = 'slideshow'; - } - void this.$state.go('main.project.ref.view.present.' + display, { - search: undefined, - display, - }); - }; - - reloadData = (): void => { - this.bbApi.toggleButtonSpinner('tree-refresh'); - this.treeSvc.processedRoot = ''; - const data: veCoreEvents.elementSelectedData = { - rootId: this.treeApi.rootId, - elementId: this.treeApi.elementId, - projectId: this.treeApi.projectId, - refId: this.treeApi.refId, - refType: this.treeApi.refType, - commitId: 'latest', - }; - this.eventSvc.$broadcast('view.selected', data); - const finished = this.eventSvc.$on('tree.ready', () => { - this.bbApi.toggleButtonSpinner('tree-refresh'); - finished.dispose(); - }); - }; - - deleteItem = (): void => { - const branch = this.treeSvc.getSelectedBranch(); - if (!branch) { - this.growl.warning('Select item to remove.'); - return; - } - this.treeSvc.getPrevBranch(branch).then( - (prevBranch) => { - const type = this.viewSvc.getElementType(branch.data); - if (this.$state.includes('**.present.**')) { - if (type == 'Document') { - this.growl.warning( - 'Cannot remove a document from this view. To remove this item, go to project home.' - ); - return; - } - if (branch.type !== 'view' || !this.apiSvc.isView(branch.data)) { - this.growl.warning( - 'Cannot remove non-view item. To remove this item, open it in the center pane.' - ); - return; - } - } else { - if ( - branch.type !== 'view' && - !this.apiSvc.isDocument(branch.data) && - (branch.type !== 'group' || branch.children.length > 0) - ) { - this.growl.warning('Cannot remove group with contents. Empty contents and try again.'); - return; - } - } - const instance = this.$uibModal.open({ - component: 'confirmDeleteModal', - resolve: { - getType: () => { - let type = branch.type; - if (this.apiSvc.isDocument(branch.data)) { - type = 'Document'; - } - return type; - }, - getName: () => { - return branch.data.name; - }, - finalize: () => { - return (): VePromise => { - return new this.$q((resolve, reject) => { - if (branch.type === 'view') { - this.treeSvc.getParent(branch).then((parentBranch) => { - if (!this.$state.includes('**.present.**')) { - this.viewSvc.downgradeDocument(branch.data).then(resolve, reject); - } else { - this.viewSvc - .removeViewFromParentView({ - projectId: parentBranch.data._projectId, - refId: parentBranch.data._refId, - parentViewId: parentBranch.data.id, - viewId: branch.data.id, - }) - .then(resolve, reject); - } - }, reject); - } else if (branch.type === 'group') { - this.viewSvc.removeGroup(branch.data).then(resolve, reject); - } else { - resolve(); - } - }); - }; - }, - }, - }); - instance.result.then( - () => { - this.treeSvc.removeBranch(branch).then( - () => { - this.treeSvc.getParent(branch).then( - (parentBranch) => { - const data = { - parentBranch, - prevBranch, - branch, - }; - this.eventSvc.$broadcast('view.deleted', data); - if (this.$state.includes('**.present.**') && branch.type === 'view') { - this.treeSvc.processDeletedViewBranch(branch); - } - let selectBranch: TreeBranch = null; - if (prevBranch) { - selectBranch = prevBranch; - } else if (parentBranch) { - selectBranch = parentBranch; - } - this.treeSvc.selectBranch(selectBranch).then( - () => { - this.eventSvc.$broadcast(TreeService.events.RELOAD); - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - }, - - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - }; -} - -/* Controllers */ -const LeftPaneComponent: VeComponentOptions = { - selector: 'leftPane', - transclude: true, - template: ` -
    - -
    - - - -
    - -
    -
    -
    - -
    - - -`, - bindings: { - mmsProject: '<', - mmsRef: '<', - mmsRoot: '<', - }, - require: { - $pane: '^ngPane', - }, - controller: LeftPaneController, -}; - -veApp.component(LeftPaneComponent.selector, LeftPaneComponent); diff --git a/src/ve-app/pane-left/left-toolbar.component.ts b/src/ve-app/pane-left/left-toolbar.component.ts deleted file mode 100644 index 92641505a..000000000 --- a/src/ve-app/pane-left/left-toolbar.component.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import { IComponentController } from 'angular'; -import Rx from 'rx-lite'; - -import { ExtensionService } from '@ve-components/services'; -import { IToolBarButton, ToolbarApi, ToolbarService } from '@ve-core/toolbar'; -import { RootScopeService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { PermissionsService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { left_default_toolbar, left_dynamic_toolbar } from './left-buttons.config'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject, RefObject } from '@ve-types/mms'; - -/* Classes */ -const LeftToolbarComponent: VeComponentOptions = { - selector: 'leftToolbar', //toolbar-component - template: ``, - bindings: { - mmsRef: '<', - mmsRoot: '<', - }, - controller: class ToolbarController implements IComponentController { - static $inject = [ - 'growl', - '$state', - 'ExtensionService', - 'PermissionsService', - 'EditService', - 'EventService', - 'ToolbarService', - 'RootScopeService', - ]; - - //Injected Deps - public subs: Rx.IDisposable[]; - - //Bindings - private mmsRef: RefObject; - - // Though we don't explicitly use it right now, we do need it to trigger updates when - // entering/exiting certain states - private mmsRoot: ElementObject; - - //Local - public toolbarId: string; - - constructor( - public growl: angular.growl.IGrowlService, - public $state: StateService, - public extensionSvc: ExtensionService, - private permissionsSvc: PermissionsService, - private autosaveSvc: EditService, - private eventSvc: EventService, - private toolbarSvc: ToolbarService, - private rootScopeSvc: RootScopeService - ) { - this.toolbarId = 'left-toolbar'; - } - - $onInit(): void { - this.eventSvc.$init(this); - let initialState: string; - if (this.mmsRoot) { - initialState = this.$state.includes('**.portal.**') ? 'tree-of-documents' : 'tree-of-contents'; - } - this.toolbarSvc.initApi( - this.toolbarId, - this.tbInit, - this, - left_default_toolbar, - left_dynamic_toolbar, - initialState - ); - } - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - this.toolbarSvc.destroyApi(this.toolbarId); - } - - tbInit = (tbApi: ToolbarApi): void => { - if (this.mmsRoot) { - const trees = this.extensionSvc.getExtensions('treeOf'); - for (const tree of trees) { - const button = this.toolbarSvc.getToolbarButton(tree); - tbApi.addButton(button); - if (button.enabledFor) { - button.active = false; - for (const enableState of button.enabledFor) { - if (this.$state.includes(enableState)) { - button.active = true; - break; - } - } - } - if (button.disabledFor) { - for (const disableState of button.disabledFor) { - if (this.$state.includes(disableState)) { - button.active = false; - break; - } - } - } - } - } - }; - - paneToggle = (button: IToolBarButton): void => { - let toggleDeactivateFlag = false; - if (this.rootScopeSvc.leftPaneClosed()) { - if (button.selected || this.rootScopeSvc.leftPaneClosed()) { - if (button.selected && !this.rootScopeSvc.leftPaneClosed()) toggleDeactivateFlag = true; - this.eventSvc.$broadcast('left-pane.toggle'); - } - } - if (toggleDeactivateFlag) { - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => api.deactivate(button.id), - (reason) => this.growl.error(ToolbarService.error(reason)) - ); - } - }; - }, -}; -/* Controllers */ - -veApp.component(LeftToolbarComponent.selector, LeftToolbarComponent); diff --git a/src/ve-app/pane-right/index.ts b/src/ve-app/pane-right/index.ts deleted file mode 100644 index d51766dfb..000000000 --- a/src/ve-app/pane-right/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import './right-pane.component'; -import './right-toolbar.component'; diff --git a/src/ve-app/pane-right/right-buttons.config.ts b/src/ve-app/pane-right/right-buttons.config.ts deleted file mode 100644 index 8f4c7d623..000000000 --- a/src/ve-app/pane-right/right-buttons.config.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { IToolBarButton } from '@ve-core/toolbar'; - -export const right_default_toolbar: IToolBarButton[] = [ - { - id: 'spec-inspector', - icon: 'fa-eye', - selected: true, - active: true, - permission: true, - tooltip: 'Preview Element', - spinner: false, - dynamic_ids: ['spec-editor.saveall'], - enabledFor: ['main.project.ref'], - }, - { - id: 'spec-history', - icon: 'fa-history', - selected: false, - active: true, - permission: true, - tooltip: 'Element History', - spinner: false, - dynamic_ids: ['spec-editor.saveall'], - enabledFor: ['main.project.ref'], - }, - { - id: 'spec-editor', - icon: 'fa-edit', - selected: false, - active: true, - permission: false, - tooltip: 'Edit Element', - spinner: false, - dynamic_ids: ['spec-editor.save', 'spec-editor.save-continue', 'spec-editor.saveall', 'spec-editor.cancel'], - enabledFor: ['**.portal.**', '**.present.**'], - disabledFor: ['main.project.ref.search'], - }, - { - id: 'spec-reorder', - icon: 'fa-arrows-v', - selected: false, - active: true, - permission: false, - tooltip: 'Reorder Spec', - spinner: false, - dynamic_ids: ['spec-reorder.save', 'spec-reorder.cancel'], - enabledFor: ['**.portal.**', '**.present.**'], - disabledFor: ['main.project.ref.search'], - }, - { - id: 'spec-ref-list', - icon: 'fa-code-fork', - selected: false, - active: true, - permission: true, - tooltip: 'Branches and Tags', - spinner: false, - enabledFor: ['main.project.ref'], - }, -]; - -export const right_dynamic_toolbar: IToolBarButton[] = [ - { - id: 'spec-editor.save', - icon: 'fa-save', - dynamic: true, - selected: false, - active: false, - permission: true, - tooltip: 'Save', - spinner: false, - }, - { - id: 'spec-editor.save-continue', - icon: 'fa-regular fa-paper-plane', - dynamic: true, - selected: false, - active: false, - permission: true, - tooltip: 'Save and Continue', - spinner: false, - }, - { - id: 'spec-editor.saveall', - icon: 'fa-save-all', - dynamic: true, - selected: false, - active: false, - permission: false, - tooltip: 'Save All (alt + a)', - spinner: false, - }, - { - id: 'spec-editor.cancel', - icon: 'fa-times', - dynamic: true, - selected: false, - active: false, - permission: true, - tooltip: 'Cancel', - spinner: false, - }, - { - id: 'spec-reorder.save', - icon: 'fa-save', - dynamic: true, - selected: false, - active: false, - permission: true, - tooltip: 'Save', - spinner: false, - }, - { - id: 'spec-reorder.cancel', - icon: 'fa-times', - dynamic: true, - selected: false, - active: false, - permission: true, - tooltip: 'Cancel', - spinner: false, - }, -]; diff --git a/src/ve-app/pane-right/right-pane.component.ts b/src/ve-app/pane-right/right-pane.component.ts deleted file mode 100644 index f8803171a..000000000 --- a/src/ve-app/pane-right/right-pane.component.ts +++ /dev/null @@ -1,266 +0,0 @@ -import { IPane } from '@openmbee/pane-layout'; -import { StateService } from '@uirouter/angularjs'; -import angular, { IComponentController } from 'angular'; -import _ from 'lodash'; -import Rx from 'rx-lite'; - -import { SpecService } from '@ve-components/spec-tools'; -import { veCoreEvents } from '@ve-core/events'; -import { ToolbarService } from '@ve-core/toolbar'; -import { RootScopeService } from '@ve-utils/application'; -import { EditObject, EditService, EventService } from '@ve-utils/core'; -import { ElementService, PermissionsService, ProjectService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { ElementObject, RefObject, RefsResponse } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -import elementSelectedData = veCoreEvents.elementSelectedData; - -class RightPaneController implements IComponentController { - //Bindings - private mmsRef: RefObject; - - // Though we don't explicitly use it right now, we do need it to trigger updates when - // entering/exiting certain states - private mmsRoot: ElementObject; - - //Local Values - - public subs: Rx.IDisposable[]; - - private openEdits: number; - private edits: { [id: string]: EditObject }; - - private $pane: IPane; - private $tools: JQuery; - - private toolbarId: string = 'right-toolbar'; - - static $inject = [ - '$scope', - '$element', - '$compile', - '$uibModal', - '$q', - '$state', - '$timeout', - 'hotkeys', - 'growl', - 'ElementService', - 'ProjectService', - 'PermissionsService', - 'RootScopeService', - 'EventService', - 'EditService', - 'ToolbarService', - 'SpecService', - ]; - - constructor( - private $scope: angular.IScope, - private $element: JQuery, - private $compile: angular.ICompileService, - private $uibModal: VeModalService, - private $q: VeQService, - private $state: StateService, - private $timeout: angular.ITimeoutService, - private hotkeys: angular.hotkeys.HotkeysProvider, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private projectSvc: ProjectService, - private permissionsSvc: PermissionsService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService, - private autosaveSvc: EditService, - private toolbarSvc: ToolbarService, - private specSvc: SpecService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - //Init Pane Toggle Controls - this.rootScopeSvc.rightPaneClosed(this.$pane.closed); - - //Init spec ready binding - this.eventSvc.resolve('spec.ready', true); - - this.subs.push( - this.$pane.$toggled.subscribe(() => { - this.rootScopeSvc.rightPaneClosed(this.$pane.closed); - }) - ); - - this.subs.push( - this.eventSvc.$on('right-pane.toggle', (paneClosed) => { - if (paneClosed === undefined) { - this.$pane.toggle(); - } else if (paneClosed && !this.$pane.closed) { - this.$pane.toggle(); - } else if (!paneClosed && this.$pane.closed) { - this.$pane.toggle(); - } - this.rootScopeSvc.rightPaneClosed(this.$pane.closed); - }) - ); - - this.subs.push( - this.eventSvc.$on('element.selected', (data) => { - this.changeAction(data); - }) - ); - - this.subs.push( - this.eventSvc.$on('element.updated', (data) => { - if ( - data.element.id === this.specSvc.specApi.elementId && - data.element._projectId === this.specSvc.specApi.projectId && - data.element._refId === this.specSvc.specApi.refId && - !data.continueEdit - ) { - this.eventSvc.resolve('spec.ready', false); - this.specSvc.setElement(); - } - }) - ); - - this.subs.push( - this.eventSvc.$on('view.selected', (data) => { - this.changeAction(data); - }) - ); - - this.subs.push( - this.eventSvc.$on(this.autosaveSvc.EVENT, () => { - this.openEdits = this.autosaveSvc.openEdits(); - }) - ); - - this.edits = this.autosaveSvc.getAll(); - } - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - } - - changeAction = (data: veCoreEvents.elementSelectedData): void => { - const elementId = data.elementId; - const refId = data.refId; - const projectId = data.projectId; - const commitId = data.commitId ? data.commitId : null; - const displayOldSpec = data.displayOldSpec ? data.displayOldSpec : null; - const promise: VePromise = new this.$q((resolve, reject) => { - if ( - !this.specSvc.specApi.refType || - refId != this.specSvc.specApi.refId || - projectId != this.specSvc.specApi.projectId - ) { - this.projectSvc.getRef(refId, projectId).then((ref) => { - resolve(ref.type); - }, reject); - } else { - resolve(this.specSvc.specApi.refType); - } - }); - - promise.then( - (refType) => { - const specApi = { - elementId, - projectId, - refType, - refId, - commitId, - displayOldSpec, - }; - if (this.specSvc.specApi) { - const current = { - elementId: this.specSvc.specApi.elementId, - projectId: this.specSvc.specApi.projectId, - refId: this.specSvc.specApi.refId, - refType: this.specSvc.specApi.refType, - commitId: this.specSvc.specApi.commitId, - displayOldSpec: this.specSvc.specApi.displayOldSpec, - }; - if (_.isEqual(specApi, current)) { - return; //don't do unnecessary updates - } - } - this.eventSvc.resolve('spec.ready', false); - Object.assign(this.specSvc.specApi, specApi); - - // if (this.specSvc.setEditing) { - // this.specSvc.setEditing(false) - // } - - this.specSvc.specApi.rootId = data.rootId ? data.rootId : ''; - - this.specSvc.editable = - data.rootId && - this.mmsRef.type === 'Branch' && - refType === 'Branch' && - this.permissionsSvc.hasBranchEditPermission(projectId, refId); - - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => api.setIcon('spec-editor', 'fa-edit'), - (reason) => this.growl.error(ToolbarService.error(reason)) - ); - this.specSvc.setElement(); - }, - (reason) => { - this.growl.error('Unable to get ref: ' + reason.message); - } - ); - }; - - public etrackerChange = (): void => { - this.specSvc.keepMode(); - const id = this.specSvc.tracker.etrackerSelected; - if (!id) return; - const info = id.split('|'); - const data: veCoreEvents.elementSelectedData = { - elementId: info[2], - projectId: info[0], - refId: info[1], - commitId: 'latest', - }; - - this.eventSvc.$broadcast('element.selected', data); - }; -} - -const RightPaneComponent: VeComponentOptions = { - selector: 'rightPane', - template: ` -
    -
    -
    -
    - -
    - -
    -
    -
    -
    -
    - -
    - `, - require: { - $pane: '^^ngPane', - }, - bindings: { - mmsRef: '<', - mmsRoot: '<', - }, - controller: RightPaneController, -}; - -veApp.component(RightPaneComponent.selector, RightPaneComponent); diff --git a/src/ve-app/pane-right/right-toolbar.component.ts b/src/ve-app/pane-right/right-toolbar.component.ts deleted file mode 100644 index b1b6a6068..000000000 --- a/src/ve-app/pane-right/right-toolbar.component.ts +++ /dev/null @@ -1,132 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import { IComponentController } from 'angular'; -import Rx from 'rx-lite'; - -import { right_default_toolbar, right_dynamic_toolbar } from '@ve-app/pane-right/right-buttons.config'; -import { ExtensionService } from '@ve-components/services'; -import { IToolBarButton, ToolbarApi, ToolbarService } from '@ve-core/toolbar'; -import { RootScopeService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { PermissionsService } from '@ve-utils/mms-api-client'; - -import { veApp } from '@ve-app'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject, RefObject } from '@ve-types/mms'; - -class RightToolbarController implements IComponentController { - static $inject = [ - 'growl', - '$state', - 'ExtensionService', - 'PermissionsService', - 'EditService', - 'EventService', - 'ToolbarService', - 'RootScopeService', - ]; - - //Injected Deps - public subs: Rx.IDisposable[]; - - //Bindings - private mmsRef: RefObject; - - // Though we don't explicitly use it right now, we do need it to trigger updates when - // entering/exiting certain states - private mmsRoot: ElementObject; - - //Local - public toolbarId: string; - - constructor( - public growl: angular.growl.IGrowlService, - public $state: StateService, - public extensionSvc: ExtensionService, - private permissionsSvc: PermissionsService, - private autosaveSvc: EditService, - private eventSvc: EventService, - private toolbarSvc: ToolbarService, - private rootScopeSvc: RootScopeService - ) { - this.toolbarId = 'right-toolbar'; - } - - $onInit(): void { - this.eventSvc.$init(this); - - this.toolbarSvc.initApi( - this.toolbarId, - this.tbInit, - this, - right_default_toolbar, - right_dynamic_toolbar, - 'spec-inspector' - ); - } - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - this.toolbarSvc.destroyApi(this.toolbarId); - } - - tbInit = (tbApi: ToolbarApi): void => { - for (const tool of this.extensionSvc.getExtensions('spec')) { - const button = this.toolbarSvc.getToolbarButton(tool); - tbApi.addButton(button); - if (button.enabledFor) { - button.active = false; - for (const enableState of button.enabledFor) { - if (this.$state.includes(enableState)) { - button.active = true; - break; - } - } - } - if (button.disabledFor) { - for (const disableState of button.disabledFor) { - if (this.$state.includes(disableState)) { - button.active = false; - break; - } - } - } - if (!button.permission) { - button.permission = - this.mmsRef && - this.mmsRef.type === 'Branch' && - this.permissionsSvc.hasBranchEditPermission(this.mmsRef._projectId, this.mmsRef.id); - } - } - }; - - public paneToggle = (button: IToolBarButton): void => { - let toggleDeactivateFlag = false; - if (this.rootScopeSvc.rightPaneClosed() && this.rootScopeSvc.rightPaneToggleable()) { - if (button.selected || this.rootScopeSvc.rightPaneClosed()) { - if (button.selected && !this.rootScopeSvc.rightPaneClosed()) toggleDeactivateFlag = true; - this.eventSvc.$broadcast('right-pane.toggle'); - } - } - if (toggleDeactivateFlag) { - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => api.deactivate(button.id), - (reason) => this.growl.error(ToolbarService.error(reason)) - ); - } - }; -} - -/* Classes */ -const RightToolbarComponent: VeComponentOptions = { - selector: 'rightToolbar', //toolbar-component - template: ``, - bindings: { - mmsRef: '<', - mmsRoot: '<', - }, - controller: RightToolbarController, -}; -/* Controllers */ - -veApp.component(RightToolbarComponent.selector, RightToolbarComponent); diff --git a/src/ve-app/ve-app.module.ts b/src/ve-app/ve-app.module.ts deleted file mode 100644 index 68d463091..000000000 --- a/src/ve-app/ve-app.module.ts +++ /dev/null @@ -1,1182 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - -import ngPane from '@openmbee/pane-layout'; -import uiRouter, { - StateProvider, - StateService, - Transition, - TransitionService, - UIRouter, - UIRouterGlobals, - UrlParts, - UrlService, -} from '@uirouter/angularjs'; -import angular, { - IHttpInterceptor, - IHttpResponse, - IHttpService, - IIntervalService, - ILocationProvider, - ILocationService, - IPromise, - IQService, - IRequestConfig, -} from 'angular'; - -import { LoginModalResolveFn } from '@ve-app/main/modals/login-modal.component'; -import { ResolveService } from '@ve-app/main/services'; -import { ApplicationService, BrandingStyle, RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { AuthService, URLService, PermissionCache, ViewService, DocumentMetadata } from '@ve-utils/mms-api-client'; - -import { VePromise } from '@ve-types/angular'; -import { - CheckAuthResponse, - DocumentObject, - GenericResponse, - GroupObject, - GroupsResponse, - MountObject, - OrgObject, - OrgsResponse, - PackageObject, - ParamsObject, - PermissionsResponse, - ProjectObject, - ProjectsResponse, - RefObject, - RefsResponse, - ViewObject, -} from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -export const veApp = angular.module('ve-app', [ - 've-utils', - 've-core', - 've-components', - 'ui.bootstrap', - uiRouter, - ngPane, - 'ui.tree', - 'angular-growl', - 'angular-flatpickr', - 'cfp.hotkeys', - 'angulartics', - 'angulartics.piwik', - 'ngAnimate', - 'ngCookies', - 'ngPromiseExtras', - 'ngSanitize', - 'ngStorage', -]); - -veApp.config([ - '$stateProvider', - '$uiRouterProvider', - '$transitionsProvider', - '$httpProvider', - '$provide', - '$locationProvider', - function ( - $stateProvider: StateProvider, - $uiRouterProvider: UIRouter, - $transitionsProvider: TransitionService, - $httpProvider: angular.IHttpProvider, - $provide: angular.auto.IProvideService, - $locationProvider: ILocationProvider - ): void { - // override uibTypeaheadPopup functionality - $provide.decorator('uibTypeaheadPopupDirective', [ - '$delegate', - function ( - $delegate: ({ - link?(scope: angular.IScope, element: JQLite, attr: angular.IAttributes): void; - } & angular.IDirective)[] - ): { - link?(scope: angular.IScope, element: JQLite, attr: angular.IAttributes): void; - } & angular.IDirective[] { - const originalLinkFn = $delegate[0].link; - $delegate[0].compile = (): angular.IDirectiveLinkFn => { - return function newLinkFn( - scope: { - selectActive(matchId: string): void; - active: string; - } & angular.IScope, - elem, - attr - ) { - // fire the originalLinkFn - // eslint-disable-next-line prefer-rest-params - originalLinkFn.apply($delegate[0], [scope, elem, attr]); - scope.selectActive = (matchIdx): void => { - // added behavior - elem.children().removeClass('active'); - // default behavior - scope.active = matchIdx; - }; - }; - }; - // get rid of the old link function since we return a link function in compile - delete $delegate[0].link; - return $delegate; - }, - ]); - - $locationProvider.hashPrefix(''); - - $httpProvider.defaults.withCredentials = true; - - $stateProvider - .state('main', { - url: '', - component: 'main', - }) - .state('main.login', { - url: '/login?next', - - params: { - next: { - type: 'query', - squash: true, - raw: true, - }, - }, - resolve: { - bannerOb: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getBanner(); - }, - ], - loginBannerOb: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getLoginBanner(); - }, - ], - paramsOb: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - }, - views: { - 'banner-top@main': { - component: 'systemBanner', - bindings: { - mmsBanner: 'bannerOb', - }, - }, - 'login@main': { - component: 'login', - bindings: { - mmsLoginBanner: 'loginBannerOb', - mmsParams: 'paramsOb', - }, - }, - }, - }) - .state('main.login.redirect', { - url: '/redirect', - - resolve: { - token: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getToken(); - }, - ], - }, - views: { - 'login@main': { - component: 'redirect', - }, - }, - }) - .state('main.login.select', { - url: '/select?fromLogin', - - params: { - fromLogin: { - type: 'query', - }, - }, - resolve: { - token: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getToken(); - }, - ], - bannerOb: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getBanner(); - }, - ], - loginBannerOb: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getLoginBanner(); - }, - ], - orgObs: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getOrgs(); - }, - ], - }, - views: { - 'banner-top@main': { - component: 'systemBanner', - bindings: { - mmsBanner: 'bannerOb', - }, - }, - 'login@main': { - component: 'projectSelect', - bindings: { - mmsOrgs: 'orgObs', - mmsLoginBanner: 'loginBannerOb', - }, - }, - }, - }) - .state('main.project', { - //TODO this will be the ui to diff and merge and manage refs - url: '/projects/:projectId', - abstract: true, - - params: { - projectId: { - inherit: true, - type: 'path', - }, - }, - resolve: { - params: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - token: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getToken(); - }, - ], - refresh: [ - '$transition$', - ($transition$: Transition): boolean => { - const options = $transition$.options(); - return options.reload === true || options.reload === 'true'; - }, - ], - bannerOb: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getBanner(); - }, - ], - projectOb: [ - 'ResolveService', - 'params', - ( - resolveSvc: ResolveService, - params: ParamsObject - ): VePromise => { - return resolveSvc.getProject(params); - }, - ], - projectObs: [ - 'refresh', - 'ResolveService', - 'projectOb', - ( - refresh: boolean, - resolveSvc: ResolveService, - projectOb: ProjectObject - ): VePromise => { - return resolveSvc.getProjects(projectOb, refresh); - }, - ], - orgOb: [ - 'ResolveService', - 'projectOb', - (resolveSvc: ResolveService, projectOb: ProjectObject): VePromise => { - return resolveSvc.getOrg(projectOb); - }, - ], - orgObs: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getOrgs(); - }, - ], - refObs: [ - 'ResolveService', - 'params', - (resolveSvc: ResolveService, params: ParamsObject): VePromise => { - return resolveSvc.getRefs(params); - }, - ], - }, - views: { - 'banner-top@main': { - component: 'systemBanner', - bindings: { - mmsBanner: 'bannerOb', - }, - }, - 'nav@main': { - component: 'navBar', - bindings: { - mmsOrg: 'orgOb', - mmsOrgs: 'orgObs', - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsRef: 'refOb', - }, - }, - 'menu@main': { - component: 'mainMenu', - bindings: { - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsGroup: 'groupOb', - mmsGroups: 'groupObs', - mmsRefs: 'refObs', - mmsRef: 'refOb', - }, - }, - }, - }) - .state('main.project.ref', { - // equivalent to old sites and documents page - url: '/:refId', - params: { - refId: { - inherit: true, - type: 'path', - }, - }, - resolve: { - params: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - refresh: [ - '$transition$', - ($transition$: Transition): boolean => { - const options = $transition$.options(); - return options.reload === true || options.reload === 'true'; - }, - ], - projectOb: [ - 'ResolveService', - 'params', - ( - resolveSvc: ResolveService, - params: ParamsObject - ): VePromise => { - return resolveSvc.getProjectMounts(params); - }, - ], - refOb: [ - 'ResolveService', - 'params', - (resolveSvc: ResolveService, params: ParamsObject): VePromise => { - return resolveSvc.getRef(params); - }, - ], - groupObs: [ - 'ResolveService', - 'params', - 'refresh', - ( - resolveSvc: ResolveService, - params: ParamsObject, - refresh: boolean - ): VePromise => { - return resolveSvc.getGroups(params, refresh); - }, - ], - documentObs: [ - 'ResolveService', - 'params', - 'refresh', - ( - resolveSvc: ResolveService, - params: ParamsObject, - refresh: boolean - ): VePromise> => { - return resolveSvc.getProjectDocuments(params, refresh); - }, - ], - bannerOb: [ - 'ResolveService', - 'params', - ( - resolveSvc: ResolveService, - params: ParamsObject - ): VePromise => { - return resolveSvc.getBanner(params); - }, - ], - footerOb: [ - 'ResolveService', - 'params', - ( - resolveSvc: ResolveService, - params: ParamsObject - ): VePromise => { - return resolveSvc.getFooter(params); - }, - ], - permissions: [ - 'refOb', - 'projectOb', - 'ResolveService', - ( - refOb: RefObject, - projectOb: ProjectObject, - resolveSvc: ResolveService - ): VePromise => { - return resolveSvc.initializePermissions(projectOb, refOb); - }, - ], - }, - }) - .state('main.project.ref.refs', { - // manage refs given a current ref context - url: '/refs', - views: { - 'pane-center@main': { - component: 'refs', - bindings: { - mmsOrg: 'orgOb', - mmsProject: 'projectOb', - mmsRefs: 'refObs', - mmsRef: 'refOb', - }, - }, - 'toolbar-right@main': { - component: 'rightToolbar', - bindings: { - //Init an empty toolbar for style reasons - }, - }, - 'toolbar-left@main': { - component: 'leftToolbar', - bindings: { - //Init an empty toolbar for style reasons - }, - }, - }, - }) - .state('main.project.ref.portal', { - url: '/portal', - resolve: { - documentOb: [ - 'params', - 'refOb', - 'projectOb', - 'refresh', - 'ResolveService', - ( - params: ParamsObject, - refOb: RefObject, - projectOb: ProjectObject, - refresh: boolean, - resolveSvc: ResolveService - ): VePromise => { - return resolveSvc.getCoverDocument(params, refOb, projectOb, refresh); - }, - ], - groupOb: [ - 'groupObs', - 'documentOb', - 'ResolveService', - ( - groupObs: GroupObject[], - documentOb: DocumentObject, - resolveSvc: ResolveService - ): GroupObject => { - return resolveSvc.getGroup(groupObs, documentOb); - }, - ], - rootOb: [ - 'params', - 'ResolveService', - (params: ParamsObject, resolveSvc: ResolveService): VePromise => { - return resolveSvc.getProjectRoot(params); - }, - ], - }, - views: { - 'banner-top@main': { - component: 'systemBanner', - bindings: { - mmsBanner: 'bannerOb', - }, - }, - 'nav@main': { - component: 'navBar', - bindings: { - mmsOrg: 'orgOb', - mmsOrgs: 'orgObs', - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsRef: 'refOb', - }, - }, - 'menu@main': { - component: 'mainMenu', - bindings: { - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsGroup: 'groupOb', - mmsGroups: 'groupObs', - mmsRef: 'refOb', - mmsRefs: 'refObs', - }, - }, - 'banner-bottom@main': { - component: 'systemFooter', - bindings: { - mmsFooter: 'footerOb', - }, - }, - 'pane-center@main': { - component: 'slideshow', - bindings: { - mmsParams: 'params', - mmsProject: 'projectOb', - mmsRef: 'refOb', - mmsGroup: 'groupOb', - mmsDocument: 'documentOb', - }, - }, - 'pane-left@main': { - component: 'leftPane', - bindings: { - mmsProject: 'projectOb', - mmsRef: 'refOb', - mmsRoot: 'rootOb', - }, - }, - 'pane-right@main': { - component: 'rightPane', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'rootOb', - }, - }, - 'toolbar-right@main': { - component: 'rightToolbar', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'rootOb', - }, - }, - 'toolbar-left@main': { - component: 'leftToolbar', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'rootOb', - }, - }, - }, - }) - .state('main.project.ref.portal.preview', { - url: '?preview', - params: { - preview: { - inherit: true, - type: 'query', - }, - }, - resolve: { - params: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - documentOb: [ - 'ResolveService', - 'params', - 'refOb', - 'refresh', - ( - resolveSvc: ResolveService, - params: ParamsObject, - refOb: RefObject, - refresh: boolean - ): VePromise => { - return resolveSvc.getPreviewDocument(params, refOb, refresh); - }, - ], - groupOb: [ - 'groupObs', - 'documentOb', - 'ResolveService', - ( - groupObs: GroupObject[], - documentOb: DocumentObject, - resolveSvc: ResolveService - ): GroupObject => { - return resolveSvc.getGroup(groupObs, documentOb); - }, - ], - }, - views: { - 'pane-center@main': { - component: 'slideshow', - bindings: { - mmsParams: 'params', - mmsProject: 'projectOb', - mmsRef: 'refOb', - mmsGroup: 'groupOb', - mmsDocument: 'documentOb', - }, - }, - }, - }) - .state('main.project.ref.groupReorder', { - url: '/group-reorder', - resolve: { - documentObs: [ - 'ResolveService', - 'params', - ( - resolveSvc: ResolveService, - params: ParamsObject - ): VePromise> => { - return resolveSvc.getProjectDocuments(params); - }, - ], - }, - views: { - 'pane-center@main': { - component: 'reorderGroup', - bindings: { - mmsGroups: 'groupObs', - mmsDocuments: 'documentObs', - }, - }, - }, - }) - .state('main.project.ref.manage', { - //not needed right now, for managing mounts - url: '/manage', - }) - .state('main.project.ref.view', { - url: '/:documentId', - params: { - documentId: { - inherit: true, - type: 'path', - raw: true, - }, - }, - resolve: { - params: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - documentOb: [ - 'params', - 'refresh', - 'ResolveService', - ( - params: ParamsObject, - refresh: boolean, - resolveSvc: ResolveService - ): VePromise => { - return resolveSvc.getProjectDocument(params, refresh); - }, - ], - docMeta: [ - 'ViewService', - 'documentOb', - (viewSvc: ViewService, documentOb: DocumentObject): VePromise => { - return viewSvc.getDocumentMetadata({ - projectId: documentOb._projectId, - refId: documentOb._refId, - elementId: documentOb.id, - }); - }, - ], - }, - views: { - 'banner-top@main': { - component: 'systemBanner', - bindings: { - mmsBanner: 'bannerOb', - }, - }, - 'nav@main': { - component: 'navBar', - bindings: { - mmsOrg: 'orgOb', - mmsOrgs: 'orgObs', - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsRef: 'refOb', - }, - }, - 'menu@main': { - component: 'mainMenu', - bindings: { - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsGroup: 'groupOb', - mmsGroups: 'groupObs', - mmsRef: 'refOb', - mmsRefs: 'refObs', - mmsRoot: 'documentOb', - mmsDocument: 'documentOb', - }, - }, - 'banner-bottom@main': { - component: 'systemFooter', - bindings: { - mmsFooter: 'footerOb', - }, - }, - 'pane-left@main': { - component: 'leftPane', - bindings: { - mmsProject: 'projectOb', - mmsRef: 'refOb', - mmsRoot: 'documentOb', - }, - }, - 'pane-right@main': { - component: 'rightPane', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'documentOb', - }, - }, - 'toolbar-right@main': { - component: 'rightToolbar', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'documentOb', - }, - }, - 'toolbar-left@main': { - component: 'leftToolbar', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'documentOb', - }, - }, - }, - }) - .state('main.project.ref.view.present', { - url: '/present?viewId&display', - params: { - viewId: { - inherit: true, - type: 'query', - value: null, - squash: true, - raw: true, - dynamic: true, - }, - display: { - inherit: true, - type: 'query', - value: 'slideshow', - squash: true, - raw: true, - }, - }, - resolve: { - params: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - viewOb: [ - 'ResolveService', - 'params', - 'refresh', - (resolveSvc: ResolveService, params: ParamsObject, refresh: boolean): VePromise => { - if (params.viewId) { - return resolveSvc.getView(params, refresh); - } else { - return null; - } - }, - ], - }, - }) - .state('main.project.ref.view.present.slideshow', { - views: { - 'pane-center@main': { - component: 'slideshow', - bindings: { - mmsParams: 'params', - mmsProject: 'projectOb', - mmsRef: 'refOb', - mmsDocument: 'documentOb', - mmsView: 'viewOb', - mmsDocMeta: 'docMeta', - }, - }, - }, - }) - .state('main.project.ref.view.present.document', { - views: { - 'pane-center@main': { - component: 'document', - bindings: { - mmsParams: 'params', - mmsProject: 'projectOb', - mmsRef: 'refOb', - mmsDocument: 'documentOb', - mmsView: 'viewOb', - mmsDocMeta: 'docMeta', - }, - }, - }, - }) - .state('main.project.ref.view.reorder', { - url: '/order', - - resolve: { - documentOb: [ - 'params', - 'ResolveService', - (params: ParamsObject, resolveSvc: ResolveService): VePromise => { - return resolveSvc.getProjectDocument(params, true); - }, - ], - }, - views: { - 'pane-center@main': { - component: 'reorderDocument', - bindings: { - mmsDocument: 'documentOb', - }, - }, - }, - }) - - .state('main.project.ref.search', { - url: '/search?keywords&field', - params: { - keywords: { - dynamic: true, - }, - field: { - dynamic: true, - }, - }, - resolve: { - paramsOb: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - }, - views: { - 'nav@main': { - component: 'navBar', - bindings: { - mmsOrg: 'orgOb', - mmsOrgs: 'orgObs', - mmsProject: 'projectOb', - mmsProjects: 'projectObs', - mmsRef: 'refOb', - }, - }, - 'pane-center@main': { - component: 'search', - bindings: { - params: 'paramsOb', - }, - }, - 'pane-right@main': { - component: 'rightPane', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'documentOb', - }, - }, - 'toolbar-right@main': { - component: 'rightToolbar', - bindings: { - mmsRef: 'refOb', - mmsRoot: 'documentOb', - }, - }, - 'toolbar-left@main': { - component: 'leftToolbar', - bindings: { - //Init an empty toolbar for style reasons - }, - }, - }, - }) - .state('main.share', { - url: '/s/:shortUrl', - resolve: { - token: [ - 'ResolveService', - (resolveSvc: ResolveService): VePromise => { - return resolveSvc.getToken(); - }, - ], - paramsOb: [ - '$transition$', - ($transition$: Transition): ParamsObject => { - return $transition$.params(); - }, - ], - }, - views: { - 'login@main': { - component: 'shortUrl', - }, - }, - }); - - // anonymous factory intercepts requests - $httpProvider.interceptors.push([ - '$q', - '$location', - 'URLService', - 'EventService', - function ( - $q: IQService, - $location: ILocationService, - uRLSvc: URLService, - eventSvc: EventService - ): IHttpInterceptor { - return { - request: (config: IRequestConfig): IRequestConfig => { - config.headers = uRLSvc.getAuthorizationHeader(config.headers); - if (!config.timeout) { - config.cancel = $q.defer(); - config.timeout = config.cancel.promise; - } else { - console.log(config.url); - } - return config; - }, - responseError: ( - rejection: IHttpResponse - ): IPromise> | IHttpResponse => { - const timeout: IPromise = rejection.config.timeout as IPromise; - if (timeout.state && timeout.state === 'cancelled') { - rejection.data = 'cancelled'; - return $q.when(rejection); - } - if (rejection.status == 401) { - console.log(rejection.config.url); - if (rejection.config.url === uRLSvc.getCheckTokenURL()) { - return $q.reject(rejection); - } else { - eventSvc.$broadcast('mms.unauthorized'); - } - } - return $q.reject(rejection); - }, - response: (response): IHttpResponse => { - if (response.status === 202) { - eventSvc.$broadcast('mms.working', response); - } - response.status = 501; - return response; - }, - }; - }, - ]); - - $httpProvider.useApplyAsync(true); - - // $uiRouterProvider.urlService.rules.otherwise((match, url: UrlParts | undefined) => { - // console.log(url); - // }) - }, -]); - -veApp.run([ - '$q', - '$http', - '$interval', - '$location', - '$uibModal', - '$urlService', - '$uiRouterGlobals', - '$state', - '$transitions', - 'RootScopeService', - 'AuthService', - 'EventService', - 'ApplicationService', - function ( - $q: IQService, - $http: IHttpService, - $interval: IIntervalService, - $location: ILocationService, - $uibModal: VeModalService, - $urlService: UrlService, - $uiRouterGlobals: UIRouterGlobals, - $state: StateService, - $transitions: TransitionService, - rootScopeSvc: RootScopeService, - authSvc: AuthService, - eventSvc: EventService, - applicationSvc: ApplicationService - ): void { - rootScopeSvc.loginModalOpen(false); - $transitions.onBefore({}, (transition: Transition) => { - const to = transition.$to().name; - const params: ParamsObject = transition.params(); - if (to === 'main.login' || rootScopeSvc.loginModalOpen()) { - if (params.next) { - $urlService.url(params.next, true); - } - return; - } - return new Promise((resolve) => { - authSvc.checkLogin().then( - (data) => { - applicationSvc.getState().user = data.username; - if (to === 'main') { - resolve($state.target('main.login.select')); - } else if (to === 'main.project.ref') { - resolve($state.target('main.project.ref.portal')); - } else if (to === 'main.project.ref.view.present') { - if (!params.display || params.display === '') { - params.display = 'slideshow'; - } - resolve($state.target('main.project.ref.view.present.' + params.display, params)); - } else if ($state.includes('*.present.**') && !(transition.params() as ParamsObject).display) { - const display = transition.$to().name.split('.')[transition.$to().name.split('.').length]; - resolve( - $state.target(transition.$to().name, { - display, - }) - ); - } else { - resolve(); - } - }, - () => { - $http.pendingRequests.forEach((pendingReq) => { - if (pendingReq.cancel) { - pendingReq.cancel.resolve('cancelled'); - } - }); - resolve( - $state.target('main.login', { - next: $urlService.url(), - }) - ); - } - ); - }); - }); - $transitions.onError({}, (reason) => { - console.log(reason); - //console.log(reason.error()); - }); - eventSvc.$on('mms.unauthorized', (response) => { - // add a boolean to the 'or' statement to check for modal window - if ( - $uiRouterGlobals.current.name === '' || - $uiRouterGlobals.current.name === 'main.login' || - rootScopeSvc.veStateChanging() || - rootScopeSvc.loginModalOpen() - ) { - if ( - $uiRouterGlobals.current.name === 'main.login.select' || - ($uiRouterGlobals.transition && $uiRouterGlobals.transition.$to.name === 'main.login.select') - ) { - void $state.go('main.login'); - } - return; - } - - authSvc.checkLogin().then( - () => { - /* do nothing if success */ - }, - () => { - rootScopeSvc.loginModalOpen(true); - $uibModal - .open({ - component: 'loginModal', - resolve: { - continue: () => { - return true; - }, - }, - backdrop: 'static', - size: 'md', - }) - .result.finally(() => { - rootScopeSvc.loginModalOpen(false); - }); - } - ); - }); - - // broadcast mms.unauthorized every 10 minutes with interval service - void $interval( - () => { - eventSvc.$broadcast('mms.unauthorized'); - }, - window.__env.loginTimeout ? window.__env.loginTimeout : 60000, - 0, - false - ); - - // Check if user is logged in, if so redirect to select page otherwise go to login if the url isn't mapped - $urlService.rules.otherwise((match, url: UrlParts | undefined) => { - void authSvc.checkLogin().then((checkLogin) => { - if (checkLogin) { - if ($location.url().includes('workspace')) { - rootScopeSvc.veRedirectFromOld(true); - rootScopeSvc.veCrushUrl($location.path()); - void $state.go('main.login.redirect'); - } else { - rootScopeSvc.veRedirectFromOld(false); - void $state.go('main.login.select'); - } - } else { - void $state.go('main.login'); - } - }); - }); - }, -]); - -/* -veApp.run([ - '$uiRouter', - '$trace', - ($uiRouter: UIRouter, $trace: Trace): void => { - if (window.__env.enableDebug) { - const pluginInstance = $uiRouter.plugin(Visualizer) - $trace.enable('TRANSITION') - } - }, -]) -*/ diff --git a/src/ve-components/components/annotation.component.ts b/src/ve-components/components/annotation.component.ts deleted file mode 100644 index bbee61d9b..000000000 --- a/src/ve-components/components/annotation.component.ts +++ /dev/null @@ -1,193 +0,0 @@ -import { ExtensionService } from '@ve-components/services'; -import { veCoreEvents } from '@ve-core/events'; -import { ApplicationService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ValueService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veUtils } from '@ve-utils'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject, InstanceSpecObject, LiteralObject } from '@ve-types/mms'; - -export interface AnnotationObject { - toolTipTitle: string; - toolTipContent: string; - inlineContent: string; - id: string; -} - -class AnnotationController implements angular.IComponentController { - static $inject = [ - '$element', - 'growl', - 'ExtensionService', - 'SchemaService', - 'ApplicationService', - 'EventService', - 'ValueService', - ]; - - //Bindings - private mmsElementId: string; - mmsRecentElement: ElementObject; - mmsType: 'presentation' | 'transclusion' | 'link'; - mmsField: 'name' | 'documentation' | 'value'; - - //Local - public displayContent; - private schema: string = 'cameo'; - - constructor( - private $element: JQuery, - private growl: angular.growl.IGrowlService, - private extensionSvc: ExtensionService, - private schemaSvc: SchemaService, - private applicationSvc: ApplicationService, - private eventSvc: EventService, - private valueSvc: ValueService - ) {} - - $onInit(): void { - this.$element.on('click', () => { - if (this.mmsRecentElement) { - const data = { - elementId: this.mmsRecentElement.id, - projectId: this.mmsRecentElement._projectId, - refId: this.mmsRecentElement._refId, - commitId: this.mmsRecentElement._commitId, - displayOldSpec: true, - }; - this.eventSvc.$broadcast('element.selected', data); - } - }); - - let displayContent: AnnotationObject; - if (this.mmsRecentElement) { - displayContent = this._getContentIfElementFound(); - } else { - displayContent = this._getContentIfElementNotFound(); - } - this.displayContent = displayContent; - } - - public copyToClipboard($event: JQuery.ClickEvent): void { - this.applicationSvc.copyToClipboard($('#tooltipElementId'), $event).then( - () => { - this.growl.info('Copied to clipboard!', { ttl: 2000 }); - }, - (err) => { - this.growl.error('Unable to copy: ' + err.message); - } - ); - } - - private _getContentIfElementFound(): AnnotationObject { - let inlineContent = ''; - let toolTipTitle: string; - let toolTipContent: string; - - if (this.mmsType === 'transclusion') { - if (this.mmsField !== 'value') { - inlineContent = this.mmsRecentElement[this.mmsField] || '(no text)'; - toolTipTitle = 'Referenced element not found'; - toolTipContent = `Displaying last found ${this.mmsField} as placeholder.`; - } else { - if (!this.valueSvc.isValue(this.mmsRecentElement)) { - inlineContent = '(no text)'; - toolTipTitle = 'Referenced element is not a value'; - toolTipContent = `Cannot display value of non-value type element`; - } else { - inlineContent = this._getValueForTranscludeVal(this.mmsRecentElement); - toolTipTitle = 'Referenced element not found'; - toolTipContent = `Displaying last found ${this.mmsField} as placeholder.`; - } - } - } else if (this.mmsType === 'presentation') { - let classifierType = this.schemaSvc.getKeyByValue( - 'TYPE_TO_CLASSIFIER_ID', - (this.mmsRecentElement as InstanceSpecObject).classifierIds[0], - this.schema - ); - - if (classifierType.endsWith('T')) { - classifierType = classifierType.substring(0, classifierType.length - 1); - } - inlineContent = this.mmsRecentElement.documentation || '(no text)'; - toolTipTitle = 'Referenced ' + classifierType + ' not found.'; - toolTipContent = 'Displaying last found content as placeholder.'; - } else if (this.mmsType === 'link') { - inlineContent = this.mmsRecentElement.name; - toolTipTitle = 'Referenced view link not found'; - toolTipContent = 'Displaying last found view link as placeholder.'; - } - - return { - inlineContent: inlineContent, - toolTipTitle: toolTipTitle, - toolTipContent: toolTipContent, - id: this.mmsElementId, - }; - } - - private _getContentIfElementNotFound(): AnnotationObject { - const AT = this.extensionSvc.AnnotationType; - let inlineContent = ''; - const label = this.mmsElementId ? `(${this.mmsElementId})` : ''; - if (this.mmsType === 'transclusion') { - inlineContent = 'cf element ' + label + ' does not exist'; - } else if (this.mmsType === 'link') { - inlineContent = 'view link does not exist'; - } else if (this.mmsType === 'presentation') { - inlineContent = 'presentation element does not exist'; - } - - return { - inlineContent: inlineContent, - toolTipTitle: 'Element not found', - toolTipContent: '', - id: this.mmsElementId, - }; - } - - private _getValueForTranscludeVal = (element: ElementObject): string => { - let value: unknown; - - if (element.type === 'Property' || element.type === 'Port' || element.type === 'Slot') { - if (element.defaultValue) { - value = (element.defaultValue as LiteralObject).value; - } else if ((element as LiteralObject).value) { - value = (element as LiteralObject[]>).value[0].value; - } - } - if (element.type === 'Constraint' && element.specification) { - value = ((element as InstanceSpecObject).specification as LiteralObject).value; - } - return value.toString(); - }; -} - -/** Used for annotating an element that doesn't have any commit history at all or for an element that is deleted but has commit history **/ -const AnnotationComponent: VeComponentOptions = { - selector: 'annotation', - template: ` - - -`, - bindings: { - mmsElementId: '<', - mmsRecentElement: '<', - mmsType: '<', - mmsField: '<', - }, - controller: AnnotationController, -}; -veUtils.component(AnnotationComponent.selector, AnnotationComponent); diff --git a/src/ve-components/components/error.component.ts b/src/ve-components/components/error.component.ts deleted file mode 100644 index c5a8ca329..000000000 --- a/src/ve-components/components/error.component.ts +++ /dev/null @@ -1,76 +0,0 @@ -import _ from 'lodash'; - -import { ApplicationService } from '@ve-utils/application'; - -import { veUtils } from '@ve-utils'; - -import { VeComponentOptions } from '@ve-types/angular'; - -class ExtensionErrorController implements angular.IComponentController { - //Bindings - extType: string; - extKind: string; - errorMsg: string; - mmsElementId: string; - - //Local Structure - protected content: string; - protected title: string; - protected id: string; - - static $inject = ['growl', 'ApplicationService']; - - constructor(private growl: angular.growl.IGrowlService, private applicationSvc: ApplicationService) {} - - $onInit(): void { - this.id = this.mmsElementId; - if (!this.extKind && !this.extType) { - this.title = 'Error'; - this.content = this.errorMsg ? this.errorMsg : 'There was a problem displaying your content.'; - return; - } - const localKind = this.extKind ? _.capitalize(this.extKind) : 'Element'; - const localExtType = _.capitalize(this.extType); - - this.title = 'Unsupported ' + localKind + ' Type: ' + localExtType; - this.content = - 'This ' + localKind + ' has a rendering type: ' + localExtType + ' that is not supported by View Editor'; - } - - public copyToClipboard($event: JQuery.ClickEvent): void { - this.applicationSvc.copyToClipboard($('#tooltipElementId'), $event).then( - () => { - this.growl.info('Copied to clipboard!', { ttl: 2000 }); - }, - (err) => { - this.growl.error('Unable to copy: ' + err.message); - } - ); - } -} - -const ExtensionErrorComponent: VeComponentOptions = { - selector: 'error', - template: ` - - -`, - bindings: { - extType: '<', - extKind: '<', - errorMsg: '<', - mmsElementId: '<', - }, - controller: ExtensionErrorController, -}; - -veUtils.component(ExtensionErrorComponent.selector, ExtensionErrorComponent); diff --git a/src/ve-components/components/index.ts b/src/ve-components/components/index.ts deleted file mode 100644 index 663d34710..000000000 --- a/src/ve-components/components/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -//Services -import './annotation.component'; -import './error.component'; diff --git a/src/ve-components/diffs/components/diff-attr.component.ts b/src/ve-components/diffs/components/diff-attr.component.ts deleted file mode 100644 index f0d920bde..000000000 --- a/src/ve-components/diffs/components/diff-attr.component.ts +++ /dev/null @@ -1,294 +0,0 @@ -import _ from 'lodash'; - -import { ViewController } from '@ve-components/presentations'; -import { ExtensionService } from '@ve-components/services'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { handleChange } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { ElementObject, ElementsRequest, RequestObject } from '@ve-types/mms'; - -/** - * @ngdoc directive - * @name veComponent.component:diffAttr - * - * @requires veUtils/ElementService - * @requires $compile - * @requires ElementService - * - * * Compares a element at two different refs/commits and generates a pretty diff-merge. - * ## Example - * - * - * @param {string} attr Attribute to use - ie `name`, `doc` or `value` - * @param {string} elementId The id of the element to do comparison of - * @param {string} projectId Base project ID for original/base element - * @param {string} compareProjectId Compare project ID for compare element - * @param {string=master} refId Base ref ID or master, defaults to current ref or master - * @param {string=master} compareRefId Compare ref ID or master, defaults to base ref ID - * @param {string=latest} commitId Base commit id, default is latest - * @param {string=latest} compareCommitId Compare commit id, default is latest - */ - -class DiffAttrController { - //Bindings - attr: string; - elementId: string; - compareElementId: string; - projectId: string; - compareProjectId: string; - - refId: string; - compareRefId: string; - - commitId: string; - compareCommitId: string; - - //Controllers - mmsViewCtrl: ViewController; - - //Local - diffLoading: boolean = false; - baseNotFound: boolean = false; - compNotFound: boolean = false; - baseDeleted: boolean = false; - compDeleted: boolean = false; - private viewOrigin: RequestObject; - baseElementHtml: string; - comparedElementHtml: string; - message: string; - - static $inject = [ - '$scope', - '$timeout', - 'growl', - 'ElementService', - 'ExtensionService', - '$compile', - '$q', - '$interval', - ]; - - constructor( - private $scope: angular.IScope, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private extensionSvc: ExtensionService, - private $compile: angular.ICompileService, - private $q: VeQService, - private $interval: angular.IIntervalService - ) {} - - $onInit(): void { - this.viewOrigin = this.mmsViewCtrl ? this.mmsViewCtrl.getElementOrigin() : null; - } - - $postLink(): void { - this.performDiff(); - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - handleChange(onChangesObj, 'commitId', this.changeAction); - handleChange(onChangesObj, 'compareCommitId', this.changeAction); - } - - public diffFinish = (): void => { - this.diffLoading = false; - }; - - protected changeAction = (newVal, oldVal, firstChange): void => { - if (!newVal || firstChange) { - return; - } - if (oldVal !== newVal) this.performDiff(); - }; - protected performDiff = (): void => { - if (this.attr && this.extensionSvc.getTagByType('transclude', this.attr) !== 'extension-error') { - this.getDiff().then( - (responses: angular.PromiseValue[]) => { - const respForBaseElement = responses[0]; - if (respForBaseElement.state === 'fulfilled') { - this._fullyRender(respForBaseElement.value).then( - (baseElementHtml) => { - this.baseElementHtml = $(baseElementHtml).children().html(); - }, - (reason) => { - this.growl.error(`Error getting Diff: ${reason.message}`); - } - ); - } else { - if ( - respForBaseElement.reason && - (respForBaseElement.reason as VePromiseReason).message && - (respForBaseElement.reason as VePromiseReason).message - .toLowerCase() - .includes('deleted') - ) { - this.baseDeleted = true; - } else { - this.baseNotFound = true; - } - this.baseElementHtml = ''; - } - - const respForComparedElement = responses[1]; - if (respForComparedElement.state === 'fulfilled') { - this._fullyRender(respForComparedElement.value).then( - (comparedElementHtml) => { - this.comparedElementHtml = $(comparedElementHtml).children().html(); - }, - () => { - this.growl.error('Problem Rendering Diff'); - } - ); - } else { - if ( - respForComparedElement.reason && - (respForComparedElement.reason as VePromiseReason).message && - (respForComparedElement.reason as VePromiseReason).message - .toLowerCase() - .includes('deleted') - ) { - this.compDeleted = true; - } else { - this.compNotFound = true; - } - this.comparedElementHtml = ''; - } - this.message = this._checkElementExistence(); - }, - (reason) => { - this.growl.error(`Error getting Diff: ${reason.message}`); - } - ); - } else { - this.growl.error('Unsupported Attribute for diff'); - } - }; - - public getDiff = (): VePromise[]> => { - this.diffLoading = true; - - const baseProjectId = this.projectId || (this.viewOrigin ? this.viewOrigin.projectId : null); - const compareProjectId = this.compareProjectId || baseProjectId; - - const baseRefId = this.refId || (this.viewOrigin ? this.viewOrigin.refId : 'master'); - const compareRefId = this.compareRefId || baseRefId; - - const baseCommitId = this.commitId || 'latest'; - const compareCommitId = this.compareCommitId || 'latest'; - - const baseElementId = this.elementId; - const compareElementId = this.compareElementId || baseElementId; - const baseReqOb: ElementsRequest = { - elementId: baseElementId, - projectId: baseProjectId, - refId: baseRefId, - commitId: baseCommitId, - }; - const compareReqOb: ElementsRequest = { - elementId: compareElementId, - projectId: compareProjectId, - refId: compareRefId, - commitId: compareCommitId, - }; - const isSame = _.isEqual(baseReqOb, compareReqOb); - if (isSame) { - return; - } - - const baseElementPromise = this.elementSvc.getElement(baseReqOb); - const comparedElementPromise = this.elementSvc.getElement(compareReqOb); - return this.$q.allSettled([baseElementPromise, comparedElementPromise]); - }; - - protected _createElement = (type: string, reqOb: ElementsRequest): JQuery => { - const ignoreMathjaxAutoFormatting = type === 'doc' || type === 'val' || type === 'com'; - const html = - ''; - const newScope = Object.assign(this.$scope.$new(), { - type: type, - mmsElementId: reqOb.elementId, - mmsProjectId: reqOb.projectId, - mmsRefId: reqOb.refId, - commitId: reqOb.commitId, - mmsGenerateForDiff: true, - }); - return this.$compile(html)(newScope); - }; - - protected _fullyRender = (data: ElementObject): VePromise => { - const deferred = this.$q.defer(); - const element = this._createElement(this.attr, { - elementId: data.id, - projectId: data._projectId, - refId: data._refId, - commitId: data._commitId, - }); - const handler = this.$interval(() => { - const baseHtml = element.html(); - if (!baseHtml.includes('(loading...)')) { - this.$interval.cancel(handler); - deferred.resolve(baseHtml); - } - }, 10); - - return deferred.promise; - }; - - protected _checkElementExistence = (): string => { - let message = ''; - if (this.baseNotFound && this.compNotFound) { - message = ' Both base and compare elements do not exist.'; - } else if (this.baseNotFound) { - message = ' This is a new element.'; - } else if (this.compNotFound) { - message = ' Comparison element does not exist.'; - } - if (this.baseDeleted && this.compDeleted) { - message = ' This element has been deleted.'; - } else if (this.baseDeleted) { - message = ' Base element has been deleted.'; - } else if (this.compDeleted) { - message = ' Comparison element has been deleted.'; - } - return message; - }; -} - -const DiffAttrComponent: VeComponentOptions = { - selector: 'mmsDiffAttr', - bindings: { - elementId: '@mmsBaseElementId', - comparedElementId: '@mmsCompareElementId', - attr: '@mmsAttr', - projectId: '@mmsBaseProjectId', - compareProjectId: '@mmsCompareProjectId', - refId: '@mmsBaseRefId', - compareRefId: '@mmsCompareRefId', - commitId: ' - - - --> - {{$ctrl.message}} - - -`, - controller: DiffAttrController, - require: { - mmsViewCtrl: '?^^view', - }, -}; -veComponents.component('mmsDiffAttr', DiffAttrComponent); -veComponents.component(DiffAttrComponent.selector, DiffAttrComponent); diff --git a/src/ve-components/diffs/components/diff-html.component.ts b/src/ve-components/diffs/components/diff-html.component.ts deleted file mode 100644 index 162a59aad..000000000 --- a/src/ve-components/diffs/components/diff-html.component.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { handleChange } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { HtmlRenderedDiff } from '../../../lib/html-rendered-diff'; - -import { VeComponentOptions } from '@ve-types/angular'; - -class DiffHtmlController { - //bindings - private base: string; - private compare: string; - private diffCallback: () => void; - - //local - private htmlRenderedDiff: HtmlRenderedDiff; - htmlDiffIdPrefix: string = 'html-diff-'; - htmlDiffId: string; - diffResult: string; - - static $inject = ['$scope', '$timeout', 'growl']; - - constructor( - private $scope: angular.IScope, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService - ) { - this.htmlRenderedDiff = window.HtmlRenderedDiff; - } - - $onInit(): void { - this.htmlDiffId = `${this.htmlDiffIdPrefix}${this.$scope.$id}`; - this.performDiff(); - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - handleChange(onChangesObj, 'base', this.performDiff); - handleChange(onChangesObj, 'compare', this.performDiff); - } - protected performDiff = (): void => { - this.diffResult = this.htmlRenderedDiff.generateDiff( - DiffHtmlController._preformatHtml(this.base), - DiffHtmlController._preformatHtml(this.compare) - ); - this.$timeout(() => { - const diffContainer = $('#' + this.htmlDiffId); - this._formatImgDiff(diffContainer); - this._formatRowDiff(diffContainer); - }).then( - () => { - if (this.diffCallback) this.diffCallback(); - }, - () => { - this.growl.error('Problem performing diff.'); - } - ); - }; - - static _preformatHtml(html: string): string { - return html.replace(/\r?\n|\r|\t/g, '').replace('

     

    ', ''); - } - - private _formatImgDiff = (diffContainer: JQuery): void => { - diffContainer.find('img').each((index, element) => { - const img$ = $(element); - const imgPatcherClass = img$.hasClass('patcher-insert') - ? 'patcher-insert' - : img$.hasClass('patcher-delete') - ? 'patcher-delete' - : null; - if (imgPatcherClass) { - img$.wrap(''); - } - }); - }; - - private _formatRowDiff = (diffContainer: JQuery): void => { - diffContainer.find('tr').each((index, element) => { - const tr$: JQuery = $(element); - const trPatcherClass: string = tr$.hasClass('patcher-insert') - ? 'patcher-insert' - : tr$.hasClass('patcher-delete') - ? 'patcher-delete' - : ''; - if (trPatcherClass !== '') { - tr$.removeClass(trPatcherClass); - tr$.children().each((index, el) => { - $(el).addClass(trPatcherClass); - }); - } - }); - }; -} - -const DiffHtmlComponent: VeComponentOptions = { - selector: 'diffHtml', - template: ` -
    - -`, - bindings: { - base: '<', - compare: '<', - diffCallback: '&', - }, - controller: DiffHtmlController, -}; - -veComponents.component(DiffHtmlComponent.selector, DiffHtmlComponent); diff --git a/src/ve-components/diffs/components/index.ts b/src/ve-components/diffs/components/index.ts deleted file mode 100644 index 7d8b67fee..000000000 --- a/src/ve-components/diffs/components/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import './diff-html.component'; -import './diff-attr.component'; diff --git a/src/ve-components/diffs/index.ts b/src/ve-components/diffs/index.ts deleted file mode 100644 index 06c4704a8..000000000 --- a/src/ve-components/diffs/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -// Services -import './services/DiffMerge.service'; - -export * from './services/DiffMerge.service'; -//Components -import './components'; -//Modals -import './modals'; - -export * from './modals'; diff --git a/src/ve-components/diffs/mms-diff.component.ts b/src/ve-components/diffs/mms-diff.component.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/ve-components/diffs/modals/index.ts b/src/ve-components/diffs/modals/index.ts deleted file mode 100644 index 46408f6ae..000000000 --- a/src/ve-components/diffs/modals/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import './revert-confirm.component'; -import './save-conflict.component'; -import './merge-confirm-modal.component'; - -export * from './merge-confirm-modal.component'; -export * from './revert-confirm.component'; -export * from './save-conflict.component'; diff --git a/src/ve-components/diffs/modals/merge-confirm-modal.component.ts b/src/ve-components/diffs/modals/merge-confirm-modal.component.ts deleted file mode 100644 index 8b7e05cba..000000000 --- a/src/ve-components/diffs/modals/merge-confirm-modal.component.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { VeModalControllerImpl } from '@ve-utils/modals/ve-modal.controller'; - -import { veComponents } from '@ve-components'; - -import { RefObject } from '@ve-types/mms'; -import { VeModalComponent, VeModalController, VeModalResolve, VeModalResolveFn } from '@ve-types/view-editor'; - -export interface MergeConfirmResolve extends VeModalResolve { - getSrcRefOb: RefObject; - getDocName: string; -} -export interface MergeConfirmResolveFn extends VeModalResolveFn { - getSrcRefOb(): RefObject; - getDocName(): string; -} - -class MergeConfirmModalController extends VeModalControllerImpl implements VeModalController { - //Bindings - protected resolve: MergeConfirmResolve; - - oking: boolean; - commitMessage: string; - createForm: boolean; - srcRefOb: RefObject; - docName: string; - - static $inject = ['growl']; - - constructor(private growl: angular.growl.IGrowlService) { - super(); - } - - $onInit(): void { - this.srcRefOb = this.resolve.getSrcRefOb; - this.docName = this.resolve.getDocName; - this.oking = false; - this.commitMessage = ''; - this.createForm = true; - } - - public ok = (): void => { - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = false; - }; - - public cancel = (): void => { - this.modalInstance.dismiss(); - }; -} - -const MergeConfirmModalComponent: VeModalComponent = { - selector: 'mergeConfirmModal', - template: ` - - - - - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: MergeConfirmModalController, -}; - -veComponents.component(MergeConfirmModalComponent.selector, MergeConfirmModalComponent); diff --git a/src/ve-components/diffs/modals/revert-confirm.component.ts b/src/ve-components/diffs/modals/revert-confirm.component.ts deleted file mode 100644 index c1fce2b39..000000000 --- a/src/ve-components/diffs/modals/revert-confirm.component.ts +++ /dev/null @@ -1,165 +0,0 @@ -import _ from 'lodash'; - -import { Commit, CompareData } from '@ve-components/diffs'; -import { EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ConstraintObject, ElementObject, ElementsRequest, ElementTaggedValueObject, SlotObject } from '@ve-types/mms'; -import { VeModalController, VeModalInstanceService } from '@ve-types/view-editor'; - -export interface RevertConfirmResolve { - reqOb: ElementsRequest; - revertData: CompareData; -} - -export interface RevertConfirmResolveFn { - reqOb(): ElementsRequest; - revertData(): { - baseCommit: Commit; - compareCommit: Commit; - element: ElementObject; - }; -} - -class RevertConfirmController implements VeModalController { - //bindings - public modalInstance: VeModalInstanceService; - public resolve: RevertConfirmResolve; - - public oking; - revertData: CompareData; - reqOb: ElementsRequest; - element: ElementObject; - - static $inject = ['growl', 'ElementService', 'EventService']; - - constructor( - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private eventSvc: EventService - ) {} - - $onInit(): void { - this.revertData = this.resolve.revertData; - this.reqOb = this.resolve.reqOb; - this.elementSvc.getElement(this.reqOb).then((el) => { - this.element = el; - }); - } - - ok(): void { - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = true; - - const reqOb = _.cloneDeep(this.reqOb); - reqOb.refId = this.revertData.baseCommit.ref.id; - reqOb.commitId = - typeof this.revertData.baseCommit.commitSelected === 'string' - ? this.revertData.baseCommit.commitSelected - : this.revertData.baseCommit.commitSelected.id; - this.elementSvc - .getElement(reqOb, 2, false) - .then( - (targetOb) => { - const revertOb: ElementObject = { - id: this.reqOb.elementId, - name: targetOb.name ? targetOb.name : '', - type: targetOb.type, - documentation: targetOb.documentation, - _projectId: this.reqOb.projectId, - _refId: this.reqOb.refId, - }; - if (revertOb.type === 'Property' || revertOb.type === 'Port') { - revertOb.defaultValue = _.cloneDeep(targetOb.defaultValue); - } else if (revertOb.type === 'ElementTaggedValue') { - (revertOb as ElementTaggedValueObject).valueIds = _.cloneDeep( - (targetOb as ElementTaggedValueObject).valueIds - ); - } else if (revertOb.type === 'Slot' || revertOb.type.endsWith('TaggedValue')) { - (revertOb as SlotObject).value = _.cloneDeep((targetOb as SlotObject).value); - } else if (revertOb.type === 'Constraint' && revertOb.specification) { - (revertOb as ConstraintObject).specification = _.cloneDeep( - (targetOb as ConstraintObject).specification - ); - } - - this.elementSvc.updateElement(revertOb).then( - (element) => { - const data = { - element: element, - continueEdit: false, - }; - this.eventSvc.$broadcast('element.updated', data); - this.modalInstance.close(); - }, - (reason) => { - this.growl.error('Revert not completed - Update Error: ' + reason.message); - } - ); - }, - (reason) => { - this.growl.error('Revert not completed - Error: Target Version not found'); - } - ) - .finally(() => { - this.oking = false; - }); - } - cancel(): void { - this.modalInstance.dismiss(); - } -} - -const RevertConfirmComponent: VeComponentOptions = { - selector: 'revertConfirm', - template: ` - - - - - - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: RevertConfirmController, -}; - -veComponents.component(RevertConfirmComponent.selector, RevertConfirmComponent); diff --git a/src/ve-components/diffs/modals/save-conflict.component.ts b/src/ve-components/diffs/modals/save-conflict.component.ts deleted file mode 100644 index a4aa95bb5..000000000 --- a/src/ve-components/diffs/modals/save-conflict.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { IComponentController } from 'angular'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject } from '@ve-types/mms'; -import { VeModalInstanceService, VeModalResolve, VeModalResolveFn } from '@ve-types/view-editor'; - -export interface SaveConflictResolve extends VeModalResolve { - latest: T; -} -export interface SaveConflictResolveFn extends VeModalResolveFn { - latest(): T; -} - -class SaveConflictController implements IComponentController { - //bindings - private modalInstance: VeModalInstanceService; - resolve: SaveConflictResolve; - - //local - public latest: ElementObject; - - $onInit(): void { - this.latest = this.resolve.latest; - } - - ok(): void { - this.modalInstance.close('ok'); - } - - cancel(): void { - this.modalInstance.close('cancel'); - } - - force(): void { - this.modalInstance.close('force'); - } - - merge(): void { - this.modalInstance.close('merge'); - } -} - -const SaveConflictComponent: VeComponentOptions = { - selector: 'saveConflict', - template: ` - - - -`, - bindings: { - resolve: '@', - modalInstance: '<', - }, - controller: SaveConflictController, -}; - -veComponents.component(SaveConflictComponent.selector, SaveConflictComponent); diff --git a/src/ve-components/diffs/services/DiffMerge.service.ts b/src/ve-components/diffs/services/DiffMerge.service.ts deleted file mode 100644 index 9db0c311b..000000000 --- a/src/ve-components/diffs/services/DiffMerge.service.ts +++ /dev/null @@ -1,145 +0,0 @@ -import _ from 'lodash'; - -import { RevertConfirmResolveFn } from '@ve-components/diffs'; -import { ApiService, ElementService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { CommitObject, ElementObject, ElementsRequest, RefObject } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -export interface Commit { - ref: RefObject; - isOpen: boolean; - refIsOpen?: boolean; - history: CommitObject[]; - commitSelected: CommitObject | string; -} - -export interface CompareData { - baseCommit: Commit; - compareCommit: Commit; - element: ElementObject; -} - -export interface DiffResponse { - status?: 'new' | 'deleted' | 'changed'; - diff?: DiffDetail; -} - -export interface DiffDetail { - name: boolean; - documentation: boolean; - value: boolean; - [key: string]: boolean; -} - -export class DiffMergeService { - static $inject = ['$q', 'growl', '$uibModal', 'ApiService', 'ElementService']; - constructor( - private $q: VeQService, - private growl: angular.growl.IGrowlService, - private $uibModal: VeModalService, - private apiSvc: ApiService, - private elementSvc: ElementService - ) {} - - /** - * @name DiffMergeService#revertAction * called by transcludes and section, cancels edited element - * uses these in the scope: - * element - element object for the element to edit (for sections it's the instance spec) - * edit - edit object - * elementSaving - boolean - * isEditing - boolean - * bbApi - button bar api - handles spinny - * sets these in the scope: - * isEditing - false - * - * @param {angular.IComponentController} $ctrl of the transclude component or view section component - * @param {JQLite} domElement dom of the directive, jquery wrapped - */ - public revertAction(reqOb: ElementsRequest, revertData: CompareData, domElement: JQLite): void { - const instance = this.$uibModal.open({ - size: 'lg', - windowClass: 'revert-spec', - component: 'revertConfirm', - resolve: { - reqOb: () => { - return reqOb; - }, - revertData: () => { - return revertData; - }, - }, - }); - instance.result.then( - () => { - this.growl.success('Element reverted'); - }, - () => { - this.growl.error('Revert Cancelled'); - } - ); - } - - public checkDiff(sourceOb: ElementObject): VePromise { - const deferred = this.$q.defer(); - const diff: DiffDetail = { - name: false, - documentation: false, - value: false, - }; - let response: DiffResponse; - this.elementSvc.getElement(this.apiSvc.makeElementRequestObject(sourceOb), 1, true, true).then( - (targetOb) => { - if (!targetOb) { - response.status = 'new'; - deferred.resolve(response); - } - if (sourceOb.name !== targetOb.name) { - diff.name = true; - } - if (sourceOb.documentation !== targetOb.documentation) { - diff.documentation = true; - } - if ( - (sourceOb.type === 'Property' || sourceOb.type === 'Port') && - !_.isEqual(sourceOb.defaultValue, targetOb.defaultValue) - ) { - diff.value = true; - } else if (sourceOb.type === 'Slot' && !_.isEqual(sourceOb.value, targetOb.value)) { - diff.value = true; - } else if ( - sourceOb.type === 'Constraint' && - !_.isEqual(sourceOb.specification, targetOb.specification) - ) { - diff.value = true; - } - let changed = false; - Object.keys(diff).forEach((value) => { - changed = changed || diff[value]; - }); - if (changed) { - response = { - status: 'changed', - diff, - }; - } - deferred.resolve(response); - }, - (reason) => { - if (reason.status === 410) { - response.status = 'deleted'; - deferred.resolve(response); - } else { - this.growl.error(`Diff Check not completed - ${reason.message}`); - deferred.reject(null); - } - } - ); - return deferred.promise; - } -} - -veComponents.service('DiffMergeService', DiffMergeService); diff --git a/src/ve-components/events.d.ts b/src/ve-components/events.d.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/ve-components/index.ts b/src/ve-components/index.ts deleted file mode 100644 index 42e0d382b..000000000 --- a/src/ve-components/index.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Libraries -// import "angular-sanitize"; -// import "angular-growl-v2"; -// import "angular-ui-bootstrap"; -// import "./html-rendered-diff-merge"; - -//VE Modules -// import '@ve-utils' -// import '@ve-core' - -//Module Main -import './ve-components.module'; - -import './services'; - -import './components'; - -// Extensions -import './trees'; -import './diffs'; -import './presentations'; -import './transclusions'; -import './spec-tools'; -import './insertions'; - -export * from './ve-components.module'; - -import '../ve-extensions'; -import { ElementObject } from '@ve-types/mms'; - -export default 've-components'; - -export interface PropertySpec { - options?: ElementObject[]; - isEnumeration?: boolean; - isSlot?: boolean; - isTaggedValue?: boolean; -} diff --git a/src/ve-components/insertions/components/index.ts b/src/ve-components/insertions/components/index.ts deleted file mode 100644 index 7fb74bce5..000000000 --- a/src/ve-components/insertions/components/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import './insert-comment.component'; -import './insert-pe.component'; -import './insert-view.component'; -import './insert-ref.component'; -import './insert-element.component'; diff --git a/src/ve-components/insertions/components/insert-comment.component.ts b/src/ve-components/insertions/components/insert-comment.component.ts deleted file mode 100644 index 051404f7d..000000000 --- a/src/ve-components/insertions/components/insert-comment.component.ts +++ /dev/null @@ -1,120 +0,0 @@ -import { Insertion, InsertionService } from '@ve-components/insertions'; -import { EditorService } from '@ve-core/editor'; -import { ApplicationService, UtilsService } from '@ve-utils/application'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; -import { Class } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { InsertData } from '@ve-types/components'; -import { ElementCreationRequest, ElementObject } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -class InsertCommentController extends Insertion { - protected comment: ElementObject; - static $inject = Insertion.$inject; - - constructor( - $scope: angular.IScope, - $q: VeQService, - $element: JQuery, - growl: angular.growl.IGrowlService, - $timeout: angular.ITimeoutService, - $uibModal: VeModalService, - viewSvc: ViewService, - elementSvc: ElementService, - projectSvc: ProjectService, - schemaSvc: SchemaService, - applicationSvc: ApplicationService, - utilsSvc: UtilsService, - apiSvc: ApiService, - utils: InsertionService, - editorSvc: EditorService - ) { - super( - $scope, - $q, - $element, - growl, - $timeout, - $uibModal, - viewSvc, - elementSvc, - projectSvc, - schemaSvc, - applicationSvc, - utilsSvc, - apiSvc, - utils, - editorSvc - ); - } - - public $onInit(): void { - super.$onInit(); - const id = this.apiSvc.createUniqueId(); - this.comment = new Class({ - id: id, - _projectId: this.mmsProjectId, - _refId: this.mmsRefId, - name: 'Comment ' + new Date().toISOString(), - documentation: '', - type: 'Class', - ownerId: 'holding_bin_' + this.mmsProjectId, - appliedStereotypeIds: [], - }); - this.oking = false; - } - - public create = (): VePromise => { - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = true; - const reqOb: ElementCreationRequest = { - elements: [this.comment], - elementId: this.comment.id, - projectId: this.mmsProjectId, - refId: this.mmsRefId, - }; - return this.elementSvc.createElement(reqOb); - }; -} - -const InsertCommentComponent: VeComponentOptions = { - selector: 'insertComment', - template: ` - - - - - -`, - bindings: { - insertData: '<', - insertApi: '<', - mmsProjectId: '@', - mmsRefId: '@', - mmsOrgId: '@', - }, - controller: InsertCommentController, -}; - -veComponents.component(InsertCommentComponent.selector, InsertCommentComponent); diff --git a/src/ve-components/insertions/components/insert-element.component.ts b/src/ve-components/insertions/components/insert-element.component.ts deleted file mode 100644 index 3847913c4..000000000 --- a/src/ve-components/insertions/components/insert-element.component.ts +++ /dev/null @@ -1,181 +0,0 @@ -import _ from 'lodash'; - -import { Insertion, InsertionService } from '@ve-components/insertions'; -import { InsertTransclusionData } from '@ve-components/transclusions'; -import { EditorService } from '@ve-core/editor'; -import { ApplicationService, UtilsService } from '@ve-utils/application'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { ElementObject, MmsObject } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -class InsertElementController extends Insertion { - //Bindings - protected parentAction: string; - - //Locals - //protected createType: number = 1 - protected description: string; - protected searchExisting: boolean = true; - protected disableCreateNew: boolean = false; - - static $inject = Insertion.$inject; - - constructor( - $scope: angular.IScope, - $q: VeQService, - $element: JQuery, - growl: angular.growl.IGrowlService, - $timeout: angular.ITimeoutService, - $uibModal: VeModalService, - viewSvc: ViewService, - elementSvc: ElementService, - projectSvc: ProjectService, - schemaSvc: SchemaService, - applicationSvc: ApplicationService, - utilsSvc: UtilsService, - apiSvc: ApiService, - insertionSvc: InsertionService, - editorSvc: EditorService - ) { - super( - $scope, - $q, - $element, - growl, - $timeout, - $uibModal, - viewSvc, - elementSvc, - projectSvc, - schemaSvc, - applicationSvc, - utilsSvc, - apiSvc, - insertionSvc, - editorSvc - ); - } - - public $onInit(): void { - super.$onInit(); - - if (this.insertData.selected && this.insertData.isNew) { - this.createItem = this.insertData.selected; - this.searchExisting = false; - } else { - this.createItem = { - id: `${this.apiSvc.createUniqueId()}`, - _projectId: this.mmsProjectId, - _refId: this.mmsRefId, - ownerId: 'holding_bin_' + this.mmsProjectId, - name: '', - documentation: '', - type: 'Class', - appliedStereotypeIds: [], - }; - } - this.disableCreateNew = this.insertData.viewLink; - if (!this.disableCreateNew) { - this.editItem = this.elementSvc.openEdit(this.createItem, false); - } - this.description = 'Search for an existing element before you ' + this.parentAction; - - this.searchOptions.getProperties = true; - this.searchOptions.emptyDocTxt = 'This field is empty, but you can still click here to mms-cf a placeholder.'; - } - - public create = (): VePromise => { - this.insertData.isNew = true; - return this.insertionSvc.createAction(this.createItem, this.insertData.noPublish); - }; - - public fail = >(reason: V): void => { - if (reason.status === 401) { - this.reLogin(); - } else if (reason.status === 422) { - this.continue = true; - } else { - this.growl.error(`Create ${_.upperCase(this.insertData.type)} Error: ${reason.message}`); - } - }; -} - -// Component for inserting cross-reference -// Defines scope variables for html template and how to handle user click -// Also defines options for search interfaces -- see mmsSearch.js for more info -const InsertComponent: VeComponentOptions = { - selector: 'insertElement', - template: ` - - -`, - bindings: { - insertData: '<', - insertApi: '<', - mmsProjectId: '@', - mmsRefId: '@', - mmsOrgId: '@', - }, - controller: InsertElementController, -}; - -veComponents.component(InsertComponent.selector, InsertComponent); diff --git a/src/ve-components/insertions/components/insert-pe.component.ts b/src/ve-components/insertions/components/insert-pe.component.ts deleted file mode 100644 index 8263ecf58..000000000 --- a/src/ve-components/insertions/components/insert-pe.component.ts +++ /dev/null @@ -1,183 +0,0 @@ -import { Insertion, InsertionService } from '@ve-components/insertions'; -import { EditorService } from '@ve-core/editor'; -import { SearchFilter } from '@ve-core/search/mms-search.component'; -import { ApplicationService, UtilsService } from '@ve-utils/application'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { InsertData } from '@ve-types/components'; -import { InstanceValueObject, ViewCreationRequest, ViewInstanceSpec } from '@ve-types/mms'; -import { TreeBranch } from '@ve-types/tree'; -import { VeModalService } from '@ve-types/view-editor'; - -export interface InsertPresentationData extends InsertData { - parentBranch: TreeBranch; - viewOrSectionOb?: ViewInstanceSpec; - addPeIndex: number; -} - -class InsertPeController extends Insertion { - protected aggr: 'composite' | 'shared'; - - static $inject = Insertion.$inject; - - constructor( - $scope: angular.IScope, - $q: VeQService, - $element: JQuery, - growl: angular.growl.IGrowlService, - $timeout: angular.ITimeoutService, - $uibModal: VeModalService, - viewSvc: ViewService, - elementSvc: ElementService, - projectSvc: ProjectService, - schemaSvc: SchemaService, - applicationSvc: ApplicationService, - utilsSvc: UtilsService, - apiSvc: ApiService, - utils: InsertionService, - editorSvc: EditorService - ) { - super( - $scope, - $q, - $element, - growl, - $timeout, - $uibModal, - viewSvc, - elementSvc, - projectSvc, - schemaSvc, - applicationSvc, - utilsSvc, - apiSvc, - utils, - editorSvc - ); - } - - $onInit(): void { - super.$onInit(); - } - - public queryFilter = (): SearchFilter => { - const filters: { - appliedStereotypeIds?: string[]; - classifierIds?: string[]; - } = {}; - if (this.type === 'Table') { - filters.classifierIds = [ - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'TableT', this.schema), - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Table', this.schema), - ]; - } else if (this.type === 'List') { - filters.classifierIds = [ - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'ListT', this.schema), - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'List', this.schema), - ]; - } else if (this.type === 'Image') { - filters.classifierIds = [ - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'ImageT', this.schema), - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Image', this.schema), - ]; - } else if (this.type === 'Paragraph') { - filters.classifierIds = [ - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'ParagraphT', this.schema), - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Paragraph', this.schema), - ]; - } else if (this.type === 'Section') { - filters.classifierIds = [ - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'SectionT', this.schema), - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Section', this.schema), - ]; - } else { - filters.classifierIds = [this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', this.type, this.schema)]; - } - return filters; - }; - - public success = (): void => { - const elemType = this.type; - this.insertionSvc.successUpdates(elemType, this.insertData.viewOrSectionOb.id); - }; - - public insert = (elementOb: ViewInstanceSpec): VePromise => { - const instanceVal: InstanceValueObject = { - id: this.apiSvc.createUniqueId(), - instanceId: elementOb.id, - type: 'InstanceValue', - _projectId: this.projectId, - _refId: this.refId, - }; - const viewReqOb: ViewCreationRequest = { - viewId: this.insertData.viewOrSectionOb.id, - projectId: this.projectId, - refId: this.refId, - }; - return this.viewSvc.insertToViewOrSection(viewReqOb, instanceVal, this.insertData.addPeIndex); - }; - - public create = (): VePromise => { - return this.viewSvc.createInstanceSpecification( - this.insertData.viewOrSectionOb, - this.type, - this.name, - this.insertData.addPeIndex - ); - }; -} - -const InsertPeComponent: VeComponentOptions = { - selector: 'insertPe', - template: ` -
    - - - - -
    -`, - bindings: { - insertData: '<', - insertApi: '<', - mmsProjectId: '@', - mmsRefId: '@', - mmsOrgId: '@', - }, - controller: InsertPeController, -}; - -veComponents.component(InsertPeComponent.selector, InsertPeComponent); diff --git a/src/ve-components/insertions/components/insert-ref.component.ts b/src/ve-components/insertions/components/insert-ref.component.ts deleted file mode 100644 index d8f6a8a28..000000000 --- a/src/ve-components/insertions/components/insert-ref.component.ts +++ /dev/null @@ -1,204 +0,0 @@ -import flatpickr from 'flatpickr'; - -import { Insertion, InsertionService } from '@ve-components/insertions'; -import { EditorService } from '@ve-core/editor'; -import { ApplicationService, UtilsService } from '@ve-utils/application'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { InsertData } from '@ve-types/components'; -import { CommitObject, RefObject, RefsResponse } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -export interface InsertRefData extends InsertData { - parentRefId: string; - lastCommit: boolean; -} - -class InsertRefController extends Insertion { - static $inject = [...Insertion.$inject, '$filter']; - - protected parentCommit: CommitObject; - protected lastCommit: boolean; - protected now: Date; - protected dateTimeOpts: flatpickr.Options.Options; - protected timestamp: Date; - - constructor( - $scope: angular.IScope, - $q: VeQService, - $element: JQuery, - growl: angular.growl.IGrowlService, - $timeout: angular.ITimeoutService, - $uibModal: VeModalService, - viewSvc: ViewService, - elementSvc: ElementService, - projectSvc: ProjectService, - schemaSvc: SchemaService, - applicationSvc: ApplicationService, - utilsSvc: UtilsService, - apiSvc: ApiService, - utils: InsertionService, - editorSvc: EditorService - ) { - super( - $scope, - $q, - $element, - growl, - $timeout, - $uibModal, - viewSvc, - elementSvc, - projectSvc, - schemaSvc, - applicationSvc, - utilsSvc, - apiSvc, - utils, - editorSvc - ); - } - - public $onInit(): void { - super.$onInit(); - - this.lastCommit = this.insertData.lastCommit; - this.now = new Date(); - this.timestamp = this.now; - this.createItem = { - id: this.apiSvc.createUniqueId(), - _projectId: this.projectId, - type: this.type, - description: '', - permission: 'read', - }; - this.dateTimeOpts = { - enableTime: true, - enableSeconds: true, - defaultDate: this.now, - dateFormat: 'Y-m-dTH:i:S', - time_24hr: true, - maxDate: new Date(), - onClose: (selectedDates): void => { - this.lastCommit = false; - this.timestamp = selectedDates[0]; - }, - inline: false, - }; - } - - public create = (): VePromise => { - const refObj: RefObject = { - name: this.createItem.name, - type: this.type, - _projectId: this.projectId, - description: this.createItem.description, - id: this.apiSvc.createUniqueId(), - //parentCommitId: null - }; - if (this.insertData.parentRefId) refObj.parentRefId = this.insertData.parentRefId; - /* - if (!this.lastCommit || this.type === 'Tag') { - // Make call to history?maxTimestamp to get closest commit id to branch off - - const ts = this.$filter('date')(this.timestamp, 'yyyy-MM-ddTHH:mm:ss.sssZ') - this.projectSvc.getCommits(refObj.parentRefId, this.projectId, ts).then((commits: CommitObject[]) => { - refObj.parentCommitId = commits[0].id - deferred.resolve(this.projectSvc.createRef(refObj, this.projectId)) - }, this.insertReject) - } else { - */ - return this.projectSvc.createRef(refObj, this.projectId); - //} - }; - - public resolve = (data: RefObject): void => { - this.insertApi.resolve(data); - }; -} - -const InsertRefComponent: VeComponentOptions = { - selector: 'insertRef', - template: ` -
    - - - - - -
    -`, - bindings: { - insertData: '<', - insertApi: '<', - mmsProjectId: '@', - mmsRefId: '@', - mmsOrgId: '@', - }, - controller: InsertRefController, -}; - -veComponents.component(InsertRefComponent.selector, InsertRefComponent); diff --git a/src/ve-components/insertions/components/insert-view.component.ts b/src/ve-components/insertions/components/insert-view.component.ts deleted file mode 100644 index aa8d74e30..000000000 --- a/src/ve-components/insertions/components/insert-view.component.ts +++ /dev/null @@ -1,239 +0,0 @@ -import { Insertion, InsertionService } from '@ve-components/insertions'; -import { EditorService } from '@ve-core/editor'; -import { SearchFilter } from '@ve-core/search/mms-search.component'; -import { ApplicationService, UtilsService } from '@ve-utils/application'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { InsertData } from '@ve-types/components'; -import { ViewObject } from '@ve-types/mms'; -import { TreeBranch } from '@ve-types/tree'; -import { VeModalService } from '@ve-types/view-editor'; - -export interface InsertViewData extends InsertData { - parentBranch: TreeBranch; - seenViewIds: { [viewId: string]: TreeBranch }; - newViewAggr?: 'composite' | 'shared'; -} - -class InsertViewController extends Insertion { - private aggr: 'composite' | 'shared' = 'composite'; - - static $inject = Insertion.$inject; - - constructor( - $scope: angular.IScope, - $q: VeQService, - $element: JQuery, - growl: angular.growl.IGrowlService, - $timeout: angular.ITimeoutService, - $uibModal: VeModalService, - viewSvc: ViewService, - elementSvc: ElementService, - projectSvc: ProjectService, - schemaSvc: SchemaService, - applicationSvc: ApplicationService, - utilsSvc: UtilsService, - apiSvc: ApiService, - utils: InsertionService, - editorSvc: EditorService - ) { - super( - $scope, - $q, - $element, - growl, - $timeout, - $uibModal, - viewSvc, - elementSvc, - projectSvc, - schemaSvc, - applicationSvc, - utilsSvc, - apiSvc, - utils, - editorSvc - ); - } - - public $onInit(): void { - super.$onInit(); - if (this.insertData.newViewAggr) { - this.aggr = this.insertData.newViewAggr; - } - if (this.insertData.parentBranch) { - this.parentData = this.insertData.parentBranch.data; - } - } - - public insert = (data: ViewObject): VePromise => { - const deferred = this.$q.defer(); - const view = data; - const viewId = view.id; - if (this.insertData.seenViewIds[viewId]) { - this.growl.error('Error: View ' + view.name + ' is already in this document.'); - return; - } - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = true; - this.viewSvc - .addViewToParentView({ - parentViewId: this.parentData.id, - viewId: viewId, - projectId: this.parentData._projectId, - refId: this.parentData._refId, - aggr: this.aggr, - returnChildViews: true, - }) - .then( - () => { - this.elementSvc - .getElement( - { - elementId: viewId, - projectId: view._projectId, - refId: view._refId, - }, - 2, - false - ) - .then( - (realView) => { - deferred.resolve(realView); - }, - (reason) => { - reason.data.elements = [view]; - deferred.reject(reason); - } - ); - }, - (reason) => { - this.growl.error(`View Add Error: ${reason.message}`); - } - ); - return deferred.promise; - }; - - public last = (): void => { - this.growl.success('View Added'); - }; - - public queryFilter = (): SearchFilter => { - const filters: SearchFilter = {}; - filters.appliedStereotypeIds = [ - this.schemaSvc.getSchema('VIEW_SID', this.schema), - this.schemaSvc.getSchema('DOCUMENT_SID', this.schema), - ...this.schemaSvc.getSchema('OTHER_VIEW_SID', this.schema), - ]; - return filters; - }; - - public create = (): VePromise => { - if (this.type === 'Document') { - return this.viewSvc.createDocument( - { - _projectId: this.projectId, - _refId: this.refId, - id: this.ownerId, - }, - { - name: this.createItem.name, - id: this.apiSvc.createUniqueId(), - isDoc: true, - _projectId: this.projectId, - _refId: this.refId, - type: 'Class', - } - ); - } else if (this.type === 'View') { - return this.viewSvc.createView(this.parentData, { - id: this.apiSvc.createUniqueId(), - name: this.createItem.name, - _projectId: this.projectId, - _refId: this.refId, - type: 'Class', - }); - } else if (this.type === 'Group') { - return this.viewSvc.createGroup(this.createItem.name, { - _projectId: this.projectId, - _refId: this.refId, - id: this.ownerId, - }); - } else { - return this.$q.reject({ - status: 666, - message: 'Unsupported View Type', - }); - } - }; -} - -const InsertViewComponent: VeComponentOptions = { - selector: 'insertView', - template: ` -
    - - - - -
    -`, - bindings: { - insertData: '<', - insertApi: '<', - mmsProjectId: '@', - mmsRefId: '@', - mmsOrgId: '@', - }, - controller: InsertViewController, -}; - -veComponents.component(InsertViewComponent.selector, InsertViewComponent); -veComponents.component('addGroup', InsertViewComponent); -veComponents.component('addDocument', InsertViewComponent); diff --git a/src/ve-components/insertions/index.ts b/src/ve-components/insertions/index.ts deleted file mode 100644 index 0bdb1f101..000000000 --- a/src/ve-components/insertions/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export * from './insertion.controller'; - -import './services'; - -export * from './services'; -import './insert-element-modal.component'; - -import './components'; diff --git a/src/ve-components/insertions/insert-element-modal.component.ts b/src/ve-components/insertions/insert-element-modal.component.ts deleted file mode 100644 index d7bb836c9..000000000 --- a/src/ve-components/insertions/insert-element-modal.component.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { ExtensionService } from '@ve-components/services'; -import { VeModalControllerImpl } from '@ve-utils/modals/ve-modal.controller'; - -import { veComponents } from '@ve-components'; - -import { InsertApi, InsertData, InsertResolve } from '@ve-types/components'; -import { ElementObject, MmsObject } from '@ve-types/mms'; -import { VeModalComponent, VeModalController, VeModalService } from '@ve-types/view-editor'; - -class InsertController extends VeModalControllerImpl implements VeModalController { - static $inject = ['$scope', '$compile', '$element', '$timeout', '$uibModal', 'growl', 'ExtensionService']; - - private schema = 'cameo'; - - protected resolve: InsertResolve; - - //local - private insertData: InsertData; - private insertApi: InsertApi; - private projectId: string; - private refId: string; - private orgId: string; - private insertType: string; - private type: string; - - private $componentEl: JQuery; - - constructor( - private $scope: angular.IScope, - private $compile: angular.ICompileService, - private $element: JQuery, - private $timeout: angular.ITimeoutService, - private $uibModal: VeModalService, - private growl: angular.growl.IGrowlService, - private extensionSvc: ExtensionService - ) { - super(); - } - - public parentData: ElementObject = {} as ElementObject; - - $onInit(): void { - this.insertData = this.resolve.getInsertData; - - this.insertType = this.insertData.insertType; - this.projectId = this.resolve.getProjectId; - this.refId = this.resolve.getRefId ? this.resolve.getRefId : 'master'; - this.orgId = this.resolve.getOrgId ? this.resolve.getOrgId : null; - - this.type = this.insertData.type; - this.insertApi = { - resolve: (data): void => { - this.modalInstance.close(data); - }, - reject: (reason): void => { - this.modalInstance.dismiss(reason); - }, - }; - } - - $postLink(): void { - this.recompile(); - } - - public recompile = (): void => { - let tag = this.extensionSvc.getTagByType('insert', this.insertType); - if (tag === 'extension-error') { - tag = 'insert-element'; - } - const newPe = $('
    '); - $(newPe).append( - `<${tag} insert-data="$ctrl.insertData" insert-api="$ctrl.insertApi" - mms-project-id="{{$ctrl.projectId}}" ${this.refId ? `mms-ref-id="{{$ctrl.refId}}" ` : ''}${ - this.orgId ? 'mms-org-id="{{$ctrl.orgId}}" ' : '' - }>` - ); - $(this.$element).append(newPe); - this.$compile(newPe)(this.$scope); - }; - - public cancel = (): void => { - this.modalInstance.dismiss(); - }; -} - -const InsertElementModalComponent: VeModalComponent = { - selector: 'insertElementModal', - template: ` -
    - -
    -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: InsertController, -}; - -veComponents.component(InsertElementModalComponent.selector, InsertElementModalComponent); diff --git a/src/ve-components/insertions/insertion.controller.ts b/src/ve-components/insertions/insertion.controller.ts deleted file mode 100644 index 90810b10e..000000000 --- a/src/ve-components/insertions/insertion.controller.ts +++ /dev/null @@ -1,267 +0,0 @@ -import _ from 'lodash'; - -import { LoginModalResolveFn } from '@ve-app/main/modals/login-modal.component'; -import { InsertionService } from '@ve-components/insertions'; -import { EditorService } from '@ve-core/editor'; -import { ApplicationService, UtilsService } from '@ve-utils/application'; -import { EditObject } from '@ve-utils/core'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { InsertApi, InsertData } from '@ve-types/components'; -import { BasicResponse, ElementObject, MmsObject } from '@ve-types/mms'; -import { VeModalService, VeModalSettings, veSearchCallback, VeSearchOptions } from '@ve-types/view-editor'; - -/** - * @name veComponents/Insertion - * @description - * Generic controller used for the creation and update of elements. - * - */ -export class Insertion< - /** - * @typedef T Type of the add data required for creation of the desired element - */ - T extends InsertData, - /** - * @typedef U Type of the eventual object that will be returned by the Server - */ - U extends MmsObject = ElementObject -> { - //Bindings - public insertData: T; - public insertApi: InsertApi>>; - public mmsProjectId: string; - public mmsRefId: string; - public mmsOrgId: string; - - //Locals - public name: string; - public ownerId: string; - public searchOptions: VeSearchOptions = null; - type: string; - createForm: boolean = true; - oking: boolean = false; - continue: boolean = false; - projectId: string; - refId: string; - orgId: string; - insertType: string; - createItem: U; - editItem: EditObject; - - static $inject = [ - '$scope', - '$q', - '$element', - 'growl', - '$timeout', - '$uibModal', - 'ViewService', - 'ElementService', - 'ProjectService', - 'SchemaService', - 'ApplicationService', - 'UtilsService', - 'ApiService', - 'InsertionService', - 'EditorService', - ]; - - protected schema = 'cameo'; - - //local - - private $componentEl: JQuery; - - constructor( - protected $scope: angular.IScope, - protected $q: VeQService, - protected $element: JQuery, - protected growl: angular.growl.IGrowlService, - protected $timeout: angular.ITimeoutService, - protected $uibModal: VeModalService, - protected viewSvc: ViewService, - protected elementSvc: ElementService, - protected projectSvc: ProjectService, - protected schemaSvc: SchemaService, - protected applicationSvc: ApplicationService, - protected utilsSvc: UtilsService, - protected apiSvc: ApiService, - protected insertionSvc: InsertionService, - protected editorSvc: EditorService - ) {} - - public parentData: ElementObject = {} as ElementObject; - - $onInit(): void { - this.insertType = this.insertData.insertType; - this.projectId = this.mmsProjectId; - this.refId = this.mmsRefId ? this.mmsRefId : ''; - this.orgId = this.mmsOrgId; - this.type = this.insertData.type; - - this.searchOptions = { - callback: this.callback, - searchField: 'name', - itemsPerPage: 200, - filterQueryList: [this.queryFilter], - hideFilterOptions: true, - closeable: false, - closeCallback: this.cancel, - }; - } - - public ok = (): void => { - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = true; - - this.ownerId = this.parentData && this.parentData.id ? this.parentData.id : 'holding_bin_' + this.projectId; - let ready = this.$q.resolve(null); - if (this.editItem) { - ready = this.editorSvc.updateAllData(this.editItem.key, true, true); - } - ready.then( - () => { - this.create() - .then((data) => { - this.insertResolve(data, 'created'); - }, this.insertReject) - .finally(this.insertFinally); - }, - (reason) => this.insertReject(reason) - ); - }; - - public loginCb = (result?: boolean): void => { - if (result) { - this.ok(); - } else { - this.insertReject({ - status: 666, - message: 'User not Authenticated', - }); - } - }; - - public reLogin = (): void => { - this.$componentEl = this.$element.children(); - this.$element.empty(); - const settings: VeModalSettings = { - component: 'loginModal', - resolve: { - continue: () => { - return true; - }, - }, - }; - const instance = this.$uibModal.open(settings); - instance.result.then(this.loginCb, () => { - this.insertReject({ - status: 666, - message: 'User Cancelled Authentication', - }); - }); - }; - - public insertResolve = (data: U, type: string): void => { - this.success(data); - this.insertApi.resolve(data); - }; - - protected insertReject = >>(reason: V): void => { - this.fail(reason); - if (!this.continue) { - this.insertApi.reject(reason); - } - this.continue = false; - }; - - public success = (data?: U): void => { - /* Put custom success logic here*/ - }; - - public fail = >(reason: V): void => { - if (reason.status === 401) { - this.reLogin(); - } else { - this.growl.error(`Create ${_.upperCase(this.insertData.type)} Error: ${reason.message}`); - } - }; - - public last = (): void => { - /* Put custom finally logic here*/ - }; - - public insertFinally = (): void => { - this.last(); - this.oking = false; - }; - - /** - * @name Insertion/callback - * @param {ElementObject} data - * @param {string} property - */ - public callback: veSearchCallback = (data: U, property?: string): void => { - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = true; - this.addExisting(data, property) - .then((finalData) => { - if (this.editItem) { - this.editorSvc.cleanUpEdit(this.editItem.key); - } - this.insertData.isNew = false; - this.insertResolve(finalData, 'added'); - }, this.insertReject) - .finally(this.insertFinally); - }; - - public cancel = (): void => { - if (this.insertData.selected) { - this.insertionSvc.cancelAction(this.insertData.selected); - } - if (this.insertApi.reject) { - this.insertApi.reject({ status: 444, message: 'User cancelled request' }); - } - }; - /** - * - */ - public queryFilter = (): { - appliedStereotypeIds?: string[]; - classifierIds?: string[]; - } => { - /* Implement and Search Filtering Logic Here */ - return { - appliedStereotypeIds: [], - classifierIds: [], - }; - }; - - /** - * - * @return {VePromise>} - */ - public create = (): VePromise> => { - this.growl.error(`Add Item of Type ${this.type} is not supported`); - return this.$q.reject(); - }; - - /** - * @name Insertion/addExisting - * @param {U} existingOb - * @param {string} property any property that was specified for use as a transclusion target - * @return {VePromise} - */ - public addExisting = (existingOb: U, property?: string): VePromise => { - return this.$q.resolve(existingOb); - }; -} diff --git a/src/ve-components/insertions/services/Insertion.service.ts b/src/ve-components/insertions/services/Insertion.service.ts deleted file mode 100644 index 9bc6b0683..000000000 --- a/src/ve-components/insertions/services/Insertion.service.ts +++ /dev/null @@ -1,83 +0,0 @@ -import _ from 'lodash'; - -import { EditorService } from '@ve-core/editor'; -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { Class } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { ElementObject } from '@ve-types/mms'; - -export class InsertionService { - static $inject = ['$q', '$timeout', 'growl', 'ElementService', 'EditorService', 'RootScopeService', 'EventService']; - - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private editorSvc: EditorService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService - ) {} - - public successUpdates = (elemType: string, id: string): void => { - this.eventSvc.$broadcast('content-reorder.refresh'); - this.eventSvc.$broadcast('content-reorder-saved', { id: id }); - this.growl.success('Adding ' + elemType + ' Successful'); - // Show comments when creating a comment PE - if (elemType === 'Comment' && !this.rootScopeSvc.veCommentsOn()) { - void this.$timeout( - () => { - $('.show-comments').trigger('click'); - }, - 0, - false - ); - } - }; - - public createAction = (createItem: ElementObject, noPublish: boolean): VePromise => { - if (!createItem.name) { - this.growl.error('Error: A name for your new element is required.'); - return this.$q.reject({ status: 422 }); - } - const editKey = this.elementSvc.getEditElementKey(createItem); - - const toCreate: ElementObject = new Class(createItem); - - let promise: VePromise; - if (!noPublish) { - promise = this.elementSvc.createElement({ - elements: [toCreate], - refId: toCreate._refId, - projectId: toCreate._projectId, - }); - } else { - promise = this.$q.resolve( - this.elementSvc.cacheElement( - { - refId: toCreate._refId, - projectId: toCreate._projectId, - }, - _.cloneDeep(toCreate) - ) - ); - } - - promise.finally(() => { - this.editorSvc.cleanUpEdit(editKey); - }); - - return promise; - }; - - public cancelAction = (cancelledItem: ElementObject): void => { - this.editorSvc.cleanUpEdit(this.elementSvc.getEditElementKey(cancelledItem)); - }; -} - -veComponents.service('InsertionService', InsertionService); diff --git a/src/ve-components/insertions/services/index.ts b/src/ve-components/insertions/services/index.ts deleted file mode 100644 index 83a1f3fba..000000000 --- a/src/ve-components/insertions/services/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import './Insertion.service'; - -export * from './Insertion.service'; diff --git a/src/ve-components/presentations/add-pe-menu.component.ts b/src/ve-components/presentations/add-pe-menu.component.ts deleted file mode 100644 index ccdb20482..000000000 --- a/src/ve-components/presentations/add-pe-menu.component.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { IComponentController } from 'angular'; - -import { PresentationService } from '@ve-components/presentations/services/Presentation.service'; -import { RootScopeService } from '@ve-utils/application'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ViewObject } from '@ve-types/mms'; - -class AddPeMenuController implements IComponentController { - // Bindings - private mmsView: ViewObject; - - public addPeIndex: number; - - static $inject = ['PresentationService', 'RootScopeService']; - - constructor(private presentationSvc: PresentationService, private rootScopeSvc: RootScopeService) {} - /** - * @name veComponents.directive:mmsView#addEltAction - * Add specified element at the defined 'index' - */ - public addEltAction = (index: number, type: string): void => { - if (!this.rootScopeSvc.veEditMode()) { - return; - } - this.addPeIndex = index; - this.presentationSvc.addPresentationElement(this, type, this.mmsView); - }; - - public setPeLineVisibility = ($event: JQuery.ClickEvent): void => { - window.setTimeout(() => { - const peContainer = $($event.currentTarget).closest('.add-pe-button-container'); - if (peContainer.find('.dropdown-menu').css('display') == 'none') { - peContainer.find('hr').css('visibility', 'hidden'); - } else { - peContainer.find('hr').css('visibility', 'visible'); - } - }); - }; -} - -const InsertPeMenuComponent: VeComponentOptions = { - selector: 'addPeMenu', - template: ` - -
    -`, - bindings: { - mmsView: '<', - index: '<', - }, - controller: AddPeMenuController, -}; - -veComponents.component(InsertPeMenuComponent.selector, InsertPeMenuComponent); diff --git a/src/ve-components/presentations/components/present-comment.component.ts b/src/ve-components/presentations/components/present-comment.component.ts deleted file mode 100644 index 7d823d333..000000000 --- a/src/ve-components/presentations/components/present-comment.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentCommentComponent: IPresentationComponentOptions = { - selector: 'presentComment', - template: ``, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentationLite, -}; - -veComponents.component(PresentCommentComponent.selector, PresentCommentComponent); diff --git a/src/ve-components/presentations/components/present-equation.component.ts b/src/ve-components/presentations/components/present-equation.component.ts deleted file mode 100644 index f9c791809..000000000 --- a/src/ve-components/presentations/components/present-equation.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentEquationComponent: IPresentationComponentOptions = { - selector: 'presentEquation', - template: ` -`, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentationLite, -}; - -veComponents.component(PresentEquationComponent.selector, PresentEquationComponent); diff --git a/src/ve-components/presentations/components/present-figure.component.ts b/src/ve-components/presentations/components/present-figure.component.ts deleted file mode 100644 index 8d5e425cb..000000000 --- a/src/ve-components/presentations/components/present-figure.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentFigureComponent: IPresentationComponentOptions = { - selector: 'presentFigure', - template: ` -`, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentationLite, -}; - -veComponents.component(PresentFigureComponent.selector, PresentFigureComponent); diff --git a/src/ve-components/presentations/components/present-image.component.ts b/src/ve-components/presentations/components/present-image.component.ts deleted file mode 100644 index eaee3656f..000000000 --- a/src/ve-components/presentations/components/present-image.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentImageComponent: IPresentationComponentOptions = { - selector: 'presentImage', - template: ` -
    - -
    - Figure {{$ctrl.instanceSpec._veNumber}}. - {{$ctrl.peObject.title || $ctrl.instanceSpec.name}} -
    -
    -`, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentationLite, -}; - -veComponents.component(PresentImageComponent.selector, PresentImageComponent); diff --git a/src/ve-components/presentations/components/present-list-t.component.ts b/src/ve-components/presentations/components/present-list-t.component.ts deleted file mode 100644 index 5a4c7773c..000000000 --- a/src/ve-components/presentations/components/present-list-t.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentListTComponent: IPresentationComponentOptions = { - selector: 'presentListt', - template: ` -`, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentationLite, -}; - -veComponents.component(PresentListTComponent.selector, PresentListTComponent); diff --git a/src/ve-components/presentations/components/present-list.component.ts b/src/ve-components/presentations/components/present-list.component.ts deleted file mode 100644 index 2c780d76d..000000000 --- a/src/ve-components/presentations/components/present-list.component.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Presentation, PresentationService, ViewHtmlService } from '@ve-components/presentations'; -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { ImageService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; -import { PresentListObject } from '@ve-types/mms'; - -class PresentListController extends Presentation { - static $inject = Presentation.$inject; - constructor( - $q: VeQService, - $element: JQuery, - $scope: angular.IScope, - $compile: angular.ICompileService, - growl: angular.growl.IGrowlService, - schemaSvc: SchemaService, - viewHtmlSvc: ViewHtmlService, - presentationSvc: PresentationService, - componentSvc: ComponentService, - eventSvc: EventService, - imageSvc: ImageService, - buttonBarSvc: ButtonBarService, - extensionSvc: ExtensionService - ) { - super( - $q, - $element, - $scope, - $compile, - growl, - schemaSvc, - viewHtmlSvc, - presentationSvc, - componentSvc, - eventSvc, - imageSvc, - buttonBarSvc, - extensionSvc - ); - } - - protected getContent = (): VePromise => { - return this.$q.resolve(this.viewHtmlSvc.makeHtmlList(this.peObject as PresentListObject)); - }; -} - -const PresentListComponent: IPresentationComponentOptions = { - selector: 'presentList', - template: ``, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentListController, -}; - -veComponents.component(PresentListComponent.selector, PresentListComponent); diff --git a/src/ve-components/presentations/components/present-paragraph.component.ts b/src/ve-components/presentations/components/present-paragraph.component.ts deleted file mode 100644 index 3448e0edc..000000000 --- a/src/ve-components/presentations/components/present-paragraph.component.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { ViewHtmlService, Presentation, PresentationService } from '@ve-components/presentations'; -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { ImageService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; -import { PresentTextObject } from '@ve-types/mms'; - -class PresentParagraph extends Presentation implements angular.IComponentController { - static $inject = Presentation.$inject; - constructor( - $q: VeQService, - $element: JQuery, - $scope: angular.IScope, - $compile: angular.ICompileService, - growl: angular.growl.IGrowlService, - schemaSvc: SchemaService, - viewHtmlSvc: ViewHtmlService, - presentationSvc: PresentationService, - componentSvc: ComponentService, - eventSvc: EventService, - imageSvc: ImageService, - buttonBarSvc: ButtonBarService, - extensionSvc: ExtensionService - ) { - super( - $q, - $element, - $scope, - $compile, - growl, - schemaSvc, - viewHtmlSvc, - presentationSvc, - componentSvc, - eventSvc, - imageSvc, - buttonBarSvc, - extensionSvc - ); - } - - protected getContent = (): VePromise => { - return this.$q.resolve(this.viewHtmlSvc.makeHtmlPara(this.peObject as PresentTextObject)); - }; -} - -const PresentParagraphComponent: IPresentationComponentOptions = { - selector: 'presentParagraph', - template: `
    `, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentParagraph, -}; - -veComponents.component(PresentParagraphComponent.selector, PresentParagraphComponent); diff --git a/src/ve-components/presentations/components/present-section.component.ts b/src/ve-components/presentations/components/present-section.component.ts deleted file mode 100644 index b4ee350d6..000000000 --- a/src/ve-components/presentations/components/present-section.component.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentSectionComponent: IPresentationComponentOptions = { - selector: 'presentSection', - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - }, - template: ``, - controller: PresentationLite, - require: { - mmsViewCtrl: '?^^view', - mmsViewPresentationElemCtrl: '?^^viewPe', - }, -}; - -veComponents.component(PresentSectionComponent.selector, PresentSectionComponent); diff --git a/src/ve-components/presentations/components/present-table-t.component.ts b/src/ve-components/presentations/components/present-table-t.component.ts deleted file mode 100644 index 2ec52b363..000000000 --- a/src/ve-components/presentations/components/present-table-t.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { PresentationLite } from '@ve-components/presentations'; - -import { veComponents } from '@ve-components'; - -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; - -const PresentTableTComponent: IPresentationComponentOptions = { - selector: 'presentTablet', - template: ` -`, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentationLite, -}; - -veComponents.component(PresentTableTComponent.selector, PresentTableTComponent); diff --git a/src/ve-components/presentations/components/present-table.component.ts b/src/ve-components/presentations/components/present-table.component.ts deleted file mode 100644 index 8dd04e8f5..000000000 --- a/src/ve-components/presentations/components/present-table.component.ts +++ /dev/null @@ -1,633 +0,0 @@ -import $ from 'jquery'; - -import { Presentation, PresentationService, ViewHtmlService } from '@ve-components/presentations'; -import { Table2CSVService } from '@ve-components/presentations/services/Table2CSV.service'; -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { ImageService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { IPresentationComponentOptions, ITableConfig } from '@ve-types/components/presentation'; -import { PresentTableObject, TableEntryObject } from '@ve-types/mms'; - -class PresentTableController extends Presentation { - public $searchEl: JQuery; - public $tHeadEl: JQuery; - public $captionEl: JQuery; - - public table: PresentTableObject; - public tableConfig: ITableConfig; - private trs: JQuery; - public ngModelOptions: angular.INgModelOptions; - public showFilter: boolean = false; - public fixedHeaders: boolean = false; - public fixedColumns: boolean = false; - private _fixedHeadersElem: JQuery = null; - private _fixedColumnsElem: JQuery = null; - public numFixedColumns: number = 2; - private nextIndex: number; - private tbody: JQuery; - private lastIndex: number; - private numTotal: number; - private sortColumnNum: number; - - /** Full Table Filter **/ - - private searchTerm: string = ''; - private numFiltered: number; - - /** Column Filter **/ - private _columnsInputSubs: { - [columnId: string]: { sub: Rx.IDisposable; cell: TableEntryObject }; - } = {}; - - /** - * _filterTermForColumns is used to keep track of filter terms on each header's column for multi-columns - * filtering. Some header columns could be a merged column, and have children columns. "columns" property - * keeps track, of all the children columns number that it is a parent of. ie: - * {filterTermForColumn01: {filterTerm: 'A', columns: [0,1]}, filterTermForColumn11: {filterTerm: 'B', columns: [1]}} **/ - private _filterTermForColumns: { - [filterTermForColumn: string]: { filterTerm: string; columns: number[] }; - } = {}; - private filterTermForColumn: { [cols: string]: string } = {}; - - /** Variables for Sorting Functions **/ - private _rowSortOrderAttrName = 'data-original-row-num'; - public isAscending: boolean = false; - private showSortReset: boolean = false; - - static $inject = [...Presentation.$inject, '$timeout']; - - constructor( - $q: VeQService, - $element: JQuery, - $scope: angular.IScope, - $compile: angular.ICompileService, - growl: angular.growl.IGrowlService, - schemaSvc: SchemaService, - viewHtmlSvc: ViewHtmlService, - presentationSvc: PresentationService, - componentSvc: ComponentService, - eventSvc: EventService, - imageSvc: ImageService, - buttonBarSvc: ButtonBarService, - extensionSvc: ExtensionService, - private $timeout: angular.ITimeoutService - ) { - super( - $q, - $element, - $scope, - $compile, - growl, - schemaSvc, - viewHtmlSvc, - presentationSvc, - componentSvc, - eventSvc, - imageSvc, - buttonBarSvc, - extensionSvc - ); - } - - recompile = (): void => { - this.$element.on('click', (e) => { - const tag = (e.target as unknown as Element).tagName; - if (tag === 'INPUT' || tag === 'LABEL' || tag === 'BUTTON') { - e.stopPropagation(); - } - }); - this.setNumber(); - this.getContent().then( - (result) => { - this.$transcludeEl = $(result); - this.$transcludeEl.find('img').each((index, element) => { - this.imageSvc.fixImgSrc($(element)); - }); - - this.$element.append(this.$transcludeEl); - this.nextIndex = 0; - this.$tHeadEl = this.$element.find('thead'); - this.$compile(this.$tHeadEl)(this.$scope); - this.$searchEl = this.$element.children('div').eq(0); - //this.$compile(this.$searchEl)(this.$scope) //already compiled due to template - this.$captionEl = this.$element.find('caption'); - this.$compile(this.$captionEl)(this.$scope); - //Add the search input here (before the TRS, aka the columns/rows) - this.tbody = this.$element.find('.table-wrapper').children('table').children('tbody'); - this.trs = this.tbody.children('tr'); - - this.lastIndex = this.trs.length; - this.numFiltered = this.lastIndex; - this.numTotal = this.lastIndex; - - //this.addColumnsWiseFilter(this.tableConfig, this.trs) - this.addSorting(this.trs, this.tbody); - - this.compileTable(); - }, - (reason) => { - const reqOb = { - elementId: this.instanceSpec.id, - projectId: this.projectId, - refId: this.refId, - commitId: this.commitId, - //includeRecentVersionElement: true, - }; - this.$element.empty(); - //TODO: Add reason/errorMessage handling here. - this.$transcludeEl = $( - '' - ); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)( - Object.assign(this.$scope.$new(), { - elementId: reqOb.elementId, - recentElement: reason.recentVersionOfElement, - type: 'presentation', - }) - ); - } - ); - }; - - config = (): void => { - if ( - !(this.peObject as PresentTableObject).showIfEmpty && - (this.peObject as PresentTableObject).body.length === 0 - ) { - return; - } - - this.table = this.peObject as PresentTableObject; - this.sortColumnNum = -1; - this.ngModelOptions = { - debounce: 300, - getterSetter: true, - }; - }; - - getContent = (): VePromise => { - const html = this.viewHtmlSvc.makeHtmlTable(this.table, true, true, this.instanceSpec); - return this.$q.resolve(`
    ${html}
    `); - }; - - /** Filter rows by search term **/ - private fullTableFilter = (): void => { - this._resetColumnWiseFilterInputs(); - if (this.searchTerm === '') { - this.numFiltered = this.trs.length; - this.trs.show(); - } else { - this.numFiltered = 0; - this._displaySomeRows(this.trs, () => { - this.numFiltered++; - }); - } - }; - - /** Display rows that match the filter term **/ - private _displaySomeRows = (trs: JQuery, increaseNumOfRowToShow: () => void): void => { - const regExp = new RegExp(this.searchTerm, 'i'); - for (let i = 0, numRows = trs.length; i < numRows; i++) { - const string = $(trs[i]).text(); - if (regExp.test(string)) { - $(trs[i]).show(); - increaseNumOfRowToShow(); - } else { - $(trs[i]).hide(); - } - } - }; - /** End of Full Table Filter **/ - - /** Add column(s)-wise filter ability **/ - private filterByColumn = (startColNum: number, endColNum: number): void => { - this.searchTerm = ''; - const filterTerm = this.filterTermForColumn[`filter${startColNum}${endColNum}`]; - const filterInputBinding = `columnFilter${startColNum}${endColNum}`; - this._storeColumnWiseFilterTerm(filterInputBinding, startColNum, endColNum, filterTerm); - this.numFiltered = 0; - this._displayRowsMatchingAllColumnsFilterTerms(this.trs, () => { - this.numFiltered++; - }); - }; - - /** Only show the rows that has contents matching all currently outstanding filter terms **/ - private _displayRowsMatchingAllColumnsFilterTerms = ( - trs: JQuery, - increaseNumOfRowToShow: () => void - ): void => { - trs.toArray().forEach((row) => { - const shouldKeepRow = Object.keys(this._filterTermForColumns).every((k) => { - const regExp = new RegExp(this._filterTermForColumns[k].filterTerm, 'i'); - return this._filterTermForColumns[k].columns.some((colNum) => { - return regExp.test(this._getCellValueForFiltering(row, colNum)); - }); - }); - if (shouldKeepRow) { - $(row).show(); - increaseNumOfRowToShow(); - } else { - $(row).hide(); - } - }); - }; - - /** Update or add a new filter term for a header column with the given filterInputBinding **/ - private _storeColumnWiseFilterTerm = ( - filterInputBinding: string, - startColNum: number, - endColNum: number, - filterTerm: string - ): void => { - if (this._filterTermForColumns[filterInputBinding]) { - this._updateExistingColumnWiseFilterTerm(filterInputBinding, filterTerm); - } else { - this._addNewColumnWiseFilterTerm(filterInputBinding, startColNum, endColNum, filterTerm); - } - }; - - /** Add a new filter term to a header column with the given filterInputBinding **/ - private _addNewColumnWiseFilterTerm = ( - filterInputBinding: string, - startColNum: number, - endColNum: number, - filterTerm: string - ): void => { - this._filterTermForColumns[filterInputBinding] = { - filterTerm: filterTerm, - columns: startColNum === endColNum ? [startColNum] : [startColNum, endColNum], - }; - }; - - /** Update a filter term for a header column with the given filterInputBinding **/ - private _updateExistingColumnWiseFilterTerm = (filterInputBinding: string, filterTerm: string): void => { - this._filterTermForColumns[filterInputBinding].filterTerm = filterTerm; - }; - - /** Return the content of a cell given a row & columnIndex **/ - private _getCellValueForFiltering = (row: HTMLElement, columnIndex: number): string => { - const cell = $(row).children('td').eq(columnIndex); - return cell.text().trim(); - }; - - /** Clear out filter term(s) for all header's columns that used to be filtered by before **/ - private _resetColumnWiseFilterInputs = (): void => { - const listOfFilterInputBindings = Object.keys(this._filterTermForColumns); - if (listOfFilterInputBindings.length > 0) { - listOfFilterInputBindings.forEach((filterInputBinding) => { - delete this._filterTermForColumns[filterInputBinding]; - }); - } - Object.keys(this.filterTermForColumn).forEach((key) => { - this.filterTermForColumn[key] = ''; - }); - }; - /** End of Column(s)-Wise Filter **/ - - /** Sorting feature **/ - - /** Add sorting ability **/ - public addSorting = (trs: JQuery, tbody: JQuery): void => { - this._addDefaultSortOrder(trs); - }; - - /** Remember the original row number for each row. Used to restore sort order **/ - private _addDefaultSortOrder = (trs: JQuery): void => { - trs.each((rowNumber, tr) => { - $(tr).attr(this._rowSortOrderAttrName, rowNumber); - }); - }; - - /** Used to sort columns(s). Add sort binding to each header columns of the outermost table **/ - - private sortByColumnFn = (event: Event, sortColumnNum: number): void => { - this.sortColumnNum = sortColumnNum; - event.stopPropagation(); - const rows = this.trs.toArray(); - let sortedRows = this._areAllCellValidNumber(rows, sortColumnNum) - ? rows.sort(this._numericalComparator(sortColumnNum)) - : rows.sort(this._generalComparator(sortColumnNum)); - - this.isAscending = !this.isAscending; - - if (!this.isAscending) { - sortedRows = sortedRows.reverse(); - } - - this._displaySortedRows(sortedRows, this.tbody); - this.showSortReset = true; - }; - /** Used to restore the sort order of table's rows **/ - private resetSort = (): void => { - const sortedRows = this.trs.toArray().sort(this._comparatorForSortReset()); - this._displaySortedRows(sortedRows, this.tbody); - this.showSortReset = false; - this.sortColumnNum = -1; - }; - /** A comparator for sorting table's rows. When one of them is null ( null is reserved for non-sortable content - * such as image, list, table ), that content is pushed to the end of the final sorted list regardless of - * whether sorting asc or dsc **/ - private _generalComparator = (columnIndex: number): ((rowA: HTMLElement, rowB: HTMLElement) => number) => { - return (rowA: HTMLElement, rowB: HTMLElement): number => { - let cellValueA = this._getCellValueForSorting(rowA, columnIndex); - let cellValueB = this._getCellValueForSorting(rowB, columnIndex); - - if (cellValueA === null && cellValueB === null) { - return 0; - } - - if (cellValueA === null && cellValueB !== null) { - return this.isAscending ? 1 : -1; - } - - if (cellValueA !== null && cellValueB === null) { - return this.isAscending ? -1 : 1; - } - - if (cellValueA !== null && cellValueB !== null) { - cellValueA = cellValueA.toLowerCase(); - cellValueB = cellValueB.toLowerCase(); - return cellValueA < cellValueB ? -1 : cellValueA > cellValueB ? 1 : 0; - } - }; - }; - - /** Return true if and only if all cells' value can be converted to a valid number **/ - private _areAllCellValidNumber = (rows: HTMLElement[], columnIndex: number): boolean => { - return rows.every((row): boolean => { - return this._isValidNumber(this._getCellValueForSorting(row, columnIndex)); - }); - }; - - private _numericalComparator = (columnIndex: number): ((rowA: HTMLElement, rowB: HTMLElement) => number) => { - return (rowA: HTMLElement, rowB: HTMLElement) => { - const cellValueA = Number(this._getCellValueForSorting(rowA, columnIndex)); - const cellValueB = Number(this._getCellValueForSorting(rowB, columnIndex)); - return cellValueA - cellValueB; - }; - }; - - private _isValidNumber = (val): boolean => { - return val !== null && !isNaN(Number(val)); - }; - - /** Get content of a cell given its row and its columnIndex. Return null for a cell that contains non-sortable - * content such as image, table, list **/ - private _getCellValueForSorting = (row: HTMLElement, columnIndex: number): string => { - const cell = $(row).children('td').eq(columnIndex); - const containerDivContent = cell.children('div').contents(); - // if there is no content, think of it as empty string - if (containerDivContent.length === 0) { - return ''; - } else if (!containerDivContent.prop('tagName')) { - return cell.text().trim(); - } else { - const cf = 'mms-cf'; - const contentTag: string = (containerDivContent.prop('tagName') as object).toString().toLowerCase(); - const contentTagAttr = containerDivContent.attr('mms-cf-type'); - if ( - contentTag === 'img' || - contentTag === 'table' || - (contentTag === cf && (contentTagAttr === 'img' || contentTagAttr === 'table')) - ) { - return null; - } else { - return cell.text().trim(); - } - } - }; - - /** Display newly sorted rows **/ - private _displaySortedRows = (sortedRows: HTMLElement[], tbody: JQuery): void => { - $(sortedRows).detach().appendTo(tbody); - }; - - /** This special comparator is used to turn the table's rows into its original sort order **/ - private _comparatorForSortReset = () => { - return (rowA, rowB): number => { - const rowARowNumber = Number($(rowA).attr(this._rowSortOrderAttrName)); - const rowBRowNumber = Number($(rowB).attr(this._rowSortOrderAttrName)); - return rowARowNumber < rowBRowNumber ? -1 : rowARowNumber > rowBRowNumber ? 1 : 0; - }; - }; - /** End of Sorting feature **/ - - /** Begin Linking Functions **/ - - public getSortIconClass = (cellColumn): string[] => { - const sortingColumnNumber = this.sortColumnNum; - if (sortingColumnNumber !== cellColumn) { - return ['fa', 'fa-sort', 'sort-default']; - } else { - if (this.isAscending) { - return ['fa', 'fa-caret-down', 'sort-activated']; - } else { - return ['fa', 'fa-caret-up', 'sort-activated']; - } - } - }; - - makeCsv = (): void => { - const el = this.$element.find('.table-wrapper').children('table'); - const csvString: string | boolean = Table2CSVService.export(el, { delivery: 'value' }); - // var bom = "\xEF\xBB\xBF"; //just for excel - if (typeof csvString === 'string') { - const bom2 = '\uFEFF'; //just for excel - const blob = new Blob([bom2 + csvString], { - type: 'text/csv;charset=utf-8;', - }); - - const downloadContainer = angular.element('
    '); - const downloadLink = angular.element(downloadContainer.children()[0]); - downloadLink.attr('href', window.URL.createObjectURL(blob)); - downloadLink.attr('download', 'TableData.csv'); - downloadLink.attr('target', '_blank'); - - $(document).find('body').append(downloadContainer); - void this.$timeout(() => { - downloadLink[0].click(); - downloadLink.remove(); - }, null); - } else { - this.growl.error('Error generating CSV; Please Try Again'); - } - }; - - public scroll = (): void => { - if (this._fixedColumnsElem) { - const scroll = this.$element.find('.table-fix-column').scrollLeft(); - this._fixedColumnsElem.css('transform', `translateX(${scroll}px)`); - } - if (this._fixedHeadersElem) { - const scroll = this.$element.find('.table-fix-head').scrollTop(); - this._fixedHeadersElem.css('transform', `translateY(${scroll}px)`); - } - if (this._fixedHeadersElem && this._fixedColumnsElem) { - const scrollX = this.$element.find('.table-fix-column').scrollLeft(); - const scrollY = this.$element.find('.table-fix-head').scrollTop(); - this.$captionEl.css('transform', `translate(${scrollX}px, ${scrollY}px)`); - } - }; - public makeFixedHeader = (): void => { - if (!this.fixedHeaders) { - this.$element.find('.table-wrapper').removeClass('table-fix-head').css('height', ''); - this._fixedHeadersElem.css('transform', '').css('will-change', ''); - this._fixedHeadersElem = null; - window.localStorage.setItem('ve-table-header-' + this.instanceSpec.id, 'false'); - return; - } - this.$element - .find('.table-wrapper') - .addClass('table-fix-head') - .css('height', window.innerHeight - 36 * 3); - //heights for navbar, menu, toolbar - this._fixedHeadersElem = this.$element.find('thead, caption'); - this._fixedHeadersElem.css('will-change', 'transform'); //browser optimization - this.$element.find('.table-fix-head').on('scroll', this.scroll); - window.localStorage.setItem('ve-table-header-' + this.instanceSpec.id, 'true'); - }; - - public makeFixedColumn = (): void => { - if (!this.fixedColumns) { - this.$element.find('.table-wrapper').removeClass('table-fix-column').css('width', ''); - this._fixedColumnsElem.css('transform', '').css('will-change', '').removeClass('table-fixed-cell'); - this._fixedColumnsElem = null; - window.localStorage.setItem('ve-table-column-' + this.instanceSpec.id, 'false'); - return; - } - this.$element - .find('.table-wrapper') - .addClass('table-fix-column') - .css('width', window.innerWidth - 400); - this._fixedColumnsElem = this._findColumnCells('thead', 'th', this.numFixedColumns); - this._fixedColumnsElem = this._fixedColumnsElem.add(this._findColumnCells('tbody', 'td', this.numFixedColumns)); - this._fixedColumnsElem = this._fixedColumnsElem.add(this.$element.find('.table-fix-column caption')); - this._fixedColumnsElem.css('will-change', 'transform'); //browser optimization - this._fixedColumnsElem.addClass('table-fixed-cell'); - this.$element.find('.table-fix-column').on('scroll', this.scroll); - window.localStorage.setItem('ve-table-column-' + this.instanceSpec.id, this.numFixedColumns.toString()); - }; - - public updateFixedColumns = (): void => { - this.fixedColumns = false; - this.makeFixedColumn(); - this.fixedColumns = true; - this.makeFixedColumn(); - }; - - private _findColumnCells = (bodyTag: string, cellTag: string, n: number): JQuery => { - const spanData: boolean[][] = []; //if spanData[curRow][curCol] is true that means that 'cell' should be "" due to merged cell - let curRow = 0; - let data = $(); - $(this.$element) - .find('.table-fix-column table') - .children(bodyTag) - .children('tr') - .each((index, element) => { - let curCol = 0; - $(element) - .children(cellTag) - .each((index, element) => { - while (spanData[curRow] && spanData[curRow][curCol]) { - curCol++; - } - if (curCol >= n) { - return; - } - data = data.add($(element)); - const rowstring = $(element).attr('rowspan'); - let rowspan = 0; - if (rowstring) { - rowspan = parseInt(rowstring); - if (rowspan > 1) { - for (let i = 1; i < rowspan; i++) { - if (!spanData[curRow + i]) { - spanData[curRow + i] = []; - } - spanData[curRow + i][curCol] = true; - } - } - } - const colstring = $(element).attr('colspan'); - if (!colstring) { - curCol++; - return; - } - let colspan = parseInt(colstring); - while (colspan > 1) { - curCol++; - colspan--; - if (rowspan > 1) { - for (let j = 1; j < rowspan; j++) { - spanData[curRow + j][curCol] = true; - } - } - } - curCol++; - }); - curRow++; - }); - return data; - }; - - private compileTable(): void { - void this.$timeout( - () => { - const first = this.nextIndex; - if (first > this.lastIndex) return; - const now = this.trs.slice(first, first + 300); - this.$compile(now)(this.$scope); - this.nextIndex = first + 300; - if (this.nextIndex < this.lastIndex) this.compileTable(); - else { - if (window.localStorage.getItem('ve-table-header-' + this.instanceSpec.id) == 'true') { - this.fixedHeaders = true; - this.makeFixedHeader(); - } - const columnFix = window.localStorage.getItem('ve-table-column-' + this.instanceSpec.id); - if (columnFix != 'false' && columnFix != null && columnFix != 'null') { - this.fixedColumns = true; - this.numFixedColumns = Number.parseInt(columnFix); - this.makeFixedColumn(); - } - } - }, - 100, - false - ); - } -} - -const PresentTableComponent: IPresentationComponentOptions = { - selector: 'presentTable', - template: ` -
    - - - - - - - - -
    - Showing {{$ctrl.numFiltered}} of {{$ctrl.numTotal}} Rows: -
    -
    -`, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: PresentTableController, -}; - -veComponents.component(PresentTableComponent.selector, PresentTableComponent); diff --git a/src/ve-components/presentations/index.ts b/src/ve-components/presentations/index.ts deleted file mode 100644 index d636c87c8..000000000 --- a/src/ve-components/presentations/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -export * from './presentation-element.controller'; - -//Services -import './services/ViewHtml.service'; -import './services/Presentation.service'; - -export * from './services/ViewHtml.service'; -export * from './services/Presentation.service'; - -//Components -import './add-pe-menu.component'; -import './view.component'; - -export * from './view.component'; -import './view-pe.component'; - -export * from './view-pe.component'; -import './mms-view-link.component'; - -//Presentations -import './components/present-equation.component'; -import './components/present-figure.component'; -import './components/present-image.component'; -import './components/present-list.component'; -import './components/present-list-t.component'; -import './components/present-paragraph.component'; -import './components/present-table.component'; -import './components/present-table-t.component'; -import './components/present-section.component'; -import './components/present-comment.component'; diff --git a/src/ve-components/presentations/mms-view-link.component.ts b/src/ve-components/presentations/mms-view-link.component.ts deleted file mode 100644 index 556d29cdf..000000000 --- a/src/ve-components/presentations/mms-view-link.component.ts +++ /dev/null @@ -1,265 +0,0 @@ -import $ from 'jquery'; - -import { ViewController } from '@ve-components/presentations/view.component'; -import { ExtensionService } from '@ve-components/services'; -import { CrossReferenceController } from '@ve-components/transclusions/mms-cf.component'; -import { ApplicationService } from '@ve-utils/application'; -import { ApiService, ElementService, ViewService } from '@ve-utils/mms-api-client'; -import { handleChange, onChangesCallback } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject, ElementsRequest } from '@ve-types/mms'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsViewLink - * - * @requires veUtils/ElementService - * @requires $compile - * - * * Given a view id and optional document id, creates a html link - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {string} mmsDocId Document context of view - * @param {string} mmsPeId Document context of view - */ -class ViewLinkController implements angular.IComponentController { - //Bindings - public mmsElementId: string; - mmsProjectId: string; - mmsRefId: string; - mmsCommitId: string; - mmsDocId: string; - mmsPeId: string; - linkText: string; - linkClass: string; - linkIconClass: string; - linkTarget: string; - mmsExternalLink: boolean; - suppressNumbering: boolean; - showName: boolean; - - // Controllers - private mmsCfCtrl: CrossReferenceController; - private mmsViewCtrl: ViewController; - - // Locals - loading: boolean = true; - target: string; - private processed: boolean = false; - projectId: string; - refId: string; - commitId: string; - element: ElementObject; - elementName: string; - type: string; - $transcludeEl: JQuery; - - static $inject = [ - '$scope', - '$element', - '$compile', - 'growl', - 'ElementService', - 'ApiService', - 'ViewService', - 'ApplicationService', - 'ExtensionService', - ]; - suffix: string; - hash: string; - href: string; - private docid: string; - showNum: boolean; - vid: string; - - constructor( - private $scope: angular.IScope, - private $element: JQuery, - private $compile: angular.ICompileService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private apiSvc: ApiService, - private viewSvc: ViewService, - private applicationSvc: ApplicationService, - private extensionSvc: ExtensionService - ) {} - - $onInit(): void { - this.target = this.linkTarget ? this.linkTarget : '_self'; - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - handleChange(onChangesObj, 'mmsElementId', this.changeAction); - } - - $postLink(): void { - this.changeAction(this.mmsElementId, '', false); - } - - protected changeAction: onChangesCallback = (newVal, oldVal, firstChange) => { - if (!newVal || (newVal === oldVal && this.processed)) return; - - this.processed = true; - - let projectId = this.mmsProjectId; - let refId = this.mmsRefId; - let commitId = this.mmsCommitId; - let docid = this.mmsDocId; - if (this.mmsCfCtrl) { - const cfVersion = this.mmsCfCtrl.getElementOrigin(); - if (!projectId) projectId = cfVersion.projectId; - if (!refId) refId = cfVersion.refId; - if (!commitId) commitId = cfVersion.commitId; - } - if (this.mmsViewCtrl) { - const viewVersion = this.mmsViewCtrl.getElementOrigin(); - if (!projectId) projectId = viewVersion.projectId; - if (!refId) refId = viewVersion.refId; - if (!commitId) commitId = viewVersion.commitId; - } - if (!projectId) { - return; - } - this.projectId = projectId; - this.refId = refId ? refId : 'master'; - this.commitId = commitId ? commitId : 'latest'; - let elementId = this.mmsElementId; - if (!elementId && this.mmsPeId && !this.mmsDocId) { - elementId = this.applicationSvc.getState().currentDoc; - } - - const reqOb: ElementsRequest = { - elementId, - projectId, - refId, - commitId, - }; - this.elementSvc - .getElement(reqOb, 1) - .then( - (data: ElementObject) => { - this.element = data; - this.elementName = data.name; - this.type = 'Section '; - this.suffix = ''; - this.hash = '#' + data.id; - if (this.mmsPeId && this.mmsPeId !== '') { - const reqPEOb: ElementsRequest = { - elementId: this.mmsPeId, - projectId, - refId, - commitId, - }; - this.elementSvc.getElement(reqPEOb).then( - (pe) => { - this.vid = pe.id; - this.element = pe; - this.elementName = pe.name; - if (this.viewSvc.isTable(pe)) { - this.type = 'Table '; - } else if (this.viewSvc.isFigure(pe)) { - this.type = 'Fig. '; - } else if (this.viewSvc.isEquation(pe)) { - this.type = 'Eq. ('; - this.suffix = ')'; - } - if (this.applicationSvc.getState().fullDoc) { - this.href = `main.project.ref.view.present.document({ projectId: $ctrl.projectId, refId: $ctrl.refId, documentId: $ctrl.docid, viewId: $ctrl.vid })`; - } else { - this.href = `main.project.ref.view.present.slideshow({ projectId: $ctrl.projectId, refId: $ctrl.refId, documentId: $ctrl.docid, viewId: $ctrl.vid })`; - } - }, - (reason) => { - this.growl.warning(`Unable to retrieve element: ${reason.message}`); - } - ); - } - if (this.apiSvc.isDocument(data)) { - docid = data.id; - this.docid = docid; - this.vid = data.id; - } else if (this.apiSvc.isView(data) || data.type === 'InstanceSpecification') { - if (!docid || docid === '') { - docid = this.applicationSvc.getState().currentDoc; - } - this.docid = docid; - this.vid = data.id; - } else { - this.$element.html('view link doesn\'t refer to a view'); - } - if (this.applicationSvc.getState().fullDoc) { - this.href = `main.project.ref.view.present.document({ projectId: $ctrl.projectId, refId: $ctrl.refId, documentId: $ctrl.docid, viewId: $ctrl.vid })`; - } else { - this.href = `main.project.ref.view.present.slideshow({ projectId: $ctrl.projectId, refId: $ctrl.refId, documentId: $ctrl.docid, viewId: $ctrl.vid })`; - } - this.showNum = - this.applicationSvc.getState().inDoc && - this.applicationSvc.getState().currentDoc === this.docid && - !this.suppressNumbering; - }, - (reason) => { - this.$element.empty(); - this.$transcludeEl = $( - '' - ); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)( - Object.assign(this.$scope.$new(), { - elementId: reqOb.elementId, - recentElement: reason.recentVersionOfElement, - type: 'link', - }) - ); - } - ) - .finally(() => { - this.loading = false; - }); - }; -} - -export const MmsViewLinkComponent: VeComponentOptions = { - selector: 'mmsViewLink', - template: ` - - - - {{$ctrl.linkText}} - {{$ctrl.type}}{{$ctrl.element._veNumber}}{{$ctrl.suffix}} - {{$ctrl.elementName || "Unnamed View"}} - {{$ctrl.type}}{{$ctrl.element._veNumber}}{{$ctrl.suffix}} - {{$ctrl.elementName || "Unnamed View"}} - - - - - -`, - require: { - mmsCfCtrl: '?^^mmsCf', - mmsViewCtrl: '?^^view', - }, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsDocId: '@', - mmsPeId: '@', - linkText: '@?', - linkClass: '@?', - linkIconClass: '@?', - linkTarget: '@?', - mmsExternalLink: ' { - const d3 = $window.d3; - - const svgContainer = d3.select(element[0]).append('svg').attr('width', 520).attr('height', 70); - let colorRect; - - if (scope.state == 'Identified') { - colorRect = ['brown', '#B0B0B0', '#B0B0B0', '#B0B0B0', '#B0B0B0']; - } else if (scope.state == 'Draft') { - colorRect = ['#FF7519', '#FF7519', '#B0B0B0', '#B0B0B0', '#B0B0B0']; - } else if (scope.state == 'Prelim') { - colorRect = ['#FFAA00', '#FFAA00', '#FFAA00', '#B0B0B0', '#B0B0B0']; - } else if (scope.state == 'Baseline') { - colorRect = ['#04859E', '#04859E', '#04859E', '#04859E', '#B0B0B0']; - } else if (scope.state == 'Final') { - colorRect = ['#00BD39', '#00BD39', '#00BD39', '#00BD39', '#00BD39']; - } else { - colorRect = ['#B0B0B0', '#B0B0B0', '#B0B0B0', '#B0B0B0', '#B0B0B0']; - } - - svgContainer - .append('rect') - .attr('x', 10) - .attr('y', 10) - .attr('width', 100) - .attr('height', 50) - .style('fill', colorRect[0]) - .style('stroke', '#fff') - .style('stroke-width', 3); - svgContainer - .append('text') - .text('Identified') - .attr('x', 60) - .attr('y', 35) - .attr('dy', '.35em') - .attr('fill', '#fff') - .attr('font-family', 'sans-serif') - .style('text-anchor', 'middle'); - svgContainer - .append('rect') - .attr('x', 110) - .attr('y', 10) - .attr('width', 100) - .attr('height', 50) - .style('fill', colorRect[1]) - .style('stroke', '#fff') - .style('stroke-width', 3); - svgContainer - .append('text') - .text('Draft') - .attr('x', 160) - .attr('y', 35) - .attr('dy', '.35em') - .attr('fill', '#fff') - .attr('font-family', 'sans-serif') - .style('text-anchor', 'middle'); - svgContainer - .append('rect') - .attr('x', 210) - .attr('y', 10) - .attr('width', 100) - .attr('height', 50) - .style('fill', colorRect[2]) - .style('stroke', '#fff') - .style('stroke-width', 3); - svgContainer - .append('text') - .text('Prelim') - .attr('x', 260) - .attr('y', 35) - .attr('dy', '.35em') - .attr('fill', '#fff') - .attr('font-family', 'sans-serif') - .style('text-anchor', 'middle'); - svgContainer - .append('rect') - .attr('x', 310) - .attr('y', 10) - .attr('width', 100) - .attr('height', 50) - .style('fill', colorRect[3]) - .style('stroke', '#fff') - .style('stroke-width', 3); - svgContainer - .append('text') - .text('Baseline') - .attr('x', 360) - .attr('y', 35) - .attr('dy', '.35em') - .attr('fill', '#fff') - .attr('font-family', 'sans-serif') - .style('text-anchor', 'middle'); - svgContainer - .append('rect') - .attr('x', 410) - .attr('y', 10) - .attr('width', 100) - .attr('height', 50) - .style('fill', colorRect[4]) - .style('stroke', '#fff') - .style('stroke-width', 3); - svgContainer - .append('text') - .text('Final') - .attr('x', 460) - .attr('y', 35) - .attr('dy', '.35em') - .attr('fill', '#fff') - .attr('font-family', 'sans-serif') - .style('text-anchor', 'middle'); - }; - - return { - restrict: 'E', - template: '', - scope: { - state: '@', - }, - link: mmsMaturityBarLink, - }; -} diff --git a/src/ve-components/presentations/presentation-element.controller.ts b/src/ve-components/presentations/presentation-element.controller.ts deleted file mode 100644 index f0aa45e5d..000000000 --- a/src/ve-components/presentations/presentation-element.controller.ts +++ /dev/null @@ -1,197 +0,0 @@ -import $ from 'jquery'; - -import { ViewHtmlService, ViewPresentationElemController, PresentationService } from '@ve-components/presentations'; -import { ViewController } from '@ve-components/presentations/view.component'; -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { ImageService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { - ElementObject, - InstanceSpecObject, - InstanceValueObject, - PresentationInstanceObject, - ViewObject, -} from '@ve-types/mms'; - -export class PresentationLite { - //Bindings - public peObject: PresentationInstanceObject; - public instanceSpec: InstanceSpecObject; - public peNumber: string; -} - -export class Presentation extends PresentationLite { - //Bindings - protected mmsProjectId: string; - protected mmsRefId: string; - protected mmsCommitId: string; - - //Deps - protected mmsViewPresentationElemCtrl: ViewPresentationElemController; - protected mmsViewCtrl: ViewController; - - subs: Rx.IDisposable[]; - - //Common - //public element: ElementObject; - protected $transcludeEl: JQuery; - public view: ViewObject; - public projectId: string; - public refId: string; - public commitId: string; - public instanceVal: InstanceValueObject; - protected presentationElem: PresentationInstanceObject | ElementObject; - protected isDirectChildOfPresentationElement: boolean; - - public number: string; - public level: number; - - private schema = 'cameo'; - - static $inject = [ - '$q', - '$element', - '$scope', - '$compile', - 'growl', - 'SchemaService', - 'ViewHtmlService', - 'PresentationService', - 'ComponentService', - 'EventService', - 'ImageService', - 'ButtonBarService', - 'ExtensionService', - ]; - constructor( - protected $q: VeQService, - protected $element: JQuery, - public $scope: angular.IScope, - protected $compile: angular.ICompileService, - protected growl: angular.growl.IGrowlService, - protected schemaSvc: SchemaService, - protected viewHtmlSvc: ViewHtmlService, - protected presentationSvc: PresentationService, - protected componentSvc: ComponentService, - protected eventSvc: EventService, - protected imageSvc: ImageService, - protected buttonBarSvc: ButtonBarService, - protected extensionSvc: ExtensionService - ) { - super(); - } - - /** - * @listens element.updated - */ - $onInit(): void { - this.eventSvc.$init(this); - - this.setNumber(); - - let projectId = this.mmsProjectId; - let refId = this.mmsRefId; - let commitId = this.mmsCommitId; - - if (this.mmsViewCtrl) { - const viewVersion = this.mmsViewCtrl.getElementOrigin(); - if (!projectId) projectId = viewVersion.projectId; - if (!refId) refId = viewVersion.refId; - if (!commitId) commitId = viewVersion.commitId; - } - this.projectId = projectId; - this.refId = refId ? refId : 'master'; - this.commitId = commitId ? commitId : 'latest'; - - this.config(); - } - - $postLink(): void { - this.recompile(); - } - - // Presentation Api - - /** - * @name Presentation/config - * - * @description Extension API method to allow presentation components to implement custom initialization steps. - * Such as non-standard variables or services. - */ - protected config = (): void => { - /* Implement any initialization Logic Here */ - }; - - /** - * @name Presentation/getContent - * - * @description Extension API method in which presentation components should return the content they wish to display. - */ - protected getContent = (): VePromise => { - return this.$q.reject('Not Yet Implemented'); - }; - - /** - * @name Presentation/recompile - * - * @description Re-defining this API method is an advanced technique. It is not recommended to use this for simple - * presentation use-cases. This function causes the redrawing of the presentation element and re-compilation in the DOM. - * This function is automatically triggered by the "element.updated" event. - */ - protected recompile = (): void => { - this.setNumber(); - this.getContent().then( - (result) => { - this.$element.empty(); - this.$transcludeEl = $(result); - this.$transcludeEl.find('img').each((index, element) => { - this.imageSvc.fixImgSrc($(element)); - }); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)(this.$scope); - }, - (reason) => { - const reqOb = { - elementId: this.instanceSpec.id, - projectId: this.projectId, - refId: this.refId, - commitId: this.commitId, - //includeRecentVersionElement: true, - }; - this.$element.empty(); - //TODO: Add reason/errorMessage handling here. - this.$transcludeEl = $( - '' - ); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)( - Object.assign(this.$scope.$new(), { - elementId: reqOb.elementId, - recentElement: reason.recentVersionOfElement, - type: 'presentation', - }) - ); - } - ); - }; - - // Static Helper Functions - /** - * @name Presentation/setNumber - * @type function - * - * @description Helper function which will set the level and number of the PE. Contains logic that - * will handle cases where the {string} peNumber is parsed as an integer that will be treated as level 1 - */ - public setNumber = (): void => { - if (this.peNumber) { - if (Number.isInteger(this.peNumber)) this.level = 1; - else this.level = this.peNumber.split('.').length; - this.number = this.peNumber; - } - }; -} diff --git a/src/ve-components/presentations/services/Presentation.service.ts b/src/ve-components/presentations/services/Presentation.service.ts deleted file mode 100644 index bb53f2f1b..000000000 --- a/src/ve-components/presentations/services/Presentation.service.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { InsertPresentationData } from '@ve-components/insertions/components/insert-pe.component'; -import { ViewService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { InsertResolveFn } from '@ve-types/components'; -import { ElementObject, InstanceSpecObject, InstanceValueObject } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; -import { EventService } from "@ve-utils/core"; - -export class PresentationService { - private revertData: { - elementId: string; - baseCommit: object; - refId: string; - compareCommit: object; - projectId: string; - element: object; - }; - - static $inject = ['$timeout', '$uibModal', 'growl', 'ViewService', 'EventService']; - - constructor( - private $timeout: angular.ITimeoutService, - private $uibModal: VeModalService, - private growl: angular.growl.IGrowlService, - private viewSvc: ViewService, - private eventSvc: EventService - ) {} - - public checkForDuplicateInstances(operand: InstanceValueObject[]): InstanceValueObject[] { - const seen: { [id: string]: boolean } = {}, - dups: InstanceValueObject[] = [], - cleared: InstanceValueObject[] = []; - let curr: string; - operand.forEach((value, index) => { - curr = value.instanceId; - if (curr) { - if (seen[curr]) { - dups.push(value); - operand.splice(index, 1); - return; - } - cleared.push(value); - seen[curr] = true; - } - }); - operand.length = 0; - operand.push(...cleared); - return dups; - } - - /** - * @name PresentationService#addPresentationElement - * Utility to add a new presentation element to view or section - * - * @param {Object} $ctrl controller - * @param {string} type type of presentation element (Paragraph, Section) - * @param {ElementObject} viewOrSectionOb the view or section (instance spec) object - */ - public addPresentationElement($ctrl: { addPeIndex: number }, type: string, viewOrSectionOb: ElementObject): void { - // $ctrl.viewOrSectionOb = viewOrSectionOb; - // $ctrl.presentationElemType = type; - const instance = this.$uibModal.open, InstanceSpecObject>({ - component: 'insertElementModal', - resolve: { - getInsertData: (): InsertPresentationData => { - return { - insertType: 'pe', - type, - viewOrSectionOb, - addPeIndex: $ctrl.addPeIndex, - parentBranch: null, - }; - }, - getProjectId: () => { - return viewOrSectionOb._projectId; - }, - getRefId: () => { - return viewOrSectionOb._refId; - }, - getOrgId: () => { - return ''; - }, - }, - }); - instance.result.then( - (data) => { - //send event to tree - this.eventSvc.$broadcast('view.reordered', viewOrSectionOb); - if (data.type !== 'InstanceSpecification' || this.viewSvc.isSection(data)) { - return; //do not open editor for existing pes added or if pe/owner is a section - } - void this.$timeout( - () => { - //auto open editor for newly added pe - $('#' + data.id) - .find('transclude-doc,transclude-com') - .trigger('click'); - }, - 0, - false - ); - }, - (reason) => { - if (reason && reason.status !== 444) { - this.growl.warning(`Error adding PE: ${reason.message}`); - } else { - this.growl.info('PE Insert Cancelled', { - ttl: 1000, - }); - } - } - ); - } -} - -veComponents.service('PresentationService', PresentationService); diff --git a/src/ve-components/presentations/services/Table2CSV.service.ts b/src/ve-components/presentations/services/Table2CSV.service.ts deleted file mode 100644 index 04bb4ec81..000000000 --- a/src/ve-components/presentations/services/Table2CSV.service.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { veComponents } from '@ve-components'; - -export class Table2CSVService { - public static export(el: JQuery, inputOptions: JQuery.table2CSV.inputOptions): string { - const options = jQuery.extend( - { - separator: ',', - header: [], - delivery: 'popup', // popup, value - }, - inputOptions - ); - - const csvData: string[] = []; - // const el = this - const row2CSV = (tmpRow: string[]): void => { - const tmp = tmpRow.join(''); // to remove any blank rows - if (tmpRow.length > 0 && tmp != '') { - csvData[csvData.length] = tmpRow.join(options.separator); - } - }; - const formatData = (input: string): string => { - // replace " with “ - const regexp = new RegExp(/["]/g); - let output = input.replace(regexp, '“'); - //HTML - // var regexp = new RegExp(/\<[^\<]+\>/g); - // var output = output.replace(regexp, ""); - const i = output.search(/\S/); //index of first non whitespace char - if (i > 0) { - output = '_'.repeat(i) + $.trim(output); - } - output = $.trim(output); - if (output == '') return ''; - if (output[0] == '+' || output[0] == '=' || output[0] == '-') { - output = ' ' + output; - } - return `"${output}"`; - }; - const popup = (data: string): string => { - const generator = window.open('', 'csv', 'height=400,width=600'); - generator.document.write('CSV'); - generator.document.write(''); - generator.document.write(''); - generator.document.write(''); - generator.document.close(); - return 'ok'; - }; - const handleMatrix = (bodyTag: string, cellTag: string): void => { - const spanData: { [row: number]: { [column: number]: unknown } } = {}; //if spanData[curRow][curCol] is true that means that 'cell' should be "" due to merged cell - let curRow = 0; - $(el) - .children(bodyTag) - .children('tr') - .each((index, element) => { - tmpRow = []; - let curCol = 0; - $(element) - .children(cellTag) - .each((index, element) => { - while (spanData[curRow] && spanData[curRow][curCol]) { - tmpRow.push('""'); - curCol++; - } - tmpRow.push(formatData($(element).text())); - const rowstring = $(element).attr('rowspan'); - const rowspan = parseInt(rowstring); - if (rowspan && rowspan > 1) { - for (let i = 1; i < rowspan; i++) { - if (!spanData[curRow + i]) { - spanData[curRow + i] = {}; - } - spanData[curRow + i][curCol] = true; - } - } - const colstring = $(element).attr('colspan'); - if (!colstring) { - curCol++; - return; - } - let colspan = parseInt(colstring); - while (colspan > 1) { - curCol++; - tmpRow.push('""'); - colspan--; - if (rowspan > 1) { - for (let i = 1; i < rowspan; i++) { - spanData[curRow + i][curCol] = true; - } - } - } - curCol++; - }); - row2CSV(tmpRow); - curRow++; - }); - }; - - //header - const numCols = options.header.length; - let tmpRow: string[] = []; - if (numCols > 0) { - for (let i = 0; i < numCols; i++) { - tmpRow[tmpRow.length] = formatData(options.header[i]); - } - } else { - handleMatrix('thead', 'th'); - } - // actual data - handleMatrix('tbody', 'td'); - const mydata = csvData.join('\n'); - if (options.delivery == 'popup') { - return popup(mydata); - } else { - return mydata; - } - } -} -veComponents.service('Table2CSVService', Table2CSVService); diff --git a/src/ve-components/presentations/services/ViewHtml.service.ts b/src/ve-components/presentations/services/ViewHtml.service.ts deleted file mode 100644 index 3dc9d009d..000000000 --- a/src/ve-components/presentations/services/ViewHtml.service.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { ApplicationService } from '@ve-utils/application'; - -import { veComponents } from '@ve-components'; - -import { ITableConfig } from '@ve-types/components/presentation'; -import { - PresentationInstanceObject, - PresentImageObject, - PresentListObject, - PresentTableObject, - PresentTextObject, - TableEntryObject, -} from '@ve-types/mms'; - -export class ViewHtmlService { - public tableConfig: ITableConfig = { - sortByColumnFn: () => { - /* Put Sorting Logic here */ - }, - showBindingForSortIcon: -1, - filterDebounceRate: 200, - filterTermColumnPrefixBinding: 'filterTermForColumn', - }; - - static $inject = ['ApplicationService']; - - constructor(private applicationSvc: ApplicationService) {} - - /** - * @name veComponents.TableService#makeHtmlTable - * make html table based on table spec object - * - * @param {object} table table content - * @param {boolean} isFilterable table content - * @param {boolean} isSortable table content - * @returns {string} generated html string - */ - public makeHtmlTable = (table: PresentTableObject, isFilterable?: boolean, isSortable?: boolean, pe?): string => { - const result = ['']; - if (table.colwidths && table.colwidths.length > 0) { - result.push(''); - for (let i = 0; i < table.colwidths.length; i++) { - if (table.colwidths[i]) { - result.push(''); - } else { - result.push(''); - } - } - result.push(''); - } - result.push(''); //put tbody before thead to control stacking context so if freeze header/columns are both used headers cover cells (?) - //https://stackoverflow.com/questions/45676848/stacking-context-on-table-elementhead-and-body - result.push(this.makeTableBody(table.body, false)); - result.push(''); - if (table.header && table.header.length) { - // only add styling to the filterable or sortable header - if (isFilterable || isSortable) { - result.push(''); - } else { - result.push(''); - } - - result.push(this.makeTableBody(table.header, true, isFilterable, isSortable)); - result.push(''); - } - if (this.applicationSvc.getState().inDoc && !table.excludeFromList) { - result.push( - '' - ); - } else if (table.title) { - result.push(''); - } //same for caption to control stacking context - result.push('
    Table {{$ctrl.instanceSpec._veNumber}}. {{$ctrl.table.title || $ctrl.instanceSpec.name}}' + table.title + '
    '); - return result.join(''); - }; - - /** Include row and column number for table's header data object **/ - public generateRowColNumber(header: TableEntryObject[][]): void { - header.forEach((row, rowIndex) => { - let startCol = 0; - let colCounter = 0; - row.forEach((cell, cellIndex) => { - // startCol is always 0 except when row > 0th and on cell === 0th && rowSpan of the previous row's first element is larger than 1 - // This is the only time when we need to offset the starting colNumber for cells under merged this.column(s) - if (rowIndex !== 0 && cellIndex === 0 && Number(header[rowIndex - 1][0].rowspan) > 1) { - startCol = Number(header[rowIndex - 1][0].colspan); - } - const colSpan = Number(cell.colspan); - cell.startRow = rowIndex; - cell.endRow = cell.startRow + Number(cell.rowspan) - 1; - cell.startCol = startCol + colCounter; - cell.endCol = cell.startCol + colSpan - 1; - colCounter += colSpan; - }); - startCol = 0; - colCounter = 0; - }); - } - - /** - * @name veComponents.TableService#makeTableBody - * make html table body based on body spec object - * - * @param {object} body body content - * @param {boolean} isHeader is header - * @param {boolean} isFilterable is filterable - * @param {boolean} isSortable is sortable - * @returns {string} generated html string - */ - public makeTableBody( - body: TableEntryObject[][], - isHeader: boolean, - isFilterable?: boolean, - isSortable?: boolean - ): string { - if (isHeader && (isFilterable || isSortable)) { - this.generateRowColNumber(body); - } - const result = []; - const dtag: string = isHeader ? 'th' : 'td'; - body.forEach((row) => { - result.push(''); - row.forEach((cell) => { - result.push(`<${dtag} colspan="${cell.colspan}" rowspan="${cell.rowspan}">`); - cell.content.forEach((thing) => { - if (isFilterable || isSortable) { - result.push('
    '); - } else { - result.push('
    '); - } - let thingString = this.makeHtml(thing); - if (thing.type === 'Paragraph') { - if ((isFilterable || isSortable) && thing.sourceType === 'text' && dtag === 'th') { - thingString = thingString.replace('

    ', '

    '); - } - } - result.push(thingString); - result.push('

    '); - if (isHeader) { - if (isSortable && Number(cell.colspan) === 1) { - result.push( - `` - ); - } - if (isFilterable) { - result.push( - `` - ); - } - } - }); - result.push(''); - }); - result.push(''); - }); - return result.join(''); - } - - /** - * @name veUtils/UtilsService#makeHtmlList - * make html list string based on list spec object - * - * @param {object} list list specification object - * @returns {string} generated html string - */ - public makeHtmlList = (list: PresentListObject): string => { - const result: string[] = []; - if (list.ordered) result.push('
      '); - else result.push('
        '); - list.list.forEach((item) => { - result.push('
      • '); - item.forEach((thing) => { - result.push('
        '); - result.push(this.makeHtml(thing)); - result.push('
        '); - }); - result.push('
      • '); - }); - if (list.ordered) result.push('
    '); - else result.push(''); - return result.join(''); - }; - - /** - * @name veUtils/UtilsService#makeHtmlPara - * make html para string based on para spec object - * - * @param {object} para paragraph spec object - * @returns {string} generated html string - */ - public makeHtmlPara = (para: PresentTextObject): string => { - if (para.sourceType === 'text') return para.text; - let t = 'doc'; - let attr = ''; - if (para.sourceProperty === 'name') { - t = 'name'; - } - if (para.sourceProperty === 'value') { - t = 'val'; - } - if (para.nonEditable) { - attr = ` non-editable="${para.nonEditable.toString()}"`; - } - return ''; - }; - - public makeHtml = (thing: PresentationInstanceObject): string => { - if (thing.type === 'Paragraph') { - return this.makeHtmlPara(thing as PresentTextObject); - } else if (thing.type === 'Table') { - return this.makeHtmlTable(thing as PresentTableObject); - } else if (thing.type === 'List') { - return this.makeHtmlList(thing as PresentListObject); - } else if (thing.type === 'Image') { - return ``; - } - }; -} - -veComponents.service('ViewHtmlService', ViewHtmlService); diff --git a/src/ve-components/presentations/view-pe.component.ts b/src/ve-components/presentations/view-pe.component.ts deleted file mode 100644 index 35f0f0864..000000000 --- a/src/ve-components/presentations/view-pe.component.ts +++ /dev/null @@ -1,205 +0,0 @@ -import $ from 'jquery'; - -import { ViewController } from '@ve-components/presentations/view.component'; -import { ExtensionService } from '@ve-components/services'; -import { TreeService } from '@ve-components/trees'; -import { EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromiseReason } from '@ve-types/angular'; -import { - ElementObject, - ElementsRequest, - InstanceSpecObject, - InstanceValueObject, - PresentationInstanceObject, -} from '@ve-types/mms'; - -/** - * @ngdoc component - * @name veComponents.component:mmsViewPresentationElem - * - * @requires veUtils/ViewService - * @requires veUtils/ElementService - * @requires $templateCache - * @requires $location - * @requires $timeout - * @requires $rootScope - * @requires $anchorScroll - * @requires growl - * - * - * * Given a InstanceVal, parses the element reference tree to get the corresponding - * presentation element, and renders it in the view - * - * @param {Object} mmsInstanceVal A InstanceValue json object - * @param {Object} mmsParentSection the parent section if available - */ -export class ViewPresentationElemController implements angular.IComponentController { - private mmsInstanceVal: InstanceValueObject; - private mmsParentSection: InstanceSpecObject; - - private viewCtrl: ViewController; - - public subs: Rx.IDisposable[]; - - public presentationElemLoading: boolean; - public instanceSpec: InstanceSpecObject; - public presentationElem: PresentationInstanceObject | ElementObject; - public peNumber: string; - - static $inject = [ - '$scope', - '$element', - '$timeout', - '$location', - '$anchorScroll', - '$compile', - 'growl', - 'ViewService', - 'ElementService', - 'TreeService', - 'ExtensionService', - 'EventService', - ]; - constructor( - private $scope: angular.IScope, - private $element: JQuery, - private $timeout: angular.ITimeoutService, - private $location: angular.ILocationService, - private $anchorScroll: angular.IAnchorScrollService, - private $compile: angular.ICompileService, - private growl: angular.growl.IGrowlService, - private viewSvc: ViewService, - private elementSvc: ElementService, - private treeSvc: TreeService, - private extensionSvc: ExtensionService, - private eventSvc: EventService - ) {} - - $onInit(): void { - this.presentationElemLoading = true; - this.eventSvc.$init(this); - - if (!this.mmsInstanceVal || !this.mmsInstanceVal.instanceId) { - this.$element.html('Reference is null'); - return; - } - let projectId: string = null; - let refId: string = null; - let commitId: string = null; - if (this.viewCtrl) { - const viewVersion = this.viewCtrl.getElementOrigin(); - projectId = viewVersion.projectId; - refId = viewVersion.refId; - commitId = viewVersion.commitId; - } - // Parse the element reference tree for the presentation element: - this.$element.addClass('isLoading'); - const reqOb = { - elementId: this.mmsInstanceVal.instanceId, - projectId: projectId, - refId: refId, - commitId: commitId, - //includeRecentVersionElement: true, - }; - this.elementSvc - .getElement(reqOb, 1) - .then( - (instanceSpec) => { - this.viewSvc.getViewElements(reqOb, 1).finally(() => { - this.instanceSpec = instanceSpec; - this.presentationElem = this.viewSvc.getPresentationInstanceObject(instanceSpec); - this.presentationElemLoading = false; - if (this.viewCtrl) { - this.viewCtrl.elementTranscluded(instanceSpec, this.presentationElem.type); - } - this.$element.on('click', (e) => { - if (this.viewCtrl) this.viewCtrl.transcludeClicked(instanceSpec); - e.stopPropagation(); - }); - const tag = this.extensionSvc.getTagByType('present', this.presentationElem.type); - - const newPe = $( - '
    ' - ); - $(newPe).append( - '<' + - tag + - ' pe-object="$ctrl.presentationElem" instance-spec="$ctrl.instanceSpec" pe-number="$ctrl.peNumber">' + - '' - ); - $(this.$element).append(newPe); - this.$compile(newPe)(this.$scope); - }); - }, - (reason) => { - this._error(reqOb, reason); - } - ) - .finally(() => { - this.$element.removeClass('isLoading'); - }); - } - - public getInstanceSpec = (): InstanceSpecObject => { - return this.instanceSpec; - }; - - public getInstanceVal = (): InstanceValueObject => { - return this.mmsInstanceVal; - }; - - public getPresentationElement = (): ElementObject | PresentationInstanceObject => { - return this.presentationElem; - }; - - public getParentSection = (): InstanceSpecObject => { - return this.mmsParentSection; - }; - - private _error = (reqOb: ElementsRequest, reason: VePromiseReason): void => { - if (reason.status === 500) { - this.$element.html( - 'View element reference error: ' + - this.mmsInstanceVal.instanceId + - ' invalid specification' - ); - } else { - this.$element.empty(); - - const annotation = $( - '' - ); - this.$element.append(annotation); - this.$compile(annotation)( - Object.assign(this.$scope.$new(), { - elementId: reqOb.elementId, - recentElement: reason.recentVersionOfElement, - type: 'presentation', - }) - ); - } - }; -} - -const ViewPeComponent: VeComponentOptions = { - selector: 'viewPe', - template: ` -
    -`, - require: { - viewCtrl: '?^^view', - }, - bindings: { - mmsInstanceVal: '<', - mmsParentSection: '<', - }, - controller: ViewPresentationElemController, -}; - -veComponents.component(ViewPeComponent.selector, ViewPeComponent); diff --git a/src/ve-components/presentations/view.component.ts b/src/ve-components/presentations/view.component.ts deleted file mode 100644 index be747407a..000000000 --- a/src/ve-components/presentations/view.component.ts +++ /dev/null @@ -1,436 +0,0 @@ -import { PresentationService } from '@ve-components/presentations/services/Presentation.service'; -import { TreeService } from '@ve-components/trees'; -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ElementService, UserService, ViewApi, ViewService } from '@ve-utils/mms-api-client'; -import { handleChange, onChangesCallback } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { - ElementObject, - ElementsRequest, - ExpressionObject, - InstanceValueObject, - RequestObject, - UserObject, - ValueObject, - ViewInstanceSpec, - ViewObject, -} from '@ve-types/mms'; - -/** - * @ngdoc directive - * @name veComponents.component:View - * - * @requires ViewService - * @requires ElementService - * @requires $element - * @requires growl - * - * * Given a view id, renders the view according to the json given by veUtils/ViewService - * The view has a text edit mode, where transclusions can be clicked. The view's last - * modified time and author is the latest of any transcluded element modified time. - * For available api methods, see methods section. - * - * ## Example - * ### controller (js) - *
    -    angular.module('app', ['ve-components'])
    -    .controller('ViewCtrl', ['this', function(this) {
    -        this.api = {}; //empty object to be populated by the view directive
    -       public handler = (elementId) => {
    -            //element with elementId clicked in view
    -        };
    -       public showComments = () => {
    -            this.api.setShowComments(true);
    -        };
    -    }]);
    -    
    - * ### template (html) - *
    -    
    - - -
    -
    - * ## Example view at a certain commit - *
    -    
    -    
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - */ - -export class ViewController implements angular.IComponentController { - // private presentationElemCleanUpFncs: {(): any}[] = []; - private mmsElementId: string; - private mmsProjectId: string; - private mmsRefId: string; - private mmsCommitId: string; - private mmsLink: boolean; - public mmsViewApi: ViewApi; - private mmsNumber: number; - public noTitle: boolean; - public buttonId: string; - - static $inject = [ - '$element', - 'growl', - 'PresentationService', - 'ViewService', - 'ElementService', - 'UserService', - 'EventService', - 'TreeService', - 'RootScopeService', - ]; - private showEdits: boolean; - private modified: string; - private modifier: UserObject; - private view: ViewObject; - private reqOb: ElementsRequest = { - elementId: '', - projectId: '', - refId: '', - commitId: '', - }; - private processed: boolean; - private isHover: boolean; - private isSection: boolean; - private level: number; - private number: string = ''; - private showComments: boolean; - private showElements: boolean; - private showNumbering: boolean; - public subs: Rx.IDisposable[]; - - constructor( - private $element: JQuery, - private growl: angular.growl.IGrowlService, - private presentationSvc: PresentationService, - private viewSvc: ViewService, - private elementSvc: ElementService, - private userSvc: UserService, - private eventSvc: EventService, - private treeSvc: TreeService, - private rootScopeSvc: RootScopeService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - this.reqOb = { - elementId: this.mmsElementId, - projectId: this.mmsProjectId, - refId: this.mmsRefId, - commitId: this.mmsCommitId, - }; - this.processed = false; - if (this.mmsNumber) { - this.number = this.mmsNumber.toString(10); - } else if (this.treeSvc.branch2viewNumber[this.mmsElementId]) { - this.number = this.treeSvc.branch2viewNumber[this.mmsElementId]; - } - this.showNumbering = this.rootScopeSvc.veNumberingOn(); - - this.isSection = false; - this.showElements = false; - this.showComments = false; - this.showEdits = false; - - this.subs.push( - this.eventSvc.binding(this.rootScopeSvc.constants.VEELEMENTSON, (data) => { - this.toggleShowElements(data); - }), - this.eventSvc.binding(this.rootScopeSvc.constants.VECOMMENTSON, (data) => { - this.toggleShowComments(data); - }), - this.eventSvc.binding(this.rootScopeSvc.constants.VENUMBERINGON, (data) => { - this.showNumbering = data; - }), - this.eventSvc.binding(this.rootScopeSvc.constants.VEEDITMODE, (data) => { - this.toggleShowEdits(data); - }) - ); - - this.subs.push( - this.eventSvc.binding(TreeService.events.UPDATED, (data) => { - if (!data) return; - if (this.treeSvc.branch2viewNumber[this.mmsElementId]) { - this.level = this.treeSvc.branch2viewNumber[this.mmsElementId].split('.').length; - } - }) - ); - - this._changeView(this.mmsElementId, ''); - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - handleChange(onChangesObj, 'mmsNumber', (newVal: string) => { - this.number = newVal; - }); - handleChange(onChangesObj, 'mmsElementId', this._changeView, true); - } - - public isTranscludedElement = (elementName): boolean => { - return ( - elementName === 'MMS-TRANSCLUDE-COM' || - elementName === 'MMS-TRANSCLUDE-DOC' || - elementName === 'MMS-TRANSCLUDE-ART' || - elementName === 'MMS-TRANSCLUDE-IMG' || - elementName === 'MMS-TRANSCLUDE-NAME' || - elementName === 'MMS-TRANSCLUDE-VAL' - ); - }; - - public isEditable = (): boolean => { - return this.showEdits; - }; - - public transcludeClicked = (elementOb: ElementObject): void => { - if (this.mmsViewApi && this.mmsViewApi.elementClicked && elementOb) this.mmsViewApi.elementClicked(elementOb); - }; - - public elementTranscluded = (elem: ElementObject, type: string): void => { - if (elem) { - if (elem._modified > this.modified && type !== 'Comment') { - this.modified = elem._modified; - if (elem._modifier) { - this.userSvc.getUserData(elem._modifier).then( - (result) => { - this.modifier = result; - }, - () => { - this.modifier = { username: elem._modifier }; - } - ); - } - } - if (this.mmsViewApi && this.mmsViewApi.elementTranscluded) this.mmsViewApi.elementTranscluded(elem, type); - } - }; - - //INFO this was getWsAndVersion - public getElementOrigin = (): RequestObject => { - return { - projectId: this.mmsProjectId, - refId: this.mmsRefId, - commitId: this.mmsCommitId, - }; - }; - - public getView = (): ViewObject => { - // this view gets set in the viewlink fnc - return this.view; - }; - - public hoverIn = (): void => { - this.isHover = true; - }; - public hoverOut = (): void => { - this.isHover = false; - }; - - // public setPeLineVisibility($event) { - // window.setTimeout(() => { - // var peContainer = $($event.currentTarget).closest('.add-pe-button-container'); - // if (peContainer.find('.dropdown-menu').css('display') == 'none') { - // f peContainer.find('hr').css('visibility', 'hidden'); - // } else { - // peContainer.find('hr').css('visibility', 'visible'); - // } - // }); - // }; - - private _changeView: onChangesCallback = (newVal, oldVal) => { - if (!newVal || (newVal === oldVal && this.processed)) return; - - this.processed = true; - this.$element.addClass('isLoading'); - this.reqOb = { - elementId: this.mmsElementId, - projectId: this.mmsProjectId, - refId: this.mmsRefId, - commitId: this.mmsCommitId, - }; - this.elementSvc - .getElement(this.reqOb, 1) - .then( - (data) => { - //view accepts a section element - if (data.type === 'InstanceSpecification') { - this.isSection = true; - } - let operand: ValueObject[] = []; - if (data._contents && (data as ViewObject)._contents.operand) { - operand = (data as ViewObject)._contents.operand; - } - if (data.specification && (data as ViewInstanceSpec).specification.operand) { - operand = (data.specification as ExpressionObject).operand; - } - const dups = this.presentationSvc.checkForDuplicateInstances(operand); - if (dups.length > 0) { - this.growl.warning('There are duplicates in this view, duplicates ignored!'); - } - if (data._veNumber) { - this.level = data._veNumber.split('.').length; - } - if ( - //data._numElements && data._numElements > 5000 && - this.mmsCommitId && - this.mmsCommitId !== 'latest' - ) { - //threshold where getting view elements in bulk takes too long and it's not latest - //getting cached individual elements should be faster - this.view = data; - this.modified = data._modified; - this.userSvc.getUserData(data._modifier).then( - (result) => { - this.modifier = result; - }, - () => { - this.modifier = { username: data._modifier }; - } - ); - return; - } - this.viewSvc.getViewElements(this.reqOb, 1).finally(() => { - this.view = data; - this.modified = data._modified; - this.userSvc.getUserData(data._modifier).then( - (result) => { - this.modifier = result; - }, - () => { - this.modifier = { username: data._modifier }; - } - ); - this.$element.removeClass('isLoading'); - }); - }, - (reason) => { - this.growl.error(`Getting View Error: ${reason.message}: ${this.mmsElementId}`); - } - ) - .finally(() => { - if (this.view) this.$element.removeClass('isLoading'); - }); - }; - - /** - * @name veComponents.component:mmsView#toggleShowElements - * toggle elements highlighting - */ - public toggleShowElements = (value?: boolean): void => { - if (typeof value !== 'undefined') { - this.showElements = value; - } else { - this.showElements = !this.showElements; - } - if (this.showElements) { - this.$element.addClass('outline'); - } else if (this.$element.hasClass('outline')) { - this.$element.removeClass('outline'); - } - }; - - /** - * @name veComponents.component:mmsView#toggleShowComments - * toggle comments visibility - */ - public toggleShowComments = (value?: boolean): void => { - if (typeof value !== 'undefined') { - this.showComments = value; - } else { - this.showComments = !this.showComments; - } - if (this.showComments) { - this.$element.addClass('reviewing'); - } else if (this.$element.hasClass('reviewing')) { - this.$element.removeClass('reviewing'); - } - }; - - /** - * @name veComponents.component:mmsView#toggleShowEdits - * toggle elements editor panel - */ - public toggleShowEdits = (value?: boolean): void => { - if (typeof value !== 'undefined') { - this.showEdits = value; - } else { - this.showEdits = !this.showEdits; - } - if (this.showEdits) { - this.$element.addClass('editing'); - } else if (this.$element.hasClass('editing')) { - this.$element.removeClass('editing'); - } - // Call the callback functions to clean up frames, show edits, and - // re-open frames when needed: - // for (let i = 0; i < this.presentationElemCleanUpFncs.length; i++) { - // this.presentationElemCleanUpFncs[i](); - // } - }; -} - -export const ViewComponent: VeComponentOptions = { - selector: 'view', - template: ` -
    -
    -
    -

    - {{$ctrl.view._veNumber}} - -

    -
    -
    - - -
    -
    - Last Modified: {{$ctrl.modified | date:'M/d/yy h:mm a'}} by {{ $ctrl.modifier.email }}{{ $ctrl.modifier }} -
    -
    - - - - -
    - -
    - - -
    -
    -
    - -
    - - -
    -
    -
    -`, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsLink: '<', - mmsViewApi: '<', - mmsNumber: '@', - noTitle: '@', - buttonId: '<', - }, - controller: ViewController, -}; - -veComponents.component(ViewComponent.selector, ViewComponent); diff --git a/src/ve-components/services/Component.service.ts b/src/ve-components/services/Component.service.ts deleted file mode 100644 index 2a28c5dc5..000000000 --- a/src/ve-components/services/Component.service.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { ViewController } from '@ve-components/presentations'; -import { ITransclusion } from '@ve-components/transclusions'; - -import { veComponents } from '@ve-components'; - -import { VeQService } from '@ve-types/angular'; -import { VeModalService } from '@ve-types/view-editor'; - -/** - * @internal - * @name ComponentService - * @requires $q - * @requires $uibModal - * @requires $timeout - * @requires $compile - * * Utility methods for performing edit like behavior to a transclude element - * WARNING These are intended to be internal utility functions and not designed to be used as api - * - */ -export class ComponentService { - static $inject = ['$q', '$timeout', '$compile', '$uibModal']; - - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private $compile: angular.ICompileService, - private $uibModal: VeModalService - ) {} - - public hasCircularReference = (ctrl: ITransclusion, curId: string, curType: string): boolean => { - let curscope = ctrl.$scope; - while (curscope.$parent) { - const parent = curscope.$parent; - if (curscope.$parent.$ctrl) { - if (parent.$ctrl.mmsElementId === curId && parent.$ctrl.cfType === curType) return true; - } - curscope = parent; - } - return false; - }; - - // var ENUM_ID = '_9_0_62a020a_1105704885400_895774_7947'; - // var ENUM_LITERAL = '_9_0_62a020a_1105704885423_380971_7955'; - - public isDirectChildOfPresentationElementFunc(element: JQuery, mmsViewCtrl: ViewController): boolean { - let parent = element[0].parentElement; - while (parent && parent.nodeName !== 'MMS-VIEW-PRESENTATION-ELEM' && parent.nodeName !== 'MMS-VIEW') { - if (mmsViewCtrl.isTranscludedElement(parent.nodeName)) { - return false; - } - if ( - parent.nodeName === 'MMS-VIEW-TABLE' || - parent.nodeName === 'MMS-VIEW-LIST' || - parent.nodeName === 'MMS-VIEW-SECTION' - ) - return false; - parent = parent.parentElement; - } - return parent && parent.nodeName !== 'MMS-VIEW'; - } - - public hasHtml = (s: string): boolean => { - return s.indexOf('

    ') !== -1; - }; -} - -veComponents.service('ComponentService', ComponentService); diff --git a/src/ve-components/services/Extension.service.ts b/src/ve-components/services/Extension.service.ts deleted file mode 100644 index 02601eb23..000000000 --- a/src/ve-components/services/Extension.service.ts +++ /dev/null @@ -1,80 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; - -import { IButtonBarButton } from '@ve-core/button-bar'; -import { IToolBarButton } from '@ve-core/toolbar'; - -import { veComponents } from '@ve-components'; - -export interface VeExperimentDescriptor { - id: string; - path?: string; - config?: string; - name?: string; - toolButton?: IToolBarButton; - toolDynamicButton?: IToolBarButton[]; - barButtons?: IButtonBarButton[]; -} - -export interface VeExperimentConfig { - [extensionType: string]: VeExperimentDescriptor[]; -} - -export class ExtensionService { - extensionTags: string[] = []; - extensionData: unknown[] = []; - allowedExtensions: string[] = ['present', 'transclude', 'spec', 'insert', 'tree-of']; - - public AnnotationType = { - transcludeName: 1, - transcludeDoc: 2, - transcludeCom: 3, - transcludeVal: 4, - mmsViewLink: 5, - presentationElement: 6, - transcludeView: 7, - }; - - static $inject = []; - constructor() { - ( - angular.module('ve-components')['_invokeQueue'] as { - 1: string; - 2: string[]; - }[] - ).forEach((value) => { - if (value[1] === 'component') { - this.extensionTags.push(_.kebabCase(value[2][0])); - this.extensionData.push(value[2]); - } - }); - - // for (const tag of this.extensionTags) { - // - // } - } - - public getTagByType = (extPrefix: string, type: string): string => { - extPrefix = _.kebabCase(extPrefix); - if (!this.allowedExtensions.includes(extPrefix)) { - // this.growl.error('Unknown Extension Prefix: ' + extPrefix) - return 'extension-error'; - } - if (type == 'InstanceSpecification') type = 'section'; - if (type == 'ImageT') type = 'figure'; - const tag = _.kebabCase(type.startsWith(extPrefix) ? type : extPrefix + _.capitalize(type)); - if (!this.extensionTags.includes(tag)) { - // this.growl.error('Unknown Extension type: ' + type) - return 'extension-error'; - } - return tag; - }; - - public getExtensions(extPrefix: string, exclude?: string[]): string[] { - return this.extensionTags.filter((value) => { - return value.startsWith(_.kebabCase(extPrefix)) && (exclude ? !exclude.includes(value) : true); - }); - } -} - -veComponents.service('ExtensionService', ExtensionService); diff --git a/src/ve-components/services/index.ts b/src/ve-components/services/index.ts deleted file mode 100644 index 9433c7d95..000000000 --- a/src/ve-components/services/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import './Component.service'; -import './Extension.service'; - -export * from './Extension.service'; -export * from './Component.service'; diff --git a/src/ve-components/spec-tools/components/spec-editor.component.ts b/src/ve-components/spec-tools/components/spec-editor.component.ts deleted file mode 100644 index ccf72ae3b..000000000 --- a/src/ve-components/spec-tools/components/spec-editor.component.ts +++ /dev/null @@ -1,225 +0,0 @@ -import _ from 'lodash'; - -import { ComponentService } from '@ve-components/services'; -import { SpecService, SpecTool, ISpecTool } from '@ve-components/spec-tools'; -import { EditorService } from '@ve-core/editor'; -import { ToolbarApi, ToolbarService } from '@ve-core/toolbar'; -import { ApplicationService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { - URLService, - ElementService, - ViewService, - PermissionsService, - ProjectService, - ApiService, - ValueService, -} from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromiseReason, VeQService } from '@ve-types/angular'; -import { ElementObject, ElementsResponse } from '@ve-types/mms'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsSpec - * - * @required veUtils/URLService - * @requires veUtils/AuthService - * @requires veUtils/ElementService - * @requires veUtils/ViewService - * @requires veUtils/PermissionsService - * @requires $compile - * @requires $templateCache - * @requires growl - * @requires _ - * - * * Outputs a "spec window" of the element whose id is specified. Spec includes name, - * documentation, and value if the element is a property. Also last modified time, - * last user, element id. Editability is determined by a param and also element - * editability. Documentation and string values can have html and can transclude other - * element properties. Conflict can occur during save based on last server read time - * and offers choice of force save, discard edit or simple merge. To control saving - * or editor pass in an api object that will be populated with methods (see methods seciton): - * - * ## Example spec with full edit (given permission) - * ### controller (js) - *

    - angular.module('app', ['ve-components'])
    - .controller('SpecCtrl', ['$scope', function($scope) {
    -        $this.api = {}; //empty object to be populated by the spec api
    -       public edit() {
    -            $this.api.setEditing(true);
    -        };
    -       public save() {
    -            $this.api.save()
    -            .then((e) => {
    -                //success
    -            }, (reason) => {
    -                //failed
    -            });
    -        };
    -    }]);
    - 
    - * ### template (html) - *
    - 
    - - - -
    -
    - * ## Example for showing an element spec at a certain time - *
    - 
    - 
    - * ## Example for showing a current element with nothing editable - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {Object=} specSvc An empty object that'll be populated with api methods - * @param {Object=} mmsElement An element object, if this is provided, a read only - * element spec for it would be shown, this will not use mms services to get the element - */ - -class SpecEditorController extends SpecTool implements ISpecTool { - static $inject = [...SpecTool.$inject, 'EditService', 'ValueService', 'EditorService']; - - private isValue: boolean; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - uRLSvc: URLService, - elementSvc: ElementService, - projectSvc: ProjectService, - applicationSvc: ApplicationService, - apiSvc: ApiService, - viewSvc: ViewService, - permissionsSvc: PermissionsService, - eventSvc: EventService, - specSvc: SpecService, - toolbarSvc: ToolbarService, - private autosaveSvc: EditService, - private valueSvc: ValueService, - private editorSvc: EditorService - ) { - super( - $q, - $scope, - $element, - growl, - componentSvc, - uRLSvc, - elementSvc, - projectSvc, - applicationSvc, - apiSvc, - viewSvc, - permissionsSvc, - eventSvc, - specSvc, - toolbarSvc - ); - this.specType = _.kebabCase(SpecEditorComponent.selector); - this.specTitle = 'Edit Element'; - } - - configToolbar = (api: ToolbarApi): void => { - if (this.autosaveSvc.openEdits() > 0) { - //Tell toolbar to show an open edit if there are open edits - api.setIcon('spec-editor', 'fa-edit-asterisk'); - api.setPermission('spec-editor.saveall', true); - } - }; - - initCallback = (): void => { - this.specSvc.setEditing(true); - const e = this.specSvc.getElement(); - this.editorSvc.openEdit(e).then( - (editOb) => { - this.specSvc.tracker.etrackerSelected = editOb.key; - this.specSvc.toggleSave(this.toolbarId); - this.elementSvc.isCacheOutdated(editOb.element).then( - (data) => { - const server = data.server ? data.server._modified : new Date(); - const cache = data.cache ? data.cache._modified : new Date(); - if (data.status && server > cache) - this.growl.error( - 'This element has been updated on the server. Please refresh the page to get the latest version.' - ); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - this.edit = editOb; - this.specSvc.setEdits(editOb); - this.isValue = this.valueSvc.isValue(editOb.element); - }, - (reason: VePromiseReason>) => { - this.growl.error(reason.message); - } - ); - }; -} -const SpecEditorComponent: VeComponentOptions = { - selector: 'specEditor', - template: ` - -
    - -

    - Last modified {{$ctrl.element._modified | date:'M/d/yy h:mm a'}} by {{ $ctrl.modifier.email }}{{ $ctrl.modifier }} - -
    -

    Property Value

    - -
    - -

    Documentation

    - - -

    Metatypes

    - - {{$ctrl.element.type}} -
    - -
    -
    -

    Location

    - {{$ctrl.qualifiedName}} -

    ID

    - {{$ctrl.element.id}} -

    Branch/Tag

    - {{$ctrl.element._refId}} -

    Project

    - {{$ctrl.element._projectId}} -

    Formatted Modified Time

    - {{$ctrl.element._modified}} -

    Commit

    - {{$ctrl.element._commitId}} -
    - `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsElement: ' - -
    - * - */ -class SpecHistoryController extends SpecTool implements ISpecTool { - // Locals - gettingHistory: boolean; - refList: RefObject[] = []; - baseCommit: Commit = { - ref: null, - history: null, - commitSelected: null, - isOpen: false, - refIsOpen: false, - }; - historyVer: string = 'latest'; - compareCommit: Commit = { - ref: null, - history: null, - commitSelected: null, - isOpen: false, - refIsOpen: false, - }; - disableRevert: boolean; - keepCommitSelected: boolean = false; - - static $inject = [...SpecTool.$inject, 'DiffMergeService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - uRLSvc: URLService, - elementSvc: ElementService, - projectSvc: ProjectService, - applicationSvc: ApplicationService, - apiSvc: ApiService, - viewSvc: ViewService, - permissionsSvc: PermissionsService, - eventSvc: EventService, - specSvc: SpecService, - toolbarSvc: ToolbarService, - private diffMergeSvc: DiffMergeService - ) { - super( - $q, - $scope, - $element, - growl, - componentSvc, - uRLSvc, - elementSvc, - projectSvc, - applicationSvc, - apiSvc, - viewSvc, - permissionsSvc, - eventSvc, - specSvc, - toolbarSvc - ); - this.specType = _.kebabCase(SpecHistoryComponent.selector); - this.specTitle = 'Element History'; - } - - initCallback = (): void => { - if (!this.projectId || !this.refId) return; - const reqOb: ElementsRequest = { - elementId: this.element.id, - projectId: this.projectId, - refId: this.refId, - }; - if (this.keepCommitSelected) { - this.keepCommitSelected = false; - return; - } - this.gettingHistory = true; - this.elementSvc - .getElementHistory(reqOb, 2, true) - .then( - (data) => { - this.historyVer = 'latest'; - this.compareCommit.history = data; - this.compareCommit.commitSelected = this.compareCommit.history[0]; - for (let history of data) { - if (history.id === this.element._commitId) { - this.compareCommit.commitSelected = history; - break; - } - } - this.baseCommit.history = data; - if (data.length > 1) { - this.baseCommit.commitSelected = this.compareCommit.history[1]; - } else if (data.length > 0) { - this.baseCommit.commitSelected = this.compareCommit.history[0]; - } else { - this.baseCommit.commitSelected = '--- none ---'; - } - void this.getRefs(); - }, - (reason) => { - this.growl.error(`Unable to get Element History - ${reason.message}`); - } - ) - .finally(() => { - this.gettingHistory = false; - this.disableRevert = this._isSame(); - }); - }; - - // Get ref list for project and details on - getRefs = (): VePromise => { - const deferred = this.$q.defer(); - this.projectSvc.getRefs(this.projectId).then( - (data) => { - this.refList = data; - this.compareCommit.ref = this.refList.filter((ref) => { - return ref.id === this.refId; - })[0]; - this.baseCommit.ref = this.compareCommit.ref; - deferred.resolve(); - }, - (reason) => { - this.growl.error(`Unable to get Refs - ${reason.message}`); - deferred.reject(); - } - ); - return deferred.promise; - }; - - commitClicked = (version: CommitObject): void => { - this.compareCommit.commitSelected = version; - this.historyVer = this.compareCommit.commitSelected.id; - this.compareCommit.isOpen = !this.compareCommit.isOpen; - const data = { - elementId: this.element.id, - projectId: this.element._projectId, - refId: this.element._refId, - commitId: this.historyVer, - }; - this.keepCommitSelected = true; - this.eventSvc.$broadcast('element.selected', data); - }; - - getElementHistoryByRef = (ref?: RefObject): void => { - if (ref) { - this.disableRevert = false; - // scope.gettingCompareHistory = true; - this.baseCommit.ref = ref; - const reqOb = { - elementId: this.element.id, - projectId: this.projectId, - refId: ref.id, - }; - this.elementSvc - .getElementHistory(reqOb, 2) - .then( - (data) => { - this.baseCommit.history = data; - if (data.length > 0) { - this.baseCommit.commitSelected = this.baseCommit.history[0]; - } - this.disableRevert = this._isSame(); - }, - (error) => { - this.baseCommit.history = []; - this.baseCommit.commitSelected = ''; - this.disableRevert = true; - } - ) - .finally(() => { - // scope.gettingCompareHistory = false; - this.baseCommit.refIsOpen = !this.baseCommit.refIsOpen; - }); - } - }; - - baseCommitClicked = (version: CommitObject): void => { - this.baseCommit.commitSelected = version; - this.baseCommit.isOpen = !this.baseCommit.isOpen; - }; - - //TODO - // check if commit ids are the same - display to user that they are comparing same or disable the commit that matches - revert = (): void => { - if (!this._isSame()) { - const reqOb: ElementsRequest = { - elementId: this.element.id, - projectId: this.projectId, - refId: this.refId, - }; - const compareData: CompareData = { - compareCommit: this.compareCommit, - baseCommit: this.baseCommit, - element: this.element, - }; - this.diffMergeSvc.revertAction(reqOb, compareData, this.$element); - } else this.growl.warning('Nothing to revert!'); - }; - - private _isSame = (): boolean => { - const compareId = - typeof this.compareCommit.commitSelected === 'string' - ? this.compareCommit.commitSelected - : this.compareCommit.commitSelected.id; - const baseId = - typeof this.baseCommit.commitSelected === 'string' - ? this.baseCommit.commitSelected - : this.baseCommit.commitSelected.id; - return baseId == compareId; - }; -} - -const SpecHistoryComponent: VeComponentOptions = { - selector: 'specHistory', - template: ` -

    -
    - Compare versions -
    - -
    -
    - Before: -
    - - -
    - - Element does not exist - - on - -
    - - -
    -
    - -
    -
    - After: -
    - - -
    - on - {{$ctrl.compareCommit.ref.type}}: {{$ctrl.compareCommit.ref.name}} -
    -
    - -
    - -
    -
    - Element does not exist on {{$ctrl.baseCommit.ref.type}}: {{$ctrl.baseCommit.ref.name}} -
    -
    -

    - - -

    - -

    Documentation

    - - - -
    -

    Property Value

    - - - - -
    -

    Commit

    - {{$ctrl.baseCommit.commitSelected.id}}
    -
    - {{$ctrl.compareCommit.commitSelected.id}}
    -
    -
    - - -
    - -
    - -
    -
    - Cannot make changes on a Tag. -
    -
    -
    -
    - To revert documentation, name, and value to version created ({{$ctrl.baseCommit.commitSelected._created | date:'M/d/yy h:mm a'}} by {{$ctrl.baseCommit.commitSelected._creator}}): - -
    -
    - - -`, - controller: SpecHistoryController, -}; - -veComponents.component(SpecHistoryComponent.selector, SpecHistoryComponent); diff --git a/src/ve-components/spec-tools/components/spec-inspector.component.ts b/src/ve-components/spec-tools/components/spec-inspector.component.ts deleted file mode 100644 index 6f88034c8..000000000 --- a/src/ve-components/spec-tools/components/spec-inspector.component.ts +++ /dev/null @@ -1,267 +0,0 @@ -import _ from 'lodash'; - -import { ComponentService } from '@ve-components/services'; -import { SpecService, ISpecTool, SpecTool } from '@ve-components/spec-tools'; -import { ToolbarService } from '@ve-core/toolbar'; -import { ApplicationService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { - ProjectService, - URLService, - ViewService, - PermissionsService, - ElementService, - ApiService, -} from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsSpec - * - * @requires veComponents/ComponentService - * @requires veUtils/URLService - * @requires veUtils/AuthService - * @requires veUtils/ElementService - * @requires veUtils/ViewService - * @requires veUtils/PermissionsService - * @requires $compile - * @requires $templateCache - * @requires growl - * @requires _ - * - * * Outputs a "spec window" of the element whose id is specified. Spec includes name, - * documentation, and value if the element is a property. Also last modified time, - * last user, element id. Editability is determined by a param and also element - * editability. Documentation and string values can have html and can transclude other - * element properties. Conflict can occur during save based on last server read time - * and offers choice of force save, discard edit or simple merge. To control saving - * or editor pass in an api object that will be populated with methods (see methods seciton): - * - * ## Example spec with full edit (given permission) - * ### controller (js) - *
    - angular.module('app', ['ve-components'])
    - .controller('SpecCtrl', ['$scope', function($scope) {
    -        $this.api = {}; //empty object to be populated by the spec api
    -       public edit() {
    -            $this.api.setEditing(true);
    -        };
    -       public save() {
    -            $this.api.save()
    -            .then((e) => {
    -                //success
    -            }, (reason) => {
    -                //failed
    -            });
    -        };
    -    }]);
    - 
    - * ### template (html) - *
    - 
    - - - -
    -
    - * ## Example for showing an element spec at a certain time - *
    - 
    - 
    - * ## Example for showing a current element with nothing editable - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {Object=} specSvc An empty object that'll be populated with api methods - * @param {Object=} mmsElement An element object, if this is provided, a read only - * element spec for it would be shown, this will not use mms services to get the element - */ - -class SpecInspectorController extends SpecTool implements ISpecTool { - static $inject = SpecTool.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - uRLSvc: URLService, - elementSvc: ElementService, - projectSvc: ProjectService, - applicationSvc: ApplicationService, - apiSvc: ApiService, - viewSvc: ViewService, - permissionsSvc: PermissionsService, - eventSvc: EventService, - specSvc: SpecService, - toolbarSvc: ToolbarService - ) { - super( - $q, - $scope, - $element, - growl, - componentSvc, - uRLSvc, - elementSvc, - projectSvc, - applicationSvc, - apiSvc, - viewSvc, - permissionsSvc, - eventSvc, - specSvc, - toolbarSvc - ); - - this.specType = _.kebabCase(SpecInspectorComponent.selector); - this.specTitle = 'Preview Element'; - } - - protected initCallback = (): void => { - this.specSvc.setEditing(false); - this.specSvc.toggleSave(this.toolbarId); - }; -} - -const SpecInspectorComponent: VeComponentOptions = { - selector: 'specInspector', - template: ` - -
    -
    - - No Element Selected

    -
    - -
    -
    - Element not found: displaying last found spec -
    -

    {{$ctrl.element.name}}

    - Last modified {{$ctrl.element._modified | date:'M/d/yy h:mm a'}} by {{ $ctrl.modifier.email }}{{ $ctrl.modifier }} - -
    -

    Property Value

    - - -

    Property Type

    - - - -
    - -
    -

    Source

    - -

    Target

    - -
    - -
    -

    Path 1

    - -

    Path 2

    - -
    - -
    -

    Role 1

    - -

    Role 2

    - -
    - -
    -

    Constraint Specification

    - -
    - -
    - -
    -
    - -
    -

    Documentation

    -

    - -

    -
    {{$ctrl.element.documentation}}
    - -
    -

    Used by Documents/Views

    - -
    - - - >
    -
    -
    -
    -
    - - -

    Metatypes

    - - {{$ctrl.element.type}} -
    - -
    -
    - -
    -

    Classifiers

    - -
    - -

    Location

    - {{$ctrl.specApi.qualifiedName}} -

    ID  - -

    - - {{$ctrl.element.id}} - -

    Branch/Tag

    - {{$ctrl.element._refId}} -

    Project

    - {{$ctrl.element._projectId}} -

    Formatted Modified Time

    - {{$ctrl.element._modified}} -

    Commit

    - - - {{$ctrl.element._commitId}}  - - - -
    -
    - `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsElement: '} $element - * @requires {VeQService} $q - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {URLService} uRLSvc - * @requires {AuthService} authSvc - * @requires {ElementService} elementSvc - * @requires {ProjectService} projectSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - * @requires {PermissionsService} permissionsSvc - * @requires {EventService} eventSvc - * @requires {SpecService} specSvc - * @requires {ToolbarService} toolbarSvc - * - * * Displays a list of branches/tags with details. Provides options for taking action on ref. - * For the time being it only allows for running a doc merge job on current document. - * - * @param {RefObject[]} mmsBranches List of current project branches - * @param {RefObject[]} mmsTags List of current project tags - */ -class SpecRefListController extends SpecTool implements ISpecTool { - //Locals - isLoading: boolean = true; - refs: RefObject[]; - showMerge: boolean; - runCleared: boolean; - docEditable: boolean; - docName: string; - private isDoc: boolean; - srcRefOb: RefObject; - - static $inject = [...SpecTool.$inject, '$uibModal']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - uRLSvc: URLService, - elementSvc: ElementService, - projectSvc: ProjectService, - applicationSvc: ApplicationService, - apiSvc: ApiService, - viewSvc: ViewService, - permissionsSvc: PermissionsService, - eventSvc: EventService, - specSvc: SpecService, - toolbarSvc: ToolbarService, - private $uibModal: VeModalService - ) { - super( - $q, - $scope, - $element, - growl, - componentSvc, - uRLSvc, - elementSvc, - projectSvc, - applicationSvc, - apiSvc, - viewSvc, - permissionsSvc, - eventSvc, - specSvc, - toolbarSvc - ); - this.specType = _.kebabCase(SpecRefListComponent.selector); - this.specTitle = 'Branch/Tag List'; - } - - $onInit(): void { - super.$onInit(); - this.showMerge = this.uRLSvc.getMmsServer().indexOf('opencae.jpl.nasa.gov') == -1; - this.runCleared = true; - this.docEditable = false; - - this.projectSvc - .getRefs(this.projectId) - .then( - (refs) => { - this.refs = refs; - }, - (reason) => { - this.growl.error('Error getting refs: ' + reason.message); - } - ) - .finally(() => { - this.isLoading = false; - }); - } - //Callback function for document change - public initCallback = (): void => { - if (this.document) this.docName = this.document.name; - if (!this.apiSvc.isDocument(this.element)) { - this.isDoc = false; - return; - } else { - this.isDoc = true; - } - - this.docEditable = - this.specApi.refType != 'Tag' && - this.permissionsSvc.hasBranchEditPermission(this.specApi.projectId, this.specApi.refId); - }; - - public docMergeAction = (srcRef: RefObject): void => { - this.srcRefOb = srcRef; - - const instance = this.$uibModal.open({ - resolve: { - getDocName: (): string => { - if (this.document) return this.document.name; - return '(Not Found)'; - }, - getSrcRefOb: (): RefObject => { - return this.srcRefOb; - }, - }, - component: 'mergeConfirmModal', - }); - instance.result.then( - () => { - // TODO: do anything here? - }, - () => { - this.growl.error('Unable to Merge'); - } - ); - }; -} - -const SpecRefListComponent: VeComponentOptions = { - selector: 'specRefList', - template: ` - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    Tag

    Created

    - {{tag.name}} -
    {{tag.description}}
    -
    {{tag._created | date:'M/d/yy h:mm a'}} -
    - - -
    -
    No tags found

    Branch

    Created

    - {{branch.name}} -
    {{branch.description}}
    -
    {{branch._created | date:'M/d/yy h:mm a'}} -
    - - -
    -
    No branches found
    -
    -`, - bindings: { - mmsRefs: '<', - }, - controller: SpecRefListController, -}; - -veComponents.component(SpecRefListComponent.selector, SpecRefListComponent); diff --git a/src/ve-components/spec-tools/components/spec-reorder.component.ts b/src/ve-components/spec-tools/components/spec-reorder.component.ts deleted file mode 100644 index f151b5c09..000000000 --- a/src/ve-components/spec-tools/components/spec-reorder.component.ts +++ /dev/null @@ -1,337 +0,0 @@ -import _ from 'lodash'; - -import { ComponentService } from '@ve-components/services'; -import { SpecService, SpecTool, ISpecTool } from '@ve-components/spec-tools'; -import { veCoreEvents } from '@ve-core/events'; -import { ToolbarService } from '@ve-core/toolbar'; -import { ApplicationService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { - PermissionsService, - URLService, - ElementService, - ViewService, - ProjectService, - ApiService, -} from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VePromisesResponse, VeQService } from '@ve-types/angular'; -import { - ElementObject, - ElementsRequest, - ExpressionObject, - InstanceValueObject, - PresentationReference, - ViewInstanceSpec, - ViewObject, -} from '@ve-types/mms'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsSpecReorder - * - * @requires veUtils/ViewService - * @requires $templateCache - * - * * Visualize and edit the structure of a view - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - */ -class SpecReorderController extends SpecTool implements ISpecTool { - private treeOptions: object; - - private elementReferenceTree: PresentationReference[] = []; - private originalElementReferenceTree: PresentationReference[] = []; - public view: ViewObject | ViewInstanceSpec; - reorderable: boolean; - - viewSaving: boolean; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - uRLSvc: URLService, - elementSvc: ElementService, - projectSvc: ProjectService, - applicationSvc: ApplicationService, - apiSvc: ApiService, - viewSvc: ViewService, - permissionsSvc: PermissionsService, - eventSvc: EventService, - specSvc: SpecService, - toolbarSvc: ToolbarService - ) { - super( - $q, - $scope, - $element, - growl, - componentSvc, - uRLSvc, - elementSvc, - projectSvc, - applicationSvc, - apiSvc, - viewSvc, - permissionsSvc, - eventSvc, - specSvc, - toolbarSvc - ); - this.specType = _.kebabCase(SpecReorderComponent.selector); - this.specTitle = 'Reorder Spec'; - } - - $onInit(): void { - super.$onInit(); - this.treeOptions = { - accept: (sourceNodeScope: SpecTool, destNodeScope: SpecTool, destIndex: number): boolean => { - if (sourceNodeScope.element.isOpaque) return false; - if (destNodeScope.$element.hasClass('root')) return true; - return !!this.viewSvc.isSection(destNodeScope.element as ViewInstanceSpec); - }, - }; - this.subs.push( - this.eventSvc.$on('spec-reorder.save', () => { - if (this.viewSaving) { - this.growl.info('Please Wait...'); - return; - } - this.viewSaving = true; - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - api.toggleButtonSpinner('spec-reorder.save'); - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - this.treeSave().then( - (elements) => { - this.viewSaving = false; - //this.refresh() - //TODO reset orig - this.growl.success('Save Successful'); - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - api.toggleButtonSpinner('spec-reorder.save'); - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - const saved = elements.filter((val) => val.id === this.view.id); - if (saved.length > 0) { - this.eventSvc.$broadcast('element.updated', { element: saved[0] }); - this.eventSvc.$broadcast('view.reordered', saved[0]); - } - this.eventSvc.$broadcast('spec-reorder.saved', this.view.id); - this.eventSvc.resolve(this.toolbarId, { - id: 'spec-inspector', - }); - }, - (response) => { - this.refresh(); - this.viewSaving = false; - const reason = response.data.failedRequests[0]; - this.growl.error(reason.message); - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - api.toggleButtonSpinner('spec-reorder.save'); - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - } - ); - }) - ); - this.subs.push( - this.eventSvc.$on('spec-reorder.cancel', () => { - this.revert(); - }) - ); - } - - initCallback = (): void => { - if (this.apiSvc.isView(this.specSvc.getView()) || this.viewSvc.isSection(this.specSvc.getView())) { - this.view = this.specSvc.getView(); - this.reorderable = true; - this.refresh(); - } - }; - - treeSave(): VePromise> { - const elementObsToUpdate: ElementObject[] = []; - const updateSectionElementOrder = (elementReference: PresentationReference): void => { - const sectionEdit: ViewInstanceSpec = { - id: elementReference.instanceId, - //_modified: elementReference.instanceSpecification._modified, - _projectId: elementReference.instanceSpecification._projectId, - _refId: elementReference.instanceSpecification._refId, - type: elementReference.instanceSpecification.type, - specification: _.cloneDeep(elementReference.instanceSpecification.specification), - }; - //sectionEdit.specialization = _.cloneDeep(elementReference.instanceSpecification.specialization); - const operand: InstanceValueObject[] = (sectionEdit.specification.operand = []); - - if (!elementReference.instanceSpecification.specification) { - this.growl.error('Malformed Reference Tree; Aborting'); - } - const origOperand = ( - elementReference.instanceSpecification.specification as ExpressionObject - ).operand; - elementReference.sectionElements.forEach((sectionElement, index) => { - operand.push(sectionElement.instanceVal); - if (sectionElement.sectionElements.length > 0) updateSectionElementOrder(sectionElement); - }); - - if (!_.isEqual(operand, origOperand)) { - elementObsToUpdate.push(sectionEdit); - } - }; - - const deferred = this.$q.defer(); - if (this.elementReferenceTree.length === 0) { - deferred.reject({ - type: 'error', - message: 'View specs were not initialized properly or is empty.', - }); - return deferred.promise; - } - const viewEdit: ViewInstanceSpec | ViewObject = { - id: this.view.id, - //_modified: this.view._modified, - _projectId: this.view._projectId, - _refId: this.view._refId, - type: this.view.type, - }; - if (this.view._contents) { - viewEdit._contents = _.cloneDeep(this.view._contents); - } - if (this.view.specification) { - viewEdit.specification = _.cloneDeep((this.view as ViewInstanceSpec).specification); - } - const specs: ExpressionObject = viewEdit._contents || viewEdit.specification; - const origSpecs: ExpressionObject = this.view._contents || this.view.specification; - // Update the View edit object on Save - if (specs.operand) { - specs.operand = []; - this.elementReferenceTree.forEach((elementRef) => { - specs.operand.push(elementRef.instanceVal); - }); - if (specs && !_.isEqual(specs.operand, origSpecs.operand)) { - elementObsToUpdate.push(viewEdit); - } - } - // Recurse - this.elementReferenceTree.forEach((elementReference) => { - if (elementReference.sectionElements && elementReference.sectionElements.length > 0) { - updateSectionElementOrder(elementReference); - } - }); - - return this.elementSvc.updateElements(elementObsToUpdate, false); - } - - revert = (): void => { - this.elementReferenceTree = _.cloneDeepWith(this.originalElementReferenceTree, (value: unknown, key) => { - if ( - key === 'instanceId' || - key === 'instanceSpecification' || - key === 'presentationElement' || - key === 'instanceVal' - ) - return value; - return undefined; - }) as PresentationReference[]; - }; - - refresh = () => { - let contents: ExpressionObject = null; - if (this.view._contents) { - contents = (this.view as ViewObject)._contents; - } - if (this.view.specification) { - contents = (this.view as ViewInstanceSpec).specification; - } - const reqOb: ElementsRequest = { - elementId: this.specSvc.specApi.elementId, - projectId: this.specSvc.specApi.projectId, - refId: this.specSvc.specApi.refId, - commitId: this.specSvc.specApi.commitId, - }; - if (contents) { - this.viewSvc.getElementReferenceTree(reqOb, contents).then( - (elementReferenceTree) => { - this.elementReferenceTree = elementReferenceTree; - this.originalElementReferenceTree = _.cloneDeepWith(elementReferenceTree, (value: unknown, key) => { - if ( - key === 'instanceId' || - key === 'instanceSpecification' || - key === 'presentationElement' || - key === 'instanceVal' - ) - return value; - return undefined; - }) as PresentationReference[]; - }, - (reason) => { - this.elementReferenceTree = []; - this.originalElementReferenceTree = []; - } - ); - } else { - this.elementReferenceTree = []; - this.originalElementReferenceTree = []; - } - }; -} - -const SpecReorderComponent: VeComponentOptions = { - selector: 'specReorder', - template: ` - - -
    -
    View specs loading or unavailable -
    -
    Bold view specs are reorderable
    -
    -
      -
    1. -
    -
    -
    - -`, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - }, - controller: SpecReorderController, -}; - -veComponents.component(SpecReorderComponent.selector, SpecReorderComponent); diff --git a/src/ve-components/spec-tools/index.ts b/src/ve-components/spec-tools/index.ts deleted file mode 100644 index 2f3cd216e..000000000 --- a/src/ve-components/spec-tools/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -//Exports -export * from './services/Spec.service'; - -export * from './spec-tool.controller'; - -//Services -import './services/Spec.service'; -//Core Components -import './mms-tools.component'; -//Default Extensions -import './components/spec-inspector.component'; -import './components/spec-editor.component'; -import './components/spec-reorder.component'; -import './components/spec-history.component'; -import './components/spec-ref-list.component'; diff --git a/src/ve-components/spec-tools/mms-tools.component.ts b/src/ve-components/spec-tools/mms-tools.component.ts deleted file mode 100644 index fd3bed5f2..000000000 --- a/src/ve-components/spec-tools/mms-tools.component.ts +++ /dev/null @@ -1,452 +0,0 @@ -import _ from 'lodash'; - -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { EditorService } from '@ve-core/editor'; -import { EditDialogService } from '@ve-core/editor/services/EditDialog.service'; -import { veCoreEvents } from '@ve-core/events'; -import { IToolBarButton, ToolbarService } from '@ve-core/toolbar'; -import { RootScopeService } from '@ve-utils/application'; -import { EditObject, EditService, EventService } from '@ve-utils/core'; -import { ElementService, ProjectService, PermissionsService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { SpecApi, SpecService } from './services/Spec.service'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; -import { ElementObject } from '@ve-types/mms'; -import { VeModalService } from '@ve-types/view-editor'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsSpec - * - * @requires veUtils/Utils - * @required veUtils/URLService - * @requires veUtils/AuthService - * @requires veUtils/ElementService - * @requires veUtils/ViewService - * @requires veUtils/PermissionsService - * @requires $compile - * @requires $templateCache - * @requires growl - * @requires _ - * - * * Outputs a "spec window" of the element whose id is specified. Spec includes name, - * documentation, and value if the element is a property. Also last modified time, - * last user, element id. Editability is determined by a param and also element - * editability. Documentation and string values can have html and can transclude other - * element properties. Conflict can occur during save based on last server read time - * and offers choice of force save, discard edit or simple merge. To control saving - * or editor pass in an api object that will be populated with methods (see methods seciton): - * - * ## Example spec with full edit (given permission) - * ### controller (js) - *
    -    angular.module('app', ['veComponents'])
    -    .controller('SpecCtrl', ['$scope', function($scope) {
    -        $this.api = {}; //empty object to be populated by the spec api
    -       public edit = () => {
    -            $this.api.setEditing(true);
    -        };
    -       public save = () => {
    -            $this.api.save()
    -            .then((e) => {
    -                //success
    -            }, (reason) => {
    -                //failed
    -            });
    -        };
    -    }]);
    -    
    - * ### template (html) - *
    -    
    - - - -
    -
    - * ## Example for showing an element spec at a certain time - *
    -    
    -    
    - * ## Example for showing a current element with nothing editable - *
    -    
    -    
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {Object=} specSvc An empty object that'll be populated with api methods - * @param {Object=} mmsElement An element object, if this is provided, a read only - * element spec for it would be shown, this will not use mms services to get the element - */ - -class ToolsController { - //Bindings - toolsCategory: string; - - //Local - elementId: string; - projectId: string; - refId: string; - commitId: string; - edit: EditObject; - element: ElementObject; - inPreviewMode: boolean; - isEditing: boolean; - skipBroadcast: boolean; - - subs: Rx.IDisposable[]; - currentTool: string; - currentTitle: string; - specApi: SpecApi; - show: { - [key: string]: boolean; - } = {}; - - editable: boolean; - viewId: string; - elementSaving: boolean; - elementLoading: boolean; - - protected errorType: string; - - toolbarId: string; - - protected $tools: JQuery; - static $inject = [ - '$q', - '$timeout', - '$compile', - '$scope', - '$element', - '$uibModal', - 'hotkeys', - 'growl', - 'ElementService', - 'ProjectService', - 'ComponentService', - 'PermissionsService', - 'RootScopeService', - 'EventService', - 'EditService', - 'EditorService', - 'EditDialogService', - 'ToolbarService', - 'SpecService', - 'ExtensionService', - ]; - - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private $compile: angular.ICompileService, - public $scope: angular.IScope, - private $element: JQuery, - private $uibModal: VeModalService, - private hotkeys: angular.hotkeys.HotkeysProvider, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private projectSvc: ProjectService, - private componentSvc: ComponentService, - private permissionsSvc: PermissionsService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService, - private autosaveSvc: EditService, - private editorSvc: EditorService, - private editdialogSvc: EditDialogService, - private toolbarSvc: ToolbarService, - private specSvc: SpecService, - private extensionSvc: ExtensionService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - this.$tools = $('#tools'); - - this.specApi = this.specSvc.specApi; - this.elementSaving = false; - - //Listen for Toolbar Clicked Subject - this.subs.push(this.eventSvc.binding(this.toolbarId, this.changeTool)); - - this.subs.push( - this.eventSvc.$on('editor.open', (editOb: ElementObject) => { - this.openEdit(); - }) - ); - - this.subs.push( - this.eventSvc.$on('editor.close', (editOb: ElementObject) => { - this.closeEdit(); - }) - ); - - this.subs.push( - this.eventSvc.$on('spec-editor.save', () => { - this.save(false); - }) - ); - this.subs.push( - this.eventSvc.$on('spec-editor.save-continue', () => { - this.save(true); - }) - ); - - this.subs.push( - this.eventSvc.$on('element-saving', (data: boolean) => { - this.elementSaving = data; - }) - ); - - this.subs.push( - this.eventSvc.binding('spec.ready', (data) => { - this.elementLoading = !data; - }) - ); - - this.hotkeys.bindTo(this.$scope).add({ - combo: 'alt+a', - description: 'save all', - callback: () => { - this.eventSvc.$broadcast('spec-editor.saveall'); - }, - }); - const savingAll = false; - this.subs.push( - this.eventSvc.$on('spec-editor.saveall', () => { - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - api.toggleButtonSpinner('spec-editor.saveall'); - this.editorSvc - .saveAll() - .catch(() => { - // reset the last edit elementOb to one of the existing element - const firstEdit = Object.values(this.autosaveSvc.getAll())[0]; - this.specSvc.tracker.etrackerSelected = firstEdit.key; - this.specSvc.keepMode(); - this.specApi.elementId = firstEdit.element.id; - this.specApi.projectId = firstEdit.element._projectId; - this.specApi.refId = firstEdit.element._refId; - this.specApi.commitId = 'latest'; - this.growl.error('Some elements failed to save, resolve individually in edit pane'); - }) - .finally(() => { - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - api.toggleButtonSpinner('spec-editor.saveall'); - this.specSvc.toggleSave(this.toolbarId); - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - }); - - this.specSvc.setEditing(false); - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - }) - ); - this.subs.push( - this.eventSvc.$on('spec-editor.cancel', () => { - const go = (): void => { - this.editorSvc.cleanUpEdit(this.specSvc.getEdits().key); - if (this.autosaveSvc.openEdits() > 0) { - const id = Object.keys(this.autosaveSvc.getAll())[0]; - const info = id.split('|'); - const data: veCoreEvents.elementSelectedData = { - elementId: info[2], - projectId: info[0], - refId: info[1], - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - } else { - this.specSvc.setEditing(false); - this.eventSvc.resolve(this.toolbarId, { - id: 'spec-inspector', - }); - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => api.setIcon('spec-editor', 'fa-edit'), - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - this.specSvc.toggleSave(this.toolbarId); - } - }; - this.editorSvc.hasEdits(this.specSvc.getEdits()).then( - (hasEdits) => { - if (hasEdits) { - this.editorSvc.deleteEditModal(this.specSvc.getEdits()).result.then( - () => { - go(); - }, - () => { - /* Do Nothing */ - } - ); - } else go(); - }, - () => { - go(); - } - ); - }) - ); - } - - private changeTool = (data: veCoreEvents.toolbarClicked): void => { - if (!this.currentTool) { - this.currentTool = ''; - } - if (this.currentTool !== data.id) { - if (this.currentTool !== '') this.show[_.camelCase(this.currentTool)] = false; - - this.currentTool = data.id; - - const inspect: IToolBarButton = this.toolbarSvc.getToolbarButton(data.id); - if (!data.title) { - data.title = inspect.tooltip; - } - if (!data.category) { - data.category = inspect.category; - } - - this.currentTitle = data.title ? data.title : inspect.tooltip; - - if (!this.show.hasOwnProperty(_.camelCase(data.id))) { - this.startTool(data.id); - this.show[_.camelCase(data.id)] = true; - } else { - this.show[_.camelCase(data.id)] = true; - } - } - }; - - private startTool = (id: string): void => { - const tag = this.extensionSvc.getTagByType('spec', id); - const toolId: string = _.camelCase(id); - const newTool: JQuery = $( - '
    ' - ); - if (tag === 'extensionError') { - this.errorType = this.currentTool.replace('spec-', ''); - newTool.append( - '' - ); - } else { - newTool.append('<' + tag + ' toolbar-id="{{$ctrl.toolbarId}}">'); - } - - this.$tools.append(newTool); - - this.$compile(newTool)(this.$scope); - }; - - // private changeElement= (newVal, oldVal) => { - // if (newVal === oldVal) { - // return; - // } - // this.specApi.elementId = this.mmsElementId; - // this.specApi.projectId = this.mmsProjectId; - // this.specApi.refId = this.mmsCommitId; - // this.specApi.commitId = this.mmsRefId; - // } - - public closeEdit = (): void => { - this.specSvc.toggleSave(this.toolbarId); - }; - - public openEdit = (): void => { - this.specSvc.toggleSave(this.toolbarId); - }; - - public save = (continueEdit: boolean): void => { - if (this.elementSaving) { - this.growl.info('Please Wait...'); - return; - } - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - if (!continueEdit) { - api.toggleButtonSpinner('spec-editor.save'); - } else { - api.toggleButtonSpinner('spec-editor.save-continue'); - } - this.editorSvc - .save(this.specSvc.getEdits().key, continueEdit) - .then( - () => { - if (this.autosaveSvc.openEdits() > 0) { - const next = Object.keys(this.autosaveSvc.getAll())[0]; - const info = next.split('|'); - const data: veCoreEvents.elementSelectedData = { - elementId: info[2], - projectId: info[0], - refId: info[1], - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - } else { - this.specSvc.setEditing(false); - this.specSvc.toggleSave(this.toolbarId); - this.eventSvc.resolve(this.toolbarId, { - id: 'spec-inspector', - }); - } - }, - (reason) => { - if (reason.type === 'info') this.growl.info(reason.message); - else if (reason.type === 'warning') this.growl.warning(reason.message); - else if (reason.type === 'error') this.growl.error(reason.message); - } - ) - .finally(() => { - if (!continueEdit) { - api.toggleButtonSpinner('spec-editor.save'); - } else { - api.toggleButtonSpinner('spec-editor.save-continue'); - } - }); - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - }; -} - -const MmsToolsComponent: VeComponentOptions = { - selector: 'mmsTools', - template: ` -
    -

    {{$ctrl.currentTitle}}

    -
    -
    - -
    -
    -
    - `, - bindings: { - toolbarId: '@', - toolsCategory: '<', - }, - controller: ToolsController, -}; - -veComponents.component(MmsToolsComponent.selector, MmsToolsComponent); diff --git a/src/ve-components/spec-tools/services/Spec.service.ts b/src/ve-components/spec-tools/services/Spec.service.ts deleted file mode 100644 index 1fe499aff..000000000 --- a/src/ve-components/spec-tools/services/Spec.service.ts +++ /dev/null @@ -1,387 +0,0 @@ -import { ComponentService } from '@ve-components/services'; -import { EditorService } from '@ve-core/editor'; -import { ToolbarService } from '@ve-core/toolbar'; -import { UtilsService } from '@ve-utils/application'; -import { EditObject, EditService, EventService } from '@ve-utils/core'; -import { - ApiService, - AuthService, - ElementService, - PermissionsService, - ProjectService, - URLService, - UserService, - ViewService, - ValueService, -} from '@ve-utils/mms-api-client'; - -import { PropertySpec, veComponents } from '@ve-components'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { - DocumentObject, - ElementObject, - ElementsRequest, - RefObject, - UserObject, - ValueObject, - ViewInstanceSpec, - ViewObject, -} from '@ve-types/mms'; - -export interface SpecApi extends ElementsRequest { - rootId?: string; - refType: string; - displayOldSpec?: boolean | null; - relatedDocuments?: ViewObject[]; - propSpec?: PropertySpec; - typeClass?: string; - dataLink?: string; - qualifiedName?: string; -} - -export class SpecService implements angular.Injectable { - private element: ElementObject; - private view: ViewObject | ViewInstanceSpec; - private document: DocumentObject; - private modifier: UserObject; - private ref: RefObject; - private values: ValueObject[]; - private edit: EditObject; - private editing: boolean = false; - public editable: boolean; - private keeping: boolean = false; - - public specApi: SpecApi = { refType: '', refId: '', elementId: '', projectId: '' }; - public tracker: { - etrackerSelected?: string; - } = {}; - - public editValues: ValueObject[] = []; - - static $inject = [ - '$q', - '$timeout', - 'growl', - 'ElementService', - 'ProjectService', - 'ViewService', - 'EventService', - 'ToolbarService', - 'EditService', - 'ComponentService', - 'URLService', - 'AuthService', - 'UserService', - 'PermissionsService', - 'UtilsService', - 'ApiService', - 'ValueService', - 'EditorService', - ]; - private ran: boolean; - private lastid: string; - private gettingSpec: boolean; - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private projectSvc: ProjectService, - private viewSvc: ViewService, - private eventSvc: EventService, - private toolbarSvc: ToolbarService, - private autosaveSvc: EditService, - private componentSvc: ComponentService, - private uRLSvc: URLService, - private authSvc: AuthService, - private userSvc: UserService, - private permissionsSvc: PermissionsService, - private utilsSvc: UtilsService, - private apiSvc: ApiService, - private valueSvc: ValueService, - private editorSvc: EditorService - ) {} - - /** - * @name veComponents.component:mmsSpec#toggleEditing - * toggles editor - * - * @return {boolean} toggle successful - */ - public toggleEditing = (): boolean => { - if (!this.editing) { - if (this.editable) this.editing = true; - else return false; - } else { - this.editing = false; - } - return true; - }; - /** - * @name veComponents.component:mmsSpec#setEditing - * sets editor state - * - * @param {boolean} mode true or false - * @return {boolean} set successful - */ - public setEditing = (mode): boolean => { - if (mode) { - if (this.editable) this.editing = true; - else return false; - } else this.editing = false; - return true; - }; - /** - * @name veComponents.component:mmsSpec#getEditing - * get editor state - * - * @return {boolean} editor or not - */ - public getEditing = (): boolean => { - return this.editing; - }; - /** - * @name veComponents.component:mmsSpec#getEdits - * get current edit object - * - * @return {Object} may be null or undefined, if not, is - * current element object that can be edited (may include changes) - */ - public getEdits = (): EditObject => { - return this.edit; - }; - - public setEdits = (editOb: EditObject): void => { - if (this.valueSvc.isValue(editOb.element)) { - editOb.values = this.valueSvc.getValues(editOb.element); - } - this.edit = editOb; - }; - - public getElement = (): ElementObject => { - return this.element; - }; - - public getDocument = (): DocumentObject => { - return this.document; - }; - - public getView = (): ElementObject => { - return this.view; - }; - - public getModifier = (): UserObject => { - return this.modifier; - }; - - public getValues(): ValueObject[] { - return this.values; - } - - public getRef = (): RefObject => { - return this.ref; - }; - - public getTypeClass = (element: ElementObject): void => { - // Get Type - this.specApi.typeClass = this.utilsSvc.getElementTypeClass(element, this.viewSvc.getElementType(element)); - }; - - public getQualifiedName(element: ElementObject): VePromise { - const deferred = this.$q.defer(); - if (this.edit) element = this.edit.element; - const reqOb: ElementsRequest = { - commitId: element._commitId ? element._commitId : 'latest', - projectId: element._projectId, - refId: element._refId, - elementId: element.id, - }; - this.elementSvc.getElementQualifiedName(reqOb).then( - (result) => { - this.specApi.qualifiedName = result; - deferred.resolve(true); - }, - (reason) => { - deferred.reject(reason); - } - ); - return deferred.promise; - } - - public setElement = (): void => { - this.specApi.relatedDocuments = null; - this.specApi.propSpec = {}; - - this.ran = true; - this.lastid = this.specApi.elementId; - - this.specApi.extended = !(this.specApi.commitId && this.specApi.commitId !== 'latest'); - - this._updateElement(); - }; - - private _updateElement = (): void => { - const reqOb = Object.assign({}, this.specApi); - this.elementSvc - .getElement(reqOb, 2, false) - .then( - (data) => { - const promises: angular.IPromise[] = []; - if (data.id !== this.lastid) { - return; - } - this.element = data; - if (this.apiSvc.isView(data) || this.viewSvc.isSection(data)) { - this.view = data; - } - this.values = this.valueSvc.getValues(data); - promises.push( - this.userSvc.getUserData(data._modifier).then((result) => { - this.modifier = result; - }) - ); - /* no more related docs search supported - if (!this.specApi.commitId || this.specApi.commitId === 'latest') { - promises.push( - this.elementSvc - .search(reqOb, { - size: 1, - params: { - id: data.id, - _projectId: data._projectId, - }, - }) - .then((searchResultOb) => { - if (data.id !== this.lastid) { - return - } - const searchResult = searchResultOb.elements - if ( - searchResult && - searchResult.length == 1 && - searchResult[0].id === data.id && - searchResult[0]._relatedDocuments && - searchResult[0]._relatedDocuments.length > 0 - ) { - this.specApi.relatedDocuments = searchResult[0]._relatedDocuments - } - }) - ) - } - */ - if (this.specApi.rootId) { - const docReq: ElementsRequest = { - elementId: this.specApi.rootId, - projectId: this.specApi.projectId, - refId: this.specApi.refId, - commitId: this.specApi.commitId ? this.specApi.commitId : 'latest', - }; - promises.push( - this.viewSvc.getProjectDocument(docReq, 1).then((result) => { - this.document = result; - }) - ); - } - if ( - (this.specApi.commitId && this.specApi.commitId !== 'latest') || - !this.permissionsSvc.hasBranchEditPermission(data._projectId, data._refId) || - this.specApi.refType === 'Tag' - ) { - this.editable = false; - this.edit = null; - this.setEditing(false); - } else { - this.editable = true; - // only get edit object if in spec edit - } - promises.push( - this.projectSvc.getRef(this.specApi.refId, this.specApi.projectId).then((result) => { - this.ref = result; - }) - ); - this.getTypeClass(this.element); - promises.push(this.getQualifiedName(this.element)); - this.specApi.dataLink = - this.uRLSvc.getRoot() + - '/projects/' + - this.element._projectId + - '/refs/' + - this.element._refId + - '/elements/' + - this.element.id + - '?commitId=' + - this.element._commitId + - '&token=' + - this.authSvc.getToken(); - - this.$q.allSettled(promises).then( - () => this.eventSvc.resolve('spec.ready', true), - (reason: VePromiseReason) => { - this.growl.error('Getting Element Error: ' + reason.message); - } - ); - }, - (reason) => { - this.growl.error('Getting Element Error: ' + reason.message); - } - ) - .finally(() => { - this.gettingSpec = false; - }); - }; - - public setKeepMode = (value?: boolean): void => { - if (value === undefined) { - this.keepMode(); - } - this.keeping = value; - }; - - public getKeepMode = (): boolean => { - return this.keeping; - }; - - public keepMode = (): void => { - this.keeping = true; - }; - - // Check edit count and toggle appropriate save all and edit/edit-asterisk buttons - public toggleSave = (toolbarId: string): void => { - this.toolbarSvc.waitForApi(toolbarId).then( - (api) => { - if (this.autosaveSvc.openEdits() > 0) { - api.setPermission('spec-editor.saveall', true); - api.setIcon('spec-editor', 'fa-edit-asterisk'); - } else { - api.setPermission('spec-editor.saveall', false); - api.setIcon('spec-editor', 'fa-edit'); - } - }, - (reason) => { - this.growl.error(ToolbarService.error(reason)); - } - ); - }; - // - - // Check edit count and toggle appropriate save all and edit/edit-asterisk buttons - // public cleanUpSaveAll = (toolbarId: string): void => { - // this.toolbarSvc.waitForApi(toolbarId).then( - // (api) => { - // if (this.autosaveSvc.openEdits() > 0) { - // api.setPermission('spec-editor.saveall', true) - // api.setIcon('spec-editor', 'fa-edit-asterisk') - // } else { - // api.setPermission('spec-editor.saveall', false) - // api.setIcon('spec-editor', 'fa-edit') - // } - // }, - // (reason) => { - // this.growl.error(ToolbarService.error(reason)) - // } - // ) - // } -} - -veComponents.service('SpecService', SpecService); diff --git a/src/ve-components/spec-tools/spec-tool.controller.ts b/src/ve-components/spec-tools/spec-tool.controller.ts deleted file mode 100644 index d27768d66..000000000 --- a/src/ve-components/spec-tools/spec-tool.controller.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { IPaneScope } from '@openmbee/pane-layout'; - -import { ComponentService } from '@ve-components/services'; -import { veCoreEvents } from '@ve-core/events'; -import { ToolbarService, ToolbarApi } from '@ve-core/toolbar'; -import { ApplicationService } from '@ve-utils/application'; -import { EditObject, EventService } from '@ve-utils/core'; -import { - ApiService, - ElementService, - PermissionsService, - ProjectService, - URLService, - ViewService, -} from '@ve-utils/mms-api-client'; - -import { SpecApi, SpecService } from './services/Spec.service'; - -import { VeQService } from '@ve-types/angular'; -import { ElementObject, RefObject, ValueObject, ViewObject } from '@ve-types/mms'; - -export interface ISpecTool extends angular.IComponentController { - $scope: ISpecToolScope; - commitId: string; - specType: string; - edit: EditObject; - element: ElementObject; - isEditing: boolean; - inPreviewMode: boolean; - skipBroadcast: boolean; - editValues?: ValueObject[]; - values?: ValueObject[]; - //Functions - addValue?(type: string): void; - removeVal?(i: number): void; -} - -export interface ISpecToolScope extends IPaneScope { - $ctrl?: ISpecTool; - $parent: ISpecToolScope; -} - -/** - * @ngdoc component - * @name veComponents/SpecTool - * @type {ISpecTool} - * - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {angular.IRootElementService} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {Utils} utils - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - * @requires {ToolbarService} toolbarSvc - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {ButtonBarService} buttonBarSvc - * @requires {MathService} mathSvc - * * Given an element id, puts in the element's documentation binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * - * ## Example - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class SpecTool implements ISpecTool { - //Bindings - protected toolbarId: string; - - public specApi: SpecApi; - - //Customizers - public specType: string; - public specTitle: string; - - public subs: Rx.IDisposable[]; - - public commitId: string; - protected projectId: string; - protected refId: string; - - public isEditing: boolean; - public isEnumeration: boolean; - public inPreviewMode: boolean; - public elementSaving: boolean; - public skipBroadcast: boolean; - - protected gettingSpec = true; - public element: ElementObject; - public document: ViewObject; - public ref: RefObject; - public values: any[]; - public edit: EditObject; - protected modifier; - protected options: any; - protected elementDataLink: string; - protected qualifiedName: string; - - public editValues: any[]; - - protected template: string | angular.Injectable<(...args: any[]) => string>; - - static $inject = [ - '$q', - '$scope', - '$element', - 'growl', - 'ComponentService', - 'URLService', - 'ElementService', - 'ProjectService', - 'ApplicationService', - 'ApiService', - 'ViewService', - 'PermissionsService', - 'EventService', - 'SpecService', - 'ToolbarService', - ]; - - constructor( - protected $q: VeQService, - public $scope: angular.IScope, - public $element: JQuery, - protected growl: angular.growl.IGrowlService, - protected componentSvc: ComponentService, - protected uRLSvc: URLService, - protected elementSvc: ElementService, - protected projectSvc: ProjectService, - protected applicationSvc: ApplicationService, - protected apiSvc: ApiService, - protected viewSvc: ViewService, - protected permissionsSvc: PermissionsService, - protected eventSvc: EventService, - public specSvc: SpecService, - protected toolbarSvc: ToolbarService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - this.editValues = this.specSvc.editValues; - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - if ( - api.buttons.map((value) => value.id).filter((value) => value === this.specType).length < 1 && - window.__env && - window.__env.enableDebug - ) { - console.log('Spec View: ' + this.specType + 'is missing a button definition'); - } - this.configToolbar(api); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - - this.changeElement(); - - this.subs.push(this.eventSvc.binding('spec.ready', this.changeElement)); - //this.subs.push(this.eventSvc.$on(this.specType, this.initCallback)) - } - - $onDestroy(): void { - this.eventSvc.destroy(this.subs); - this.destroy(); - } - - /** - * @name veComponents/SpecTool#config - * - * Use this API to implement any toolbar-specific initialization steps that would normally be called in the toolbar Promise callback - * - * @protected - */ - protected configToolbar = (api: ToolbarApi): void => { - /* Implement any toolbar initialization Logic Here */ - }; - - /** - * @name veComponents/SpecTool#initCallback - * - * This API is called whenever the element of focus for the Spec Tool window is changed - * - * @protected - */ - protected initCallback: () => void = () => { - /* Implement any post initialization steps here */ - }; - - /** - * @name veComponents/SpecTool#destroy - * - * This API is for whenever custom logic is required during the $onDestroy lifecycle stage - * (To reset Services, unregister listeners, etc). - * @protected - */ - protected destroy: () => void = () => { - /* Implement any custom on destroy logic to unregister listeners etc */ - }; - - public changeElement = (ready?: boolean): void => { - if (!ready) return; - this.gettingSpec = true; - this.specApi = this.specSvc.specApi; - this.refId = this.specApi.refId; - this.projectId = this.specApi.projectId; - this.commitId = this.specApi.commitId; - this.modifier = this.specSvc.getModifier(); - this.qualifiedName = this.specApi.qualifiedName; - this.element = this.specSvc.getElement(); - this.document = this.specSvc.getDocument(); - this.values = this.specSvc.getValues(); - this.ref = this.specSvc.getRef(); - this.elementDataLink = this.specApi.dataLink; - this.initCallback(); - this.gettingSpec = false; - }; - - //Spec Tool Common API - - public copyToClipboard($event: JQuery.ClickEvent, selector: string): void { - this.applicationSvc.copyToClipboard(this.$element.find(selector), $event).then( - () => { - this.growl.info('Copied to clipboard!', { ttl: 2000 }); - }, - (err) => { - this.growl.error('Unable to copy: ' + err.message); - } - ); - } - - public cleanupVal(obj: { value: unknown }): void { - obj.value = parseInt(obj.value as string); - } - - public propertyTypeClicked = (id: string): void => { - const data = { - elementId: id, - projectId: this.element._projectId, - refId: this.element._refId, - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - }; - - public addHtml(value: { value: string }): void { - value.value = '

    ' + value.value + '

    '; - } - - /** - * @name veComponents.component:mmsSpec#save - * save edited element - * - * @return {Promise} promise would be resolved with updated element if save is successful. - * For unsuccessful saves, it will be rejected with an object with type and message. - * Type can be error or info. In case of conflict, there is an option to discard, merge, - * or force save. If the user decides to discord or merge, type will be info even though - * the original save failed. Error means an actual error occured. - */ - // public save(): VePromise { - // return this.componentSvc.save(this.edit, this.editorApi, this, false) - // } - - public hasHtml = (s: string): boolean => { - return this.componentSvc.hasHtml(s); - }; -} diff --git a/src/ve-components/transclusions/components/index.ts b/src/ve-components/transclusions/components/index.ts deleted file mode 100644 index 1d7d11a1a..000000000 --- a/src/ve-components/transclusions/components/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -import './transclude-art.component'; -import './transclude-attr.component'; -import './transclude-com.component'; -import './transclude-doc.component'; -import './transclude-enum.component'; -import './transclude-group-docs.component'; -import './transclude-img.component'; -import './transclude-name.component'; -import './transclude-val.component'; -import './transclude-value-link.component'; -import './transclude-view.component'; -import './transclude-section.component'; diff --git a/src/ve-components/transclusions/components/transclude-art.component.ts b/src/ve-components/transclusions/components/transclude-art.component.ts deleted file mode 100644 index c8f826ffb..000000000 --- a/src/ve-components/transclusions/components/transclude-art.component.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { Transclusion, ITransclusion, ITransclusionComponentOptions } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { UtilsService, MathService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, URLService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc component - * @name veComponents/TranscludeArtController - * @type {ITransclusion} - * - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {angular.IRootElementService} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {ButtonBarService} buttonBarSvc - * @requires {MathService} mathSvc - * * Given an element id, puts in the element's documentation binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * - * ## Example - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeArtController extends Transclusion implements ITransclusion { - //Custom Bindings - mmsArtExt: string; - - //Locals - artExt: string; - artifacts: any[]; - - static $inject: string[] = [...Transclusion.$inject, 'URLService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - private urlSvc: URLService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'doc'; - this.cfTitle = 'Documentation'; - this.cfKind = 'Text'; - this.checkCircular = true; - } - - $onInit(): void { - super.$onInit(); - - this.artExt = this.mmsArtExt; - - this.$element.on('click', (e) => { - if (this.mmsViewCtrl) this.mmsViewCtrl.transcludeClicked(this.element); - - e.stopPropagation(); - }); - } - - public getContent = (preview?: boolean): VePromise => { - const artifacts = this.element._artifacts; - if (artifacts !== undefined) { - const allExt = artifacts.map((a) => a.extension); - let includeExt = allExt; - if (this.artExt !== '' || this.artExt !== undefined) { - includeExt = this.artExt.split(',').filter((a) => allExt.includes(a)); - } - const reqOb = { - elementId: this.mmsElementId, - projectId: this.projectId, - refId: this.refId, - commitId: this.commitId, - //includeRecentVersionElement: true, - }; - this.artifacts = artifacts - .filter((a) => includeExt.includes(a.extension)) - .map((a) => { - return { - url: this.urlSvc.getArtifactURL(reqOb, a.extension), - image: a.mimetype.indexOf('image') > -1, - ext: a.extension, - }; - }); - } - const result = - ''; - return this.$q.resolve(result); - }; -} - -export const TranscludeArtComponent: ITransclusionComponentOptions = { - selector: 'transcludeArt', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '<', - nonEditable: '<', - mmsCfLabel: '@', - mmsGenerateForDiff: '<', - mmsCallback: '&', - mmsArtExt: '@', - }, - require: { - mmsViewCtrl: '?^view', - mmsViewPresentationElemCtrl: '?^viewPe', - }, - controller: TranscludeArtController, -}; - -veComponents.component(TranscludeArtComponent.selector, TranscludeArtComponent); diff --git a/src/ve-components/transclusions/components/transclude-attr.component.ts b/src/ve-components/transclusions/components/transclude-attr.component.ts deleted file mode 100644 index 930eba2f1..000000000 --- a/src/ve-components/transclusions/components/transclude-attr.component.ts +++ /dev/null @@ -1,172 +0,0 @@ -//
    -//

    Source

    -// -//

    Target

    -// -//
    -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { ITransclusion, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { veCoreEvents } from '@ve-core/events'; -import { MathService, UtilsService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; - -export class TranscludeAttrController extends Transclusion implements ITransclusion { - protected template: string = ` - -`; - //Custom Binding - mmsAttr: string; - - //Locals - attrValues: string[] = []; - - static $inject = Transclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'name'; - this.cfTitle = ''; - this.cfKind = 'Text'; - this.checkCircular = false; - } - - $onInit(): void { - super.$onInit(); - - this.$element.on('click', (e) => { - e.stopPropagation(); - if (this.noClick) return; - const data = { - elementId: this.element.id, - projectId: this.element._projectId, - refId: this.element._refId, - commitId: 'latest', - }; - this.eventSvc.$broadcast('element.selected', data); - }); - } - - public getContent = (preview?): VePromise => { - const deferred = this.$q.defer(); - let contentTemplate: string; - const ids: string[] = []; - if ( - this.element[this.mmsAttr] || - (Array.isArray(this.element[this.mmsAttr]) && (this.element[this.mmsAttr] as Array).length > 0) - ) { - //Grab id reference to an array for CF - if (this.mmsAttr.endsWith('Id')) { - ids.push(this.element[this.mmsAttr] as string); - } - // Grab id array for a CF list - else if (this.mmsAttr.endsWith('Ids')) { - ids.push(...(this.element[this.mmsAttr] as Array)); - } - // Convert List of elements to strings - else if (Array.isArray(this.element[this.mmsAttr])) { - (this.element[this.mmsAttr] as Array).forEach((value) => { - if (typeof this.element[this.mmsAttr] === 'object') { - value = JSON.stringify(value); - } - this.attrValues.push(`${value.toString()}`); - }); - } else { - let value: string; - if (typeof this.element[this.mmsAttr] === 'object') { - value = JSON.stringify(this.element[this.mmsAttr]); - } else { - value = (this.element[this.mmsAttr] as unknown).toString(); - } - this.attrValues.push(`${value}`); - } - // Convert referenced ids array to CF list - if (ids.length > 0) { - ids.forEach((id) => { - this.attrValues.push( - `` - ); - }); - } - } else { - this.attrValues.push(`(empty)`); - } - if (this.mmsCfLabel) { - contentTemplate = `

    {{$ctrl.mmsAttr}}

    `; - } - - this.attrValues.forEach((value, index) => { - const sep = index == this.attrValues.length - 1 ? '' : ', '; - contentTemplate += `${value}${this.mmsCfLabel ? '
    ' : sep}`; - }); - deferred.resolve(contentTemplate); - - return deferred.promise; - }; -} - -export const TranscludeNameComponent: VeComponentOptions = { - selector: 'transcludeAttr', - template: `
    `, - bindings: { - mmsAttr: '@', - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - mmsCfLabel: '@', - noClick: '<', - }, - transclude: true, - require: { - mmsViewCtrl: '?^^view', - mmsSpecEditor: '?^^specEditor', - }, - controller: TranscludeAttrController, -}; - -veComponents.component(TranscludeNameComponent.selector, TranscludeNameComponent); diff --git a/src/ve-components/transclusions/components/transclude-com.component.ts b/src/ve-components/transclusions/components/transclude-com.component.ts deleted file mode 100644 index fd6fe3d71..000000000 --- a/src/ve-components/transclusions/components/transclude-com.component.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { ITransclusion, ITransclusionComponentOptions } from '@ve-components/transclusions'; -import { TranscludeDocController } from '@ve-components/transclusions/components/transclude-doc.component'; -import { DeletableTransclusion } from '@ve-components/transclusions/deletable-transclusion.controller'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { ImageService, MathService, UtilsService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsTranscludeCom - * - * @requires veUtils/ElementService - * @requires veUtils/UtilsService - * @requires veUtils/ViewService - * @requires veComponents/ButtonBarService - * @requires veComponents/ComponentService - * @requires $compile - * @requires $templateCache - * @requires growl - * @requires MathJax - * - * * Given an element id, puts in the element's documentation binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * (This is different from mmsTranscludeDoc because of special styles applied to comments) - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - */ -export class TranscludeComController extends TranscludeDocController implements ITransclusion { - static $inject = DeletableTransclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - viewSvc: ViewService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc, - viewSvc - ); - this.cfType = 'doc'; - this.cfTitle = 'comment'; - this.cfKind = 'Comment'; - this.checkCircular = true; - } - - $onInit(): void { - super.$onInit(); - if (this.mmsViewPresentationElemCtrl) { - if (this.isDeletable) { - const instanceSpec = this.mmsViewPresentationElemCtrl.getInstanceSpec(); - this.panelTitle = instanceSpec ? instanceSpec.name : 'Comment'; - } - this.panelType = 'Comment'; - } - } - - public getContent = (preview?: boolean): VePromise => { - const deferred = this.$q.defer(); - - let doc = (preview ? this.edit.element.documentation : this.element.documentation) || '(No comment)'; - doc += ' - Comment by ' + this.element._creator + ''; - - let result = ''; - if (preview) { - result = '
    ' + doc + '
    '; - } else { - result = doc; - } - if (!this.mmsGenerateForDiff) { - const resultHtml = $('

    ').html(result).toArray(); - this.mathSvc.typeset(resultHtml).then( - () => deferred.resolve(resultHtml), - (reason) => { - deferred.reject(reason); - } - ); - } else { - deferred.resolve(result); - } - return deferred.promise; - }; -} - -export const TranscludeComComponent: ITransclusionComponentOptions = { - selector: 'transcludeCom', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '<', - nonEditable: '<', - mmsCfLabel: '@', - mmsGenerateForDiff: '<', - mmsCallback: '&', - }, - require: { - mmsViewCtrl: '?^view', - mmsViewPresentationElemCtrl: '?^viewPe', - }, - controller: TranscludeComController, -}; - -veComponents.component(TranscludeComComponent.selector, TranscludeComComponent); diff --git a/src/ve-components/transclusions/components/transclude-doc.component.ts b/src/ve-components/transclusions/components/transclude-doc.component.ts deleted file mode 100644 index b33af456a..000000000 --- a/src/ve-components/transclusions/components/transclude-doc.component.ts +++ /dev/null @@ -1,227 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { ITransclusion, DeletableTransclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService, editor_buttons } from '@ve-core/editor'; -import { UtilsService, MathService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc component - * @name veComponents/TranscludeDocController - * @type {ITransclusion} - * - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {angular.IRootElementService} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {ButtonBarService} buttonBarSvc - * @requires {MathService} mathSvc - * * Given an element id, puts in the element's documentation binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * - * ## Example - *
    -    
    -    
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeDocController extends DeletableTransclusion implements ITransclusion { - protected editTemplate: string = ` -
    -
    -

    -
    -
    - {{$ctrl.panelType}} : - {{$ctrl.panelTitle}} - -
    -

    -
    - -
    -
    -
    - -
    -
    -`; - - static $inject = DeletableTransclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - viewSvc: ViewService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc, - viewSvc - ); - this.cfType = 'doc'; - this.cfTitle = 'Documentation'; - this.cfKind = 'Text'; - this.checkCircular = true; - } - - $onInit(): void { - super.$onInit(); - - this.bbId = this.buttonBarSvc.generateBarId(`${this.mmsElementId}_${this.cfType}`); - this.bbApi = this.buttonBarSvc.initApi(this.bbId, this.bbInit, editor_buttons); - - this.$element.on('click', (e) => { - if (this.startEdit && !this.nonEditable) this.startEdit(); - - if (this.mmsViewCtrl) this.mmsViewCtrl.transcludeClicked(this.element); - if (this.nonEditable && this.mmsViewCtrl && this.mmsViewCtrl.isEditable()) { - this.growl.warning('Cross Reference is not editable.'); - } - e.stopPropagation(); - }); - - if (this.mmsViewPresentationElemCtrl) { - const instanceSpec = this.mmsViewPresentationElemCtrl.getInstanceSpec(); - const presentationElem = this.mmsViewPresentationElemCtrl.getPresentationElement(); - if (this.isDeletable) { - this.panelTitle = instanceSpec ? instanceSpec.name : ''; - this.panelType = presentationElem ? presentationElem.type : ''; //this is hack for fake table/list/equation until we get actual editors - if (this.panelType.charAt(this.panelType.length - 1) === 'T') - this.panelType = this.panelType.substring(0, this.panelType.length - 1); - if (this.panelType === 'Paragraph') this.panelType = 'Text'; - if (this.panelType === 'Figure' || this.panelType === 'ImageT') this.panelType = 'Image'; - } - if (presentationElem) { - this.editorType = presentationElem.type; - } - } - } - - $onDestroy(): void { - super.$onDestroy(); - this.buttonBarSvc.destroy(this.bbId); - } - - public getContent = (preview?: boolean): VePromise => { - const deferred = this.$q.defer(); - - let doc = preview ? this.edit.element.documentation : this.element.documentation; - if (!doc || this.emptyRegex.test(doc)) { - doc = '

    (no ' + this.panelType + ')

    '; - } - doc = doc.replace(this.fixPreSpanRegex, ''); - doc = doc.replace(this.spacePeriod, '>.'); - doc = doc.replace(this.spaceSpace, '> '); - doc = doc.replace(this.spaceComma, '>,'); - let result: string; - if (preview) { - result = '
    ' + doc + '
    '; - } else { - result = doc; - } - if (this.mmsViewPresentationElemCtrl) { - const element = this.mmsViewPresentationElemCtrl.getPresentationElement(); - const pe = this.mmsViewPresentationElemCtrl.getInstanceSpec(); - if ( - pe && - pe._veNumber && - element && - (element.type === 'TableT' || - element.type === 'Figure' || - element.type === 'Equation' || - element.type === 'ImageT') - ) { - this.type = element.type === 'TableT' ? 'table' : element.type.toLowerCase(); - if (this.type === 'imaget') { - this.type = 'figure'; - } - this.utilsSvc.addLiveNumbering(pe, $('#' + pe.id), this.type); - } - } - if (!this.mmsGenerateForDiff) { - const resultHtml = $('

    ').html(result).toArray(); - this.mathSvc.typeset(resultHtml).then( - () => deferred.resolve(resultHtml), - (reason) => { - deferred.reject(reason); - } - ); - } else { - deferred.resolve(result); - } - return deferred.promise; - }; -} - -export const TranscludeDocComponent: VeComponentOptions = { - selector: 'transcludeDoc', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - nonEditable: '<', - mmsCfLabel: '@', - mmsGenerateForDiff: '<', - mmsCallback: '&', - }, - require: { - mmsViewCtrl: '?^view', - mmsViewPresentationElemCtrl: '?^viewPe', - }, - controller: TranscludeDocController, -}; - -veComponents.component(TranscludeDocComponent.selector, TranscludeDocComponent); diff --git a/src/ve-components/transclusions/components/transclude-enum.component.ts b/src/ve-components/transclusions/components/transclude-enum.component.ts deleted file mode 100644 index ca3df96dc..000000000 --- a/src/ve-components/transclusions/components/transclude-enum.component.ts +++ /dev/null @@ -1,267 +0,0 @@ -/** TODO: Add a value type transclude that gets rendered as a editable dropdown of prespecified objects. - * @name veComponents/TranscludeEnumComponent - * - * @description For Example You could have a dropdown which includes all the people in the project and allows you to specify who is the - * responsible person for that particular item which gets saved as the Type/Value? of the property You could additionally add a - * binding which specifies the template for the creation of new objects as types to be placed in the holding bin. - */ -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ITransclusion, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { MathService, UtilsService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc component - * @name veComponents/TranscludeEnumController - * - * @requires {VeQService} $q - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {JQuery} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {MathService} mathSvc - * - * @restrict E - * * Given an element id, puts in the element's name binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and name change, - * and on click - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeEnumController extends Transclusion implements ITransclusion { - //Locals - noClick: boolean | undefined; - clickHandler: () => void; - - static $inject = Transclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'name'; - this.cfTitle = ''; - this.cfKind = 'Text'; - this.checkCircular = false; - } - - $onInit(): void { - super.$onInit(); - // Need a way to put in a query for allowed options. - // Value to save the resulting pointer - // Transclusion for new options - this.$element.on('click', (e) => { - if (this.noClick) return; - - if (this.clickHandler) { - this.clickHandler(); - return; - } - if (this.startEdit && !this.nonEditable) this.startEdit(); - - if (!this.mmsViewCtrl) return false; - - if (this.nonEditable && this.mmsViewCtrl && this.mmsViewCtrl.isEditable()) { - this.growl.warning('Cross Reference is not editable.'); - } - this.mmsViewCtrl.transcludeClicked(this.element); - e.stopPropagation(); - }); - } - - public getContent = (preview?: boolean): VePromise => { - const deferred = this.$q.defer(); - const defaultTemplate = - '{{$ctrl.element.name}}(no name)'; - const editTemplate = - '{{$ctrl.edit.name}}(no name)'; - if (preview) { - deferred.resolve('
    ' + editTemplate + '
    '); - } else { - deferred.resolve(defaultTemplate); - } - return deferred.promise; - }; - - // private _startEdit( - // ctrl: ComponentController, - // isEditable: boolean, - // domElement: JQuery, - // template: string | Injectable<(...args: any[]) => string>, - // doNotScroll - // ): void { - // if ( - // isEditable && - // !ctrl.isEditing && - // ctrl.element && - // ctrl.commitId === 'latest' && - // this.permissionsSvc.hasBranchEditPermission( - // ctrl.element._projectId, - // ctrl.element._refId - // ) - // ) { - // var elementOb = ctrl.element - // var reqOb = { - // elementId: elementOb.id, - // projectId: elementOb._projectId, - // refId: elementOb._refId, - // } - // this.elementSvc.getElementForEdit(reqOb).then((data) => { - // ctrl.isEditing = true - // ctrl.inPreviewMode = false - // ctrl.edit = data - // - // if (data.type === 'Property' || data.type === 'Port') { - // if (ctrl.edit.defaultValue) { - // ctrl.editValues = [ctrl.edit.defaultValue] - // } - // } else if (data.type === 'Slot') { - // if (Array.isArray(data.value)) { - // ctrl.editValues = data.value - // } - // } else if (data.type === 'Constraint' && data.specification) { - // ctrl.editValues = [data.specification] - // } - // if (!ctrl.editValues) { - // ctrl.editValues = [] - // } - // /* - // if (ctrl.isEnumeration && ctrl.editValues.length === 0) { - // ctrl.editValues.push({type: 'InstanceValue', instanceId: null}); - // } - // */ - // if (template) { - // domElement.empty() - // let transcludeEl: JQuery - // if (typeof template === 'string') { - // transcludeEl = $(template) - // } else { - // this.growl.error( - // 'Editing is not supported for Injected Templates!' - // ) - // return - // } - // domElement.append(transcludeEl) - // this.$compile(transcludeEl)(ctrl.$scope) - // } - // if (!ctrl.skipBroadcast) { - // // Broadcast message for the toolCtrl: - // this.eventSvc.$broadcast('editor.edit', ctrl.edit) - // } else { - // ctrl.skipBroadcast = false - // } - // if (!doNotScroll) { - // this._scrollToElement(domElement) - // } - // }, this.handleError) - // - // this.elementSvc.isCacheOutdated(ctrl.element).then((data) => { - // if ( - // data.status && - // data.server._modified > data.cache._modified - // ) { - // this.growl.warning( - // 'This element has been updated on the server' - // ) - // } - // }) - // } - // } -} - -export const TranscludeEnumComponent: VeComponentOptions = { - selector: 'transcludeEnum', - template: ` -
    -
    - - Name - - - - - -
    -
    -`, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - noClick: '@', - nonEditable: '<', - clickHandler: '&?', - mmsCfLabel: '@', - }, - transclude: true, - require: { - mmsViewCtrl: '?^^view', - mmsSpecEditor: '?^^specEditor', - }, - controller: TranscludeEnumController, -}; - -veComponents.component(TranscludeEnumComponent.selector, TranscludeEnumComponent); diff --git a/src/ve-components/transclusions/components/transclude-group-docs.component.ts b/src/ve-components/transclusions/components/transclude-group-docs.component.ts deleted file mode 100644 index 27e55e3e5..000000000 --- a/src/ve-components/transclusions/components/transclude-group-docs.component.ts +++ /dev/null @@ -1,161 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { ITransclusion, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { ImageService, MathService, UtilsService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; -import { handleChange } from '@ve-utils/utils'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { ViewObject } from '@ve-types/mms'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsGroupDocs - * - * @requires veUtils/ElementService - * - * * - * @param {string} mmsGroupId The id of the group to show documents for - * @param {string=master} mmsRefId Ref, defaults to master - * @param {string} mmsProjectId Project Id, if not stated will get from surrounding view - */ -class TranscludeGroupDocsController extends Transclusion implements ITransclusion { - template = ` - - - - -
    Document(s)
    -`; - - mmsGroupId: string; - - documents: ViewObject[]; - docs: ViewObject[]; - - static $inject = [...Transclusion.$inject, 'ViewService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - private viewSvc: ViewService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'groupDocs'; - this.cfTitle = ''; - this.cfKind = 'Table'; - this.checkCircular = false; - } - - $postLink(): void { - this.changeAction(this.mmsGroupId, '', false); - } - - $onInit(): void { - super.$onInit(); - this.mmsGroupId = this.mmsElementId; - } - - protected watch = (onChangesObj: angular.IOnChangesObject): void => { - if (onChangesObj.mmsGroupId) { - this.mmsElementId = this.mmsGroupId; - } - handleChange(onChangesObj, 'mmsGroupId', this.changeAction); - }; - - public getContent = (): VePromise => { - const deferred = this.$q.defer(); - this.mmsGroupId = this.mmsElementId; - this.viewSvc - .getProjectDocuments( - { - projectId: this.projectId, - refId: this.refId, - }, - 2 - ) - .then( - (documents) => { - this.documents = documents; - this.update(); - deferred.resolve(this.template); - }, - (reason) => { - deferred.reject(reason); - } - ); - return deferred.promise; - }; - - public update = (): void => { - const docs: ViewObject[] = []; - const groupId = this.mmsGroupId === '' ? undefined : this.mmsGroupId; - for (let i = 0; i < this.documents.length; i++) { - if ((groupId === undefined || groupId === this.projectId) && !this.documents[i]._groupId) { - docs.push(this.documents[i]); - } else if (this.documents[i]._groupId == this.mmsGroupId) { - docs.push(this.documents[i]); - } - } - this.docs = docs; - }; -} - -export const TranscludeGroupDocsComponent: VeComponentOptions = { - selector: 'transcludeGroupDocs', - template: `
    `, - bindings: { - mmsGroupId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - noClick: '@', - nonEditable: '<', - clickHandler: '&?', - mmsCfLabel: '@', - }, - require: { - mmsCfCrl: '?^^mmsCf', - mmsViewCtrl: '?^^view', - }, - controller: TranscludeGroupDocsController, -}; - -veComponents.component(TranscludeGroupDocsComponent.selector, TranscludeGroupDocsComponent); diff --git a/src/ve-components/transclusions/components/transclude-img.component.ts b/src/ve-components/transclusions/components/transclude-img.component.ts deleted file mode 100644 index 693455c88..000000000 --- a/src/ve-components/transclusions/components/transclude-img.component.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { Transclusion, ITransclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { UtilsService, MathService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, URLService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc component - * @name veComponents/TranscludeImgController - * @type {ITransclusion} - * - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {angular.IRootElementService} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {ButtonBarService} buttonBarSvc - * @requires {MathService} mathSvc - * * Given an element id, puts in the element's documentation binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * - * ## Example - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeImgController extends Transclusion implements ITransclusion { - //Locals - includeExt = ['svg', 'png']; - svg: { url: string; image: boolean; ext: string }[]; - png: { url: string; image: boolean; ext: string }[]; - artifacts: { url: string; image: boolean; ext: string }[]; - - static $inject: string[] = [...Transclusion.$inject, 'URLService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - private urlSvc: URLService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'doc'; - this.cfTitle = 'Documentation'; - this.cfKind = 'Text'; - this.checkCircular = true; - } - - $onInit(): void { - super.$onInit(); - this.$element.on('click', (e) => { - if (this.mmsViewCtrl) this.mmsViewCtrl.transcludeClicked(this.element); - - e.stopPropagation(); - }); - } - - public getContent = (preview?): VePromise => { - const artifacts = this.element._artifacts; - if (artifacts !== undefined) { - const reqOb = { - elementId: this.mmsElementId, - projectId: this.projectId, - refId: this.refId, - commitId: this.commitId, - //includeRecentVersionElement: true, - }; - this.artifacts = artifacts - .filter((a) => this.includeExt.includes(a.extension)) - .map((a) => { - return { - url: this.urlSvc.getArtifactURL(reqOb, a.extension), - image: a.mimetype.indexOf('image') > -1, - ext: a.extension, - }; - }); - this.svg = this.artifacts.filter((a) => a.ext === 'svg'); - //this.png = this.artifacts.filter((a) => a.ext === 'png') - } - const result = - '{{$ctrl.element.name}}' + - ''; - return this.$q.resolve(result); - }; -} - -export const TranscludeImgComponent: VeComponentOptions = { - selector: 'transcludeImg', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - nonEditable: '<', - mmsCfLabel: '@', - mmsGenerateForDiff: '<', - mmsCallback: '&', - }, - require: { - mmsViewCtrl: '?^view', - mmsViewPresentationElemCtrl: '?^viewPe', - }, - controller: TranscludeImgController, -}; - -veComponents.component(TranscludeImgComponent.selector, TranscludeImgComponent); diff --git a/src/ve-components/transclusions/components/transclude-name.component.ts b/src/ve-components/transclusions/components/transclude-name.component.ts deleted file mode 100644 index 3c078af3b..000000000 --- a/src/ve-components/transclusions/components/transclude-name.component.ts +++ /dev/null @@ -1,165 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { SpecTool } from '@ve-components/spec-tools'; -import { ITransclusion, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { MathService, UtilsService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc component - * @name veComponents/TranscludeNameController - * - * @requires {VeQService} $q - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {JQuery} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {MathService} mathSvc - * - * * Given an element id, puts in the element's name binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and name change, - * and on click - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeNameController extends Transclusion implements ITransclusion { - protected editTemplate: string = ` -
    -
    - - Name - - - - - -
    -
    -`; - - //Locals - clickHandler: () => void; - mmsSpecEditorCtrl: SpecTool; - - static $inject = Transclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'name'; - this.cfTitle = ''; - this.cfKind = 'Text'; - this.checkCircular = false; - } - - $onInit(): void { - super.$onInit(); - this.$element.on('click', (e) => { - if (this.noClick) return; - - if (this.clickHandler) { - this.clickHandler(); - return; - } - if (this.startEdit && !this.nonEditable) this.startEdit(); - - if (!this.mmsViewCtrl) return false; - - if (this.nonEditable && this.mmsViewCtrl && this.mmsViewCtrl.isEditable()) { - this.growl.warning('Cross Reference is not editable.'); - } - this.mmsViewCtrl.transcludeClicked(this.element); - e.stopPropagation(); - }); - } - - public getContent = (preview?): VePromise => { - const deferred = this.$q.defer(); - const defaultTemplate = - '{{$ctrl.element.name}}({{ $ctrl.element.type }})'; - const editTemplate = - '{{$ctrl.edit.element.name}}({{ $ctrl.element.type }})'; - if (preview) { - deferred.resolve('
    ' + editTemplate + '
    '); - } else { - deferred.resolve(defaultTemplate); - } - return deferred.promise; - }; -} - -export const TranscludeNameComponent: VeComponentOptions = { - selector: 'transcludeName', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - noClick: '@', - nonEditable: '<', - clickHandler: '&?', - mmsCfLabel: '@', - }, - transclude: true, - require: { - mmsViewCtrl: '?^^view', - mmsSpecEditor: '?^^specEditor', - }, - controller: TranscludeNameController, -}; - -veComponents.component(TranscludeNameComponent.selector, TranscludeNameComponent); diff --git a/src/ve-components/transclusions/components/transclude-section.component.ts b/src/ve-components/transclusions/components/transclude-section.component.ts deleted file mode 100644 index 21141c587..000000000 --- a/src/ve-components/transclusions/components/transclude-section.component.ts +++ /dev/null @@ -1,182 +0,0 @@ -import { PresentationService } from '@ve-components/presentations'; -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { DeletableTransclusion, ITransclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { editor_buttons, EditorService } from '@ve-core/editor'; -import { MathService, UtilsService, ImageService, RootScopeService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { InstanceValueObject } from '@ve-types/mms'; - -/** - * @ngdoc component - * @name veComponents/TranscludeSectionController - * - * @requires {VeQService} $q - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {JQuery} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {MathService} mathSvc - * - * * Given an element id, puts in the element's name binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and name change, - * and on click - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeSectionController extends DeletableTransclusion implements ITransclusion { - showNumbering: boolean; - noCompile: boolean = true; - //Locals - level: number = 0; - static $inject = [...DeletableTransclusion.$inject, 'PresentationService', 'RootScopeService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - viewSvc: ViewService, - private presentationSvc: PresentationService, - private rootScopeSvc: RootScopeService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc, - viewSvc - ); - this.cfType = 'name'; - this.cfTitle = ''; - this.cfKind = 'Text'; - this.checkCircular = false; - } - - $onInit(): void { - super.$onInit(); - this.showNumbering = this.rootScopeSvc.veNumberingOn(); - this.bbId = this.buttonBarSvc.generateBarId(`${this.mmsElementId}_section`); - this.bbApi = this.buttonBarSvc.initApi(this.bbId, this.bbInit, editor_buttons); - this.bbApi.setPermission('editor-preview', false); - this.bbApi.setPermission('editor-save-continue', false); - this.bbApi.setPermission('editor-reset', false); - this.$element.on('click', (e) => { - if (this.startEdit) this.startEdit(); - if (this.mmsViewCtrl) this.mmsViewCtrl.transcludeClicked(this.element); - e.stopPropagation(); - }); - this.subs.push( - this.eventSvc.binding(this.rootScopeSvc.constants.VENUMBERINGON, (data) => { - this.showNumbering = data; - }) - ); - } - - $onDestroy(): void { - super.$onDestroy(); - this.buttonBarSvc.destroy(this.bbId); - } - - public getContent = (preview?): VePromise => { - if (this.element.specification && this.element.specification.operand) { - const dups = this.presentationSvc.checkForDuplicateInstances( - this.element.specification.operand as InstanceValueObject[] - ); - if (dups.length > 0) { - this.growl.warning('There are duplicates in this section, duplicates ignored!'); - } - } - if (this.element._veNumber) { - this.level = this.element._veNumber.split('.').length; - } - const deferred = this.$q.defer(); - deferred.reject({ status: 200 }); //don't recompile - return deferred.promise; - }; -} - -export const TranscludeSectionComponent: VeComponentOptions = { - selector: 'transcludeSection', - template: ` -
    -
    -

    - {{$ctrl.element._veNumber}} {{$ctrl.element.name}} -

    -
    -
    -
    -

    -
    -

    -
    - -
    -
    -
    - -
    - - -
    -
    -
    -
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - }, - transclude: true, - require: { - mmsViewCtrl: '?^^view', - mmsViewPresentationElemCtrl: '?^viewPe', - }, - controller: TranscludeSectionController, -}; - -veComponents.component(TranscludeSectionComponent.selector, TranscludeSectionComponent); diff --git a/src/ve-components/transclusions/components/transclude-val.component.ts b/src/ve-components/transclusions/components/transclude-val.component.ts deleted file mode 100644 index d73308d6b..000000000 --- a/src/ve-components/transclusions/components/transclude-val.component.ts +++ /dev/null @@ -1,415 +0,0 @@ -import $ from 'jquery'; - -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { SpecTool } from '@ve-components/spec-tools'; -import { ITransclusion, ITransclusionComponentOptions, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { EditorService, editor_buttons } from '@ve-core/editor'; -import { MathService, UtilsService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ValueService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { PropertySpec, veComponents } from '@ve-components'; - -import { VeQService } from '@ve-types/angular'; -import { ValueObject } from '@ve-types/mms'; - -/** - * @ngdoc component - * @name veComponents/TranscludeValController - * - * @requires {VeQService} $q - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {JQuery} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {MathService} mathSvc - * - * * Given an element id, puts in the element's name binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and name change, - * and on click - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeValController extends Transclusion implements ITransclusion { - //Custom Bindings - first: boolean; - - //Custom Require - mmsSpecEditorCtrl: SpecTool; - - //Locals - addValueType: string = 'LiteralString'; - values: ValueObject[] = []; - editValues: ValueObject[] = []; - propertySpec: PropertySpec; - public bbApi: ButtonBarApi; - public bars: string[]; - - //Templates - template = ` - - {{::value.value}} - {{::value.value}} - {{::value.value | veRealNum}} - {{::value.value}} - - - {{::value.body[0]}} - {{$ctrl.first ? $ctrl.values : value}} - -`; - previewTemplate = ` -
    - - {{value.value}} - {{value.value}} - {{value.value | veRealNum}} - {{value.value}} - - - {{value.body[0]}} - {{value}} - -
    -`; - editTemplate = ` -
    -
    -

    Value : {{$ctrl.element.name}}

    -
    - -
    -
    -
    -
    -
    - - -
    -
    -
    -
    -   - -
    - -
    -
    -
    -   - -
    - -
    -
     {{value.value}} 
    -
    -
    -   -
    -
    -
    -
    - -
    -
    - - -
    - -
    -
    - -
    -
    Editing not supported for now
    -
    -
    - -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -

    Constraint Specification

    -
    -
    -
    -
    -
    -
    - -
    -
    - -
    -
    Editing not supported for now
    -
    -
    -
    -`; - - static $inject = [...Transclusion.$inject, 'ValueService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - private valueSvc: ValueService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'val'; - this.cfTitle = 'Value'; - this.cfKind = 'Value'; - this.cfField = 'value'; - this.checkCircular = false; - } - - $onInit(): void { - super.$onInit(); - this.bbId = this.buttonBarSvc.generateBarId(`${this.mmsElementId}_${this.cfType}`); - this.bbApi = this.buttonBarSvc.initApi(this.bbId, this.bbInit, editor_buttons); - - this.$element.on('click', (e) => { - e.stopPropagation(); - if (this.noClick) return; - - if (!this.nonEditable && !this.isEditing) { - this.startEdit(); - } - if (this.mmsViewCtrl) { - this.mmsViewCtrl.transcludeClicked(this.element); - } - if (this.nonEditable && this.mmsViewCtrl && this.mmsViewCtrl.isEditable()) { - this.growl.warning('Cross Reference is not editable.'); - } - }); - } - - public getContent = (preview?): angular.IPromise => { - const deferred = this.$q.defer(); - const toCompileList: any[] = []; - let areStrings = false; - this.values = this.valueSvc.getValues(this.element); - let values = this.values; - let result = ''; - if (preview) { - values = this.editValues; - } - for (let i = 0; i < values.length; i++) { - if (values[i].type === 'LiteralString') { - areStrings = true; - let s = values[i].value as string; - if (s.indexOf('

    ') === -1) { - s = s.replace('<', '<'); - } - toCompileList.push(s); - } else { - break; - } - } - - if (values.length === 0 || Object.keys(values[0]).length < 2) { - result = '(no value)'; - deferred.resolve(result); - } else if (areStrings) { - let toCompile = toCompileList.join(' '); - if (toCompile === '' || this.emptyRegex.test(toCompile)) { - result = '(no value)'; - deferred.resolve(result); - } - toCompile = toCompile.replace(this.spacePeriod, '>.'); - toCompile = toCompile.replace(this.spaceSpace, '> '); - toCompile = toCompile.replace(this.spaceComma, '>,'); - if (preview) { - result = '

    ' + toCompile + '
    '; - } else { - result = toCompile; - } - - if (!this.mmsGenerateForDiff) { - const resultHtml = $('

    ').html(result).toArray(); - this.mathSvc.typeset(resultHtml).then( - () => deferred.resolve(resultHtml), - (reason) => { - deferred.reject(reason); - } - ); - } else { - deferred.resolve(result); - } - } else { - if (preview) { - deferred.resolve(this.previewTemplate); - } else { - if (this.first) { - this.values = [this.values[0]]; - } - deferred.resolve(this.template); - } - } - return deferred.promise; - }; - - protected recompile = (preview?: boolean): void => { - if (!this.valueSvc.isValue(this.element)) { - this.$element.empty(); - //TODO: Add reason/errorMessage handling here. - this.$transcludeEl = $( - '' - ); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)( - Object.assign(this.$scope.$new(), { - elementId: this.element.id, - recentElement: this.element, - type: 'transclusion', - field: this.cfField, - }) - ); - return; - } - if (!this.nonEditable && this.mmsSpecEditorCtrl && !this.edit) { - this.startEdit(); - } else { - this.defaultRecompile(preview); - } - }; - - protected startEdit(): void { - if (this.propertySpec) { - super.startEdit(() => { - this.editValues = this.valueSvc.getValues(this.edit.element); - }); - return; - } - this.valueSvc.getPropertySpec(this.element).then( - (value) => { - this.propertySpec = value; - super.startEdit(() => { - this.editValues = this.valueSvc.getValues(this.edit.element); - }); - }, - (reason) => { - this.growl.error('Failed to get property spec: ' + reason.message); - } - ); - } - - public save = (e: JQuery.ClickEvent): void => { - e.stopPropagation(); - this.saveAction(false); - }; - - public saveC = (e: JQuery.ClickEvent): void => { - e.stopPropagation(); - this.saveAction(true); - }; - - public cancel = (e: JQuery.ClickEvent): void => { - e.stopPropagation(); - this.cancelAction(); - }; - - public addValue(e: JQueryEventObject): void { - e.stopPropagation(); - const newVal = this.valueSvc.addValue(this.edit, this.addValueType); - if (this.editValues.length == 0) { - this.editValues.push(newVal); - } - } - - public addEnumerationValue(e: JQueryEventObject): void { - e.stopPropagation(); - const enumValue = this.valueSvc.addEnumerationValue(this.propertySpec, this.edit); - this.editValues.push(enumValue); - if (this.element.type == 'Property' || this.element.type == 'Port') { - this.edit.element.defaultValue = enumValue; - } - } - - public removeVal = (e: JQueryEventObject, i: number): void => { - e.stopPropagation(); - this.editValues.splice(i, 1); - }; -} - -export const TranscludeValComponent: ITransclusionComponentOptions = { - selector: 'transcludeVal', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - nonEditable: '<', - noClick: '<', - mmsCfLabel: '@', - mmsGenerateForDiff: '<', - mmsCallback: '&', - mmsWatchId: '<', - first: '<', - }, - transclude: true, - require: { - mmsViewCtrl: '?^view', - mmsViewPresentationElemCtrl: '?^viewPe', - mmsSpecEditorCtrl: '?^specEditor', - }, - controller: TranscludeValController, -}; - -veComponents.component(TranscludeValComponent.selector, TranscludeValComponent); diff --git a/src/ve-components/transclusions/components/transclude-value-link.component.ts b/src/ve-components/transclusions/components/transclude-value-link.component.ts deleted file mode 100644 index c93d890f0..000000000 --- a/src/ve-components/transclusions/components/transclude-value-link.component.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { ExtensionService, ComponentService } from '@ve-components/services'; -import { ITransclusion, ITransclusionComponentOptions, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { MathService, UtilsService, ImageService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { ElementObject, LiteralObject, SlotObject } from '@ve-types/mms'; - -/** - * @ngdoc component - * @name veComponents/TranscludeNameController - * - * @requires {VeQService} $q - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {JQuery} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {MathService} mathSvc - * - * * Given an element id, puts in the element's name binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and name change, - * and on click - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeNameController extends Transclusion implements ITransclusion { - //Custom Bindings - mmsLinkText: string; - - static $inject = Transclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'name'; - this.cfTitle = ''; - this.cfKind = 'Text'; - this.checkCircular = false; - this.nonEditable = true; - } - - $onInit(): void { - super.$onInit(); - if (typeof this.mmsLinkText === 'undefined') this.mmsLinkText = 'Link'; - } - - public getContent = (): VePromise => { - let url = ''; - if (this.element.type === 'Property') { - const value = this.element.defaultValue; - if (value && value.type === 'LiteralString') { - url = value.value as string; - } - } else if (this.element.type === 'Slot') { - if ( - angular.isArray(this.element.value) && - this.element.value.length > 0 && - (this.element.value[0] as ElementObject).type === 'LiteralString' - ) { - url = ((this.element as SlotObject).value[0] as LiteralObject).value; - } - } - - if (url !== '') { - return this.$q.resolve('' + this.mmsLinkText + ''); - } else { - return this.$q.reject('Element does not provide link value.'); - } - }; -} - -export const TranscludeValueLinkComponent: ITransclusionComponentOptions = { - selector: 'transcludeValueLink', - template: ` -
    -`, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '<', - mmsCfLabel: '@', - mmsLinkText: '@', - }, - transclude: true, - require: { - transclusionCtrl: '?^^transclusion', - mmsViewCtrl: '?^^view', - }, - controller: TranscludeNameController, -}; - -veComponents.component(TranscludeValueLinkComponent.selector, TranscludeValueLinkComponent); diff --git a/src/ve-components/transclusions/components/transclude-view.component.ts b/src/ve-components/transclusions/components/transclude-view.component.ts deleted file mode 100644 index c52fae9f6..000000000 --- a/src/ve-components/transclusions/components/transclude-view.component.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ITransclusion, Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { ImageService, MathService, UtilsService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ViewApi } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; - -/** - * @ngdoc component - * @name veComponents/TranscludeViewController - * @type {ITransclusion} - * - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {angular.IRootElementService} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {Utils} utils - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {ButtonBarService} buttonBarSvc - * @requires {MathService} mathSvc - * * Given an element id, puts in the view that is described by that element, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * - * ## Example - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class TranscludeViewController extends Transclusion implements ITransclusion { - //Custom Bindings - public noTitle: boolean; - - public viewApi: ViewApi; - - static $inject = Transclusion.$inject; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - this.cfType = 'view'; - this.cfTitle = 'View'; - this.cfKind = 'contents'; - this.checkCircular = true; - } - - $onInit(): void { - super.$onInit(); - if (typeof this.noTitle === 'undefined') { - this.noTitle = true; - } - - if (this.mmsViewCtrl) { - this.viewApi = this.mmsViewCtrl.mmsViewApi; - } - } - - public getContent = (): VePromise => { - return this.$q.resolve( - '' - ); - }; -} - -const TranscludeViewComponent: VeComponentOptions = { - selector: 'transcludeView', - template: `
    `, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsWatchId: '@', - nonEditable: '<', - mmsCfLabel: '@', - mmsGenerateForDiff: '<', - noTitle: '@', - }, - require: { - mmsViewCtrl: '?^^view', - mmsViewPresentationElemCtrl: '?^^mmsViewPresentationElem', - }, - controller: TranscludeViewController, -}; - -veComponents.component(TranscludeViewComponent.selector, TranscludeViewComponent); diff --git a/src/ve-components/transclusions/deletable-transclusion.controller.ts b/src/ve-components/transclusions/deletable-transclusion.controller.ts deleted file mode 100644 index c1cbb90f9..000000000 --- a/src/ve-components/transclusions/deletable-transclusion.controller.ts +++ /dev/null @@ -1,121 +0,0 @@ -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { Transclusion } from '@ve-components/transclusions'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { ImageService, MathService, UtilsService } from '@ve-utils/application'; -import { EditService, EventService } from '@ve-utils/core'; -import { ElementService, ViewService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { VeQService } from '@ve-types/angular'; -import { PresentTextObject } from '@ve-types/mms'; - -export class DeletableTransclusion extends Transclusion { - static $inject = [...Transclusion.$inject, 'ViewService']; - constructor( - $q: VeQService, - $scope: angular.IScope, - $compile: angular.ICompileService, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - editorSvc: EditorService, - editSvc: EditService, - elementSvc: ElementService, - utilsSvc: UtilsService, - schemaSvc: SchemaService, - eventSvc: EventService, - mathSvc: MathService, - extensionSvc: ExtensionService, - buttonBarSvc: ButtonBarService, - imageSvc: ImageService, - private viewSvc: ViewService - ) { - super( - $q, - $scope, - $compile, - $element, - growl, - componentSvc, - editorSvc, - editSvc, - elementSvc, - utilsSvc, - schemaSvc, - eventSvc, - mathSvc, - extensionSvc, - buttonBarSvc, - imageSvc - ); - } - - $onInit(): void { - super.$onInit(); - if (this.mmsViewPresentationElemCtrl) { - // delete is used for transclude doc, com, or section - this.delete = (): void => { - this.deleteAction(); - }; - const instanceSpec = this.mmsViewPresentationElemCtrl.getInstanceSpec(); - const presentationElem = this.mmsViewPresentationElemCtrl.getPresentationElement(); - const isOpaque = - instanceSpec.classifierIds && - instanceSpec.classifierIds.length > 0 && - this.schemaSvc - .getMap('OPAQUE_CLASSIFIERS', this.schema) - .indexOf(instanceSpec.classifierIds[0]) >= 0; - if ( - !isOpaque && - this.mmsElementId === (presentationElem as PresentTextObject).source && - this.mmsElementId === instanceSpec.id - ) { - this.isDeletable = true; - } - if (!isOpaque && this.viewSvc.isSection(instanceSpec) && this.mmsElementId === instanceSpec.id) { - this.isDeletable = true; - } - } - } - - protected deleteAction = (): void => { - if (this.elementSaving) { - this.growl.info('Please Wait...'); - return; - } - - this.bbApi.toggleButtonSpinner('editor-delete'); - - this.editorSvc - .deleteConfirmModal(this.edit) - .result.then(() => { - const section = this.mmsViewPresentationElemCtrl.getParentSection(); - const instanceVal = this.mmsViewPresentationElemCtrl.getInstanceVal(); - const instanceSpec = this.mmsViewPresentationElemCtrl.getInstanceSpec(); - const viewOrSec = section ? section : this.view; - const reqOb = { - elementId: viewOrSec.id, - projectId: viewOrSec._projectId, - refId: viewOrSec._refId, - commitId: 'latest', - }; - this.viewSvc.removeElementFromViewOrSection(reqOb, instanceVal).then( - () => { - // Broadcast message to TreeCtrl: - this.eventSvc.$broadcast('view.reordered', viewOrSec); - - this.eventSvc.$broadcast('content-reorder.refresh'); - - this.cleanUpAction(); - - this.growl.success('Remove Successful'); - }, - (reason) => this.editorSvc.handleError(reason) - ); - }) - .finally(() => { - this.bbApi.toggleButtonSpinner('editor-delete'); - }); - }; -} diff --git a/src/ve-components/transclusions/depricated/mmsDiagramBlock.directive.ts b/src/ve-components/transclusions/depricated/mmsDiagramBlock.directive.ts deleted file mode 100644 index 5c90acb66..000000000 --- a/src/ve-components/transclusions/depricated/mmsDiagramBlock.directive.ts +++ /dev/null @@ -1,390 +0,0 @@ -// import { veComponents } from '@ve-components' -// -// veComponents.directive('mmsDiagramBlock', [ -// 'go', -// 'growl', -// 'ElementService', -// mmsDiagramBlock, -// ]) -// -// function mmsDiagramBlock(go, growl, ElementService) { -// var mmsDiagramBlockCtrl = function (scope) {} -// -// var mmsDiagramBlockLink = function (scope, element, attrs) { -// ElementService.getOwnedElements( -// scope.mmsDid, -// false, -// 'master', -// 'latest' -// ).then( -// function (data) { -// var ownedElementsMap = {} -// -// for (let i = 0; i < data.length; i++) { -// ownedElementsMap[data[i].id] = data[i] -// } -// -// // create a list of all the nodes -// let nodesMap = {}; -// -// let elem; -// -// for (let i = 0; i < data.length; i++) { -// elem = data[i] -// -// if (elem.type === 'Element') { -// var node = { -// key: elem.id, -// iskey: true, -// figure: 'Decision', -// label: elem.name, -// parent: '', -// children: [], -// } -// -// // does it have an owner and is the owner a member of this model? -// if ( -// elem.hasOwnProperty('ownerId') && -// ownedElementsMap[elem.ownerId] -// ) { -// node.parent = elem.ownerId -// } -// -// nodesMap[node.key] = node -// } -// } -// -// // associate children nodes with all the nodes and -// var nodes: any[] = [] -// -// for (let elem_id in nodesMap) { -// var elem_node = nodesMap[elem_id] -// nodes.push(elem_node) -// if (elem_node.parent) { -// nodesMap[elem_node.parent].children.push(elem_node) -// } -// } -// -// // create a list of all the edges / relationships -// var edges: { from: string; to: string }[] = [] -// -// for (let i = 0; i < data.length; i++) { -// elem = data[i] -// -// if (elem.type === 'Dependency') { -// var edge: { from: string; to: string } = { -// from: elem._sourceIds[0], -// to: elem._targetIds[0], -// } -// -// edges.push(edge) -// } -// } -// -// // a graph is a set of nodes, edges -// var graph = { nodes: nodes, edges: edges } -// -// -// // create a list of components to diagram from the graph -// var components: any[] = [] -// -// for (let i = 0; i < graph.nodes.length; i++) { -// elem = graph.nodes[i] -// -// var diagramNode = { -// key: elem.key, -// text: elem.label, -// color: 'lightblue', -// group: null, -// isGroup: false, -// } -// -// /*var diagramNode = -// -// { -// key: elem.key, -// items: [ -// { name: "Name: ", key: "elem.key", iskey: false, figure: "Diamond", color: "purple" }, -// { name: "Status: ", iskey: false, figure: "Diamond", color: "purple" } ], -// text: elem.label, color: "lightblue" -// -// }; */ -// -// // if the element has children then it should be a group -// if (elem.children.length > 0) { -// diagramNode.isGroup = true -// } -// -// if (elem.parent) { -// diagramNode.group = elem.parent -// } -// -// components.push(diagramNode) -// } -// -// var $ = go.GraphObject.make -// var myDiagram = // create a Diagram for the given HTML DIV element -// $(go.Diagram, element[0], { -// allowDrop: true, -// // what to do when a drag-drop occurs in the Diagram's background -// mouseDrop: function (e) { -// // when the selection is dropped in the diagram's background, -// // make sure the selected Parts no longer belong to any Group -// var ok = myDiagram.commandHandler.addTopLevelParts( -// myDiagram.selection, -// true -// ) -// if (!ok) myDiagram.currentTool.doCancel() -// }, -// layout: $(go.GridLayout, { -// wrappingWidth: Infinity, -// alignment: go.GridLayout.Position, -// cellSize: new go.Size(1, 1), -// }), -// initialContentAlignment: go.Spot.Center, -// // this applies to all Groups -// groupSelectionAdornmentTemplate: $( -// go.Adornment, -// go.Panel.Auto, -// $(go.Shape, 'Rectangle', { -// fill: null, -// stroke: 'dodgerblue', -// strokeWidth: 3, -// }), -// $(go.Placeholder) -// ), -// 'commandHandler.archetypeGroupData': { -// isGroup: true, -// category: 'OfNodes', -// }, -// 'undoManager.isEnabled': true, -// }) -// -// myDiagram.addDiagramListener('ChangedSelection', function (e) { -// var selnode = myDiagram.selection.first() -// myDiagram.model.selectedNodeData = -// selnode instanceof go.Node ? selnode.data : null -// scope.$apply() -// }) -// -// function highlightGroup(e, grp, show) { -// if (!grp) return -// e.handled = true -// if (show) { -// // cannot depend on the grp.diagram.selection in the case of external drag-and-drops; -// // instead depend on the DraggingTool.draggedParts or .copiedParts -// var tool = grp.diagram.toolManager.draggingTool -// var map = tool.draggedParts || tool.copiedParts // this is a Map -// // now we can check to see if the Group will accept membership of the dragged Parts -// if (grp.canInsertMembers(map.toKeySet())) { -// grp.isHighlighted = true -// return -// } -// } -// grp.isHighlighted = false -// } -// -// function finishDrop(e, grp) { -// let ok = grp !== null && grp.addMembers(grp.diagram.selection, true); -// if (!ok) grp.diagram.currentTool.doCancel() -// } -// -// myDiagram.groupTemplate = $( -// go.Group, -// 'Auto', -// { -// // define the group's internal layout -// layout: $(go.TreeLayout, { -// angle: 90, -// arrangement: go.TreeLayout.ArrangementHorizontal, -// isRealtime: false, -// }), -// // the group begins unexpanded; -// // upon expansion, a Diagram Listener will generate contents for the group -// isSubGraphExpanded: false, -// // when a group is expanded, if it contains no parts, generate a subGraph inside of it -// subGraphExpandedChanged: function (group) { -// if (group.memberParts.count === 0) { -// //randomGroup(group.data.key); -// } -// }, -// }, -// $(go.Shape, 'RoundedRectangle', { -// fill: null, -// stroke: 'gray', -// strokeWidth: 2, -// }), -// $( -// go.Panel, -// 'Vertical', -// { defaultAlignment: go.Spot.Left, margin: 4 }, -// $( -// go.Panel, -// 'Horizontal', -// { defaultAlignment: go.Spot.Top }, -// // the SubGraphExpanderButton is a panel that functions as a button to expand or collapse the subGraph -// $('SubGraphExpanderButton'), -// $( -// go.TextBlock, -// { font: 'Bold 18px Sans-Serif', margin: 4 }, -// new go.Binding('text', 'text') -// ) -// ), -// // create a placeholder to represent the area where the contents of the group are -// $(go.Placeholder, { padding: new go.Margin(0, 10) }) -// ) -// ) // end Group -// -// -// // whenever a GoJS transaction has finished modifying the model, update all Angular bindings -// function updateAngular(e) { -// if (e.isTransactionFinished) scope.$apply() -// } -// -// -// // notice when the value of "model" changes: update the Diagram.model -// /* scope.$watch("model", function(var newmodel) { -// var oldmodel = diagram.model; -// if (oldmodel !== newmodel) { -// if (oldmodel) oldmodel.removeChangedListener(updateAngular); -// newmodel.addChangedListener(updateAngular); -// diagram.model = newmodel; -// } -// }); */ -// // update the model when the selection changes -// -// // the template for each attribute in a node's array of item data -// let itemTempl = -// go.Panel, -// 'Horizontal', -// $( -// go.Shape, //node's object rendering -// { desiredSize: new go.Size(5, 5) }, -// new go.Binding('figure', 'figure'), -// new go.Binding('fill', 'color') -// ), -// $( -// go.TextBlock, -// { stroke: '$black', font: 'bold 11px sans-serif' }, -// new go.Binding('text', '', go.Binding.toString) -// ) -// ) -// -// myDiagram.nodeTemplate = $( -// go.Node, -// go.Panel.Auto, -// { -// selectionAdorned: true, -// resizable: true, -// layoutConditions: -// go.Part.LayoutStandard & ~go.Part.LayoutNodeSized, -// fromSpot: go.Spot.Right, -// toSpot: go.Spot.Left, -// isShadowed: true, -// // highlight when dragging over a Node that is inside a Group -// mouseDragEnter: function (e, nod, prev) { -// highlightGroup(e, nod.containingGroup, true) -// }, -// mouseDragLeave: function (e, nod, next) { -// highlightGroup(e, nod.containingGroup, false) -// }, -// // dropping on a Node is the same as dropping on its containing Group, if any -// mouseDrop: function (e, nod) { -// finishDrop(e, nod.containingGroup) -// }, -// }, -// $( -// go.Shape, -// 'RoundedRectangle', -// { -// isPanelMain: true, -// fill: '#ACE600', -// stroke: '#558000', -// strokeWidth: 2, -// }, -// new go.Binding('fill', 'color') -// ), -// $( -// go.Panel, -// 'Table', -// { margin: 4, maxSize: new go.Size(150, NaN) }, -// // the two TextBlocks in column 0 both stretch in width -// // but align on the left side -// $(go.RowColumnDefinition, { -// column: 0, -// stretch: go.GraphObject.Horizontal, -// alignment: go.Spot.Left, -// }), -// $( -// go.TextBlock, -// { -// row: 0, -// column: 0, -// maxSize: new go.Size(120, NaN), -// margin: 2, -// font: 'bold 10pt sans-serif', -// alignment: go.Spot.Top, -// }, -// new go.Binding('text', 'text') -// ), //.makeTwoWay()), -// /* $(go.TextBlock, -// { -// row: 1, column: 0, columnSpan: 2, -// font: "8pt sans-serif" -// }, -// new go.Binding("text", "", theInfoTextConverter)) */ -// -// //panel for displaying properties -// $( -// go.Panel, -// 'Vertical', -// { -// row: 1, -// padding: 3, -// alignment: go.Spot.TopLeft, -// defaultAlignment: go.Spot.Left, -// stretch: go.GraphObject.Horizontal, -// itemTemplate: itemTempl, -// }, -// new go.Binding('itemArray', 'items') -// ) -// ) -// ) -// -// //Links organization, keep links from crossing over nodes -// myDiagram.linkTemplate = $( -// go.Link, -// { -// routing: go.Link.AvoidsNodes, -// corner: 5, -// curve: go.Link.JumpGap, -// }, -// $(go.Shape), -// $(go.Shape, { toArrow: 'Standard' }) -// ) -// -// // Link components to diagram -// myDiagram.model = new go.GraphLinksModel( -// components, -// graph.edges -// ) -// -// myDiagram.model.selectedNodeData = null -// }, -// function (reason) { -// growl.error('Block Diagram Error: ' + reason.message) -// } -// ) -// } -// -// return { -// restrict: 'E', -// template: '
    ', // just a simple DIV element -// replace: true, -// scope: { -// mmsDid: '@', -// }, -// controller: ['ElementService', mmsDiagramBlockCtrl], -// link: mmsDiagramBlockLink, -// } -// } diff --git a/src/ve-components/transclusions/depricated/mmsValueLink.directive.ts b/src/ve-components/transclusions/depricated/mmsValueLink.directive.ts deleted file mode 100644 index bde74c726..000000000 --- a/src/ve-components/transclusions/depricated/mmsValueLink.directive.ts +++ /dev/null @@ -1,109 +0,0 @@ -// import { veComponents } from '@ve-components' -// -// veComponents.directive('mmsValueLink', ['ElementService', mmsValueLink]) -// -// /** -// * @ngdoc directive -// * @name veComponents.directive:mmsValueLink -// * -// * @requires veUtils/ElementService -// * -// * @restrict E -// * * Given an element id, generates a hyperlink with a mms-cf value -// * -// * @param {string} mmsElementId The id of the view -// * @param {string} mmsProjectId The project id for the view -// * @param {string=master} mmsRefId Reference to use, defaults to master -// * @param {string=latest} mmsCommitId Commit ID, default is latest -// * @param {string} mmsErrorText Text to display when element is not found -// * @param {string} mmsLinkText Text to display for hyperlink -// */ -// function mmsValueLink(ElementService, $compile, growl) { -// const mmsValueLinkLink = (scope, element, attrs, controllers) => { -// const mmsCfCtrl = controllers[0] -// const mmsViewCtrl = controllers[1] -// let projectId = scope.mmsProjectId -// let refId = scope.mmsRefId -// let commitId = scope.mmsCommitId -// if (mmsCfCtrl) { -// const cfVersion = mmsCfCtrl.getElementOrigin() -// if (!projectId) projectId = cfVersion.projectId -// if (!refId) refId = cfVersion.refId -// if (!commitId) commitId = cfVersion.commitId -// } -// if (mmsViewCtrl) { -// const viewVersion = mmsViewCtrl.getElementOrigin() -// if (!projectId) projectId = viewVersion.projectId -// if (!refId) refId = viewVersion.refId -// if (!commitId) commitId = viewVersion.commitId -// } -// if (!projectId) { -// return -// } -// scope.projectId = projectId -// scope.refId = refId ? refId : 'master' -// scope.commitId = commitId ? commitId : 'latest' -// const reqOb = { -// elementId: scope.mmsElementId, -// projectId: scope.projectId, -// refId: scope.refId, -// commitId: scope.commitId, -// } -// -// ElementService.getElement(reqOb).then( -// (data) => { -// if (data.type === 'Property') { -// const value = data.defaultValue -// if (value && value.type === 'LiteralString') -// scope.url = value.value -// } else if (data.type === 'Slot') { -// if ( -// Array.isArray(data.value) && -// data.value.length > 0 && -// data.value[0].type === 'LiteralString' -// ) { -// scope.url = data.value[0].value -// } -// } else { -// if (scope.mmsErrorText) { -// element.html( -// '' + -// scope.mmsErrorText + -// '' -// ) -// } else { -// if (scope.mmsErrorText) { -// element.html( -// '' + scope.mmsErrorText + '' -// ) -// } else { -// element.html( -// 'Element does not provide link value.' -// ) -// } -// } -// } -// }, -// (reason) => { -// element.html( -// 'Element was not found.' -// ) -// } -// ) -// } -// -// return { -// restrict: 'E', -// scope: { -// mmsElementId: '@', -// mmsProjectId: '@', -// mmsRefId: '@', -// mmsCommitId: '@', -// mmsErrorText: '@', -// mmsLinkText: '@', -// }, -// require: ['?^^mmsCf', '?^^view'], -// template: '{{mmsLinkText}}', -// link: mmsValueLinkLink, -// } -// } diff --git a/src/ve-components/transclusions/index.ts b/src/ve-components/transclusions/index.ts deleted file mode 100644 index 073d3e937..000000000 --- a/src/ve-components/transclusions/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -// import "./transclusion.controller" -export * from './transclusion.controller'; -export * from './deletable-transclusion.controller'; -import './services/Transclusion.service'; - -export * from './services/Transclusion.service'; - -import './mms-cf.component'; - -import './components'; -import './mms-transclude-compatibility.component'; - -import './modals/create-transclusion.modal'; - -export * from './modals/create-transclusion.modal'; - -// import "./mmsTsDiagram.directive"; diff --git a/src/ve-components/transclusions/mms-cf.component.ts b/src/ve-components/transclusions/mms-cf.component.ts deleted file mode 100644 index 5ad134bf0..000000000 --- a/src/ve-components/transclusions/mms-cf.component.ts +++ /dev/null @@ -1,147 +0,0 @@ -import angular, { IComponentController } from 'angular'; - -import { ViewController } from '@ve-components/presentations/view.component'; -import { ExtensionService } from '@ve-components/services'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { RequestObject } from '@ve-types/mms'; - -/** - * @ngdoc component - * @name veComponents.component:mmsCf - * - * @requires $compile - * * Given an element id, puts in the element's name binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and name change, - * and on click - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string} mmsCfType one of doc, val, name, com, img - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {boolean=false} nonEditable can edit inline or not - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - */ - -export class CrossReferenceController implements IComponentController { - //Bindings - mmsElementId: string; - mmsProjectId: string; - mmsRefId: string; - mmsCommitId: string; - mmsCfType: string; - mmsWatchId: string; - nonEditable: boolean; - mmsGenerateForDiff: boolean; - mmsAttr: string; - mmsCfLabel: boolean; - - //Deps - transclusionCtrl: CrossReferenceController; - mmsViewCtrl: ViewController; - - //Local - projectId: string; - refId: string; - commitId: string; - clearWatch: boolean = false; - extType: string = 'transclusion'; - - static $inject = ['$compile', '$scope', '$element', 'ExtensionService']; - - protected $transcludeEl: JQuery; - - constructor( - private $compile: angular.ICompileService, - private $scope: angular.IScope, - private $element: JQuery, - private extensionSvc: ExtensionService - ) {} - - $onInit(): void { - this.changeAction(); - } - - //INFO this was this.getWsAndVersion - public getElementOrigin = (): RequestObject => { - return { - projectId: this.projectId, - refId: this.refId, - commitId: this.commitId, - }; - }; - - private changeAction = (): void => { - let projectId = this.mmsProjectId; - let refId = this.mmsRefId; - let commitId = this.mmsCommitId; - if (this.transclusionCtrl) { - const cfVersion = this.transclusionCtrl.getElementOrigin(); - if (!projectId) projectId = cfVersion.projectId; - if (!refId) refId = cfVersion.refId; - if (!commitId) commitId = cfVersion.commitId; - } - if (this.mmsViewCtrl) { - const viewVersion = this.mmsViewCtrl.getElementOrigin(); - if (!projectId) projectId = viewVersion.projectId; - if (!refId) refId = viewVersion.refId; - if (!commitId) commitId = viewVersion.commitId; - } - if (!projectId) { - return; - } - this.projectId = projectId; - this.refId = refId ? refId : 'master'; - this.commitId = commitId ? commitId : 'latest'; - //this.templateElementHtml = this.$element[0].innerHTML; - if (this.mmsCfType) { - this.$element.empty(); - const tag = this.extensionSvc.getTagByType('transclude', this.mmsCfType); - if (tag === 'extension-error') { - this.$transcludeEl = $( - '' - ); - } else { - this.$transcludeEl = $( - '<' + - tag + - (this.mmsGenerateForDiff ? ' mms-generate-for-diff="$ctrl.mmsGenerateForDiff"' : '') + - (this.mmsAttr ? ' mms-attr={{$ctrl.mmsAttr}}' : '') + - (typeof this.mmsCfLabel !== 'undefined' ? ' mms-cf-label={{$ctrl.mmsCfLabel}}' : '') + - ' mms-element-id="{{$ctrl.mmsElementId}}" mms-project-id="{{$ctrl.projectId}}" mms-ref-id="{{$ctrl.refId}}" mms-commit-id="{{$ctrl.commitId}}" non-editable="$ctrl.nonEditable">' - ); - } - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)(this.$scope); - } - }; -} - -const MmsCfComponent: VeComponentOptions = { - selector: 'mmsCf', - template: `
    `, - transclude: true, - bindings: { - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - mmsCommitId: '@', - mmsCfType: '@', - mmsWatchId: '@', - nonEditable: '<', - mmsGenerateForDiff: '<', - mmsAttr: '@', - mmsCfLabel: '@', - }, - require: { - transclusionCtrl: '?^^mmsCf', - mmsViewCtrl: '?^^view', - }, - controller: CrossReferenceController, -}; -veComponents.component(MmsCfComponent.selector, MmsCfComponent); diff --git a/src/ve-components/transclusions/mms-transclude-compatibility.component.ts b/src/ve-components/transclusions/mms-transclude-compatibility.component.ts deleted file mode 100644 index 8017f6bd0..000000000 --- a/src/ve-components/transclusions/mms-transclude-compatibility.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TranscludeArtComponent } from '@ve-components/transclusions/components/transclude-art.component'; -import { TranscludeComComponent } from '@ve-components/transclusions/components/transclude-com.component'; -import { TranscludeGroupDocsComponent } from '@ve-components/transclusions/components/transclude-group-docs.component'; -import { TranscludeImgComponent } from '@ve-components/transclusions/components/transclude-img.component'; -import { TranscludeValComponent } from '@ve-components/transclusions/components/transclude-val.component'; - -import { veComponents } from '@ve-components'; - -import { TranscludeDocComponent } from './components/transclude-doc.component'; -import { TranscludeNameComponent } from './components/transclude-name.component'; - -veComponents - .component('mmsTranscludeDoc', TranscludeDocComponent) - .component('mmsTranscludeName', TranscludeNameComponent) - .component('mmsTranscludeImg', TranscludeImgComponent) - .component('mmsTranscludeArt', TranscludeArtComponent) - .component('mmsTranscludeCom', TranscludeComComponent) - .component('mmsTranscludeGroupDocs', TranscludeGroupDocsComponent) - .component('mmsTranscludeVal', TranscludeValComponent); diff --git a/src/ve-components/transclusions/modals/create-transclusion.modal.ts b/src/ve-components/transclusions/modals/create-transclusion.modal.ts deleted file mode 100644 index aaa9b6fe1..000000000 --- a/src/ve-components/transclusions/modals/create-transclusion.modal.ts +++ /dev/null @@ -1,271 +0,0 @@ -import angular from 'angular'; - -import { InsertionService } from '@ve-components/insertions'; -import { TransclusionService } from '@ve-components/transclusions'; -import { VeModalControllerImpl } from '@ve-utils/modals/ve-modal.controller'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { InsertApi, InsertData, InsertResolve } from '@ve-types/components'; -import { ElementObject, ElementsResponse, TransclusionObject } from '@ve-types/mms'; -import { VeModalComponent, VeModalController } from '@ve-types/view-editor'; - -export interface InsertTransclusionData extends InsertData { - viewLink: boolean; -} - -class CreateTransclusionModalController - extends VeModalControllerImpl> - implements VeModalController -{ - protected linkTemplate: string = ` - -

    - -
    -
    -
    -
    - -
    -
    -`; - protected transclusionTemplate: string = ` -
    -
    - * -
    -
    -
    - - -
    - -
    -`; - - protected targetTemplate: string = ` -
    - * -
    - - {{$ctrl.element.name}}: ({{$ctrl.element.id}}) - - - - (No Target) - -
    -
    -`; - protected previewTemplate: string = ` -
    - -`; - - protected title: string = 'Insert Cross Reference'; - protected description: string; - protected searchExisting: boolean = true; - protected cf: TransclusionObject; - protected element: ElementObject; - protected requestName: boolean = false; - protected requestDocumentation: boolean = false; - protected viewLink: boolean; - protected nonEditableCheckbox: boolean = false; - protected showEditableOp: boolean = true; - protected oking: boolean; - protected cfType: string; - protected linkType: number; - protected linkText: string; - - protected insertApi: InsertApi>>; - protected insertData: InsertTransclusionData; - protected inserting: boolean = false; - protected insertNew: boolean; - - protected projectId: string; - protected refId: string; - protected orgId: string; - - protected $modalBody: JQuery; - protected $previewEl: JQuery = $('
    '); - private $insert: JQuery; - private $target: JQuery; - private $transclusion: JQuery; - private $link: JQuery; - - static $inject = ['$q', '$scope', '$compile', '$element', 'growl', 'TransclusionService', 'InsertionService']; - - constructor( - private $q: VeQService, - private $scope: angular.IScope, - private $compile: angular.ICompileService, - private $element: JQuery, - private growl: angular.growl.IGrowlService, - private transclusionSvc: TransclusionService, - private insertionSvc: InsertionService - ) { - super(); - } - - $onInit(): void { - this.projectId = this.resolve.getProjectId; - this.refId = this.resolve.getRefId ? this.resolve.getRefId : 'master'; - this.orgId = this.resolve.getOrgId ? this.resolve.getOrgId : null; - - this.$modalBody = this.$element.find('.modal-body'); - this.$target = $(this.targetTemplate); - this.viewLink = this.resolve.getInsertData.viewLink; - - this.insertApi = { - resolve: (result): void => { - this.element = result; - this.insertData.selected = result; - this.selectOptions(); - }, - reject: (reason): void => { - if (reason.status !== 444) { - this.growl.error(reason.message); - } - this.element = null; - this.cancel(); - }, - }; - this.insertData = this.resolve.getInsertData; - this.description = 'Begin by searching for or creating an element, then click on a result.'; - if (this.insertData.viewLink) { - this.description = 'Begin by searching for a view or presentation, then click on a result.'; - } - //Unless Explicitly overridden, don't save a new element until transclusion is created - if (typeof this.insertData.noPublish === 'undefined') this.insertData.noPublish = true; - this.cf = { - tag: '', - }; - } - - $postLink(): void { - this.insert(); - } - - public choose = (): void => { - this.oking = true; - - let promise: VePromise; - if (this.insertData.isNew) promise = this.insertionSvc.createAction(this.element, false); - else promise = this.$q.resolve(this.element); - promise - .then( - (result) => { - this.cf.element = result; - if (!this.viewLink) { - this.cf.tag = this.transclusionSvc.createTransclusion( - result, - this.cfType, - this.nonEditableCheckbox - ); - } else { - this.cf.tag = this.transclusionSvc.createViewLink(result, this.linkType, this.linkText); - } - - this.modalInstance.close(this.cf); - }, - (reason) => { - this.growl.error('Error: ' + reason.message); - } - ) - .finally(() => { - this.oking = false; - }); - }; - - public cancel = (): void => { - this.modalInstance.dismiss(); - }; - - public insert = (): void => { - this.inserting = true; - this.$modalBody.empty(); - this.$modalBody.append(this.$target); - this.$insert = $(``); - this.$modalBody.append(this.$insert); - this.$compile(this.$modalBody)(this.$scope.$new()); - }; - - public selectOptions = (): void => { - this.inserting = false; - this.$modalBody.empty(); - this.$modalBody.append(this.$target); - if (this.viewLink) { - this.$link = $(this.linkTemplate); - this.$modalBody.append(this.$link); - } else { - this.$transclusion = $(this.transclusionTemplate); - this.$modalBody.append(this.transclusionTemplate); - } - this.$compile(this.$modalBody)(this.$scope.$new()); - }; - - public toggleRadio = (field: string): void => { - this.cfType = field; - this.$previewEl.empty(); - this.$previewEl.append($(this.previewTemplate)); - this.$previewEl.append( - $( - `
    ${this.transclusionSvc.createTransclusion( - this.element, - this.cfType, - true, - true - )}
    ` - ) - ); - this.$compile(this.$previewEl)(this.$scope.$new()); - this.$modalBody.append(this.$previewEl); - }; -} - -// Component for inserting cross-reference -// Defines scope variables for html template and how to handle user click -// Also defines options for search interfaces -- see mmsSearch.js for more info -const CreateTransclusionModal: VeModalComponent = { - selector: 'createTransclusionModal', - template: ` -
    - - - -
    -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: CreateTransclusionModalController, -}; - -veComponents.component(CreateTransclusionModal.selector, CreateTransclusionModal); diff --git a/src/ve-components/transclusions/services/Transclusion.service.ts b/src/ve-components/transclusions/services/Transclusion.service.ts deleted file mode 100644 index ace70693b..000000000 --- a/src/ve-components/transclusions/services/Transclusion.service.ts +++ /dev/null @@ -1,99 +0,0 @@ -import _ from 'lodash'; - -import { ApplicationService } from '@ve-utils/application'; -import { ViewService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { ElementObject, ViewObject } from '@ve-types/mms'; - -export class TransclusionService { - static $inject = ['ApplicationService', 'ViewService']; - - constructor(private applicationSvc: ApplicationService, private viewSvc: ViewService) {} - - public createTransclusion = ( - element: ElementObject, - cfType: string, - nonEditable?: boolean, - addProjectandRef?: boolean - ): string => { - return `[cf:${element.name}.${cfType}]`; - }; - - public createViewLink = (elem: ViewObject, linkType: number, linkText?: string): string => { - let did: string; - let vid: string; - let peid: string; - const currentDoc = this.applicationSvc.getState().currentDoc; - if (elem._relatedDocuments && elem._relatedDocuments.length > 0) { - const cur = _.find(elem._relatedDocuments, { - id: currentDoc, - }); - if (cur) { - did = currentDoc; - if (cur._parentViews.length > 0) { - vid = cur._parentViews[0].id; - } - } else { - did = elem._relatedDocuments[0].id; - if (elem._relatedDocuments[0]._parentViews.length > 0) { - vid = elem._relatedDocuments[0]._parentViews[0].id; - } - } - } - if (elem.type === 'InstanceSpecification') { - if (this.viewSvc.isSection(elem)) { - vid = elem.id; - } else { - peid = elem.id; - } - } else { - vid = elem.id; - } - return this.getLink(elem, did, vid, peid, linkType, linkText); - }; - - public getLink = ( - elem: ElementObject, - did: string, - vid: string, - peid: string, - linkType: number, - linkText?: string - ): string => { - let tag = ''; - return tag; - }; -} - -veComponents.service('TransclusionService', TransclusionService); diff --git a/src/ve-components/transclusions/transclusion.controller.ts b/src/ve-components/transclusions/transclusion.controller.ts deleted file mode 100644 index 24438e341..000000000 --- a/src/ve-components/transclusions/transclusion.controller.ts +++ /dev/null @@ -1,678 +0,0 @@ -import { IPaneScope } from '@openmbee/pane-layout'; -import $ from 'jquery'; - -import { ViewPresentationElemController } from '@ve-components/presentations'; -import { ViewController } from '@ve-components/presentations/view.component'; -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { SpecTool } from '@ve-components/spec-tools'; -import { ButtonBarApi, ButtonBarService, IButtonBarButton } from '@ve-core/button-bar'; -import { EditorService } from '@ve-core/editor'; -import { veCoreEvents } from '@ve-core/events'; -import { ImageService, MathService, UtilsService } from '@ve-utils/application'; -import { EditObject, EditService, EventService } from '@ve-utils/core'; -import { ElementService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; -import { handleChange, onChangesCallback } from '@ve-utils/utils'; - -import { VeComponentOptions, VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { EditorActions } from '@ve-types/core/editor'; -import { ElementObject, ElementsResponse, ViewObject } from '@ve-types/mms'; - -export interface ITransclusion extends angular.IComponentController { - $scope: TranscludeScope; - mmsElementId: string; - mmsProjectId: string; - mmsRefId: string; - commitId: string; - cfType: string; - edit: EditObject; - element: ElementObject; - isEditing: boolean; - inPreviewMode: boolean; - skipBroadcast: boolean; - recompileScope?: TranscludeScope; -} - -export interface ITransclusionComponentOptions extends VeComponentOptions { - bindings: TranscludeDefaultBindings; -} - -interface TranscludeDefaultBindings { - mmsElementId: '@'; - mmsProjectId: '@'; - mmsRefId: '@'; - mmsCommitId: '@'; - mmsWatchId: '<'; - mmsCfLabel: '@'; - mmsGenerateForDiff?: '<'; - noClick?: '<'; - nonEditable?: '<'; - [key: string]: string; -} - -export interface TranscludeScope extends IPaneScope { - $ctrl?: ITransclusion; - $parent: TranscludeScope; -} - -/** - * @ngdoc component - * @name veComponents/Transclusion - * @type {ITransclusion} - * - * @requires {angular.IScope} $scope - * @requires {angular.ICompileService} $compile - * @requires {angular.IRootElementService} $element - * @requires {angular.growl.IGrowlService} growl - * @requires {ComponentService} componentSvc - * @requires {ElementService} elementSvc - * @requires {UtilsService} utilsSvc - * @requires {ViewService} viewSvc - - * @requires {AuthService} authSvc - * @requires {EventService} eventSvc - * @requires {ButtonBarService} buttonBarSvc - * @requires {MathService} mathSvc - * * Given an element id, puts in the element's documentation binding, if there's a parent - * mmsView directive, will notify parent view of transclusion on init and doc change, - * and on click. Nested transclusions inside the documentation will also be registered. - * - * ## Example - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {bool} mmsWatchId set to true to not destroy element ID watcher - * @param {boolean=false} nonEditable can edit inline or not - */ -export class Transclusion implements ITransclusion, EditorActions { - //Regex - fixPreSpanRegex: RegExp = /<\/span>\s*\s*]*>/g; - emptyRegex: RegExp = /^\s*$/; - spacePeriod: RegExp = />(?:\s| )\./g; - spaceSpace: RegExp = />(?:\s| )(?:\s| )/g; - spaceComma: RegExp = />(?:\s| ),/g; - - //Required Controllers - protected mmsViewCtrl: ViewController; - protected mmsViewPresentationElemCtrl: ViewPresentationElemController; - protected mmsSpecEditorCtrl: SpecTool; - - //Bindings - mmsElementId: string; - mmsProjectId: string; - mmsRefId: string; - mmsCommitId: string; - mmsWatchId: string; - nonEditable: boolean; - noClick: boolean; - mmsCfLabel: boolean; - mmsGenerateForDiff: boolean; - mmsCallback: () => void; - - //Customizers - public cfType: string; - protected cfTitle: string; - protected cfField: 'name' | 'value' | 'documentation'; - protected cfKind: string; - protected checkCircular: boolean; - protected noCompile: boolean = false; - - //Locals - protected isDeletable: boolean; - protected editable: () => boolean = () => false; - - public subs: Rx.IDisposable[]; - - public commitId: string; - protected projectId: string; - protected refId: string; - - public isEditing: boolean = false; - public inPreviewMode: boolean = false; - public elementSaving: boolean = false; - public editLoading: boolean = false; - public skipBroadcast: boolean; - - public editKey: string | string[]; - public edit: EditObject; - public element: ElementObject; - protected type: string = ''; - protected editorType: string; - - public view: ViewObject; - // public instanceSpec: InstanceSpecObject - // public instanceVal: InstanceValueObject - // protected presentationElem: PresentationInstanceObject | ElementObject - - protected panelTitle: string; - protected panelType: string; - - protected $transcludeEl: JQuery; - - // Possible templates to manage api functions - protected template: string; - protected editTemplate: string; - protected previewTemplate: string; - - public bbApi: ButtonBarApi; - public bbId: string; - public bars: string[]; - protected buttons: IButtonBarButton[] = []; - - public schema = 'cameo'; - - //Default Toolbar Api - /* eslint-disable @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars */ - cancel(e?): void {} - reset(e?): void {} - delete(e?): void {} - preview(e?): void {} - save(e?): void {} - saveC(e?): void {} - /* eslint-enable @typescript-eslint/no-empty-function, @typescript-eslint/no-unused-vars */ - - static $inject: string[] = [ - '$q', - '$scope', - '$compile', - '$element', - 'growl', - 'ComponentService', - 'EditorService', - 'EditService', - 'ElementService', - 'UtilsService', - 'SchemaService', - 'EventService', - 'MathService', - 'ExtensionService', - 'ButtonBarService', - 'ImageService', - ]; - - constructor( - public $q: VeQService, - public $scope: angular.IScope, - protected $compile: angular.ICompileService, - protected $element: JQuery, - protected growl: angular.growl.IGrowlService, - protected componentSvc: ComponentService, - protected editorSvc: EditorService, - protected editSvc: EditService, - protected elementSvc: ElementService, - protected utilsSvc: UtilsService, - protected schemaSvc: SchemaService, - protected eventSvc: EventService, - protected mathSvc: MathService, - protected extensionSvc: ExtensionService, - protected buttonBarSvc: ButtonBarService, - protected imageSvc: ImageService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - if ((this.$element.prop('tagName') as string).includes('mms')) { - this.growl.warning( - 'mmsTransclude(*) Syntax is deprecated and will be removed in a future version' + - 'please see the release documentation for further details' - ); - } - if (this.mmsViewCtrl) { - this.view = this.mmsViewCtrl.getView(); - this.editable = this.mmsViewCtrl.isEditable; - } - if (this.mmsSpecEditorCtrl && this.mmsSpecEditorCtrl.specApi.elementId === this.mmsElementId) { - this.editable = (): boolean => this.mmsSpecEditorCtrl.specSvc.editable; - } - //if (this.editTemplate) { - this.save = (e: JQuery.ClickEvent): void => { - if (e) e.stopPropagation(); - this.saveAction(false); - }; - - this.saveC = (): void => { - this.saveAction(true); - }; - - this.cancel = (e?: JQuery.ClickEvent): void => { - if (e) e.stopPropagation(); - this.cancelAction(); - }; - - this.reset = (e?: JQuery.ClickEvent): void => { - if (e) e.stopPropagation(); - this.cleanUpAction(true); - }; - - this.preview = (): void => { - this.previewAction(); - }; - //} - } - - $onDestroy(): void { - this.eventSvc.destroy(this.subs); - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - this.watch(onChangesObj); - handleChange(onChangesObj, 'mmsElementId', this.changeAction); - handleChange(onChangesObj, 'mmsRefId', this.changeAction); - handleChange(onChangesObj, 'mmsCommitId', this.changeAction); - } - - $postLink(): void { - this.changeAction(this.mmsElementId, '', false); - } - - /** - * @name veComponents/Transclusion/watch - * Allows a transclusion to add its own custom watch behavior - * which will be triggered by the Angular $onChanges lifecycle hook. - * - * @param {angular.IOnChangesObject} onChangesObj - * @return void - */ - protected watch: (onChangesObj: angular.IOnChangesObject) => void = () => { - /* Implement custom watch logic here */ - }; - - /** - * @name veComponents/Transclusion#config - * * - * @protected - */ - protected destroy: () => void = () => { - /* Implement Custom Destroy Logic Here */ - }; - - public getContent = (preview?: boolean): VePromise => { - return this.$q.resolve('Not Yet Implemented'); - }; - - protected recompile = (preview?: boolean): void => { - this.defaultRecompile(preview); - }; - - public defaultRecompile = (preview?: boolean): void => { - this.getContent(preview).then( - (result) => { - this.$element.empty(); - this.$transcludeEl = $(result); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)(this.$scope.$new()); - if (this.mmsViewCtrl) { - this.mmsViewCtrl.elementTranscluded(this.element, this.type); - } - $(this.$element) - .find('img') - .each((index, element) => { - this.imageSvc.fixImgSrc($(element)); - }); - }, - (reason) => { - if (reason.status !== 200) { - this.growl.error(`Transclusion Error: ${reason.message}`); - } - } - ); - }; - - protected changeAction: onChangesCallback = (newVal, oldVal, firstChange) => { - if (!newVal || !this.mmsProjectId || firstChange || newVal === oldVal) { - return; - } - if (this.checkCircular) { - if (this.componentSvc.hasCircularReference(this, this.mmsElementId, 'doc')) { - this.$element.html('Circular Reference!'); - return; - } - } - this.projectId = this.mmsProjectId; - this.refId = this.mmsRefId ? this.mmsRefId : 'master'; - this.commitId = this.mmsCommitId ? this.mmsCommitId : 'latest'; - if (!this.noCompile) { - this.$element.html('(loading...)'); - } - this.$element.addClass('isLoading'); - const reqOb = { - elementId: this.mmsElementId, - projectId: this.projectId, - refId: this.refId, - commitId: this.commitId, - //includeRecentVersionElement: true, - }; - this.elementSvc - .getElement(reqOb, 1, false) - .then( - (data) => { - this.element = data; - if (!this.panelTitle) { - this.panelTitle = this.element.name + ' ' + this.cfTitle; - this.panelType = this.cfKind; - } - if (this.commitId === 'latest') { - this.subs.push( - this.eventSvc.$on( - 'element.updated', - (data: { element: ElementObject; continueEdit: boolean }) => { - const elementOb = data.element; - const continueEdit = data.continueEdit; - if ( - elementOb.id === this.element.id && - elementOb._projectId === this.element._projectId && - elementOb._refId === this.element._refId - ) { - this.element = elementOb; - this.cleanUpAction(continueEdit); - } - } - ) - ); - } - if (this.editTemplate) { - this._reopenUnsaved().then( - (data) => { - if (data) this.startEdit(); - else this.recompile(); - }, - () => { - this.recompile(); - } - ); - } else { - this.recompile(); - } - }, - (reason) => { - this.$element.empty(); - //TODO: Add reason/errorMessage handling here. - this.$transcludeEl = $( - '' - ); - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)( - Object.assign(this.$scope.$new(), { - elementId: reqOb, - recentElement: reason.recentVersionOfElement, - type: 'transclusion', - field: this.cfField, - }) - ); - } - ) - .finally(() => { - this.$element.removeClass('isLoading'); - if (this.mmsCallback) this.mmsCallback(); - }); - }; - - protected bbInit = (api: ButtonBarApi): void => { - api.addButton(this.buttonBarSvc.getButtonBarButton('editor-preview', this)); - api.addButton(this.buttonBarSvc.getButtonBarButton('editor-save', this)); - api.addButton(this.buttonBarSvc.getButtonBarButton('editor-save-continue', this)); - api.addButton(this.buttonBarSvc.getButtonBarButton('editor-cancel', this)); - api.addButton(this.buttonBarSvc.getButtonBarButton('editor-reset', this)); - api.addButton(this.buttonBarSvc.getButtonBarButton('editor-delete', this)); - api.setPermission('editor-delete', this.isDeletable); - }; - - /** - * @name Utils#reopenUnsavedElts * called by transcludes when users have unsaved edits, leaves that view, and comes back to that view. - * the editor will reopen if there are unsaved edits. - * assumes no reload. - * uses these in the scope: - * element - element object for the element to edit (for sections it's the instance spec) - * ve_edits - unsaved edits object - * startEdit - pop open the editor window - * @param {ITransclusion} ctrl scope of the transclude directives or view section directive - * @param {String} transcludeType name, documentation, or value - */ - private _reopenUnsaved = (): VePromise => { - return new this.$q((resolve, reject) => { - const key = this.elementSvc.getEditElementKey(this.element); - const editOb = this.editSvc.get(key); - if (!editOb || this.commitId !== 'latest') { - resolve(false); - } else { - this.editorSvc.hasEdits(editOb, this.cfField).then(resolve, reject); - } - }); - }; - - /** - * @name Transclusion#startEdit * called by transcludes to add the editor frame - * uses these in the scope: - * element - element object for the element to edit (for sections it's the instance spec) - * isEditing - boolean - * commitId - calculated commit id - * isEnumeration - boolean - * recompileScope - child scope of directive scope - * skipBroadcast - boolean (whether to broadcast presentationElem.edit for keeping track of open edits) - * sets these in the scope: - * edit - editable element object - * isEditing - true - * inPreviewMode - false - * editValues - array of editable values (for element that are of type Property, Slot, Port, Constraint) - * - */ - protected startEdit(cb?: () => void): void { - if (this.editable() && !this.isEditing) { - this.editorSvc - .openEdit(this.element) - .then( - (data) => { - this.isEditing = true; - if (this.inPreviewMode) { - this.editorSvc.clearAutosave(this.editKey, this.cfField); - this.inPreviewMode = false; - } - this.edit = data; - this.editKey = data.key; - - if (cb) { - cb(); - } - if (this.editTemplate) { - this.$element.empty(); - this.$transcludeEl = $(this.editTemplate); - - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)(this.$scope.$new()); - } - - if (!this.skipBroadcast) { - // Broadcast message for the toolCtrl: - this.eventSvc.$broadcast('editor.open', this.edit); - } else { - this.skipBroadcast = false; - } - this.editorSvc.scrollToElement(this.$element); - }, - (reason: VePromiseReason>) => { - this.growl.error(reason.message); - } - ) - .finally(() => { - this.editLoading = false; - }); - - this.elementSvc.isCacheOutdated(this.element).then( - (data) => { - if (data.status && data.server._modified > data.cache._modified) { - this.growl.warning('This element has been updated on the server'); - } - }, - (reason) => { - this.growl.error(reason.message); - } - ); - } - } - - protected saveAction(continueEdit?: boolean): void { - if (this.elementSaving) { - this.growl.info('Please Wait...'); - return; - } - // this.editSvc.clearAutosave(ctrl.element._projectId + ctrl.element._refId + ctrl.element.id, ctrl.edit.type) - if (this.bbApi) { - if (!continueEdit) { - this.bbApi.toggleButtonSpinner('editor-save'); - } else { - this.bbApi.toggleButtonSpinner('editor-save-continue'); - } - } - - this.elementSaving = true; - - this.editorSvc - .save(this.editKey, continueEdit) - .then( - (data) => { - this.inPreviewMode = false; - this.element = data; - // do not call here since it's called by element.updated event listener - //this.cleanUpAction(continueEdit) - - //scrollToElement(domElement); - }, - (reason) => { - this.editorSvc.handleError(reason); - } - ) - .finally(() => { - this.elementSaving = false; - if (this.bbApi) { - if (!continueEdit) { - this.bbApi.toggleButtonSpinner('editor-save'); - } else { - this.bbApi.toggleButtonSpinner('editor-save-continue'); - } - } - }); - } - - protected cancelAction(): void { - if (this.elementSaving) { - this.growl.info('Please Wait...'); - return; - } - - if (this.bbApi) { - this.bbApi.toggleButtonSpinner('editor-cancel'); - } - // const cancelFn: () => VePromise = (): VePromise => { - // if (ctrl.editorApi && ctrl.editorApi.cancel) { - // return ctrl.editorApi.cancel() - // } - // return this.$q.resolve(true) - // } - - this.editorSvc - .updateEditor(this.edit.key, this.cfField) - .then( - (success) => { - // Only need to confirm the cancellation if edits have been made: - if (!success) { - this.editorSvc.handleError({ - message: 'Problem Saving from Editor', - type: 'warning', - }); - } - this.editorSvc.hasEdits(this.edit, this.cfField).then( - (hasEdits) => { - if (hasEdits) { - this.editorSvc.deleteEditModal(this.edit).result.then( - (result) => { - if (result) { - this.cleanUpAction(); - } - }, - () => { - //Do Nothing if user wants to keep working - } - ); - } else { - this.cleanUpAction(); - } - }, - () => { - this.cleanUpAction(); - } - ); - }, - () => { - this.editorSvc.handleError({ - message: 'Error Saving from Editor; Please Retry', - type: 'error', - }); - } - ) - .finally(() => { - if (this.bbApi) { - this.bbApi.toggleButtonSpinner('editor-cancel'); - } - }); - } - - public previewAction(): void { - if (this.elementSaving) { - this.growl.info('Please Wait...'); - return; - } - if (this.edit && this.isEditing) { - this.editorSvc - .hasEdits(this.edit) - .then((hasEdits) => { - if (hasEdits && !this.inPreviewMode) { - this.skipBroadcast = true; //preview next click to go into edit mode from broadcasting - this.inPreviewMode = true; - this.recompile(true); - } else { - //nothing has changed, cancel instead of preview - this.growl.info('No edits found! Preview cancelled'); - this.cleanUpAction(); - } - }) - .finally(() => { - this.isEditing = false; - this.editorSvc.scrollToElement(this.$element); - }); - } - } - - public cleanUpAction = (continueEdit?: boolean): void => { - this.editorSvc.cleanUpEdit(this.editKey); - this.isEditing = false; - if (!continueEdit) { - this.eventSvc.$broadcast('editor.close', this.edit); - this.recompile(); - } else { - this.startEdit(); - } - // scrollToElement(domElement); - }; - - //Transclusion API - - protected hasHtml = (s: string): boolean => { - return this.componentSvc.hasHtml(s); - }; - - protected cleanupVal(obj: { value: string | number }): void { - obj.value = parseInt(obj.value as string); - } - - protected addHtml(e: JQueryEventObject, value: { value: string | number }): void { - e.stopPropagation(); - value.value = `

    ${value.value}

    `; - } -} diff --git a/src/ve-components/trees/components/index.ts b/src/ve-components/trees/components/index.ts deleted file mode 100644 index 60e4d42b8..000000000 --- a/src/ve-components/trees/components/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import './tree-of-contents.component'; -import './tree-of-equations.component'; -import './tree-of-figures.component'; -import './tree-of-tables.component'; -import './tree-of-documents.component'; -import './tree-of-favorites.component'; diff --git a/src/ve-components/trees/components/tree-of-contents.component.ts b/src/ve-components/trees/components/tree-of-contents.component.ts deleted file mode 100644 index 41825415d..000000000 --- a/src/ve-components/trees/components/tree-of-contents.component.ts +++ /dev/null @@ -1,75 +0,0 @@ -import angular from 'angular'; - -import { TreeService, TreeController } from '@ve-components/trees'; -import { RootScopeService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; - -export class TreeOfContentsController extends TreeController { - constructor( - $q: VeQService, - $scope: angular.IScope, - $timeout: angular.ITimeoutService, - $filter: angular.IFilterService, - growl: angular.growl.IGrowlService, - utilsSvc: UtilsService, - treeSvc: TreeService, - rootScopeSvc: RootScopeService, - eventSvc: EventService - ) { - super($q, $scope, $timeout, $filter, growl, utilsSvc, treeSvc, rootScopeSvc, eventSvc); - - this.types = ['view', 'section']; - this.id = 'tree-of-contents'; - } - - protected setPeVisibility = (): void => { - this.types.length = 0; - if (this.showPe) { - this.types.push('all'); - } else { - this.types = ['view', 'section']; - } - }; -} - -const TreeOfContentsComponent: VeComponentOptions = { - selector: 'treeOfContents', - transclude: true, - template: ` -
    -

    {{$ctrl.title}}

    -
    -
    - -
    - - -`, - bindings: { - toolbarId: '@', - buttonId: '@', - showPe: '<', - }, - controller: TreeOfContentsController, -}; - -veComponents.component(TreeOfContentsComponent.selector, TreeOfContentsComponent); diff --git a/src/ve-components/trees/components/tree-of-documents.component.ts b/src/ve-components/trees/components/tree-of-documents.component.ts deleted file mode 100644 index 435cdb9a9..000000000 --- a/src/ve-components/trees/components/tree-of-documents.component.ts +++ /dev/null @@ -1,108 +0,0 @@ -import { TreeService, TreeController } from '@ve-components/trees'; -import { ApplicationService, RootScopeService, UserSettingsObject, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { TreeBranch } from '@ve-types/tree'; - -class TreeOfDocumentsController extends TreeController { - static $inject = [...TreeController.$inject, 'ApplicationService']; - constructor( - $q: VeQService, - $scope: angular.IScope, - $timeout: angular.ITimeoutService, - $filter: angular.IFilterService, - growl: angular.growl.IGrowlService, - utilsSvc: UtilsService, - treeSvc: TreeService, - rootScopeSvc: RootScopeService, - eventSvc: EventService, - private applicationSvc: ApplicationService - ) { - super($q, $scope, $timeout, $filter, growl, utilsSvc, treeSvc, rootScopeSvc, eventSvc); - this.id = 'tree-of-documents'; - this.types = ['group']; - } - - protected preConfig = (): void => { - this.types = ['group']; - if (this.treeSvc.treeApi.refType === 'Branch') { - this.types.push('view'); - } else { - this.types.push('snapshot'); - } - }; - - toggleFavorite($event: JQuery.ClickEvent, branch: TreeBranch): void { - $event.stopPropagation(); - let promise: VePromise; - if (!branch.favorite) { - promise = this.applicationSvc.addPins( - this.applicationSvc.getState().user, - this.treeSvc.treeApi.projectId, - this.treeSvc.treeApi.refId, - [branch.data.id] - ); - } else { - promise = this.applicationSvc.removePins( - this.applicationSvc.getState().user, - this.treeSvc.treeApi.projectId, - this.treeSvc.treeApi.refId, - [branch.data.id] - ); - } - - promise.then( - () => { - branch.favorite = !branch.favorite; - this.eventSvc.$broadcast(TreeService.events.RELOAD, 'table-of-favorites'); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - } -} - -const TreeOfDocumentsComponent: VeComponentOptions = { - selector: 'treeOfDocuments', - transclude: true, - template: ` -
    -

    {{$ctrl.title}}

    -
    -
    - -
    - - -`, - bindings: { - toolbarId: '@', - buttonId: '@', - }, - controller: TreeOfDocumentsController, -}; - -veComponents.component(TreeOfDocumentsComponent.selector, TreeOfDocumentsComponent); diff --git a/src/ve-components/trees/components/tree-of-equations.component.ts b/src/ve-components/trees/components/tree-of-equations.component.ts deleted file mode 100644 index ff952cad4..000000000 --- a/src/ve-components/trees/components/tree-of-equations.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import _ from 'lodash'; - -import { TreeService, TreeController, TreeOfAnyComponent } from '@ve-components/trees'; -import { RootScopeService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veComponents } from '@ve-components'; - -import { VeQService } from '@ve-types/angular'; - -class TreeOfEquationsController extends TreeController { - constructor( - $q: VeQService, - $scope: angular.IScope, - $timeout: angular.ITimeoutService, - $filter: angular.IFilterService, - growl: angular.growl.IGrowlService, - utilsSvc: UtilsService, - treeSvc: TreeService, - rootScopeSvc: RootScopeService, - eventSvc: EventService - ) { - super($q, $scope, $timeout, $filter, growl, utilsSvc, treeSvc, rootScopeSvc, eventSvc); - this.id = 'table-of-equations'; - this.types = ['equation']; - this.title = 'Table of Equations'; - } -} - -const TreeOfEquationsComponent = _.cloneDeep(TreeOfAnyComponent); -TreeOfEquationsComponent.selector = 'treeOfEquations'; -TreeOfEquationsComponent.controller = TreeOfEquationsController; - -veComponents.component(TreeOfEquationsComponent.selector, TreeOfEquationsComponent); diff --git a/src/ve-components/trees/components/tree-of-favorites.component.ts b/src/ve-components/trees/components/tree-of-favorites.component.ts deleted file mode 100644 index c2286cd73..000000000 --- a/src/ve-components/trees/components/tree-of-favorites.component.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { TreeService, TreeController } from '@ve-components/trees'; -import { ApplicationService, RootScopeService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; - -class TreeOfFavoritesController extends TreeController { - public icons = { - iconExpand: 'fa-solid fa-caret-down fa-lg fa-fw', - iconCollapse: 'fa-solid fa-caret-right fa-lg fa-fw', - iconDefault: 'fa-solid fa-star fa-fw', - }; - - static $inject = [...TreeController.$inject, 'ApplicationService']; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $timeout: angular.ITimeoutService, - $filter: angular.IFilterService, - growl: angular.growl.IGrowlService, - utilsSvc: UtilsService, - treeSvc: TreeService, - rootScopeSvc: RootScopeService, - eventSvc: EventService, - private applicationSvc: ApplicationService - ) { - super($q, $scope, $timeout, $filter, growl, utilsSvc, treeSvc, rootScopeSvc, eventSvc); - this.id = 'table-of-favorites'; - this.types = ['favorite']; - this.title = 'Table of Favorites'; - } -} - -const TreeOfFavoritesComponent: VeComponentOptions = { - selector: 'treeOfFavorites', - transclude: true, - template: ` -
    - -
    - - -`, - bindings: { - toolbarId: '@', - buttonId: '@', - showPe: '<', - }, - controller: TreeOfFavoritesController, -}; - -veComponents.component(TreeOfFavoritesComponent.selector, TreeOfFavoritesComponent); diff --git a/src/ve-components/trees/components/tree-of-figures.component.ts b/src/ve-components/trees/components/tree-of-figures.component.ts deleted file mode 100644 index 62dfae2f2..000000000 --- a/src/ve-components/trees/components/tree-of-figures.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import _ from 'lodash'; - -import { TreeService, TreeController, TreeOfAnyComponent } from '@ve-components/trees'; -import { RootScopeService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veComponents } from '@ve-components'; - -import { VeQService } from '@ve-types/angular'; - -class TreeOfFiguresController extends TreeController { - constructor( - $q: VeQService, - $scope: angular.IScope, - $timeout: angular.ITimeoutService, - $filter: angular.IFilterService, - growl: angular.growl.IGrowlService, - utilsSvc: UtilsService, - treeSvc: TreeService, - rootScopeSvc: RootScopeService, - eventSvc: EventService - ) { - super($q, $scope, $timeout, $filter, growl, utilsSvc, treeSvc, rootScopeSvc, eventSvc); - this.id = 'table-of-figures'; - this.types = ['figure']; - this.title = 'Table of Figures'; - } -} - -const TreeOfFiguresComponent = _.cloneDeep(TreeOfAnyComponent); -TreeOfFiguresComponent.selector = 'treeOfFigures'; -TreeOfFiguresComponent.controller = TreeOfFiguresController; - -veComponents.component(TreeOfFiguresComponent.selector, TreeOfFiguresComponent); diff --git a/src/ve-components/trees/components/tree-of-tables.component.ts b/src/ve-components/trees/components/tree-of-tables.component.ts deleted file mode 100644 index 9c6882df8..000000000 --- a/src/ve-components/trees/components/tree-of-tables.component.ts +++ /dev/null @@ -1,34 +0,0 @@ -import _ from 'lodash'; - -import { TreeService, TreeController, TreeOfAnyComponent } from '@ve-components/trees'; -import { RootScopeService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veComponents } from '@ve-components'; - -import { VeQService } from '@ve-types/angular'; - -class TreeOfTablesController extends TreeController { - constructor( - $q: VeQService, - $scope: angular.IScope, - $timeout: angular.ITimeoutService, - $filter: angular.IFilterService, - growl: angular.growl.IGrowlService, - utilsSvc: UtilsService, - treeSvc: TreeService, - rootScopeSvc: RootScopeService, - eventSvc: EventService - ) { - super($q, $scope, $timeout, $filter, growl, utilsSvc, treeSvc, rootScopeSvc, eventSvc); - this.id = 'table-of-tables'; - this.types = ['table']; - this.title = 'Table of Tables'; - } -} - -const TreeOfTablesComponent = _.cloneDeep(TreeOfAnyComponent); -TreeOfTablesComponent.selector = 'treeOfTables'; -TreeOfTablesComponent.controller = TreeOfTablesController; - -veComponents.component(TreeOfTablesComponent.selector, TreeOfTablesComponent); diff --git a/src/ve-components/trees/index.ts b/src/ve-components/trees/index.ts deleted file mode 100644 index 7d143f562..000000000 --- a/src/ve-components/trees/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -import './services/Tree.service'; - -export * from './services/Tree.service'; - -export * from './tree.controller'; -//Components -import './mms-trees.component'; -import './components'; diff --git a/src/ve-components/trees/mms-trees.component.ts b/src/ve-components/trees/mms-trees.component.ts deleted file mode 100644 index ed4d6314b..000000000 --- a/src/ve-components/trees/mms-trees.component.ts +++ /dev/null @@ -1,563 +0,0 @@ -import angular, { IComponentController } from 'angular'; -import _ from 'lodash'; -import Rx from 'rx-lite'; - -import { veAppEvents } from '@ve-app/events'; -import { InsertViewData } from '@ve-components/insertions/components/insert-view.component'; -import { ExtensionService } from '@ve-components/services'; -import { TreeService } from '@ve-components/trees/services/Tree.service'; -import { ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { veCoreEvents } from '@ve-core/events'; -import { IToolBarButton, ToolbarService } from '@ve-core/toolbar'; -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ApiService, PermissionsService, ViewService } from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { InsertResolveFn } from '@ve-types/components'; -import { ElementObject, InstanceSpecObject, ViewObject } from '@ve-types/mms'; -import { TreeBranch } from '@ve-types/tree'; -import { VeModalService, VeModalSettings } from '@ve-types/view-editor'; - -/** - * @ngdoc directive - * @name veComponents.component:mmsSpec - * - * @requires veUtils/Utils - * @required veUtils/URLService - * @requires veUtils/AuthService - * @requires veUtils/ElementService - * @requires veUtils/ViewService - * @requires veUtils/PermissionsService - * @requires $compile - * @requires $templateCache - * @requires growl - * @requires _ - * - * * Outputs a "spec window" of the element whose id is specified. Spec includes name, - * documentation, and value if the element is a property. Also last modified time, - * last user, element id. Editability is determined by a param and also element - * editability. Documentation and string values can have html and can transclude other - * element properties. Conflict can occur during save based on last server read time - * and offers choice of force save, discard edit or simple merge. To control saving - * or editor pass in an api object that will be populated with methods (see methods seciton): - * - * ## Example spec with full edit (given permission) - * ### controller (js) - *
    - angular.module('app', ['veComponents'])
    - .controller('SpecCtrl', ['$scope', function($scope) {
    - $this.api = {}; //empty object to be populated by the spec api
    - public edit = () => {
    -            $this.api.setEditing(true);
    -        };
    - public save = () => {
    -            $this.api.save()
    -            .then((e) => {
    -                //success
    -            }, (reason) => {
    -                //failed
    -            });
    -        };
    - }]);
    - 
    - * ### template (html) - *
    - 
    - - - -
    -
    - * ## Example for showing an element spec at a certain time - *
    - 
    - 
    - * ## Example for showing a current element with nothing editable - *
    - 
    - 
    - * - * @param {string} mmsElementId The id of the view - * @param {string} mmsProjectId The project id for the view - * @param {string=master} mmsRefId Reference to use, defaults to master - * @param {string=latest} mmsCommitId Commit ID, default is latest - * @param {Object=} mmsElement An element object, if this is provided, a read only - * element spec for it would be shown, this will not use mms services to get the element - */ - -class TreesController implements IComponentController { - //Bindings - toolbarId: string = 'toolbar'; - buttonId: string; - - //Local - documentId: string; - viewId: string; - projectId: string; - refId: string; - commitId: string; - - subs: Rx.IDisposable[]; - - currentTree: string; - currentTitle: string; - show: { - [key: string]: { tree: boolean; pe: boolean }; - } = {}; - - protected errorType: string; - - private insertData: InsertViewData; - - public filterInputPlaceholder: string; - public treeSearch: string; - private spin: boolean = true; - - protected $trees: JQuery; - - bbApi: ButtonBarApi; - - static $inject = [ - '$compile', - '$scope', - '$element', - '$uibModal', - '$q', - '$timeout', - 'hotkeys', - 'growl', - 'ApiService', - 'ViewService', - 'PermissionsService', - 'RootScopeService', - 'EventService', - 'ToolbarService', - 'TreeService', - 'ExtensionService', - 'ButtonBarService', - ]; - - constructor( - private $compile: angular.ICompileService, - private $scope: angular.IScope, - private $element: JQuery, - private $uibModal: VeModalService, - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private hotkeys: angular.hotkeys.HotkeysProvider, - private growl: angular.growl.IGrowlService, - private apiSvc: ApiService, - private viewSvc: ViewService, - private permissionsSvc: PermissionsService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService, - private toolbarSvc: ToolbarService, - private treeSvc: TreeService, - private extensionSvc: ExtensionService, - protected buttonBarSvc: ButtonBarService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - this.buttonId = this.buttonId ? this.buttonId : 'tree-button-bar'; - this.toolbarId = this.toolbarId ? this.toolbarId : 'toolbar'; - - // Initialize button-bar event listeners - this.subs.push( - this.eventSvc.$on(this.buttonId, (data) => { - if (!this.bbApi) { - switch (data.clicked) { - case 'tree-expand': { - this.treeSvc.expandAll().then( - () => { - this.eventSvc.$broadcast(TreeService.events.RELOAD, this.currentTree); - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - break; - } - case 'tree-collapse': { - this.treeSvc.collapseAll().then( - () => { - this.eventSvc.$broadcast(TreeService.events.RELOAD, this.currentTree); - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - break; - } - case 'tree-add-document': { - this.insert('Document').catch((reason) => { - this.growl.error(reason.message); - }); - break; - } - case 'tree-add-view': { - this.insert('View').catch((reason) => { - this.growl.error(reason.message); - }); - break; - } - - case 'tree-add-group': { - this.insert('Group').catch((reason) => { - this.growl.error(reason.message); - }); - break; - } - case 'tree-show-pe': { - this.show[_.camelCase(this.currentTree)].pe = !this.show[_.camelCase(this.currentTree)].pe; - break; - } - } - } - data.$event.stopPropagation(); - }) - ); - } - - $onDestroy(): void { - this.eventSvc.$destroy(this.subs); - } - - $postLink(): void { - this.$trees = $('#trees'); - - //Listen for Toolbar Clicked Subject - this.subs.push(this.eventSvc.binding(this.toolbarId, this.changeTree)); - } - - insert(itemType: string): VePromise { - const deferred = this.$q.defer(); - this.insertData = { - insertType: 'view', - type: itemType, - newViewAggr: 'shared', - parentBranch: null, - seenViewIds: this.treeSvc.seenViewIds, - }; - const branch = this.treeSvc.getSelectedBranch(); - if (itemType === 'Document') { - this.addDocument(branch).then( - (result) => { - this.insertModal(result); - deferred.resolve(); - }, - (reason: VePromiseReason) => { - deferred.reject(reason); - } - ); - } else if (itemType === 'Group') { - this.addGroup(branch).then( - (result) => { - this.insertModal(result); - deferred.resolve(); - }, - (reason: VePromiseReason) => { - deferred.reject(reason); - } - ); - } else if (itemType === 'View') { - this.addView(branch).then( - (result) => { - this.insertModal(result); - deferred.resolve(); - }, - (reason: VePromiseReason) => { - deferred.reject(reason); - } - ); - } else { - deferred.reject('Add Item of Type ' + itemType + ' is not supported'); - } - return deferred.promise; - } - - insertModal = (branchType: string): void => { - const settings: VeModalSettings> = { - component: 'insertElementModal', - resolve: { - getInsertData: () => { - return this.insertData; - }, - getProjectId: () => { - return this.treeSvc.treeApi.projectId; - }, - getRefId: () => { - return this.treeSvc.treeApi.refId; - }, - getOrgId: () => { - return this.treeSvc.treeApi.orgId; - }, - }, - }; - const instance = this.$uibModal.open, ElementObject>(settings); - instance.result.then( - (result) => { - if (!this.rootScopeSvc.veEditMode()) { - this.eventSvc.$broadcast('show-edits', true); - } - const newbranch: TreeBranch = { - label: result.name, - type: branchType, - data: result, - children: [], - aggr: '', - }; - const top = this.insertData.type === 'Group'; - const addToFullDocView = (node: TreeBranch, curSection: string, prevSysml: string): string => { - let lastChild = prevSysml; - if (node.children) { - let num = 1; - for (let i = 0; i < node.children.length; i++) { - const cNode = node.children[i]; - const data: veAppEvents.viewAddedData = { - vId: cNode.data.id, - curSec: `${curSection}.${num}`, - prevSibId: lastChild, - }; - this.eventSvc.$broadcast('view.added', data); - lastChild = addToFullDocView(cNode, `${curSection}.${num}`, cNode.data.id); - num = num + 1; - } - } - return lastChild; - }; - this.treeSvc.addBranch(this.insertData.parentBranch, newbranch, top).then( - () => { - if (this.insertData.type === 'View') { - this.treeSvc.viewId2node[result.id] = newbranch; - this.treeSvc.seenViewIds[result.id] = newbranch; - newbranch.aggr = this.insertData.newViewAggr; - const curNum = - this.insertData.parentBranch.children[this.insertData.parentBranch.children.length - 1] - .data._veNumber; - this.treeSvc - .getPrevBranch(newbranch, ['view']) - .then( - (prevBranch) => { - this.viewSvc - .handleChildViews( - result, - this.insertData.newViewAggr, - undefined, - this.treeSvc.treeApi.projectId, - this.treeSvc.treeApi.refId, - this.treeSvc.viewId2node, - this.treeSvc.handleSingleView, - this.treeSvc.handleChildren - ) - .then( - (node) => { - // handle full doc mode - if (this.rootScopeSvc.veFullDocMode()) { - addToFullDocView(node as TreeBranch, curNum, newbranch.data.id); - } - this.addViewSectionsRecursivelyForNode(node as TreeBranch); - }, - (reason) => { - this.growl.error( - 'Error processing new child views: ' + reason.message - ); - } - ); - if (!this.rootScopeSvc.veFullDocMode()) { - this.eventSvc.$broadcast('view.added', { - vId: result.id, - curSec: curNum, - prevSibId: prevBranch.data.id, - }); - } else { - this.eventSvc.$broadcast('view.added', { - vId: result.id, - curSec: curNum, - prevSibId: prevBranch.data.id, - }); - } - }, - (reason) => { - if (reason.status === 200) { - this.eventSvc.$broadcast('view.added', { - vId: result.id, - curSec: curNum, - prevSibId: this.insertData.parentBranch.data.id, - }); - } else { - this.growl.error('Error adding item to tree: ' + reason.message); - } - } - ) - .finally(() => { - this.eventSvc.$broadcast(TreeService.events.RELOAD, this.currentTree); - }); - } else { - this.eventSvc.$broadcast(TreeService.events.RELOAD, this.currentTree); - } - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - }, - (reason) => { - if (reason && reason.status !== 444) { - this.growl.warning(`Error adding View: ${reason.message}`); - } else { - this.growl.info('View Insert Cancelled', { - ttl: 1000, - }); - } - } - ); - }; - - addDocument(branch: TreeBranch): VePromise { - if (!branch) { - this.insertData.parentBranch = null; - branch = null; - } else if (branch.type !== 'group') { - return this.$q.reject({ - message: 'Select a group to add document under', - }); - } else { - this.insertData.parentBranch = branch; - } - return this.$q.resolve('view'); - } - - addGroup(branch: TreeBranch): VePromise { - if (branch && branch.type === 'group') { - this.insertData.parentBranch = branch; - } else if (branch && branch.type !== 'group') { - return this.$q.reject({ - message: 'Select a group to add group under', - }); - } else { - this.insertData.parentBranch = null; - // Always create group at root level if the selected branch is not a group branch - branch = null; - } - return this.$q.resolve('group'); - } - - addView(branch: TreeBranch): VePromise { - if (!branch) { - return this.$q.reject({ - message: 'Add View Error: Select parent view first', - }); - } else if (branch.type === 'section') { - return this.$q.reject({ - message: 'Add View Error: Cannot add a child view to a section', - }); - } else if (branch.aggr === 'none') { - return this.$q.reject({ - message: 'Add View Error: Cannot add a child view to a non-owned and non-shared view.', - }); - } - this.insertData.parentBranch = branch; - return this.$q.resolve('view'); - } - - addViewSections = (view: ViewObject): void => { - const node = this.treeSvc.viewId2node[view.id]; - this.treeSvc.addSectionElements(view, node, node).catch((reason) => { - this.growl.error('Error adding view sections:' + reason.message); - }); - }; - - addViewSectionsRecursivelyForNode = (node: TreeBranch): void => { - this.addViewSections(node.data); - for (let i = 0; i < node.children.length; i++) { - if (node.children[i].type === 'view') { - this.addViewSectionsRecursivelyForNode(node.children[i]); - } - } - }; - - userClicksPane = (): void => { - this.treeSvc.selectBranch().catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - }; - - private changeTree = (data: { id: string; category?: string; title?: string }): void => { - if (!this.currentTree) { - this.currentTree = ''; - } - if (this.currentTree !== data.id) { - if (this.currentTree !== '') { - this.show[_.camelCase(this.currentTree)].tree = false; - } - this.currentTree = data.id; - const inspect: IToolBarButton = this.toolbarSvc.getToolbarButton(data.id); - - if (!data.category) { - data.category = inspect.category; - } - - this.currentTitle = data.title ? data.title : inspect.tooltip; - - if (!this.show.hasOwnProperty(_.camelCase(data.id))) { - this.startTree(data.id); - this.show[_.camelCase(data.id)] = { tree: true, pe: false }; - } else { - this.eventSvc.$broadcast(TreeService.events.RELOAD, data.id); - this.show[_.camelCase(data.id)].tree = true; - } - } - }; - - private startTree = (id: string): void => { - const tag = this.extensionSvc.getTagByType('treeOf', id); - const treeId: string = _.camelCase(id); - const newTree: JQuery = $(`
    `); - if (tag === 'extensionError') { - this.errorType = this.currentTree.replace('tree-of-', ''); - newTree.append( - '' - ); - } else { - newTree.append( - `<${tag} show-pe="$ctrl.show.${treeId}.pe" toolbar-id="${this.toolbarId}" button-id="${this.buttonId}"}>` - ); - } - - this.$trees.append(newTree); - - this.$compile(newTree)(this.$scope); - }; -} - -const TreesComponent: VeComponentOptions = { - selector: 'mmsTrees', - template: ` - - -
    - -
    -
    -
    -
    -
    -`, - bindings: { - toolbarId: '@', - buttonId: '@', - }, - controller: TreesController, -}; - -veComponents.component(TreesComponent.selector, TreesComponent); diff --git a/src/ve-components/trees/services/Tree.service.ts b/src/ve-components/trees/services/Tree.service.ts deleted file mode 100644 index 184f8d2d4..000000000 --- a/src/ve-components/trees/services/Tree.service.ts +++ /dev/null @@ -1,1246 +0,0 @@ -import { IQResolveReject } from 'angular'; - -import { ApplicationService, RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { ApiService, ElementService, ProjectService, ViewService } from '@ve-utils/mms-api-client'; - -import { veCore } from '@ve-core'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { - ElementObject, - ElementsRequest, - ExpressionObject, - InstanceValueObject, - ValueObject, - ViewInstanceSpec, - ViewObject, -} from '@ve-types/mms'; -import { TreeApi, TreeBranch, TreeRow } from '@ve-types/tree'; - -export class TreeService { - public selectedBranch: TreeBranch = null; - public branch2viewNumber: { [key: string]: string } = {}; - public defaultIcon: string = 'fa-solid fa-file fa-fw'; - public defaultIcons = { - iconExpand: 'fa-solid fa-caret-down fa-lg fa-fw', - iconCollapse: 'fa-solid fa-caret-right fa-lg fa-fw', - iconDefault: 'fa-solid fa-file fa-fw', - }; - - public defaultSectionTypes = ['group', 'view', 'section']; - - public loading: boolean; - - private inProgress: VePromise = null; - private treeData: TreeBranch[] = []; - - public viewId2node: { [key: string]: TreeBranch } = {}; - public seenViewIds: { [key: string]: TreeBranch } = {}; - - public processedRoot: string = ''; - public processedFocus: string = ''; - - public treeApi: TreeApi; - private rows: { [id: string]: TreeRow[] } = {}; - - treeEditable: boolean; - - static events = { - UPDATED: 'tree.updated', - RELOAD: 'tree.reload', - FILTER: 'tree.filter', - }; - - static MetaTypes = [ - 'tag', - 'connector', - 'dependency', - 'directedrelationship', - 'element', - 'property', - 'generalization', - 'package', - 'section', - 'group', - 'snapshot', - 'view', - 'branch', - 'table', - 'figure', - 'equation', - 'view-composite', - 'view-shared', - 'view-none', - ]; - - static $inject = [ - '$q', - '$timeout', - 'growl', - 'ApiService', - 'ProjectService', - 'ElementService', - 'ViewService', - 'ApplicationService', - 'RootScopeService', - 'EventService', - ]; - - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private apiSvc: ApiService, - private projectSvc: ProjectService, - private elementSvc: ElementService, - private viewSvc: ViewService, - private applicationSvc: ApplicationService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService - ) {} - - public isTreeReady = (): boolean => { - return this.treeData.length > 0; - }; - - public getTreeData = (): TreeBranch[] => { - return this.treeData; - }; - // - // public setTreeApi = (treeOptions: TreeOptions): void => { - // this.treeOptions = treeOptions - // } - - /** - * @name veUtils/TreeService#buildTreeHierarchy - * builds hierarchy of tree branch objects - * - * @param {array} elementObs array of objects - * @param {string} idKey key of id field - * @param {string} type type of object - * @param {string} parentKey key of parent field - * @param {callback} level2_Func function to get child objects - * @returns {void} root node - */ - public buildTreeHierarchy = ( - elementObs: ElementObject[], - idKey: string, - type: string, - parentKey: string, - level2_Func: (elementOb: ElementObject, node: TreeBranch) => VePromise - ): VePromise => { - return new this.$q((resolve, reject) => { - const rootNodes: TreeBranch[] = []; - const data2Node: { [key: string]: TreeBranch } = {}; - // create flat map for each element - elementObs.forEach((elementOb) => { - const elementId: string = elementOb[idKey] as string; - data2Node[elementId] = { - label: elementOb.name, - type: type, - data: elementOb, - children: [], - loading: true, - }; - }); - - // make second pass to associate data to parent nodes - elementObs.forEach((elementOb) => { - const parentId: string = elementOb[parentKey] as string; - const elementId: string = elementOb[idKey] as string; - - // If there's an element in data2Node whose key matches the 'parent' value in the array element - // add the array element to the children array of the matched data2Node element - if (parentId && data2Node[parentId]) { - data2Node[parentId].children.push(data2Node[elementId]); - } else { - // If there's not an element in data2Node whose key matches the 'parent' value in the array element - // it's a "root node" and so it should be pushed to the root nodes array along with its children - - rootNodes.push(data2Node[elementId]); - } - }); - - //apply level2 function if available - if (level2_Func) { - elementObs.forEach((elementOb) => { - const elementId: string = elementOb[idKey] as string; - const level1_parentNode = data2Node[elementId]; - level2_Func(elementOb, level1_parentNode).catch(reject); - }); - } - - const sortFunction = (a: TreeBranch, b: TreeBranch): number => { - if (a.children.length > 1) { - a.children.sort(sortFunction); - } - if (b.children.length > 1) { - b.children.sort(sortFunction); - } - if (a.label.toLowerCase() < b.label.toLowerCase()) { - return -1; - } - if (a.label.toLowerCase() > b.label.toLowerCase()) { - return 1; - } - return 0; - }; - rootNodes.sort(sortFunction); - resolve(rootNodes); - }); - }; - - private getTypeIcon = (type: string): string => { - let t = type; - if (!t) t = 'unknown'; - t = t.toLowerCase(); - switch (t) { - case 'tag': - return 'fa-solid fa-tag'; - case 'connector': - return 'fa-solid fa-expand'; - case 'dependency': - return 'fa-solid fa-long-arrow-right'; - case 'directedrelationship': - return 'fa-solid fa-arrow-right-long'; - case 'element': - return 'fa-solid fa-border-top-left'; - case 'property': - return 'fa-solid fa-circle'; - case 'generalization': - return 'fa-solid fa-arrow-up-long'; - case 'package': - return 'fa-regular fa-folder'; - case 'section': - return 'section-icon'; //"fa-file-o"; - case 'group': - return 'fa-solid fa-folder'; - case 'snapshot': - return 'fa-solid fa-camera'; - case 'view': - return 'fa-solid fa-file'; - case 'view-composite': - return 'fa-solid fa-file'; - case 'view-shared': - return 'fa-regular fa-file'; - case 'view-none': - return 'fa-regular fa-file'; - case 'branch': - return 'fa-solid fa-code-branch'; - case 'table': - return 'fa-solid fa-table'; - case 'figure': - return 'fa-regular fa-image'; - case 'diagram': - return 'fa-solid fa-diagram-project'; - case 'equation': - return 'fa-solid fa-superscript'; - default: - return 'fa-solid fa-file-circle-question'; - } - }; - - static treeError(reason: VePromiseReason): string { - return 'Error refreshing tree: ' + reason.message; - } - - /** - * @name TreeApi#expandAll - * self-explanatory - */ - public expandAll = (): VePromise => { - return this.forEachBranch((b) => { - //scope.expandCallback({ branch: b }); - b.expanded = true; - }, false); - }; - /** - * @name TreeApi#collapseAll - * self-explanatory - */ - public collapseAll = (excludeBranch?: TreeBranch): VePromise => { - return this.forEachBranch( - (b, level) => { - b.expanded = false; - }, - false, - excludeBranch - ); - }; - - /** - * Gets the first branch in the tree - * @returns {TreeBranch} - */ - public getFirstBranch = (): TreeBranch => { - if (this.treeData.length > 0) return this.treeData[0]; - }; - - /** - * Selects the first branch in the tree - */ - public selectFirstBranch = (): VePromise => { - const b = this.getFirstBranch(); - return this.selectBranch(b); - }; - - /** - * @name TreeApi#getSelectedBranch - * self explanatory - * - * @return {Object} current selected branch - */ - public getSelectedBranch = (): TreeBranch => { - return this.selectedBranch; - }; - - public clearSelectedBranch = (): void => { - if (this.selectedBranch) this.selectedBranch.selected = false; - this.selectedBranch = null; - }; - - public getChildren = (b: TreeBranch): TreeBranch[] => { - return b.children; - }; - - public selectParentBranch = (branch: TreeBranch): VePromise => { - return this.$q((resolve, reject) => { - this.getParent(branch).then((p) => { - this.selectBranch(p).then(resolve, reject); - }, reject); - }); - }; - - /** - * @ngdoc function - * @name TreeApi#addBranch - * self explanatory - * - * @param {TreeBranch} parent the intended parent of the new branch - * @param {TreeBranch} new_branch new branch to be added to the tree - * @param {boolean} top boolean determining if this item should be at the top - */ - public addBranch = (parent: TreeBranch, new_branch: TreeBranch, top: boolean): VePromise => { - if (parent) { - if (top) parent.children.unshift(new_branch); - else parent.children.push(new_branch); - parent.expanded = true; - } else { - if (top) this.treeData.unshift(new_branch); - else this.treeData.push(new_branch); - } - return this.$q.resolve(); - }; - - public removeBranch = (branch: TreeBranch): VePromise => { - this._removeBranch(branch, false); - return this._onTreeDataChange(); - }; - - /** - * @name TreeApi#expandBranch - * self explanatory - * - * @param {TreeBranch} branch branch to expand - */ - public expandBranch = (branch: TreeBranch): VePromise => { - if (!branch) branch = this.getSelectedBranch(); - if (branch) { - //scope.expandCallback({ branch: b }); - branch.expanded = true; - } - return this.$q.resolve(); - }; - - /** - * @name TreeApi#closeBranch - * self explanatory - * - * @param {TreeBranch} branch branch to close - */ - public closeBranch = (branch: TreeBranch): VePromise => { - if (!branch) branch = this.getSelectedBranch(); - if (branch) { - //scope.expandCallback({ branch: b }); - branch.expanded = false; - } - return this.$q.resolve(); - }; - - /** - * Gets siblings of specified branch - * @param {TreeBranch} branch - * @returns {TreeBranch[]} - */ - public getSiblings = (branch: TreeBranch): VePromise => { - return this.$q((resolve) => { - this.getParent(branch).then( - (p) => { - resolve(p.children); - }, - () => { - resolve(this.treeData); - } - ); - }); - }; - - /** - * Gets numerically next sibling (if exists) of specified branch - * @param {TreeBranch} branch - * @returns {TreeBranch} - */ - public getNextSibling = (branch: TreeBranch): VePromise => { - return this.$q((resolve, reject) => { - this.getSiblings(branch).then((siblings) => { - if (Array.isArray(siblings)) { - const i = siblings.indexOf(branch); - if (i < siblings.length - 1) resolve(siblings[i + 1]); - else reject(); - } - }, reject); - }); - }; - - /** - * Gets numerically previous sibling (if exists) of specified branch - * @param {TreeBranch} branch - * @returns {TreeBranch} - */ - public getPrevSibling = (branch: TreeBranch): VePromise => { - return this.$q((resolve, reject) => { - this.getSiblings(branch).then((siblings) => { - if (Array.isArray(siblings)) { - const i = siblings.indexOf(branch); - if (i > 0) resolve(siblings[i - 1]); - else reject(); - } - }, reject); - }); - }; - - /** - * Gets the first child of the specified branch (if exists) - * @param {TreeBranch} branch - * @returns {TreeBranch} - */ - public getFirstChild = (branch: TreeBranch): TreeBranch => { - if (!branch) branch = this.selectedBranch; - if (branch && branch.children && branch.children.length > 0) return branch.children[0]; - }; - - /** - * Traverse up/down the tree to find the next closest sibling to the specified branch - * @param {TreeBranch} branch - * @returns {TreeBranch} - */ - public getClosestAncestorNextSibling = (branch: TreeBranch): VePromise => { - return this.$q((resolve, reject) => { - this.getNextSibling(branch).then( - (b) => { - resolve(b); - }, - () => { - this.getParent(branch).then((next) => { - this.getClosestAncestorNextSibling(next).then(resolve, reject); - }, reject); - } - ); - }); - }; - - /** - * Gets the next branch in the tree - * @param {TreeBranch} branch - * @param {string[]} types - If defined will continue on to the next branch if the results' type is not included in - * this list - * @returns {TreeBranch} - */ - public getNextBranch = (branch: TreeBranch, types?: string[]): VePromise => { - return this.$q((resolve, reject) => { - if (!branch) branch = this.selectedBranch; - if (branch) { - const next = this.getFirstChild(branch); - if (next) { - if (types && types.includes(next.type)) resolve(next); - else this.getNextBranch(next, types).then(resolve, reject); - } else { - this.getClosestAncestorNextSibling(branch).then((nextSib) => { - if (types && !types.includes(nextSib.type)) { - this.getNextBranch(nextSib, types).then(resolve, reject); - } else { - resolve(nextSib); - } - }, reject); - } - } else reject({ message: 'No More branches!', status: 200 }); - }); - }; - - /** - * Returns the last descendant branch of the specified branch - * @param {TreeBranch} branch - * @returns {TreeBranch} - */ - public lastDescendant = (branch: TreeBranch): VePromise => { - return new this.$q((resolve, reject) => { - if (branch) { - if (branch.children.length === 0) resolve(branch); - const last = branch.children[branch.children.length - 1]; - return this.lastDescendant(last).then(resolve, reject); - } else { - reject({ message: 'No branch Specified', status: 401 }); - } - }); - }; - - /** - * Get's the branch previous to the branch specified - * @param {TreeBranch} branch - * @param {string[]} types - If defined will continue on to the next previous branch if the results' type is not included in - * this list - * @returns {TreeBranch} - */ - public getPrevBranch = (branch: TreeBranch, types?: string[]): VePromise => { - return new this.$q((resolve, reject) => { - this.getPrevSibling(branch).then( - (prevSibling) => { - this.lastDescendant(prevSibling).then((last) => { - if (types && !types.includes(last.type)) { - this.getPrevBranch(last, types).then(resolve, reject); - } else { - resolve(last); - } - }, reject); - }, - () => { - this.getParent(branch).then(resolve, reject); - } - ); - }); - }; - - /** - * @name TreeApi#refresh - * rerender the tree when data or options change - */ - public refresh = (treeData: TreeBranch[]): VePromise => { - if (this.inProgress == null) { - this.inProgress = this.$q.resolve(); - } - this.treeData.length = 0; - this.treeData.push(...treeData); - return this._onTreeDataChange(); - }; - - /** - * @name TreeApi#getBranch - * Returns the branch with the specified data - */ - public getBranch = (data: ElementObject): VePromise => { - return new this.$q((resolve, reject) => { - this.forEachBranch((b) => { - if (b.data.id === data.id) { - resolve(b); - } - }).catch(reject); - }); - }; - - /** - * Runs the specified callback function on each branch in the tree as specified by treeData - * @param {(branch: TreeBranch, level: number) => void} func - * @param {TreeBranch} excludeBranch - */ - public forEachBranch = ( - func: (branch: TreeBranch, flag?: boolean) => void, - useFlag?: boolean, - excludeBranch?: TreeBranch - ): VePromise => { - return new this.$q((resolve, reject) => { - const flag = false; - const run = (branch: TreeBranch, level: number, flag: boolean): void => { - if (flag && !useFlag) resolve(); - func(branch, flag); - if (branch.children) { - for (let i = 0; i < branch.children.length; i++) { - run(branch.children[i], level + 1, flag); - } - } - }; - const rootLevelBranches = excludeBranch - ? this.treeData.filter((branch) => { - return branch !== excludeBranch; - }) - : this.treeData; - rootLevelBranches.forEach((branch) => { - run(branch, 1, flag); - }); - if (!useFlag) resolve(); - else reject({ message: 'No valid Branches found', status: 401 }); - }); - }; - - private _removeBranch = (branch: TreeBranch, singleBranch: boolean): void => { - this.getParent(branch).then( - (parentBranch) => { - for (let i = 0; i < parentBranch.children.length; i++) { - if (parentBranch.children[i].uid === branch.uid) { - parentBranch.children.splice(i, 1); - if (singleBranch) { - break; - } - } - } - }, - () => { - for (let j = 0; j < this.treeData.length; j++) { - if (this.treeData[j].uid === branch.uid) { - this.treeData.splice(j, 1); - break; - } - } - } - ); - }; - - /** - * Gets branch parent - * @param {TreeBranch} child - * @returns {TreeBranch} - */ - public getParent = (child: TreeBranch): VePromise => { - return new this.$q((resolve, reject) => { - if (child === null) reject({ message: 'No child specified!', status: 404 }); - - if (child.parent_uid) { - this.forEachBranch((b) => { - if (b.uid === child.parent_uid) { - resolve(b); - } - }).catch(reject); - } else { - reject({ message: 'Already at root!', status: 200 }); - } - }); - }; - - public expandPathToSelectedBranch = (): VePromise => { - if (this.selectedBranch) { - return this.expandAllParents(this.selectedBranch); - } - return this.$q.resolve(); - }; - - public forAllAncestors = ( - child: TreeBranch, - fn: (parent: TreeBranch) => VePromise - ): VePromise => { - return new this.$q((resolve, reject) => { - this.getParent(child).then( - (parent) => { - fn(parent).then(() => { - this.forAllAncestors(parent, fn).then(resolve, reject); - }, reject); - }, - () => { - resolve(); - } - ); - }); - }; - - public expandAllParents = (child: TreeBranch): VePromise => { - return this.forAllAncestors(child, (b) => { - if (b.expandable && !b.expanded) { - return this.expandBranch(b); - } - return this.$q.resolve(); - }); - }; - - /** - * Select a branch - * @param branch - * @param noClick - */ - public selectBranch = (branch?: TreeBranch, noClick?): VePromise => { - const deferred = this.$q.defer(); - if (!branch) { - if (this.selectedBranch) this.selectedBranch.selected = false; - this.clearSelectedBranch(); - return this.$q.resolve(); - } - if (branch !== this.selectedBranch) { - if (this.selectedBranch) this.selectedBranch.selected = false; - branch.selected = true; - this.selectedBranch = branch; - } - this.expandAllParents(branch).then( - () => { - if (!noClick) { - if (branch.onSelect != null) { - branch.onSelect(branch); - } else if (this.treeApi.onSelect) { - this.treeApi.onSelect(branch); - } - } - if (branch.data.id) { - this.eventSvc.$broadcast('tree-get-branch-element', { - id: branch.data.id, - }); - } - deferred.resolve(); - }, - (reason) => deferred.reject(reason) - ); - return deferred.promise; - }; - - private _onTreeDataChange = (): VePromise => { - return new this.$q((resolve, reject) => { - if (!Array.isArray(this.treeData)) { - reject({ - message: '[warn] treeData is not an array!', - status: 401, - }); - } - - this.treeData.forEach((branch) => { - this._addBranchData(1, [], branch, true, {}); - }); - - this.eventSvc.resolve(TreeService.events.UPDATED, true); - this.eventSvc.$broadcast('tree.ready'); - resolve(); - }); - }; - - private _addBranchData = ( - level: number, - section: string[], - branch: TreeBranch, - visible: boolean, - peNums: { [type: string]: number } - ): void => { - if (!branch.uid) branch.uid = `${Math.random()}`; - if (typeof branch.expanded === 'undefined') branch.expanded = level <= this.treeApi.expandLevel; - branch.expandable = branch.children && branch.children.length > 0; - branch.favorite = false; - - let number = ''; - if (section) number = section.join('.'); - - // Handle numbering of non-section types - if (!this.defaultSectionTypes.includes(branch.type)) { - if (!peNums[branch.type]) peNums[branch.type] = 0; - peNums[branch.type]++; - if (this.treeApi.numberingDepth === 0 && !this.defaultSectionTypes.includes(branch.type)) { - number = peNums[branch.type].toString(10); - } else if (section.length >= this.treeApi.numberingDepth) { - number = `${section.slice(0, this.treeApi.numberingDepth).join('.')}${this.treeApi.numberingSeparator}${ - peNums[branch.type] - }`; - } else { - const sectionCopy = [...section]; - while (sectionCopy.length < this.treeApi.numberingDepth) { - sectionCopy.push('0'); - } - number = `${sectionCopy.join('.')}${this.treeApi.numberingSeparator}${peNums[branch.type]}`; - } - } - if (branch.data && branch.data.id && this.treeApi.sectionNumbering) { - this.branch2viewNumber[branch.data.id] = number; - branch.data._veNumber = number; - } - if (branch.children) { - let alpha = false; - if (this.treeApi.sort) { - branch.children.sort(this._treeSortFunction); - } - let j = this.treeApi.startChapter; - if (j === null || j === undefined || level != 1) { - j = 1; - } - branch.children.forEach((child) => { - child.parent_uid = branch.uid; - const child_visible = visible && branch.expanded; - if (!this.defaultSectionTypes.includes(child.type)) { - this._addBranchData(level + 1, section, child, child_visible, peNums); - } else { - if (this.treeApi.sectionNumbering) { - if (child.data._isAppendix) { - alpha = true; - j = 0; - } - const nextSection = [...section, alpha ? String.fromCharCode(j + 65) : j.toString(10)]; - if (nextSection.length <= this.treeApi.numberingDepth) { - peNums = {}; - } - this._addBranchData(level + 1, nextSection, child, child_visible, peNums); - } else { - this._addBranchData(level + 1, [], child, child_visible, peNums); - } - j++; - } - }); - - if (this.treeApi.sort) { - this.treeData.sort(this._treeSortFunction); - } - - if (!this.treeApi.expandLevel && this.treeApi.expandLevel !== 0) this.treeApi.expandLevel = 1; - } - branch.loading = false; - this.eventSvc.resolve(TreeService.events.UPDATED, false); - }; - - public updateRows = (id: string, types: string[], treeRows: TreeRow[]): VePromise => { - treeRows.length = 0; - return new this.$q((resolve, reject) => { - const addBranchToList = (level: number, branch: TreeBranch, visible: boolean): void => { - let typeIcon = this.defaultIcon; - let visibleChild = false; - let aggr = branch.aggr; - if (!aggr) aggr = ''; - else aggr = '-' + aggr.toLowerCase(); - - for (let i = 0; i < branch.children.length; i++) { - if (types.includes('all') || types.includes(branch.children[i].type)) { - visibleChild = true; - break; - } - } - if (this.getTypeIcon(branch.type.toLowerCase() + aggr)) { - typeIcon = this.getTypeIcon(branch.type.toLowerCase() + aggr); - } else if (this.getTypeIcon('default')) { - typeIcon = this.getTypeIcon('default'); - } - let number = ''; - if (this.treeApi.sectionNumbering) { - if (branch.data && branch.data._veNumber) { - number = branch.data._veNumber; - } - } - - if ( - types.includes('all') || - types.includes(branch.type) || - (types.includes('favorite') && branch.favorite) - ) { - const treeRow = { - level, - section: number && !number.includes('undefined') && !number.includes('NaN') ? number : '', - branch, - label: branch.label, - visibleChild, - visible, - typeIcon, - children: branch.children, - }; - treeRows.push(treeRow); - } - - //Work on children - if (branch.children) { - branch.children.forEach((child) => { - const child_visible = visible && branch.expanded; - addBranchToList(level + 1, child, child_visible); - }); - //This branch is done, stop loading - } - }; - if (types && types.length > 0) { - this.branch2viewNumber = {}; - this.treeData.forEach((branch) => { - addBranchToList(1, branch, true); - }); - } else { - reject({ - status: 500, - message: 'Tree component has no types', - }); - } - this.rows[id] = treeRows; - resolve(treeRows); - }); - }; - - // TODO: Update sort function to handle all cases - private _treeSortFunction = (a: TreeBranch, b: TreeBranch): number => { - a.priority = 100; - if (a.type === 'tag') { - a.priority = 0; - } else if (a.type === 'group') { - a.priority = 1; - } else if (a.type === 'view') { - a.priority = 2; - } - b.priority = 100; - if (b.type === 'tag') { - b.priority = 0; - } else if (b.type === 'group') { - b.priority = 1; - } else if (b.type === 'view') { - b.priority = 2; - } - - if (a.priority < b.priority) return -1; - if (a.priority > b.priority) return 1; - if (!a.label) { - a.label = ''; - } - if (!b.label) { - b.label = ''; - } - if (a.label.toLowerCase() < b.label.toLowerCase()) return -1; - if (a.label.toLowerCase() > b.label.toLowerCase()) return 1; - return 0; - }; - - changeRoots = (root?: ElementObject): VePromise => { - this.processedRoot = this.treeApi.rootId; - - const treeData: TreeBranch[] = []; - return new this.$q((resolve, reject) => { - if (!root) { - // if (this.mmsRef.type === 'Branch') { - // treeOptions.sectionTypes.push('view') - // } else { - // treeOptions.sectionTypes.push('snapshot') - // } - this.projectSvc.getGroups(this.treeApi.projectId, this.treeApi.refId).then( - (groups) => { - this.viewSvc - .getProjectDocuments({ - projectId: this.treeApi.projectId, - refId: this.treeApi.refId, - }) - .then( - (documents) => { - this.buildTreeHierarchy( - groups, - 'id', - 'group', - '_parentId', - this.groupLevel2Func - ).then((treeHierarchy) => { - treeData.push(...treeHierarchy); - documents.forEach((document) => { - if (!document._groupId || document._groupId == this.treeApi.projectId) { - treeData.push({ - label: document.name, - type: this.treeApi.refType === 'Branch' ? 'view' : 'snapshot', - data: document, - children: [], - }); - } - }); - this.processedFocus = ''; - if (treeData.length > 0) { - this.treeData.length = 0; - this.treeData.push(...treeData); - } - this.changeElement().then(resolve, reject); - }, reject); - }, - (reason) => { - reason.message = 'Error getting Documents: ' + reason.message; - reject(reason); - } - ); - }, - (reason) => { - reason.message = 'Error getting Groups: ' + reason.message; - reject(reason); - } - ); - } else { - this.seenViewIds = {}; - this.viewId2node = {}; - const reqOb: ElementsRequest = { - elementId: this.treeApi.rootId, - refId: this.treeApi.refId, - projectId: this.treeApi.projectId, - }; - this.elementSvc.getElement(reqOb).then((root) => { - if (this.apiSvc.isView(root)) { - const rootBranch = this.handleSingleView(root, 'composite'); - this.treeData.length = 0; - this.treeData.push(rootBranch); - this._onTreeDataChange().catch(reject); - this.viewSvc - .handleChildViews( - root, - 'composite', - undefined, - this.treeApi.projectId, - this.treeApi.refId, - this.viewId2node, - this.handleSingleView, - this.handleChildren - ) - .then(() => { - const bulkGet: string[] = []; - for (const i in this.viewId2node) { - const view: ViewObject = this.viewId2node[i].data; - if (view._contents && view._contents.operand) { - for (let j = 0; j < view._contents.operand.length; j++) { - bulkGet.push(view._contents.operand[j].instanceId); - } - } - } - this.elementSvc - .getElements( - { - elementId: bulkGet, - projectId: this.treeApi.projectId, - refId: this.treeApi.refId, - }, - 0 - ) - .finally(() => { - for (const i in this.viewId2node) { - this.addSectionElements( - this.viewId2node[i].data, - this.viewId2node[i], - this.viewId2node[i], - true - ).catch(reject); - } - this.processedFocus = ''; - this.changeElement().then(resolve, reject); - }); - }, reject); - } else { - //TODO: Implement Collect Owned Elements Logic - } - }, reject); - } - }); - }; - - changeElement = (): VePromise => { - if (this.treeApi.elementId === this.processedFocus) - return new this.$q((resolve, reject) => { - resolve(); - }); - - this.processedFocus = this.treeApi.elementId; - return new this.$q((resolve, reject) => { - //As of right now the project portal page is 'hidden' so it won't appear in the tree - if (this.treeApi.elementId === this.treeApi.projectId + '_cover') - this._onTreeDataChange().then(resolve, reject); - else { - this.forEachBranch((b): void => { - if (b.data.id === this.treeApi.elementId || this.treeApi.elementId === `site_${b.data.id}_cover`) { - this.selectBranch(b, true).then( - () => { - this._onTreeDataChange().then(resolve, reject); - }, - (reason) => { - reject(reason); - } - ); - } - }).catch((reason) => { - reject({ - message: 'Invalid tree selection:' + reason.message, - status: 401, - }); - }); - } - }); - }; - - groupLevel2Func = (groupOb: ElementObject, groupNode: TreeBranch): VePromise => { - groupNode.loading = true; - return new this.$q((resolve, reject) => { - this.viewSvc - .getProjectDocuments( - { - projectId: this.treeApi.projectId, - refId: this.treeApi.refId, - }, - 2 - ) - .then( - (documentObs: ViewObject[]) => { - const docs: ViewObject[] = []; - let docOb: ViewObject, i; - for (let i = 0; i < documentObs.length; i++) { - docOb = documentObs[i]; - if (docOb._groupId === groupOb.id) { - docs.push(docOb); - } - } - for (let i = 0; i < docs.length; i++) { - docOb = docs[i]; - groupNode.children.unshift({ - label: docOb.name, - type: this.treeApi.refType === 'Branch' ? 'view' : 'snapshot', - data: docOb, - group: groupOb, - children: [], - }); - } - this._onTreeDataChange().catch(reject); - resolve(); - }, - (reason) => { - reason.message = 'Error getting project Documents: ' + reason.message; - reject(reason); - } - ); - }); - }; - - handleSingleView = (v: ViewObject, aggr: string): TreeBranch => { - let curNode = this.viewId2node[v.id]; - if (!curNode) { - curNode = { - label: v.name, - type: 'view', - data: v, - children: [], - loading: true, - aggr: aggr, - }; - this.viewId2node[v.id] = curNode; - } - return curNode; - }; - - public handleChildren = ( - curNode: TreeBranch, - childNodes: TreeBranch[], - reject: IQResolveReject> - ): void => { - const newChildNodes: TreeBranch[] = []; - let node: TreeBranch; - for (let i = 0; i < childNodes.length; i++) { - node = childNodes[i]; - if (this.seenViewIds[node.data.id]) { - this.growl.error('Warning: View ' + node.data.name + ' have multiple parents! Duplicates not shown.'); - continue; - } - this.seenViewIds[node.data.id] = node; - newChildNodes.push(node); - } - curNode.children.push(...newChildNodes); - this._onTreeDataChange().catch(reject); - //this.eventSvc.$broadcast(TreeService.events.RELOAD) - }; - - processDeletedViewBranch = (branch: TreeBranch): void => { - const id = branch.data.id; - if (this.seenViewIds[id]) { - delete this.seenViewIds[id]; - } - if (this.viewId2node[id]) { - delete this.viewId2node[id]; - } - for (let i = 0; i < branch.children.length; i++) { - this.processDeletedViewBranch(branch.children[i]); - } - }; - - addSectionElements = ( - element: ElementObject, - viewNode: TreeBranch, - parentNode: TreeBranch, - initial?: boolean - ): VePromise => { - return new this.$q((resolve, reject) => { - let contents: ValueObject | null = null; - - const addContentsSectionTreeNode = (operand: InstanceValueObject[]): void => { - const bulkGet: string[] = []; - const i = 0; - operand.forEach((operator) => { - bulkGet.push(operator.instanceId); - }); - this.elementSvc - .getElements( - { - elementId: bulkGet, - projectId: this.treeApi.projectId, - refId: this.treeApi.refId, - }, - 0 - ) - .then( - (ignore) => { - const instances: VePromise[] = []; - for (let i = 0; i < operand.length; i++) { - instances.push( - this.elementSvc.getElement( - { - projectId: this.treeApi.projectId, - refId: this.treeApi.refId, - elementId: operand[i].instanceId, - }, - 0 - ) - ); - } - this.$q.allSettled(instances).then((results) => { - let k = results.length - 1; - for (; k >= 0; k--) { - const instance: ViewInstanceSpec = results[k].value; - if (this.viewSvc.isSection(instance)) { - const sectionTreeNode = { - label: instance.name ? instance.name : viewNode.data.id, - type: 'section', - viewId: viewNode.data.id, - data: instance, - children: [], - }; - this.viewId2node[instance.id] = sectionTreeNode; - parentNode.children.unshift(sectionTreeNode); - this.addSectionElements(instance, viewNode, sectionTreeNode, initial).catch( - reject - ); - } else if (this.viewSvc.getTreeType(instance) !== 'none') { - const otherTreeNode: TreeBranch = { - label: instance.name, - type: this.viewSvc.getTreeType(instance), - data: instance, - children: [], - }; - if (otherTreeNode.type !== 'view') { - otherTreeNode.viewId = viewNode.data.id; - } - parentNode.children.unshift(otherTreeNode); - } - this._onTreeDataChange().catch(reject); - } - if (initial) { - this.changeElement().catch(reject); - } - }, reject); - }, - (reason) => { - reason.message = 'Error retrieving contained elements: ' + reason.message; - reject(reason); - } - ); - }; - - if (element._contents) { - contents = (element as ViewObject)._contents; - } else if (this.viewSvc.isSection(element) && element.specification) { - contents = (element as ViewInstanceSpec).specification; // For Sections, the contents expression is the specification - } else { - //bad? - } - if (contents && contents.operand) { - addContentsSectionTreeNode((contents as ExpressionObject).operand); - } - resolve(); - }); - }; -} - -veCore.service('TreeService', TreeService); diff --git a/src/ve-components/trees/tree.controller.ts b/src/ve-components/trees/tree.controller.ts deleted file mode 100644 index fb31f359b..000000000 --- a/src/ve-components/trees/tree.controller.ts +++ /dev/null @@ -1,373 +0,0 @@ -import { TreeService } from '@ve-components/trees'; -import { RootScopeService, UtilsService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { handleChange } from '@ve-utils/utils'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { TreeBranch, TreeIcons, TreeRow } from '@ve-types/tree'; - -/** - * @ngdoc directive - * @name veCore.directive:mmsTree - * - * @requires $timeout - * @requires $templateCache - * - * * Outputs a tree with customizable icons for different types of nodes and callback - * for node branch clicked. Includes api, see methods section. (the name display is - * angular data binded) - * Object for tree model require (can have multiple roots): - *
    - [
    - {
    -            label: 'root node name',
    -            type: 'a type',
    -            data: {name: 'name will be shown', ...},
    -            children: [{...}]
    -        },
    - {
    -            label: 'another root node',
    -            type: 'another type',
    -            data: {name: 'another name', ...},
    -            children: [{...}]
    -        }
    - ]
    - 
    - * Tree options: - *
    - {
    -        types: {
    -            'a type': 'fa-regular fa-file',
    -            'another type': 'fa fa-file'
    -        }
    -    }
    - 
    - * - * ## Example - * ### controller (js) - *
    - angular.module('app', ['ve-core'])
    - .controller('TreeCtrl', ['$scope', function($scope) {
    -        $scope.api = {}; //empty object to be populated by the spec api
    -        $public handler(branch) {
    -            //branch selected
    -        };
    -        this.treeData = [
    -            {
    -                label: 'Root',
    -                type: 'Package',
    -                data: {
    -                    name: 'Root',
    -                    sysmlId: 'id',
    -                    //any other stuff
    -                },
    -                children: [
    -                    {
    -                        label: 'Child',
    -                        type: 'Class',
    -                        data: {
    -                            name: 'Child',
    -                            sysmlId: 'blah',
    -                            //other stuff
    -                        },
    -                        children: []
    -                    }
    -                ]
    -            }
    -        ];
    -        $scope.options = {
    -            types: {
    -                'Package': 'fa fa-folder',
    -                'Class': 'fa fa-bomb'
    -            }
    -        };
    -    }]);
    - 
    - * ### template (html) - *
    - 
    - -
    -
    - * - * @param {Array} treeData Array of root nodes - * @param {Object=} treeControl Empty object to populate with api - * @param {Object=} options Options object to customize icons for types and statuses - */ -export class TreeController implements angular.IComponentController { - //Bindings - toolbarId: string; - buttonId: string; - showPe: boolean; - - public init: boolean = false; - - public treeRows: TreeRow[] = []; - public title; - private selectedBranch: any; - public treeSpin: boolean = true; - - public subs: Rx.IDisposable[]; - private treeFilter: angular.uiTreeFilter.IFilterUiTree; - - //Locals - - public icons: TreeIcons; - types: string[]; - id: string; - filter: string; - - static $inject = [ - '$q', - '$scope', - '$timeout', - '$filter', - 'growl', - 'UtilsService', - 'TreeService', - 'RootScopeService', - 'EventService', - ]; - - constructor( - protected $q: VeQService, - protected $scope: angular.IScope, - protected $timeout: angular.ITimeoutService, - protected $filter: angular.IFilterService, - protected growl: angular.growl.IGrowlService, - protected utilsSvc: UtilsService, - protected treeSvc: TreeService, - protected rootScopeSvc: RootScopeService, - protected eventSvc: EventService - ) { - this.types = ['']; - } - - $onInit(): void { - this.treeFilter = this.$filter('uiTreeFilter'); - - this.eventSvc.$init(this); - this.subs.push( - this.eventSvc.binding(TreeService.events.UPDATED, (data) => { - if (data) { - this.update().catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - } - }), - this.eventSvc.$on(TreeService.events.RELOAD, (data) => { - if ((data && this.id === data) || !data) { - this.treeSpin = true; - this.update().catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - } - }), - this.eventSvc.$on(TreeService.events.FILTER, (data) => { - if (data === '') { - this.treeSvc.collapseAll().then( - () => { - this.treeSvc.expandPathToSelectedBranch().then( - () => { - this.eventSvc.$broadcast(TreeService.events.RELOAD, this.id); - this.filter = data; - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - } else { - // expand all branches so that the filter works correctly - this.treeSvc.expandAll().then( - () => { - this.eventSvc.$broadcast(TreeService.events.RELOAD, this.id); - this.filter = data; - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - } - }) - ); - - if (this.treeSvc.isTreeReady()) { - this.update().catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - } - - // this.subs.push( - // this.eventSvc.$on( - // 'tree-get-branch-element', - // (data: { id: string }) => { - // void this.$timeout( - // () => { - // const el = $('#tree-branch-' + data.id) - // if (!el.isOnScreen() && el.get(0) !== undefined) { - // el.get(0).scrollIntoView() - // } - // }, - // 500, - // false - // ) - // } - // ) - // ) - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - handleChange( - onChangesObj, - 'showPe', - () => { - this.update().catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }); - }, - true - ); - } - - $onDestroy(): void { - this.eventSvc.destroy(this.subs); - } - - update(): VePromise { - this.treeRows = []; - this.setPeVisibility(); - this.preConfig(); - this.selectedBranch = this.treeSvc.getSelectedBranch(); - - this.icons = this.icons ? this.icons : this.treeSvc.defaultIcons; - - this.treeSvc.defaultIcon = this.icons.iconDefault; - return new this.$q((resolve, reject) => { - this.treeSvc.updateRows(this.id, this.types, this.treeRows).then(() => { - this.treeSpin = false; - resolve(); - }, reject); - }); - } - - public expandCallback = (branch: TreeBranch, e: JQuery.ClickEvent): void => { - branch.loading = true; - if (!branch.expanded && this.treeSvc.treeApi.expandCallback) { - this.treeSvc.treeApi.expandCallback(branch.data.id, branch, false); - } - if (e) { - e.stopPropagation(); - } - const promise = branch.expanded ? this.treeSvc.closeBranch(branch) : this.treeSvc.expandBranch(branch); - promise.then( - () => { - this.update() - .catch((reason) => { - this.growl.error(TreeService.treeError(reason)); - }) - .finally(() => { - branch.loading = false; - }); - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ); - }; - - public userClicksBranch = (branch: TreeBranch): void => { - branch.loading = true; - this.treeSvc - .selectBranch(branch, true) - .then( - () => { - if (branch.onSelect) { - branch.onSelect(branch); - } else if (this.treeSvc.treeApi.onSelect) { - this.treeSvc.treeApi.onSelect(branch); - } - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ) - .finally(() => { - branch.loading = false; - }); - }; - - public userDblClicksBranch = (branch: TreeBranch): void => { - branch.loading = true; - this.treeSvc - .selectBranch(branch, true) - .then( - () => { - if (branch.onDblClick) { - branch.onDblClick(branch); - } else if (this.treeSvc.treeApi.onDblClick) { - this.treeSvc.treeApi.onDblClick(branch); - } - }, - (reason) => { - this.growl.error(TreeService.treeError(reason)); - } - ) - .finally(() => { - branch.loading = false; - }); - }; - - protected setPeVisibility = (): void => { - //Implement any custom logic for showing PE's here - }; - - protected preConfig = (): void => { - //Implement any custom logic that should happen before row generation - }; - - // public getHref = (row: TreeRow): string => { - // //var data = row.branch.data; - // /*if (row.branch.type !== 'group' && UtilsService.isDocument(data) && !ApplicationService.getState().fullDoc) { - // var ref = data._refId ? data._refId : 'master'; - // return UtilsService.PROJECT_URL_PREFIX + data._projectId + '/' + ref+ '/documents/' + data.id + '/views/' + data.id; - // }*/ - // return '' - // } -} - -export const TreeOfAnyComponent: VeComponentOptions = { - selector: 'treeOfAny', - transclude: true, - template: ` -
    - -
    - - -`, - bindings: { - toolbarId: '@', - buttonId: '@', - showPe: '<', - }, -}; diff --git a/src/ve-components/ve-components.module.ts b/src/ve-components/ve-components.module.ts deleted file mode 100644 index 944839c74..000000000 --- a/src/ve-components/ve-components.module.ts +++ /dev/null @@ -1,33 +0,0 @@ -import angular from 'angular'; - -/** - * - * @type {angular.IModule} - */ -export const veComponents = angular.module('ve-components', [ - 've-utils', - 've-core', - 'ui.bootstrap', - 'angular-growl', - // 'ngSanitize', -]); - -// veComponents.config(['$sanitizeProvider', function($sanitizeProvider: angular.sanitize.ISanitizeProvider) { -// $sanitizeProvider.addValidElements({ -// htmlElements: ['mms-cf', 'mms-view-link', 'transclude-doc', 'transclude-val', 'transclude-name', 'transclude-view'], -// }) -// .addValidAttrs(['mms-data', 'mms-cf-type', 'mms-element-id', 'mms-project-id', 'mms-ref-id', -// 'mms-commit-id', 'mms-watch-id', 'non-editable', 'mms-generate-for-diff']) -// .enableSvg() -// }]) -veComponents - .filter('veRealNum', () => { - return (n: string | number): string => { - if (Number.isInteger(n)) { - return `${n}.0`; - } - return n as string; - }; - }) - .constant('CKEDITOR', window.CKEDITOR) - .constant('veConfig', window.__env); diff --git a/src/ve-core/button-bar/button-bar.component.ts b/src/ve-core/button-bar/button-bar.component.ts deleted file mode 100644 index 7d9f1d069..000000000 --- a/src/ve-core/button-bar/button-bar.component.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { BarButton, ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { veCoreEvents } from '@ve-core/events'; -import { EventService } from '@ve-utils/core'; - -import { veUtils } from '@ve-utils'; - -import { VeComponentOptions } from '@ve-types/angular'; - -const ButtonBarComponent: VeComponentOptions = { - selector: 'buttonBar', - template: ` -
    - - - - - - - - {{button.text}} - - - - - - - - - -
    - -`, - bindings: { - buttonId: '<', - minSize: '<', - }, - controller: class ButtonBarController implements angular.IComponentController { - // Bindings - private buttonId: string; - private minSize: number = 100; - - private bbApi: ButtonBarApi; - public init: boolean = false; - public buttons: BarButton[]; - public dropdownIcon: { [id: string]: string }; - private squished: boolean = false; - private squishButton: BarButton; - private currentHeight: number; - static $inject = ['$element', 'growl', 'EventService', 'ButtonBarService']; - - constructor( - private $element: JQuery, - private growl: angular.growl.IGrowlService, - private eventSvc: EventService, - private buttonBarSvc: ButtonBarService - ) {} - - $onInit(): void { - this.buttonBarSvc.waitForApi(this.buttonId).then( - (api) => { - this.bbApi = api; - this.buttons = this.bbApi.buttons; - this.configure(); - }, - (reason) => { - this.growl.error(reason.message); - } - ); - } - - configure = (): void => { - //Setup Squish - this.squishButton = this.buttonBarSvc.getButtonBarButton('button-bar-menu'); - this.squishButton.dropdown_buttons = this.buttons; - const observed = this.$element.children().get(0); - const observer = new ResizeObserver((mutations) => - mutations.forEach((mutationRecord) => { - const size = mutationRecord.borderBoxSize; - const oldHeight = this.currentHeight; - this.eventSvc.$broadcast(this.bbApi.WRAP_EVENT, { - oldSize: oldHeight, - newSize: size[0].blockSize, - }); - this.currentHeight = size[0].blockSize; - if (size[0].inlineSize <= this.minSize && !this.squished) { - this.squished = true; - this.buttons = [this.squishButton]; - } else if (size[0].inlineSize > this.minSize && this.squished) { - this.squished = false; - this.buttons = this.squishButton.dropdown_buttons; - } - }) - ); - - observer.observe(observed); - }; - - buttonClicked(e: JQuery.ClickEvent, button: BarButton): void { - if (button.action) { - button.action(e); - } else { - const data: veCoreEvents.buttonClicked = { - $event: e, - clicked: button.id, - }; - //Setup fire button-bar click event - this.eventSvc.$broadcast(this.bbApi.id, data); - } - } - }, -}; - -veUtils.component(ButtonBarComponent.selector, ButtonBarComponent); diff --git a/src/ve-core/button-bar/index.ts b/src/ve-core/button-bar/index.ts deleted file mode 100644 index 9dd47e925..000000000 --- a/src/ve-core/button-bar/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from './services/BarButton.api'; -export * from './services/ButtonBar.api'; - -//Service -import './services/ButtonBar.service'; - -export * from './services/ButtonBar.service'; - -//Components -import './button-bar.component'; diff --git a/src/ve-core/button-bar/services/BarButton.api.ts b/src/ve-core/button-bar/services/BarButton.api.ts deleted file mode 100644 index 34bbf534e..000000000 --- a/src/ve-core/button-bar/services/BarButton.api.ts +++ /dev/null @@ -1,123 +0,0 @@ -export interface IButtonBarButton { - id: string; - icon: string; - tooltip: string; - placement?: string; - button_content?: string; - selectable: boolean; - //Toggle Config - toggle?: - | { - icon?: string; - tooltip?: string; - } - | boolean; - //Dropdown Config - dropdown?: { - icon: string; - toggle_icon: string; - ids: string[]; - }; - api?: string; - enabledFor?: string[]; - disabledFor?: string[]; - type?: string; -} -export interface buttonActionFn { - (event?: JQuery.ClickEvent): void; -} -export class BarButton { - //configs - id: string; - icon: string = 'fa-gears'; - tooltip: string = 'Generic Button'; - dropdown_icon: string = ''; - button_content: string = ''; - placement?: string; - - //State - active: boolean = true; - selected: boolean = false; - permission: boolean = true; - toggled: boolean = false; - dropdown_toggled: boolean = false; - spinner: boolean = false; - locked: boolean = false; - - //Toggle Configuration - - //Set Custom Click actions - action?: buttonActionFn; - - dropdown_buttons: BarButton[] = []; - - //Internal - readonly dropdown_icon_original: string; - readonly tooltip_original: string; - readonly icon_original: string; - - constructor(id: string, readonly config?: IButtonBarButton) { - this.id = id; - if (this.config) { - if (this.config.icon) this.icon = this.icon_original = this.config.icon; - - if (this.config.tooltip) { - this.tooltip = this.tooltip_original = this.config.tooltip; - } - if (this.config.button_content) { - this.button_content = this.config.button_content; - } - if (this.config.dropdown && this.config.dropdown.icon && this.config.dropdown.icon !== '') { - this.dropdown_icon = this.dropdown_icon_original = this.config.dropdown.icon; - } - } - } - - public setAction = (action: buttonActionFn): void => { - this.action = action; - }; - - public toggle = (state?: boolean): void => { - if (this.config.toggle) { - this.toggled = state != null ? state : !this.toggled; - if (this.toggled) { - if ((this.config.toggle as { tooltip: string; icon: string }).tooltip) { - this.tooltip = (this.config.toggle as { tooltip: string; icon: string }).tooltip; - } - if ((this.config.toggle as { tooltip: string; icon: string }).icon) { - this.icon = (this.config.toggle as { tooltip: string; icon: string }).icon; - } - } else { - this.icon = this.icon_original; - if (this.tooltip_original) { - this.tooltip = this.tooltip_original; - } - } - } - if (this.config.dropdown && this.config.dropdown.icon) { - this.dropdown_toggled = state != null ? state : !this.dropdown_toggled; - if (this.dropdown_toggled && this.config.dropdown.toggle_icon) { - this.dropdown_icon = this.config.dropdown.toggle_icon; - } else { - this.dropdown_icon = this.dropdown_icon_original; - } - } - }; - - public toggleSpin = (): void => { - if (this.spinner) { - if (this.toggled && this.config.toggle) { - this.icon = (this.config.toggle as { tooltip: string; icon: string }).icon; - } else { - this.icon = this.icon_original; - } - } else { - this.icon = 'fa fa-spinner fa-spin'; - } - this.spinner = !this.spinner; - }; - - public toggleLock = (): void => { - this.locked = !this.locked; - }; -} diff --git a/src/ve-core/button-bar/services/ButtonBar.api.ts b/src/ve-core/button-bar/services/ButtonBar.api.ts deleted file mode 100644 index 953750a72..000000000 --- a/src/ve-core/button-bar/services/ButtonBar.api.ts +++ /dev/null @@ -1,117 +0,0 @@ -import { BarButton } from '@ve-core/button-bar'; - -export interface ButtonWrapEvent { - oldSize: number; - newSize: number; -} - -export class ButtonBarApi { - public buttons: BarButton[] = []; - public WRAP_EVENT: string; - - constructor(public id: string) { - if (this.id === '') { - this.id = 'unknown'; - } - this.WRAP_EVENT = `${id}-wrap`; - } - - public getId = (): string => { - return this.id; - }; - - public select = (parentButton: BarButton, childButton: BarButton): void => { - if (parentButton && childButton && childButton.config.selectable) { - parentButton.dropdown_buttons.forEach((dropdownButton) => { - if (parentButton.config.dropdown) { - if (dropdownButton.id === childButton.id) { - dropdownButton.selected = dropdownButton.selected ? !dropdownButton.selected : true; - } - } else { - dropdownButton.selected = dropdownButton.id === childButton.id; - } - }); - } - }; - - public deselect = (parentButton: BarButton, childButton: BarButton): void => { - if (parentButton && childButton) { - parentButton.dropdown_buttons.forEach((dropdownButton) => { - if (parentButton.config.dropdown) { - if (dropdownButton.id === childButton.id) { - dropdownButton.selected = false; - } - } - }); - } - }; - - public setPermission = (id: string, permission: boolean): void => { - this.buttons.forEach((button) => { - if (button.id === id) button.permission = permission; - }); - }; - - public setActive = (id: string, state: boolean, parent?: string): void => { - this.buttons.forEach((button) => { - if (parent && button.id === parent && button.dropdown_buttons) { - button.dropdown_buttons.forEach((child) => { - if (child.id === id) child.active = state; - }); - } - if (button.id === id) button.active = state; - }); - }; - - public addButton = (button: BarButton): void => { - if (this.buttons.length === 0) { - button.placement = 'bottom-left'; - } else if (!button.placement) { - // else { - button.placement = 'bottom'; - } - this.buttons.push(button); - }; - - public toggleButtonSpinner = (id: string): void => { - this.buttons.forEach((button) => { - if (button.id === id) button.toggleSpin(); - else button.toggleLock(); - }); - }; - - public toggleButton = (id: string, state?: boolean): void => { - this.buttons.forEach((button) => { - if (button.id === id) button.toggle(state); - }); - }; - - public checkActive = (cb: (enableState: string) => boolean, parent?: BarButton): void => { - const buttons = parent ? parent.dropdown_buttons : this.buttons; - buttons.forEach((button) => { - const config = button.config; - if (config) { - if (config.enabledFor) { - this.setActive(button.id, false, parent ? parent.id : null); - for (const enableState of config.enabledFor) { - if (cb(enableState)) { - this.setActive(button.id, true, parent ? parent.id : null); - break; - } - } - } - if (config.disabledFor) { - for (const disableState of config.disabledFor) { - if (cb(disableState)) { - this.setActive(button.id, false, parent ? parent.id : null); - break; - } - } - } - } - if (button.dropdown_buttons.length > 0) { - this.checkActive(cb, button); - } - }); - }; -} diff --git a/src/ve-core/button-bar/services/ButtonBar.service.ts b/src/ve-core/button-bar/services/ButtonBar.service.ts deleted file mode 100644 index eb5bebe0f..000000000 --- a/src/ve-core/button-bar/services/ButtonBar.service.ts +++ /dev/null @@ -1,158 +0,0 @@ -import { BarButton, ButtonBarApi, IButtonBarButton } from '@ve-core/button-bar'; -import { EventService } from '@ve-utils/core'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { VeConfig } from '@ve-types/config'; -import { EditorActions } from '@ve-types/core/editor'; -import { VeApiObject } from '@ve-types/view-editor'; - -const default_buttons: IButtonBarButton[] = [ - { - id: 'button-bar-menu', - icon: 'fa-solid fa-bars', - selectable: false, - tooltip: 'menu', - placement: 'bottom-left', - dropdown: { - icon: 'fa-solid fa-caret-down', - toggle_icon: 'fa-solid fa-caret-up', - ids: [], - }, - }, -]; - -export interface buttonInitFn { - (api: ButtonBarApi): void; -} - -export class ButtonBarService { - static $inject = ['$q', 'EventService']; - - private barCounter: { [id: string]: number } = {}; - private buttons: { [key: string]: IButtonBarButton } = {}; - private buttonBars: VeApiObject = {}; - private veConfig: VeConfig; - - constructor(private $q: VeQService, private eventSvc: EventService) { - for (const button of default_buttons) { - this.buttons[button.id] = button; - } - this.veConfig = window.__env; - if (this.veConfig.expConfig) { - for (const ext of Object.keys(this.veConfig.expConfig)) { - if (this.veConfig.expConfig[ext] && this.veConfig.expConfig[ext].length > 0) { - for (const tool of this.veConfig.expConfig[ext]) { - if (tool.barButtons) { - this.registerButtons(tool.barButtons); - } - } - } - } - } - } - - public waitForApi = (id: string): VePromise => { - if (!this.buttonBars.hasOwnProperty(id)) { - this.buttonBars[id] = {}; - this.buttonBars[id].promise = new this.$q((resolve, reject) => { - this.buttonBars[id].resolve = resolve; - this.buttonBars[id].reject = reject; - }); - } - return this.buttonBars[id].promise; - }; - - public generateBarId = (root?: string): string => { - if (!root) { - root = 'button_bar'; - } - if (!this.barCounter[root]) this.barCounter[root] = 1; - else this.barCounter[root]++; - return `${root}_${this.barCounter[root]}`; - }; - - public initApi(id: string, init: buttonInitFn, buttons?: IButtonBarButton[]): ButtonBarApi { - if (!init) { - return null; - } - const api = new ButtonBarApi(id); - - if (buttons && buttons.length > 0) { - this.registerButtons(buttons); - } - - init(api); - if (!this.buttonBars[id]) { - this.buttonBars[id] = { - api, - }; - } else { - this.buttonBars[id].api = api; - } - if (!this.buttonBars[id].resolve) { - this.buttonBars[id].promise = new this.$q((resolve, reject) => { - this.buttonBars[id].resolve = resolve; - this.buttonBars[id].reject = reject; - }); - } - this.buttonBars[id].resolve(api); - return api; - } - - destroy(id: string): void { - if (this.buttonBars.hasOwnProperty(id)) { - delete this.buttonBars[id]; - } - } - - destroyAll(ids: string[]): void { - ids.forEach((bbId) => { - this.destroy(bbId); - }); - } - - getButtonBarButton = (buttonId: string, ctrl?: EditorActions): BarButton => { - if (this.buttons.hasOwnProperty(buttonId)) { - const newButton = new BarButton(buttonId, this.buttons[buttonId]); - if (this.buttons[buttonId].dropdown) { - newButton.dropdown_buttons = []; - for (const id of this.buttons[buttonId].dropdown.ids) { - newButton.dropdown_buttons.push(this.getButtonBarButton(id, ctrl)); - } - } - if (this.buttons[buttonId].api && ctrl && ctrl[this.buttons[buttonId].api]) { - newButton.setAction((event): void => { - if (event) event.stopPropagation(); - (ctrl[this.buttons[buttonId].api] as () => void)(); - }); - } - return newButton; - } else { - return new BarButton(buttonId); - } - }; - - getButtonDefinition = (buttonId: string): IButtonBarButton => { - if (this.buttons.hasOwnProperty(buttonId)) { - return this.buttons[buttonId]; - } - return null; - }; - - public registerButtons = (buttons: IButtonBarButton | IButtonBarButton[]): void => { - if (!Array.isArray(buttons)) { - buttons = [buttons]; - } - if (buttons.length > 0) { - for (const button of buttons) { - if (!this.buttons[button.id]) { - this.buttons[button.id] = button; - } - } - } - }; -} - -veUtils.service('ButtonBarService', ButtonBarService); diff --git a/src/ve-core/editor/components/mention-intercept.component.ts b/src/ve-core/editor/components/mention-intercept.component.ts deleted file mode 100644 index dca4f8fc8..000000000 --- a/src/ve-core/editor/components/mention-intercept.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { MMSMentionController } from '@ve-core/editor/components/mention.component'; - -import { veCore } from '@ve-core'; - -import { ElementObject } from '@ve-types/mms'; - -class MMSMentionInterceptController implements angular.IComponentController { - public mmsMentionInterceptValue: string; - mmsFastCf: ElementObject[]; - - private ngModel: angular.INgModelController; - mentionCtrl: MMSMentionController; - - $onChanges(changes: angular.IOnChangesObject): void { - if (changes.mmsMentionInterceptValue) { - this.ngModel.$setViewValue(changes.mmsMentionInterceptValue.currentValue); - this.ngModel.$render(); - } - } - - public selectMentionItem($item: ElementObject): void { - this.mentionCtrl.selectMentionItem($item); - } -} - -// Used to sync value between input from the ckeditor and the uib-typeahead directive -const MMSMentionIntercept = { - selector: 'mentionIntercept', - template: ` -
    - -
    -`, - require: { - ngModel: '^ngModel', - mentionCtrl: '^^mention', - }, - bindings: { - mmsMentionInterceptValue: '<', - mmsFastCf: '<', - mmsMentionId: '<', - }, - controller: MMSMentionInterceptController, -}; - -veCore.component(MMSMentionIntercept.selector, MMSMentionIntercept); diff --git a/src/ve-core/editor/components/mention.component.ts b/src/ve-core/editor/components/mention.component.ts deleted file mode 100644 index 273cb4ed3..000000000 --- a/src/ve-core/editor/components/mention.component.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { EditorService, MentionService } from '@ve-core/editor'; - -import { veCore } from '@ve-core'; - -import { ElementObject } from '@ve-types/mms'; - -export class MMSMentionController implements angular.IComponentController { - //Bindings - public mmsEditor: CKEDITOR.editor; - mmsMentionValue: string; - mmsMentionId: string; - mmsProjectId: string; - mmsRefId: string; - - //Local - public fastCfListing: ElementObject[]; - - static $inject = ['MentionService', 'EditorService']; - - constructor(private mentionSvc: MentionService, private editorSvc: EditorService) {} - - $onInit(): void { - this.fastCfListing = this.mentionSvc.getFastCfListing(this.mmsProjectId, this.mmsRefId); - // expose this api on the controller itself so that it can be accessed by codes that use $compile service to construct this directive. - } - - public selectMentionItem($item: ElementObject): void { - this._createCf($item); - this.mentionSvc.handleMentionSelection(this.mmsEditor, this.mmsMentionId); - } - - private _createCf($item: ElementObject): void { - const tag = - '[cf:' + - $item.name + - '.' + - $item.type + - ']'; - this.mmsEditor.insertHtml(tag); - this.editorSvc.focusOnEditorAfterAddingWidgetTag(this.mmsEditor); - } -} - -const MMSMention = { - selector: 'mention', - template: ` - - - -`, - bindings: { - mmsEditor: '<', - mmsMentionValue: '<', - mmsMentionId: '<', - mmsProjectId: '<', - mmsRefId: '<', - }, - controller: MMSMentionController, -}; - -veCore.component(MMSMention.selector, MMSMention); diff --git a/src/ve-core/editor/editor-buttons.config.ts b/src/ve-core/editor/editor-buttons.config.ts deleted file mode 100644 index 1c760c53f..000000000 --- a/src/ve-core/editor/editor-buttons.config.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { IButtonBarButton } from '@ve-core/button-bar'; - -export const editor_buttons: IButtonBarButton[] = [ - { - id: 'editor-delete', - icon: 'fa-solid fa-trash', - selectable: false, - tooltip: 'Remove', - api: 'delete', - }, - { - id: 'editor-save', - icon: 'fa-solid fa-save', - selectable: false, - tooltip: 'Save', - api: 'save', - }, - { - id: 'editor-save-continue', - icon: 'fa-regular fa-paper-plane', - selectable: false, - tooltip: 'Save and Continue', - api: 'saveC', - }, - { - id: 'editor-cancel', - icon: 'fa-solid fa-times', - selectable: false, - tooltip: 'Cancel', - api: 'cancel', - }, - { - id: 'editor-reset', - icon: 'fa-solid fa-rotate-left', - selectable: false, - tooltip: 'Reset Editor and Continue', - api: 'reset', - }, - { - id: 'editor-preview', - icon: 'fa-solid fa-magnifying-glass', - selectable: false, - tooltip: 'Preview Changes', - api: 'preview', - }, -]; diff --git a/src/ve-core/editor/editor.component.ts b/src/ve-core/editor/editor.component.ts deleted file mode 100644 index 49e81ed82..000000000 --- a/src/ve-core/editor/editor.component.ts +++ /dev/null @@ -1,822 +0,0 @@ -import angular, { IComponentController } from 'angular'; -import $ from 'jquery'; -import _, { DebouncedFunc } from 'lodash'; - -import { InsertTransclusionData } from '@ve-components/transclusions'; -import { MentionService } from '@ve-core/editor'; -import { EditorService } from '@ve-core/editor/services/Editor.service'; -import { ImageService } from '@ve-utils/application'; -import { ApiService, ElementService, URLService, ViewService } from '@ve-utils/mms-api-client'; - -import { veCore } from '@ve-core'; - -import eventDataTypes = CKEDITOR.eventDataTypes; - -import { VeComponentOptions, VeNgModelController, VePromise, VeQService } from '@ve-types/angular'; -import { InsertData, InsertResolveFn } from '@ve-types/components'; -import { VeConfig } from '@ve-types/config'; -import { ElementObject, ElementsResponse, TransclusionObject } from '@ve-types/mms'; -import { VeModalService, VeModalSettings } from '@ve-types/view-editor'; - -/** - * @ngdoc directive - * @name veCore.component:veEditor - * @element textarea - * - * @requires veUtils/CacheService - * @requires veUtils/ElementService - * @requires veUtils/UtilsService - * @requires veUtils/ViewService - * @requires $uibModal - * @requires $q - * @requires $timeout - * @requires growl - * @requires CKEDITOR - * @requires _ - * - * @restrict A - * * Make any edit any value with a CKEditor wysiwyg editor. This - * requires the CKEditor library. Transclusion is supported. ngModel is required. - * Allows the setting of an Autosave key. - * ### Example - *
    -   
    -   
    - */ -export class EditorController implements IComponentController { - private veConfig: VeConfig = window.__env; - private ckEditor = window.CKEDITOR; - - private ngModelCtrl: VeNgModelController; - private ngModel: string; - - mmsElementId: string; - mmsProjectId: string; - mmsRefId: string; - private editorType: string; - private editField: 'name' | 'value' | 'documentation' = 'documentation'; - private editKey: string | string[]; - private editIndex: string = ''; - - private stylesToolbar = { - name: 'styles', - items: ['Styles', /*'Format',*/ 'FontSize', 'TextColor', 'BGColor'], - }; - private basicStylesToolbar = { - name: 'basicstyles', - //items: ['Bold', 'Italic', 'Underline', 'mmsExtraFormat'], - items: ['Bold', 'Italic', 'Underline'], - }; - private clipboardToolbar = { name: 'clipboard', items: ['Undo', 'Redo'] }; - private justifyToolbar = { - name: 'paragraph', - items: ['JustifyLeft', 'JustifyCenter', 'JustifyRight'], - }; - private editingToolbar = { name: 'editing', items: ['Find', 'Replace'] }; - private linksToolbar = { name: 'links', items: ['Link', 'Unlink', '-'] }; - private imageToolbar = { name: 'image', items: ['Image', 'Iframe'] }; - private listToolbar = { - name: 'list', - items: ['NumberedList', 'BulletedList', 'Outdent', 'Indent'], - }; - private equationToolbar = { - name: 'equation', - items: ['Mathjax', 'SpecialChar'], - }; - private sourceToolbar = { - name: 'source', - items: ['Maximize', 'Sourcedialog'], - }; - private combinedToolbar = { - name: 'combined', - items: [ - 'Mmscf', - 'Mmsvlink', - 'Table', - 'Image', - 'Iframe', - 'Mathjax', - 'SpecialChar', - 'Mmscomment', - //'mmsExtraFeature', - ], - }; - private tableEquationToolbar = { name: 'tableEquation', items: ['Table', 'Mathjax', 'SpecialChar', '-'] }; - - private extrasToolbar = { name: 'extras', items: ['mmsExtraFeature'] }; - - protected $transcludeEl: JQuery; - public id: string; - protected init: boolean = false; - - private instance: CKEDITOR.editor = null; - private deb: DebouncedFunc<(e) => void>; - - private tokenStr: RegExp = new RegExp('([?&]token=[a-zA-Z0-9.]*)'); - - static $inject = [ - '$compile', - '$q', - '$attrs', - '$element', - '$timeout', - '$scope', - '$uibModal', - 'growl', - 'ElementService', - 'ApiService', - 'ViewService', - 'URLService', - 'MentionService', - 'EditorService', - 'ImageService', - ]; - - /** - * - * @param {angular.ICompileService} $compile - * @param {VeQService} $q - * @param {VeModalService} $uibModal - * @param {angular.IAttributes} $attrs - * @param {JQuery} $element - * @param {angular.ITimeoutService} $timeout - * @param {angular.IScope} $scope - * @param {angular.growl.IGrowlService} growl - * @param {ElementService} elementSvc - * @param {ApiService} apiSvc - * @param {ViewService} viewSvc - * @param {URLService} uRLSvc - * @param {MentionService} mentionSvc - * @param {EditorService} editorSvc - * @param {ImageService} imageSvc - */ - constructor( - private $compile: angular.ICompileService, - private $q: VeQService, - private $attrs: angular.IAttributes, - private $element: JQuery, - private $timeout: angular.ITimeoutService, - private $scope: angular.IScope, - private $uibModal: VeModalService, - private growl: angular.growl.IGrowlService, - private elementSvc: ElementService, - private apiSvc: ApiService, - private viewSvc: ViewService, - private uRLSvc: URLService, - private mentionSvc: MentionService, - private editorSvc: EditorService, - private imageSvc: ImageService - ) { - this.deb = _.debounce((e) => { - this.update().catch(() => { - this.growl.error('Error saving editor content'); - }); - }, 1000); - } - - $onChanges(onChangesObj: angular.IOnChangesObject): void { - if (onChangesObj.ngModel && !this.init) { - this.init = true; - - this.id = this.editorSvc.createId(); - this.editKey = this.elementSvc.getEditKey({ - refId: this.mmsRefId, - projectId: this.mmsProjectId, - elementId: this.mmsElementId, - }); - if (this.editKey) { - this.editorSvc.add( - this.editKey, - `${this.editField}${this.editIndex ? this.editIndex : ''}`, - this.update - ); - } - this.startEditor(); - } - } - - $onDestroy(): void { - this.destroy(); - } - - public destroy(): void { - this.instance.config.autosave = { enableAutosave: false }; - this.editorSvc.remove(this.editKey, `${this.editField}${this.editIndex ? this.editIndex : ''}`); - if (this.ckEditor.instances[this.id]) this.ckEditor.instances[this.id].destroy(true); - } - - public startEditor(): void { - // Initialize ckeditor and set event handlers - if (this.ckEditor.instances[this.id]) return; - this.$element.empty(); - this.$transcludeEl = $(``); - this.$transcludeEl.val(this.ngModel); - - this.$element.append(this.$transcludeEl); - this.$compile(this.$transcludeEl)(this.$scope); - - this.instance = this.ckEditor.replace(this.id, { - mmscf: { callbackModalFnc: this.transcludeCallback }, - mmscomment: { callbackModalFnc: this.commentCallback }, - mmsvlink: { callbackModalFnc: this.viewLinkCallback }, - mmsreset: { callback: this.mmsResetCallback }, - contentsCss: `${this.ckEditor.basePath}contents.css`, - toolbar: this.getToolbar(), - }); - - // Enable Autosave plugin only when provided with unique identifier (editKey) - if (this.editKey) { - // Configuration for autosave plugin - this.instance.config.autosave = { - SaveKey: `${Array.isArray(this.editKey) ? this.editKey.join('|') : this.editKey}|${this.editField}${ - this.editIndex ? '|' + this.editIndex : '' - }`, - delay: 5, - NotOlderThen: 7200, // 5 days in minutes - enableAutosave: true, - }; - } else { - this.instance.config.autosave = { enableAutosave: false }; - } - - this.instance.on('instanceReady', () => { - this.addCkeditorHtmlFilterRule(this.instance); - this._addContextMenuItems(this.instance); - this.highlightActiveEditor(this.instance); - }); - - this._addInlineMention(); - - this.instance.on( - 'toHtml', - () => { - this.addCkeditorDataFilterRules(this.instance); - }, - null, - null, - 9 - ); - - this.instance.on('init', () => { - this._waitForEditor(() => { - this.ngModelCtrl.$setPristine(); - }); - }); - - this.instance.on('change', (e) => this._waitForEditor(this.deb, e)); - this.instance.on('afterCommandExec', (e) => this._waitForEditor(this.deb, e)); - this.instance.on('resize', (e) => this._waitForEditor(this.deb, e)); - this.instance.on('beforeDestroy', (e) => this._waitForEditor(this.deb, e)); - this.instance.on('blur', () => - this._waitForEditor(() => { - this.instance.focusManager.blur(); - }) - ); - this.instance.on( - 'key', - (e: CKEDITOR.eventInfo) => - this._waitForEditor((evt) => this._keyHandler(evt), e), - null, - null, - 31 - ); //priority is after indent list plugin's event handler - - this.instance.on('fileUploadRequest', (e: CKEDITOR.eventInfo) => { - //this._waitForEditor((evt) => { - const fileLoader = e.data.fileLoader; - const formData = new FormData(); - const xhr = fileLoader.xhr; - - xhr.open( - 'POST', - this.uRLSvc.getPutArtifactsURL({ - projectId: this.mmsProjectId, - refId: this.mmsRefId, - elementId: '_hidden_image_' + this.apiSvc.createUniqueId(), - }), - true - ); - //xhr.withCredentials = true; - xhr.setRequestHeader('Authorization', this.uRLSvc.getAuthorizationHeaderValue()); - formData.append('file', fileLoader.file, fileLoader.fileName); - if (fileLoader.fileName) { - formData.append('name', fileLoader.fileName); - } - - fileLoader.xhr.send(formData); - - // Prevented the default behavior. - e.stop(); - //}, e) - }); - this.instance.on('fileUploadResponse', (e: CKEDITOR.eventInfo) => { - //this._waitForEditor((evt) => { - // Prevent the default response handler. - e.stop(); - - // Get XHR and response. - const data = e.data; - const xhr = data.fileLoader.xhr; - const response: ElementsResponse = JSON.parse( - xhr.response as string - ) as ElementsResponse; - - if ( - !response.elements || - response.elements.length == 0 || - !response.elements[0]._artifacts || - response.elements[0]._artifacts.length == 0 - ) { - // An error occurred during upload. - //data.message = response[ 1 ]; - e.cancel(); - } else { - //TODO does this need to be smarter? - const element = response.elements[0]; - data.url = this.uRLSvc.getArtifactURL({ - projectId: element._projectId, - refId: element._refId, - elementId: element.id, - artifactExtension: element._artifacts[0].extension, - }); - } - //}, e) - }); - } - - public highlightActiveEditor = (instance: CKEDITOR.editor): void => { - const activeEditorClass = 'activeditor'; - $('transclude-doc').children('div').removeClass(activeEditorClass); - $(instance.element.$).closest('transclude-doc').children('div').addClass(activeEditorClass); - - instance.on('focus', () => { - $('transclude-doc').children('div').removeClass(activeEditorClass); - $(instance.element.$).closest('transclude-doc').children('div').addClass(activeEditorClass); - }); - }; - public addCkeditorDataFilterRules = (instance: CKEDITOR.editor): void => { - instance.dataProcessor.dataFilter.addRules({ - elements: { - $: (element: CKEDITOR.htmlParser.element) => { - if (element.name === 'script') { - element.remove(); - return; - } - - if (element.name.startsWith('transclude-') || element.name.startsWith('present-')) { - element.replaceWithChildren(); - return; - } - - const attributesToDelete = Object.keys(element.attributes).filter((attrKey) => { - return attrKey.startsWith('ng-'); - }); - attributesToDelete.forEach((attrToDelete) => { - delete element.attributes[attrToDelete]; - }); - }, - }, - }); - instance.dataProcessor.dataFilter.addRules({ - elements: { - // Adds the token to img's in the editor environment to allow images to be displayed while editor - $: (element: CKEDITOR.htmlParser.element) => { - element - .find((el: CKEDITOR.htmlParser.element) => { - return ( - el.name == 'img' && - el.attributes['data-cke-saved-src'] && - (el.attributes['data-cke-saved-src'].indexOf(this.veConfig.apiUrl) > -1 || - el.attributes['data-cke-saved-src'].indexOf('http') < 0) - ); - }, true) - .forEach((el: CKEDITOR.htmlParser.element) => { - el.attributes['src'] = this.imageSvc.fixImgUrl(el.attributes['data-cke-saved-src'], true); - // el.attributes['src'] = el.attributes['data-cke-saved-src']; - }); - }, - }, - }); - }; - public addCkeditorHtmlFilterRule = (instance: CKEDITOR.editor): void => { - instance.dataProcessor.htmlFilter.addRules({ - elements: { - $: (element: CKEDITOR.htmlParser.element) => { - if (element.name === 'script') { - element.remove(); - return; - } - - if (element.name.startsWith('transclude-') || element.name.startsWith('present-')) { - element.replaceWithChildren(); - return; - } - - const attributesToDelete = Object.keys(element.attributes).filter((attrKey) => { - return attrKey.startsWith('ng-'); - }); - attributesToDelete.forEach((attrToDelete) => { - delete element.attributes[attrToDelete]; - }); - }, - }, - }); - instance.dataProcessor.htmlFilter.addRules({ - elements: { - // Removes the token from the export src to prevent saving of token to server - $: (element: CKEDITOR.htmlParser.element) => { - element - .find((el: CKEDITOR.htmlParser.element) => { - return ( - el.name == 'img' && - el.attributes['data-cke-saved-src'] && - el.attributes['data-cke-saved-src'].indexOf(this.veConfig.apiUrl) > -1 - ); - }, true) - .forEach((el: CKEDITOR.htmlParser.element) => { - el.attributes['data-cke-saved-src'] = this.imageSvc.fixImgUrl( - el.attributes['data-cke-saved-src'], - false - ); - // el.attributes['src'] = el.attributes['data-cke-saved-src']; - }); - }, - }, - }); - }; - - public getToolbar(): Array< - | string - | string[] - | { - name: string; - items?: string[] | undefined; - groups?: string[] | undefined; - } - > { - let thisToolbar: Array< - | string - | string[] - | { - name: string; - items?: string[] | undefined; - groups?: string[] | undefined; - } - > = [ - this.stylesToolbar, - this.basicStylesToolbar, - this.justifyToolbar, - this.listToolbar, - this.linksToolbar, - this.combinedToolbar, - this.clipboardToolbar, - this.editingToolbar, - this.sourceToolbar, - ]; - switch (this.editorType) { - // case 'TableT': - // thisToolbar = [ - // this.stylesToolbar, - // this.basicStylesToolbar, - // this.justifyToolbar, - // this.linksToolbar, - // this.tableEquationToolbar, - // dropdownToolbar, - // this.clipboardToolbar, - // this.editingToolbar, - // this.sourceToolbar, - // ] - // break - case 'ListT': - thisToolbar = [ - this.stylesToolbar, - this.basicStylesToolbar, - this.justifyToolbar, - this.listToolbar, - this.linksToolbar, - this.equationToolbar, - this.extrasToolbar, - this.clipboardToolbar, - this.editingToolbar, - this.sourceToolbar, - ]; - break; - case 'Equation': - thisToolbar = [this.justifyToolbar, this.equationToolbar, this.sourceToolbar]; - break; - case 'Figure': - case 'ImageT': - thisToolbar = [this.justifyToolbar, this.imageToolbar, this.sourceToolbar]; - break; - } - return thisToolbar; - } - - public transcludeCallback = (editor: CKEDITOR.editor): void => { - const tSettings: VeModalSettings> = { - component: 'createTransclusionModal', - resolve: { - getInsertData: (): InsertTransclusionData => { - return { - type: 'Transclusion', - viewLink: false, - insertType: 'transclusion', - }; - }, - getProjectId: () => { - return this.mmsProjectId; - }, - getRefId: () => { - return this.mmsRefId; - }, - getOrgId: () => { - return ''; - }, - }, - size: 'lg', - }; - const tInstance = this.$uibModal.open, TransclusionObject>(tSettings); - tInstance.result.then( - (result) => { - this._addWidgetTag(result.tag, editor); - }, - () => { - editor.focus(); - } - ); - }; - - // Controller for inserting view link - // Defines scope variables for html template and how to handle user click - // If user selects name or doc, link will be to first related doc - // Also defines options for search interfaces -- see mmsSearch.js for more info - - public viewLinkCallback = (editor: CKEDITOR.editor): void => { - const tSettings: VeModalSettings> = { - component: 'createTransclusionModal', - resolve: { - getInsertData: (): InsertTransclusionData => { - return { - type: 'ViewLink', - viewLink: true, - insertType: 'transclusion', - }; - }, - getProjectId: () => { - return this.mmsProjectId; - }, - getRefId: () => { - return this.mmsRefId; - }, - getOrgId: () => { - return ''; - }, - }, - size: 'lg', - }; - const tInstance = this.$uibModal.open, TransclusionObject>(tSettings); - tInstance.result.then( - (result) => { - this._addWidgetTag(result.tag, editor); - }, - () => { - editor.focus(); - } - ); - }; - - public commentCallback = (editor: CKEDITOR.editor): void => { - const cSettings: VeModalSettings> = { - component: 'insertElementModal', - resolve: { - getInsertData: (): InsertData => { - return { - type: 'Comment', - insertType: 'comment', - }; - }, - getProjectId: () => { - return this.mmsProjectId; - }, - getRefId: () => { - return this.mmsRefId; - }, - getOrgId: () => { - return ''; - }, - }, - }; - const cInstance = this.$uibModal.open, ElementObject>(cSettings); - - cInstance.result.then( - (data) => { - const tag = - 'comment:' + data._creator + ''; - this._addWidgetTag(tag, editor); - }, - (reason) => { - if (reason && reason.status !== 444) { - this.growl.warning(`Error adding Comment: ${reason.message}`); - } else { - this.growl.info('Commenting Cancelled', { - ttl: 1000, - }); - } - } - ); - }; - - public resetCrossRef = (type: CKEDITOR.dom.node[], typeString: string): void => { - type.forEach((node, key) => { - const value = node.$; - const transclusionObject = angular.element(value); - const transclusionId = transclusionObject.attr('mms-element-id'); - - //TODO create Utils function to handle request objects - const reqOb = { - elementId: transclusionId, - projectId: this.mmsProjectId, - refId: this.mmsRefId, - }; - this.elementSvc.getElement(reqOb, 2).then( - (data) => { - transclusionObject.html('[cf:' + data.name + typeString); - }, - (reason) => { - let error: string; - if (reason.status === 410) error = 'deleted'; - if (reason.status === 404) error = 'not found'; - transclusionObject.html('[cf:' + error + typeString); - } - ); - }); - }; - - public mmsResetCallback = (ed: CKEDITOR.editor): void => { - const body: CKEDITOR.dom.element = ed.document.getBody(); - this.resetCrossRef(body.find("mms-cf[mms-cf-type='name']").toArray(), '.name]'); - this.resetCrossRef(body.find("mms-cf[mms-cf-type='doc']").toArray(), '.doc]'); - this.resetCrossRef(body.find("mms-cf[mms-cf-type='val']").toArray(), '.val]'); - this.resetCrossRef(body.find('mms-view-link').toArray(), '.vlink]'); - this.update().then( - () => { - /**/ - }, - () => { - this.growl.error('Error saving editor content'); - } - ); - }; - - public update = (destroy?: boolean): VePromise => { - // getData() returns CKEditor's processed/clean HTML content. - return new this.$q((resolve, reject) => { - if (this.instance) { - try { - this.ngModelCtrl.$setViewValue(this.instance.getData()); - } catch (e) { - reject({ - status: 500, - message: 'Error updating editor data', - data: this.id, - }); - } - } - if (destroy) this.destroy(); - resolve(true); - }); - }; - - private _addWidgetTag = (tag: string, editor: CKEDITOR.editor): void => { - editor.insertHtml(tag); - this.editorSvc.focusOnEditorAfterAddingWidgetTag(editor); - }; - - private _addInlineMention = (): void => { - let keyupHandler: CKEDITOR.listenerRegistration; - this.ckEditor.instances[this.id].on('contentDom', () => { - keyupHandler = this.ckEditor.instances[this.instance.name].document.on('keyup', (e) => { - if (this._isMentionKey((e.data as CKEDITOR.dom.node).$)) { - this.mentionSvc.createMention(this.instance, this.$scope.$new(), this.mmsProjectId, this.mmsRefId); - } else { - this.mentionSvc.handleInput( - e as CKEDITOR.eventInfo>, - this.$scope.$new(), - this.instance, - this.mmsProjectId, - this.mmsRefId - ); - } - }); - }); - - this.ckEditor.instances[this.id].on('contentDomUnload', () => { - if (keyupHandler) { - keyupHandler.removeListener(); - } - }); - }; - - private _keyHandler = (e: CKEDITOR.eventInfo): boolean => { - if (this._isMentionKey(e.data.domEvent.$)) { - return false; // to prevent "@" from getting written to the editor - } - - // when tab is pressed or any of these special keys is pressed while the mention results show up, ignore default ckeditor's behaviour - const ignoreDefaultBehaviour = - this._isTabKey(e) || (this._isSpecialKey(e) && this.mentionSvc.hasMentionResults(this.instance)); - if (ignoreDefaultBehaviour) { - e.cancel(); - e.stop(); - } - - if (this._isTabKey(e) && !this._isShiftKeyOn(e.data.domEvent.$)) { - this.instance.insertHtml('    '); - } - - if (!ignoreDefaultBehaviour) { - this.deb(e); - } - return true; - }; - - // 13 = enter, 38 = up arrow, 40 = down arrow - private _isSpecialKey = (event: CKEDITOR.eventInfo): boolean => { - const key = event.data.domEvent.$.which; - return key === 13 || key === 38 || key === 40; - }; - - private _isTabKey = (event: CKEDITOR.eventInfo): boolean => { - return event.data.domEvent.$.which === 9; - }; - - private _isMentionKey = (keyboardEvent: KeyboardEvent): boolean => { - return this._isShiftKeyOn(keyboardEvent) && keyboardEvent.key === '@'; - }; - - private _isShiftKeyOn = (keyboardEvent: KeyboardEvent): boolean => { - return keyboardEvent.shiftKey; - }; - - private _addContextMenuItems = (editor: CKEDITOR.editor): void => { - this._addFormatAsCodeMenuItem(editor); - }; - - private _addFormatAsCodeMenuItem = (editor: CKEDITOR.editor): void => { - editor.addCommand('formatAsCode', { - exec: (editor: CKEDITOR.editor) => { - const selected_text = editor.getSelection().getSelectedText(); - const newElement = new this.ckEditor.dom.element('code'); - newElement.addClass('inlineCode'); - newElement.setText(selected_text); - editor.insertElement(newElement); - return true; - }, - }); - editor.addMenuGroup('veGroup'); - editor.addMenuItem('formatAsCode', { - label: 'Format as inline code', - command: 'formatAsCode', - group: 'group', - icon: 'codeSnippet', - }); - editor.contextMenu.addListener((element) => { - return { formatAsCode: this.ckEditor.TRISTATE_OFF }; - }); - editor.setKeystroke(this.ckEditor.CTRL + 75, 'formatAsCode'); - }; - - private _waitForEditor>(fn: (e?: T) => void, evt?: T): void { - if (this.instance.status === 'loaded') fn(); - else { - new this.$q((resolve) => { - this.instance.on('loaded', () => { - fn(evt); - resolve(); - }); - }).catch((reason) => { - this.growl.error('CKEditor Error: ' + reason.message); - }); - } - } -} - -const EditorComponent: VeComponentOptions = { - selector: 'editor', - template: `
    `, - require: { - ngModelCtrl: '^ngModel', - }, - bindings: { - ngModel: '<', - mmsElementId: '@', - mmsProjectId: '@', - mmsRefId: '@', - editorType: '@', - editField: '@', - editIndex: '<', - }, - controller: EditorController, -}; - -veCore.component(EditorComponent.selector, EditorComponent); diff --git a/src/ve-core/editor/index.ts b/src/ve-core/editor/index.ts deleted file mode 100644 index e4886f56b..000000000 --- a/src/ve-core/editor/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -//Services -import './services'; - -export * from './services'; -export * from './editor-buttons.config'; - -//Components -import './components/mention.component'; -import './components/mention-intercept.component'; -import './editor.component'; diff --git a/src/ve-core/editor/services/EditDialog.service.ts b/src/ve-core/editor/services/EditDialog.service.ts deleted file mode 100644 index 77d57ce8d..000000000 --- a/src/ve-core/editor/services/EditDialog.service.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { EditService } from '@ve-utils/core'; - -import { veCore } from '@ve-core'; - -import { VeQService } from '@ve-types/angular'; -import { VeModalService } from '@ve-types/view-editor'; - -export class EditDialogService { - static $inject = ['$q', '$uibModal', 'EditService']; - constructor(private $q: VeQService, private $uibModal: VeModalService, private autosaveSvc: EditService) {} -} - -veCore.service('EditDialogService', EditDialogService); diff --git a/src/ve-core/editor/services/Editor.service.ts b/src/ve-core/editor/services/Editor.service.ts deleted file mode 100644 index 0dab2c763..000000000 --- a/src/ve-core/editor/services/Editor.service.ts +++ /dev/null @@ -1,486 +0,0 @@ -import angular from 'angular'; -import $ from 'jquery'; - -import { SaveConflictResolveFn } from '@ve-components/diffs'; -import { EditDialogService } from '@ve-core/editor'; -import { ConfirmDeleteModalResolveFn } from '@ve-core/modals'; -import { ToolbarService } from '@ve-core/toolbar'; -import { CacheService, EditObject, EditService, EventService } from '@ve-utils/core'; -import { ApiService, ElementService, PermissionsService, ViewService, ValueService } from '@ve-utils/mms-api-client'; - -import { veCore } from '@ve-core'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { BasicResponse, ElementObject, ElementsResponse, MmsObject } from '@ve-types/mms'; -import { VeModalInstanceService, VeModalService, VeModalSettings } from '@ve-types/view-editor'; - -export class EditorService { - public generatedIds: number = 0; - private edit2editor: { [editKey: string]: { [field: string]: (destroy?: boolean) => VePromise } } = - {}; - public savingAll: boolean = false; - - static $inject = [ - '$q', - '$timeout', - '$uibModal', - 'growl', - 'ApiService', - 'CacheService', - 'PermissionsService', - 'ElementService', - 'ValueService', - 'ViewService', - 'ToolbarService', - 'EditDialogService', - 'EventService', - 'EditService', - ]; - - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private $uibModal: VeModalService, - private growl: angular.growl.IGrowlService, - private apiSvc: ApiService, - private cacheSvc: CacheService, - private permissionsSvc: PermissionsService, - private elementSvc: ElementService, - private valueSvc: ValueService, - private viewSvc: ViewService, - private toolbarSvc: ToolbarService, - private editdialogSvc: EditDialogService, - private eventSvc: EventService, - private editSvc: EditService - ) {} - - public get(editKey: string): { [field: string]: () => VePromise } { - return this.edit2editor[editKey]; - } - - public updateAllData( - editKey: string | string[], - allowNone?: boolean, - destroy?: boolean - ): VePromise> { - const key: string = this.editSvc.makeKey(editKey); - return new this.$q>((resolve, reject) => { - if (this.edit2editor[key]) { - const promises: VePromise[] = []; - for (const id of Object.keys(this.edit2editor[key])) { - promises.push(this.edit2editor[key][id](destroy)); - } - this.$q.all(promises).then(resolve, reject); - } else if (allowNone) { - resolve(); - } else { - reject({ status: 500, message: 'No editors present to update from' }); - } - }); - } - - public add( - editKey: string | string[], - field: string, - updateFn: (destroy?: boolean) => VePromise - ): void { - editKey = this.editSvc.makeKey(editKey); - if (!this.edit2editor[editKey]) this.edit2editor[editKey] = {}; - this.edit2editor[editKey][field] = updateFn; - } - - public remove(editKey: string | string[], field: string): void { - editKey = Array.isArray(editKey) ? editKey.join('|') : editKey; - if (this.edit2editor[editKey] && this.edit2editor[editKey][field]) { - this.edit2editor[editKey][field]().finally(() => { - delete this.edit2editor[editKey as string][field]; - if (Object.keys(this.edit2editor[editKey as string]).length === 0) { - delete this.edit2editor[editKey as string]; - } - }); - } - } - - public createId(): string { - return `mmsCKEditor${this.generatedIds++}`; - } - public focusOnEditorAfterAddingWidgetTag(editor: CKEDITOR.editor): void { - const element = editor.widgets.focused.element.getParent(); - editor.focusManager.focus(element); - } - - public save = (editKey: string | string[], continueEdit: boolean): VePromise => { - this.eventSvc.$broadcast('element-saving', true); - - return new this.$q((resolve, reject) => { - this._save(editKey, continueEdit).then( - (data) => { - this.eventSvc.$broadcast('element-saving', false); - if (!data) { - this.growl.info('Save Skipped (No Changes)'); - } else { - this.growl.success('Save Successful'); - } - - resolve(data); - }, - (reason) => { - this.eventSvc.$broadcast('element-saving', false); - reject(reason); - } - ); - }); - }; - - public saveAll = (): VePromise => { - if (this.savingAll) { - this.growl.info('Please wait...'); - return this.$q.resolve(); - } - if (this.editSvc.openEdits() === 0) { - this.growl.info('Nothing to save'); - return this.$q.resolve(); - } - - this.savingAll = true; - return new this.$q((resolve, reject) => { - this.elementSvc - .updateElements( - Object.values(this.editSvc.getAll()).map((editOb) => { - return editOb.element; - }) - ) - .then((responses) => { - responses.forEach((elementOb) => { - const edit = this.editSvc.get(this.elementSvc.getEditElementKey(elementOb)); - this.cleanUpEdit(edit.key); - const data = { - element: elementOb, - continueEdit: false, - }; - this.eventSvc.$broadcast('element.updated', data); - }); - this.growl.success('Save All Successful'); - resolve(); - }, reject); - }); - }; - - /** - * @name Utils#save - * save edited element - * - * @param {string} editKey The autosave key that points to the object being saved - * @param continueEdit - * @return {Promise} promise would be resolved with updated element if save is successful. - * For unsuccessful saves, it will be rejected with an object with type and message. - * Type can be error or info. In case of conflict, there is an option to discard, merge, - * or force save. If the user decides to discord or merge, type will be info even though - * the original save failed. Error means an actual error occurred. - */ - private _save(editKey: string | string[], continueEdit?: boolean): VePromise { - return new this.$q((resolve, reject) => { - this.updateAllData(editKey, true, true).then( - () => { - const edit = this.editSvc.get(editKey).element; - this.elementSvc.updateElement(edit, false, true).then( - (element: T) => { - const data = { - element: element, - continueEdit: continueEdit ? continueEdit : false, - }; - this.eventSvc.$broadcast('element.updated', data); - this.cleanUpEdit(editKey); - resolve(element); - }, - (reason: VePromiseReason>) => { - if (reason.status === 409) { - const latest = reason.data.elements[0]; - this.saveConflictDialog(latest).result.then( - (data) => { - const choice = data; - if (choice === 'ok') { - const reqOb = { - elementId: latest.id, - projectId: latest._projectId, - refId: latest._refId, - commitId: 'latest', - }; - this.cleanUpEdit(editKey); - resolve(this.elementSvc.cacheElement(reqOb, latest)); - } else if (choice === 'force') { - edit._modified = latest._modified; - this._save(editKey, continueEdit).then( - (resolved) => { - resolve(resolved); - }, - (error) => { - reject(error); - } - ); - } else { - reject({ status: 444, type: 'info', message: 'Save cancelled!' }); - } - }, - () => { - reject({ - status: 500, - message: 'An error occurred. Please try your request again', - type: 'error', - }); - } - ); - } else { - reason.type = 'error'; - reject(reason); - } - } - ); - }, - () => { - reject({ - status: 500, - message: 'Error Saving from Editor; Please Retry', - type: 'error', - }); - } - ); - }); - } - - /** - * @name Utils#hasEdits - * whether editor object has changes compared to base element, - * currently compares name, doc, property values, if element is not - * editable, returns false - * - * @param {object} editOb edit object - * @param {'name' | 'value' | 'documentation'} field specific field you are interested in checking for edits - * @return {boolean} has changes or not - */ - public hasEdits = ( - editOb: EditObject, - field?: 'name' | 'value' | 'documentation' - ): VePromise> => { - const edit = editOb.element; - edit._commitId = 'latest'; - return new this.$q>((resolve) => { - this.updateAllData(editOb.key, true, false).then( - () => { - this.elementSvc.getElement(this.elementSvc.getElementRequest(edit)).then( - (elementOb) => { - if (elementOb) { - if ((!field || field === 'name') && edit.name !== elementOb.name) { - resolve(true); - } - if ( - (!field || field === 'documentation') && - edit.documentation !== elementOb.documentation - ) { - resolve(true); - } - if ( - this.valueSvc.isValue(edit) && - (!field || field === 'value') && - !this.valueSvc.isEqual(edit, elementOb) - ) { - resolve(true); - } - resolve(false); - } else if ( - edit.id.endsWith('_temp') && - (edit.name || edit.documentation || this.valueSvc.hasValue(edit)) - ) { - resolve(true); - } else { - resolve(false); - } - }, - () => { - resolve(false); - } - ); - }, - () => { - resolve(false); - } - ); - }); - }; - - /** - * @name Utils#openEdit - * reset back to base element or remove editor object - * - * @param {object} elementOb scope with common properties - */ - public openEdit(elementOb: ElementObject): VePromise> { - return new this.$q((resolve, reject) => { - this.permissionsSvc - .initializePermissions( - { - id: elementOb._projectId, - }, - { - id: elementOb._refId, - _projectId: elementOb._projectId, - type: 'Branch', - } - ) - .finally(() => { - const reqOb = { - elementId: elementOb.id, - projectId: elementOb._projectId, - refId: elementOb._refId, - }; - if (!this.permissionsSvc.hasBranchEditPermission(elementOb._projectId, elementOb._refId)) { - reject({ message: 'No edit permission on branch', status: 403 }); - return; - } - this.elementSvc.getElementForEdit(reqOb).then( - (edit) => { - if (this.valueSvc.isValue(edit.element)) { - edit.values = this.valueSvc.getValues(edit.element); - } - resolve(edit); - }, - (reason) => { - reject(reason); - } - ); - }); - }); - } - - public cleanUpEdit(editKey: string | string[]): void { - this.clearAutosave(editKey); - this.editSvc.remove(editKey); - // Broadcast message for the ToolCtrl: - this.eventSvc.$broadcast('editor.close'); - } - - public clearAutosave = (key: string | string[], field?: string): void => { - key = this.editSvc.makeKey(key); - if (field) key = key + '|' + field; - Object.keys(window.localStorage).forEach((akey) => { - if (akey.indexOf(key as string) !== -1) { - window.localStorage.removeItem(akey); - } - }); - }; - - private _makeKey(key: string | string[]): string { - return Array.isArray(key) ? key.join('|') : key; - } - - public handleError(reason: { message: string; type: 'error' | 'warning' | 'info' } | VePromiseReason): void { - if (reason.type === 'info') this.growl.info(reason.message); - else if (reason.type === 'warning') this.growl.warning(reason.message); - else if (reason.type === 'error') this.growl.error(reason.message); - } - - public updateEditor(editKey: string | string[], field: string): VePromise { - return new this.$q((resolve, reject) => { - editKey = this.editSvc.makeKey(editKey); - if (this.edit2editor[editKey] && this.edit2editor[editKey][field]) { - this.edit2editor[editKey][field]().then(resolve, reject); - } else { - resolve(true); // continue for non ckeditor transcludes - } - }); - } - - /** - * @name Utils#previewAction * called by transcludes and section, previews edited element - * uses these in the scope: - * element - element object for the element to edit (for sections it's the instance spec) - * edit - edit object - * elementSaving - boolean - * inPreviewMode - boolean - * isEditing - boolean - * bbApi - button bar api - handles spinny - * sets these in the scope: - * skipBroadcast - true - * inPreviewMode - false - * isEditing - false - * elementSaving - false - * - * @param ctrl - * @param {object} recompile recompile function object - * @param {object} domElement dom of the directive, jquery wrapped - */ - - public scrollToElement = (domElement: JQuery): void => { - this.$timeout( - () => { - const el = domElement[0]; - if ($(domElement).isOnScreen()) return; - el.scrollIntoView(); - }, - 500, - false - ).then( - () => { - /**/ - }, - () => { - /**/ - } - ); - }; - - saveConflictDialog(latest: T): VeModalInstanceService { - return this.$uibModal.open, string>({ - component: 'saveConflict', - size: 'lg', - resolve: { - latest: () => { - return latest; - }, - }, - }); - } - - public deleteEditModal(editOb: EditObject): VeModalInstanceService { - const settings: VeModalSettings = { - component: 'confirmDeleteModal', - resolve: { - getName: () => { - return `${editOb.element.type} ${editOb.element.id}`; - }, - getType: () => { - return 'edit'; - }, - finalize: () => { - return () => { - return this.$q.resolve(); - }; - }, - }, - }; - return this.$uibModal.open(settings); - } - - public deleteConfirmModal(edit: EditObject): VeModalInstanceService { - const settings: VeModalSettings = { - component: 'confirmDeleteModal', - resolve: { - getType: () => { - return edit.element.type ? edit.element.type : 'element'; - }, - getName: () => { - return edit.element.name ? edit.element.name : 'Element'; - }, - finalize: () => { - return () => { - this.cleanUpEdit(edit.key); - return this.$q.resolve(); - }; - }, - }, - }; - return this.$uibModal.open(settings); - } -} - -veCore.service('EditorService', EditorService); diff --git a/src/ve-core/editor/services/Mention.service.ts b/src/ve-core/editor/services/Mention.service.ts deleted file mode 100644 index 4e350466d..000000000 --- a/src/ve-core/editor/services/Mention.service.ts +++ /dev/null @@ -1,404 +0,0 @@ -import $ from 'jquery'; -import moment from 'moment'; - -import { MMSMentionController } from '@ve-core/editor/components/mention.component'; -import { UtilsService } from '@ve-utils/application'; -import { CacheService } from '@ve-utils/core'; -import { ApiService, ViewService } from '@ve-utils/mms-api-client'; - -import { veCore } from '@ve-core'; - -import { ElementObject } from '@ve-types/mms'; - -export interface MentionScope extends angular.IScope { - mmsEditor?: CKEDITOR.editor; - mmsMentionValue?: string; - mmsMentionId?: string; - mmsProjectId?: string; - mmsRefId?: string; -} - -export interface MentionState { - mentionScope: MentionScope; - mentionController: MMSMentionController; - mentionElement: JQLite; - mentionId: string; - mentionPlaceHolderId: string; -} - -export class MentionService { - mentions: { [id: string]: MentionState } = {}; - mentionPlacerHolderPrefix = 'mentionPlaceHolder'; - - static $inject = ['$compile', '$timeout', 'growl', 'CacheService', 'ViewService', 'UtilsService', 'ApiService']; - - constructor( - private $compile: angular.ICompileService, - private $timeout: angular.ITimeoutService, - private growl: angular.growl.IGrowlService, - private cacheSvc: CacheService, - private viewSvc: ViewService, - private utilsSvc: UtilsService, - private apiSvc: ApiService - ) {} - /** Used to maintain all mention in all ckeditors **/ - - public getFastCfListing(projectId: string, refId: string): ElementObject[] { - const latestElements: ElementObject[] = this.cacheSvc.getLatestElements(projectId, refId); - - latestElements.reduce( - ( - result: { - id: string; - name: string; - type: string; - iconClass: string; - documentation?: string; - editor: string; - editTime: string; - elementType: string; - value?: string; - }[], - cacheElement - ) => { - const elementType = this.viewSvc.getElementType(cacheElement); - const elementName = cacheElement.name ? cacheElement.name : cacheElement.id; - const iconClass = this.utilsSvc.getElementTypeClass(cacheElement, elementType); - result.push({ - id: cacheElement.id, - name: elementName, - type: 'name', - iconClass: iconClass, - documentation: cacheElement.documentation || 'no text', - editor: cacheElement._modifier, - editTime: moment(cacheElement._modified).fromNow(), - elementType: elementType ? elementType : cacheElement.type, - }); - if (cacheElement.documentation != undefined) { - result.push({ - id: cacheElement.id, - name: elementName, - type: 'doc', - iconClass: iconClass, - documentation: cacheElement.documentation || 'no text', - editor: cacheElement._modifier, - editTime: moment(cacheElement._modified).fromNow(), - elementType: elementType || cacheElement.type, - }); - } - - if (cacheElement.type === 'Property' && cacheElement.defaultValue) { - let value = String(cacheElement.defaultValue.value); - if (!value || value === 'undefined') { - value = 'this field is empty'; - } - result.push({ - id: cacheElement.id, - name: elementName, - type: 'val', - iconClass: iconClass, - value: value, - editor: cacheElement._modifier, - editTime: moment(cacheElement._modified).fromNow(), - elementType: cacheElement.type, - }); - } - return result; - }, - [] - ); - return latestElements; - } - - public createMention( - editor: CKEDITOR.editor, - mentionScope: MentionScope, - projectId: string, - refId: string, - existingMentionPlaceHolder?: { - mentionId: string; - mentionPlaceHolderId: string; - } - ): void { - const mentionId = existingMentionPlaceHolder ? existingMentionPlaceHolder.mentionId : this.apiSvc.createUUID(); - const mentionPlaceHolderId = existingMentionPlaceHolder - ? existingMentionPlaceHolder.mentionPlaceHolderId - : this._createMentionPlaceHolder(editor, mentionId); - const mention = this._createMentionDirective(editor, mentionScope, mentionId, projectId, refId); - this._createNewMentionState(editor, mention, mentionPlaceHolderId, mentionId); - MentionService._positionMentionElement(editor, mention, mentionPlaceHolderId); - } - - public handleInput( - event: CKEDITOR.eventInfo>, - newScope: MentionScope, - editor: CKEDITOR.editor, - projectId: string, - refId: string - ): void { - if (editor._ && editor._.elementsPath) { - const elementsPath = editor._.elementsPath; - const currentEditingElement = elementsPath.list[0].$; - const currentEditingElementId = currentEditingElement.getAttribute('id'); - const mentionId = this._getMentionIdFromMentionPlaceHolder(currentEditingElementId); - if (mentionId) { - let mentionState = this._retrieveMentionState(editor.id, mentionId); - // logic to reactivate existing "@" when reloading ckeditor - if (!mentionState) { - this.createMention(editor, newScope, projectId, refId, { - mentionId: mentionId, - mentionPlaceHolderId: currentEditingElementId, - }); - mentionState = this._retrieveMentionState(editor.id, mentionId); - } - - const mentionScope = mentionState.mentionScope; - mentionScope.$apply(() => { - let text = currentEditingElement.innerText; - text = text.substring(1); // ignore @ - mentionScope.mmsMentionValue = text; - this._repositionDropdownIfOffScreen(editor, mentionState); - }); - - this._handleSpecialKeys(event, mentionId, editor, projectId, refId); - } - } - } - - public handleMentionSelection(editor: CKEDITOR.editor, mentionId: string): void { - this._cleanup(editor, mentionId); - } - - public removeAllMentionForEditor(editor: CKEDITOR.editor): void { - Object.keys(this.mentions) - .filter((key) => { - const splits = key.split('-'); - return splits[0] === editor.id; - }) - .forEach((key) => { - this._cleanup(editor, key.split('-')[1]); - }); - } - - public hasMentionResults(editor: CKEDITOR.editor): boolean { - const currentEditingElement = editor._.elementsPath.list[0].$; - const currentEditingElementId = currentEditingElement.getAttribute('id'); - const mentionId = this._getMentionIdFromMentionPlaceHolder(currentEditingElementId); - if (mentionId) { - return MentionService._hasMentionResults(mentionId); - } - return false; - } - - private static _hasMentionResults(mentionId: string): boolean { - return ( - $('#' + mentionId) - .find('ul') - .children().length > 0 - ); - } - - private _createMentionDirective( - editor: CKEDITOR.editor, - mentionScope: MentionScope, - mentionId: string, - projectId: string, - refId: string - ): JQLite { - mentionScope.mmsEditor = editor; - mentionScope.mmsMentionValue = ''; - mentionScope.mmsMentionId = mentionId; - mentionScope.mmsProjectId = projectId; - mentionScope.mmsRefId = refId; - return this.$compile( - '' - )(mentionScope); - } - - private static _getCkeditorFrame(editor: CKEDITOR.editor): HTMLIFrameElement { - return editor.container.$.getElementsByTagName('iframe')[0]; - } - - private static _positionMentionElement( - editor: CKEDITOR.editor, - mentionElement: JQLite, - mentionPlaceHolderId: string - ): void { - const ckeditorFrame = MentionService._getCkeditorFrame(editor); - const ckeditorBox = ckeditorFrame.getBoundingClientRect(); - const mentionPlaceHolder = ckeditorFrame.contentDocument.getElementById(mentionPlaceHolderId); - const mentionPlaceHolderBox = $(mentionPlaceHolder)[0].getBoundingClientRect(); - mentionElement.css({ - position: 'absolute', - top: ckeditorBox.top + mentionPlaceHolderBox.top + 30, - left: ckeditorBox.left + mentionPlaceHolderBox.left, - }); - $('body').append(mentionElement); - } - - private _createNewMentionState( - editor: CKEDITOR.editor, - mention: JQLite, - mentionPlaceHolderId: string, - mentionId: string - ): MentionState { - const key = MentionService._getMentionStateId(editor.id, mentionId); - const value: MentionState = { - mentionScope: mention.scope(), - mentionController: mention.controller() as MMSMentionController, - mentionElement: mention, - mentionId: mentionId, - mentionPlaceHolderId: mentionPlaceHolderId, - }; - this.mentions[key] = value; - return value; - } - - private _retrieveMentionState = (editorId: string, mentionId: string): MentionState => { - return this.mentions[MentionService._getMentionStateId(editorId, mentionId)]; - }; - - private static _getMentionStateId(editorId: string, mentionId: string): string { - return editorId + '-' + mentionId; - } - - private _createMentionPlaceHolder(editor: CKEDITOR.editor, mentionId: string): string { - const id = this.mentionPlacerHolderPrefix + '-' + editor.id + '-' + mentionId; - const mentionPlaceHolder = '@'; - editor.insertHtml(mentionPlaceHolder); - return id; - } - - private _getMentionIdFromMentionPlaceHolder = (currentEditingElementId: string): string => { - if (currentEditingElementId && currentEditingElementId.indexOf(this.mentionPlacerHolderPrefix) > -1) { - const splits = currentEditingElementId.split('-'); - return splits[2]; - } - return null; - }; - - private _cleanup(editor: CKEDITOR.editor, mentionId: string, unwrapOnly?): void { - const mentionState = this._retrieveMentionState(editor.id, mentionId); - const mentionPlaceHolderId = mentionState.mentionPlaceHolderId; - const mentionPlaceHolderDom = editor.document.getById(mentionPlaceHolderId); - if (unwrapOnly) { - const range = editor.createRange(); - if (range && mentionPlaceHolderDom) { - range.moveToClosestEditablePosition(mentionPlaceHolderDom, true); - $(mentionPlaceHolderDom.$).contents().unwrap(); - range.select(); - } - } else { - // remove the mentionPlaceHolder - mentionPlaceHolderDom.remove(); - } - // cleanup the mention directive - const mentionScope = mentionState.mentionScope; - mentionScope.$destroy(); - // remove the mention dom - const mentionElement = mentionState.mentionElement; - mentionElement.remove(); - // remove the mention state - delete this.mentions[MentionService._getMentionStateId(editor.id, mentionId)]; - } - - private _handleSpecialKeys( - evt: CKEDITOR.eventInfo>, - mentionId: string, - editor: CKEDITOR.editor, - projectId: string, - refId: string - ): void { - switch (evt.data.$.which) { - case 38: // up arrow - this._handleArrowKey(mentionId, false); - break; - case 40: // down arrow - this._handleArrowKey(mentionId, true); - break; - case 13: // enter - this._handleEnterKey(editor.id, mentionId, projectId, refId); - break; - case 27: // esc - this._handleEscKey(editor, mentionId); - } - } - - private _getMentionItem = (key: string, projectId: string, refId: string): ElementObject => { - const cfListing = this.getFastCfListing(projectId, refId); - return cfListing.find((cf) => { - return cf.id + cf.type === key; - }); - }; - - private _handleEnterKey = (editorId: string, mentionId: string, projectId: string, refId: string): void => { - const matchDom = $('#' + mentionId + ' .active .mentionMatch'); - if (matchDom.length > 0) { - const key = matchDom.attr('id'); - const mentionItem = this._getMentionItem(key, projectId, refId); - const mentionState = this._retrieveMentionState(editorId, mentionId); - mentionState.mentionController.selectMentionItem(mentionItem); - } - }; - - private _handleEscKey(editor: CKEDITOR.editor, mentionId: string): void { - this._cleanup(editor, mentionId, true); - } - - private _handleArrowKey = (mentionId: string, isDownArrow: boolean): void => { - const popUpEl = $('#' + mentionId); - const allOptions = popUpEl.find('li'); - const len = allOptions.length; - let activeIndex = -1; - allOptions.each((index) => { - if ($(this).hasClass('active')) { - activeIndex = index; - } - }); - if (activeIndex !== -1) { - let nextIndex: number; - if (isDownArrow) { - nextIndex = (activeIndex + 1) % len; - } else { - if (activeIndex === 0) { - nextIndex = len - 1; - } else { - nextIndex = (activeIndex - 1) % len; - } - } - const target = $(allOptions[nextIndex]); - target.addClass('active'); - $(allOptions[activeIndex]).removeClass('active'); - // scroll if necessary - (target[0].parentNode).scrollTop = target[0].offsetTop; - } - }; - - private _repositionDropdownIfOffScreen(editor: CKEDITOR.editor, mentionState: MentionState): void { - // wait for dropdown result to render so that we can determine whether it is on/off-screen - this.$timeout( - () => { - const mentionElement = mentionState.mentionElement; - const dropdownResultElement = mentionElement.find('ul.dropdown-menu'); - if (dropdownResultElement.children().length > 0 && !dropdownResultElement.isOnScreen()) { - const ckeditorBox = MentionService._getCkeditorFrame(editor).getBoundingClientRect(); - mentionElement.css({ - top: ckeditorBox.top, - left: ckeditorBox.left, - }); - } - }, - 0, - false - ).then( - () => { - /*Do Nothing*/ - }, - () => { - /*Do Nothing*/ - } - ); - } -} - -veCore.service('MentionService', MentionService); diff --git a/src/ve-core/editor/services/index.ts b/src/ve-core/editor/services/index.ts deleted file mode 100644 index bc9551bf3..000000000 --- a/src/ve-core/editor/services/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -//Services -import './Editor.service'; -import './Mention.service'; -import './EditDialog.service'; - -export * from './Editor.service'; -export * from './Mention.service'; -export * from './EditDialog.service'; diff --git a/src/ve-core/events.d.ts b/src/ve-core/events.d.ts deleted file mode 100644 index 550a0d5d2..000000000 --- a/src/ve-core/events.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { ElementObject, ElementsRequest } from '@ve-types/mms'; - -export namespace veCoreEvents { - interface elementSelectedData extends ElementsRequest { - rootId?: string; - refType?: string; - displayOldSpec?: boolean; - refresh?: boolean; - } - - interface elementUpdatedData { - element: ElementObject; - continueEdit?: boolean; - } - interface buttonClicked { - $event?: JQuery.ClickEvent; - clicked: string; - } - - interface toolbarClicked { - id: string; - category?: string; - title?: string; - } - - abstract interface setToolbarData { - tbId: string; - id: string; - value: T; - } - - type setPermissionData = setToolbarData; - type setIconData = setToolbarData; - type setToggleData = setToolbarData; -} diff --git a/src/ve-core/index.ts b/src/ve-core/index.ts deleted file mode 100644 index bc5ad6acf..000000000 --- a/src/ve-core/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -//VE Modules -// import '@ve-utils' - -//Module Main -import './ve-core.module'; - -// Core Component Libraries -import './modals'; -import './button-bar'; -import './toolbar'; -import './editor'; -import './search'; - -export * from './ve-core.module'; diff --git a/src/ve-core/modals/confirm-delete-modal.component.ts b/src/ve-core/modals/confirm-delete-modal.component.ts deleted file mode 100644 index bfaf7ee63..000000000 --- a/src/ve-core/modals/confirm-delete-modal.component.ts +++ /dev/null @@ -1,100 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; - -import { VeModalControllerImpl } from '@ve-utils/modals/ve-modal.controller'; - -import { veCore } from '@ve-core'; - -import { VeComponentOptions, VePromise } from '@ve-types/angular'; -import { RefsResponse } from '@ve-types/mms'; -import { VeModalController, VeModalResolve, VeModalResolveFn } from '@ve-types/view-editor'; - -export interface ConfirmDeleteModalResolve extends VeModalResolve { - getType: string; - getName: string; - finalize(): VePromise; -} - -export interface ConfirmDeleteModalResolveFn extends VeModalResolveFn { - getType(): string; - getName(): string; - finalize(): () => VePromise; -} - -const ConfirmDeleteModalComponent: VeComponentOptions = { - selector: 'confirmDeleteModal', - template: ` - - - - - -`, - bindings: { - modalInstance: '<', - resolve: '<', - }, - controller: class ConfirmDeleteModalController extends VeModalControllerImpl implements VeModalController { - static $inject = ['growl']; - - protected resolve: ConfirmDeleteModalResolve; - - //local - public oking: boolean; - public type: string; - public name: string; - - constructor(private growl: angular.growl.IGrowlService) { - super(); - } - - $onInit(): void { - this.oking = false; - this.type = this.resolve.getType; - this.name = this.resolve.getName; - } - - ok = (): void => { - if (this.oking) { - this.growl.info('Please wait...'); - return; - } - this.oking = true; - if (this.resolve.finalize) { - this.resolve.finalize().then( - () => { - this.growl.success(_.upperFirst(this.type) + ' Removed'); - this.oking = false; - this.modalInstance.close('ok'); - }, - (reason) => { - if (reason.message) { - this.growl.error(this.type + ' Removal Error: ' + reason.message); - } - this.oking = false; - this.modalInstance.dismiss(); - } - ); - } - }; - - cancel(): void { - this.modalInstance.dismiss(); - } - }, -}; - -veCore.component(ConfirmDeleteModalComponent.selector, ConfirmDeleteModalComponent); diff --git a/src/ve-core/modals/index.ts b/src/ve-core/modals/index.ts deleted file mode 100644 index 801fffdda..000000000 --- a/src/ve-core/modals/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -import './confirm-delete-modal.component'; - -export * from './confirm-delete-modal.component'; diff --git a/src/ve-core/search/index.ts b/src/ve-core/search/index.ts deleted file mode 100644 index c9ed03d72..000000000 --- a/src/ve-core/search/index.ts +++ /dev/null @@ -1,5 +0,0 @@ -import './mms-search.component'; - -export * from './mms-search.component'; - -import './mms-search-results.component'; diff --git a/src/ve-core/search/mms-search-buttons.config.ts b/src/ve-core/search/mms-search-buttons.config.ts deleted file mode 100644 index 6ece9040d..000000000 --- a/src/ve-core/search/mms-search-buttons.config.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { IButtonBarButton } from '@ve-core/button-bar'; - -export const search_default_buttons: IButtonBarButton[] = [ - { - selectable: false, - toggle: true, - tooltip: 'Documents', - id: 'search-filter-document', - icon: 'item-type-document', - type: 'Document', - }, - // { display: "Sections/Views", icon: null, type: "View", "Section" }, - { - selectable: false, - toggle: true, - tooltip: 'Text', - id: 'search-filter-paragraph', - icon: 'pe-type-paragraph', - type: 'Paragraph', - }, - { - selectable: false, - toggle: true, - tooltip: 'Tables', - id: 'search-filter-table', - icon: 'pe-type-table', - type: 'Table', - }, - { - selectable: false, - toggle: true, - tooltip: 'Images', - id: 'search-filter-image', - icon: 'pe-type-image', - type: 'Image', - }, - { - selectable: false, - toggle: true, - tooltip: 'Equations', - id: 'search-filter-equation', - icon: 'pe-type-equation', - type: 'Equation', - }, - { - selectable: false, - toggle: true, - tooltip: 'Comments', - id: 'search-filter-comment', - icon: 'pe-type-comment', - type: 'Comment', - }, - { - selectable: false, - toggle: true, - tooltip: 'Sections', - id: 'search-filter-section', - icon: 'pe-type-section', - type: 'Section', - }, - { - selectable: false, - toggle: true, - tooltip: 'Views', - id: 'search-filter-view', - icon: 'pe-type-view', - type: 'View', - }, - { - selectable: false, - toggle: true, - tooltip: 'Requirements', - id: 'search-filter-req', - icon: 'pe-type-req', - type: 'Requirement', - }, -]; diff --git a/src/ve-core/search/mms-search-results.component.ts b/src/ve-core/search/mms-search-results.component.ts deleted file mode 100644 index b3137e4f8..000000000 --- a/src/ve-core/search/mms-search-results.component.ts +++ /dev/null @@ -1,154 +0,0 @@ -import { IComponentController } from 'angular'; - -import { SearchController } from '@ve-core/search'; - -import { veCore } from '@ve-core'; - -import { VeComponentOptions } from '@ve-types/angular'; -import { ElementObject } from '@ve-types/mms'; - -export class MmsSearchResultsController implements IComponentController { - //Parent Controllers - private $search: SearchController; - - //Bindings - private elem: ElementObject; - - $onChanges; -} -const MmsSearchResultsComponent: VeComponentOptions = { - selector: 'mmsSearchResults', - require: { - $search: '^^mmsSearch', - }, - bindings: { - elem: ' - - {{$ctrl.elem.name}} - - - - -
    -
    - {{qualifiedNameFormatter($ctrl.elem._qualifiedName)}} -
    -
    -
    - -
    -
    - -
    -
    - -
    - {{$ctrl.elem.documentation.length > 270 ? ' ...' : ''}} - - {{$ctrl.$search.emptyDocTxt}} - -
    -
    - - - - - -
    - -
    - {{$ctrl.elem.type}} - - - - - -
    -
    -
    -
    Last modified {{$ctrl.elem._modified | date:'M/d/yy h:mm a'}} by {{$ctrl.elem._modifier}}
    -
    - `, - controller: MmsSearchResultsController, -}; - -veCore.component(MmsSearchResultsComponent.selector, MmsSearchResultsComponent); diff --git a/src/ve-core/search/mms-search.component.ts b/src/ve-core/search/mms-search.component.ts deleted file mode 100644 index 7d2d10f0b..000000000 --- a/src/ve-core/search/mms-search.component.ts +++ /dev/null @@ -1,982 +0,0 @@ -import { StateService } from '@uirouter/angularjs'; -import _ from 'lodash'; - -import { ButtonBarApi, ButtonBarService } from '@ve-core/button-bar'; -import { veCoreEvents } from '@ve-core/events'; -import { search_default_buttons } from '@ve-core/search/mms-search-buttons.config'; -import { UtilsService } from '@ve-utils/application'; -import { CacheService, EventService } from '@ve-utils/core'; -import { ElementService, ProjectService, ViewService, ValueService } from '@ve-utils/mms-api-client'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veCore } from '@ve-core'; - -import { VeComponentOptions, VePromise, VeQService } from '@ve-types/angular'; -import { - DocumentObject, - ElementObject, ElementsRequest, - MountObject, - ProjectObject, - QueryObject, - RequestObject, - SearchResponse, - ViewObject, -} from '@ve-types/mms'; -import { VeSearchOptions } from '@ve-types/view-editor'; - -export interface SearchQuery { - searchText: string; - selectedSearchMetatypes: any[]; - searchField: SearchField; - from?: number; - size?: number; -} - -export interface AdvancedSearchQuery extends SearchQuery { - operator: string; -} - -export interface SearchField { - id: string; - label: string; -} - -export interface SearchFilter { - appliedStereotypeIds?: string[]; - classifierIds?: string[]; -} - -export interface SearchObject extends ViewObject { - allRelatedDocuments?: ViewObject[]; - remainingRelatedDocuments?: ViewObject[]; -} - -/** - * @ngdoc directive - * @name veCore.directive:mmsSearch - * - * * TBA - * - * @scope - * - */ -export class SearchController implements angular.IComponentController { - private mmsOptions: VeSearchOptions; - private mmsProjectId: string; - private mmsRefId: string; - private embedded: boolean; - - //Search Results - private metatypeSearch: string; - protected searchResults: ElementObject[] = []; - protected baseSearchResults: ElementObject[] = []; - protected filteredSearchResults: ElementObject[] = []; - protected showFilterOptions: boolean; - protected searchLoading: boolean = false; - protected firstSearch: boolean = true; - protected mainSearch: SearchQuery = { - searchText: '', - searchField: { - id: 'all', - label: 'All Fields', - }, - selectedSearchMetatypes: [], - }; - protected docsviews: { selected: boolean } = { - selected: false, - }; - private emptyDocTxt: string; - protected refId: string; - // Search result settings - protected activeFilter: any[] = []; - - // Pagination settings - protected totalResults: number = 0; - protected paginationCache: { [key: number]: ElementObject[] } = {}; - private maxPages: number; - protected currentPage: number = 0; - protected itemsPerPage: number = 10; - // Advanced search settings - protected advanceSearch: boolean = false; - protected advancedSearchResults: boolean; - protected advanceSearchRows: AdvancedSearchQuery[] = []; - protected stringQuery = this.mainSearch.searchText; - - // View property settings - protected showSearchResultProps = false; - protected switchText = 'More'; - protected limitForProps = 6; - - // Set search options - public fieldTypeList: SearchField[] = [ - { - id: 'all', - label: 'All Fields', - }, - { - id: 'name', - label: 'Name', - }, - { - id: 'documentation', - label: 'Documentation', - }, - { - id: 'value', - label: 'Value', - }, - { - id: 'id', - label: 'ID', - }, - /*{ - id: 'type', - label: 'Metatype', - },*/ - ]; - - public operatorList = ['And', 'Or', 'And Not']; - - // settings for multiselect metatype dropdown - public metatypeSettings = { - scrollableHeight: '300px', - scrollable: true, - enableSearch: true, - displayProp: 'name', - showCheckAll: false, - smartButtonMaxItems: 10, - buttonClasses: '', - }; - - // event handler for multiselect metatype dropdown - public multiselectEvent: { - onItemSelect(ob): void; - onItemDeselect(ob): void; - onDeselectAll(ob): void; - }; - - bbId: string; - bbApi: ButtonBarApi; - private filterList: QueryObject[] = []; - - private schema = 'cameo'; - - static $inject = [ - '$q', - '$timeout', - '$anchorScroll', - '$state', - 'growl', - 'CacheService', - 'EventService', - 'ElementService', - 'ProjectService', - 'UtilsService', - 'ViewService', - 'ValueService', - 'SchemaService', - 'ButtonBarService', - ]; - - constructor( - private $q: VeQService, - private $timeout: angular.ITimeoutService, - private $anchorScroll: angular.IAnchorScrollService, - private $state: StateService, - private growl: angular.growl.IGrowlService, - private cacheSvc: CacheService, - private eventSvc: EventService, - private elementSvc: ElementService, - private projectSvc: ProjectService, - private utilsSvc: UtilsService, - private viewSvc: ViewService, - private valueSvc: ValueService, - private schemaSvc: SchemaService, - private buttonBarSvc: ButtonBarService - ) {} - - $onInit(): void { - this.showFilterOptions = !this.mmsOptions.hideFilterOptions; - if (this.showFilterOptions) { - this.bbId = this.buttonBarSvc.generateBarId('mms-search'); - this.bbApi = this.buttonBarSvc.initApi(this.bbId, this.bbInit, search_default_buttons); - this.eventSvc.$on(this.bbId, (data) => { - this.bbApi.toggleButton(data.clicked); - this.filterSearchResults(this.buttonBarSvc.getButtonDefinition(data.clicked).type); - }); - } - this.refId = this.mmsRefId ? this.mmsRefId : 'master'; - - // Set functions - void this.projectSvc.getProjectMounts(this.mmsProjectId, this.refId); - //ensure project mounts object is cached - // Function used to get string value of metatype names for advanced search - - //this.getMetaTypes(); //no way to make custom elastic query - - this.multiselectEvent = { - onItemSelect: (ob): void => { - void this.$timeout(() => { - this.stringQueryUpdate(); - }, 500); - }, - onItemDeselect: (ob): void => { - void this.$timeout(() => { - this.stringQueryUpdate(); - }, 500); - }, - onDeselectAll: (ob): void => { - void this.$timeout(() => { - this.stringQueryUpdate(); - }, 500); - }, - }; - - this.addAdvanceSearchRow(); // Second row created by default - - // Set options - if (this.mmsOptions.searchResult) { - const data1 = this.mmsOptions.searchResult; - this.searchResults = data1; - this.paginationCache[0] = data1; - } - if (this.mmsOptions.searchField) { - for (const field of this.fieldTypeList) { - if (this.mmsOptions.searchField === field.label || this.mmsOptions.searchField === field.id) { - this.mainSearch.searchField = field; - break; - } - } - } - if (this.mmsOptions.searchInput) { - this.mainSearch.searchText = this.mmsOptions.searchInput; - this.newSearch(this.mainSearch); - } - if (this.mmsOptions.itemsPerPage) { - this.itemsPerPage = this.mmsOptions.itemsPerPage; - } - if (this.mmsOptions.emptyDocTxt) { - this.emptyDocTxt = this.mmsOptions.emptyDocTxt; - } - } - - handleChange = (newVal: ElementObject[]): void => { - if (!newVal) return; - if (!this.mmsOptions.getProperties) { - return; - } - newVal.forEach((elem) => { - if (elem._properties) { - return; - } - // mms does not return properties will need to make a call for the results whose type is Class - // Call this.elementSvc.getOwnedElements with depth of 2 - // filter out results that have type = to Property and Slot - // for Property check that ownerId is same as the class id - if (elem.type === 'Class' || elem.type === 'Component') { - const reqOb: ElementsRequest = { - elementId: elem.id, - projectId: elem._projectId, - refId: elem._refId, - }; - const query = { - params: { - ownerId: elem.id, - }, - }; - this.elementSvc.search(reqOb, query).then( - (data) => { - const properties: ElementObject[] = []; - //TODO might not be elements - data.elements.forEach((elt) => { - if (this.valueSvc.isValue(elt)) properties.push(elt); - }); - elem._properties = properties; - // OLD CODE - splits into 3cols - // if (elem._properties && elem._properties[0]) { - // var properties2 = []; - // for (let i = 0; i < elem._properties.length; i++) { - // if (i % 3 === 0) { - // properties2.push([]); - // } - // properties2[properties2.length - 1].push(elem._properties[i]); - // } - // elem._properties2 = properties2; - // } - }, - (reason) => { - this.growl.error(reason.message); - } - ); - } - }); - }; - - bbInit = (api: ButtonBarApi): void => { - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-document')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-paragraph')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-table')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-image')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-equation')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-comment')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-section')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-view')); - api.addButton(this.buttonBarSvc.getButtonBarButton('search-filter-req')); - }; - - public qualifiedNameFormatter = (qualifiedName: string): string => { - if (qualifiedName) { - const parts = qualifiedName.split('/'); - let result = qualifiedName; - if (parts.length > 7) { - result = parts.slice(0, 4).join('/') + '/.../' + parts.slice(parts.length - 3, parts.length).join('/'); - } - return result; - } - }; - - public expandQualifiedName = ($event: JQuery.ClickEvent, qualifiedName: string): void => { - ($event.currentTarget as HTMLElement).innerHTML = qualifiedName; - }; - - public showMoreRelatedViews = (element: SearchObject): void => { - element.remainingRelatedDocuments = element.allRelatedDocuments.slice(3, element.allRelatedDocuments.length); - }; - - public closeSearch = (): void => { - if (this.mmsOptions.closeCallback) { - this.mmsOptions.closeCallback(); - } else { - void this.$state.go('main.project.ref.portal', { search: null, field: null }, { reload: true }); - } - }; - - public advancedSearchHandler = (): void => { - /* TODO: Reimplement Advanced Search */ - }; - - // Get metatypes for dropdown options - public getMetaTypes = (): void => { - // this.metatypeSearch = "fa fa-spin fa-spinner"; - // this.projectSvc.getMetatypes(scope.mmsProjectId, scope.refId) - // .then((data) => { - // // cache metatypes - // scope.metatypeList = data; - // }, (reason) => { - // growl.error("Search Error: " + reason.message); - // }).finally(() => { - // scope.metatypeSearch = ""; - // }); - this.advancedSearchHandler(); - }; - - public getMetatypeSelection = (id: string): string => { - const mainElement = angular.element(id); - return mainElement.find('div').attr('value'); - }; - - public getTypeClass = (element: ElementObject): string => { - // Get Type - return this.utilsSvc.getElementTypeClass(element, this.viewSvc.getElementType(element)); - }; - - // Filter options - public getActiveFilterClass = (item: unknown[]): boolean => { - if (!this.activeFilter.length) { - return false; - } - return _.includes(this.activeFilter, item); - }; - - public filterSearchResults = (type: string): void => { - const tempArr = _.clone(this.activeFilter); - if (_.includes(this.activeFilter, type)) { - _.pull(this.activeFilter, type); - } else { - this.activeFilter.push(type); - } - this._applyFiltersAndPaginate(); - }; - - private _applyFiltersAndPaginate = (): void => { - if (!this.activeFilter.length) { - this.filteredSearchResults = this.searchResults; - } else { - this.filteredSearchResults = _.filter(this.baseSearchResults, (item) => { - return _.includes(this.activeFilter, this.viewSvc.getElementType(item)); - }); - } - this.maxPages = Math.ceil(this.filteredSearchResults.length / this.itemsPerPage); - for (const pg of [...Array(this.maxPages).keys()]) { - this.paginationCache[pg] = this.searchResults.slice(pg * this.itemsPerPage, (pg + 1) * this.itemsPerPage); - } - }; - - // var findRefineOptions = (results) => { - // var presentationElements = _.map(results, this.viewSvc.getElementType); - // var uniqTypes = _.uniq(presentationElements); - // scope.filterOptions = _.difference(uniqTypes, [false, undefined, '']); - // }; - - /** - * @name veCore.directive:mmsSearch#stringQueryUpdate - * Updates advanced search main query input - */ - public stringQueryUpdate = (): void => { - const rowLength = this.advanceSearchRows.length; - this.stringQuery = Array(rowLength + 1).join('('); - this.stringQuery += this.mainSearch.searchField.label + ':'; - if (this.mainSearch.searchField.id === 'metatype') { - this.stringQuery += this.getMetatypeSelection('#searchMetatypeSelectAdvance'); - } else { - this.stringQuery += this.mainSearch.searchText; - } - for (let i = 0; i < rowLength; i++) { - this.stringQuery += - ' ' + - this.advanceSearchRows[i].operator.toUpperCase() + - ' ' + - this.advanceSearchRows[i].searchField.label + - ':'; - if (this.advanceSearchRows[i].searchField.id === 'metatype') { - this.stringQuery += this.getMetatypeSelection('#searchMetatypeSelect-' + i.toString()) + ')'; - } else { - this.stringQuery += this.advanceSearchRows[i].searchText + ')'; - } - } - }; - - /** - * @name veCore.directive:mmsSearch#addAdvanceSearchRow - * Adds new row with empty fields and updates advanced search main query input - */ - public addAdvanceSearchRow = (): void => { - this.advanceSearchRows.push({ - operator: 'And', - searchField: { - id: 'all', - label: 'All Fields', - }, - searchText: '', - selectedSearchMetatypes: [], - }); - this.stringQueryUpdate(); - }; - /** - * @name veCore.directive:mmsSearch#removeRowAdvanceSearch - * Removes selected row and updates advanced search main query input - * - * @param {object} row advanced search row - */ - public removeRowAdvanceSearch = (row: AdvancedSearchQuery): void => { - this.advanceSearchRows = _.without(this.advanceSearchRows, row); - this.stringQueryUpdate(); - }; - - public modifyAdvanceSearch = (): void => { - this.advanceSearch = !this.advanceSearch; - this.advancedSearchResults = !this.advancedSearchResults; - }; - - public pageChanged = (): void => { - if (this.paginationCache[this.currentPage]) { - this.baseSearchResults = this.paginationCache[this.currentPage]; - } else { - this.search(this.mainSearch, this.currentPage, this.itemsPerPage); - } - }; - - /** - * @name veCore.directive:mmsSearch#search - * Call ElementService to make search post and get search results. Check for filterCallback - * to further filter search results. Reassign pagination variables. - * - * @param {object} query search type and keyword from user input - * @param {number} page page number of search results - * @param {number} numItems number of items to return per page - */ - public search = (query: SearchQuery, page: number, numItems: number): void => { - this.searchLoading = true; - if (!this.embedded) { - void this.$state.go('.', { - search: query.searchText, - field: query.searchField.id, - }); - } - const queryObs: QueryObject[] = this.buildQuery(query); - // for (const queryOb of queryObs) { - // queryOb.from = page * numItems + page - // queryOb.size = numItems - // } - const reqOb: RequestObject = { - projectId: this.mmsProjectId, - refId: this.refId, - }; - const promises: VePromise, SearchResponse>[] = []; - for (const queryOb of queryObs) { - promises.push(this._performSearch(reqOb, queryOb)); - } - - this.$q - .allSettled>(promises) - .then( - (data) => { - const elements: ElementObject[] = []; - this.searchResults = []; - this.totalResults = 0; - for (const d of data) { - elements.push(...d.value.elements); - this.totalResults = this.totalResults + d.value.total; - } - if (this.mmsOptions.filterCallback) { - const results = this.mmsOptions.filterCallback(elements); - if (results) { - this.searchResults = results; - } else { - this.searchResults = []; - } - } else if (elements.length > 0) { - this.searchResults = elements; - } - //this.handleChange(this.searchResults); //might make it too slow - this.combineRelatedViews(); - this.currentPage = page; - this._applyFiltersAndPaginate(); - this.baseSearchResults = this.paginationCache[page]; - if (this.advanceSearch) { - // scope.advanceSearch = !scope.advanceSearch; - this.advancedSearchResults = true; - } - - // scope.refineOptions = findRefineOptions(baseSearchResults); - }, - (reason) => { - this.growl.error('Search Error: ' + reason.message); - } - ) - .finally(() => { - this.searchLoading = false; - this.firstSearch = false; - }); - }; - - private _performSearch( - reqOb: RequestObject, - queryOb: QueryObject - ): VePromise, SearchResponse> { - return this.elementSvc.search(reqOb, queryOb); - } - - public newSearch = (query: SearchQuery): void => { - this.searchResults.length = 0; - this.searchLoading = true; - this.paginationCache = {}; - this.search(query, 0, this.itemsPerPage); - }; - - /** - * @name veCore.directive:mmsSearch#getProjectMountsQuery - * Create a JSON object that returns a term key with a list of all mounted - * project ids within the current project. - * - * Elastic format - * - * @return {object} Elastic query JSON object with list of project mounts - */ - getProjectMountsQuery = (): VePromise => { - const deferred: angular.IDeferred = this.$q.defer(); - const projList: MountObject[] = []; - - const mountCacheKey = ['project-mounts', this.mmsProjectId, this.refId]; - if (this.cacheSvc.exists(mountCacheKey)) { - const project = this.cacheSvc.get(mountCacheKey); - this.getAllMountsAsArray(project, projList); - deferred.resolve(projList); - } else { - // Get project element data to gather mounted project list - this.projectSvc.getProjectMounts(this.mmsProjectId, this.refId).then( - (project) => { - this.getAllMountsAsArray(project, projList); - deferred.resolve(projList); - }, - (reason) => { - this.growl.error('Problem getting Project Mounts:' + reason.message); - deferred.resolve(projList); - } - ); - } - return deferred.promise; - }; - - /** - * @name veCore.directive:mmsSearch#getAllMountsAsArray - * Use projectsList to populate list with all the mounted project ids for - * specified project. - * - */ - public getAllMountsAsArray = (project: ProjectObject, projectsList: ProjectObject[]): void => { - projectsList.push(project); - const mounts = (project as MountObject)._mounts; - if (Array.isArray(mounts) && mounts.length !== 0) { - for (let i = 0; i < mounts.length; i++) { - if (mounts[i]._mounts) { - this.getAllMountsAsArray(mounts[i], projectsList); - } - } - } - }; - - public buildSearchClause = (query): void => { - /*TODO*/ - }; - - /** - * @name veCore.directive:mmsSearch#buildQuery - * Build JSON object for Elastic query. - * - * - * @return {object} {{query: {bool: {must: *[]}}}} JSON object from post data. - */ - public buildQuery = (query: SearchQuery): QueryObject[] => { - // Set project and mounted projects filter - //var projectList = this.getProjectMountsQuery() - const filterTerms: { [key: string]: string[] } = {}; - const filterQueries: QueryObject[] = []; - const queryObs: QueryObject[] = []; - this.filterList = []; - - if (query.searchField.id === 'all') { - for (const type of this.fieldTypeList) { - if (type.id !== 'all') { - const queryOb: QueryObject = { params: {} }; - if (type.id === 'value') { - queryObs.push({params: {'value.value': query.searchText}}); - queryOb.params['defaultValue.value'] = query.searchText; - } else { - queryOb.params[type.id] = query.searchText; - } - queryObs.push(queryOb); - } - } - } else { - const queryOb: QueryObject = { params: {} }; - if (query.searchField.id === 'value') { - queryObs.push({params: {'value.value': query.searchText}}); - queryOb.params['defaultValue.value'] = query.searchText; - } else { - queryOb.params[query.searchField.id] = query.searchText; - } - queryObs.push(queryOb); - } - - if (this.mmsOptions.filterQueryList) { - for (const filterQuery of this.mmsOptions.filterQueryList) { - for (const [term, list] of Object.entries(filterQuery())) { - if (!filterTerms[term]) { - filterTerms[term] = []; - } - - filterTerms[term].push( - ...list.filter((value) => { - return filterTerms[term].includes(value); - }) - ); - } - } - } - if (this.docsviews.selected) { - const stereoIds = [ - this.schemaSvc.getSchema('VIEW_SID', this.schema), - this.schemaSvc.getSchema('DOCUMENT_SID', this.schema), - ...this.schemaSvc.getSchema('OTHER_VIEW_SID', this.schema), - ]; - /*If the filter list already contain the view id's do not add them a second time since filtering is done - client side */ - if (!filterTerms.appliedStereotypeIds) { - filterTerms.appliedStereotypeIds = []; - } - filterTerms.appliedStereotypeIds.push( - ...stereoIds.filter((value) => { - return !filterTerms.appliedStereotypeIds.includes(value); - }) - ); - } - - if (Object.entries(filterTerms).length > 0) { - for (const queryOb of queryObs) { - for (const [term, list] of Object.entries(filterTerms)) { - if (list.length > 0) { - for (const sid of list) { - const newOb = _.cloneDeep(queryOb); - newOb.params[term] = sid; - filterQueries.push(newOb); - } - } - } - } - } - if (filterQueries.length > 0) return filterQueries; - else return queryObs; - }; - - private combineRelatedViews = (): void => { - this.searchResults.forEach((element: ViewObject) => { - const allRelatedDocuments: { - relatedDocument: ViewObject; - relatedView: ViewObject; - }[] = []; - if (element._relatedDocuments) { - element._relatedDocuments.forEach((relatedDoc: ViewObject) => { - if (relatedDoc._parentViews) { - relatedDoc._parentViews.forEach((parentView) => { - allRelatedDocuments.push({ - relatedDocument: relatedDoc, - relatedView: parentView, - }); - }); - } - }); - } - element.allRelatedDocuments = allRelatedDocuments; - element.someRelatedDocuments = allRelatedDocuments.slice(0, 3); - }); - }; - - public userResultClick = (elem: ElementObject, property: string): void => { - if (this.mmsOptions.callback) { - this.mmsOptions.callback(elem, property); - } - }; - - public userRelatedClick = ( - event: JQuery.ClickEvent, - doc: DocumentObject, - view: ViewObject, - elem: ElementObject - ): void => { - event.preventDefault(); - event.stopPropagation(); - if (this.mmsOptions.relatedCallback) this.mmsOptions.relatedCallback(doc, view, elem); - }; - - private toggleDocs(): void { - this.docsviews.selected = !this.docsviews.selected; - } -} -const SearchComponent: VeComponentOptions = { - selector: 'mmsSearch', - template: ` - - - `, - bindings: { - mmsOptions: '<', - mmsProjectId: '@', - mmsRefId: '@', - embedded: '<', - }, - controller: SearchController, -}; - -veCore.component(SearchComponent.selector, SearchComponent); diff --git a/src/ve-core/toolbar/index.ts b/src/ve-core/toolbar/index.ts deleted file mode 100644 index fad0112f2..000000000 --- a/src/ve-core/toolbar/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -//Exports -export * from './services/Toolbar.service'; -export * from './services/Toolbar.api'; - -//Services -import './services/Toolbar.service'; - -//Core Components -import './tool-bar.component'; diff --git a/src/ve-core/toolbar/services/Toolbar.api.ts b/src/ve-core/toolbar/services/Toolbar.api.ts deleted file mode 100644 index c77d107b1..000000000 --- a/src/ve-core/toolbar/services/Toolbar.api.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ToolButton } from '@ve-core/toolbar'; - -export class ToolbarApi { - public buttons: ToolButton[] = []; - - constructor(public id: string) {} - - public select = (id: string): void => { - this.buttons.forEach((button) => { - if (button.id === id && button.active) { - // button.selected = true; - // $scope.clicked(button); - if (!button.dynamic) { - this.buttons.forEach((b) => { - b.selected = b.id === button.id; - }); - - // de-activate all dynamic this.buttons - this.buttons.forEach((b) => { - if (b.dynamic) { - b.active = false; - } - }); - - if (button.dynamicButtons) { - button.dynamicButtons.forEach((b) => { - b.active = true; - }); - } - } - } - //else - // button.selected = false; - }); - }; - - public deactivate = (id: string): void => { - this.buttons.forEach((button) => { - if (button.id === id) { - if (button.dynamicButtons) { - // de-activate all dynamic buttons - button.dynamicButtons.forEach((b) => { - b.active = false; - }); - } - } - }); - }; - - public setPermission = (id: string, permission: boolean): void => { - this.buttons.forEach((button) => { - if (button.id === id) { - button.permission = permission; - } - }); - }; - - public setSelected = (id: string, selected: boolean): void => { - this.buttons.forEach((button) => { - if (button.id === id) { - button.selected = selected; - } - }); - }; - - public setIcon = (id: string, icon: string): void => { - this.buttons.forEach((button) => { - if (button.id === id) { - button.icon = icon; - } - }); - }; - - public addButton = (button: ToolButton): void => { - button.priority = this.buttons.length; - this.buttons.push(button); - if (button.dynamicButtons) { - let firstButton = true; - button.dynamicButtons.forEach((buttonLoop) => { - if (!this.buttons.map((button) => button.id).includes(buttonLoop.id)) { - if (firstButton) { - buttonLoop.pullDown = true; - firstButton = false; - } - buttonLoop.priority = this.buttons.length + 1000; - this.buttons.push(buttonLoop); - } - }); - } - }; - - public toggleButtonSpinner = (id: string): void => { - this.buttons.forEach((button) => { - if (button.id === id) { - if (button.spinner) { - button.icon = button.icon_original; - } else { - button.icon_original = button.icon; - button.icon = 'fa fa-spinner fa-spin'; - } - button.spinner = !button.spinner; - } - }); - }; -} diff --git a/src/ve-core/toolbar/services/Toolbar.service.ts b/src/ve-core/toolbar/services/Toolbar.service.ts deleted file mode 100644 index ebb658dfe..000000000 --- a/src/ve-core/toolbar/services/Toolbar.service.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { veCoreEvents } from '@ve-core/events'; -import { EventService } from '@ve-utils/core'; - -import { veCore } from '@ve-core'; - -import { ToolbarApi } from './Toolbar.api'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { VeConfig } from '@ve-types/config'; -import { VeApiObject } from '@ve-types/view-editor'; - -export interface IToolBarButton { - id: string; - icon: string; - tooltip: string; - category?: string; - icon_original?: string; - selected?: boolean; - active?: boolean; - permission?: boolean; - spinner?: boolean; - dynamic?: boolean; - priority?: number; - pullDown?: boolean; - onClick?: buttonOnClickFn; - dynamic_ids?: string[]; - disabledFor?: string[]; - enabledFor?: string[]; -} - -export interface buttonOnClickFn { - (button?: IToolBarButton): void; -} - -export interface toolbarInitFn { - (api: ToolbarApi): void; -} - -export class ToolButton implements IToolBarButton { - id: string; - category: string = 'global'; - icon: string = 'fa-gears'; - tooltip: string = 'Generic Button'; - icon_original: string = 'fa-gears'; - selected: boolean = false; - active: boolean = true; - permission: boolean; - spinner: boolean = false; - dynamic: boolean = false; - pullDown: boolean = false; - dynamicButtons: ToolButton[] = []; - disabledFor: string[] = []; - enabledFor: string[] = []; - priority: number = 0; - - constructor(id: string, tbutton?: IToolBarButton) { - this.id = id; - if (tbutton) { - Object.assign(this, tbutton); - } - } - - onClick: buttonOnClickFn; -} - -export class ToolbarService { - private toolbars: VeApiObject = {}; - private buttons: { [key: string]: IToolBarButton } = {}; - private dynamicButtons: { [key: string]: IToolBarButton } = {}; - private veConfig: VeConfig; - - static $inject = ['$q', 'EventService']; - - constructor(private $q: VeQService, private eventSvc: EventService) { - this.veConfig = window.__env; - if (this.veConfig.expConfig) { - for (const ext of Object.keys(this.veConfig.expConfig)) { - if (this.veConfig.expConfig[ext] && this.veConfig.expConfig[ext].length > 0) { - for (const tool of this.veConfig.expConfig[ext]) { - if (tool.toolButton) { - this.registerToolbarButtons(tool.toolButton); - } - if (tool.toolDynamicButton && tool.toolDynamicButton.length > 0) { - this.registerDynamicButtons(tool.toolDynamicButton); - } - } - } - } - } - } - - public waitForApi = (id: string): VePromise => { - if (!this.toolbars.hasOwnProperty(id)) { - this.toolbars[id] = {}; - this.toolbars[id].promise = new this.$q((resolve, reject) => { - this.toolbars[id].resolve = resolve; - this.toolbars[id].reject = reject; - }); - } - return this.toolbars[id].promise; - }; - - public initApi( - id: string, - init: toolbarInitFn, - ctrl: angular.IComponentController, - buttons?: IToolBarButton[], - dynamicButtons?: IToolBarButton[], - initialSelection?: string - ): ToolbarApi { - if (!id) { - throw new Error('Unable to create Toolbar, missing id'); - } - if (!this.toolbars[id]) { - this.toolbars[id] = {}; - } - if (!this.toolbars[id].resolve) { - this.toolbars[id].promise = new this.$q((resolve, reject) => { - this.toolbars[id].resolve = resolve; - this.toolbars[id].reject = reject; - }); - } - - // if (!ctrl.$onDestroy) { - // ctrl.$onDestroy = (): void => { - // this.destroyApi(id) - // } - // } - - const api = new ToolbarApi(id); - if (buttons && buttons.length > 0) { - this.registerToolbarButtons(buttons); - } - if (dynamicButtons && dynamicButtons.length > 0) { - this.registerDynamicButtons(dynamicButtons); - } - - init(api); - this.toolbars[id].api = api; - - if (api.buttons.length > 0) { - let inspect: IToolBarButton; - if (initialSelection) { - inspect = this.getToolbarButton(initialSelection); - } else { - inspect = api.buttons[0]; - } - - //Initialize Toolbar Clicked Subject - this.eventSvc.resolve(id, { - id: inspect.id, - title: inspect.tooltip, - }); - } - - this.toolbars[id].resolve(api); - return api; - } - - public destroyApi = (id: string): void => { - if (this.toolbars.hasOwnProperty(id)) { - delete this.toolbars[id]; - } - }; - - public registerToolbarButtons = (buttons: IToolBarButton | IToolBarButton[]): void => { - if (!Array.isArray(buttons)) { - buttons = [buttons]; - } - if (buttons.length > 0) { - for (const button of buttons) { - if (!this.buttons[button.id]) { - this.buttons[button.id] = button; - } - } - } - }; - public registerDynamicButtons = (dynamicButtons: IToolBarButton | IToolBarButton[]): void => { - if (!Array.isArray(dynamicButtons)) { - dynamicButtons = [dynamicButtons]; - } - if (dynamicButtons.length > 0) { - for (const button of dynamicButtons) { - if (!this.dynamicButtons[button.id]) { - this.dynamicButtons[button.id] = button; - } - } - } - }; - - public attachDynamicButtons; - - /** - * @name veUtils/ToolbarService#this.getToolbarButton - * Get pre-defined toolbar button - * - * @param {string} buttonId id - * @param generic - * @returns {Object} Button object - */ - public getToolbarButton = (buttonId: string): ToolButton => { - if (this.buttons.hasOwnProperty(buttonId)) { - const newButton = new ToolButton(buttonId, this.buttons[buttonId]); - if (this.buttons[buttonId].dynamic_ids) { - newButton.dynamicButtons = []; - for (const id of this.buttons[buttonId].dynamic_ids) { - newButton.dynamicButtons.push(new ToolButton(id, this.getDynamicButton(id))); - } - } - return newButton; - } else { - return (this.buttons[buttonId] = new ToolButton(buttonId)); - } - }; - - public getDynamicButton = (button: string): IToolBarButton => { - if (this.dynamicButtons.hasOwnProperty(button)) { - return this.dynamicButtons[button]; - } - }; - - static error(reason?: VePromiseReason): string { - if (reason && reason.message) return 'Toolbar error: ' + reason.message; - else return 'Toolbar Error!'; - } -} - -veCore.service('ToolbarService', ToolbarService); diff --git a/src/ve-core/toolbar/tool-bar.component.ts b/src/ve-core/toolbar/tool-bar.component.ts deleted file mode 100644 index 76b8b9e62..000000000 --- a/src/ve-core/toolbar/tool-bar.component.ts +++ /dev/null @@ -1,127 +0,0 @@ -import { veCoreEvents } from '@ve-core/events'; -import { buttonOnClickFn, IToolBarButton } from '@ve-core/toolbar'; -import { RootScopeService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; - -import { veCore } from '@ve-core'; - -import { ToolbarService } from './services/Toolbar.service'; - -import { VeComponentOptions } from '@ve-types/angular'; - -const ToolBarComponent: VeComponentOptions = { - selector: 'toolBar', - template: ` -
    -
    -
    - -
    -
    -
    -`, - bindings: { - anchor: '<', - toolbarId: '@', - paneToggle: '&', - }, - controller: class VeToolbarController implements angular.IComponentController { - public subs: Rx.IDisposable[]; - - private anchor: string; - private toolbarId: string; - private paneToggle?(): void; - - public buttons: IToolBarButton[]; - - tooltipAnchor; - - static $inject = ['growl', 'RootScopeService', 'EventService', 'ToolbarService']; - - constructor( - private growl: angular.growl.IGrowlService, - private rootScopeSvc: RootScopeService, - private eventSvc: EventService, - private toolbarSvc: ToolbarService - ) {} - - $onInit(): void { - this.eventSvc.$init(this); - - if (this.anchor) { - switch (this.anchor) { - case 'left': - this.tooltipAnchor = 'right'; - break; - case 'right': - this.tooltipAnchor = 'left'; - break; - case 'top': - this.tooltipAnchor = 'bottom'; - break; - case 'bottom': - this.tooltipAnchor = 'top'; - break; - } - } else { - this.tooltipAnchor = 'left'; - } - - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => { - this.buttons = api.buttons; - if (this.buttons.length > 0) { - //Binding to catch all "clicks" on tb and execute select function - this.eventSvc.binding(this.toolbarId, (data) => { - this.toolbarSvc.waitForApi(this.toolbarId).then( - (api) => api.select(data.id), - (reason) => this.growl.error(ToolbarService.error(reason)) - ); - }); - } - }, - (reason) => { - this.growl.error(reason.message); - } - ); - } - public clicked = (button: IToolBarButton): void => { - if (!button.permission) { - return; - } - if (!button.active) { - return; - } - - if (this.paneToggle) { - this.paneToggle(); - } - - if (button.onClick) { - button.onClick(); - } else if (this.onClick) { - this.onClick(button); - } else { - this.growl.error('Button' + button.id + 'has no click function'); - } - }; - - protected onClick: buttonOnClickFn = (button) => { - if (!button.dynamic) { - this.eventSvc.resolve(this.toolbarId, { - id: button.id, - category: button.category, - title: button.tooltip, - }); - } else { - this.eventSvc.$broadcast(button.id); - } - }; - }, -}; - -veCore.component(ToolBarComponent.selector, ToolBarComponent); diff --git a/src/ve-core/ve-core.module.ts b/src/ve-core/ve-core.module.ts deleted file mode 100644 index 28334ca8a..000000000 --- a/src/ve-core/ve-core.module.ts +++ /dev/null @@ -1,104 +0,0 @@ -import angular from 'angular'; - -/** - * @ngdoc overview - * @name veCore - * - * @requires mms - * @requires ui.bootstrap - * @requires ui.sortable - * @requires angular-growl - * * # veCore module - * This module provides prebuilt components that are commonly used by the mms - * client applications, for example, cross referencing and element "spec window". - * Since this module contains directives with ui elements, there's more dependencies - * then just using the services module. In the future it will be more pick and - * choose instead of everything being in one module. - * - * ## Links to dependencies - * * [ui.bootstrap](http://angular-ui.github.io/bootstrap/) - * * [ui.sortable](https://github.com/angular-ui/ui-sortable) (this in turn depends on jquery and jqueryui) - * * [jQuery](http://jquery.com/) - * * [jQueryUI](http://jqueryui.com/) - * * [bootstrap](http://getbootstrap.com/) (for styling and css) - * * [angular-growl](https://github.com/JanStevens/angular-growl-2) - * * [font awesome](http://fortawesome.github.io/Font-Awesome/) - * - * ## Example app that uses this module - * The following example is an app that uses the directive mmsSpec to display - * a spec window for an element - * - * ### HTML (index.html) - *
    - 
    - 
    - 
    - Example app
    - 
    -  
    - 
    - 
    - 
    - 
    - 
    - - - - - - - - - - - - - - - - - - - - - - -
    - * ### JS (app.js) - *
    - angular.module('exampleApp', ['ve-utils', 've-core']);
    - 
    - */ - -export const veCore = angular.module('ve-core', [ - 've-utils', - 'ui.bootstrap', - 'angular-growl', - 'angularjs-dropdown-multiselect', - 'ui.tree-filter', -]); - -veCore - .config([ - '$sceProvider', - 'growlProvider', - 'uiTreeFilterSettingsProvider', - ( - $sceProvider: angular.ISCEProvider, - growlProvider: angular.growl.IGrowlProvider, - uiTreeFilterSettingsProvider - ): void => { - $sceProvider.enabled(false); - growlProvider.onlyUniqueMessages(false); - growlProvider.globalTimeToLive({ - success: 5000, - error: -1, - warning: 5000, - info: 5000, - }); - growlProvider.globalPosition('bottom-right'); - uiTreeFilterSettingsProvider.addresses = ['label']; - uiTreeFilterSettingsProvider.descendantCollection = 'children'; - }, - ]) - .constant('CKEDITOR', window.CKEDITOR); diff --git a/src/ve-extensions/experimental-magic/config.json b/src/ve-extensions/experimental-magic/config.json deleted file mode 100644 index 0a9c626db..000000000 --- a/src/ve-extensions/experimental-magic/config.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "specTools": [ - { - "name": "Spec Magic Test", - "path": "experimental-magic", - "button": { - "id": "spec-magic", - "category": "global", - "icon": "fa-magic", - "selected": true, - "active": true, - "permission": true, - "tooltip": "Magic!", - "spinner": false - } - } - ] -} diff --git a/src/ve-extensions/experimental-magic/index.ts b/src/ve-extensions/experimental-magic/index.ts deleted file mode 100644 index 2a93ca922..000000000 --- a/src/ve-extensions/experimental-magic/index.ts +++ /dev/null @@ -1 +0,0 @@ -import './spec-tools/spec-magic.component'; diff --git a/src/ve-extensions/experimental-magic/spec-tools/spec-magic.component.ts b/src/ve-extensions/experimental-magic/spec-tools/spec-magic.component.ts deleted file mode 100644 index 39f397226..000000000 --- a/src/ve-extensions/experimental-magic/spec-tools/spec-magic.component.ts +++ /dev/null @@ -1,72 +0,0 @@ -import angular from 'angular'; -import _ from 'lodash'; - -import { ComponentService } from '@ve-components/services'; -import { SpecTool, ISpecTool, SpecService } from '@ve-components/spec-tools'; -import { ToolbarService } from '@ve-core/toolbar'; -import { ApplicationService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { - ApiService, - ElementService, - PermissionsService, - ProjectService, - URLService, - ViewService, -} from '@ve-utils/mms-api-client'; - -import { veComponents } from '@ve-components'; - -import { VeComponentOptions, VeQService } from '@ve-types/angular'; - -class SpecMagicController extends SpecTool implements ISpecTool { - static $inject = [...SpecTool.$inject]; - - constructor( - $q: VeQService, - $scope: angular.IScope, - $element: JQuery, - growl: angular.growl.IGrowlService, - componentSvc: ComponentService, - uRLSvc: URLService, - elementSvc: ElementService, - projectSvc: ProjectService, - applicationSvc: ApplicationService, - apiSvc: ApiService, - viewSvc: ViewService, - permissionsSvc: PermissionsService, - eventSvc: EventService, - specSvc: SpecService, - toolbarSvc: ToolbarService - ) { - super( - $q, - $scope, - $element, - growl, - componentSvc, - uRLSvc, - elementSvc, - projectSvc, - applicationSvc, - apiSvc, - viewSvc, - permissionsSvc, - eventSvc, - specSvc, - toolbarSvc - ); - this.specType = _.kebabCase(SpecMagicComponent.selector); - this.specTitle = 'Magic Element'; - } -} - -const SpecMagicComponent: VeComponentOptions = { - selector: 'specMagic', - template: ` -

    Hello World!!

    -`, - controller: SpecMagicController, -}; - -veComponents.component(SpecMagicComponent.selector, SpecMagicComponent); diff --git a/src/ve-extensions/index.ts b/src/ve-extensions/index.ts deleted file mode 100644 index 3e118298f..000000000 --- a/src/ve-extensions/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -//** Automatically Generated by Webpack do not edit **// -import './experimental-magic' \ No newline at end of file diff --git a/src/ve-extensions/present-plots/Plot.service.ts b/src/ve-extensions/present-plots/Plot.service.ts deleted file mode 100644 index d6ef86c36..000000000 --- a/src/ve-extensions/present-plots/Plot.service.ts +++ /dev/null @@ -1,316 +0,0 @@ -import { UtilsService } from '@ve-utils/application/Utils.service'; -import { CacheService } from '@ve-utils/core'; -import { ElementService, URLService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -export class PlotService { - constructor( - private $q, - private $http, - private uRLSvc: URLService, - private utilsSvc: UtilsService, - private cacheSvc: CacheService, - private elementSvc: ElementService - ) {} - - //make only a-zA-Z0-9_ because id or class does not support special characters(ie., ()) - public toValidId = (original) => { - return original.replace(/[^a-zA-Z0-9_]/gi, ''); - }; - - /** - * @param {Object} clientConfig The size width, height and margin info from magicDraw - * @param {Object} defaultPlotConfig The size width, height and margin from the plot directive - */ - public plotConfig = (clientConfig, defaultPlotConfig) => { - const plotConfig = defaultPlotConfig; - if (clientConfig !== undefined) { - if (clientConfig.size !== undefined) { - if (clientConfig.size.width != undefined && !isNaN(clientConfig.size.width)) - plotConfig.width = Number(clientConfig.size.width); - if (clientConfig.size.height != undefined && !isNaN(clientConfig.size.height)) - plotConfig.height = Number(clientConfig.size.height); - } - if (clientConfig.padding !== undefined) { - if (clientConfig.padding.top != undefined && !isNaN(clientConfig.padding.top)) - plotConfig.marginTop = Number(clientConfig.padding.top); - if (clientConfig.padding.right != undefined && !isNaN(clientConfig.padding.right)) - plotConfig.marginRight = Number(clientConfig.padding.right); - if (clientConfig.padding.left != undefined && !isNaN(clientConfig.padding.left)) - plotConfig.marginLeft = Number(clientConfig.padding.left); - if (clientConfig.padding.bottom != undefined && !isNaN(clientConfig.padding.bottom)) - plotConfig.marginBottom = Number(clientConfig.padding.bottom); - } - } - return plotConfig; - }; - - public readValues2(plot, projectId, refId, commitId) { - const deferred = this.$q.defer(); - - const aMmsEid = { - projectId: projectId, - refId: refId, - commitId: commitId, - }; - const isHeader = plot.table.header !== undefined && plot.table.header.length > 0; - - if (isHeader) { - const aheader = this._asyncReadTableHeader(aMmsEid, plot.table.header[0]); - aheader.then((tableheader) => { - const abody = this._asyncReadTableBody2(aMmsEid, plot.table.body, tableheader); - abody.then((tablebody) => { - const r = { - tableheader: tableheader, - tablebody: tablebody, - isHeader: isHeader, - }; - deferred.resolve(r); - }); - }); - } else { - const abody = this._asyncReadTableBody(aMmsEid, plot.table.body); - abody.then((tablebody) => { - const r = { tablebody: tablebody, isHeader: isHeader }; - deferred.resolve(r); - }); - } - return deferred.promise; - } //end of readValues - - public readValues = (plot, projectId, refId, commitId) => { - const deferred = this.$q.defer(); - - const aMmsEid = { - projectId: projectId, - refId: refId, - commitId: commitId, - }; - const isHeader = plot.table.header !== undefined && plot.table.header.length > 0; - - if (isHeader) { - const aheader = this._asyncReadTableHeader(aMmsEid, plot.table.header[0]); - aheader.then((tableheader) => { - const abody = this._asyncReadTableBody(aMmsEid, plot.table.body); - abody.then((tablebody) => { - const r = { - tableheader: tableheader, - tablebody: tablebody, - isHeader: isHeader, - }; - deferred.resolve(r); - }); - }); - } else { - const abody = this._asyncReadTableBody(aMmsEid, plot.table.body); - abody.then((tablebody) => { - const r = { tablebody: tablebody, isHeader: isHeader }; - deferred.resolve(r); - }); - } - return deferred.promise; - }; //end of readValues - - private _asyncReadTableHeader = (aMmsEid, header) => { - return this.$q((resolve) => { - this._readRowValues(header, aMmsEid).then((tableheader) => { - tableheader.values.shift(); //remove 1st element - resolve(tableheader.values); - }); - }); - }; - - private _asyncReadTableBody = (aMmsEid, tablebody) => { - return this.$q((resolve) => { - const c3_data = []; - const valuesO = []; - - tablebody.forEach((row) => { - this._readRowValues(row, aMmsEid).then((yyvalue) => { - c3_data.push(yyvalue.values); - valuesO.push(yyvalue.valuesO); - if (c3_data.length === tablebody.length) { - const r = { - c3_data: c3_data, - valuesO: valuesO, - }; - resolve(r); - } - }); - }); - }); - }; - - private _asyncReadTableBody2(aMmsEid, tablebody, tableheader) { - return this.$q((resolve) => { - const c3_data = []; - const valuesO = []; - - //adding "rowheader" so length of header and rowvalues will be the same. - const mtableheader = tableheader.slice(0); - mtableheader.splice(0, 0, 'rowheader'); - tablebody.forEach((row) => { - this._readRowValues2(row, aMmsEid, mtableheader).then((yyvalue) => { - c3_data.push(yyvalue.valuesx); - valuesO.push(yyvalue.valuesO); - if (valuesO.length === tablebody.length) { - const r = { - c3_data: c3_data, - valuesO: valuesO, - }; - resolve(r); - } - }); - }); - }); - } - - private static _getValue(datavalue) { - if (datavalue && datavalue.type === 'LiteralString') { - if (isNaN(datavalue.value)) return datavalue.value; - else return Number(datavalue.value); - } else if (datavalue && (datavalue.type === 'LiteralReal' || datavalue.type === 'LiteralInteger')) { - return datavalue.value; - } - } - - private _readParagraphValue = (e, aMmsEid, index) => { - return this.$q((resolve) => { - if (e.content[0].sourceType == 'text') { - //console.log("text"); - let tv = e.content[0].text.replace('

    ', '').replace('

    ', '').trim(); - if (!isNaN(tv)) tv = Number(tv); - resolve({ index: index, value: tv, valueO: e }); - } else if (e.content[0].sourceType === 'reference') { - aMmsEid.elementId = e.content[0].source; - - if (e.content[0].sourceProperty === 'name') { - //console.log("name"); - this.elementSvc.getElement(aMmsEid, 1, false).then((refe) => { - //value = refe.name; - //valueO= refe; - let nameModified: number | string = refe.name; - if (!isNaN(Number(refe.name))) - //means its a number - nameModified = Number(refe.name); - resolve({ - index: index, - value: nameModified, - valueO: refe, - }); - }); - } else if (e.content[0].sourceProperty === 'documentation') { - //console.log("doc"); - this.elementSvc.getElement(aMmsEid, 1, false).then((refe) => { - let docModified: number | string = refe.documentation - .replace('

    ', '') - .replace('

    ', '') - .trim(); - //seems adding \n at the end when modified at vieweditor so if number goahead to conver to number - //i.e., "5\n" will be a number. - if (!isNaN(Number(docModified))) - //means it is a number - docModified = Number(docModified); - resolve({ - index: index, - value: docModified, - valueO: refe, - }); - }); - } else { - //sourceProperty === 'value' - //console.log('value'); - this.elementSvc.getElement(aMmsEid, 1, false).then((refe) => { - const valueO = refe; - let value = ''; - if (refe.type === 'Property' || refe.type === 'Port') { - if (refe.defaultValue) { - value = PlotService._getValue(refe.defaultValue); //default value - } else { - value = ''; - } - } - if (refe.type === 'Slot') { - value = PlotService._getValue(refe.value[0]); //scope.element.value - } - /* not sure what to do - if (refe.type === 'Constraint' && refe.specification) { - value = refe.specification; - } - if (refe.type === 'Expression') { - value = refe.operand; - } - */ - resolve({ - index: index, - value: value, - valueO: valueO, - }); - }); - } //end of else - } //reference - }); - }; - - private _readRowValues = (row, aMmsEid) => { - return this.$q((resolve) => { - const values = []; - const valuesO = []; - let index = 0; - row.forEach((e) => { - if (e.content.length === 0) { - values[index] = null; - valuesO[index] = null; - index++; - } else { - if (e.content[0].type == 'Paragraph') { - this._readParagraphValue(e, aMmsEid, index++).then((r) => { - values[r.index] = r.value; - valuesO[r.index] = r.valueO; - if (values.length === row.length) { - const result = { - values: values, - valuesO: valuesO, - }; - resolve(result); - } - }); - } // Paragraph - } //end of else - }); //for each row - }); - }; //end of function - private _readRowValues2(row, aMmsEid, mtableheader) { - return this.$q((resolve) => { - const valuesx = []; //named index instead of number index - const valuesO = []; - let index = 0; - row.forEach((e) => { - if (e.content.length === 0) { - valuesx[mtableheader[index]] = null; - valuesO[index] = null; - index++; - } else { - if (e.content[0].type == 'Paragraph') { - this._readParagraphValue(e, aMmsEid, index++).then((r) => { - valuesx[mtableheader[r.index]] = r.value; - valuesO[r.index] = r.valueO; - if (valuesO.length === row.length) { - const result = { - valuesx: valuesx, - valuesO: valuesO, - }; - resolve(result); - } - }); - } // Paragraph - } //end of else - }); //for each row - }); - } //end of function -} - -PlotService.$inject = ['$q', '$http', 'URLService', 'UtilsService', 'CacheService', 'ElementService']; - -veUtils.service('PlotService', PlotService); diff --git a/src/ve-extensions/present-plots/config.json b/src/ve-extensions/present-plots/config.json deleted file mode 100644 index 081bf39d3..000000000 --- a/src/ve-extensions/present-plots/config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "presentations": [ - { - "name": "C3/D3 Plots Extension", - "path": "present-plots" - } - ] -} diff --git a/src/ve-extensions/present-plots/presentations/components/index.ts b/src/ve-extensions/present-plots/presentations/components/index.ts deleted file mode 100644 index 4d62d5b3b..000000000 --- a/src/ve-extensions/present-plots/presentations/components/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import './mmsC3Plot.directive'; -import './mmsD3GroupedHorizontalBarPlot.directive'; -import './mmsD3LineGraph.directive'; -import './mmsD3NormalizedStackedBarPlot.directive'; -import './mmsD3ObservationProfileChartIo.directive'; -import './mmsD3ParallelAxisPlot.directive'; -import './mmsD3RadarPlot.directive'; diff --git a/src/ve-extensions/present-plots/presentations/components/mmsC3Plot.directive.ts b/src/ve-extensions/present-plots/presentations/components/mmsC3Plot.directive.ts deleted file mode 100644 index e8b8fbc55..000000000 --- a/src/ve-extensions/present-plots/presentations/components/mmsC3Plot.directive.ts +++ /dev/null @@ -1,98 +0,0 @@ -import { veComponents } from '@ve-components'; - -veComponents.directive('mmsC3Plot', ['PlotService', '$window', mmsC3Plot]); -function mmsC3Plot(PlotService, $window, _) { - const mmsChartLink = function (scope, element, attrs, mmsViewCtrl) { - const c3 = $window.c3; - const d3 = $window.d3; - const divchart = d3.select(element[0]).append('div'); - - let projectId; - let refId; - let commitId; - - if (mmsViewCtrl) { - const viewVersion = mmsViewCtrl.getElementOrigin(); - projectId = viewVersion.projectId; - refId = viewVersion.refId; - commitId = viewVersion.commitId; - } - - /** - * for any value that's not an object, assume it's a function string, - * eval it and assign to same key - * @param {*} object - */ - function simplifyFunctions(object) { - _.forOwn(object, function (value, key, ob) { - if (_.isPlainObject(value)) { - simplifyFunctions(value); - } else { - ob[key] = eval('(' + value + ')'); - } - }); - } - - function vf_pplot(c3json, c3jfunc) { - if (c3jfunc && _.isPlainObject(c3jfunc)) { - simplifyFunctions(c3jfunc); - _.merge(c3json, c3jfunc); - } - c3.generate(c3json); - } - - scope.render = function () { - PlotService.readValues(scope.plot, projectId, refId, commitId).then(function (value) { - scope.valuesO = value.tablebody.valuesO; //value objects used in watch - let c3options; - if (value.tablebody.c3_data.length === 0) { - //no data - return; - } - if (scope.plot.config.options === undefined || scope.plot.config.options.length === 0) { - if (value.isHeader) - c3options = { - data: { x: 'x', type: 'line' }, - axis: { x: { type: 'category', tick: { centered: true } } }, - }; - else c3options = { data: {} }; - } else c3options = scope.plot.config.options; - if ( - value.tablebody.c3_data.length === scope.plot.table.body.length && - c3options.data.xs === undefined && - value.isHeader - ) { - value.tablebody.c3_data.unshift(['x'].concat(value.tableheader)); - } - c3options.data.columns = value.tablebody.c3_data; - - let c3jfunc; - if (scope.plot.config.functions) { - c3jfunc = scope.plot.config.functions; - } - divchart.selectAll('*').remove(); - divchart.attr('id', 'c3chart' + scope.$id); - c3options.bindto = '#c3chart' + scope.$id; - - vf_pplot(c3options, c3jfunc); - }); - }; //end of render - - scope.$watch( - 'valuesO', - function (newVals, oldVals) { - return scope.render(); - }, - true - ); - }; //end of link - - return { - restrict: 'EA', - require: '?^view', - scope: { - plot: '<', - }, - link: mmsChartLink, - }; //return -} diff --git a/src/ve-extensions/present-plots/presentations/components/mmsD3GroupedHorizontalBarPlot.directive.ts b/src/ve-extensions/present-plots/presentations/components/mmsD3GroupedHorizontalBarPlot.directive.ts deleted file mode 100644 index 58c3b2163..000000000 --- a/src/ve-extensions/present-plots/presentations/components/mmsD3GroupedHorizontalBarPlot.directive.ts +++ /dev/null @@ -1,418 +0,0 @@ -import { veComponents } from '@ve-components'; -//d3js grouped horizontal bar chart is created by referencing -//http://bl.ocks.org/erikvullings/51cc5332439939f1f292 - -veComponents.directive('mmsD3GroupedHorizontalBarPlot', ['PlotService', '$window', mmsD3GroupedHorizontalBarPlot]); -function mmsD3GroupedHorizontalBarPlot(PlotService, $window) { - const mmsChartLink = function (scope, element, attrs, mmsViewCtrl) { - const d3 = $window.d3; - const divchart = d3.select(element[0]).append('div'); - const defaultPlotConfig = { - width: 960, - marginTop: 20, - marginRight: 40, - marginBottom: 30, - marginLeft: 40, - }; - const plotConfig = PlotService.plotConfig(scope.plot.config.options, defaultPlotConfig); - let achartdata; - element.click(function (e) { - //stop Propogating event to parent(transclude-doc) element. - e.stopPropagation(); - }); - - const d3colorR = d3.scaleOrdinal(d3.schemeCategory10).range(); - function getColor(data, i) { - return data.colors !== undefined ? d3colorR[data.colors[i]] : d3colorR[i]; - } - let projectId; - let refId; - let commitId; - - if (mmsViewCtrl) { - const viewVersion = mmsViewCtrl.getElementOrigin(); - projectId = viewVersion.projectId; - refId = viewVersion.refId; - commitId = viewVersion.commitId; - } - const opacitydefault = 1, //0.7, - opacityselected = 1.0, - opacitynotselected = 0.3; - - function mouseout() { - d3.selectAll('.ghbbar').transition(200).style('fill-opacity', opacitydefault); - - d3.selectAll('.legendRect').transition(200).style('fill-opacity', opacitydefault); - - d3.selectAll('.legentFilter').transition(200).style('opacity', opacitydefault); - } //end of function mouseout - - function mouseover(mouseoverClassId) { - d3.selectAll('.ghbbar').transition(200).style('fill-opacity', opacitynotselected); - - d3.selectAll('.legendRect').transition(200).style('fill-opacity', opacitynotselected); - - d3.selectAll('.legentFilter').transition(200).style('opacity', opacitynotselected); - - d3.selectAll(mouseoverClassId).transition(200).style('fill-opacity', opacityselected); - - d3.selectAll(mouseoverClassId).transition(200).style('opacity', opacityselected); - } //end of function mouseover - - function createFilters(data) { - //create only one filter display - const graphFilter = divchart - .append('div') - .attr('class', 'graphFilter ' + data.id) - .style('margin-left', plotConfig.marginLeft + 'px'); - const filterLegendsDiv = graphFilter - .append('div') - .append('label') - .style('border', '1px solid #ddd') - .text('Filter by Legends'); - filterLegendsDiv - .selectAll('div') - .data(data.legends) - .enter() - .append('div') - .attr('class', function (d, i) { - return 'legentFilter ' + data.id + ' ' + PlotService.toValidId(d); - }) - .attr('style', function (d, i) { - return 'opacity: ' + opacitydefault + ';background-color:' + getColor(data, i) + ';'; - }) - .on('mouseover', (d, i) => { - mouseover('.' + data.id + '.' + PlotService.toValidId(d)); - }) - .on('mouseout', (d, i) => { - mouseout(); - }) - .append('label') - .each((d, i) => { - // create checkbox for each data - d3.select(this) - .append('input') - .attr('type', 'checkbox') - .attr('checked', function (d, i) { - if (data.legendsFilter[PlotService.toValidId(d)] === true) return true; - else return null; - }) - .attr('style', function (d, i) { - const color = getColor(data, i); - return 'color: ' + color + ';background-color:' + color + ';'; - }) - .on('click', (d) => { - // filter by legends - data.legendsFilter[PlotService.toValidId(d)] = this.checked; - createGroupedHorizontalBarChart(achartdata); - createFilters(achartdata); - }); - d3.select(this) - .append('span') - .text((d) => { - return d; - }); - }); - const filterColoumnsDiv = graphFilter - .append('div') - .append('label') - .style('border', '1px solid #ddd') - .text('Filter by Columns'); - filterColoumnsDiv - .selectAll('div') - .data(data.labels) - .enter() - .append('div') - .attr('class', function (d, i) { - return 'columnfilter ' + data.id + ' ' + PlotService.toValidId(d); - }) - .on('mouseover', function (d, i) { - mouseover('.' + data.id + '.' + PlotService.toValidId(d)); - }) - .on('mouseout', function (d, i) { - mouseout(); - }) - .append('label') - .each((d, i) => { - // create checkbox for each data - d3.select(this) - .append('input') - .attr('type', 'checkbox') - .attr('checked', function (d, i) { - if (data.labelsFilter[PlotService.toValidId(d)] === true) return true; - else return null; - }) - .on('click', (d) => { - //filter by columns(labels) - data.labelsFilter[PlotService.toValidId(d)] = this.checked; - createGroupedHorizontalBarChart(achartdata); //2nd argument is not used - createFilters(achartdata); - }); - d3.select(this) - .append('span') - .text((d) => { - return d; - }); - }); - } //end of function createFilter - - function createGroupedHorizontalBarChart(data) { - divchart.selectAll('*').remove(); - divchart.attr('class', achartdata.id).attr('style', 'border:1px solid #ddd'); - - const svg = divchart.append('svg:svg').attr('class', 'ghbchart ' + data.id); - - const filteredDataValues: any[] = []; - const filteredDataSysmlids: any[] = []; - const filteredDataColors: any[] = []; - const filteredDataLegends: any[] = []; //table row headers - const filteredDataLabels: any[] = []; //table column headers - const datalegendsfilter: any[] = data.legendsFilter; - const datalabelsfilter: any[] = data.labelsFilter; - let counter = -1; - - for (let i = 0; i < data.labels.length; i++) { - if (datalabelsfilter[PlotService.toValidId(data.labels[i])]) { - filteredDataLabels.push(data.labels[i]); - for (let j = 0; j < data.values.length; j++) { - //data.values.length == data.legends.length - counter++; - if (datalegendsfilter[PlotService.toValidId(data.legends[j])]) { - filteredDataValues.push(Number(data.values[j][i])); - filteredDataSysmlids.push(data.valueIds[j][i]); - filteredDataColors.push(getColor(data, counter % data.legends.length)); - filteredDataLegends.push(PlotService.toValidId(data.legends[j])); - } - } - } - } - const filteredLegendsLength = filteredDataLegends.length / filteredDataLabels.length; - - const chartWidth = plotConfig.width - 260, - barHeight = 20, - groupHeight = barHeight * filteredLegendsLength, - gapBetweenGroups = 10, - spaceForLabels = plotConfig.marginLeft, - spaceForLegend = 200, - marginbottom = 50; - const chartHeight = barHeight * filteredDataValues.length + gapBetweenGroups * filteredDataLabels.length; - - const x = d3 - .scaleLinear() //d3.scale.linear() - .domain([0, d3.max(filteredDataValues)]) - .range([0, chartWidth]); - - const y = d3 - .scaleLinear() //d3.scale.linear() - .range([chartHeight + gapBetweenGroups, 0]); - - const yAxis = d3 - .axisLeft(y) //d3.svg.axis() - .tickFormat('') - .tickSize(0); - - // Specify the chart area and dimensions - const chart = svg.attr('width', plotConfig.width).attr('height', chartHeight + marginbottom); - - // Create bars - const bar = chart - .selectAll('g') - .data(filteredDataValues) - .enter() - .append('g') - .attr('transform', function (d, i) { - return ( - 'translate(' + - spaceForLabels + - ',' + - (i * barHeight + gapBetweenGroups * (0.5 + Math.floor(i / filteredLegendsLength))) + - ')' - ); - }); - const numRows = filteredDataLegends.length / filteredDataLabels.length; - // Create rectangles of the correct width - bar.append('rect') - .attr('id', function (d, i) { - return filteredDataSysmlids[i]; - }) - .attr('fill', function (d, i) { - return filteredDataColors[i]; - }) - .style('fill-opacity', opacitydefault) - .attr('class', function (d, i) { - return ( - 'ghbbar ' + - data.id + - ' ' + - filteredDataLegends[i] + - ' ' + - PlotService.toValidId(filteredDataLabels[Math.floor(i / numRows)]) - ); - }) - .attr('width', x) - .attr('height', barHeight - 1) - .on('click', function (d, i) { - if (mmsViewCtrl) mmsViewCtrl.transcludeClicked(this.id); - }) - .on('mouseover', function (d, i) { - mouseover('.' + data.id + '.' + filteredDataLegends[i]); - }) - .on('mouseout', function (d, i) { - mouseout(); - }); - // Add text label in bar - bar.append('text') - .attr('class', function (d, i) { - return 'ghbbar ' + data.id + ' ' + filteredDataLegends[i]; - }) - .attr('x', function (d) { - return x(d) - 3; - }) - .attr('y', barHeight / 2) - .attr('dy', '.35em') - .text(function (d) { - return d; - }); - - //left side label - bar.each(function (d, i) { - if (i % filteredLegendsLength === 0) { - d3.select(this) - .append('text') - .attr('class', 'label') - .attr('x', function (d) { - return -10; - }) - .attr('y', groupHeight / 2) - .attr('dy', '.35em') - .text(filteredDataLabels[Math.floor(i / filteredLegendsLength)]); - } - }); - chart - .append('g') - .attr('class', 'y axis') - .attr('id', 'ghbaxis') - .attr('transform', 'translate(' + spaceForLabels + ', ' + -gapBetweenGroups / 2 + ')') - .call(yAxis); - - // Draw legend - const legendRectSize = 18, - legendSpacing = 4; - let mouseoverId; - const legend = chart - .selectAll('.legend') - .data(data.legends) - .enter() - .append('g') - .attr('transform', (d, i) => { - const height = legendRectSize + legendSpacing; - const offset = -gapBetweenGroups / 2; - const horz = spaceForLabels + chartWidth + 60 + legendRectSize; - const vert = i * height - offset; - return 'translate(' + horz + ',' + vert + ')'; - }) - .on('mouseover', function (d, i) { - mouseover('.' + data.id + '.' + PlotService.toValidId(d)); - }) - .on('mouseout', function (d, i) { - mouseout(); - }); - - legend - .append('rect') - .attr('class', function (d, i) { - return 'legendRect ' + data.id + ' ' + PlotService.toValidId(d); - }) - .attr('width', legendRectSize) - .attr('height', legendRectSize) - .style('fill-opacity', opacitydefault) - .style('fill', (d, i) => { - return getColor(data, i); /*return color(i);*/ - }) - .style('stroke', (d, i) => { - return getColor(data, i); /*return color(i);*/ - }); - - legend - .append('text') - .attr('class', 'legend') - .attr('x', legendRectSize + legendSpacing) - .attr('y', legendRectSize - legendSpacing) - .text((d, i) => { - return d; - }); - } - scope.render = function () { - PlotService.readValues(scope.plot, projectId, refId, commitId).then(function (value) { - const tablebody = value.tablebody; - const tableheader = value.tableheader; - //scope.isHeader = value.isHeader; - scope.valuesO = value.tablebody.valuesO; //value objects used in watch - if (tablebody.c3_data.length === 0) { - //no data - return; - } - let udcolors; - if (scope.plot.config.colors !== undefined) { - udcolors = scope.plot.config.colors; - } - const rowvalues: number[] = []; - const cellIds: number[] = []; //0, 1, 2, 3 - const legends: any[] = []; - const legendsFilter: boolean[] = []; - let rowvalue: number[]; - let cellId: number[]; - let cid = 0; - tablebody.c3_data.forEach(function (row) { - legends.push(row[0]); - legendsFilter[row[0]] = true; - rowvalue = []; //reset - cellId = []; //reset - for (let i = 1; i < row.length; i++) { - rowvalue.push(row[i]); - cellId.push(cid++); - } - cellIds.push(...cellId); - rowvalues.push(...rowvalue); - }); - const labelsFilter: { [key: string]: boolean } = {}; - tableheader.forEach(function (item) { - labelsFilter[item] = true; - }); - achartdata = { - id: '_' + scope.$id, - labels: tableheader, - legends: legends, //row headers - colors: udcolors, - values: rowvalues, //table body without row headers - valueIds: cellIds, - legendsFilter: legendsFilter, - labelsFilter: labelsFilter, - }; - createGroupedHorizontalBarChart(achartdata); - createFilters(achartdata); - }); - }; //end of render - scope.$watch( - 'valuesO', - function (newValue, oldValue) { - return scope.render(); - }, - true - ); - - //rect bar is clicked or table cell (Except rowHeaders) is clicked - // eventSvc.$on('element.selected', function(data) { - // d3.selectAll("rect").transition(200).style("fill-opacity", opacitynotselected); - // }); - }; //end of link - - return { - restrict: 'EA', - require: '?^view', - scope: { - plot: '<', - }, - link: mmsChartLink, - }; //return -} diff --git a/src/ve-extensions/present-plots/presentations/components/mmsD3NormalizedStackedBarPlot.directive.ts b/src/ve-extensions/present-plots/presentations/components/mmsD3NormalizedStackedBarPlot.directive.ts deleted file mode 100644 index 6cd30dbdb..000000000 --- a/src/ve-extensions/present-plots/presentations/components/mmsD3NormalizedStackedBarPlot.directive.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { veComponents } from '@ve-components'; - -veComponents.directive('mmsD3NormalizedStackedBarPlot', ['PlotService', '$window', mmsD3NormalizedStackedBarPlot]); - -/** - /* reference https://bl.ocks.org/mbostock/3886394 - */ -function mmsD3NormalizedStackedBarPlot(PlotService, $window) { - const mmsChartLink = function (scope, element, attrs, mmsViewCtrl) { - const d3 = $window.d3; - - const divchart = d3.select(element[0]).append('div'); - //default - const defaultPlotConfig = { - width: 960 /*parseInt(divchart.style("width"))*0.95*/, - height: 500, - marginTop: 20, - marginRight: 60, - marginBottom: 30, - marginLeft: 40, - }; - const plotId = 'd3nbplot' + scope.$id; - - let projectId, refId, commitId; - if (mmsViewCtrl) { - const viewVersion = mmsViewCtrl.getElementOrigin(); - projectId = viewVersion.projectId; - refId = viewVersion.refId; - commitId = viewVersion.commitId; - } - - function vf_pplot() { - divchart.selectAll('*').remove(); - divchart.attr('id', plotId); - const svg = divchart.append('svg:svg'); - - const plotConfig = PlotService.plotConfig(scope.plot.config.options, defaultPlotConfig); - svg.attr('width', plotConfig.width); - svg.attr('height', plotConfig.height); - const margin = { - top: plotConfig.marginTop, - right: plotConfig.marginRight, - bottom: plotConfig.marginBottom, - left: plotConfig.marginLeft, - }, - width = +svg.attr('width') - margin.left - margin.right, - height = +svg.attr('height') - margin.top - margin.bottom, - g = svg.append('g').attr('transform', 'translate(' + margin.left + ',' + margin.top + ')'); - - const x = d3.scaleBand().rangeRound([0, width]).padding(0.1).align(0.1); - - const y = d3.scaleLinear().rangeRound([height, 0]); - - const z = d3.scaleOrdinal(d3.schemeCategory10); - - const stack = d3.stack().offset(d3.stackOffsetExpand); - - let data = scope.tablebody.c3_data; - data = total(data); - data.sort(function (a, b) { - return b[scope.tablecolumnheader[0]] / b.total - a[scope.tablecolumnheader[0]] / a.total; - }); - - x.domain( - data.map(function (d) { - return d.rowheader; - }) - ); - z.domain(scope.tablecolumnheader); - - const serie = g - .selectAll('.serie') - .data(stack.keys(scope.tablecolumnheader)(data)) - .enter() - .append('g') - .attr('class', 'serie') - .attr('fill', function (d) { - return z(d.key); - }); - - serie - .selectAll('rect') - .data(function (d) { - return d; - }) - .enter() - .append('rect') - .attr('x', function (d) { - return x(d.data.rowheader); - }) - .attr('y', function (d) { - return y(d[1]); - }) - .attr('height', function (d) { - return y(d[0]) - y(d[1]); - }) - .attr('width', x.bandwidth()); - - g.append('g') - .attr('class', 'axis axis--x') - .attr('transform', 'translate(0,' + height + ')') - .call(d3.axisBottom(x)); - - g.append('g').attr('class', 'axis axis--y').call(d3.axisLeft(y).ticks(10, '%')); - - const legend = serie - .append('g') - .attr('class', 'legend') - .attr('transform', function (d) { - d = d[d.length - 1]; - return 'translate(' + (x(d.data.rowheader) + x.bandwidth()) + ',' + (y(d[0]) + y(d[1])) / 2 + ')'; - }); - - legend.append('line').attr('x1', -6).attr('x2', 6).attr('stroke', '#000'); - - legend - .append('text') - .attr('x', 9) - .attr('dy', '0.35em') - .attr('fill', '#000') - .style('font', '10px sans-serif') - .text(function (d) { - return d.key; - }); - } - - //add total in original row array. - function total(all) { - all.forEach(function (a) { - a.total = 0; - for (let i = 0; i < scope.tablecolumnheader.length; i++) { - a.total += Number(a[scope.tablecolumnheader[i]]); - } - }); - return all; - } - - scope.render = function () { - PlotService.readValues2(scope.plot, projectId, refId, commitId).then(function (value) { - scope.tablebody = value.tablebody; - scope.tablecolumnheader = value.tableheader; - scope.valuesO = value.tablebody.valuesO; //value objects used in watch - if (scope.tablebody.c3_data.length === 0) { - //no data - return; - } - vf_pplot(); - }); //end of PlotService - }; //end of render - - scope.$watch( - 'valuesO', - function (newVals, oldVals) { - return scope.render(); - }, - true - ); - }; //end of link - - return { - restrict: 'EA', - require: '?^view', - scope: { - plot: '<', - }, - link: mmsChartLink, - }; //return -} diff --git a/src/ve-extensions/present-plots/presentations/components/mmsD3ParallelAxisPlot.directive.ts b/src/ve-extensions/present-plots/presentations/components/mmsD3ParallelAxisPlot.directive.ts deleted file mode 100644 index f752b3546..000000000 --- a/src/ve-extensions/present-plots/presentations/components/mmsD3ParallelAxisPlot.directive.ts +++ /dev/null @@ -1,310 +0,0 @@ -import { veComponents } from '@ve-components'; - -veComponents.directive('mmsD3ParallelAxisPlot', ['PlotService', '$window', mmsD3ParallelAxisPlot]); -function mmsD3ParallelAxisPlot(PlotService, $window) { - const mmsChartLink = function (scope, element, attrs, mmsViewCtrl) { - scope.rowHeaders = []; //not null when render is called 1st time. - const d3 = $window.d3; - const divchart = d3.select(element[0]).append('div'); - - const defaultPlotConfig = { - width: 900, - marginTop: 0, - marginRight: 0, - marginBottom: 25, - marginLeft: 60, - }; - - let projectId; - let refId; - let commitId; - - if (mmsViewCtrl) { - const viewVersion = mmsViewCtrl.getElementOrigin(); - projectId = viewVersion.projectId; - refId = viewVersion.refId; - commitId = viewVersion.commitId; - } - - function vf_pplot(_out) { - const plotConfig = PlotService.plotConfig(scope.plot.config.options, defaultPlotConfig); - - const outputs = _out; - const width = plotConfig.width; - const height = plotConfig.width * 0.37; - const m = [plotConfig.marginTop, plotConfig.marginRight, plotConfig.marginBottom, plotConfig.marginLeft]; //top, right, bottom, left - - let maxSize = 0; - let size = 0; - - //redefine top and right margin based on TB string length - maxSize = 0; - size = 0; - for (let i = 0; i < outputs.variables.length; i++) { - size = outputs.variables[i].length; //length of the string - if (maxSize < size) maxSize = size; - } - - m[0] = maxSize * 4.5 * 0.707 + 50; //to make label - m[1] = maxSize * 4.5 * 0.707 + 10; - - //define width and height - const w = width - m[1] - m[3], - h = height - m[0] - m[2]; - - const colorscale = d3.scaleOrdinal(d3.schemeCategory10); - const x = d3.scalePoint(d3.schemeCategory10).domain(outputs.variables).range([0, w]), - y = {}; - let line = d3.line(), - foreground; - - divchart.selectAll('*').remove(); - const svg = divchart - .append('svg:svg') - .attr('class', 'papchart' + scope.$id + ' papchart') - .attr('style', 'border:1px solid #ddd') - .attr('width', w + m[1] + m[3]) - .attr('height', h + m[0] + m[2]) - .append('svg:g') - .attr('transform', 'translate(' + m[3] + ',' + m[0] + ')'); - - //Need to create a temporary object with the data, objectives, and threshold values - //to scale the axes properly - const minMax = {}; - - outputs.variables.forEach(function (d, i) { - minMax[d] = {}; - - //initialize minTest and maxTest variables - let minTest = outputs.table[0].values[d]; - let maxTest = outputs.table[0].values[d]; - - for (let j = 0; j < outputs.table.length; j++) { - //test to see if minTest is still the minimum - if (minTest > outputs.table[j].values[d]) minTest = outputs.table[j].values[d]; - - //tests to see if maxTest is still the maximum - if (maxTest < outputs.table[j].values[d]) maxTest = outputs.table[j].values[d]; - } - minMax[d].min = minTest; - minMax[d].max = maxTest; - }); - - const range = {}; - const minimum = {}; - const maximum = {}; - - const percentScaling = 0.07; - - //make each minMax a bit bigger or smaller to better plot the data set - outputs.variables.forEach(function (d, i) { - range[d] = Math.abs(minMax[d].max - minMax[d].min); - - minimum[d] = minMax[d].min - range[d] * percentScaling; - maximum[d] = minMax[d].max + range[d] * percentScaling; - - //what if both the min and the max were equal? Give it some "range" about the point - if (minMax[d].max == minMax[d].min) { - maximum[d] = minMax[d].max * (percentScaling + 1); - minimum[d] = minMax[d].max * (1 - percentScaling); - } - - //what if the only value for a variable is zero? Give it some "range" about zero - if (minMax[d].max === 0 && minMax[d].min === 0) { - maximum[d] = percentScaling; - minimum[d] = -percentScaling; - } - }); - - //Create a scale and brush for each variables. - outputs.variables.forEach((d) => { - y[d] = d3.scaleLinear().domain([minimum[d], maximum[d]]).range([h, 0]); - }); - - const tooltip = svg - .append('text') - .style('opacity', 0) - .style('font-family', 'sans-serif') - .style('font-size', '13px'); - - const axisData: any[] = []; - const tickData: any[] = []; - outputs.table.forEach(function (d) { - if (d.tickColor === undefined) axisData.push(d); - else tickData.push(d); - }); - // Add foreground lines. background brush - foreground = svg - .append('svg:g') - .attr('class', 'foreground') - .selectAll('path') - .data(axisData) - .enter() - .append('svg:path') - .attr('d', path) - .on('mouseover', function (d) { - tooltip - .attr('x', d3.mouse(this)[0]) - .attr('y', d3.mouse(this)[1]) - .text(d.row) - .transition(200) - .style('opacity', 1); - }) - .on('mouseout', function () { - //remove the text element added on the mouseover event when the mouseout event is triggered - tooltip.transition(200).style('opacity', 0); - }) - .attr('stroke', function (d, i) { - return colorscale(i); - }) - .attr('fill', 'none') - .style('stroke-width', '1px') - .attr('cid', function (d, i) { - return d.cid; - }) - .attr('config', function (d, i) { - return d.design; - }) - //.attr("title", "TEST") - .attr('class', (d, i) => { - const string = 'design ' + d.cid + ' selected'; - return string; - }) - //add title to the path. mouseover shows it in bubble looking - .append('svg:title') - .text(function (d) { - return d.row; - }); - - // Add a group element for each variables. - const g = svg - .selectAll('.variables') - .data(outputs.variables) - .enter() - .append('svg:g') - .attr('class', 'variables') - .attr('transform', function (d, i) { - return 'translate(' + x(d) + ')'; - }); - - // Add an axis and title. - g.append('svg:g') - .attr('class', 'axis') - .each(function (d) { - //d3.select(this).call(axis.scale(y[d])); - d3.select(this).call(d3.axisLeft(y[d]).ticks(5)); - }) - .append('svg:text') - .data(outputs.variables) - .attr('y', -12) - .attr('transform', 'rotate(-45 0 0)') //deg y x - .attr('x', 0) - .attr('class', 'axislabel') - .attr('fill', 'black') - .text(function (d) { - return d; - }); - - let axisTick; - tickData.forEach(function (td) { - //Adding axisTick - g.select('g.axis') - .append('g') - .attr('transform', (d) => { - return 'translate(0,' + y[d](td.values[d]) + ')'; - }) - .attr('class', 'objectivetick') - .append('line') - .attr('stroke', td.tickColor) - .style('stroke-width', '3px') - .attr('fill', 'none') - .attr('x1', -5) - .attr('x2', 6) - .attr('y2', 0) - .on('mouseover', function (d) { - tooltip - .attr('x', d3.mouse(this)[0] + x(d)) - .attr('y', d3.mouse(this)[1] + y[d](td.values[d])) - .text(td.row) - .transition(200) - .style('opacity', 1); - }) - .on('mouseout', function (d) { - //remove the text element added on the mouseover event when the mouseout event is triggered - tooltip.transition(200).style('opacity', 0); - }); - }); - // Returns the path for a given data point. - function path(d) { - d = d.values; - return line( - outputs.variables.map((p) => { - return [x(p), y[p](d[p])]; - }) - ); - } - } //end of vf_pplot() - - function getTickColor(rowHeaderName) { - if (scope.plot.config.ticks !== undefined) { - for (let kk = 0; kk < scope.plot.config.ticks.length; kk++) { - if (scope.plot.config.ticks[kk].name === rowHeaderName) return scope.plot.config.ticks[kk].color; - } - } - return undefined; - } - - scope.render = function () { - PlotService.readValues(scope.plot, projectId, refId, commitId).then(function (value) { - scope.tablebody = value.tablebody; - scope.tableheader = value.tableheader; - scope.isHeader = value.isHeader; - scope.valuesO = value.tablebody.valuesO; //value objects used in watch - if (scope.tablebody.c3_data.length === 0) { - //no data - return; - } - const dataseries: { - row: any; - tickColor: any; - values: any; - }[] = []; - let tickColor; - scope.tablebody.c3_data.forEach(function (row) { - const values: { [key: string]: any } = {}; - for (let i = 1; i < row.length; i++) { - values[scope.tableheader[i - 1]] = row[i]; - tickColor = getTickColor(row[0]); - } - dataseries.push({ - row: row[0], - tickColor: tickColor, - values: values, - }); - }); - const modelData = { - variables: scope.tableheader, - table: dataseries, //columnHeader and values - }; - vf_pplot(modelData); - }); //end of PlotService - }; //end of render - - scope.$watch( - 'valuesO', - function (newVals, oldVals) { - return scope.render(); - }, - true - ); - }; //end of link - - return { - restrict: 'EA', - require: '?^view', - scope: { - plot: '<', - }, - link: mmsChartLink, - }; //return -} diff --git a/src/ve-extensions/present-plots/presentations/components/mmsD3RadarPlot.directive.ts b/src/ve-extensions/present-plots/presentations/components/mmsD3RadarPlot.directive.ts deleted file mode 100644 index 468b15fa7..000000000 --- a/src/ve-extensions/present-plots/presentations/components/mmsD3RadarPlot.directive.ts +++ /dev/null @@ -1,452 +0,0 @@ -import { veComponents } from '@ve-components'; - -veComponents.directive('mmsD3RadarPlot', ['PlotService', '$window', mmsD3RadarPlot]); -function mmsD3RadarPlot(PlotService, $window) { - const mmsRadarChartLink = function (scope, element, attrs, mmsViewCtrl) { - const d3 = $window.d3; - const colorscale = d3.scaleOrdinal(d3.schemeCategory10); - - const scopetableColumnHeadersLabel = []; - const divchart = d3.select(element[0]).append('div'); - - const defaultPlotConfig = { - width: 700 /*parseInt(divchart.style("width"))*0.95*/, - height: 700, - marginTop: 0, - marginRight: 0, - marginBottom: 0, - marginLeft: 0, - }; - - let projectId; - let refId; - let commitId; - if (mmsViewCtrl) { - const viewVersion = mmsViewCtrl.getElementOrigin(); - projectId = viewVersion.projectId; - refId = viewVersion.refId; - commitId = viewVersion.commitId; - } - //if ( scope.plot.config.length !== 0){ - //scope.plot.config = JSON.parse(scope.plot.config.replace(/'/g, '"')); //{"colors: [5,6,7,8,9]"} - //} - scope.render = function () { - PlotService.readValues(scope.plot, projectId, refId, commitId).then(function (value) { - scope.tablebody = value.tablebody; - scope.tableheader = value.tableheader; - scope.isHeader = value.isHeader; - scope.valuesO = value.tablebody.valuesO; //value objects used in watch - if (scope.tablebody.c3_data.length === 0) { - //no data - return; - } - - const rowvalues: { axis: string; value: number }[][] = []; //[][] {{axis: p2, value: 15}, {axis: p3: value: 1}}... - scope.tablebody.c3_data.forEach(function (row) { - const rowvalue: { axis: string; value: number }[] = []; - for ( - let i = 1; - i < row.length; - i++ //ignore row header - ) - rowvalue.push({ axis: scope.tableheader[i - 1], value: row[i] }); - rowvalues.push(rowvalue); - }); - - divchart.selectAll('*').remove(); - divchart.attr('class', 'radar' + scope.$id).attr('style', 'border:1px solid #ddd'); - - RadarChart.draw('radar' + scope.$id, rowvalues); - //add legends from tableheader - const legends: any[] = []; - scope.tablebody.c3_data.forEach(function (item) { - legends.push(item[0]); - }); - initiateLegend(legends, 'radar' + scope.$id); - }); //Plot - }; //end of scope.render - - scope.$watch( - 'valuesO', - function (newVals, oldVals) { - return scope.render(); - }, - true - ); - - const plotConfig = PlotService.plotConfig(scope.plot.config.options, defaultPlotConfig); - - let cfg; - var RadarChart = { - draw: function (id, d) { - cfg = { - radius: 5, - factor: 1, - w: plotConfig.width - 200, - h: plotConfig.height - 200, - factorLegend: 0.85, - levels: 3, - maxValue: 0, - radians: 2 * Math.PI, - opacityArea: 0.5, - ToRight: 5, - TranslateX: 80, - TranslateY: 80, - ExtraWidthX: 100, - ExtraWidthY: 0 /*100 original */, - color: colorscale, - }; - - cfg.maxValue = Math.max( - cfg.maxValue, - d3.max(d, function (i) { - return d3.max( - i.map(function (o) { - return Number(o.value); - }) - ); - }) - ); - const allAxis = d[0].map(function (i, j) { - return i.axis; - }); - const total = allAxis.length; - const radius = cfg.factor * Math.min(cfg.w / 2, cfg.h / 2); - - const svg = divchart.append('svg:svg').attr('class', 'rdchart ' + scope.$id); - svg.attr('width', plotConfig.width); - svg.attr('height', plotConfig.height); - - const g = svg.append('g').attr('transform', 'translate(' + cfg.TranslateX + ',' + cfg.TranslateY + ')'); - let tooltip; - //Text indicating at what % each level is - for (let j = 0; j < cfg.levels; j++) { - const levelFactor2 = cfg.factor * radius * ((j + 1) / cfg.levels); - g.selectAll('.levels') - .data([1]) //dummy data - .enter() - .append('svg:text') - .attr('x', levelFactor2 * (1 - cfg.factor * Math.sin(0))) - .attr('y', levelFactor2 * (1 - cfg.factor * Math.cos(0))) - .attr('class', 'legend') - .style('font-family', 'sans-serif') - .style('font-size', '10px') - .attr( - 'transform', - 'translate(' + - (cfg.w / 2 - levelFactor2 + cfg.ToRight) + - ', ' + - (cfg.h / 2 - levelFactor2) + - ')' - ) - .attr('fill', '#737373') - .text(d3.format('.3g')(((j + 1) * cfg.maxValue) / cfg.levels)); - } - function getPosition(i, range, factor, func) { - factor = typeof factor !== 'undefined' ? factor : 1; - return range * (1 - factor * func((i * cfg.radians) / total)); - } - function getHorizontalPosition(i, range, factor?) { - return getPosition(i, range, factor, Math.sin); - } - function getVerticalPosition(i, range, factor?) { - return getPosition(i, range, factor, Math.cos); - } - // //levels && axises - const levelFactors = d3.range(0, cfg.levels).map(function (level) { - return radius * ((level + 1) / cfg.levels); - }); - const levelGroups = g.selectAll('.levels').data(levelFactors); - levelGroups.enter().append('g'); - levelGroups.exit().remove(); - levelGroups.attr('class', function (d, i) { - return 'level-group level-group-' + i; - }); - const levelLine = levelGroups.selectAll('.level').data(function (levelFactor) { - return d3.range(0, total).map(function () { - return levelFactor; - }); - }); - levelLine.enter().append('line'); - levelLine.exit().remove(); - levelLine - .attr('class', 'level') - .attr('x1', function (levelFactor, i) { - return getHorizontalPosition(i, levelFactor); - }) - .attr('y1', function (levelFactor, i) { - return getVerticalPosition(i, levelFactor); - }) - .attr('x2', function (levelFactor, i) { - return getHorizontalPosition(i + 1, levelFactor); - }) - .attr('y2', function (levelFactor, i) { - return getVerticalPosition(i + 1, levelFactor); - }) - .style('stroke', 'grey') - .style('stroke-opacity', '0.75') - .style('stroke-width', '0.3px') - .attr('transform', function (levelFactor) { - return 'translate(' + (cfg.w / 2 - levelFactor) + ', ' + (cfg.h / 2 - levelFactor) + ')'; - }); - let series = 0; - const axis = g.selectAll('.axis').data(allAxis).enter().append('g').attr('class', 'axis'); - axis.append('line') - .attr('x1', cfg.w / 2) - .attr('y1', cfg.h / 2) - .attr('x2', function (d, i) { - return (cfg.w / 2) * (1 - cfg.factor * Math.sin((i * cfg.radians) / total)); - }) - .attr('y2', function (d, i) { - return (cfg.h / 2) * (1 - cfg.factor * Math.cos((i * cfg.radians) / total)); - }) - .attr('class', 'line') - .style('stroke', 'grey') - .style('stroke-width', '1px'); - axis.append('text') - .attr('class', 'legend') - .text(function (d) { - return d; - }) - .style('font-family', 'sans-serif') - .style('font-size', '12px') - .attr('text-anchor', 'middle') - .attr('dy', '1.5em') - .attr('transform', function (d, i) { - return 'translate(0, -8)'; - }) - .attr('x', function (d, i) { - return ( - (cfg.w / 2) * (1 - cfg.factorLegend * Math.sin((i * cfg.radians) / total)) - - 60 * Math.sin((i * cfg.radians) / total) - ); - }) - .attr('y', function (d, i) { - return ( - (cfg.h / 2) * (1 - Math.cos((i * cfg.radians) / total)) - - 20 * Math.cos((i * cfg.radians) / total) - ); - }); - - let dataValues: number[][] = []; - d.forEach(function (y, x) { - dataValues = []; - g.selectAll('.nodes').data(y, function (j, i) { - dataValues.push([ - (cfg.w / 2) * - (1 - - (Math.max(j.value, 0) / cfg.maxValue) * - cfg.factor * - Math.sin((i * cfg.radians) / total)), - (cfg.h / 2) * - (1 - - (Math.max(j.value, 0) / cfg.maxValue) * - cfg.factor * - Math.cos((i * cfg.radians) / total)), - ]); - // dataValues.push([ - // cfg.w/2*(1-(parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor*Math.sin(i*cfg.radians/total)), - // cfg.h/2*(1-(parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor*Math.cos(i*cfg.radians/total)) - // ]); - }); - dataValues.push(dataValues[0]); - g.selectAll('.area') - .data([dataValues]) - .enter() - .append('polygon') - .attr('class', 'radar-chart-serie' + series + ' ' + id) - .style('stroke-width', '2px') - .style('stroke', cfg.color(series)) - .attr('points', function (d) { - let str = ''; - for (let pti = 0; pti < d.length; pti++) { - str = str + d[pti][0] + ',' + d[pti][1] + ' '; - } - return str; - }) - .style('fill', function (j, i) { - return cfg.color(series); - }) - .style('fill-opacity', 0.1) - .on('mouseover', function (d, i) { - d3.select(this).transition(200).style('fill-opacity', 0.7); - }) - .on('mouseout', function (d, i) { - d3.select(this).transition(200).style('fill-opacity', 0.1); - }); - series++; - }); - series = 0; - d.forEach(function (y, x) { - g.selectAll('.nodes') - .data(y) - .enter() - .append('svg:circle') - .attr('class', 'radar-chart-serie' + series + ' ' + id) - .attr('r', cfg.radius) - .attr('alt', function (j) { - return Math.max(j.value, 0); - }) - .attr('cx', function (j, i) { - dataValues.push([ - (cfg.w / 2) * - (1 - - (Math.max(j.value, 0) / cfg.maxValue) * - cfg.factor * - Math.sin((i * cfg.radians) / total)), - (cfg.h / 2) * - (1 - - (Math.max(j.value, 0) / cfg.maxValue) * - cfg.factor * - Math.cos((i * cfg.radians) / total)), - ]); - // dataValues.push([ - // cfg.w/2*(1-(parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor*Math.sin(i*cfg.radians/total)), - // cfg.h/2*(1-(parseFloat(Math.max(j.value, 0))/cfg.maxValue)*cfg.factor*Math.cos(i*cfg.radians/total)) - // ]); - return ( - (cfg.w / 2) * - (1 - - (Math.max(j.value, 0) / cfg.maxValue) * - cfg.factor * - Math.sin((i * cfg.radians) / total)) - ); - }) - .attr('cy', function (j, i) { - return ( - (cfg.h / 2) * - (1 - - (Math.max(j.value, 0) / cfg.maxValue) * - cfg.factor * - Math.cos((i * cfg.radians) / total)) - ); - }) - .attr('data-id', function (j) { - return j.axis; - }) - .style('fill', cfg.color(series)) - .style('fill-opacity', 0.9) - .on('mouseover', function (d) { - const newX = parseFloat(d3.select(this).attr('cx')) - 10; - const newY = parseFloat(d3.select(this).attr('cy')) - 5; - tooltip - .attr('x', newX) - .attr('y', newY) - .text(d.value.toString()) - .transition(200) - .style('opacity', 1); - }) - .on('mouseout', function () { - tooltip.transition(200).style('opacity', 0); - }) - .append('svg:title') - .text(function (j) { - return Math.max(j.value, 0); - }); - series++; - }); - - //Tooltip - tooltip = g - .append('text') - .style('opacity', 0) - .style('font-family', 'sans-serif') - .style('font-size', '13px'); - }, - }; //end of RadarChart - - function initiateLegend(LegendOptions, id) { - const svg = d3 - .select('.' + id) //div - .selectAll('svg') - .append('svg') - .attr('width', cfg.w + 300) - .attr('height', cfg.h); - //Initiate Legend - const legend = svg - .append('g') - .attr('class', 'legend') - .attr('height', 100) - .attr('width', 200) - .attr('transform', 'translate(50,50)'); - - //Create colour squares - legend - .selectAll('rect') - .data(LegendOptions) - .enter() - .append('rect') - .attr('x', cfg.w - 65) - .attr('y', function (d, i) { - return i * 20; - }) - .attr('width', 10) - .attr('height', 10) - .style('fill', function (d, i) { - return colorscale(i); - }) - .attr('fill-opacity', 1) - .attr('rid', function (d) { - return d; - }) - .on('mouseover', function (d, i) { - d3.select('.' + id) - .selectAll('svg') - .selectAll('polygon') - .transition(200) - .style('fill-opacity', 0.1); - d3.select('.radar-chart-serie' + i + '.' + id) - .transition(200) - .style('fill-opacity', 0.7); - }) - .on('mouseout', function (d, i) { - d3.select('.' + id) - .selectAll('svg') - .selectAll('polygon') - .transition(200) - .style('fill-opacity', cfg.opacityArea); - }); - //Create text next to squares - legend - .selectAll('text') - .data(LegendOptions) - .enter() - .append('text') - .attr('x', cfg.w - 52) - .attr('y', function (d, i) { - return i * 20 + 9; - }) - .attr('font-size', '11px') - .attr('fill', '#737373') - .text(function (d) { - return d; - }) - .on('mouseover', function (d, i) { - d3.select('.' + id) - .selectAll('svg') - .selectAll('polygon') - .transition(200) - .style('fill-opacity', 0.1); - d3.select('.radar-chart-serie' + i + '.' + id) - .transition(200) - .style('fill-opacity', 0.7); - }) - .on('mouseout', function (d, i) { - d3.select('.' + id) - .selectAll('svg') - .selectAll('polygon') - .transition(200) - .style('fill-opacity', 0.1); - }); - } //end of initiateLegend - }; //end of link - - return { - restrict: 'EA', - require: '?^view', - scope: { - plot: '<', - }, - link: mmsRadarChartLink, - }; //return -} diff --git a/src/ve-extensions/present-plots/presentations/present-plot.component.ts b/src/ve-extensions/present-plots/presentations/present-plot.component.ts deleted file mode 100644 index e68708849..000000000 --- a/src/ve-extensions/present-plots/presentations/present-plot.component.ts +++ /dev/null @@ -1,91 +0,0 @@ -import angular from 'angular'; - -import { Presentation, PresentationService, ViewHtmlService } from '@ve-components/presentations'; -import { ComponentService, ExtensionService } from '@ve-components/services'; -import { ButtonBarService } from '@ve-core/button-bar'; -import { ImageService } from '@ve-utils/application'; -import { EventService } from '@ve-utils/core'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veComponents } from '@ve-components'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { IPresentationComponentOptions } from '@ve-types/components/presentation'; -import { PresentContentObject } from '@ve-types/mms'; - -export interface PresentPlotObject extends PresentContentObject { - ptype?: string; - config?: string; - [key: string]: unknown; -} - -const ViewPlotComponent: IPresentationComponentOptions = { - selector: 'presentPlot', - template: ``, - bindings: { - peObject: '<', - instanceSpec: '<', - peNumber: '<', - }, - controller: class ViewPlotController extends Presentation { - public plot: PresentPlotObject; - public plotConfig: PresentPlotObject; - - static $inject = Presentation.$inject; - constructor( - $q: VeQService, - $element: JQuery, - $scope: angular.IScope, - $compile: angular.ICompileService, - growl: angular.growl.IGrowlService, - schemaSvc: SchemaService, - viewHtmlSvc: ViewHtmlService, - presentationSvc: PresentationService, - componentSvc: ComponentService, - eventSvc: EventService, - imageSvc: ImageService, - buttonBarSvc: ButtonBarService, - extensionSvc: ExtensionService - ) { - super( - $q, - $element, - $scope, - $compile, - growl, - schemaSvc, - viewHtmlSvc, - presentationSvc, - componentSvc, - eventSvc, - imageSvc, - buttonBarSvc, - extensionSvc - ); - } - - config = (): void => { - this.plot = this.peObject as PresentPlotObject; - }; - - getContent = (): VePromise => { - if (this.plot.type === 'Plot') { - if (this.plot.config !== undefined && this.plot.config.trim().length !== 0) { - try { - this.plotConfig = JSON.parse(this.plot.config.replace(/'/g, '"')) as PresentPlotObject; - if (this.plotConfig.ptype !== undefined) { - this.plot.ptype = this.plotConfig.ptype; - } - } catch (err) { - console.log('error ignored'); - } - } - return this.$q.resolve( - `
    {{$ctrl.plot.title}}
    ` - ); - } - }; - }, -}; - -veComponents.component(ViewPlotComponent.selector, ViewPlotComponent); diff --git a/src/ve-extensions/ts-diagram/mmsTsDiagram.directive.ts b/src/ve-extensions/ts-diagram/mmsTsDiagram.directive.ts deleted file mode 100644 index 1541d1711..000000000 --- a/src/ve-extensions/ts-diagram/mmsTsDiagram.directive.ts +++ /dev/null @@ -1,454 +0,0 @@ -import angular from 'angular'; - -const veDirectives = angular.module('veDirectives'); - -veDirectives.directive('mmsTsDiagram', [ - 'ElementService', - '$templateCache', - '$window', - '$timeout', - 'growl', - 'ApplicationService', - 'AuthService', - 'URLService', - mmsTsDiagram, -]); - -/** - * @ngdoc directive - * @name veDirectives.directive:mmsTsDiagram - * - * @requires mms.ElementService - * @requires $templateCache - * @requires $window - * @requires growl - * @requires ApplicationService - * @requires AuthService - * - * @restrict E - * * //TODO - update - * - */ -function mmsTsDiagram( - ElementService, - $templateCache, - $window, - $timeout, - growl, - ApplicationService, - AuthService, - URLService -) { - let importedTsJs = false; - const template = 'partials/mms-directives/mmsTsDiagram.html'; - const mapping = {}; - // var deferreds = {}; - const projectId2PeId = {}; - const peId2projectId = {}; - const projectIdLoaded = {}; - const viewNameMapping = { - IBD: 'Internal Block Diagram', - BDD: 'Block Definition Diagram', - STM: 'State Machine', - ACT: 'Activity Diagram', - SD: 'Sequence Diagram', - PKG: 'Package Diagram', - PAR: 'Parametric Diagram', - REQ: 'Requirement Diagram', - UC: 'Use Case Diagram', - }; - const controlMapping = { - IBD: 'IBD Controls', - BDD: 'BDD Controls', - STM: 'STM Controls', - ACT: 'ACT Controls', - SD: 'Controls', - PKG: 'PKG Controls', - PAR: 'PAR Controls', - REQ: 'REQ Controls', - UC: 'UC Controls', - }; - const elementTableMapping = { - IBD: 'IBD Elements', - BDD: 'BDD Elements', - STM: 'STM Elements', - ACT: 'ACT Elements', - SD: 'Elements', - PKG: 'PKG Elements', - PAR: 'PAR Elements', - REQ: 'REQ Elements', - UC: 'UC Elements', - }; - const relTableMapping = { - IBD: 'IBD Relationships', - BDD: 'BDD Relationships', - STM: 'STM Relationships', - ACT: 'ACT Relationships', - SD: 'Associations', - PKG: 'PKG Relationships', - PAR: 'PAR Relationships', - REQ: 'REQ Relationships', - UC: 'UC Relationships', - }; - - $window.onPerspectivesCommandSuccess = (successfulCommand) => { - console.log('Perspectives command: ' + successfulCommand.command + ' completed successfully'); - $window.hidePerspectivesProgressIndicator(); - }; - $window.onPerspectivesCommandFailure = function (failedCommand, message, callstack) { - console.log('Perspectives command ' + failedCommand.commmand + ' failed. Reason is: ' + message); - $window.hidePerspectivesProgressIndicator(); - console.log(callstack); - }; - $window.onPerspectivesProjectLoad = (projectID) => { - console.log('All project UI elements should now be on the DOM for ' + projectID); - }; - $window.onPerspectivesProjectReady = (projectID) => { - console.log( - 'All project RPC calls are complete and you can now access all project resources via the DOM. ' + projectID - ); - if (!projectIdLoaded[projectID]) { - $window.showPerspectivesProgressIndicator(); - $window.invokePerspectivesCommand(mapping[projectID]); - projectIdLoaded[projectID] = true; - } - }; - $window.onPerspectivesViewLoaded = function (projectID, moduleName, modelID, viewID, viewName) { - console.log('The Perspectives view ' + viewID + ' is now on the DOM.'); - }; - $window.onPerspectivesViewUpdated = function (projectID, moduleName, modelID, viewID, viewNamem, peObject) { - console.log('The Perspectives view' + viewID + ' was udpdated with data ' + peObject); - }; - $window.onPerspectivesViewCanvasRendered = function (projectID, moduleName, modelID, viewID, viewName) { - console.log('The Perspectives canvas for view' + viewID + ' was rendered'); - }; - $window.onPerspectivesMouseClickOnObject = (data) => { - if (data) { - console.log('JavaScript Callback = Mouse clicked on object with ID = ' + data.objectID); - } - }; - $window.onPerspectivesMouseDoubleClickOnObject = (data) => { - if (data) { - console.log('JavaScript Callback = Mouse double clicked on object with ID = ' + data.objectID); - } - }; - $window.PerspectivesErrorDialogHandler = function (message, callStackString) { - //prevent ts error dialog from appearing for any js exception - console.log(message); - console.log(callStackString); - }; - //store global mapping of project name to hash, on*** functions can lookup the hash - const mmsTsDiagramLink = (scope, element, attrs) => { - if (!$window.invokePerspectivesCommand && !importedTsJs) { - $('body').append( - '\n' + - '\n' + - '\n' + - '' - ); - - importedTsJs = true; - } - let id = ApplicationService.createUniqueId(); - if (peId2projectId[scope.mmsPeId]) { - id = peId2projectId[scope.mmsPeId]; - } else { - peId2projectId[scope.mmsPeId] = id; - } - projectId2PeId[id] = scope.mmsPeId; - - scope.containerId = 'tabContainer-' + id; - scope.viewId = 'view-' + id; - scope.tableId = 'table-' + id; - scope.edgeTableId = 'edgeTable-' + id; - scope.inspectorId = 'inspector-' + id; - scope.controlsId = 'controls-' + id; - scope.initElements = []; - - const params = { - viewName: viewNameMapping[scope.mmsTspSpec.diagramType], - viewType: 'tsDrawingView', - tableName: elementTableMapping[scope.mmsTspSpec.diagramType], - edgeTableName: relTableMapping[scope.mmsTspSpec.diagramType], - inspectorName: 'Details', - controlsName: controlMapping[scope.mmsTspSpec.diagramType], - }; - - if (scope.mmsTspSpec && scope.mmsTspSpec.elements) scope.initElements = scope.mmsTspSpec.elements; - if (scope.mmsTspSpec && scope.mmsTspSpec.context) scope.context = scope.mmsTspSpec.context; - - const webProjectCommand = _createWebProjectCommand(scope, params, id); - mapping[id] = _createUpdateCommand(scope, params.viewName, id); - - function tryInvokeCommand() { - if (!$window.invokePerspectivesCommand) { - $timeout(tryInvokeCommand, 1000, false); - } else { - $window.invokePerspectivesCommand(webProjectCommand); - } - } - tryInvokeCommand(); - }; - - function _getElementsArrayString(elements) { - return '[{"id": "' + elements.join('"}, {"id": "') + '"}]'; - } - - function _createWebProjectCommand(scope, params, id) { - const webProjectCommand = { - command: 'WebProject', - onload: 'onPerspectivesProjectLoad', - onready: 'onPerspectivesProjectReady', //quirk? - onfailure: 'onPerspectivesCommandFailure', - onsuccess: 'onPerspectivesCommandSuccess', - data: [ - { - command: 'LoadProject', - data: { - project: id, - filename: 'project/MMS.tsp', - }, - }, - { - command: 'NewDefaultModel', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - }, - }, - { - command: 'NewIntegrator', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - integratorName: 'MMS ADD', - integratorID: 'int-add-' + id, - }, - }, - { - command: 'NewIntegrator', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - integratorName: 'Filter Control Data', - integratorID: 'int-fcd-' + id, - integratorFileLocation: 'data/SysMLFilterDefaults.xlsx', - }, - }, - { - command: 'NewView', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - viewID: 'view-' + id, - viewName: params.viewName, - viewClass: params.viewType, - onload: 'onPerspectivesViewLoaded', - onupdate: 'onPerspectivesViewUpdated', - oncanvasrendered: 'onPerspectivesViewCanvasRendered', - }, - }, - { - command: 'NewView', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - viewID: 'table-' + id, - viewName: params.tableName, - viewClass: 'tsTableView', - onload: 'onPerspectivesViewLoaded', - onupdate: 'onPerspectivesViewUpdated', - oncanvasrendered: 'onPerspectivesViewCanvasRendered', - }, - }, - { - command: 'NewView', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - viewID: 'edgeTable-' + id, - viewName: params.edgeTableName, - viewClass: 'tsTableView', - onload: 'onPerspectivesViewLoaded', - onupdate: 'onPerspectivesViewUpdated', - oncanvasrendered: 'onPerspectivesViewCanvasRendered', - }, - }, - { - command: 'NewView', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - viewID: '' + scope.inspectorId, - viewName: params.inspectorName, - viewClass: 'tsInspectorView', - onload: 'onPerspectivesViewLoaded', - onupdate: 'onPerspectivesViewUpdated', - oncanvasrendered: 'onPerspectivesViewCanvasRendered', - }, - }, - { - command: 'NewView', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - viewID: '' + scope.controlsId, - viewName: params.controlsName, - viewClass: 'tsTreeView', - onload: 'onPerspectivesViewLoaded', - onupdate: 'onPerspectivesViewUpdated', - oncanvasrendered: 'onPerspectivesViewCanvasRendered', - }, - }, - { - command: 'NewTabPanel', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - id: 'tabContainer-' + id, - widgetIDs: [ - scope.viewId, - scope.tableId, - scope.edgeTableId, - scope.inspectorId, - scope.controlsId, - ], - }, - }, - ], - }; - return webProjectCommand; - } - - function _createUpdateCommand(scope, viewName, id) { - const updateCommand: { - data: object[]; - command: string; - onsuccess: string; - } = { - command: 'Group', - onsuccess: 'onPerspectivesCommandSuccess', - data: [] as object[], - }; - updateCommand.data.push( - { - command: 'Custom', - data: { - serverClassName: 'gov.nasa.jpl.mbee.ems.action.SetMmsRestBaseUrlCommandImpl', - args: ['int-add-' + id, URLService.getMmsServer() + URLService.getRoot()], - modelID: 'model-' + id, - module: 'SysML', - project: id, - viewID: 'view-' + id, - viewName: viewName, - }, - }, - { - command: 'SetModelAttribute', - data: { - attributeName: 'Ticket', - attributeValue: AuthService.getToken(), - modelID: 'model-' + id, - module: 'SysML', - project: id, - viewID: 'view-' + id, - viewName: viewName, - }, - onfailure: 'onPerspectivesCommandFailure', - }, - { - command: 'SetModelAttribute', - data: { - attributeName: 'MMSRefId', - attributeValue: scope.mmsRefId, - modelID: 'model-' + id, - module: 'SysML', - project: id, - viewID: 'view-' + id, - viewName: viewName, - }, - onfailure: 'onPerspectivesCommandFailure', - }, - { - command: 'SetModelAttribute', - data: { - attributeName: 'MMSProjectId', - attributeValue: scope.mmsProjectId, - modelID: 'model-' + id, - module: 'SysML', - project: id, - viewID: 'view-' + id, - viewName: viewName, - }, - onfailure: 'onPerspectivesCommandFailure', - } - ); - if (scope.context || scope.initElements.length > 0) { - const initialIntegratorIds: string[] = []; - if (scope.initElements.length > 0) { - updateCommand.data.push({ - command: 'SetModelAttribute', - data: { - attributeName: 'Inserts', - attributeValue: _getElementsArrayString(scope.initElements), - modelID: 'model-' + id, - module: 'SysML', - project: id, - viewID: 'view-' + id, - viewName: viewName, - }, - onfailure: 'onPerspectivesCommandFailure', - }); - initialIntegratorIds.push('int-add-' + id); - } - initialIntegratorIds.push('int-fcd-' + id); - updateCommand.data.push({ - command: 'Update', - onsuccess: 'onPerspectivesCommandSuccess', - onfailure: 'onPerspectivesCommandFailure', - data: { - project: id, - module: 'SysML', - integratorIDs: initialIntegratorIds, - }, - }); - if (scope.context) { - updateCommand.data.push({ - command: 'Custom', - data: { - project: id, - module: 'SysML', - modelID: 'model-' + id, - serverClassName: 'gov.nasa.jpl.mbee.ems.command.NewContextCommand', - viewID: 'view-' + id, - viewName: viewName, - args: ['' + scope.context], - }, - onfailure: 'onPerspectivesCommandFailure', - }); - } - } - return updateCommand; - } - - return { - restrict: 'E', - templateUrl: template, - scope: { - mmsProjectId: '@', - mmsRefId: '@', - mmsTspSpec: '<', - mmsPeId: '@', - }, - link: mmsTsDiagramLink, - }; -} diff --git a/src/ve-extensions/types/ve-custom.d.ts b/src/ve-extensions/types/ve-custom.d.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/ve-types/angular.d.ts b/src/ve-types/angular.d.ts deleted file mode 100644 index 3a4041f57..000000000 --- a/src/ve-types/angular.d.ts +++ /dev/null @@ -1,69 +0,0 @@ -//AngularJS Type Overrides -import angular, { - IComponentOptions, - IHttpHeadersGetter, - INgModelController, - IPromise, - IQResolveReject, - IQService, - IRequestConfig, -} from 'angular'; - -import { ElementObject, ElementsResponse } from '@ve-types/mms'; - -export interface VeComponentOptions extends IComponentOptions { - selector: string; -} - -export interface VeQService extends IQService { - new >( - resolver: (resolve: IQResolveReject, reject: IQResolveReject>) => any - ): VePromise; - (resolver: (resolve: IQResolveReject, reject: IQResolveReject>) => any): VePromise< - T, - U - >; -} - -export interface VePromise> extends IPromise { - then( - successCallback?: ((value: T) => PromiseLike | PromiseLike | TResult1) | null, - errorCallback?: ((reason: VePromiseReason) => PromiseLike | PromiseLike | TResult2) | null, - notifyCallback?: (state: unknown) => unknown - ): VePromise; - then( - successCallback?: ((value: T) => PromiseLike | PromiseLike | TResult1) | null, - errorCallback?: ((reason: VePromiseReason) => PromiseLike | PromiseLike | TResult2) | null, - notifyCallback?: (state: unknown) => unknown - ): VePromise; - - catch( - onRejected?: ((reason: VePromiseReason) => PromiseLike | PromiseLike | TResult) | null - ): VePromise; - catch( - onRejected?: ((reason: VePromiseReason) => VePromise | IPromise | TResult) | null - ): VePromise; -} - -export interface VePromisesResponse> { - failedRequests?: VePromiseReason[]; - successfulRequests?: T[]; -} - -export interface VeNgModelController extends INgModelController { - $modelValue: T; -} - -export interface VePromiseReason { - type?: 'error' | 'info' | 'warning'; - state?: angular.PromiseState; - message?: string; - recentVersionOfElement?: ElementObject; - data?: T; - status: number; - headers?: IHttpHeadersGetter; - config?: IRequestConfig; - statusText?: string; - /** Added in AngularJS 1.6.6 */ - xhrStatus?: 'complete' | 'error' | 'timeout' | 'abort'; -} diff --git a/src/ve-types/components/index.d.ts b/src/ve-types/components/index.d.ts deleted file mode 100644 index 36c2b43c0..000000000 --- a/src/ve-types/components/index.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import angular from 'angular'; - -import { SpecApi } from '@ve-components/spec-tools'; -import { ButtonBarApi } from '@ve-core/button-bar'; - -import { VePromise } from '@ve-types/angular'; -import { ElementObject, InstanceValueObject, ValueObject, ViewObject } from '@ve-types/mms'; - -export interface ComponentController { - element: T; - commitId: string; - edit: T; - view?: ViewObject; - instanceSpec?: ElementObject; - instanceVal?: InstanceValueObject; - elementSaving: boolean; - editLoading?: boolean; - bbApi?: ButtonBarApi; - editorOptions?: { callback?(e?: JQuery.ClickEvent): VePromise }; - specApi?: SpecApi; - // isEnumeration: boolean, - skipBroadcast: boolean; - isEditing: boolean; - inPreviewMode: boolean; - values?: ValueObject[]; - editValues?: ValueObject[]; - $scope: angular.IScope; -} -export { InsertApi } from '@ve-types/components/insertions'; -export { InsertData } from '@ve-types/components/insertions'; -export { InsertResolve } from '@ve-types/components/insertions'; -export { InsertResolveFn } from '@ve-types/components/insertions'; diff --git a/src/ve-types/components/insertions.d.ts b/src/ve-types/components/insertions.d.ts deleted file mode 100644 index 10a27359e..000000000 --- a/src/ve-types/components/insertions.d.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { ElementObject } from '@ve-types/mms'; -import { VeModalResolve, VeModalResolveFn } from '@ve-types/view-editor'; - -export interface InsertResolveFn extends VeModalResolveFn { - getInsertData(): T; - - getProjectId(): string; - - getRefId(): string; - - getOrgId(): string; -} - -export interface InsertResolve extends VeModalResolve { - getInsertData: T; - getProjectId: string; - getRefId: string; - getOrgId: string; -} - -export interface InsertData { - type: string; - insertType: string; - noPublish?: boolean; - isNew?: boolean; - parentTitle?: string; - selected?: ElementObject; -} - -export interface InsertApi { - resolve(data: T): void; - - reject(reason: U): void; -} diff --git a/src/ve-types/components/presentation.d.ts b/src/ve-types/components/presentation.d.ts deleted file mode 100644 index 83727ef4c..000000000 --- a/src/ve-types/components/presentation.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { VeComponentOptions } from '@ve-types/angular'; - -export interface IPresentationComponentOptions extends VeComponentOptions { - selector: string; - style?: string[]; - bindings: { - peObject: string; - instanceSpec: string; - peNumber: string; - mmsProjectId?: '@'; - mmsRefId?: '@'; - mmsCommitId?: '@'; - [key: string]: string; - }; - required?: { - mmsViewPresentationElemCtrl: string; - mmsViewCtrl: string; - [key: string]: string; - }; -} - -export interface ITableConfig { - sortByColumnFn(sortCol?: number): void; - - showBindingForSortIcon: number; - filterDebounceRate: number; - filterTermColumnPrefixBinding: string; -} diff --git a/src/ve-types/config.d.ts b/src/ve-types/config.d.ts deleted file mode 100644 index d9baacb4a..000000000 --- a/src/ve-types/config.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { VeExperimentConfig, VeExperimentDescriptor } from '@ve-components/services'; -import { BrandingStyle } from '@ve-utils/application'; - -export interface VeConfig { - version?: string; - apiUrl: string; - printUrl: string; - basePath: string; - enableDebug?: boolean; - customLabels?: { [key: string]: string }; - loginBanner?: BrandingStyle; - loginWarning?: BrandingStyle; - banner?: BrandingStyle; - footer?: BrandingStyle; - loginTimeout?: number; - experimental?: VeExperimentDescriptor[]; - expConfig?: VeExperimentConfig; -} diff --git a/src/ve-types/core/editor.d.ts b/src/ve-types/core/editor.d.ts deleted file mode 100644 index 078887b38..000000000 --- a/src/ve-types/core/editor.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface EditorActions { - cancel(e?): void; - - reset(e?): void; - - delete(e?): void; - - preview(e?): void; - - save(e?): void; - - saveC(e?): void; -} diff --git a/src/ve-types/mms/index.d.ts b/src/ve-types/mms/index.d.ts deleted file mode 100644 index a344f7aa4..000000000 --- a/src/ve-types/mms/index.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ArtifactObject } from '@ve-types/mms/mms'; -import { ValueObject } from '@ve-types/mms/valuesAndInstances'; - -export * from './valuesAndInstances.d'; -export * from './views.d'; -export * from './orgsAndProjects.d'; -export * from './mms.d'; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type MmsObject = Record; - -export interface TransclusionObject extends MmsObject { - element?: ElementObject; - tag: string; -} - -export interface ElementObject extends MmsObject { - id: string; - _projectId: string; - _refId: string; - _commitId?: string; - _modified?: string; - _modifier?: string; - _creator?: string; - _created?: string; - _inRefIds?: string[]; - _artifacts?: ArtifactObject[]; - appliedStereotypeIds?: string[]; - _appliedStereotypeIds?: string[]; // mdk < 6 - type?: string; - typeId?: string; - defaultValue?: ValueObject; - documentation?: string; - name?: string; - ownerId?: string; -} diff --git a/src/ve-types/mms/mms.d.ts b/src/ve-types/mms/mms.d.ts deleted file mode 100644 index 2b8afd391..000000000 --- a/src/ve-types/mms/mms.d.ts +++ /dev/null @@ -1,211 +0,0 @@ -import { - CommitObject, - ElementObject, - GroupObject, - MmsObject, - OrgObject, - ProjectObject, - RefObject, - UserObject, -} from '@ve-types/mms'; - -export interface UserObject extends MmsObject { - username: string; - id?: string; - created?: Date; - modified?: Date; - email?: string; - firstName?: string; - lastName?: string; - admin?: boolean; - enabled?: boolean; - fullName?: string; -} - -export interface CommitObject extends MmsObject { - deleted?: CommitChangeElement[]; - _creator?: string; - added?: CommitChangeElement[]; - _docId?: string; - _created?: string; - comment?: null; - source?: null; - id: string; - updated?: CommitChangeElement[]; - _refId: string; - _projectId: string; -} - -export interface CommitChangeElement extends MmsObject { - _previousDocId: string; - _docId: string; - id: string; - type: string; -} - -export interface RequestObject extends MmsObject { - projectId: string; - refId: string; - orgId?: string; - commitId?: string; - depth?: number; -} - -export interface ShortUrlRequest extends RequestObject { - orgId: string; - viewId?: string; - documentId: string; -} - -export interface ElementsRequest extends RequestObject { - elementId: T; -} - -export interface UsersRequest extends RequestObject { - username: string; -} - -export interface CreationRequest { - elements: T[]; -} - -export interface ElementCreationRequest extends RequestObject { - elements: T[]; -} - -export interface ViewsRequest extends RequestObject { - returnChildViews?: boolean; - parentViewId?: string; - aggr?: string; -} - -export interface ViewCreationRequest extends ViewsRequest { - viewId: string; - viewDoc?: string; - viewName?: string; -} - -export interface ArtifactsRequest extends ElementsRequest { - artifactExtension: string; -} - -export interface AuthRequest { - username: string; - password: string; -} - -export interface ArtifactObject { - extension: string; - checksum: string; - locationType: string; - location: string; - mimetype: string; -} - -export interface ParamsObject { - projectId?: string; - refId?: string; - viewId?: string; - documentId?: string; - shortUrl?: string; - keywords?: string; - field?: string; - fromLogin?: boolean; - '#'?: string; - display?: string; - preview?: string; - next?: string; - [param: string]: string; -} - -export interface QueryObject extends MmsObject { - params?: { - [key: string]: string | object; - }; - recurse?: { - [key: string]: string | object; - }; - from?: number; - size?: number; -} - -export interface QueryParams extends MmsObject { - showDeleted?: boolean; - [key: string]: string | boolean | number; -} - -export interface AuthResponse { - token: string; -} - -export interface VersionResponse { - mmsVersion: string; -} - -export interface CheckAuthResponse { - username: string; -} - -interface BasicResponse { - messages: string[]; - rejected: RejectedObject[]; -} - -interface GenericResponse extends BasicResponse { - [p: string]: T[]; -} - -interface RejectedObject { - code: number; - message: string; - object: T; -} - -export interface ElementsResponse extends BasicResponse { - elements: T[]; - deleted?: T[]; -} - -export interface PermissionsResponse extends BasicResponse { - lookups: PermissionsObject[]; - allPassed: boolean; -} - -export interface PermissionsObject { - type: string; - orgId?: string; - projectId?: string; - refId?: string; - groupName?: string; - privilege: string; - allowAnonIfPublic: boolean; - hasPrivilege: boolean; -} - -export interface SearchResponse extends ElementsResponse { - total: number; - rejectedTotal: number; -} - -export interface OrgsResponse extends BasicResponse { - orgs: OrgObject[]; -} -export interface ProjectsResponse extends BasicResponse { - projects: ProjectObject[]; -} - -export interface RefsResponse extends BasicResponse { - refs: RefObject[]; -} - -export interface CommitResponse extends BasicResponse { - commits: CommitObject[]; -} - -export interface GroupsResponse extends BasicResponse { - groups: GroupObject[]; -} - -export interface UsersResponse extends BasicResponse { - users: UserObject[]; -} diff --git a/src/ve-types/mms/orgsAndProjects.d.ts b/src/ve-types/mms/orgsAndProjects.d.ts deleted file mode 100644 index 64a7dd2d6..000000000 --- a/src/ve-types/mms/orgsAndProjects.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { MmsObject } from '@ve-types/mms'; - -export interface OrgObject extends MmsObject { - public: boolean; - created: string; - name: string; - modified: string; - id: string; -} - -export interface ProjectObject extends MmsObject { - _refId?: string; - schema?: string; - _creator?: string; - _docId?: string; - _created?: string; - name?: string; - id: string; - orgId?: string; -} - -export interface MountObject extends ProjectObject { - _mounts: MountObject[]; - _refId: string; - _projectId: string; -} - -export interface RefObject extends MmsObject { - parentRefId?: string; - deleted?: boolean; - _docId?: string; - _creator?: string; - _created?: string; - description?: string; - name?: string; - id: string; - type: string; - _projectId: string; - permission?: string; - parentCommitId?: string; - timestamp?: Date; -} diff --git a/src/ve-types/mms/valuesAndInstances.d.ts b/src/ve-types/mms/valuesAndInstances.d.ts deleted file mode 100644 index 34a7275b9..000000000 --- a/src/ve-types/mms/valuesAndInstances.d.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ElementObject } from '@ve-types/mms'; - -//Value Specs -export interface ValueObject extends ElementObject { - expression?: ExpressionObject; -} - -export interface LiteralObject extends ValueObject { - value?: T; -} -export interface InstanceValueObject extends ValueObject { - instanceId?: string; -} -export interface ElementValueObject extends ValueObject { - elementId?: string; -} -export interface ExpressionObject extends ValueObject { - operand?: T[]; -} - -//Constraint -export interface ConstraintObject extends ElementObject { - specification?: ValueObject; -} - -//Instances -export interface InstanceSpecObject extends ElementObject { - classifierIds?: string[]; - specification?: ValueObject; -} - -export interface SlotObject extends LiteralObject[]> { - definingFeatureId: string; -} - -export interface TaggedValueObject extends LiteralObject[]> { - tagDefinitionId: string; -} - -export interface ElementTaggedValueObject extends TaggedValueObject { - valueIds: string[]; -} diff --git a/src/ve-types/mms/views.d.ts b/src/ve-types/mms/views.d.ts deleted file mode 100644 index 08b0bba9c..000000000 --- a/src/ve-types/mms/views.d.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { - ElementObject, - MmsObject, - ExpressionObject, - InstanceSpecObject, - InstanceValueObject, - LiteralObject, -} from '@ve-types/mms'; - -/* View Objects */ -export interface ViewObject extends ElementObject { - isDoc?: boolean; - aggregation?: string; - propertyId?: string; - _relatedDocuments?: ViewObject[]; - _parentViews?: ViewObject[]; - _contents?: ExpressionObject; - _childViews?: ViewObject[]; - _displayedElementIds?: string[]; - _veNumber?: string; - _printCss?: string; -} - -export interface DocumentObject extends ViewObject { - _groupId?: string; - _startChapter?: number; -} - -export interface PackageObject extends ElementObject { - elementImportIds?: string[]; - packageImportIds?: string[]; - URI?: string; - packageMergeIds?: string[]; - profileApplicationIds?: string[]; -} - -export interface GroupObject extends PackageObject { - _isGroup?: boolean; - _parentId?: string; -} - -/* View and Presentation Instances */ -export interface ViewInstanceSpec extends InstanceSpecObject { - specification?: ExpressionObject | LiteralObject; - _veNumber?: string; -} - -export interface PresentationReference extends MmsObject { - instanceId: string; - instanceVal?: InstanceValueObject; - sectionElements: PresentationReference[]; - instanceSpecification?: ViewInstanceSpec; - presentationElement?: PresentationInstanceObject | ViewInstanceSpec; - isOpaque: boolean; -} - -export interface PresentationInstanceObject extends MmsObject { - type: string; - isOpaque?: boolean; -} - -export interface PresentContentObject extends PresentationInstanceObject { - excludeFromList: boolean; - showIfEmpty: boolean; - title: string; -} - -export interface PresentImageObject extends PresentContentObject { - id: string; -} - -export interface PresentListObject extends PresentContentObject { - list: PresentationInstanceObject[][]; - ordered?: boolean; -} - -export interface PresentTableObject extends PresentContentObject { - body: TableEntryObject[][]; - header?: TableEntryObject[][]; - colwidths?: string; - style: string; -} - -export interface TableEntryObject { - colspan: number; - rowspan: number; - content: PresentationInstanceObject[]; - startCol?: number; - endCol?: number; - startRow?: number; - endRow?: number; -} - -export interface PresentTextObject extends PresentationInstanceObject { - source: string; - sourceProperty?: string; - sourceType: string; - nonEditable?: boolean; - text?: string; -} diff --git a/src/ve-types/third-party/angular.d.ts b/src/ve-types/third-party/angular.d.ts deleted file mode 100644 index a07055cb5..000000000 --- a/src/ve-types/third-party/angular.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* eslint-disable unused-imports/no-unused-imports */ -import angular from 'angular'; - -declare module 'angular' { - interface IRequestConfig { - cancel: IDeferred; - } - interface IPromise { - state: string; - } - interface IDeferred { - state: string; - } -} diff --git a/src/ve-types/third-party/jquery.d.ts b/src/ve-types/third-party/jquery.d.ts deleted file mode 100644 index 05758937c..000000000 --- a/src/ve-types/third-party/jquery.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -export {}; - -declare global { - interface JQuery { - isOnScreen(x?: number, y?: number): boolean; - - table2CSV(inputOptions: table2CSV.inputOptions): string; - } - - namespace JQuery { - namespace table2CSV { - interface inputOptions { - delivery: string; - separator?: string; - header?: string[]; - } - } - } -} diff --git a/src/ve-types/third-party/mathjax.d.ts b/src/ve-types/third-party/mathjax.d.ts deleted file mode 100644 index 5b99e02f3..000000000 --- a/src/ve-types/third-party/mathjax.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface MathJaxObject { - typesetPromise(elements: any[]): Promise; -} diff --git a/src/ve-types/tree.d.ts b/src/ve-types/tree.d.ts deleted file mode 100644 index ba7e7e355..000000000 --- a/src/ve-types/tree.d.ts +++ /dev/null @@ -1,169 +0,0 @@ -import angular from 'angular'; - -import ITreeNode = AngularUITree.ITreeNode; - -import { ElementObject, ElementsRequest, ViewObject } from '@ve-types/mms'; - -/** - * @typedef TreeBranch - */ -export interface TreeBranch extends ITreeNode { - label: string; - type: string; - priority?: number; - group?: ElementObject; - data: ViewObject; - children: TreeBranch[]; - hide?: boolean; - level?: number; - new?: string; - loading?: boolean; - aggr?: string; - propertyId?: string; - parent_uid?: string; - uid?: string; - viewId?: string; - selected?: boolean; - expanded?: boolean; - expandable?: boolean; - favorite?: boolean; - onSelect?(branch: TreeBranch): void; - onDblClick?(branch: TreeBranch): void; -} - -export interface TreeRow { - branch: TreeBranch; - children: TreeBranch[]; - visibleChild: boolean; - label: string; - level: number; - section: string; - typeIcon: string; - visible: boolean; -} - -export interface TreeApi extends ElementsRequest { - rootId?: string; - refType: string; - sectionNumbering?: boolean; - numberingDepth?: number; - numberingSeparator?: string; - expandLevel?: number; - search?: string; - sort?: boolean; - startChapter?: number; - treeContentLoading?: boolean; - treeCategory?: string; - expandCallback?(elementId: string, branch: TreeBranch, recurse: boolean); - onSelect?(branch: TreeBranch): void; - onDblClick?(branch: TreeBranch): void; -} - -export interface TreeConfig { - id: string; - title?: string; - icon?: string; - types?: string[]; - treeData?: TreeBranch[]; - treeRows?: TreeRow[]; -} - -export interface TreeIcons { - iconExpand: string; - iconCollapse: string; - iconDefault: string; -} - -export interface VeTreeNodeScope extends AngularUITree.ITreeNodeScope { - node: TreeBranch; -} - -export interface View2NodeMap { - [key: string]: TreeBranch; -} - -declare namespace AngularUITree { - interface IEventSourceInfo { - cloneModel: any; - index: number; - nodeScope: ITreeNodeScope; - nodesScope: ITreeNodeScope; - } - - interface IPosition { - dirAx: number; - dirX: number; - dirY: number; - distAxX: number; - distAxY: number; - distX: number; - distY: number; - lastDirX: number; - lastDirY: number; - lastX: number; - lastY: number; - moving: boolean; - nowX: number; - nowY: number; - offsetX: number; - offsetY: number; - startX: number; - startY: number; - } - - interface IEventInfo { - dest: { - index: number; - nodesScope: IParentTreeNodeScope; - }; - elements: any; - pos: IPosition; - source: IEventSourceInfo; - } - - interface IAcceptCallback { - (source: ITreeNodeScope, destination: ITreeNodeScope, destinationIndex: number): boolean; - } - - interface IDragCallback { - (eventInfo: IEventInfo): void; - } - - interface ICallbacks { - accept?: IAcceptCallback; - dragStart?: IDragCallback; - dropped?: IDragCallback; - dragStop?: IDragCallback; - } - - /** - * Internal representation of node in the UI - */ - interface ITreeNodeScope extends angular.IScope { - $element: JQuery; - $modelValue: any; // Model value for node; - $nodeScope: ITreeNodeScope; // uiTreeNode Scope of this node - $parentNodeScope: IParentTreeNodeScope[]; // uiTreeNode Scope of parent node; - $childNodesScope: ITreeNodeScope[]; // uiTreeNodes Scope of child nodes. - $parentNodesScope: angular.IScope; // uiTreeNodes Scope of parent nodes. - $treeScope: angular.IScope; // uiTree scope - $handleScope: angular.IScope; // it's handle scope - $type: 'uiTreeNode'; - node: ITreeNode; - } - - interface IParentTreeNodeScope extends ITreeNodeScope { - isParent(nodeScope: ITreeNodeScope): boolean; - } - - // /** - // * Node in list - // */ - // interface ITreeNode {} - // - // interface ITreeNodeExample extends ITreeNode { - // id: number | string - // nodes: ITreeNodeExample[] - // title: string - // } -} diff --git a/src/ve-types/view-editor.d.ts b/src/ve-types/view-editor.d.ts deleted file mode 100644 index a6241006a..000000000 --- a/src/ve-types/view-editor.d.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { ngStorage } from 'ngstorage'; - -import IModalService = angular.ui.bootstrap.IModalService; -import IModalSettings = angular.ui.bootstrap.IModalSettings; -import IModalInstanceService = angular.ui.bootstrap.IModalInstanceService; - -import { VeComponentOptions, VePromise, VePromiseReason } from '@ve-types/angular'; -import { MmsObject, OrgObject, ProjectObject, ViewObject } from '@ve-types/mms'; - -export type veSearchCallback = (elem: T, property: string) => void; - -export interface VeSearchOptions { - getProperties?: boolean; - searchResult?: T[]; - searchField?: string; - closeable: boolean; - closeCallback?(): void; - searchInput?: string; - hideFilterOptions?: boolean; - callback?: veSearchCallback; - relatedCallback?(doc: ViewObject, view: ViewObject, elem: T): void; - filterCallback?(elements: T[]): T[]; - filterQueryList?: [(...any) => { [key: string]: string[] }]; - emptyDocTxt?: string; - itemsPerPage?: number; -} - -export interface VeModalService extends IModalService { - open?(settings: VeModalSettings): VeModalInstanceService; -} - -export interface VeModalSettings extends IModalSettings { - component: string; - resolve?: U; - // bindings?: { - // modalInstance: VeModalInstanceService - // resolve?: U - // } -} - -export interface VeModalComponent extends VeComponentOptions { - bindings?: { - modalInstance: string; - resolve?: string; - }; -} - -export interface VeModalInstanceService extends IModalInstanceService { - close(result?: T): void; - dismiss(reason?: T): void; - result: VePromise; -} - -export interface VeModalController extends IComponentController { - // close: ($value?: any) => void, - // dismiss: ($value?: any) => void, - modalInstance: IModalInstanceService; -} - -export interface VeModalResolve { - [key: string]: unknown; -} - -export interface VeModalResolveFn { - [key: string]: () => unknown; -} - -export interface VeStorageService extends ngStorage.StorageService { - token: string; - org: OrgObject; - project: ProjectObject; -} - -export interface VeApiObject { - [key: string]: VeApiWait; -} - -export interface VeApiWait { - resolve?(result: T): void; - reject?(reason: VePromiseReason): void; - promise?: VePromise; - api?: T; - refId?: string; - projectId?: string; -} -// { -// getProperties: any -// emptyDocTxt?: string -// searchResult?: ElementObject[] -// searchInput?: string -// itemsPerPage: number -// hideFilterOptions?: boolean -// callback?(elem, property): void -// relatedCallback?(doc, view, elem): void -// filterCallback?(elements: ElementObject[]): ElementObject[] -// } diff --git a/src/ve-types/window.d.ts b/src/ve-types/window.d.ts deleted file mode 100644 index 88f8342c9..000000000 --- a/src/ve-types/window.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -//https://stackoverflow.com/questions/57132428/augmentations-for-the-global-scope-can-only-be-directly-nested-in-external-modul -import { MathJaxObject } from 'mathjax-full/js/components/startup'; - -import { HtmlRenderedDiff } from '../lib/html-rendered-diff'; - -import { VeConfig } from '@ve-types/config'; - -export {}; - -declare global { - interface Window { - $: JQuery; - MathJax: MathJaxObject; - __env: VeConfig; - HtmlRenderedDiff: HtmlRenderedDiff; - Promise: Promise; - } -} diff --git a/src/ve-utils/application/Application.service.ts b/src/ve-utils/application/Application.service.ts deleted file mode 100644 index 97a83e657..000000000 --- a/src/ve-utils/application/Application.service.ts +++ /dev/null @@ -1,219 +0,0 @@ -import { CacheService } from '@ve-utils/core'; -import { ApiService, ElementService, ProjectService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { BrandingStyle } from './Branding.service'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { ElementObject, UsersRequest } from '@ve-types/mms'; -/** - * @ngdoc service - * @name veUtils/ApplicationService - * @requires $q - * @requires $http - * @requires URLService - * * Provide general applications functions such as getting MMS Version, getting username, - * creating unique IDs, etc... - */ - -export interface ProjectSettingsObject extends ElementObject { - banner?: BrandingStyle; - footer?: BrandingStyle; -} - -export interface UserSettingsObject extends ElementObject { - pinned?: string[]; -} - -export interface VeApplicationState { - inDoc: boolean; - fullDoc: boolean; - currentDoc: string; - user: string; -} - -export class ApplicationService { - private state: VeApplicationState = { - inDoc: false, - fullDoc: false, - currentDoc: null, - user: null, - }; - - public PROJECT_URL_PREFIX = '#/projects/'; - - static $inject = ['$q', 'ProjectService', 'ElementService', 'ApiService', 'CacheService']; - - constructor( - private $q: VeQService, - private projectSvc: ProjectService, - private elementSvc: ElementService, - private apiSvc: ApiService, - private cacheSvc: CacheService - ) {} - - public getState(): VeApplicationState { - return this.state; - } - - public copyToClipboard(target: JQuery, $event: JQuery.ClickEvent): VePromise { - const deferred = this.$q.defer(); - $event.stopPropagation(); - - navigator.clipboard.writeText(target[0].childNodes[0].textContent).then( - () => { - deferred.resolve(); - }, - (reason) => { - deferred.reject(reason); - } - ); - return deferred.promise; - } - - public getUserSettings = ( - reqOb: UsersRequest, - refresh?: boolean, - weight?: number - ): VePromise => { - const cacheKey = this.apiSvc.makeCacheKey(reqOb, '_hidden_' + reqOb.username + '_ve_settings', false); - const cached = this.cacheSvc.get(cacheKey); - if (cached && !refresh) { - return this.$q.resolve(cached); - } - return new this.$q((resolve, reject) => { - this.elementSvc - .getElement( - { - projectId: reqOb.projectId, - refId: reqOb.refId, - elementId: '_hidden_' + reqOb.username + '_settings', - }, - weight, - refresh, - true - ) - .then((result) => { - if (result === null) { - this.elementSvc - .createElement({ - projectId: reqOb.projectId, - refId: reqOb.refId, - elements: [ - { - id: '_hidden_' + reqOb.username + '_settings', - name: 'View Editor' + reqOb.username + 'Project Settings', - _projectId: reqOb.projectId, - _refId: reqOb.refId, - type: 'Class', - }, - ], - }) - .then(resolve, reject); - } else resolve(result); - }, reject); - }); - }; - - public updateUserSettings = ( - reqOb: UsersRequest, - settingsOb: UserSettingsObject - ): VePromise => { - return this.elementSvc.updateElement(settingsOb); - }; - - public getSettings = ( - projectId: string, - refId?: string, - refresh?: boolean, - weight?: number - ): VePromise => { - if (!refId) refId = 'master'; - const cacheKey = this.apiSvc.makeCacheKey({ projectId, refId }, '_hidden_' + projectId + '_settings', false); - const cached = this.cacheSvc.get(cacheKey); - if (cached && !refresh) { - return this.$q.resolve(cached); - } - return new this.$q((resolve, reject) => { - this.elementSvc - .getElement( - { - projectId, - refId, - elementId: '_hidden_' + projectId + '_settings', - }, - weight, - refresh, - true - ) - .then((result) => { - if (result === null) { - this.createSettings(projectId, refId, null).then(resolve, reject); - } else resolve(result); - }, reject); - }); - }; - - public createSettings = ( - projectId: string, - refId: string, - settingsOb?: ProjectSettingsObject - ): VePromise => { - if (!settingsOb) { - settingsOb = { - id: '_hidden_' + projectId + '_settings', - name: 'View Editor Project Settings', - _projectId: projectId, - _refId: refId, - type: 'Class', - }; - } - return this.elementSvc.createElement({ - elementId: '_hidden_' + projectId + '_settings', - projectId, - refId, - elements: [settingsOb], - }); - }; - - addPins(username: string, projectId: string, refId: string, pinned: string[]): VePromise { - return new this.$q((resolve, reject) => { - this.getUserSettings({ username, projectId, refId }).then((result) => { - if (result.pinned) { - pinned = [...new Set([...result.pinned, ...pinned])]; - } - this.elementSvc - .updateElement({ - id: result.id, - _refId: result._refId, - _projectId: result._projectId, - pinned, - }) - .then(resolve, reject); - }, reject); - }); - } - - removePins(username: string, projectId: string, refId: string, unpinned: string[]): VePromise { - return new this.$q((resolve, reject) => { - this.getUserSettings({ username, projectId, refId }).then((response) => { - if (response.pinned) { - const pinned = response.pinned.filter((pin) => { - return unpinned.includes(pin); - }); - this.elementSvc - .updateElement({ - id: response.id, - _refId: response._refId, - _projectId: response._projectId, - pinned, - }) - .then(resolve, reject); - } else resolve(response); - }, reject); - }); - } -} - -veUtils.service('ApplicationService', ApplicationService); diff --git a/src/ve-utils/application/Branding.service.ts b/src/ve-utils/application/Branding.service.ts deleted file mode 100644 index 4efb954c7..000000000 --- a/src/ve-utils/application/Branding.service.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { VeConfig } from '@ve-types/config'; -import { ParamsObject, ProjectsResponse } from '@ve-types/mms'; - -export interface BrandingStyle { - labels?: string[] | string[][]; - message?: string | string[]; - separator?: string; - background?: string; - color?: string; - disabled: boolean; -} - -// export interface BannerStyle extends BrandingStyle { -// top?: boolean -// bottom?: boolean -// } - -/** - * @ngdoc service - * @name BrandingService - * * Branding Service - */ -export class BrandingService { - public labels: { [key: string]: string }; - private defaultSeparator: string = ' - '; - private defaultLabels: { [key: string]: string } = { - pi: 'PROPRIETARY: Proprietary Information', - export_ctrl: 'EXPORT WARNING: No export controlled documents allowed on this server', - no_public_release: 'Not for Public Release or Redistribution', - unclassified: 'CLASSIFICATION: This system is UNCLASSIFIED', - opensource: 'OpenMBEE View Editor | Licensed under Apache 2.0', - }; - loginBanner: BrandingStyle = { - labels: ['opensource', 'unclassified'], - disabled: false, - }; - config: VeConfig = window.__env; - banner: BrandingStyle = { - labels: ['pi'], - background: '#0D47A1', - color: '#e8e8e8', - disabled: false, - }; - footer: BrandingStyle = { - labels: ['pi', 'no_public_release'], - disabled: false, - }; - loginWarning: BrandingStyle = { - disabled: false, - message: [ - 'By accessing and using this information system, you acknowledge and consent to the following:', - '', - 'This service is funded by the United States Government and operated by the', - 'California Institute of Technology in support of ongoing U.S. Government programs and activities.', - 'If you are not authorized to access this system, disconnect now. Users of this system have no expectation', - 'of privacy. By continuing, you consent to your keystrokes and data content being monitored.', - ], - }; - static $inject = ['$q']; - - constructor(private $q: VeQService) { - if (this.config.customLabels) { - this.labels = Object.assign(this.defaultLabels, this.config.customLabels); - } - - if (this.config.banner) { - this.banner = Object.assign(this.banner, this.config.banner); - } - this.createMessage(this.banner); - - if (this.config.loginBanner) { - this.loginBanner = Object.assign(this.loginBanner, this.config.loginBanner); - } - this.createMessage(this.loginBanner); - if (this.config.footer) { - this.footer = Object.assign(this.footer, this.config.footer); - } - this.createMessage(this.footer); - if (this.config.loginWarning) { - this.loginWarning = Object.assign(this.loginWarning, this.config.loginWarning); - } - this.createMessage(this.loginWarning); - } - - public createMessage = (brandingStyle: BrandingStyle): void => { - if (brandingStyle.labels) { - const separator: string = brandingStyle.separator ? brandingStyle.separator : this.defaultSeparator; - brandingStyle.message = []; - if (Array.isArray(brandingStyle.labels[0])) { - for (const line of brandingStyle.labels) { - if (Array.isArray(line)) { - brandingStyle.message.push(this._getMessage(line, separator)); - } - } - } else { - brandingStyle.message.push(this._getMessage(brandingStyle.labels as string[], separator)); - } - } - }; - - private _getMessage = (labels: string[], separator?: string): string => { - let msg = ''; - for (const [labelNum, label] of labels.entries()) { - msg += this._getLabel(label); - if (labelNum < labels.length - 1) { - msg += separator; - } - } - return msg; - }; - - private _getLabel = (labelName: string): string => { - let msg = ''; - if (this.labels.hasOwnProperty(labelName)) { - msg = this.labels[labelName]; - } else { - msg = 'Missing Label'; - } - return msg; - }; - - getBanner(params?: ParamsObject): VePromise { - return this.$q.resolve(this.banner); - } - - getLoginBanner(): VePromise { - return this.$q.resolve(this.loginBanner); - } - - getFooter(params?: ParamsObject): VePromise { - return this.$q.resolve(this.footer); - } -} - -veUtils.service('BrandingService', BrandingService); diff --git a/src/ve-utils/application/Comment.service.ts b/src/ve-utils/application/Comment.service.ts deleted file mode 100644 index eb028c72e..000000000 --- a/src/ve-utils/application/Comment.service.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* Todo: - * 1. Allow comments to wrap text - * 2. Create simple comment lifecycle - * 3. Add comment pane on right - * 4. Comments should include important information like: - * A. View they reference - * B. Status - * C. Author - * D. Thread info - * 5. Make comments work inside CKEditor - * 6. Make comment insert work outside CKEditor - * */ diff --git a/src/ve-utils/application/CreateElement.service.ts b/src/ve-utils/application/CreateElement.service.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/ve-utils/application/Image.service.ts b/src/ve-utils/application/Image.service.ts deleted file mode 100644 index 9d7830738..000000000 --- a/src/ve-utils/application/Image.service.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { AuthService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { VeConfig } from '@ve-types/config'; - -export class ImageService { - public veConfig: VeConfig = window.__env; - - static $inject = ['AuthService']; - - constructor(private authSvc: AuthService) {} - - public fixImgSrc(imgDom: JQuery): void { - let src = imgDom.attr('src'); - if (src) { - if (src) { - if (src.indexOf('http') < 0) { - src = this.veConfig.apiUrl + src; - } - imgDom.attr('src', src + '?token=' + this.authSvc.getToken()); - } - if (imgDom.width() < 860) { - //keep image relative centered with text if less than 9 in - return; - } - const parent = imgDom.parent('p'); - if (parent.length > 0) { - if (parent.css('text-align') == 'center' || parent.hasClass('image-center')) { - imgDom.addClass('image-center'); - } - imgDom.unwrap(); //note this removes parent p and puts img and any of its siblings in its place - } - } - } - - public fixImgUrl = (src: string, addToken?: boolean): string => { - const url = new window.URL(src); - const params = new window.URLSearchParams(url.search); - if (params.has('token')) { - params.delete('token'); - } - if (addToken) { - params.append('token', this.authSvc.getToken()); - } - url.search = params.toString(); - return url.toString(); - }; -} - -veUtils.service('ImageService', ImageService); diff --git a/src/ve-utils/application/Math.service.ts b/src/ve-utils/application/Math.service.ts deleted file mode 100644 index b22815d27..000000000 --- a/src/ve-utils/application/Math.service.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { MathJaxObject } from 'mathjax-full/js/components/startup'; - -import { veUtils } from '@ve-utils'; - -export class MathService { - private promise = Promise.resolve(); // Used to hold chain of typesetting calls - private mathJax: MathJaxObject = window.MathJax; - - static $inject = []; - - typeset(element: HTMLElement | HTMLElement[]): Promise { - this.promise = this.promise - .then(() => { - if (!Array.isArray(element)) { - element = [element]; - } - (this.mathJax.typesetPromise as (elements: HTMLElement[]) => Promise)(element).catch( - (err: { message: string }) => console.log(`Typeset failed: ${err.message}`) - ); - }) - .catch((err: { message: string }) => console.log(`Typeset failed: ${err.message}`)); - return this.promise; - } -} - -veUtils.service('MathService', MathService); diff --git a/src/ve-utils/application/RootScope.service.ts b/src/ve-utils/application/RootScope.service.ts deleted file mode 100644 index f3aaef00f..000000000 --- a/src/ve-utils/application/RootScope.service.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { StateDeclaration } from '@uirouter/core/lib/state/interface'; - -import { SessionService } from '@ve-utils/core'; - -import { veUtils } from '@ve-utils'; - -import { ParamsObject } from '@ve-types/mms'; - -export class RootScopeService { - public constants = { - LOGINMODALOPEN: 'login-modal-open', - MMSREFOB: 'mms-ref-ob', - RIGHTPANETOGGLEABLE: 'mms-pane-toggleable', - RIGHTPANECLOSED: 'mms-pane-closed', - VEWARNINGOK: 've-warning-ok', - VETITLE: 've-title', - VESTATECHANGING: 've-state-changing', - VEVIEWCONTENTLOADING: 've-view-content-loading', - VEREDIRECT: 've-redirect', - VEREDIRECTFROMOLD: 've-redirect-old', - VECRUSHURL: 've-crush-url', - VECOMMENTSON: 've-comments-on', - VENUMBERINGON: 've-numbering-on', - VEFULLDOCMODE: 've-full-doc-mode', - VEELEMENTSON: 've-elements-on', - VEEDITMODE: 've-edit-mode', - VEHIDEPANES: 've-hide-panes', - VEHIDERIGHT: 've-hide-right', - VEHIDELEFT: 've-hide-left', - VESHOWLOGIN: 've-show-login', - TREESHOWPE: 'tree-show-pe', - TREEINITIALSELECTION: 'tree-initialSelection', - TREEICONS: 'tree-icons', - LEFTPANECLOSED: 'tree-pane-closed', - }; - - static $inject = ['SessionService']; - - constructor(private sessionSvc: SessionService) {} - - init(): void { - this.loginModalOpen(); - this.rightPaneToggleable(); - this.rightPaneClosed(); - this.veTitle(); - this.veShowLogin(); - this.veStateChanging(); - this.veViewContentLoading(); - this.veRedirect(); - this.veRedirectFromOld(); - this.veCrushUrl(); - this.veFullDocMode(); - this.veCommentsOn(); - - this.veNumberingOn(); - this.veElementsOn(); - this.veEditMode(); - this.veHidePanes(); - this.veHideLeft(); - this.veHideRight(); - } - - loginModalOpen(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.LOGINMODALOPEN, value, false); - } - - rightPaneToggleable(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.RIGHTPANETOGGLEABLE, value, true); - } - - rightPaneClosed(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.RIGHTPANECLOSED, value, false); - } - - veWarningOk(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEWARNINGOK, value, false); - } - - veTitle(value?: string | undefined): string { - return this.sessionSvc.accessor(this.constants.VETITLE, value, 'View Editor'); - } - - veStateChanging(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VESTATECHANGING, value, false); - } - - veViewContentLoading(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEVIEWCONTENTLOADING, value, false); - } - - veRedirect( - value?: { toState: StateDeclaration; toParams: ParamsObject } | undefined - ): { toState: StateDeclaration; toParams: ParamsObject } | undefined { - return this.sessionSvc.accessor(this.constants.VEREDIRECT, value, null); - } - - veRedirectFromOld(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEREDIRECTFROMOLD, value, false); - } - - veCrushUrl(value?: string | undefined): string { - return this.sessionSvc.accessor(this.constants.VECRUSHURL, value, null); - } - - veFullDocMode(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEFULLDOCMODE, value, false); - } - - veCommentsOn(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VECOMMENTSON, value, false); - } - - veNumberingOn(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VENUMBERINGON, value, true); - } - - veElementsOn(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEELEMENTSON, value, false); - } - - veEditMode(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEEDITMODE, value, false); - } - - veHidePanes(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEHIDEPANES, value, false); - } - - veHideLeft(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEHIDELEFT, value, false); - } - - veHideRight(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VEHIDERIGHT, value, false); - } - - veShowLogin(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.VESHOWLOGIN, value, false); - } - - leftPaneClosed(value?: boolean | undefined): boolean { - return this.sessionSvc.accessor(this.constants.LEFTPANECLOSED, value, false); - } -} - -veUtils.service('RootScopeService', RootScopeService); diff --git a/src/ve-utils/application/ShortUrl.service.ts b/src/ve-utils/application/ShortUrl.service.ts deleted file mode 100644 index 1a627ef9a..000000000 --- a/src/ve-utils/application/ShortUrl.service.ts +++ /dev/null @@ -1,254 +0,0 @@ -import { ApplicationService } from '@ve-utils/application/Application.service'; -import { ElementService, ProjectService, URLService, ViewService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { ParamsObject, ShortUrlRequest } from '@ve-types/mms'; - -export class ShortUrlService { - public dynamicPopover: { - templateUrl: string; - title: string; - } = { - templateUrl: 'shareUrlTemplate.html', - title: 'Link', - }; - - static $inject = [ - '$q', - '$http', - '$location', - 'URLService', - 'ProjectService', - 'ViewService', - 'ElementService', - 'ApplicationService', - ]; - - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private $location: angular.ILocationService, - private uRLSvc: URLService, - private projectSvc: ProjectService, - private viewSvc: ViewService, - private elementSvc: ElementService, - private applicationSvc: ApplicationService - ) {} - - decodeShortUrl(urlFragment: string): VePromise { - const deferred = this.$q.defer(); - const urlParts: string[] = urlFragment.split('-'); - - const _urlError = (defer?: angular.IDeferred): void => { - if (defer) defer.reject(); - else deferred.reject('Error Decoding URL'); - }; - const result: ParamsObject = { - projectId: urlParts[1], - refId: urlParts[2], - documentId: urlParts[3] && urlParts[3] === 'cover' ? null : urlParts[3], - viewId: urlParts[4], - }; - let orgId: string = urlParts[0]; - const promises: VePromise[] = []; - // eslint-disable-next-line prefer-const - - if (orgId) { - const deferOrg = this.$q.defer(); - promises.push(deferOrg.promise); - this.projectSvc.getOrgs().then( - (data) => { - const org = data.filter((o) => { - return o.id.endsWith(orgId); - }); - if (org.length > 0) { - orgId = org[0].id; - deferOrg.resolve(); - } else { - _urlError(deferOrg); - } - }, - () => { - _urlError(deferOrg); - } - ); - if (result.projectId) { - const deferProj = this.$q.defer(); - promises.push(deferProj.promise); - deferOrg.promise.then( - () => { - this.projectSvc.getProjects(orgId).then( - (data) => { - const proj = data.filter((p) => { - return p.id.endsWith(result.projectId); - }); - if (proj.length > 0) { - result.projectId = proj[0].id; - deferProj.resolve(); - } else { - _urlError(deferProj); - } - }, - () => { - _urlError(deferProj); - } - ); - }, - () => { - _urlError(deferProj); - } - ); - if (result.refId) { - const deferRef = this.$q.defer(); - promises.push(deferRef.promise); - deferProj.promise.then( - () => { - this.projectSvc.getRefs(result.projectId).then( - (data) => { - const refOb = data.filter((r) => { - return result.refId === 'm' ? r.id === 'master' : r.id.endsWith(result.refId); - }); - if (refOb.length > 0) { - result.refId = refOb[0].id; - deferRef.resolve(); - } else { - _urlError(deferRef); - } - }, - () => { - _urlError(deferRef); - } - ); - }, - () => { - _urlError(deferRef); - } - ); - if (result.documentId) { - if (result.viewId && result.viewId === 'cover') { - result.documentId = result.documentId + '_cover'; - } - const deferDoc = this.$q.defer(); - promises.push(deferDoc.promise); - deferRef.promise.then( - () => { - this.viewSvc - .getProjectDocuments({ - projectId: result.projectId, - refId: result.refId, - }) - .then( - (data) => { - const doc = data.filter((d) => { - return d.id.endsWith(result.documentId); - }); - if (doc.length > 0) { - result.documentId = doc[0].id; - deferDoc.resolve(); - } else { - _urlError(deferDoc); - } - }, - () => { - _urlError(deferDoc); - } - ); - }, - () => { - _urlError(deferDoc); - } - ); - if (result.viewId && result.viewId !== 'cover') { - const deferView = this.$q.defer(); - promises.push(deferView.promise); - deferDoc.promise.then( - () => { - this.viewSvc - .getAllViews({ - projectId: result.projectId, - refId: result.refId, - }) - .then( - (data) => { - const view = data.filter((v) => { - return v.id.endsWith(result.viewId); - }); - if (view.length > 0) { - result.viewId = view[0].id; - deferView.resolve(); - } else { - _urlError(deferView); - } - }, - () => { - _urlError(deferView); - } - ); - }, - () => { - _urlError(deferView); - } - ); - } - } - } - } - this.$q.all(promises).then( - () => deferred.resolve(result), - () => { - _urlError(); - } - ); - } else { - _urlError(); - } - return deferred.promise; - } - - public getShortUrl = (paramOb: ShortUrlRequest): string => { - const ids: string[] = []; - const sOId = paramOb.orgId.split(/[-_]+/); - ids.push(sOId[sOId.length - 1]); - if (paramOb.projectId && paramOb.projectId !== '') { - const sPId = paramOb.projectId.split(/[-_]+/); - ids.push(sPId[sPId.length - 1]); - if (paramOb.refId && paramOb.refId !== '') { - if (paramOb.refId === 'master') { - ids.push('m'); - } else { - const sRId = paramOb.refId.split(/[-_]+/); - ids.push(sRId[sRId.length - 1]); - } - if (paramOb.documentId && paramOb.documentId !== '') { - const sDId = paramOb.documentId.split(/[-_]+/); - if (paramOb.documentId.endsWith('_cover')) { - if (paramOb.documentId.startsWith('site_')) { - ids.push(sDId[sDId.length - 2]); - } - ids.push('cover'); - } else { - ids.push(sDId[sDId.length - 1]); - } - if (paramOb.viewId && paramOb.documentId !== '') { - const sVId = paramOb.viewId.split(/[-_]+/); - ids.push(sVId[sVId.length - 1]); - } - } - } - } - - const rootUrl = this.$location.absUrl().split('#')[0]; - let fragment = ids.join('-'); - fragment = fragment.endsWith('-') ? fragment.substring(0, fragment.length - 1) : fragment; - return `${rootUrl}#/s/${fragment}`; - }; - - public copyToClipboard(target: JQuery, $event: JQuery.ClickEvent): VePromise { - const shortUrlEl = target.find('#ve-short-url'); - return this.applicationSvc.copyToClipboard(shortUrlEl, $event); - } -} - -veUtils.service('ShortUrlService', ShortUrlService); diff --git a/src/ve-utils/application/Utils.service.ts b/src/ve-utils/application/Utils.service.ts deleted file mode 100644 index 14fe6e4d8..000000000 --- a/src/ve-utils/application/Utils.service.ts +++ /dev/null @@ -1,637 +0,0 @@ -import _ from 'lodash'; - -import { ApiService, DocumentMetadata, URLService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { ElementObject, ViewObject } from '@ve-types/mms'; -import { TreeBranch } from '@ve-types/tree'; - -export interface TOCHtmlObject { - equations: string; - tables: string; - figures: string; - tableCount: number; - equationCount: number; - figureCount: number; -} - -/** - * @ngdoc service - * @name veUtils/UtilsService - * @requires $q - * @requires $http - * @requires URLService - * @requires ApiService - * * Utilities - */ -export class UtilsService { - static $inject = ['$q', '$http', 'URLService', 'ApiService']; - - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private uRLSvc: URLService, - private apiSvc: ApiService - ) {} - - /** - * @name veUtils/UtilsService#makeHtmlTOCChild - * Generates table of contents for the document/views. - * - * @param {TreeBranch} rootBranch the root element (document or view) of the main tree - * @returns {string} toc string - */ - public makeHtmlTOC = (rootBranch: TreeBranch): string => { - let result = '

    Table of Contents

    '; - result += this.makeHtmlTOCChild(rootBranch, true); - result += '
    '; - return result; - }; - - /** - * @name veUtils/UtilsService#makeHtmlTOCChild - * Generates table of contents for the document/views. - * @param {TreeBranch} branch - * @param skip - * @return {string} - */ - public makeHtmlTOCChild = (branch: TreeBranch, skip?): string => { - let result = ''; - if (!skip) { - const anchor: string = ''; - result += `
  • ${anchor}${branch.data._veNumber} ${branch.data.name}`; - } - let ulAdded = false; - for (const child of branch.children) { - if (child.type !== 'view' && child.type !== 'section') { - continue; - } - if (!ulAdded) { - result += '
      '; - ulAdded = true; - } - result += this.makeHtmlTOCChild(child); - } - if (ulAdded) { - result += '
    '; - } - if (!skip) { - result += '
  • '; - } - return result; - }; - - /** - * @name veUtils/UtilsService#makeTablesAndFiguresTOC - * Generates a list of tables, figures, and equations. Default uses presentation elements. - * `html` param provides option to use html content to generate list. It also appends the - * captions to the figures and tables. - * - * @param {TreeBranch} rootBranch the root of the document/view to be printed (what is on the left pane) - * @param {string} printElement contents to be printed (what is displayed in the center pane) - * @param {boolean} live true only if a specific sorting is required - * @param {boolean} html whether to generated list of tables and figures using html content, outside of the corresponding PE or not - * @returns {object} results - */ - public makeTablesAndFiguresTOC( - rootBranch: TreeBranch, - printElement: JQuery, - live: boolean, - html: boolean - ): TOCHtmlObject { - let ob = { - tables: '', - figures: '', - equations: '', - tableCount: 0, - figureCount: 0, - equationCount: 0, - }; - - // If both "Generate List of Tables and Figures" && "Use HTML for List of Tables and Figures " options are checked... - if (html) { - ob = this.generateTOCHtmlOption(ob, rootBranch, printElement); - // return obHTML; - } else { - for (let i = 0; i < rootBranch.children.length; i++) { - this.makeTablesAndFiguresTOCChild(rootBranch.children[i], printElement, ob, live, false); - } - } - ob.tables = ob.tables.length - ? '

    List of Tables

      ' + ob.tables + '
    ' - : ''; - ob.figures = ob.figures.length - ? '

    List of Figures

      ' + ob.figures + '
    ' - : ''; - ob.equations = ob.equations.length - ? '

    List of Equations

      ' + ob.equations + '
    ' - : ''; - return ob; - } - - /** - * @name veUtils/UtilsService#makeTablesAndFiguresTOCChild - * Generates a list of tables, figures, and equations of the none root node of he tree (containment tree on the left pane). It also appends the captions to the figures and tables. - * - * @param {TreeBranch} child presentation element - * @param {JQuery} printElement contents to be printed (what is displayed in the center pane) - * @param {TOCHtmlObject} ob an object that stores the html list of tables, figures, and equations as well as the counts of those - * @param {boolean} live true when user would like to preview numbering in the app - * @param {boolean} showRefName the tree hierarchy of the document or view (what is displayed in the left pane) - * @returns {void} nothing - */ - public makeTablesAndFiguresTOCChild( - child: TreeBranch, - printElement: JQuery, - ob: TOCHtmlObject, - live: boolean, - showRefName: boolean - ): void { - const pe = child.data; - const sysmlId = pe.id; - const veNumber = pe._veNumber; - let prefix = ''; - const el = printElement.find('#' + sysmlId); - const refs = printElement.find( - 'mms-view-link[mms-pe-id="' + sysmlId + '"], mms-view-link[data-mms-pe-id="' + sysmlId + '"]' - ); - let cap = ''; - let name = ''; - if (child.type === 'table') { - ob.tableCount++; - prefix = 'Table ' + veNumber + '. '; - const capTbl = el.find('table > caption'); - name = capTbl.text(); - if (name !== '' && name.indexOf('Table') === 0 && name.split('. ').length > 0) { - name = name.substring(name.indexOf(prefix) + prefix.length); - } else if (name === '') { - name = pe.name; - } - cap = veNumber + '. ' + name; - ob.tables += '
  • ' + cap + '
  • '; - capTbl.html('Table ' + cap); - // If caption does not exist, add to html - if (capTbl.length === 0) { - el.find('table').prepend('Table ' + cap + ''); - } - // Change cap value based on showRefName true/false - if (!showRefName) { - cap = veNumber; - } - if (!live) { - refs.find('a').attr('href', '#' + sysmlId); - } - refs.filter('[suppress-numbering!="true"]') - .filter(':not([link-text])') - .find('a') - .html('Table ' + cap); - } - if (child.type === 'figure') { - ob.figureCount++; - prefix = 'Figure ' + veNumber + '. '; - const capFig = el.find('figure > figcaption'); - name = capFig.text().trim(); - if (name !== '' && name.indexOf('Figure') === 0 && name.split('. ').length > 0) { - name = name.substring(name.indexOf(prefix) + prefix.length); - } else if (name === '') { - name = pe.name; - } - cap = veNumber + '. ' + name; - ob.figures += '
  • ' + cap + '
  • '; - capFig.html('Figure ' + cap); - // If caption does not exist, add to html - if (capFig.length === 0) { - el.find('img') - .wrap('
    ') - .after('
    Figure ' + cap + '
    '); - } - // Change cap value based on showRefName true/false - if (!showRefName) { - cap = veNumber; - } - if (!live) { - refs.find('a').attr('href', '#' + sysmlId); - } - refs.filter('[suppress-numbering!="true"]') - .filter(':not([link-text])') - .find('a') - .html('Fig. ' + cap); - } - if (child.type === 'equation') { - ob.equationCount++; - cap = veNumber + '. ' + pe.name; - ob.equations += '
  • ' + cap + '
  • '; - const equationCap = '(' + veNumber + ')'; - const capEq = el.find('.caption-type-equation'); - capEq.html(equationCap); - // If caption does not exist, add to html - if (capEq.length === 0) { - el.find('present-equation > transclude > transclude-doc > p') - .last() - .append('' + equationCap + ''); - } - if (!live) { - refs.find('a').attr('href', '#' + sysmlId); - } - refs.filter('[suppress-numbering!="true"]') - .filter(':not([link-text])') - .find('a') - .html('Eq. ' + equationCap); - } - for (let i = 0; i < child.children.length; i++) { - this.makeTablesAndFiguresTOCChild(child.children[i], printElement, ob, live, showRefName); - } - } - - public addLiveNumbering(pe: ViewObject, el: JQuery, type: string): void { - const veNumber = pe._veNumber; - if (!veNumber) { - return; - } - let prefix = ''; - let name = ''; - let cap = ''; - if (type === 'table') { - prefix = 'Table ' + veNumber + '. '; - const capTbl = el.find('table > caption'); - name = capTbl.text(); - if (name !== '' && name.indexOf('Table') === 0 && name.split('. ').length > 0) { - name = name.substring(name.indexOf(prefix) + prefix.length); - } else if (name === '') { - name = pe.name; - } - cap = veNumber + '. ' + name; - capTbl.html('Table ' + cap); - // If caption does not exist, add to html - if (capTbl.length === 0) { - el.find('table').prepend('Table ' + cap + ''); - } - } - if (type === 'figure') { - prefix = 'Figure ' + veNumber + '. '; - const capFig = el.find('figure > figcaption'); - name = capFig.text().trim(); - if (name !== '' && name.indexOf('Figure') === 0 && name.split('. ').length > 0) { - name = name.substring(name.indexOf(prefix) + prefix.length); - } else if (name === '') { - name = pe.name; - } - cap = veNumber + '. ' + name; - capFig.html('Figure ' + cap); - // If caption does not exist, add to html - if (capFig.length === 0) { - el.find('img') - .wrap('
    ') - .after('
    Figure ' + cap + '
    '); - } - } - if (type === 'equation') { - const equationCap = '(' + veNumber + ')'; - const capEq = el.find('.caption-type-equation'); - capEq.html(equationCap); - // If caption does not exist, add to html - if (capEq.length === 0) { - el.find('present-equation > mms-cf > transclude-doc > p') - .last() - .append('' + equationCap + ''); - } - } - } - - /** - * @name veUtils/UtilsService#this.generateAnchorId - * Generates a unique ID to be used in TOC anchor tags (e.g. , ) - * - * @param {string} prefix "tbl_" when creating an id for a table, "fig_" when creating an id for a figuer - * @returns {string} unique ID wit prefix, tbl_ or fig_ - */ - public generateAnchorId = (prefix: string): string => { - return `${prefix}${this.apiSvc.createUniqueId()}`; - }; - - /** - * @name veUtils/UtilsService#generateTOCHtmlOption - * Generates a list of tables, figures, and equations. It also appends the captions to the figures and tables. - * - * @param {string} ob an object that stores the html list of tables, figures, and equations as well as the counts of those - * @param {string} treeBranch the tree hierarchy of the document or view (what is displayed in the left pane) - * @param {string} printElement contents to be printed (what is displayed in the center pane) - * @returns {string} populates the object fed to the function (the first argument) and return - */ - public generateTOCHtmlOption( - ob: TOCHtmlObject, - treeBranch: TreeBranch, - printElement: JQuery - ): TOCHtmlObject { - // Grab all existing tables and figures inside the center pane, and assign them to tables and figures - const tables = printElement.find('table'), - figures = printElement.find('figure'); - // equations = printElement.find('.math-tex'); - let anchorId = '', - thisCap = '', - tblCap: JQuery, - tbl: JQuery, - fig: JQuery; - - ob.tableCount = tables.length; - ob.figureCount = figures.length; - - // Tables - for (let j = 0; j < tables.length; j++) { - tbl = $(tables[j]); - tblCap = $('caption', tbl); - - // Set the link from the List of Tables to the actual tables - anchorId = this.generateAnchorId('tbl_'); - tbl.attr('id', anchorId); - - // Append li to the List of Tables - thisCap = tblCap && tblCap.text() !== '' ? `${j + 1}. ${tblCap.text()}` : `${j + 1}. `; - ob.tables += '
  • ' + thisCap + '
  • '; - - // If no caption exists, add empty caption for numbering - if (tblCap.length === 0) { - tbl.prepend(' '); - } - } - - // Figures - for (let j = 0; j < figures.length; j++) { - fig = $(figures[j]); - const figcap = $('figcaption', fig); - - // Set the link from the List of Tables to the actual tables - anchorId = this.generateAnchorId('fig_'); - fig.attr('id', anchorId); - - // Append li to the List of Figures - thisCap = figcap && figcap.text() !== '' ? `${j + 1}. ${figcap.text()}` : `${j + 1}`; - ob.figures += '
  • ' + thisCap + '
  • '; - - // If no caption exists, add empty caption for numbering - if (figcap.length === 0) { - fig.append('
     
    '); - } - } - - // We will not add List of Equations for now - // for ( j = 0; j < equations.length; j++) { - // // Grab all equations from the center pane - // eq = $(equations[j]); - // - // // Set the link from the List of Tables to the actual tables - // anchorId = this.generateAnchorId('eq_'); - // eq.attr('id', anchorId); - // - // // Append li to the List of Equations - // ob.equations += '
  • ' + j + '.
  • '; - // public if(noCaption){ // If user did not add the caption, add a mock caption - // eq.append(' '); - // } - // } - return ob; - } - - /** - * @name veUtils/UtilsService#convertViewLinks - * Link the element to the document/view in VE (add an anchor tag) - * - * @param {string} printElement the content of the view/document currently selected on the center pane - * @returns {void} nothing - */ - public convertViewLinks(printElement: JQuery): void { - printElement.find('mms-view-link').each((index, el) => { - const $this = $(el); - let elementId = $this.attr('mms-element-id') || $this.attr('data-mms-element-id'); - if (!elementId) { - return; - } - elementId = elementId.replace(/[^\w\-]/gi, ''); - const isElementInDoc = printElement.find('#' + elementId); - if (isElementInDoc.length) { - $this.find('a').attr('href', '#' + elementId); - } - }); - } - - /** - * @name veUtils/UtilsService#getPrintCss - * Typeset HTML to PDF (resource: https://www.princexml.com/) - * - * @param {string} htmlFlag user input taken from the printConfirm modal: whether to include docGen generated tables and rapid tables, outside of the corresponding PE or not(<-- this comment needs to be approved by Shakeh) - * @param {string} landscape user input taken from the printConfirm modal - * @param {string} meta metadata about document/view { - 'top-left': 'loading...', top: 'loading...', 'top-right': 'loading...', - 'bottom-left': 'loading...', bottom: 'loading...', 'bottom-right': 'loading...' - }; - * @returns {string} document/view content string to be passed to the server for conversion - */ - public getPrintCss = (htmlFlag: boolean, landscape: boolean, meta: DocumentMetadata): string => { - let ret = ` - /*------------------------------------------------------------------ -Custom CSS Table of Contents -1. Images -2. Tables -3. Typography - 3.1 Diff - 3.2 Errors -4. Figure Captions -5. Table of Contents -6. Page Layout -7. Headers and Footers -8. Signature Box -9. Bookmark Level -------------------------------------------------------------------*/ - -/*------------------------------------------------------------------ -1. Images -------------------------------------------------------------------*/ -img {max-width: 100%; page-break-inside: avoid; page-break-before: auto; page-break-after: auto; margin-left: auto; margin-right: auto;} -img.image-center {display: block;} -figure img {display: block;} -.pull-right {float: right;} - -/*------------------------------------------------------------------ -2. Tables -------------------------------------------------------------------*/ - tr, td, th { page-break-inside: avoid; } thead {display: table-header-group;} -table {width: 100%; border-collapse: collapse;} -table, th, td {border: 1px solid black; padding: 4px; font-size: 10pt;} -table[border='0'], table[border='0'] th, table[border='0'] td {border: 0px;} -table, th > p, td > p {margin: 0px; padding: 0px;} -table, th > div > p, td > div > p {margin: 0px; padding: 0px;} -table transclude-doc p {margin: 0 0 5px;} -th {background-color: #f2f3f2;} - -/*------------------------------------------------------------------ -3. Typography -------------------------------------------------------------------*/ -h1, h2, h3, h4, h5, h6 {font-family: 'Arial', sans-serif; margin: 10px 0; page-break-inside: avoid; page-break-after: avoid;} -.h1 {font-size: 18pt;} .h2 {font-size: 14pt;} .h3 {font-size: 12pt;} .h4 {font-size: 10pt;} .h5, .h6, .h7, .h8, .h9 {font-size: 9pt;} -.ng-hide {display: none;} -.chapter h1.view-title {font-size: 20pt; } -body {font-size: 10pt; font-family: 'Times New Roman', Times, serif; } - -/*------------------------------------------------------------------ - 3.1 Diff -------------------------------------------------------------------*/ -ins, .ins {color: black; background: #dafde0;} -del, .del{color: black;background: #ffe3e3;text-decoration: line-through;} -.match,.textdiff span {color: gray;} -.patcher-replace-in, .patcher-attribute-replace-in, .patcher-insert, .patcher-text-insertion {background-color: #dafde0;} -.patcher-replace-in, .patcher-attribute-replace-in, .patcher-insert {border: 2px dashed #abffb9;} -.patcher-replace-out, .patcher-delete, .patcher-attribute-replace-out, .patcher-text-deletion {background-color: #ffe3e3; text-decoration: line-through;} -.patcher-replace-out, .patcher-delete, .patcher-attribute-replace-out {border: 2px dashed #ffb6b6;} -.patcher-text-insertion, .patcher-text-deletion {display: inline !important;} -[class*="patcher-"]:not(td):not(tr) {display: inline-block;} - -/*------------------------------------------------------------------ - 3.2 Errors -------------------------------------------------------------------*/ -.ve-error {background: repeating-linear-gradient(45deg,#fff,#fff 10px,#fff2e4 10px,#fff2e4 20px);} - -/*------------------------------------------------------------------ -4. Figure Captions -------------------------------------------------------------------*/ -caption, figcaption, .caption-type-equation {text-align: center; font-weight: bold;} -table, figure {margin-bottom: 10px;} -.caption-type-equation {float: right;} -mms-view-equation, mms-view-figure, mms-view-image {page-break-inside: avoid;} - -/*------------------------------------------------------------------ -5. Table of Contents -------------------------------------------------------------------*/ -.toc, .tof, .tot {page-break-after:always;} -.toc {page-break-before: always;} -.toc a, .tof a, .tot a { text-decoration:none; color: #000; font-size:9pt; } -.toc .header, .tof .header, .tot .header { margin-bottom: 4px; font-weight: bold; font-size:24px; } -.toc ul, .tof ul, .tot ul {list-style-type:none; margin: 0; } -.tof ul, .tot ul {padding-left:0;} -.toc ul {padding-left:4em;} -.toc > ul {padding-left:0;} -.toc li > a[href]::after {content: leader('.') target-counter(attr(href), page);} -.tot li > a[href]::after {content: leader('.') target-counter(attr(href), page);} -.tof li > a[href]::after {content: leader('.') target-counter(attr(href), page);} - -/*------------------------------------------------------------------ -6. Page Layout -------------------------------------------------------------------*/ -@page {margin: 0.5in;} -@page landscape {size: 11in 8.5in;} -.landscape {page: landscape;} -.chapter {page-break-before: always} -p, div {widows: 2; orphans: 2;} - -/*------------------------------------------------------------------ -7. Headers and Footers -------------------------------------------------------------------*/ -@page:first {@top {content: ''} @bottom {content: ''} @top-left {content: ''} @top-right {content: ''} @bottom-left {content: ''} @bottom-right {content: ''}} - -`; - for (let i = 1; i < 10; i++) { - ret += `.bm-level-${i} {bookmark-level: ${i};} -`; - } - if (htmlFlag) { - ret += ` - .toc { counter-reset: table-counter figure-counter;} -figure { counter-increment: figure-counter; } -figcaption::before {content: "Figure " counter(figure-counter) ". "; } -table { counter-increment: table-counter; } -caption::before {content: "Table " counter(table-counter) ". "; } -`; - } - if (meta) { - Object.keys(meta).forEach((key) => { - if (meta[key]) { - let content: string; - if (meta[key] === 'counter(page)') { - content = meta[key] as string; - } else { - content = `"${(meta[key] as string | number).toString()}"`; - } - ret += `@page {@${key} {font-size: 9px; content: ${content};}} -`; - } - }); - } - if (landscape) { - ret += '@page {size: 11in 8.5in;}'; - } - return ret; - }; - - /** - * @name veUtils/UtilsService#exportHtmlAs - * Converts HTML to PDF - * - * @param {number} exportType The export type (3 for pdf | 2 for word) - * @param {Object} data contains htmlString, name, projectId, refId - * @returns {Promise} Promise would be resolved with 'ok', the server will send an email to user when done - */ - public exportHtmlAs( - exportType: number, - data: { - htmlString: string; - name: string; - projectId: string; - refId: string; - css: string; - } - ): VePromise { - let accept: string; - switch (exportType) { - case 2: - accept = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'; - break; - case 3: - accept = 'application/pdf'; - break; - default: - accept = 'application/pdf'; - } - const deferred = this.$q.defer(); - this.$http - .post( - this.uRLSvc.getExportHtmlUrl(), - { - html: data.htmlString, - css: data.css, - format: exportType == 2 ? 'docx' : 'pdf', - }, - { - responseType: 'blob', - } - ) - .then( - (data2) => { - const blob = new Blob([data2.data as BlobPart], { type: accept }); - const a = window.document.createElement('a'); - const url = window.URL.createObjectURL(blob); - a.href = url; - a.download = data.name + (exportType == 2 ? '.docx' : '.pdf'); - a.click(); - window.URL.revokeObjectURL(url); - deferred.resolve('ok'); - }, - (error: angular.IHttpResponse) => { - deferred.reject(this.uRLSvc.handleHttpStatus(error)); - } - ); - return deferred.promise; - } - - public getElementTypeClass = (element: ElementObject, elementType: string): string => { - let elementTypeClass = ''; - if (element.type === 'InstanceSpecification') { - elementTypeClass = 'pe-type-' + _.kebabCase(elementType); - } else { - elementTypeClass = 'item-type-' + _.kebabCase(elementType); - } - return elementTypeClass; - }; -} - -veUtils.service('UtilsService', UtilsService); diff --git a/src/ve-utils/application/index.ts b/src/ve-utils/application/index.ts deleted file mode 100644 index b31dfe142..000000000 --- a/src/ve-utils/application/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import './RootScope.service'; -import './Application.service'; -import './Branding.service'; -import './Math.service'; -import './ShortUrl.service'; -import './Utils.service'; -import './Image.service'; - -export * from './RootScope.service'; -export * from './Application.service'; -export * from './Branding.service'; -export * from './Math.service'; -export * from './ShortUrl.service'; -export * from './Utils.service'; -export * from './Image.service'; diff --git a/src/ve-utils/core/Cache.service.ts b/src/ve-utils/core/Cache.service.ts deleted file mode 100644 index 9bd9d5fbc..000000000 --- a/src/ve-utils/core/Cache.service.ts +++ /dev/null @@ -1,189 +0,0 @@ -import _ from 'lodash'; - -import { veUtils } from '@ve-utils'; - -import { ElementObject, MmsObject } from '@ve-types/mms'; - -export class CacheService { - public cache: { [key: string]: string | unknown | unknown[] } = {}; - - static $inject = []; - - get(key: string | string[], noCopy?: boolean): T | undefined { - const realKey: string = this._makeKey(key); - const result: T = this._get(realKey); - - return result; - //else return _.cloneDeep(result) - } - - private _get = (realKey: string): T => { - const recurse = (key: string): string | T => { - if (typeof this.cache[key] === 'string') { - return recurse(this.cache[key] as string); - } - return this.cache[key] as T; - }; - if (this.cache.hasOwnProperty(realKey)) { - let result: T; - if (typeof this.cache[realKey] === 'string') { - result = recurse(this.cache[realKey] as string) as T; - } else { - result = this.cache[realKey] as T; - } - return result; - } - return; - }; - - /** - * @name CacheService#getElements - * Get the latest elements in the cache with the parameter workspace ID - * - * @param {string} projectId The mms project id - * @param {string} refId The branch/tag id - * @returns {Object} Value if found, empty array if not found - */ - getLatestElements(projectId: string, refId: string): T[] { - const latestElements: T[] = []; - for (const key in this.cache) { - if (!this.cache.hasOwnProperty(key)) { - continue; - } - if ( - key.indexOf('|latest') >= 0 && - key.indexOf('element|') >= 0 && - key.indexOf('|edit') < 0 && - key.indexOf('deleted') < 0 && - key.indexOf(refId) >= 0 && - key.indexOf(projectId) >= 0 - ) { - const val: T | T[] = this._get(key); - if (val) { - Array.isArray(val) ? latestElements.push(...val) : latestElements.push(val); - } - } - } - return latestElements; - } - - /** - * @name CacheService#put - * Put value into cache - * - * @param {Array.|string} key String key or Array of hierarchical keys - * @param {Object} value The value to save - * @param {boolean} [merge=false] Whether to replace the value or do a merge if value already exists - * @returns {Object} the original value - */ - put(key: string | string[], value: T, merge?: boolean): T { - const m = typeof merge === 'undefined' ? false : merge; - const realKey = this._makeKey(key); - let currentValue: T = this.get(realKey, true); - if (currentValue && m) { - _.mergeWith(currentValue, value, (a: unknown, b: unknown, id: string) => { - if ((id === '_contents' || id === 'specification') && b && (b as ElementObject).type === 'Expression') { - return b; - } - if (Array.isArray(a) && Array.isArray(b) && b.length < a.length) { - a.length = 0; - a.push(...(b as unknown[])); - return a as unknown[]; - } - if (id === '_displayedElementIds' && b) { - return b; - } - return undefined; - }); - } else { - this.cache[realKey] = value; - currentValue = value; - } - return currentValue; - } - - /** - * @name CacheService#link - * Create a link to another cached items. This link will be automatically followed/resolved by cache service - * - * @param {string | string[]} sourceKey - * @param {string | string[]} targetKey - */ - public link(sourceKey: string | string[], targetKey: string | string[]): void { - const realSourceKey: string = this._makeKey(sourceKey); - if (this.cache.hasOwnProperty(realSourceKey) && typeof this.cache[realSourceKey] !== 'string') { - delete this.cache[realSourceKey]; - } - - this.cache[realSourceKey] = this._makeKey(targetKey); - } - - /** - * @name CacheService#remove - * Remove value from cache and return it - * - * @param {Array.|string} key String key or Array of hierarchical keys - * @returns {Object} value that was removed or undefined - */ - remove(key: string | string[]): T { - let realKey: string; - if (Array.isArray(key)) { - realKey = this._makeKey(key); - } else { - realKey = key; - } - if (!this.cache.hasOwnProperty(realKey)) { - return null; - } - const removed = this.cache[realKey]; - delete this.cache[realKey]; - if (typeof removed === 'string') { - return this.remove(removed); - } - return removed as T; - } - - /** - * @name CacheService#exists - * Check if value exists with a specific key - * - * @param {Array.|string} key String key or Array of hierarchical keys - * @returns {boolean} whether value exists for key - */ - exists(key: string | string[]): boolean { - let realKey = ''; - if (Array.isArray(key)) { - realKey = this._makeKey(key); - } else { - realKey = key; - } - if (!this.cache.hasOwnProperty(realKey)) { - return false; - } - const val = this.cache[realKey]; - if (typeof val === 'object') { - return true; - } - if (typeof val === 'string') { - return this.exists(val); - } - return false; - } - - private _makeKey(keys: string | string[]): string { - if (Array.isArray(keys)) { - return keys.join('|'); - } else { - return keys; - } - } - - reset = (): void => { - const keys = Object.keys(this.cache); - for (let i = 0; i < keys.length; i++) { - delete this.cache[keys[i]]; - } - }; -} - -veUtils.service('CacheService', CacheService); diff --git a/src/ve-utils/core/Edit.service.ts b/src/ve-utils/core/Edit.service.ts deleted file mode 100644 index fc6adc076..000000000 --- a/src/ve-utils/core/Edit.service.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { veUtils } from '@ve-utils'; - -import { EventService } from './Event.service'; - -import { ElementObject, ValueObject } from '@ve-types/mms'; - -export interface EditObject { - element: T; - values?: ValueObject[]; - key: string; -} - -export class EditService { - private edits: { [editKey: string]: EditObject } = {}; - - public EVENT = 've-edits'; - - static $inject = ['EventService']; - - constructor(private eventSvc: EventService) {} - - trigger = (): void => { - this.eventSvc.$broadcast(this.EVENT); - }; - - get(key: string | string[]): EditObject { - key = this.makeKey(key); - return this.edits[key] as EditObject; - } - - getAll(): { [key: string]: EditObject } { - return this.edits; - } - - openEdits = (): number => { - return Object.keys(this.edits).length; - }; - - addOrUpdate = (key: string | string[], data: ElementObject, overwrite?: boolean): EditObject => { - key = this.makeKey(key); - if (overwrite) { - delete this.edits[key]; - } - this.edits[key] = { key, element: data }; - - this.trigger(); - return this.edits[key]; - }; - - remove = (key: string | string[]): void => { - key = this.makeKey(key); - if (this.edits[key]) { - delete this.edits[key]; - this.trigger(); - } - }; - - // getKey(): string {} - - reset = (): void => { - const keys = Object.keys(this.edits); - for (let i = 0; i < keys.length; i++) { - delete this.edits[keys[i]]; - } - }; - - public makeKey(keys: string | string[]): string { - if (Array.isArray(keys)) { - return keys.join('|'); - } else { - return keys; - } - } -} -veUtils.service('EditService', EditService); diff --git a/src/ve-utils/core/Event.service.ts b/src/ve-utils/core/Event.service.ts deleted file mode 100644 index 8a9230be0..000000000 --- a/src/ve-utils/core/Event.service.ts +++ /dev/null @@ -1,84 +0,0 @@ -import Rx from 'rx-lite'; - -import { veUtils } from '@ve-utils'; - -export type eventHandlerFn = (data: T) => void; - -export class EventService { - private subjects: { [key: string]: Rx.ISubject } = {}; - private bindings: { [key: string]: Rx.ISubject } = {}; - //API - public $broadcast = (name: string, data?: T): void => this.emit(name, data); - public $on = (name: string, handler: eventHandlerFn): Rx.IDisposable => this.listen(name, handler); - public $destroy = (subs: Rx.IDisposable[]): void => this.destroy(subs); - public $init = (ctrl: { subs: Rx.IDisposable[] } & angular.IComponentController): void => this.initEventSvc(ctrl); - - createName = (name: string): string => { - return `$ ${name}`; - }; - - resolve(name: string, data?: T): void { - const fnName = this.createName(name); - //$rootScope.$broadcast(name,data); - if (!this.bindings[fnName]) { - this.bindings[fnName] = new Rx.BehaviorSubject(data); - } else { - this.bindings[fnName].onNext(data); - } - } - - binding(name: string, handler: eventHandlerFn): Rx.IDisposable { - const fnName = this.createName(name); - if (!this.bindings[fnName]) { - throw Error('Binding ' + name + ' subscribed before initialization!'); - } - return this.bindings[fnName].subscribe(handler); - } - - emit(name: string, data?: T): void { - const fnName = this.createName(name); - //$rootScope.$broadcast(name,data); - if (!this.subjects[fnName]) { - this.subjects[fnName] = new Rx.Subject(); - } - this.subjects[fnName].onNext(data); - } - - listen(name: string, handler: eventHandlerFn): Rx.IDisposable { - const fnName = this.createName(name); - if (!this.subjects[fnName]) { - this.subjects[fnName] = new Rx.Subject(); - } - return this.subjects[fnName].subscribe(handler); - } - - destroy(subs: Rx.IDisposable[]): void { - if (subs.length > 0) { - for (let i = 0; i < subs.length; i++) { - if (typeof subs[i].dispose === 'function') { - subs[i].dispose(); - } - } - } - } - - initEventSvc( - componentOrScope: { - subs: Rx.IDisposable[]; - } & angular.IComponentController - ): void { - componentOrScope.subs = []; - if (!componentOrScope.$onDestroy) { - componentOrScope.$onDestroy = (): void => { - this.destroy(componentOrScope.subs); - }; - } - } - - exists(eventOrBinding: string): boolean { - const name = this.createName(eventOrBinding); - return this.subjects.hasOwnProperty(name) || this.bindings.hasOwnProperty(name); - } -} - -veUtils.service('EventService', EventService); diff --git a/src/ve-utils/core/Session.service.ts b/src/ve-utils/core/Session.service.ts deleted file mode 100644 index a4f4dd36a..000000000 --- a/src/ve-utils/core/Session.service.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { veUtils } from '@ve-utils'; - -import { EventService } from './Event.service'; - -export class SessionService { - static $inject = ['EventService']; - - constructor(private eventSvc: EventService) {} - - private static _setStorage(key: string, realValue: T): void { - const value = realValue == null ? null : JSON.stringify(realValue); - sessionStorage.setItem(key, value); - } - - private static _getStorage(key: string): T { - const sessionValue = sessionStorage.getItem(key); - if (sessionValue === null) { - return null; - } else { - return JSON.parse(sessionValue) as T; - } - } - - private static _removeStorage(key: string): void { - sessionStorage.removeItem(key); - } - - public clear = (): void => { - sessionStorage.clear(); - }; - - public accessor = (name: string, value: T, defaultValue: T = null): T => { - if (value === undefined) { - let val = SessionService._getStorage(name); - if (val == null) { - val = defaultValue; - SessionService._setStorage(name, val); - } - if (!this.eventSvc.exists(name)) { - this.eventSvc.resolve(name, val); - } - return val; - } - this.eventSvc.resolve(name, value); - SessionService._setStorage(name, value); - return value; - }; -} - -veUtils.service('SessionService', SessionService); diff --git a/src/ve-utils/core/index.ts b/src/ve-utils/core/index.ts deleted file mode 100644 index 15fc54501..000000000 --- a/src/ve-utils/core/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -import './Cache.service'; -import './Edit.service'; -import './Event.service'; -import './Session.service'; - -export * from './Cache.service'; -export * from './Edit.service'; -export * from './Event.service'; -export * from './Session.service'; diff --git a/src/ve-utils/index.ts b/src/ve-utils/index.ts deleted file mode 100644 index 7298c68d2..000000000 --- a/src/ve-utils/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -//Libraries -//import 'angular' - -import './ve-utils.module'; - -import './third-party'; - -import './core'; -import './model-schema'; -import './application'; -import './mms-api-client'; - -export * from './ve-utils.module'; - -export default 've-utils'; diff --git a/src/ve-utils/mms-api-client/Api.service.ts b/src/ve-utils/mms-api-client/Api.service.ts deleted file mode 100644 index 28f621c3d..000000000 --- a/src/ve-utils/mms-api-client/Api.service.ts +++ /dev/null @@ -1,395 +0,0 @@ -import _ from 'lodash'; -import * as uuid from 'uuid'; - -import { URLService } from '@ve-utils/mms-api-client/URL.service'; -import { SchemaService } from '@ve-utils/model-schema'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VePromiseReason, VeQService } from '@ve-types/angular'; -import { VeConfig } from '@ve-types/config'; -import { - BasicResponse, - ElementObject, - ElementsRequest, - ExpressionObject, - InstanceSpecObject, - LiteralObject, - MmsObject, - RequestObject, - ValueObject, - VersionResponse, - ViewObject, -} from '@ve-types/mms'; - -export class ApiService { - private editKeys = [ - 'name', - 'documentation', - 'defaultValue', - 'value', - 'valueIds', - 'specification', - 'id', - '_projectId', - '_refId', - 'type', - ]; - - schema: string = 'cameo'; - - public veConfig: VeConfig = window.__env; - - static $inject = ['$q', '$http', 'URLService', 'SchemaService']; - - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private uRLSvc: URLService, - private schemaSvc: SchemaService - ) {} - - public getMmsVersion(): VePromise { - const deferred = this.$q.defer(); - this.$http.get(this.uRLSvc.getMmsVersionURL()).then( - (response) => { - deferred.resolve(response.data.mmsVersion); - }, - (response: angular.IHttpResponse) => { - deferred.reject(this.uRLSvc.handleHttpStatus(response)); - } - ); - return deferred.promise; - } - - public getVeVersion = (): string => { - return this.veConfig.version; - }; - - /** - * @name veUtils/ApiService#handleErrorCallback - * - * @param {angular.IHttpResponse} response - * @param {angular.IDeferred} deferredOrReject - * @param {} type - */ - public handleErrorCallback>( - response: angular.IHttpResponse, - deferredOrReject: angular.IDeferred | angular.IQResolveReject>, - type?: 'error' | 'warning' | 'info' - ): void { - const res = this.uRLSvc.handleHttpStatus(response); - if (type) { - res.type = type; - } - if ((deferredOrReject as angular.IDeferred).reject) { - (deferredOrReject as angular.IDeferred).reject(res); - } else { - (deferredOrReject as angular.IQResolveReject>)(res); - } - } - - /** - * @name veUtils/UtilsService#_cleanValueSpec - * Cleans value specification - * - * @param {Object} vs value spec object - * @returns {void} nothing - */ - - private _cleanValueSpec = (vs: ValueObject): void => { - if (vs.hasOwnProperty('valueExpression')) delete vs.valueExpression; - if (vs.operand && Array.isArray(vs.operand)) { - for (let i = 0; i < vs.operand.length; i++) { - this._cleanValueSpec(vs.operand[i] as ValueObject); - } - } - }; - - /** - * @name veUtils/UtilsService#cleanElement - * Cleans - * - * @param {ElementObject} elem the element object to be cleaned - * @param {boolean} [forEdit=false] (optional) forEdit. - * @returns {ElementObject} clean elem - */ - public cleanElement(elem: T, forEdit?: boolean): T { - if (elem.type === 'Property' || elem.type === 'Port') { - if (!elem.defaultValue) { - elem.defaultValue = null; - } - } - if (elem.type === 'Slot') { - if (!Array.isArray(elem.value)) (elem as LiteralObject).value = []; - } - if (elem.value && Array.isArray(elem.value)) { - (elem as LiteralObject).value.forEach((value: unknown) => { - if (typeof value === 'object' && value !== null) - this._cleanValueSpec(value as ExpressionObject); - }); - } - if (elem._contents) { - this._cleanValueSpec((elem as ViewObject)._contents); - } - if (elem.specification) { - this._cleanValueSpec((elem as InstanceSpecObject).specification); - } - if (elem.type === 'Class') { - if (elem._contents && elem.contains) { - delete elem.contains; - } - if (elem._allowedElementIds) { - delete elem._allowedElementIds; - } - } - - if (elem.hasOwnProperty('specialization')) { - delete elem.specialization; - } - if (!elem.hasOwnProperty('appliedStereotypeIds') && elem._appliedStereotypeIds) { - elem.appliedStereotypeIds = elem._appliedStereotypeIds; - } - if (forEdit) { - //only keep editable or needed keys in edit object instead of everything - const keys = Object.keys(elem); - keys.forEach((key) => { - if (this.editKeys.indexOf(key) >= 0) { - return; - } - delete elem[key]; - }); - } - return elem; - } - - /** - * @name veUtils/UtilsService#normalize - * Normalize common arguments - * - * @param {RequestObject} reqOb - * @returns {RequestObject} with default values for ref and commit - */ - public normalize = (reqOb: RequestObject): RequestObject => { - reqOb.refId = !reqOb.refId ? 'master' : reqOb.refId; - reqOb.commitId = !reqOb.commitId ? 'latest' : reqOb.commitId; - return reqOb; - }; - - /** - * @name veUtils/UtilsService#makeRequestObject - * Make a request object out of an ElementObject - * - * @param {ElementObject} elementOb - * @returns {RequestObject} - */ - public makeRequestObject = (elementOb: ElementObject): RequestObject => { - return { - projectId: elementOb._projectId, - refId: elementOb._refId, - commitId: elementOb._commitId, - }; - }; - - /** - * @name veUtils/UtilsService#makeElementRequestObject - * Make a single element request object out of an ElementObject - * - * @param {ElementObject} elementOb - * @returns {ElementsRequest} - */ - public makeElementRequestObject(elementOb: ElementObject): ElementsRequest { - return { - elementId: elementOb.id, - projectId: elementOb._projectId, - refId: elementOb._refId, - commitId: elementOb._commitId, - }; - } - - /** - * @name veUtils/UtilsService#makeCacheKey - * Make key for element for use in CacheService - * - * @param {RequestObject | null} reqOb request object - * @param elementId - * @param type - * @param {boolean} [edit=false] element is to be edited - * @returns {Array} key to be used in CacheService - */ - public makeCacheKey(reqOb: RequestObject | null, elementId: string, edit?: boolean, type?: string): string[] { - const key: string[] = []; - const keyType: string = type ? type : 'element'; - key.push(keyType); - if (reqOb !== null) { - if (reqOb.projectId) key.push(reqOb.projectId); - if (reqOb.refId !== null) key.push(!reqOb.refId ? 'master' : reqOb.refId); - if (!keyType.includes('history') && reqOb.commitId !== null) - key.push(!reqOb.commitId ? 'latest' : reqOb.commitId); - } - if (elementId !== '') key.push(elementId); - if (edit) key.push('edit'); - return key; - } - - /** - * @name veUtils/UtilsService#filterProperties - * given element object a and element object b, - * returns new object with b data minus keys not in a - * (set notation A intersect B) - * - * @param {Object} a Element Object - * @param {Object} b Element Object - * @returns {Object} new object - */ - // public filterProperties(a: ElementObject, b: ElementObject): ElementObject { - // const res: ElementObject = null - // for (const key in a) { - // if (a.hasOwnProperty(key) && b.hasOwnProperty(key)) { - // res[key] = b[key] - // } - // } - // return res - // } - - /** - * @name veUtils/UtilsService#hasConflict - * Checks if sever and cache version of the element are - * the same so that the user is aware that they are overriding - * changes to the element that they have not seen in the cache element. - * Given edit object with only keys that were edited, - * 'orig' object and 'server' object, should only return true - * if key is in edit object and value in orig object is different - * from value in server object. - * - * @param {Object} edit An object that contains element id and any property changes to be saved. - * @param {Object} orig version of elem object in cache. - * @param {Object} server version of elem object from server. - * @returns {Boolean} true if conflict, false if not - */ - public hasConflict = (edit: ElementObject, orig: ElementObject, server: ElementObject): boolean => { - for (const i in edit) { - if ( - i === '_read' || - i === '_modified' || - i === '_modifier' || - i === '_creator' || - i === '_created' || - i === '_commitId' - ) { - continue; - } - if (edit.hasOwnProperty(i) && orig.hasOwnProperty(i) && server.hasOwnProperty(i)) { - if (!_.isEqual(orig[i], server[i])) { - return true; - } - } - } - return false; - }; - - /** - * @name veUtils/UtilsService#isRestrictedValue - * deprecated - * - * @param {string} table table content - * @returns {boolean} boolean - */ - // public isRestrictedValue(values: ExpressionObject[]) { - // if ( - // values.length > 0 && - // values[0].type === 'Expression' && - // values[0].operand && - // values[0].operand.length === 3 && - // values[0].operand[0].value === 'RestrictedValue' && - // values[0].operand[2].type === 'Expression' && - // values[0].operand[2].operand && - // Array.isArray(values[0].operand[2].operand) && - // values[0].operand[2].operand.length > 0 && - // values[0].operand[1].type === 'ElementValue' - // ) { - // return true - // } - // return false - // } - - /** - * @name veUtils/ApiService#createUUID - * - * Alias for the currently adopted UUID standard for View Editor/MMS - * - */ - public createUUID = (): string => { - return uuid.v4(); - }; - - /** - * @name veUtils/UtilsService#createUniqueId - * Generate unique SysML element ID - * - * @returns {string} unique SysML element ID - */ - public createUniqueId = (): string => { - return `ve-${this.getVeVersion().replace(/\./g, '-')}-${this.createUUID()}`; - }; - - /** - * @name veUtils/UtilsService#isView - * Evaluates if an given element is a view or not - * - * @param {Object} e element - * @returns {boolean} boolean - */ - public isView = (e: ElementObject): boolean => { - if (e.appliedStereotypeIds) { - if ( - e.appliedStereotypeIds.indexOf(this.schemaSvc.getSchema('VIEW_SID', this.schema)) >= 0 || - e.appliedStereotypeIds.indexOf(this.schemaSvc.getSchema('DOCUMENT_SID', this.schema)) >= 0 - ) { - return true; - } - const otherViewSids: string[] = this.schemaSvc.getSchema('OTHER_VIEW_SID', this.schema); - for (const otherViewSid of otherViewSids) { - if (e.appliedStereotypeIds.indexOf(otherViewSid) >= 0) { - return true; - } - } - } - return false; - }; - - /** - * @name veUtils/UtilsService#isDocument - * Evaluates if an given element is a document or not - * - * @param {Object} e element - * @returns {boolean} boolean - */ - public isDocument = (e: ElementObject): boolean => { - return ( - e.appliedStereotypeIds && - e.appliedStereotypeIds.indexOf(this.schemaSvc.getSchema('DOCUMENT_SID', this.schema)) >= 0 - ); - }; - - /** - * @name veUtils/UtilsService#isRequirement - * Evaluates if an given element is a requirement from list given above: this.REQUIREMENT_SID - * - * @param {Object} e element - * @returns {boolean} boolean - */ - public isRequirement = (e: ElementObject): boolean => { - if (e.appliedStereotypeIds) { - const reqSids = this.schemaSvc.getSchema('REQUIREMENT_SID', this.schema); - for (const reqSid of reqSids) { - if (e.appliedStereotypeIds.indexOf(reqSid) >= 0) { - return true; - } - } - } - return false; - }; -} - -veUtils.service('ApiService', ApiService); diff --git a/src/ve-utils/mms-api-client/Authorization.service.ts b/src/ve-utils/mms-api-client/Authorization.service.ts deleted file mode 100644 index da0b5ec12..000000000 --- a/src/ve-utils/mms-api-client/Authorization.service.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { CacheService, EditService, SessionService } from '@ve-utils/core'; -import { ElementService, HttpService, ProjectService, URLService, ViewService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { AuthRequest, AuthResponse, CheckAuthResponse } from '@ve-types/mms'; - -/** - * @ngdoc service - * @name veUtils/ApplicationService - * @requires $q - * @requires $http - * @requires URLService - * @requires HttpService - * @requires ElementService - * @requires ViewService - * @requires ProjectService - * * Provide general authorization functions. I.e. login, logout, etc... - */ -export class AuthService { - private token: string | null; - static $inject = [ - '$q', - '$http', - 'CacheService', - 'URLService', - 'HttpService', - 'ElementService', - 'ViewService', - 'ProjectService', - 'SessionService', - 'EditService', - ]; - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private cacheSvc: CacheService, - private uRLSvc: URLService, - private httpSvc: HttpService, - private elementSvc: ElementService, - private viewSvc: ViewService, - private projectSvc: ProjectService, - private sessionSvc: SessionService, - private autosaveSvc: EditService - ) { - this.token = localStorage.getItem('token'); - } - - getAuthorized(credentialsJSON: AuthRequest): VePromise { - const deferred = this.$q.defer(); - const loginURL = this.uRLSvc.getAuthenticationUrl(); - this.$http.post(loginURL, credentialsJSON).then( - (success) => { - this.uRLSvc.setToken(success.data.token); - this.token = success.data.token; - localStorage.setItem('token', this.token); - deferred.resolve(this.token); - }, - (fail: angular.IHttpResponse) => { - deferred.reject(this.uRLSvc.handleHttpStatus(fail)); - } - ); - return deferred.promise; - } - - removeToken = (): void => { - localStorage.removeItem('token'); - this.token = undefined; - this.uRLSvc.setToken(null); - this.httpSvc.dropAll(); - this.elementSvc.reset(); - this.projectSvc.reset(); - this.viewSvc.reset(); - this.cacheSvc.reset(); - this.autosaveSvc.reset(); - this.sessionSvc.clear(); - }; - - getToken = (): string => { - return this.token; - }; - - checkLogin(): VePromise { - const deferred = this.$q.defer(); - if (!this.token) { - deferred.reject(false); - return deferred.promise; - } - this.uRLSvc.setToken(this.token); - this.$http.get(this.uRLSvc.getCheckTokenURL()).then( - (response: angular.IHttpResponse) => { - if (response.status === 401) { - deferred.reject(response); - } else { - deferred.resolve(response.data); - } - }, - (fail) => { - deferred.reject(fail); - this.removeToken(); - } - ); - return deferred.promise; - } - - // async isAuthenticated(): Promise { - // return new Promise((resolve, reject) =>{ - // resolve = (result) => { - // return result; - // } - // reject = () => { - // this.removeToken(); - // return false; - // } - // this.$http.get(this.uRLSvc.getCheckTokenURL()).then((success:IHttpResponse) => { - // if (success.data.status === 401) - // return resolve(false); - // return resolve(true) - // - // }, (fail) =>{ - // return reject(fail); - // }); - // }) - // } - - logout(): VePromise { - const deferred = this.$q.defer(); - this.checkLogin() - .then( - () => { - this.removeToken(); - //$cookies.remove('com.tomsawyer.web.license.user'); - }, - () => { - this.removeToken(); - } - ) - .finally(() => { - deferred.resolve(true); - }); - return deferred.promise; - } -} - -veUtils.service('AuthService', AuthService); diff --git a/src/ve-utils/mms-api-client/Base.service.ts b/src/ve-utils/mms-api-client/Base.service.ts deleted file mode 100644 index f42ead346..000000000 --- a/src/ve-utils/mms-api-client/Base.service.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { VePromise } from '@ve-types/angular'; -import { BasicResponse, MmsObject } from '@ve-types/mms'; - -export class BaseApiService { - protected inProgress: { - [key: string]: VePromise>; - } = {}; - - protected _isInProgress = (key: string): boolean => { - return this.inProgress.hasOwnProperty(key); - }; - - protected _getInProgress>(key: string): VePromise { - if (this._isInProgress(key)) return this.inProgress[key] as unknown as VePromise; - else return; - } - - protected _addInProgress>( - key: string, - promise: VePromise - ): void { - this.inProgress[key] = promise as unknown as VePromise>; - } - - protected _removeInProgress = (key: string): void => { - delete this.inProgress[key]; - }; - - public reset = (): void => { - this.inProgress = {}; - }; -} diff --git a/src/ve-utils/mms-api-client/Element.service.ts b/src/ve-utils/mms-api-client/Element.service.ts deleted file mode 100644 index f0c83d5cb..000000000 --- a/src/ve-utils/mms-api-client/Element.service.ts +++ /dev/null @@ -1,1119 +0,0 @@ -import _ from 'lodash'; - -import { CacheService, EditObject, EditService } from '@ve-utils/core'; -import { ApiService, httpCallback, HttpService, URLService } from '@ve-utils/mms-api-client'; -import { BaseApiService } from '@ve-utils/mms-api-client/Base.service'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VePromiseReason, VePromisesResponse, VeQService } from '@ve-types/angular'; -import { - CommitObject, - CommitResponse, - ElementCreationRequest, - ElementObject, - ElementsRequest, - ElementsResponse, - GenericResponse, - QueryObject, - QueryParams, - RejectedObject, - RequestObject, - SearchResponse, - TaggedValueObject, -} from '@ve-types/mms'; - -/** - * @ngdoc service - * @name ElementService - * @requires $q - * @requires $http - * @requires URLService - * @requires UtilsService - * @requires CacheService - * @requires HttpService - * * An element CRUD service with additional convenience methods for managing edits. - */ -export class ElementService extends BaseApiService { - static $inject = ['$q', '$http', 'CacheService', 'EditService', 'URLService', 'ApiService', 'HttpService']; - - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private cacheSvc: CacheService, - private editSvc: EditService, - private uRLSvc: URLService, - private apiSvc: ApiService, - private httpSvc: HttpService - ) { - super(); - } - - /** - * @name veUtils/ElementService#getElement - * - * Gets an element object by projectId and elementId. If the element object is already in the cache, - * resolve the existing reference, if not or update is true, request it from server, - * add/merge into the cache. - * - * Most of these methods return promises that will reject with a reason object - * when a server call fails, see - * {@link veUtils/URLService#handleHttpStatus the return object} - * - * ## Example Usage - *
    -     this.elementSvc.this.getElement({projectId: 'projectId', elementId: 'element_id'}).then(
    -     (element) => { //element is an element object (see json schema)
    -                alert('got ' + element.name);
    -            },
    -     (reason) => {
    -                alert('get element failed: ' + reason.message);
    -                //see mms.URLService#handleHttpStatus for the reason object
    -            }
    -     );
    -     
    - * ## Example with commitId - *
    -     this.elementSvc.this.getElement({
    -            projectId: 'projectId',
    -            elementId: 'elementId',
    -            refId: 'refId',         //default 'master'
    -            commitId: 'commitId',   //default 'latest'
    -        }).then(
    -     (element) => { //element is an element object (see json schema)
    -                alert('got ' + element.name);
    -            },
    -     (reason) => {
    -                alert('get element failed: ' + reason.message);
    -                //see mms.URLService#handleHttpStatus for the reason object
    -            }
    -     );
    -     
    - * @template {ElementObject} T - * @param {object} reqOb object with keys as described in private description. - * @param {integer} [weight=1] priority of request (2 is immediate, 1 is normal, 0 is low) - * @param refresh - * @param allowEmpty - * from server, even if it's already in cache (this will update the cache if exists) - * @returns {IPromise | VePromise} The promise will be resolved with the element object, - * multiple calls to this method with the same parameters would give the - * same object - */ - getElement( - reqOb: ElementsRequest, - weight?: number, - refresh?: boolean, - allowEmpty?: boolean - ): VePromise { - this.apiSvc.normalize(reqOb); - const requestCacheKey = this.getRequestKey(reqOb, reqOb.elementId); - if (!reqOb.projectId) { - console.log('foo'); - } - const url = this.uRLSvc.getElementURL(reqOb); - const cached: T = this.cacheSvc.get(requestCacheKey); - // if it's in the this.inProgress queue get it immediately - if (this._isInProgress(url)) { - //change to change priority if it's already in the queue - this.httpSvc.ping(url, weight); - return this._getInProgress(url) as VePromise; - } - const deletedRequestCacheKey = this.getRequestKey(reqOb, reqOb.elementId); - deletedRequestCacheKey.push('deleted'); - const deleted = this.cacheSvc.get(deletedRequestCacheKey); - if (deleted && !refresh) { - return new this.$q((resolve, reject) => { - return reject({ - status: 410, - recentVersionOfElement: deleted, - message: 'Deleted', - }); - }); - } - if (cached && !refresh) { - return new this.$q((resolve, reject) => { - return resolve(cached); - }); - } - this._addInProgress( - url, - new this.$q((resolve, reject) => { - const successCallback: httpCallback> = (response) => { - const data = response.data; - this._removeInProgress(url); - if (Array.isArray(data.elements) && data.elements.length > 0) { - resolve(this.cacheElement(reqOb, data.elements[0])); - } else if (allowEmpty) { - resolve(null); - } else { - reject({ - status: 500, - message: 'Server Error: empty response', - }); //TODO - } - }; - const errorCallback: httpCallback> = (response) => { - const data = response.data; - const reason = this.uRLSvc.handleHttpStatus(response); - this._removeInProgress(url); - if (data && data.deleted && data.deleted.length > 0 && data.deleted[0].id === reqOb.elementId) { - reason.recentVersionOfElement = data.deleted[0]; - this.cacheDeletedElement(reqOb, data.deleted[0]); - } - if (allowEmpty && response.status == 404) { - resolve(null); - } else { - reject(reason); - } - }; - this.httpSvc.get>(url, successCallback, errorCallback, weight); - }) - ); - return this._getInProgress(url) as VePromise; - } - - /** - * @name veUtils/ElementService#getElements - * Same as getElement, but for multiple ids. - * - * @param {object} reqOb keys - {projectId, refId, elementIds (array of ids), commitId, extended} - * @param {integer} [weight=1] priority of request (2 is immediate, 1 is normal, 0 is low) - * @param {boolean} [refresh=false] (optional) whether to always get the latest - * from server, even if it's already in cache (this will refresh the cache if exists) - * @returns {Promise} The promise will be resolved with an array of element objects, - * multiple calls to this method with the same parameters would give the - * same objects - */ - getElements( - reqOb: ElementsRequest, - weight: number, - refresh?: boolean - ): VePromise> { - return new this.$q>((resolve, reject) => { - const request: { elements: { id: string }[] } = { elements: [] }; - const existing: T[] = []; - this.apiSvc.normalize(reqOb); - for (let i = 0; i < reqOb.elementId.length; i++) { - const id = reqOb.elementId[i]; - const requestCacheKey = this.getRequestKey(reqOb, id); - const exist = this.cacheSvc.get(requestCacheKey); - if (exist && !refresh) { - existing.push(exist); - continue; - } - request.elements.push({ id: id }); - } - if (request.elements.length === 0) { - resolve(existing); - return; - } - this.$http.put>(this.uRLSvc.getPutElementsURL(reqOb), request).then( - (response) => { - const data = response.data.elements; - let i; - if (data && data.length > 0) { - for (let i = 0; i < data.length; i++) { - existing.push(this.cacheElement(reqOb, data[i])); - } - } - const deleted = response.data.deleted; - if (deleted && deleted.length > 0) { - for (let i = 0; i < deleted.length; i++) { - this.cacheDeletedElement(reqOb, deleted[i]); - } - } - resolve(existing); - }, - (response: angular.IHttpResponse>) => - this.apiSvc.handleErrorCallback(response, reject) - ); - }); - } - - /** - * @name veUtils/ElementService#this.cacheElement - * handles caching of element objects - in case the metadata of reqOb is different - * from the element's canonical projectId/refId/commitId (due to being requested - * from a different project context), it'll become an alias - * - * @param {object} reqOb request keys - {projectId, refId, elementId, commitId, extended} - * @param {object} elementOb object to cache - * @param {boolean} [edit=false] whether object to cache is for editor - * @returns {object} cached object - */ - cacheElement(reqOb: RequestObject, elementOb: T): T { - let result: T = this.apiSvc.cleanElement(elementOb); - const requestCacheKey = this.getRequestKey(reqOb, result.id); - const origResultCommit = result._commitId; - if (reqOb.commitId === 'latest') { - const resultCommitCopy: T = _.cloneDeep(result); - result._commitId = 'latest'; //so realCacheKey is right later - const commitCacheKey = this.apiSvc.makeCacheKey(this.apiSvc.makeRequestObject(resultCommitCopy), result.id); //save historic element - this.cacheSvc.put(commitCacheKey, resultCommitCopy, true); - } - - const realCacheKey = this.getElementKey(result); - result._commitId = origResultCommit; //restore actual commitId - if (!_.isEqual(realCacheKey, requestCacheKey)) { - this.cacheSvc.link(requestCacheKey, realCacheKey); - } - result = this.cacheSvc.put(realCacheKey, result, true); - return result; - } - - openEdit(elementOb: T, clean: boolean): EditObject { - const result: T = clean ? this.apiSvc.cleanElement(elementOb, true) : elementOb; - result._commitId = 'latest'; - const editKey = this.getEditElementKey(elementOb); - - return this.editSvc.addOrUpdate(editKey, result) as EditObject; - } - - cacheDeletedElement = (reqOb: RequestObject, deletedOb: ElementObject): void => { - const requestCacheKey = this.getRequestKey(reqOb, deletedOb.id); - requestCacheKey.push('deleted'); - const deletedReqOb: RequestObject = { - projectId: deletedOb._projectId, - refId: deletedOb._refId, - commitId: deletedOb._commitId, - }; - const commitCacheKey = this.apiSvc.makeCacheKey(deletedReqOb, deletedOb.id); - this.cacheSvc.link(requestCacheKey, commitCacheKey); - this.cacheSvc.put(commitCacheKey, deletedOb, true); - }; - - /** - * @name veUtils/ElementService#getElementForEdit - * Gets an element object to edit by id. (this is different from getElement in - * that the element is a clone and not the same reference. The rationale is to - * consider angular data bindings so editor an element does not cause unintentional - * updates to other parts of the view, separating reads and edits) - * - * ## Example - *
    -     this.elementSvc.getElementForEdit(reqOb).then(
    -     (editableElement) => {
    -                editableElement.name = 'changed name'; //immediately change a name and save
    -                this.elementSvc.updateElement(editableElement).then(
    -                    (updatedElement) => { //at this point the regular getElement would show the update
    -                        alert('updated');
    -                    },
    -                    (reason) => {
    -                        alert('update failed');
    -                    }
    -                );
    -            },
    -     (reason) => {
    -                alert('get element failed: ' + reason.message);
    -            }
    -     );
    -     
    - * - * @param {object} reqOb see description of getElement. - * @param {integer} [weight=1] priority - * @param {boolean} [refresh=false] update from server - * @returns {Promise} The promise will be resolved with the element object, - * multiple calls to this method with the same id would result in - * references to the same object. This object can be edited without - * affecting the same element object that's used for displays - */ - getElementForEdit( - reqOb: ElementsRequest, - weight?: number, - overwrite?: boolean - ): VePromise, ElementsResponse> { - this.apiSvc.normalize(reqOb); - const requestCacheKey = this.getEditKey(reqOb); - const url = this.uRLSvc.getElementURL(reqOb) + 'edit'; - if (!this._isInProgress(url)) { - const openEdit = this.editSvc.get(requestCacheKey); - if (openEdit && !overwrite) { - return new this.$q, ElementsResponse>((resolve, reject) => { - return resolve(openEdit); - }); - } - this._addInProgress( - url, - new this.$q, ElementsResponse>((resolve, reject) => { - this.getElement(reqOb, weight) - .then( - (result) => { - const copy = this.apiSvc.cleanElement(_.cloneDeep(result), true); - resolve(this.editSvc.addOrUpdate(requestCacheKey, copy, overwrite) as EditObject); - }, - (reason) => { - reject(reason); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - }) - ); - } - return this._getInProgress(url) as VePromise, ElementsResponse>; - } - - /** - * @name veUtils/ElementService#getOwnedElements - * Gets element's owned element objects. TBD (stub) - * - * @param {object} reqOb see description of getElement, add 'depth' key. - * @param {integer} [weight=1] priority - * @param {boolean} [refresh=false] update from server - * @returns {Promise} The promise will be resolved with an array of - * element objects - */ - // TODO this doesn't work, need to use search - getOwnedElements( - reqOb: ElementsRequest, - weight?: number, - refresh?: boolean - ): VePromise> { - this.apiSvc.normalize(reqOb); - if (!reqOb.depth) { - reqOb.depth = -1; - } - return this.getGenericElements(this.uRLSvc.getOwnedElementURL(reqOb), reqOb, 'elements', weight, refresh); - } - - /** - * @name veUtils/ElementService#getGenericElements - * This is a method to call a predefined url that returns elements json. - * A key provides the key of the json that has the elements array. - * - * @param {string} url the url to get - * @param {ElementsRequest} reqOb see description of getElement. - * @param {string} jsonKey json key that has the element array value - * @param {integer} [weight=1] priority - * @param {boolean} [refresh=false] update from server - */ - getGenericElements( - url: string, - reqOb: RequestObject, - jsonKey: string, - weight: number, - refresh?: boolean - ): VePromise> { - this.apiSvc.normalize(reqOb); - const requestCacheKey = this.getRequestKey(reqOb, jsonKey); - if (this._isInProgress(url)) { - this.httpSvc.ping(url, weight); - return this._getInProgress(url) as VePromise>; - } - const cached = this.cacheSvc.get(requestCacheKey); - if (cached && !refresh) { - return new this.$q>((resolve, reject) => { - return resolve(cached); - }); - } - this._addInProgress( - url, - new this.$q>((resolve, reject) => { - this.httpSvc.get>( - url, - (response) => { - const results: T[] = []; - const elements: T[] = response.data[jsonKey]; - for (let i = 0; i < elements.length; i++) { - const element = elements[i]; - if (!element) { - //check for possible null - continue; - } - results.push(this.cacheElement(reqOb, element)); - } - this._removeInProgress(url); - resolve(results); - return; - }, - (response: angular.IHttpResponse>) => { - this._removeInProgress(url); - reject(this.uRLSvc.handleHttpStatus(response)); - }, - weight - ); - }) - ); - return this._getInProgress>(url) as VePromise>; - } - - //called by updateElement, fills in all keys for element to be updated - //will also send any cached edited field for the element to be updated - fillInElement = (elementOb: ElementObject): ElementObject => { - /* - var deferred = this.$q.defer(); - this.getElement({ - projectId: elementOb._projectId, - elementId: elementOb.id, - commitId: 'latest', - refId: elementOb._refId - }, 2) - .then((data) => { - */ - const ob = _.cloneDeep(elementOb); //make a copy - ob._commitId = 'latest'; - const editOb = this.editSvc.get(this.getEditElementKey(elementOb)); - if (editOb && editOb.element) { - Object.keys(editOb.element).forEach((key) => { - if (!elementOb.hasOwnProperty(key)) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment - ob[key] = editOb.element[key]; - } - }); - } - if (ob._displayedElementIds) { - delete ob._displayedElementIds; - } - if (ob._allowedElementIds) { - delete ob._allowedElementIds; - } - if (ob._childViews && !elementOb._childViews) { - delete ob._childViews; - } - if (ob.type && ob.type.endsWith('TaggedValue') && ob.value && (ob as TaggedValueObject).value.length > 0) { - // make sure value array only has the value - const newvalues = []; - for (const val of (ob as TaggedValueObject).value) { - if (ob.type === 'ElementTaggedValue') { - newvalues.push(val.elementId); - } else { - newvalues.push({ value: val.value }); - } - } - if (ob.type === 'ElementTaggedValue') { - ob.valueIds = newvalues; - delete ob.value; - } else { - ob.value = newvalues; - } - } - delete ob._commitId; - return ob; - /* - resolve(ob); - }, () => { - resolve(elementOb); - }); - }); - */ - }; - - /** - * @name veUtils/ElementService#updateElement - * Save element to mms and update the cache if successful, the element object - * must have an id, and whatever property that needs to be updated. - * - * {@link veUtils/ElementService#getElementForEdit see also getElementForEdit} - * - * @param {ElementObject} elementOb An object that contains _projectId, _refId, sysmlId and any property changes to be saved. - * @param {boolean} returnChildViews - * @param {boolean} allowEmpty - * @returns {VePromise} The promise will be resolved with the updated cache element reference if - * update is successful. If a conflict occurs, the promise will be rejected with status of 409 - */ - updateElement( - elementOb: T, - returnChildViews?: boolean, - allowEmpty?: boolean - ): VePromise> { - //elementOb should have the keys needed to make url - - return new this.$q((resolve, reject) => { - const handleSuccess = (data: ElementsResponse): void => { - let e: T = data.elements[0]; - - if (data.elements.length > 1 && elementOb.id) { - for (let i = 0; i < data.elements.length; i++) { - if (data.elements[i].id === elementOb.id) { - e = data.elements[i]; - } - } - } - const metaOb: ElementsRequest = { - projectId: e._projectId, - refId: e._refId, - commitId: 'latest', - elementId: e.id, - }; - const resp: T = this.cacheElement(metaOb, e); - // const editCopy = _.cloneDeep(e) - // this.cacheElement(metaOb, editCopy, true) - const history = this.cacheSvc.get( - this.apiSvc.makeCacheKey(metaOb, metaOb.elementId, false, 'history') - ); - if (history) { - const id = e._commitId ? e._commitId : 'latest'; - history.unshift({ - _creator: e._modifier, - _created: e._modified, - id: id, - _refId: e._refId, - _projectId: e._projectId, - }); - } - resolve(resp); - }; - - if (!elementOb.hasOwnProperty('id')) { - reject({ - status: 400, - message: 'Element id not found, create element first!', - }); - } - const postElem = this.fillInElement(elementOb); - //.then((postElem) => { - this.$http - .post>( - this.uRLSvc.getPostViewsURL({ - projectId: postElem._projectId, - refId: postElem._refId, - returnChildViews: returnChildViews, - }), - { - elements: [postElem], - source: `ve-${this.apiSvc.getVeVersion()}`, - }, - { timeout: 60000 } - ) - .then( - (response) => { - const rejected = response.data.rejected; - if (rejected && rejected.length > 0 && rejected[0].code === 304 && rejected[0].object) { - //elem will be rejected if server detects no changes - resolve(rejected[0].object); - return; - } - - if (!Array.isArray(response.data.elements) || response.data.elements.length === 0) { - if (allowEmpty) { - resolve(null); - } else { - reject({ - status: 500, - message: 'Server Error: empty response', - }); - } - return; - } - handleSuccess(response.data); - }, - (response: angular.IHttpResponse>) => { - if (response.status === 409) { - const serverOb = response.data.elements[0]; - this.apiSvc.cleanElement(serverOb); - const origCommit = elementOb._commitId; - elementOb._commitId = 'latest'; - const origOb = this.cacheSvc.get( - this.apiSvc.makeCacheKey( - { - projectId: elementOb._projectId, - refId: elementOb._refId, - commitId: elementOb._commitId, - }, - elementOb.id - ) - ); - elementOb._commitId = origCommit; - if (!origOb) { - reject(this.uRLSvc.handleHttpStatus(response)); - return; - } - if (!this.apiSvc.hasConflict(postElem, origOb, serverOb)) { - elementOb._modified = serverOb._modified; - this.updateElement(elementOb, returnChildViews).then( - (good) => { - resolve(good); - }, - (reason) => { - reject(reason); - } - ); - } else { - reject(this.uRLSvc.handleHttpStatus(response)); - } - } else reject(this.uRLSvc.handleHttpStatus(response)); - } - ); - }); - } - - /** - * @name veUtils/ElementService#updateElements - * Save elements to alfresco and update the cache if successful. - * - * @param {Array.} elementObs, array of element objects that contains element id and any property changes to be saved. - * @param {boolean} returnChildViews, whether to include childViews - * @returns {Promise} The promise will be resolved with an array of updated element references if - * update is successful and will be rejected with an object with the following format: - * {failedRequests: list of rejection reasons, successfulRequests: array of updated elements } - */ - updateElements( - elementObs: T[], - returnChildViews?: boolean - ): VePromise> { - return new this.$q>((resolve, reject) => { - if (this._validate(elementObs)) { - const postElements = elementObs.map((elementOb) => { - return this.fillInElement(elementOb) as T; - }); - - const groupOfElements = this._groupElementsByProjectIdAndRefId(postElements); - const promises: VePromise>[] = []; - - Object.keys(groupOfElements).forEach((key) => { - promises.push(this._bulkUpdate(groupOfElements[key], returnChildViews)); - }); - - // responses is an array of response corresponding to both successful and failed requests with the following format - // [ { state: 'fulfilled', value: the value returned by the server }, - // { state: 'rejected', reason: {status, data, message} -- Specified by handleHttpStatus method } - // ] - this.$q.allSettled(promises).then((responses) => { - // get all the successful requests - const successfulRequests = responses.filter((response) => { - return response.state === 'fulfilled'; - }); - - const successValues = _.flatten( - successfulRequests.map((response) => { - return response.value; - }) - ); - - if (successfulRequests.length === promises.length) { - // All requests succeeded - resolve(successValues); - } else { - // some requests failed - const rejectionReasons: VePromiseReason>[] = responses - .filter((response) => { - return response.state === 'rejected'; - }) - .map((response): unknown => { - return response.reason as VePromiseReason>; - }) as VePromiseReason>[]; - - // since we could have multiple failed requests when having some successful requests, - // reject with the following format so that the client can deal with them at a granular level if - // desired - reject({ - status: 400, - message: 'Some elements failed', - data: { - failedRequests: rejectionReasons, - successfulRequests: successValues, - }, - }); - } - }, reject); - } else { - const response: VePromiseReason> = { - status: 400, - message: 'Some of the elements do not have id, _projectId, _refId', - data: {}, - }; - reject(response); - } - }); - } - - /** - * @name veUtils/ElementService#createElement - * Create element on veUtils/ - * - * @param {object} reqOb see description of getElement, instead of elementId, 'element' key should be - * the element object to create - * @returns {Promise} The promise will be resolved with the created element references if - * create is successful. - */ - createElement(reqOb: ElementCreationRequest): VePromise { - this.apiSvc.normalize(reqOb); - return new this.$q((resolve, reject) => { - const url = this.uRLSvc.getPostElementsURL(reqOb); - this.$http - .post>(url, { - elements: reqOb.elements, - source: `ve-${this.apiSvc.getVeVersion()}`, - }) - .then( - (response: angular.IHttpResponse>) => { - if (!Array.isArray(response.data.elements) || response.data.elements.length === 0) { - reject({ - status: 500, - - message: 'Server Error: empty response', - }); - return; - } - let resp: T = response.data.elements[0]; - if (response.data.elements.length > 1 && reqOb.elements[0].id) { - for (let i = 0; i < response.data.elements.length; i++) { - if (response.data.elements[i].id === reqOb.elements[0].id) { - resp = response.data.elements[i]; - } - } - } - resolve(this.cacheElement(reqOb, resp)); - }, - (response: angular.IHttpResponse>) => - this.apiSvc.handleErrorCallback(response, reject) - ); - }); - } - - /** - * @name veUtils/ElementService#createElements - * Create elements to alfresco and update the cache if successful. - * - * @param {object} reqOb see description of getElement, instead of elementId, 'elements' key should be - * the array of element object to create - * @returns {Promise} The promise will be resolved with an array of created element references if - * create is successful. - */ - createElements(reqOb: ElementCreationRequest): VePromise> { - this.apiSvc.normalize(reqOb); - return new this.$q>((resolve, reject) => { - const url = this.uRLSvc.getPostElementsURL(reqOb); - this.$http - .post>(url, { - elements: reqOb.elements, - source: `ve-${this.apiSvc.getVeVersion()}`, - }) - .then( - (response) => { - if (!Array.isArray(response.data.elements) || response.data.elements.length === 0) { - reject({ - status: 500, - - message: 'Server Error: empty response', - }); - return; - } - const results: T[] = []; - for (let i = 0; i < response.data.elements.length; i++) { - results.push(this.cacheElement(reqOb, response.data.elements[i])); - // const editCopy = _.cloneDeep(response.data.elements[i]) - // this.cacheElement(reqOb, editCopy, true) - } - resolve(results); - }, - (response: angular.IHttpResponse>) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - /** - * @name veUtils/ElementService#isCacheOutdated - * Checks if the current cached element has been updated on the server, does not update the cache. - * If the element doesn't exist in the cache, it's considered not outdated - * - * @param {ElementObject} elementOb see description of getElement - * @returns {Promise} Resolved with {status: false} if cache is up to date, - * Resolved with {status: true, server: server element, cache: cache element} if cache is outdated - */ - isCacheOutdated( - elementOb: T - ): VePromise< - { - status?: boolean; - server?: T; - cache?: T; - }, - ElementsResponse - > { - const reqOb: ElementsRequest = { - projectId: elementOb._projectId, - refId: elementOb._refId, - elementId: elementOb.id, - }; - return new this.$q< - { - status?: boolean; - server?: T; - cache?: T; - }, - ElementsResponse - >((resolve, reject) => { - const orig = this.cacheSvc.get(this.apiSvc.makeCacheKey(reqOb, elementOb.id, false)); - if (!orig) { - return resolve({ status: false }); - } - this.$http.get>(this.uRLSvc.getElementURL(reqOb)).then( - (response) => { - let server = _.cloneDeep(response.data.elements[0]); - delete server._modified; - delete server._read; - delete server._creator; - server = this.apiSvc.cleanElement(server); - let current: ElementObject = _.cloneDeep(orig); - delete current._modified; - delete current._read; - delete current._creator; - current = this.apiSvc.cleanElement(current); - if (_.isEqual(server, current)) { - resolve({ status: false }); - } else { - resolve({ - status: true, - server: response.data.elements[0], - cache: orig, - }); - } - }, - (response: angular.IHttpResponse>) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - /** - * @name veUtils/ElementService#search - * Search for elements based on some query - * - * @param {RequestObject} reqOb see description of getElement - * @param {QueryObject} query object with MMS4 query format - * @param {QueryParams} queryParams - * @param {integer} [weight=1] priority - * @returns {Promise} The promise will be resolved with an array of element objects. - * The element results returned will be a clone of the original server response and not cache references - */ - search( - reqOb: RequestObject, - query: QueryObject, - queryParams?: QueryParams, - weight? - ): VePromise, SearchResponse> { - this.apiSvc.normalize(reqOb); - const url = this.uRLSvc.getElementSearchURL(reqOb, queryParams); - return new this.$q, SearchResponse>((resolve, reject) => { - this.$http.post(url, query).then( - (response: angular.IHttpResponse>) => { - //var result = []; - //for (let i = 0; i < data.data.elements.length; i++) { - // var element = data.data.elements[i]; - // var cacheE = this.cacheElement(reqOb, element); - // var toAdd = _.cloneDeep(element); //make clone - // toAdd._relatedDocuments = cacheE._relatedDocuments; - // result.push(toAdd); - //} - //resolve(result); - resolve(response.data); - }, - (response: angular.IHttpResponse>) => - this.apiSvc.handleErrorCallback(response, reject) - ); - }); - } - - /** - * @name veUtils/ElementService#getElementVersions - * Queries for an element's entire version history - * - * @param {object} reqOb see getElement - * @param {integer} [weight=1] priority - * @param {boolean} [update=false] update from server - * @returns {Promise} The promise will be resolved with an array of commit objects. - */ - getElementHistory( - reqOb: ElementsRequest, - weight: number, - update?: boolean - ): VePromise { - this.apiSvc.normalize(reqOb); - const url = this.uRLSvc.getElementHistoryURL(reqOb); - if (this._isInProgress(url)) { - return this._getInProgress(url) as VePromise; - } - const requestCacheKey: string[] = this.apiSvc.makeCacheKey(reqOb, reqOb.elementId, false, 'history'); - if (this.cacheSvc.exists(requestCacheKey) && !update) { - return new this.$q((resolve, reject) => { - return resolve(this.cacheSvc.get(requestCacheKey)); - }); - } - this._addInProgress( - url, - new this.$q((resolve, reject) => { - this.$http.get(this.uRLSvc.getElementHistoryURL(reqOb)).then( - (response: angular.IHttpResponse) => { - this.cacheSvc.put(requestCacheKey, response.data.commits, true); - this._removeInProgress(url); - resolve(this.cacheSvc.get(requestCacheKey)); - }, - (response: angular.IHttpResponse) => { - this._removeInProgress(url); - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }) - ); - return this._getInProgress(url) as VePromise; - } - - public getRequestKey(reqOb: RequestObject, id: string, edit?: boolean): string[] { - return this.apiSvc.makeCacheKey(reqOb, id, edit); - } - - public getElementRequest(elementOb: ElementObject): ElementsRequest { - const req = this.apiSvc.makeRequestObject(elementOb); - (req as ElementsRequest).elementId = elementOb.id; - return req as ElementsRequest; - } - - public getElementKey(elementOb: ElementObject, edit?: boolean): string[] { - return this.getRequestKey(this.getElementRequest(elementOb), elementOb.id, edit); - } - - public getEditKey(reqOb: ElementsRequest): string[] { - const key: string[] = []; - if (reqOb !== null) { - if (reqOb.projectId) key.push(reqOb.projectId); - if (reqOb.refId !== null) key.push(!reqOb.refId ? 'master' : reqOb.refId); - } - key.push(reqOb.elementId); - return key; - } - - public getEditElementKey(e: ElementObject): string[] { - return [e._projectId, e._refId, e.id]; - } - - public getElementQualifiedName(reqOb: ElementsRequest): VePromise> { - // TODO this only gets the latest version - would need to walk the element owner gets manually for a commit - return new this.$q>((resolve, reject) => { - const queryOb = { - params: { - id: reqOb.elementId, - }, - recurse: { - ownerId: 'id', - }, - }; - this.search(reqOb, queryOb).then( - (data) => { - let qualifiedName = ''; - const elements = data.elements.reverse(); - const entries = elements.entries(); - for (const [i, element] of entries) { - if (element.hasOwnProperty('name')) { - qualifiedName += element.name; - } - if (i != elements.length - 1) { - qualifiedName += '/'; - } - } - return resolve(qualifiedName); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - private _groupElementsByProjectIdAndRefId(elementObs: T[]): _.Dictionary { - return _.groupBy(elementObs, (element) => { - return element._projectId + '|' + element._refId; - }); - } - - private _createMetaOb(element: ElementObject): ElementsRequest { - return { - projectId: element._projectId, - refId: element._refId, - commitId: 'latest', - elementId: element.id, - }; - } - - private _validate(elementObs: ElementObject[]): boolean { - return _.every(elementObs, (elementOb) => { - return ( - elementOb.hasOwnProperty('id') && - elementOb.hasOwnProperty('_projectId') && - elementOb.hasOwnProperty('_refId') - ); - }); - } - - private _bulkUpdate>( - elements: T[], - returnChildViews?: boolean - ): VePromise { - return new this.$q((resolve, reject) => { - const url = returnChildViews - ? this.uRLSvc.getPostViewsURL({ - projectId: elements[0]._projectId, - refId: elements[0]._refId, - returnChildViews: returnChildViews ? returnChildViews : null, - }) - : this.uRLSvc.getPostElementsURL({ - projectId: elements[0]._projectId, - refId: elements[0]._refId, - }); - this.$http - .post>( - url, - { - elements: elements, - source: `ve-${this.apiSvc.getVeVersion()}`, - }, - { timeout: 60000 } - ) - .then( - (response) => { - this._bulkUpdateSuccessHandler(response, resolve); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - private _bulkUpdateSuccessHandler( - serverResponse: angular.IHttpResponse>, - resolve: angular.IQResolveReject - ): void { - const results: T[] = []; - const elements = serverResponse.data.elements; - if (elements && elements.length > 0) { - elements.forEach((e) => { - const metaOb = this._createMetaOb(e); - //const editCopy = _.cloneDeep(e) - results.push(this.cacheElement(metaOb, e)); - - //this.cacheElement(metaOb, editCopy, true) - - const history = this.cacheSvc.get( - this.apiSvc.makeCacheKey(metaOb, metaOb.elementId, false, 'history') - ); - if (history) { - history.unshift({ - _creator: e._modifier, - _created: e._modified, - id: e._commitId, - _refId: e._refId, - _projectId: e._projectId, - }); - } - }); - } - const rejected: RejectedObject[] = serverResponse.data.rejected; - if (rejected && rejected.length > 0) { - rejected.forEach((e) => { - if (e.code === 304 && e.object) { - results.push(e.object); //add any server rejected elements because they haven't changed - console.log(`[BULK UPDATE ELEMENT REJECTED]: ${e.code}: ${e.message}`); - console.log(e.object.id); - } - }); - } - resolve(results); - } -} - -veUtils.service('ElementService', ElementService); diff --git a/src/ve-utils/mms-api-client/Http.service.ts b/src/ve-utils/mms-api-client/Http.service.ts deleted file mode 100644 index 601eff2ba..000000000 --- a/src/ve-utils/mms-api-client/Http.service.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { veUtils } from '@ve-utils'; - -export type httpCallback = (response: angular.IHttpResponse) => void; - -export interface HttpServiceRequest { - url: string; - successCallback: httpCallback; - errorCallback: httpCallback; - weight: number; -} - -/** - * @ngdoc service - * @name veUtils/HttpService - * * Provides prioritization and caching for $http service calls - */ -export class HttpService { - private queue: HttpServiceRequest[][] = []; - cache: { [key: string]: HttpServiceRequest } = {}; - inProgress = 0; - getLimit = 20; - - static $inject = ['$http']; - - constructor(private $http: angular.IHttpService) { - this.queue[0] = []; //high proirity - this.queue[1] = []; //low prority - } - - setOutboundLimit = (limit: number): void => { - this.getLimit = limit; - }; - - getQueue(): HttpServiceRequest[][] { - return this.queue; - } - - /** - * @name veUtils/HttpService#get - * Put a new get request in the queue, the queue is FIFO - * - * @param {string} url url to get - * @param {function} successCallback success function - * @param {function} errorCallback function - * @param {string} weight by weight - * @param {Object} config object containing http configuration parameters - */ - get(url: string, successCallback: httpCallback, errorCallback: httpCallback, weight: number): void { - if (weight === undefined) { - weight = 1; - } - const request: HttpServiceRequest = { - url: url, - successCallback: successCallback, - errorCallback: errorCallback, - weight: weight, - }; - if (this.inProgress >= this.getLimit) { - if (request.weight === 2) { - this.$http - .get(url) - .then( - (response: angular.IHttpResponse) => { - successCallback(response); - }, - (response: angular.IHttpResponse) => { - errorCallback(response); - } - ) - .finally(() => { - if (this.cache.hasOwnProperty(url)) { - delete this.cache[url]; - } - }); - } else if (request.weight === 0) { - this.queue[0].push(request); - } else { - this.queue[1].push(request); - } - if (this.cache.hasOwnProperty(url)) { - if (this.cache[url].weight < request.weight) this.cache[url].weight = request.weight; - } else { - this.cache[url] = request; - } - } else { - this.inProgress++; - this.cache[url] = request; - this.$http - .get(url) - .then( - (response: angular.IHttpResponse) => { - successCallback(response); - }, - (response: angular.IHttpResponse) => { - errorCallback(response); - } - ) - .finally(() => { - this.inProgress--; - let next: HttpServiceRequest; - if (this.cache.hasOwnProperty(url)) { - delete this.cache[url]; - } - if (this.queue[1].length > 0) { - next = this.queue[1].shift(); - this.get(next.url, next.successCallback, next.errorCallback, next.weight); - } else if (this.queue[0].length > 0) { - next = this.queue[0].shift(); - this.get(next.url, next.successCallback, next.errorCallback, next.weight); - } - }); - } - } - - /** - * @name veUtils/HttpService#ping - * If the current queue has an ongoing request, put it in front - * - * @param {string} url url to get - * @param {number} weight (optional) - */ - ping = (url: string, weight?: number): void => { - // ping should simply change the weight - if (weight === undefined) { - weight = 1; - } - if (this.cache.hasOwnProperty(url)) { - if (weight > this.cache[url].weight) { - const request = this.cache[url]; - let index: number; - if (request.weight === 0) index = this.queue[0].indexOf(request); - else index = this.queue[1].indexOf(request); - if (weight === 1 && index !== -1) { - request.weight = 1; - this.queue[1].push(request); - this.queue[0].splice(index, 1); - } else if (weight === 2 && index !== -1) { - if (request.weight === 0) { - this.queue[0].splice(index, 1); - } else { - this.queue[1].splice(index, 1); - } - this.get(request.url, request.successCallback, request.errorCallback, weight); - } - } - } - }; - - /** - * @name veUtils/HttpService#ping - * - * @description Changes all requests in the Queue 1 to Queue 0 - */ - transformQueue = (): void => { - if (this.queue[1].length > 0) { - //will the queue ever be defined? - for (let i = 0; i < this.queue[1].length; i++) { - this.queue[1][i].weight = 0; - // if(cache.hasOwnProperty(queue[1][i].request.url)) - // cache[queue[1][i].request.url].weight = 0; - this.queue[0].push(this.queue[1][i]); - //queue[1][i].shift(); - } - //queue[0] = queue[0].concat(queue[1]); - this.queue[1] = []; - } - }; - - dropAll = (): void => { - this.queue[1].length = 0; - this.queue[0].length = 0; - this.cache = {}; - this.inProgress = 0; - }; -} - -veUtils.service('HttpService', HttpService); diff --git a/src/ve-utils/mms-api-client/Permissions.service.ts b/src/ve-utils/mms-api-client/Permissions.service.ts deleted file mode 100644 index 6ffa7d5bc..000000000 --- a/src/ve-utils/mms-api-client/Permissions.service.ts +++ /dev/null @@ -1,96 +0,0 @@ -import { URLService } from '@ve-utils/mms-api-client'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { PermissionsObject, PermissionsResponse, ProjectObject, RefObject } from '@ve-types/mms'; - -export interface PermissionCache { - project: { [id: string]: boolean }; - ref: { [id: string]: boolean }; -} - -/** - * @ngdoc service - * @name PermissionsService - * - * @requires $q - * @requires $http - * @requires URLService - * * This utility service handles permissions inquiries - */ -export class PermissionsService { - private permissions: PermissionCache = { project: {}, ref: {} }; - - static $inject = ['$q', '$http', 'URLService']; - - constructor(private $q: VeQService, private $http: angular.IHttpService, private uRLSvc: URLService) {} - - public initializePermissions( - projectOb: ProjectObject, - refOb: RefObject - ): VePromise { - const url = this.uRLSvc.getPermissionsLookupURL(); - - const deferred = this.$q.defer(); - if ( - this.permissions.project[projectOb.id] !== undefined && - this.permissions.ref[projectOb.id + '/' + refOb.id] !== undefined - ) { - deferred.resolve(this.permissions); - return deferred.promise; - } - this.$http - .put(url, { - lookups: [ - { - type: 'PROJECT', - projectId: projectOb.id, - privilege: 'PROJECT_EDIT', - }, - { - type: 'BRANCH', - projectId: refOb._projectId, - refId: refOb.id, - privilege: 'BRANCH_EDIT_CONTENT', - }, - ], - }) - .then( - (response) => { - const data: PermissionsObject[] = response.data.lookups; - if (Array.isArray(data) && data.length > 0) { - data.forEach((d) => { - if (d.type == 'PROJECT') { - this.permissions.project[d.projectId] = d.hasPrivilege; - } else { - this.permissions.ref[d.projectId + '/' + d.refId] = d.hasPrivilege; - } - }); - deferred.resolve(this.permissions); - } else { - deferred.reject({ - status: 500, - data: '', - message: 'Server Error: empty response', - }); - } - }, - (response: angular.IHttpResponse) => { - deferred.reject(this.uRLSvc.handleHttpStatus(response)); - } - ); - - return deferred.promise; - } - - public hasProjectEditPermission = (projectId: string): boolean => { - return this.permissions.project[projectId]; - }; - - public hasBranchEditPermission = (projectId: string, refId: string): boolean => { - return this.permissions.ref[projectId + '/' + refId]; - }; -} - -veUtils.service('PermissionsService', PermissionsService); diff --git a/src/ve-utils/mms-api-client/Project.service.ts b/src/ve-utils/mms-api-client/Project.service.ts deleted file mode 100644 index 568bc96e5..000000000 --- a/src/ve-utils/mms-api-client/Project.service.ts +++ /dev/null @@ -1,705 +0,0 @@ -import { CacheService } from '@ve-utils/core'; -import { ApiService, ElementService, URLService } from '@ve-utils/mms-api-client'; -import { BaseApiService } from '@ve-utils/mms-api-client/Base.service'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { - CommitObject, - CommitResponse, - ElementObject, - GroupObject, - GroupsResponse, - MountObject, - OrgObject, - OrgsResponse, - ProjectObject, - ProjectsResponse, - RefObject, - RefsResponse, -} from '@ve-types/mms'; - -/** - * @ngdoc service - * @name ProjectService - * @requires $q - * @requires $http - * @requires ApplicationService - * @requires CacheService - * @requires ElementService - * @requires URLService - * @requires _ - * * This is a utility service for getting project, ref, commit information - */ -export class ProjectService extends BaseApiService { - static $inject = ['$q', '$http', 'CacheService', 'ElementService', 'URLService', 'ApiService']; - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private cacheSvc: CacheService, - private elementSvc: ElementService, - private uRLSvc: URLService, - private apiSvc: ApiService - ) { - super(); - } - - /** - * @name ProjectService#getOrg - * Gets org information from mms - * - * @param {string} orgId id of org - * @returns {Promise} Resolves to the org object. - */ - public getOrg(orgId: string): VePromise { - const key = ['org', orgId]; - const url = this.uRLSvc.getOrgURL(orgId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - if (this.cacheSvc.exists(key)) { - resolve(this.cacheSvc.get(key)); - this._removeInProgress(url); - return; - } else { - this.$http - .get(url) - .then( - (response: angular.IHttpResponse) => { - if (!response.data.orgs || response.data.orgs.length < 1) { - reject({ - status: 404, - message: 'Org not found', - type: 'error', - }); - } else { - this.cacheSvc.put(key, response.data.orgs[0], true); - resolve(this.cacheSvc.get(key)); - } - }, - (response: angular.IHttpResponse) => - this.apiSvc.handleErrorCallback(response, reject) - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - return this._getInProgress(url) as VePromise; - } - - /** - * @name ProjectService#getOrgs - * Gets orgs information - * - * @returns {Promise} Resolves into array of org objects. - */ - public getOrgs(updateCache?: boolean): VePromise { - const key = 'orgs'; - if (!this._isInProgress(key)) { - this._addInProgress( - key, - new this.$q((resolve, reject) => { - if (this.cacheSvc.exists(key) && !updateCache) { - resolve(this.cacheSvc.get(key)); - this._removeInProgress(key); - return; - } else { - this.$http - .get(this.uRLSvc.getOrgsURL()) - .then( - (response) => { - const orgs: OrgObject[] = []; - for (let i = 0; i < response.data.orgs.length; i++) { - const org = response.data.orgs[i]; - this.cacheSvc.put(['org', org.id], org, true); - orgs.push(this.cacheSvc.get(['org', org.id])); - } - this.cacheSvc.put(key, orgs, false); - resolve(this.cacheSvc.get(key)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(key); - }); - } - }) - ); - } - return this._getInProgress(key) as VePromise; - } - - public createOrg(name: string): VePromise { - return new this.$q((resolve, reject) => { - const url = this.uRLSvc.getOrgsURL(); - this.$http - .post(url, { - orgs: { name: name }, - source: `ve-${this.apiSvc.getVeVersion()}`, - }) - .then( - (response) => { - const org = response.data.orgs[0]; - const key = ['org', org.id]; - this.cacheSvc.put(key, response.data.orgs[0], true); - resolve(this.cacheSvc.get(key)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - public getProjects(orgId?: string, updateCache?: boolean): VePromise { - const url = this.uRLSvc.getProjectsURL(orgId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - const cacheKey = !orgId ? 'projects' : ['projects', orgId]; - if (this.cacheSvc.exists(cacheKey) && !updateCache) { - resolve(this.cacheSvc.get(cacheKey)); - this._removeInProgress(url); - return; - } else { - this.$http - .get(url) - .then( - (response) => { - if (!Array.isArray(response.data.projects)) { - reject({ - status: 500, - message: 'Server Error: empty response', - type: 'error', - }); - return; - } - if (!orgId) { - const orgProjects: { - [orgId: string]: ProjectObject[]; - } = {}; - response.data.projects.forEach((project) => { - const porg = project.orgId; - const pCacheKey = this.apiSvc.makeCacheKey( - null, - project.id, - false, - 'project' - ); - - if (orgProjects[porg] === undefined) { - orgProjects[porg] = []; - } - orgProjects[porg].push(this.cacheSvc.put(pCacheKey, project, true)); - Object.keys(orgProjects).forEach((orgId) => { - this.cacheSvc.put( - this.apiSvc.makeCacheKey(null, orgId, false, 'projects'), - orgProjects[orgId], - false - ); - }); - }); - } - resolve(this.cacheSvc.put(cacheKey, response.data.projects)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - return this._getInProgress(url) as angular.IPromise; - } - - public getProject(projectId: string, updateCache?: string): VePromise { - const url = this.uRLSvc.getProjectURL(projectId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - const cacheKey = ['project', projectId]; - const cached = this.cacheSvc.get(cacheKey); - if (cached && !updateCache) { - resolve(this.cacheSvc.get(cacheKey)); - this._removeInProgress(url); - } else { - this.$http - .get(url) - .then( - (response) => { - if (!Array.isArray(response.data.projects) || response.data.projects.length === 0) { - reject({ - status: 500, - message: 'Server Error: empty response', - type: 'error', - }); - return; - } - this.cacheSvc.put(cacheKey, response.data.projects[0], true); - resolve(this.cacheSvc.get(cacheKey)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - return this._getInProgress(url) as angular.IPromise; - } - - public getProjectMounts( - projectId: string, - refId: string, - updateCache?: boolean - ): VePromise { - const url = this.uRLSvc.getProjectMountsURL(projectId, refId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - const cacheKey = this.apiSvc.makeCacheKey({ projectId, refId }, '', false, 'project-mounts'); - - this.getProject(projectId).then( - (response: ProjectObject) => { - const mountOb: MountObject = { - id: response.id, - _mounts: [], - _projectId: response.id, - _refId: refId, - }; - const result: MountObject = Object.assign(mountOb, response); - const cached: MountObject = this.cacheSvc.get(cacheKey); - if (this.cacheSvc.exists(cacheKey) && !updateCache) { - result._mounts.push(...cached._mounts); - resolve(result); - this._removeInProgress(url); - return; - } else { - this.$http - .get(url) - .then( - (response) => { - if ( - !Array.isArray(response.data.projects) || - response.data.projects.length === 0 - ) { - reject({ - status: 500, - message: 'Server Error: empty response', - type: 'error', - }); - return; - } - if (response.data.projects[0]._mounts) { - result._mounts = (response.data.projects[0] as MountObject)._mounts; - } - resolve(this.cacheSvc.put(cacheKey, result, false)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }, - (response) => { - reject(response); - this._removeInProgress(url); - } - ); - }) - ); - } - return this._getInProgress(url) as VePromise; - } - - public getAllMountsAsArray = (project: MountObject): MountObject[] => { - const projectsList: MountObject[] = [project]; - const mounts = project._mounts; - const getMountsArray = (mounts: MountObject[], projectsList: MountObject[]): void => { - if (Array.isArray(mounts) && mounts.length !== 0) { - for (let i = 0; i < mounts.length; i++) { - projectsList.push(mounts[i]); - if (mounts[i]._mounts) { - getMountsArray(mounts[i]._mounts, projectsList); - } - } - } - }; - getMountsArray(mounts, projectsList); - return projectsList; - }; - - public getRefs(projectId: string): VePromise { - const cacheKey = this.apiSvc.makeCacheKey(null, projectId, false, 'refs'); - const url = this.uRLSvc.getRefsURL(projectId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - if (this.cacheSvc.exists(cacheKey)) { - resolve(this.cacheSvc.get(cacheKey)); - this._removeInProgress(url); - return; - } else { - this.$http - .get(url) - .then( - (response) => { - if (!Array.isArray(response.data.refs)) { - reject({ - status: 500, - - message: 'Server Error: empty response', - }); - return; - } - const refs: RefObject[] = []; - for (let index = 0; index < response.data.refs.length; index++) { - const ref: RefObject = response.data.refs[index]; - if (ref.id === 'master') { - ref.type = 'Branch'; - } - const refCacheKey: string[] = this.apiSvc.makeCacheKey( - { projectId: projectId, refId: ref.id }, - '', - false, - 'ref' - ); - this.cacheSvc.put(refCacheKey, ref, true); - refs.push(this.cacheSvc.get(refCacheKey)); - } - this.cacheSvc.put(cacheKey, refs, false); - resolve(this.cacheSvc.get(cacheKey)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - return this._getInProgress(url) as VePromise; - } - - public getRef(refId: string, projectId: string, updateCache?: boolean): VePromise { - const url = this.uRLSvc.getRefURL(projectId, refId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - const cacheKey = this.apiSvc.makeCacheKey({ projectId, refId }, '', false, 'ref'); - const cached = this.cacheSvc.get(cacheKey); - if (cached && !updateCache) { - this._removeInProgress(url); - resolve(cached); - } else { - this.$http - .get(url) - .then( - (response) => { - this.cacheSvc.put(cacheKey, response.data.refs[0]); - resolve(this.cacheSvc.get(cacheKey)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - - return this._getInProgress(url) as VePromise; - } - - public getCommits( - refId: string, - projectId: string, - timestamp?: string, - limit?: number - ): VePromise { - let url: string; - if (timestamp !== null) { - url = this.uRLSvc.getCommitsURL(projectId, refId, timestamp, limit); - } else { - url = this.uRLSvc.getCommitsURL(projectId, refId, null, limit); - } - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - this.$http - .get(url) - .then( - (response) => { - if (!Array.isArray(response.data.commits) || response.data.commits.length === 0) { - reject({ - status: 500, - - message: 'Project does not exist at specified time.', - type: 'error', - }); - return; - } - resolve(response.data.commits); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - }) - ); - } - return this._getInProgress(url) as VePromise; - } - - public getCommit(projectId: string, refId: string, commitId: string): VePromise { - const url = this.uRLSvc.getCommitUrl(projectId, refId, commitId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - const cacheKey = this.apiSvc.makeCacheKey({ projectId, refId, commitId }, '', false, 'commit'); - if (this.cacheSvc.exists(cacheKey)) { - resolve(this.cacheSvc.get(cacheKey)); - } else { - this.$http - .get(url) - .then( - (response) => { - resolve(this.cacheSvc.put(cacheKey, response.data.commits[0])); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - return this._getInProgress(url) as VePromise; - } - - public createRef(refOb: RefObject, projectId: string): VePromise { - return new this.$q((resolve, reject) => { - const url = this.uRLSvc.getRefsURL(projectId); - const cacheKey = this.apiSvc.makeCacheKey( - { projectId: refOb._projectId, refId: refOb.id }, - '', - false, - 'ref' - ); - this.$http - .post(url, { - refs: [refOb], - source: `ve-${this.apiSvc.getVeVersion()}`, - }) - .then( - (response) => { - if (!Array.isArray(response.data.refs) || response.data.refs.length === 0) { - reject({ - status: 500, - - message: 'Server Error: empty response', - type: 'error', - }); - return; - } - const createdRef = response.data.refs[0]; - const list = this.cacheSvc.get( - this.apiSvc.makeCacheKey(null, projectId, false, 'refs'), - true - ); - if (list) { - list.push(createdRef); - } - this.cacheSvc.put(cacheKey, createdRef); - resolve(this.cacheSvc.get(cacheKey)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - public updateRef(refOb: RefObject, projectId: string): VePromise { - return new this.$q((resolve, reject) => { - const url = this.uRLSvc.getRefsURL(projectId); - this.$http - .post(url, { - refs: [refOb], - source: `ve-${this.apiSvc.getVeVersion()}`, - }) - .then( - (response) => { - if (!Array.isArray(response.data.refs) || response.data.refs.length === 0) { - reject({ - status: 500, - - message: 'Server Error: empty response', - type: 'error', - }); - return; - } - const resp = response.data.refs[0]; - this.cacheSvc.put(['ref', projectId, resp.id], resp, true); - resolve(this.cacheSvc.get(['ref', projectId, resp.id])); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - public deleteRef(refId: string, projectId: string): VePromise { - return new this.$q((resolve, reject) => { - const url = this.uRLSvc.getRefURL(projectId, refId); - this.$http.delete(url).then( - (response) => { - const key = this.apiSvc.makeCacheKey({ refId, projectId }, '', false, 'ref'); - const refOb = this.cacheSvc.get(key); - if (refOb) { - this.cacheSvc.remove(key); - const list = this.cacheSvc.get( - this.apiSvc.makeCacheKey(null, projectId, false, 'refs'), - true - ); - if (list) { - for (let i = 0; i < list.length; i++) { - if (list[i].id === refOb.id) { - list.splice(i, 1); - break; - } - } - } - } - resolve(); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ); - }); - } - - public getGroups( - projectId: string, - refId: string, - updateCache?: boolean - ): VePromise { - const cacheKey = this.apiSvc.makeCacheKey({ projectId, refId }, '', false, 'groups'); - const url = this.uRLSvc.getGroupsURL(projectId, refId); - if (!this._isInProgress(url)) { - this._addInProgress( - url, - new this.$q((resolve, reject) => { - if (this.cacheSvc.exists(cacheKey) && !updateCache) { - resolve(this.cacheSvc.get(cacheKey)); - } else { - this.$http - .get(url) - .then( - (response) => { - if (!Array.isArray(response.data.groups)) { - reject({ - status: 500, - - message: 'Server Error: empty response', - type: 'error', - }); - return; - } - const groups: GroupObject[] = []; - const reqOb = { - projectId: projectId, - refId: refId, - commitId: 'latest', - elementId: '', - }; - for (let i = 0; i < response.data.groups.length; i++) { - let group: GroupObject = response.data.groups[i]; - reqOb.elementId = group.id; - group = this.elementSvc.cacheElement(reqOb, group); - this.cacheSvc.put(['group', projectId, refId, group.id], group, true); - groups.push( - this.cacheSvc.get(['group', projectId, refId, group.id]) - ); - } - this.cacheSvc.put(cacheKey, groups, false); - resolve(this.cacheSvc.get(cacheKey)); - }, - (response: angular.IHttpResponse) => { - this.apiSvc.handleErrorCallback(response, reject); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - } - }) - ); - } - return this._getInProgress(url) as VePromise; - } - - public getGroup(id: string, projectId: string, refId: string): VePromise { - return new this.$q((resolve, reject) => { - this.getGroups(projectId, refId).then( - (data) => { - const result = this.cacheSvc.get(['group', projectId, refId, id]); - if (result) { - resolve(result); - } else { - reject({ - status: 404, - - message: 'Group not found', - type: 'error', - }); - } - }, - (reason) => { - reject(reason); - } - ); - }); - } -} - -veUtils.service('ProjectService', ProjectService); diff --git a/src/ve-utils/mms-api-client/URL.service.ts b/src/ve-utils/mms-api-client/URL.service.ts deleted file mode 100644 index a024dbeaf..000000000 --- a/src/ve-utils/mms-api-client/URL.service.ts +++ /dev/null @@ -1,513 +0,0 @@ -import { veUtils } from '@ve-utils'; - -import { VePromiseReason } from '@ve-types/angular'; -import { VeConfig } from '@ve-types/config'; -import { - ArtifactsRequest, - BasicResponse, - ElementsRequest, - MmsObject, - QueryParams, - RequestObject, - ViewsRequest, -} from '@ve-types/mms'; - -/** - * @ngdoc service - * @name veUtils/URLService - * * This utility service gives back url paths for use in other services in communicating - * with the server, arguments like projectId, refId, commitId are expected to be strings and - * not null or undefined. This service is usually called by higher level services and - * should rarely be used directly by applications. - * - * To configure the base url of the mms server, you can use the URLServiceProvider - * in your application module's config. By default, the basePath is '/api', but is - * effectively '/' relative to the service layer due to the rewrite rule. - *
    -        angular.module('myApp', ['ve-components'])
    -        .config(function(URLServiceProvider) {
    -            URLServiceProvider.setBasePath('https://url/context/path');
    -        });
    - 
    - * (You may run into problems like cross origin security policy that prevents it from - * actually getting the resources from a different server, solution TBD) - */ -export class URLService { - readonly root: string; - readonly url: URL; - private token: string; - private veConfig: VeConfig = window.__env; - - static $inject = []; - - constructor(readonly basePath?: string, readonly apiUrl?: string) { - if (!this.apiUrl) { - this.apiUrl = this.veConfig.apiUrl; - } - if (!this.apiUrl) { - throw new Error('Unable to find "apiUrl" configuration for MMS. Please check your configuration file.'); - } - this.url = new URL(this.apiUrl); - this.url.pathname = this.veConfig.basePath ? this.veConfig.basePath : '/'; - - this.root = `${this.apiUrl}${this.basePath ? this.basePath : ''}`; - const token = localStorage.getItem('token'); - this.token = `${token}`; - } - - getRoot = (): string => { - return this.root; - }; - - getUrl = (): URL => { - return Object.assign({}, this.url); - }; - - setToken = (t: string): void => { - this.token = t; - }; - - getAuthorizationHeaderValue = (): string => { - return 'Bearer ' + this.token; - }; - - getAuthorizationHeader = (headers: angular.HttpHeaderType): angular.HttpHeaderType => { - if (!this.token) { - const token = localStorage.getItem('token'); - if (!token) { - return headers; - } else { - this.setToken(token); - } - } - if (!headers) { - headers = this.getHeaders(); - } - headers.Authorization = this.getAuthorizationHeaderValue(); - return headers; - }; - - getMmsServer = (): string => { - return this.apiUrl; - }; - - /** - * @name veUtils/URLService#setHeader - * Adds generates Default Headers using this.token - * - * @returns {object} The HTTP header format - */ - getHeaders(): angular.HttpHeaderType { - return { - 'Content-Type': 'application/json', - Authorization: 'Bearer ' + this.token, - }; - } - - /** - * @name veUtils/URLService#isTimestamp - * self explanatory - * - * @param {string} version A version string or timestamp - * @returns {boolean} Returns true if the string has '-' in it - */ - isTimestamp = (version?: string): boolean => { - if (!version) return false; - else if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}.\d{3}[+]?-\d{4}$/.test(version.trim())) return true; - return false; - }; - - /** - * @name veUtils/URLService#getMmsVersionURL - * self explanatory - * - * @returns {object} Returns object with mmsversion - */ - getMmsVersionURL = (): string => { - return `${this.root}/mmsversion`; - }; - - /** - * @name veUtils/URLService#getSiteDashboardURL - * Gets the path for a site dashboard. - * - * @param {string} site Site name (not title!). - * @returns {string} The path for site dashboard. - */ - getSiteDashboardURL = (site: string): string => { - return `${this.root}/orgs/${site}/projects/${site}/branches/master/elements`; - }; - - /** - * @name veUtils/URLService#getExportHtmlUrl - * Gets url that to convert HTML to PDF or Word - * @param {string} projectId id of the project - * @param {string} refId id of the ref - * @returns {string} The url - */ - getExportHtmlUrl = (): string => { - return this.veConfig.printUrl; - }; - - getAuthenticationUrl = (): string => { - return `${this.root}/authentication`; - }; - - getPermissionsLookupURL = (): string => { - return `${this.root}/permissions`; - }; - - getOrgURL = (orgId: string): string => { - return `${this.root}/orgs/${orgId}`; - }; - - getOrgsURL = (): string => { - return `${this.root}/orgs`; - }; - - getProjectsURL = (orgId?: string): string => { - if (orgId) return `${this.root}/projects?orgId=${orgId}`; - return `${this.root}/projects`; - }; - - getProjectURL = (projectId: string): string => { - return `${this.root}/projects/${projectId}`; - }; - - getProjectMountsURL = (projectId: string, refId: string): string => { - return `${this.root}/projects/${projectId}/refs/${refId}/mounts`; - }; - - getRefsURL = (projectId: string): string => { - return `${this.root}/projects/${projectId}/refs`; - }; - - getRefURL = (projectId: string, refId: string): string => { - return `${this.root}/projects/${projectId}/refs/${refId}`; - }; - - getCommitsURL = (projectId: string, refId: string, timestamp?: string, limit?: number): string => { - let r = `${this.root}/projects/${projectId}/refs/${refId}/commits`; - if (timestamp && this.isTimestamp(timestamp)) { - r = this._addUrlParam({ maxTimestamp: timestamp }, r); - if (!limit) { - limit = 1; - } - } - if (limit) { - r = this._addUrlParam({ limit: limit }, r); - } - return r; - }; - - getCommitUrl = (projectId: string, refId: string, commitId: string): string => { - return `${this.root}/projects/${projectId}/refs/${refId}/commits/${commitId}`; - }; - - getGroupsURL = (projectId: string, refId: string): string => { - return `${this.root}/projects/${projectId}/refs/${refId}/groups`; - }; - - /** - * @name veUtils/URLService#getProjectDocumentsURL - * Gets the url for all documents in a ref - * - * @param {object} reqOb object with keys as described in ElementService. - * @returns {string} The url - */ - getProjectDocumentsURL = (reqOb: RequestObject): string => { - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/documents`; - return this.addVersion(r, reqOb.commitId); - }; - - /** - * @name veUtils/URLService#getImageURL - * Gets the url for querying an image url - * (this is not the actual image path) - * - * @returns {string} The path for image url queries. - */ - getImageURL(reqOb: ElementsRequest): string { - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements/${reqOb.elementId}`; - return this.addVersion(r, reqOb.commitId); - } - - /** - * @name veUtils/URLService#getElementURL - * Gets the path for an element - * - * @param {object} reqOb object with keys as described in ElementService. - * @returns {string} The url. - */ - getElementURL(reqOb: ElementsRequest): string { - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/views/${reqOb.elementId}`; - return this.addVersion(r, reqOb.commitId); - } - - // getViewDataIdsURL (reqOb: RequestObject): string { - // const r = - // this.root + - // '/projects/' + - // reqOb.projectId + - // '/refs/' + - // reqOb.refId + - // '/elements/' + - // reqOb.elementId + - // '/cfids' - // return r - // } - // - // getViewsURL (reqOb: RequestObject): string { - // const r = - // this.root + - // '/projects/' + - // reqOb.projectId + - // '/refs/' + - // reqOb.refId + - // '/views/' + - // reqOb.elementId - // return r - // } - - getOwnedElementURL(reqOb: ElementsRequest): string { - let recurseString = 'recurse=true'; - if (reqOb.depth) recurseString = `depth=${reqOb.depth}`; - let r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements/${reqOb.elementId}`; - r = this.addVersion(r, reqOb.commitId); - if (r.indexOf('?') > 0) { - r += '&' + recurseString; - } else { - r += '?' + recurseString; - } - return r; - } - - /** - * @name veUtils/URLService#getElementHistoryURL - * Gets the url to query for element history - * - * @param {object} reqOb object with keys as described in ElementService. - * @returns {string} The url. - */ - getElementHistoryURL(reqOb: ElementsRequest): string { - return `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements/${reqOb.elementId}/commits`; - } - - /** - * @name veUtils/URLService#getPostViewsURL - * Gets the path for posting view changes. - * @param {RequestObject} reqOb - * @return {string} - */ - getPostViewsURL = (reqOb: ViewsRequest): string => { - return this.addChildViews( - `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/views`, - reqOb.returnChildViews - ); - }; - - /** - * @name veUtils/URLService#getPostElementsURL - * Gets the path for posting element changes. - * - * @param {object} reqOb object with keys as described in ElementService. - * @returns {string} The post elements url. - */ - getPostElementsURL = (reqOb: RequestObject): string => { - return `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements`; - }; - - /** - * @name veUtils/URLService#getPutElementsURL - * Gets the path for getting multiple elements (using put with body). - * - * @param {object} reqOb object with keys as described in ElementService. - * @returns {string} The post elements url. - */ - getPutElementsURL = (reqOb: RequestObject): string => { - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/views`; - return this.addVersion(r, reqOb.commitId); - }; - - /** - * @name veUtils/URLService#getElementSearchURL - * Gets the url for element keyword search. - * - * @param {RequestObject} reqOb object with keys as described in ElementService. - * @param {QueryParams} queryParams provide optional query parameters - * @returns {string} The post elements url. - */ - getElementSearchURL = (reqOb: RequestObject, queryParams?: QueryParams): string => { - let r: string; - let urlParams = ''; - if (queryParams) { - urlParams = this._addUrlParam(queryParams); - } - if (urlParams !== '') { - r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/search${urlParams}`; - } else { - r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/search`; - } - return r; - }; - - /** - * @ngdocs method - * @name veUtils/URLService#getArtifactURL - * Gets the url for an artifact - * - * @param {object} reqOb object with keys - * @param {string} artifactExtension (optional) string with the desired artifact extension - * @returns {string} url - */ - getArtifactURL(reqOb: ElementsRequest | ArtifactsRequest, artifactExtension?: string): string { - const ext = - artifactExtension !== undefined ? artifactExtension : (reqOb as ArtifactsRequest).artifactExtension; - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements/${reqOb.elementId}/${ext}`; - return this.addToken(this.addVersion(r, reqOb.commitId)); - } - - /** - * @ngdocs method - * @name veUtils/URLService#getArtifactEmbedURL - * Gets the url without added this.token for an artifact - * - * @param {object} reqOb object with keys - * @param {string} artifactExtension (optional) string with the desired artifact extension - * @returns {string} url - */ - getArtifactEmbedURL(reqOb: ArtifactsRequest, artifactExtension: string): string { - const ext = artifactExtension !== undefined ? artifactExtension : 'undefined'; - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements/${reqOb.elementId}/${ext}`; - return this.addVersion(r, reqOb.commitId); - } - - /** - * @ngdocs method - * @name veUtils/URLService#getPutArtifactsURL - * Gets the url for an artifact - * - * @param {object} reqOb object with keys - * @returns {string} url - */ - getPutArtifactsURL(reqOb: ElementsRequest): string { - const r = `${this.root}/projects/${reqOb.projectId}/refs/${reqOb.refId}/elements/${reqOb.elementId}`; - return this.addVersion(r, reqOb.commitId); - } - - /** - * @ngdocs method - * @name veUtils/URLService#getArtifactHistoryURL - * Gets the url for an artifact commit history - * - * @param {object} reqOb object with keys - * @returns {string} url - */ - getArtifactHistoryURL(reqOb: ElementsRequest): string { - return this.getElementHistoryURL(reqOb); - } - - getCheckTokenURL = (): string => { - return `${this.root}/checkAuth`; //TODO remove when server returns 404 - }; - - getPersonURL = (username: string): string => { - return `${this.root}/users?user=${username}`; - }; - - /** - * @name veUtils/URLService#handleHttpStatus - * Utility for setting the state of a deferred object based on the status - * of http error. The arguments are the same as angular's $http error - * callback - * - * @param {Object} response The http response - - * with this object based on the http status: - * ``` - * { - * status: status, - * message: http status message, - * data: data - * } - * ``` - */ - handleHttpStatus>( - response: angular.IHttpResponse - ): VePromiseReason { - const result: VePromiseReason = response; - const data: U = result.data; - if (result.status === 404) result.message = 'Not Found'; - else if (result.status === 500) { - if (typeof data === 'string' && data.indexOf('ENOTFOUND') >= 0) - result.message = 'Network Error (Please check network)'; - else result.message = 'Server Error'; - } else if (result.status === 401 || result.status === 403) result.message = 'Permission Error'; - else if (result.status === 409) result.message = 'Conflict'; - else if (result.status === 400) result.message = 'BadRequestObject'; - else if (result.status === 410) result.message = 'Deleted'; - else if (result.status === 408) result.message = 'Timed Out'; - else if (result.status === 501) { - result.message = 'Caching'; - } else result.message = 'Timed Out (Please check network)'; - return result; - } - - /** - * @name veUtils/URLService#addVersion - * Adds commitId parameter to URL string - * - * @param {String} url The url string for which to add version parameter argument. - * @param {String} version The commit id - * @returns {string} The url with commitId parameter added. - */ - private addVersion = (url: string, version: string): string => { - const r = url; - if (version && version !== 'latest') { - return this._addUrlParam({ commitId: version }, url); - } - return r; - }; - - private addChildViews = (url: string, add: boolean): string => { - const r = url; - if (!add) return r; - return this._addUrlParam({ childviews: true }, r); - }; - - /** - * @name veUtils/URLService#addToken - * Adds token parameter to URL string - * - * @param {String} url The url string for which to add token parameter argument. - * @returns {string} The url with commitId parameter added. - */ - private addToken = (url: string): string => { - return this._addUrlParam({ token: this.token }, url); - }; - - private _addUrlParam( - paramOb: { - [key: string]: string | boolean | number; - }, - url?: string - ): string { - let urlParams = ''; - if (url) { - urlParams = url; - } - for (const [key, value] of Object.entries(paramOb)) { - let v: string; - if (typeof value === 'string') v = value; - else v = value.toString(); - if (urlParams.indexOf('?') > 0) { - urlParams += `&${key}=${v}`; - } else { - urlParams += `?${key}=${v}`; - } - } - return urlParams; - } -} - -veUtils.service('URLService', URLService); diff --git a/src/ve-utils/mms-api-client/User.service.ts b/src/ve-utils/mms-api-client/User.service.ts deleted file mode 100644 index e14a27a69..000000000 --- a/src/ve-utils/mms-api-client/User.service.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { CacheService } from '@ve-utils/core'; -import { BaseApiService } from '@ve-utils/mms-api-client/Base.service'; -import { URLService } from '@ve-utils/mms-api-client/URL.service'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { UserObject, UsersResponse } from '@ve-types/mms'; - -export class UserService extends BaseApiService { - static $inject = ['$q', '$http', 'CacheService', 'URLService']; - - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private cacheSvc: CacheService, - private uRLSvc: URLService - ) { - super(); - } - - getUserData(username: string): VePromise { - const key = ['user', username]; - const url = this.uRLSvc.getPersonURL(username); - const cached = this.cacheSvc.get(key); - if (this._isInProgress(url)) { - return this._getInProgress(url) as VePromise; - } - if (cached) { - return new this.$q((resolve, reject) => { - return resolve(cached); - }); - } - this._addInProgress( - url, - new this.$q((resolve, reject) => { - this.$http - .get(url) - .then( - (response) => { - if (!response.data.users || response.data.users.length < 1) { - reject({ - status: 404, - message: 'User not found', - }); - } else { - this.cacheSvc.put(key, response.data.users[0], false); - resolve(this.cacheSvc.get(key)); - } - }, - (response: angular.IHttpResponse) => { - this.uRLSvc.handleHttpStatus(response); - reject(response); - } - ) - .finally(() => { - this._removeInProgress(url); - }); - }) - ); - - return this._getInProgress(url) as VePromise; - } -} - -veUtils.service('UserService', UserService); diff --git a/src/ve-utils/mms-api-client/Value.service.ts b/src/ve-utils/mms-api-client/Value.service.ts deleted file mode 100644 index 2c52cdd83..000000000 --- a/src/ve-utils/mms-api-client/Value.service.ts +++ /dev/null @@ -1,336 +0,0 @@ -import _ from 'lodash'; - -import { EditObject } from '@ve-utils/core'; -import { ApiService } from '@ve-utils/mms-api-client/Api.service'; -import { ElementService } from '@ve-utils/mms-api-client/Element.service'; -import { ValueSpec } from '@ve-utils/utils'; - -import { PropertySpec } from '@ve-components'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VeQService } from '@ve-types/angular'; -import { - ConstraintObject, - ElementObject, - ElementsRequest, - ElementTaggedValueObject, - ElementValueObject, - ExpressionObject, - InstanceValueObject, - LiteralObject, - SlotObject, - TaggedValueObject, - ValueObject, -} from '@ve-types/mms'; - -export class ValueService { - private valueTypes: { [type: string]: string } = { - property: 'defaultValue', - port: 'defaultValue', - slot: 'value', - constraint: 'specification', - }; - - public addValueTypes: { [primitiveType: string]: string } = { - string: 'LiteralString', - boolean: 'LiteralBoolean', - integer: 'LiteralInteger', - real: 'LiteralReal', - }; - - private taggedValue: string = 'value'; - static $inject = ['$q', 'ApiService', 'ElementService']; - - constructor(private $q: VeQService, private apiSvc: ApiService, private elementSvc: ElementService) {} - public addValue = (editOb: EditObject, type: string): LiteralObject => { - const edit = editOb.element; - let newValueSpec: ValueSpec; - let elementOb: LiteralObject = { - id: '', - _projectId: edit._projectId, - _refId: edit._refId, - type: '', - }; - switch (type) { - case 'LiteralBoolean': { - elementOb = Object.assign(elementOb, { - type: type, - value: false, - id: this.apiSvc.createUniqueId(), - ownerId: edit.id, - }); - newValueSpec = new ValueSpec(elementOb); - break; - } - case 'LiteralInteger': { - elementOb = Object.assign(elementOb, { - type: type, - value: 0, - id: this.apiSvc.createUniqueId(), - ownerId: edit.id, - }); - newValueSpec = new ValueSpec(elementOb); - break; - } - case 'LiteralString': { - elementOb = Object.assign(elementOb, { - type: type, - value: '', - id: this.apiSvc.createUniqueId(), - ownerId: edit.id, - }); - newValueSpec = new ValueSpec(elementOb); - break; - } - case 'LiteralReal': { - elementOb = Object.assign(elementOb, { - type: type, - value: 0.0, - id: this.apiSvc.createUniqueId(), - ownerId: edit.id, - }); - newValueSpec = new ValueSpec(elementOb); - break; - } - default: { - elementOb = Object.assign(elementOb, { - type: type, - value: {}, - id: this.apiSvc.createUniqueId(), - ownerId: edit.id, - }); - } - } - - if (edit.type == 'Property' || edit.type == 'Port') { - edit.defaultValue = newValueSpec; - } - return newValueSpec; - }; - - public addEnumerationValue = ( - propertySpec: PropertySpec, - editOb: EditObject - ): InstanceValueObject | ElementValueObject => { - const elementOb = editOb.element; - let newValueSpec: InstanceValueObject | ElementValueObject = new ValueSpec({ - type: 'InstanceValue', - instanceId: propertySpec.options[0], - _projectId: elementOb._projectId, - _refId: elementOb._refId, - id: this.apiSvc.createUniqueId(), - ownerId: elementOb.id, - }); - if (propertySpec.isTaggedValue) { - newValueSpec = new ValueSpec({ - type: 'ElementValue', - elementId: propertySpec.options[0], - _projectId: elementOb._projectId, - _refId: elementOb._refId, - id: this.apiSvc.createUniqueId(), - ownerId: elementOb.id, - }); - } - return newValueSpec; - }; - - public getValues(elementOb: ElementObject): ValueObject[] { - if (elementOb.type === 'Property' || elementOb.type === 'Port') { - if (elementOb.defaultValue) { - return [elementOb.defaultValue] as ValueObject[]; - } else { - return []; - } - } - if (elementOb.type === 'Slot') { - return (elementOb as SlotObject).value; - } - if (elementOb.type === 'Constraint' && elementOb.specification) { - return [(elementOb as ConstraintObject).specification]; - } - if (elementOb.type === 'Expression') { - return (elementOb as ExpressionObject).operand; - } - const i = elementOb.type.indexOf('TaggedValue'); - if (i > 0) { - let spoofType = ''; - const type = elementOb.type.slice(0, i); - if (type === 'Element') { - spoofType = 'ElementValue'; - elementOb.value = []; - for (const [index, val] of (elementOb as ElementTaggedValueObject).valueIds.entries()) { - (elementOb as ElementTaggedValueObject).value.push({ - id: `${elementOb.id}-slotvalue-${index}-elementvalue`, - type: spoofType, - elementId: val, - _projectId: elementOb._projectId, - _refId: elementOb._refId, - } as ElementValueObject); - } - } else { - spoofType = `Literal${type}`; - for (const val of (elementOb as TaggedValueObject).value) { - val.type = spoofType; - } - } - return (elementOb as TaggedValueObject).value; - } - } - - /** - * @name Utils#isEnumeration - * Check if element is enumeration and if true get enumerable options - * - * @param {object} elementOb element object - * @return {Promise} promise would be resolved with options and if object is enumerable. - * For unsuccessful saves, it will be rejected with an object with reason. - */ - public isEnumeration(elementOb: ElementObject): VePromise { - const deferred = this.$q.defer(); - if (elementOb.type === 'Enumeration') { - const isEnumeration = true; - const reqOb: ElementsRequest = { - elementId: elementOb.id, - projectId: elementOb._projectId, - refId: elementOb._refId, - }; - const query = { - params: { - ownerId: elementOb.id, - }, - }; - this.elementSvc.search(reqOb, query).then( - (val) => { - const newArray: ElementObject[] = []; - // Filter for enumeration type - for (let i = 0; i < val.elements.length; i++) { - if (val.elements[i].type === 'EnumerationLiteral') { - newArray.push(val.elements[i]); - } - } - newArray.sort((a, b) => { - return a.name.localeCompare(b.name); - }); - deferred.resolve({ - options: newArray, - isEnumeration: isEnumeration, - }); - }, - (reason) => { - deferred.reject(reason); - } - ); - } else { - deferred.resolve({ options: [], isEnumeration: false }); - } - return deferred.promise; - } - - public isValue(elementOb: ElementObject): boolean { - const type = elementOb.type; - return Object.keys(this.valueTypes).includes(type.toLowerCase()) || this.isTaggedValue(elementOb); - } - - public isTaggedValue(elementOb: ElementObject): boolean { - return elementOb.type.endsWith('TaggedValue'); - } - - public hasValue(elementOb: ElementObject): boolean { - return ( - this.isValue(elementOb) && - // Check if Property/Port have defaultValues that are not just empty - ((elementOb.defaultValue && Object.keys(elementOb.defaultValue).length !== 0) || - // Check if Constraints have specifications that are not just empty - (elementOb.specification && Object.keys((elementOb as ConstraintObject).specification).length !== 0) || - // Check if Slots and Tagged Values have any entries - (elementOb.value && (elementOb as LiteralObject[]>).value.length > 0)) - ); - } - - public isEqual(a: ElementObject, b: ElementObject): boolean { - if (this.valueTypes[a.type.toLowerCase()]) { - return _.isEqual(a[this.valueTypes[a.type.toLowerCase()]], b[this.valueTypes[a.type.toLowerCase()]]); - } else if (this.isTaggedValue(a)) { - return _.isEqual(a[this.taggedValue], b[this.taggedValue]); - } - } - - public getPropertySpec(elementOb: ElementObject): VePromise { - const deferred = this.$q.defer(); - let id: string = elementOb.typeId; - let isSlot = false; - let isEnumeration = false; - let isTaggedValue = false; - let options: ElementObject[] = []; - if (elementOb.type === 'Slot') { - isSlot = true; - id = (elementOb as SlotObject).definingFeatureId; - } - if (elementOb.type.includes('TaggedValue')) { - isTaggedValue = true; - id = (elementOb as TaggedValueObject).tagDefinitionId; - } - if (!id) { - //no property type, will not be enum - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - return deferred.promise; - } - // Get defining feature or type info - const reqOb = { - elementId: id, - projectId: elementOb._projectId, - refId: elementOb._refId, - }; - this.elementSvc.getElement(reqOb).then( - (value) => { - if (isSlot || isTaggedValue) { - if (!value.typeId) { - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - return; - } - //if it is a slot or tagged value check if the definition type is enumeration - reqOb.elementId = value.typeId; - this.elementSvc.getElement(reqOb).then( - (val) => { - this.isEnumeration(val).then( - (enumValue: PropertySpec) => { - if (enumValue.isEnumeration) { - isEnumeration = enumValue.isEnumeration; - options = enumValue.options; - } - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - }, - () => { - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - } - ); - }, - () => { - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - } - ); - } else { - this.isEnumeration(value).then( - (enumValue) => { - if (enumValue.isEnumeration) { - isEnumeration = enumValue.isEnumeration; - options = enumValue.options; - } - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - }, - (reason) => { - deferred.reject(reason); - } - ); - } - }, - (reason) => { - deferred.resolve({ options, isEnumeration, isSlot, isTaggedValue }); - } - ); - return deferred.promise; - } -} - -veUtils.service('ValueService', ValueService); diff --git a/src/ve-utils/mms-api-client/View.service.ts b/src/ve-utils/mms-api-client/View.service.ts deleted file mode 100644 index 931db9dcd..000000000 --- a/src/ve-utils/mms-api-client/View.service.ts +++ /dev/null @@ -1,1590 +0,0 @@ -import { IQResolveReject } from 'angular'; -import _ from 'lodash'; - -import { CacheService } from '@ve-utils/core'; -import { ElementService, URLService, ApiService } from '@ve-utils/mms-api-client'; -import { BaseApiService } from '@ve-utils/mms-api-client/Base.service'; -import { SchemaService } from '@ve-utils/model-schema'; -import { Class, Expression, InstanceSpec, Package, ValueSpec } from '@ve-utils/utils'; - -import { veUtils } from '@ve-utils'; - -import { VePromise, VePromiseReason, VePromisesResponse, VeQService } from '@ve-types/angular'; -import { - DocumentObject, - ElementObject, - ElementsRequest, - ExpressionObject, - GroupObject, - InstanceSpecObject, - InstanceValueObject, - LiteralObject, - PackageObject, - PresentationInstanceObject, - RequestObject, - SearchResponse, - SlotObject, - PresentTableObject, - ValueObject, - ViewCreationRequest, - ViewInstanceSpec, - ViewObject, - ViewsRequest, - PresentTextObject, - PresentationReference, - ElementsResponse, - GenericResponse, - BasicResponse, -} from '@ve-types/mms'; -import { TreeBranch, View2NodeMap } from '@ve-types/tree'; - -export interface ViewData { - id: string; - api: ViewApi; - number?: string; - topLevel?: boolean; - first?: boolean; - data?: ViewObject; -} - -export interface ViewApi { - elementClicked(elementOb: ElementObject): void; - elementTranscluded(elementOb: ElementObject, type: string): void; -} - -export interface DocumentMetadata { - numberingDepth: number; - numberingSeparator: string; - 'top-left'?: string; - top?: string; - 'top-right'?: string; - 'bottom-left'?: string; - bottom?: string; - 'bottom-right'?: string; -} - -/** - * @ngdoc service - * @name veUtils/ViewService - * @requires $q - * @requires $http - * @requires URLService - * @requires ElementService - * @requires UtilsService - * @requires CacheService - * @requires _ - * * Similar to the ElementService and proxies a lot of functions to it, this provides - * CRUD for views and products/documents/group - * - */ -export class ViewService extends BaseApiService { - private schema: string = 'cameo'; - - static $inject = ['$q', '$http', 'URLService', 'ElementService', 'ApiService', 'CacheService', 'SchemaService']; - constructor( - private $q: VeQService, - private $http: angular.IHttpService, - private uRLSvc: URLService, - private elementSvc: ElementService, - private apiSvc: ApiService, - private cacheSvc: CacheService, - private schemaSvc: SchemaService - ) { - super(); - } - - /** - * @name ViewService#downgradeDocument - * Demote document to a view and update the applied stereotype instance - * - * @param {Object} elementOb A document object - * @returns {Promise} The promise will be resolved with the downgraded view - */ - public downgradeDocument(elementOb: ViewObject): VePromise> { - return new this.$q>((resolve, reject) => { - const clone = _.cloneDeep(elementOb); - clone.appliedStereotypeIds = [this.schemaSvc.getSchema('VIEW_SID', this.schema)]; - this.elementSvc.updateElements([clone], false).then( - (data) => { - const cacheKey = ['documents', elementOb._projectId, elementOb._refId]; - let index = -1; - const projectDocs: ViewObject[] = this.cacheSvc.get(cacheKey); - if (projectDocs) { - for (let i = 0; i < projectDocs.length; i++) { - if (projectDocs[i].id === elementOb.id) { - index = i; - break; - } - } - if (index >= 0) { - projectDocs.splice(index, 1); - } - } - return resolve( - data.filter((returnOb) => { - return returnOb.id === elementOb.id; - })[0] - ); - }, - (reason) => { - return reject(reason); - } - ); - }); - } - - public getAllViews(reqOb: RequestObject, update?: boolean): VePromise { - const key = this.apiSvc.makeCacheKey(reqOb, '', false, 'views'); - const inProgKey = key.join('-'); - if (!this._isInProgress(inProgKey)) { - this._addInProgress( - inProgKey, - new this.$q((resolve, reject) => { - const cached = this.cacheSvc.get(key); - if (cached && !update) { - resolve(cached); - this._removeInProgress(inProgKey); - } else { - const searchTerms: VePromise, SearchResponse>[] = []; - const stereoIds = [ - this.schemaSvc.getSchema('VIEW_SID', this.schema), - this.schemaSvc.getSchema('DOCUMENT_SID', this.schema), - ...this.schemaSvc.getSchema('OTHER_VIEW_SID', this.schema), - ]; - stereoIds.forEach((stId) => { - searchTerms.push( - this.elementSvc.search(reqOb, { - params: { appliedStereotypeIds: stId }, - }) - ); - }); - this.$q - .all(searchTerms) - .then( - (results) => { - let viewKeys = {}; - - results.forEach((result) => { - viewKeys = _(viewKeys).merge(_.keyBy(result.elements, 'id')); - }); - const views = _(viewKeys).values().value() as ViewObject[]; - resolve(this.cacheSvc.put(key, views)); - }, - (reason: VePromiseReason>) => { - reject(reason); - } - ) - .finally(() => { - this._removeInProgress(inProgKey); - }); - } - }) - ); - } - return this._getInProgress(inProgKey) as VePromise; - } - - /** - * @name ViewService#getViewElements - * Gets the element objects for elements allowed in this view. The references are - * the same as ones gotten from this.elementSvc. - * - * @param {object} reqOb see description at this.elementSvc.getElement, where elementId is id of the view - * @param {integer} weight the priority of the request - * @param {boolean} [update=false] (optional) whether to always get the latest - * from server, even if it's already in cache (this will update everywhere - * it's displayed, except for the editables) - * @returns {Promise} The promise will be resolved with array of element objects. - */ - public getViewElements( - reqOb: ElementsRequest, - weight: number, - update?: boolean - ): VePromise { - this.apiSvc.normalize(reqOb); - const key = this.apiSvc.makeCacheKey(reqOb, reqOb.elementId, false, 'viewElements').join('-'); - if (this._isInProgress(key)) { - return this._getInProgress(key) as VePromise; - } - const cached = this.cacheSvc.get(key); - if (cached && !update) { - return this.$q.resolve(cached); - } - this._addInProgress( - key, - new this.$q((resolve, reject) => { - this.elementSvc.getElement(reqOb, weight, update).then( - (viewOrInstance: ViewObject | ViewInstanceSpec) => { - const toGet: string[] = []; - let results: ElementObject[] = []; - if (viewOrInstance.type === 'Class') { - const view: ViewObject = viewOrInstance as ViewObject; - if (view._displayedElementIds) { - const displayed: string[] = view._displayedElementIds; - if (Array.isArray(displayed) && displayed.length > 0) { - toGet.push(...displayed); - } - } - if (view._contents && view._contents.operand) { - const contents = view._contents.operand; - for (let i = 0; i < contents.length; i++) { - if (contents[i] && contents[i].instanceId) { - toGet.push(contents[i].instanceId); - } - } - } - } else if (viewOrInstance.type === 'InstanceSpecification') { - const view = viewOrInstance as ViewInstanceSpec; - if (view.specification) { - if (view.specification.operand) { - const specContents = view.specification.operand as InstanceValueObject[]; - for (let j = 0; j < specContents.length; j++) { - if (specContents[j] && specContents[j].instanceId) { - toGet.push(specContents[j].instanceId); - } - } - } - if ( - this.isTable(view) && - view.specification && - view.specification.value && - typeof view.specification.value === 'string' - ) { - const tableJson: PresentTableObject = JSON.parse( - view.specification.value - ) as PresentTableObject; - if (tableJson.body) { - toGet.push(...this.collectTableSources(tableJson)); - } - } - } - } - - const toGetReqOb: ElementsRequest = Object.assign(reqOb, { elementId: toGet }); - this.elementSvc - .getElements(toGetReqOb, weight, update) - .then((data) => { - results = data; - }) - .finally(() => { - this.cacheSvc.put(key, results); - this._removeInProgress(key); - resolve(results); - }); - }, - (reason) => { - this._removeInProgress(key); - reject(reason); - } - ); - }) - ); - return this._getInProgress(key) as VePromise; - } - - public collectTableSources(table: PresentTableObject): string[] { - const sources: string[] = []; - const body = table.body; - body.forEach((row) => { - row.forEach((cell) => { - cell.content.forEach((thing) => { - if (thing.type === 'Table' && thing.body) { - sources.push(...this.collectTableSources(thing as PresentTableObject)); - } else if (thing.type === 'Paragraph' && thing.source) { - sources.push((thing as PresentTextObject).source); - } - }); - }); - }); - return sources; - } - - /** - * @name veUtils/ViewService#handleChildViews - * process the various views in the tree to produce a map of child views in order to populate the data for the - * view tree - * - * @returns {Promise} The promise will be resolved with the new group object. - * @param v - * @param aggr - * @param propId - * @param projectId - * @param refId - * @param viewIdMap - * @param curItemFunc - * @param childrenFunc - * @param seen - */ - public handleChildViews( - v: ViewObject, - aggr: string, - propId: string | undefined, - projectId: string, - refId: string, - viewIdMap: View2NodeMap, - curItemFunc: (v: ViewObject, aggr: string, propId?: string) => TreeBranch | string[], - childrenFunc?: ( - currItem: TreeBranch | string[], - childNodes: (string[] | TreeBranch)[], - reject: IQResolveReject> - ) => void, - seen?: { [key: string]: ViewObject } - ): VePromise { - let seenViews = seen; - if (!seenViews) seenViews = {}; - return new this.$q((resolve, reject) => { - const curItem: TreeBranch | string[] = curItemFunc(v, aggr, propId); - seenViews[v.id] = v; - const childIds: string[] = []; - const childAggrs: string[] = []; - const childPropIds: string[] = []; - if (!v._childViews || v._childViews.length === 0 || aggr === 'none') { - if (!Array.isArray(curItem) && curItem.loading) { - curItem.loading = false; - } - resolve(curItem); - return; - } - for (let i = 0; i < v._childViews.length; i++) { - if (seenViews[v._childViews[i].id]) continue; - childIds.push(v._childViews[i].id); - childAggrs.push(v._childViews[i].aggregation); - childPropIds.push(v._childViews[i].propertyId); - } - this.elementSvc - .getElements( - { - elementId: childIds, - projectId: projectId, - refId: refId, - }, - 2 - ) - .then((childViews: ViewObject[]) => { - const mapping: { [id: string]: ViewObject } = {}; - for (let i = 0; i < childViews.length; i++) { - mapping[childViews[i].id] = childViews[i]; - } - const childPromises: VePromise[] = []; - const childNodes: (string[] | TreeBranch)[] = []; - const processedChildViews: ViewObject[] = []; - for (let i = 0; i < childIds.length; i++) { - const child = mapping[childIds[i]]; - if (child && this.apiSvc.isView(child)) { - //what if not found?? - childPromises.push( - this.handleChildViews( - child, - childAggrs[i], - childPropIds[i], - projectId, - refId, - viewIdMap, - curItemFunc, - childrenFunc, - seenViews - ) - ); - childNodes.push(curItemFunc(child, childAggrs[i], childPropIds[i])); - processedChildViews.push({ - id: child.id, - _projectId: child._projectId, - _refId: child._refId, - aggregation: childAggrs[i], - propertyId: childPropIds[i], - }); - } - } - v._childViews = processedChildViews; - if (childrenFunc) { - childrenFunc(curItem, childNodes, reject); - } - this.$q.all(childPromises).then(() => { - resolve(curItem); - }, reject); - }, reject); - }); - } - - /** - * @name ViewService#addViewToParentView - * This updates a document to include a new view, the new view must be a child - * of an existing view in the document - * - * @param {object} reqOb see Element.getElement for description, use parentViewId - * and viewId instead of elementId, add 'aggr' key - * @returns {Promise} The promise would be resolved with updated parent view object - */ - public addViewToParentView(reqOb: ViewCreationRequest): VePromise { - this.apiSvc.normalize(reqOb); - return new this.$q((resolve, reject) => { - this.elementSvc - .getElement( - { - projectId: reqOb.projectId, - refId: reqOb.refId, - elementId: reqOb.parentViewId, - }, - 2 - ) - .then( - (data: ViewObject) => { - const clone: ViewObject = { - _projectId: data._projectId, - _refId: data._refId, - //_modified: data._modified, - id: data.id, - _childViews: [], - type: data.type, - }; - clone._childViews = []; - if (data._childViews) { - clone._childViews.push(..._.cloneDeep(data._childViews)); - } - clone._childViews.push({ - id: reqOb.viewId, - aggregation: reqOb.aggr, - _projectId: data._projectId, - _refId: data._refId, - type: data.type, - }); - this.elementSvc.updateElement(clone, true).then( - (data2) => { - resolve(data2); - }, - (reason) => { - reject(reason); - } - ); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#removeViewFromParentView - * This removes the specified view from the parent view - * - * @param {ViewsRequest} reqOb see this.elementSvc.getElement, use viewId and parentViewId - * @returns {IPromise} The promise would be resolved with updated parent View object - */ - public removeViewFromParentView(reqOb: ViewsRequest): VePromise { - this.apiSvc.normalize(reqOb); - return new this.$q((resolve, reject) => { - this.elementSvc - .getElement( - { - projectId: reqOb.projectId, - refId: reqOb.refId, - elementId: reqOb.parentViewId, - }, - 2 - ) - .then( - (data: ViewObject) => { - if (data._childViews) { - const clone = { - _projectId: data._projectId, - _refId: data._refId, - //_modified: data._modified, - //_read: data._read, - id: data.id, - type: data.type, - _childViews: _.cloneDeep(data._childViews), - }; - for (let i = 0; i < clone._childViews.length; i++) { - if (clone._childViews[i].id === reqOb.viewId) { - clone._childViews.splice(i, 1); - break; - } - } - this.elementSvc.updateElement(clone, true).then( - (data2) => { - resolve(data2); - }, - (reason) => { - reject(reason); - } - ); - } else { - resolve(data); - } - }, - (reason) => { - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#insertToViewOrSection - * This updates a view or section to include a new element, the new element must be a child - * of an existing element in the view - * - * @param {ViewsRequest} reqOb see this.elementSvc.getElement for description, elementId is the view - * or section instance element id - * @param {InstanceValueObject} instanceValOb the instanceValue object to add - * @param {number} addPeIndex the index of where to add view or section (instance spec) object - * @returns {IPromise} The promise would be resolved with updated view or section object - */ - - public insertToViewOrSection( - reqOb: ViewCreationRequest, - instanceValOb: InstanceValueObject, - addPeIndex: number - ): VePromise { - this.apiSvc.normalize(reqOb); - return new this.$q((resolve, reject) => { - this.elementSvc - .getElement( - { - projectId: reqOb.projectId, - refId: reqOb.refId, - elementId: reqOb.viewId, - }, - 2 - ) - .then( - (data) => { - const clone: ElementObject = { - _projectId: data._projectId, - _refId: data._refId, - type: data.type, - id: data.id, - }; - let key = '_contents'; - if (this.isSection(data)) { - key = 'specification'; - } - const keyValue: ValueObject = data[key] as ValueObject; - let cloneValue: ValueObject; - if (keyValue) { - cloneValue = _.cloneDeep(keyValue); - if (!cloneValue.id || !cloneValue.ownerId) { - cloneValue.id = this.isSection(data) - ? this.apiSvc.createUniqueId() - : data.id + '_vc_expression'; - cloneValue.ownerId = this.isSection(data) ? data.id : data.id + '_vc'; - } - } else { - cloneValue = new Expression({ - operand: [], - type: 'Expression', - id: this.isSection(data) ? this.apiSvc.createUniqueId() : data.id + '_vc_expression', - _projectId: data._projectId, - _refId: data._refId, - ownerId: this.isSection(data) ? data.id : data.id + '_vc', - }); - } - instanceValOb.ownerId = cloneValue.id; - if (!instanceValOb.id) { - instanceValOb.id = this.apiSvc.createUniqueId(); - } - if (addPeIndex >= -1) - (cloneValue as ExpressionObject).operand.splice( - addPeIndex + 1, - 0, - new ValueSpec(instanceValOb) - ); - else { - (cloneValue as ExpressionObject).operand.push( - new ValueSpec(instanceValOb) - ); - } - - clone[key] = cloneValue; - this.elementSvc.updateElement(clone, false).then( - (data2) => { - resolve(data2); - }, - (reason) => { - reject(reason); - } - ); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#removeElementFromViewOrSection - * This removes the specified instanceVal from the contents of the View or Section - * - * @param {object} reqOb see this.elementSvc.getElement for description - * @param {object} instanceVal to remove from the View or Section - * @returns {Promise} The promise would be resolved with updated View or Section object - */ - public removeElementFromViewOrSection( - reqOb: ElementsRequest, - instanceVal?: InstanceValueObject - ): VePromise { - this.apiSvc.normalize(reqOb); - return new this.$q((resolve, reject) => { - if (instanceVal) { - this.elementSvc.getElement(reqOb, 2).then( - (data) => { - const clone = { - _projectId: data._projectId, - _refId: data._refId, - type: data.type, - //_modified: data._modified, - id: data.id, - }; - let key = '_contents'; - if (this.isSection(data)) { - key = 'specification'; - } - const keyValue = data[key] as ValueObject; - let cloneValue: ValueObject; - if (keyValue) { - cloneValue = _.cloneDeep(keyValue); - if (!cloneValue.id || !cloneValue.ownerId) { - cloneValue.id = this.isSection(data) - ? this.apiSvc.createUniqueId() - : data.id + '_vc_expression'; - cloneValue.ownerId = this.isSection(data) ? data.id : data.id + '_vc'; - } - } else { - cloneValue = new Expression({ - operand: [], - type: 'Expression', - id: this.isSection(data) ? this.apiSvc.createUniqueId() : data.id + '_vc_expression', - _projectId: data._projectId, - _refId: data._refId, - ownerId: this.isSection(data) ? data.id : data.id + '_vc', - }); - } - if (cloneValue && cloneValue.operand) { - const operands: InstanceValueObject[] = (keyValue as ExpressionObject) - .operand; - for (let i = 0; i < operands.length; i++) { - if (instanceVal.instanceId === operands[i].instanceId) { - (cloneValue as ExpressionObject).operand.splice(i, 1); - break; - } - } - } - clone[key] = cloneValue; - this.elementSvc.updateElement(clone, false).then( - (data2) => { - resolve(data2); - }, - (reason) => { - reject(reason); - } - ); - }, - (reason) => { - reject(reason); - } - ); - } - }); - } - - /** - * Adds a InstanceVal/InstanceSpecification to the contents of the View - * - * @param viewOrSectionOb - * @param {string} type The type of element that is to be created, ie 'Paragraph' - * @param {string} [name=Untitled ] (optional) InstanceSpecification name to use - * @param {number} addPeIndex the index of where to add view or section (instance spec) object - * @returns {Promise} The promise would be resolved with updated View object if addToView is true - * otherwise the created InstanceSpecification - */ - public createInstanceSpecification( - viewOrSectionOb: ViewObject, - type: string, - name: string, - addPeIndex: number - ): VePromise { - let newInstanceId = this.apiSvc.createUniqueId(); - newInstanceId = '_hidden_' + newInstanceId + '_pei'; - return new this.$q((resolve, reject) => { - const realType: string = this.schemaSvc.getValue( - 'TYPE_TO_CLASSIFIER_TYPE', - type, - this.schema, - viewOrSectionOb.id - ); - let jsonType = realType; - if (type === 'Comment' || type === 'Paragraph') jsonType = type; - const instanceSpecSpec = { - type: jsonType, - sourceType: 'reference', - source: newInstanceId, - sourceProperty: 'documentation', - }; - let instanceSpec: InstanceSpecObject = { - id: newInstanceId, - ownerId: 'view_instances_bin_' + viewOrSectionOb._projectId, - _projectId: viewOrSectionOb._projectId, - _refId: viewOrSectionOb._refId, - name: name ? name : 'Untitled ' + type, - documentation: '', - type: 'InstanceSpecification', - classifierIds: [ - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', realType, this.schema, viewOrSectionOb.id), - ], - specification: new ValueSpec({ - value: JSON.stringify(instanceSpecSpec), - type: 'LiteralString', - ownerId: newInstanceId, - id: this.apiSvc.createUniqueId(), - _projectId: viewOrSectionOb._projectId, - _refId: viewOrSectionOb._refId, - }), - appliedStereotypeIds: [], - }; - instanceSpec = new InstanceSpec(instanceSpec); - if (type === 'Section') { - //newData = newDataSInstance = null; - instanceSpec.specification = new ValueSpec({ - operand: [], - type: 'Expression', - ownerId: newInstanceId, - id: this.apiSvc.createUniqueId(), - _projectId: viewOrSectionOb._projectId, - _refId: viewOrSectionOb._refId, - }); - } - let clone: ElementObject = { - _projectId: viewOrSectionOb._projectId, - id: viewOrSectionOb.id, - _refId: viewOrSectionOb._refId, - type: viewOrSectionOb.type, - }; - let key = '_contents'; - if (this.isSection(viewOrSectionOb)) { - key = 'specification'; - } - const keyValue: ValueObject = viewOrSectionOb[key] as ValueObject; - let cloneValue: ValueObject; - if (!keyValue) { - cloneValue = new ValueSpec({ - operand: [], - type: 'Expression', - id: this.isSection(viewOrSectionOb) - ? this.apiSvc.createUniqueId() - : viewOrSectionOb.id + '_vc_expression', - _projectId: viewOrSectionOb._projectId, - _refId: viewOrSectionOb._refId, - ownerId: this.isSection(viewOrSectionOb) ? viewOrSectionOb.id : viewOrSectionOb.id + '_vc', - }); - } else { - cloneValue = _.cloneDeep(keyValue); - if (!cloneValue.id || !cloneValue.ownerId) { - cloneValue.id = this.isSection(viewOrSectionOb) - ? this.apiSvc.createUniqueId() - : viewOrSectionOb.id + '_vc_expression'; - cloneValue.ownerId = this.isSection(viewOrSectionOb) - ? viewOrSectionOb.id - : viewOrSectionOb.id + '_vc'; - } - } - if (addPeIndex >= -1) { - (cloneValue as ExpressionObject).operand.splice( - addPeIndex + 1, - 0, - new ValueSpec({ - instanceId: newInstanceId, - type: 'InstanceValue', - id: this.apiSvc.createUniqueId(), - ownerId: cloneValue.id, - _projectId: viewOrSectionOb._projectId, - _refId: viewOrSectionOb._refId, - }) - ); - } else { - (cloneValue as ExpressionObject).operand.push( - new ValueSpec({ - instanceId: newInstanceId, - type: 'InstanceValue', - id: this.apiSvc.createUniqueId(), - ownerId: cloneValue.id, - _projectId: viewOrSectionOb._projectId, - _refId: viewOrSectionOb._refId, - }) - ); - } - clone[key] = cloneValue; - clone = this.elementSvc.fillInElement(clone); - const toCreate: ElementObject[] = [instanceSpec, clone]; - /* - if (newData && newDataSInstance) { - toCreate.push(newData); - toCreate.push(newDataSInstance); - } - */ - const reqOb = { - projectId: viewOrSectionOb._projectId, - refId: viewOrSectionOb._refId, - elements: toCreate, - elementId: '', - }; - this.elementSvc.createElements(reqOb).then( - (data) => { - for (let i = 0; i < data.length; i++) { - const elem = data[i]; - if (elem.id === newInstanceId) { - resolve(elem); - return; - } - } - }, - (reason) => { - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#createView - * Create a new view, owner must be specified (parent view), id cannot be specified, - * if name isn't specified, "Untitled" will be used, a default contents with - * paragraph of the view documentation will be used. If a document is specified, - * will also add the view to the document, in this case the parent view should - * already be in the document. The new view will be added as the last child of the - * parent view. - * - * @param {ViewObject} ownerOb should contain _project and _ref, can be a parent view with _childViews - * @param {ViewObject} viewOb can specify optional viewId, viewName, viewDoc to be used when - * creating the new view, boolean isDoc indicate whether it's a document - * @param {string} peDoc optional documentation to set for pe creation - * @returns {Promise} The promise will be resolved with the new view. - */ - public createView(ownerOb: ViewObject, viewOb: ViewObject, peDoc?: string): VePromise { - return new this.$q((resolve, reject) => { - const newViewId: string = viewOb.id && viewOb.id !== '' ? viewOb.id : this.apiSvc.createUniqueId(); - const newInstanceId = '_hidden_' + this.apiSvc.createUniqueId() + '_pei'; - const untitledName = viewOb.isDoc ? 'Untitled Document' : 'Untitled View'; - const view = new Class({ - id: newViewId, - _projectId: viewOb._projectId, - _refId: viewOb._refId, - type: 'Class', - ownerId: ownerOb.id, - _allowedElements: [], - _displayedElementIds: [newViewId], - _childViews: [], - _contents: new ValueSpec({ - operand: [ - new ValueSpec({ - type: 'InstanceValue', - instanceId: newInstanceId, - _projectId: viewOb._projectId, - _refId: viewOb._refId, - id: newViewId + '_vc_expression_0', - }), - ], - type: 'Expression', - id: newViewId + '_vc_expression', - ownerId: newViewId + '_vc', - _projectId: viewOb._projectId, - _refId: viewOb._refId, - }), - name: viewOb.name ? viewOb.name : untitledName, - documentation: viewOb.documentation ? viewOb.documentation : '', - appliedStereotypeIds: [ - viewOb.isDoc - ? this.schemaSvc.getSchema('DOCUMENT_SID', this.schema) - : this.schemaSvc.getSchema('VIEW_SID', this.schema), - ], - }); - let parentView: ViewObject = { - _projectId: '', - _refId: '', - id: '', - type: 'Class', - }; - if (ownerOb && (ownerOb._childViews || this.apiSvc.isView(ownerOb))) { - parentView = Object.assign(parentView, { - _projectId: ownerOb._projectId, - _refId: ownerOb._refId, - id: ownerOb.id, - }); - parentView._childViews = []; - if (ownerOb._childViews) { - parentView._childViews.push(..._.cloneDeep(ownerOb._childViews)); - } - parentView._childViews.push({ - id: newViewId, - _projectId: ownerOb._projectId, - _refId: ownerOb._refId, - aggregation: 'composite', - type: 'Class', - }); - } - const peSpec: PresentationInstanceObject = { - type: 'Paragraph', - sourceType: 'reference', - source: newViewId, - sourceProperty: 'documentation', - }; - const pe = new InstanceSpec({ - id: newInstanceId, - _projectId: viewOb._projectId, - _refId: viewOb._refId, - ownerId: 'view_instances_bin_' + ownerOb._projectId, - name: 'View Paragraph', - documentation: peDoc ? peDoc : '', - classifierIds: [this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'ParagraphT', this.schema, viewOb.id)], - specification: new ValueSpec({ - value: JSON.stringify(peSpec), - type: 'LiteralString', - id: this.apiSvc.createUniqueId(), - ownerId: newInstanceId, - _projectId: viewOb._projectId, - _refId: viewOb._refId, - }), - appliedStereotypeIds: [], - }); - const toCreate: ElementObject[] = [pe, view]; - if (parentView.id !== '') { - const parentViewClass: ElementObject = this.elementSvc.fillInElement(parentView); - toCreate.push(parentViewClass); - } - const reqOb = { - projectId: ownerOb._projectId, - refId: ownerOb._refId, - elements: toCreate, - returnChildViews: true, - elementId: '', - }; - this.elementSvc.createElements(reqOb).then( - (data) => { - data.forEach((elem) => { - if (elem.id === newViewId) { - resolve(elem); - } - }); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#createDocument - * Create a new document, - * if name isn't specified, "Untitled" will be used, a default contents with - * paragraph of the view documentation will be used. - * - * @param {object} ownerOb see createView - * @param {object} docOb see createView - * @returns {Promise} The promise will be resolved with the new view. - */ - public createDocument(ownerOb: ViewObject, docOb: ViewObject): VePromise { - return new this.$q((resolve, reject) => { - docOb.isDoc = true; - this.createView(ownerOb, docOb).then( - (data2: DocumentObject) => { - if (ownerOb && ownerOb.id.indexOf('holding_bin') < 0) { - data2._groupId = ownerOb.id; - } - const cacheKey = ['documents', ownerOb._projectId, ownerOb._refId]; - const cachedView: ViewObject[] = this.cacheSvc.get(cacheKey, true); - if (cachedView) { - cachedView.forEach((document: DocumentObject, index) => { - if (document.id === data2.id) delete cachedView[index]; - }); - cachedView.push(data2); - } - resolve(data2); - }, - (reason) => { - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#createGroup - * create a group depending on what the user has selected: - * - if the user has not selected anything, create a group at the root level of the project - * - if the user has selected a group, create a child group - * - if the user has selected anything else, let the user know that they must select a group - * owner must be specified (parent view/document) - * id cannot be specified (automatically generated) - * if name isn't specified, "Untitled" will be used. - * - * @param {object} name group name new-doc-or-group.html - * @param {object} ownerOb parent id, projectId and refId - * @param {string} orgId parent orgId - * @returns {Promise} The promise will be resolved with the new group object. - */ - public createGroup(name: string, ownerOb: ViewObject): VePromise { - return new this.$q((resolve, reject) => { - const PACKAGE_ID = this.apiSvc.createUniqueId(); - // Our Group package element - const group: GroupObject = new Package({ - id: PACKAGE_ID, - _projectId: ownerOb._projectId, - _refId: ownerOb._refId, - name: name ? name : 'Untitled', - type: 'Package', - ownerId: ownerOb.id, - _isGroup: true, - appliedStereotypeIds: [this.schemaSvc.getSchema('GROUP_ST_ID', this.schema)], - }); - const toCreate = [group]; - const reqOb = { - projectId: ownerOb._projectId, - refId: ownerOb._refId, - elements: toCreate, - elementId: '', - }; - this.elementSvc.createElements(reqOb).then( - (data) => { - const cacheKey = ['groups', ownerOb._projectId, ownerOb._refId]; - const groupObj = _.find(data, { id: PACKAGE_ID }); - if (groupObj) { - groupObj._parentId = ownerOb.id.indexOf('holding') != -1 ? null : ownerOb.id; - if (this.cacheSvc.exists(cacheKey)) { - this.cacheSvc.get(cacheKey).push(groupObj); - } - this.cacheSvc.put(['group', groupObj.projectId, groupObj.refId, groupObj.id], groupObj, true); - resolve(groupObj); - } else { - reject({ - status: 500, - message: 'Failed to create group', - }); - } - }, - (reason) => { - console.log('POST failed:', reason); - reject(reason); - } - ); - }); - } - - /** - * @name ViewService#removeGroup - * - * @description remove a group - * - * @param {object} packageOb group to remove - * @returns {Promise} The promise will be resolved with the updated group object. - */ - public removeGroup(packageOb: GroupObject): VePromise { - return new this.$q((resolve, reject) => { - const updatedPackage: PackageObject = { - id: packageOb.id, - type: 'Package', - _projectId: packageOb._projectId, - _refId: packageOb._refId, - appliedStereotypeIds: [], - classifierIds: null, - }; - - updatedPackage._isGroup = false; - _.remove(packageOb.appliedStereotypeIds, (id: string): boolean => { - return id === this.schemaSvc.getSchema('GROUP_ST_ID', this.schema); - }); - - if (packageOb.appliedStereotypeIds.length === 0) { - updatedPackage.appliedStereotypeIds = packageOb.appliedStereotypeIds; - } - const toUpdate = [updatedPackage]; - this.elementSvc.updateElements(toUpdate, false).then( - (data) => { - // remove this group for cache - const cacheKey = ['groups', packageOb._projectId, packageOb._refId]; - const groups: ElementObject[] = this.cacheSvc.get(cacheKey, true) || []; - _.remove(groups, (group: PackageObject) => { - return group.id === packageOb.id; - }); - data.forEach((elOb: ElementObject) => { - if (elOb.id === updatedPackage.id) { - resolve(elOb); - } - }); - }, - (reason) => { - if (reason.data.failedRequests) { - reject(reason.data.failedRequests[0]); - } else { - reject({ - status: 400, - message: 'Something went wrong. Please try your action again', - }); - } - } - ); - }); - } - - /** - * @name ViewService#getProjectDocuments - * Gets all the documents in a site - * - * @param {Object} reqOb object containing project and ref ids needed to resolve request - * @param {boolean} [refresh=false] Update latest - * @param {int} weight the priority of the request - * @returns {Promise} The promise will be resolved with array of document objects - */ - public getProjectDocuments( - reqOb: ViewsRequest, - weight?: number, - refresh?: boolean - ): VePromise> { - this.apiSvc.normalize(reqOb); - const url = this.uRLSvc.getProjectDocumentsURL(reqOb); - const cacheKey = ['documents', reqOb.projectId, reqOb.refId]; - const inProgKey = cacheKey.join('-'); - if (!this._isInProgress(inProgKey)) { - this._addInProgress( - inProgKey, - new this.$q>((resolve, reject) => { - if (this.cacheSvc.exists(cacheKey) && !refresh) { - resolve(this.cacheSvc.get(cacheKey)); - this._removeInProgress(inProgKey); - } else { - if (refresh === undefined) { - refresh = false; - } - this.elementSvc - .getGenericElements(url, reqOb, 'documents', weight, refresh) - .then( - (data) => { - this.cacheSvc.put(cacheKey, data, false); - resolve(this.cacheSvc.get(cacheKey)); - }, - (reason) => { - reject(reason); - } - ) - .finally(() => { - this._removeInProgress(inProgKey); - }); - } - }) - ); - } - return this._getInProgress(inProgKey) as VePromise>; - } - - /** - * @name ViewService#getProjectDocument - * Gets a specific the document from a Site - * - * @param {object} reqOb object containing project, ref, document ids needed to resolve request - * @param {int} weight the priority of the request - * @param {boolean} refresh [default=false] refresh latest - * @returns {Promise} The promise will be resolved with array of document objects - */ - public getProjectDocument( - reqOb: ElementsRequest, - weight: number, - refresh?: boolean - ): VePromise { - const cacheKey = this.elementSvc.getRequestKey(reqOb, reqOb.elementId); - const inProgKey = cacheKey.join('-'); - if (!this._isInProgress(inProgKey)) { - this._addInProgress( - inProgKey, - new this.$q((resolve, reject) => { - const cached = this.cacheSvc.get(cacheKey); - if (cached && !refresh) { - resolve(cached); - this._removeInProgress(inProgKey); - } - this.getProjectDocuments(reqOb, weight, refresh) - .then( - (result: DocumentObject[]) => { - const documentOb = result.filter((resultOb) => { - return resultOb.id === reqOb.elementId; - })[0]; - this.cacheSvc.put(cacheKey, documentOb, true); - resolve(this.cacheSvc.get(cacheKey)); - }, - (reason) => { - reject({ message: reason.message, status: reason.status }); - } - ) - .finally(() => this._removeInProgress(inProgKey)); - }) - ); - } - return this._getInProgress(inProgKey) as VePromise; - } - - /** - * @name ViewService#getPresentationInstanceObject - * Parses an instanceSpec of the expression reference tree in the contents - * of a View, and returns the corresponding presentation element json object. - * - * @param {object} instanceSpec instance specification object - * @returns {object} The json object for the corresponding presentation element - */ - public getPresentationInstanceObject = ( - instanceSpec: InstanceSpecObject - ): PresentationInstanceObject | InstanceSpecObject => { - const instanceSpecSpec: ValueObject = instanceSpec.specification; - if (!instanceSpecSpec) { - return { - type: 'Paragraph', - sourceType: 'text', - text: '', - }; - } - const type = instanceSpecSpec.type; - - if (type === 'LiteralString') { - // If it is an Opaque List, Paragraph, Table, Image, List: - const jsonString = (instanceSpecSpec as LiteralObject).value; - return JSON.parse(jsonString) as PresentationInstanceObject; - } else if (type === 'Expression') { - // If it is a Opaque Section, or a Expression: - // If it is a Opaque Section then we want the instanceSpec: - if (this.isSection(instanceSpec)) { - return instanceSpec; - } else { - //?? - return instanceSpecSpec; - } - } - }; - - /** - * @name ViewService#getElementReferenceTree - * gets the presentation element tree as an array of tree nodes - * a tree node is this: - *
    -     {
    -            instanceId: id of the instance,
    -            instanceVal: instanceValue object,
    -            sectionElements: array of child tree nodes,
    -            instanceSpecification: instance specification object of the instance,
    -            presentationElement: json of the presentation element or a section instance spec with type = Section
    -        }
    -     * 
    - * - * @param {object} reqOb see this.elementSvc.getElement - * @param {object} contents an expression object from a view or section - * @param {int} weight the priority of the request - * @returns {Promise} The promise will be resolved with array of tree node objects - */ - public getElementReferenceTree( - reqOb: ElementsRequest, - contents: ExpressionObject, - weight?: number - ): VePromise> { - const promises: VePromise>[] = []; - for (let i = 0; i < contents.operand.length; i++) { - promises.push(this.getElementReference(reqOb, contents.operand[i], weight)); - } - return this.$q.all(promises); - } - - public getElementReference( - reqOb: ElementsRequest, - instanceVal: InstanceValueObject, - weight?: number - ): VePromise> { - return new this.$q>((resolve, reject) => { - const presentationRef: PresentationReference = { - instanceId: instanceVal.instanceId, - sectionElements: [], - instanceVal: instanceVal, - isOpaque: false, - }; - - const req = _.cloneDeep(reqOb); - req.elementId = instanceVal.instanceId; - this.elementSvc.getElement(req, weight).then( - (instanceSpecification) => { - presentationRef.instanceSpecification = instanceSpecification; - presentationRef.isOpaque = - instanceSpecification.classifierIds && - instanceSpecification.classifierIds.length > 0 && - this.schemaSvc - .getMap('OPAQUE_CLASSIFIERS', this.schema) - .indexOf(instanceSpecification.classifierIds[0]) >= 0; - presentationRef.presentationElement = this.getPresentationInstanceObject(instanceSpecification); - if (this.isSection(instanceSpecification)) { - this.getElementReferenceTree(req, instanceSpecification.specification).then( - (sectionElementReferenceTree) => { - presentationRef.sectionElements = sectionElementReferenceTree; - resolve(presentationRef); - }, - (reason) => { - reject(reason); - } - ); - } else resolve(presentationRef); - }, - (reason) => { - reject({ status: reason.status, message: reason.message }); - } - ); - }); - } - - /** - * @name ViewService#this.isSection - * Returns true if the passed InstanceSpecification is a Section - * - * @param {Object} instanceSpec A InstanceSpecification json object - * @returns {boolean} whether it's a section - */ - public isSection = (instanceSpec: ViewInstanceSpec): boolean => { - return ( - instanceSpec.classifierIds && - instanceSpec.classifierIds.length > 0 && - (instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Section', this.schema, instanceSpec.id) || - instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'SectionT', this.schema, instanceSpec.id)) - ); - }; - - public isTable = (instanceSpec: InstanceSpecObject): boolean => { - return ( - instanceSpec.classifierIds && - instanceSpec.classifierIds.length > 0 && - (instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Table', this.schema, instanceSpec.id) || - instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'TableT', this.schema, instanceSpec.id)) - ); - }; - - public isFigure = (instanceSpec: InstanceSpecObject): boolean => { - return ( - instanceSpec.classifierIds && - instanceSpec.classifierIds.length > 0 && - (instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'ImageT', this.schema, instanceSpec.id) || - instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Image', this.schema, instanceSpec.id) || - instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Figure', this.schema, instanceSpec.id) || - instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'FigureT', this.schema, instanceSpec.id)) - ); - }; - - public isEquation = (instanceSpec: InstanceSpecObject): boolean => { - return ( - instanceSpec.classifierIds && - instanceSpec.classifierIds.length > 0 && - instanceSpec.classifierIds[0] === - this.schemaSvc.getValue('TYPE_TO_CLASSIFIER_ID', 'Equation', this.schema, instanceSpec.id) - ); - }; - - public getTreeType = (instanceSpec: ViewInstanceSpec): string => { - if (this.isSection(instanceSpec)) return 'section'; - if ( - instanceSpec.specification && - instanceSpec.specification.value && - typeof instanceSpec.specification.value === 'string' && - (JSON.parse(instanceSpec.specification.value) as PresentationInstanceObject).excludeFromList - ) { - return 'none'; - } - if (this.isTable(instanceSpec)) return 'table'; - if (this.isFigure(instanceSpec)) return 'figure'; - if (this.isEquation(instanceSpec)) return 'equation'; - let result = 'none'; - if (instanceSpec.classifierIds && instanceSpec.classifierIds.length > 0) { - const peSids = this.schemaSvc.getSchema<{ - [peType: string]: string; - }>('TYPE_TO_CLASSIFIER_ID', this.schema); - - for (const peType of Object.keys(peSids)) { - if ( - instanceSpec.classifierIds && - instanceSpec.classifierIds.length > 0 && - instanceSpec.classifierIds.includes(peSids[peType]) - ) { - result = peType.toLowerCase(); - break; - } - } - } - - return result; - }; - - public processSlotStrings(values: LiteralObject[]): string[] { - const res: string[] = []; - if (!values || values.length === 0) { - return res; - } - values.forEach((value) => { - if (value.type !== 'LiteralString' || !value.value) return; - res.push(value.value as string); - }); - return res; - } - - public processSlotIntegers(values: LiteralObject[]): number[] { - const res: number[] = []; - if (!values || values.length === 0) { - return res; - } - values.forEach((value) => { - if (Number.isInteger(value.value)) { - res.push(value.value as number); - } else if (typeof value.value === 'string') { - const val = parseInt(value.value); - if (!isNaN(val)) { - res.push(val); - } - } - }); - return res; - } - - /** - * @name ViewService#getDocumentMetadata - * gets Document properties from docgen's stereotypes - * - * @param {object} reqOb see this.elementSvc.getElement - * @param {integer} weight the priority of the request - * @returns {Promise} The promise will be resolved with metadata object - * with name value pairs corresponding to document stereotype - */ - public getDocumentMetadata(reqOb: ElementsRequest, weight?: number): VePromise { - return new this.$q((resolve, reject) => { - const metadata: DocumentMetadata = { - numberingDepth: 0, - numberingSeparator: '.', - }; - const elementIds = [ - `${reqOb.elementId}_asi-slot-${this.schemaSvc.getValue('DOCUMENT_IDS', 'Header', this.schema)}`, //header - `${reqOb.elementId}_asi-slot-${this.schemaSvc.getValue('DOCUMENT_IDS', 'Footer', this.schema)}`, //footer - `${reqOb.elementId}_asi-slot-${this.schemaSvc.getValue( - 'DOCUMENT_IDS', - 'NumDepth', - this.schema - )}`, //numbering depth - `${reqOb.elementId}_asi-slot-${this.schemaSvc.getValue('DOCUMENT_IDS', 'NumSep', this.schema)}`, //numbering separator - ]; - const metaReqOb: ElementsRequest = Object.assign(reqOb, { - elementId: elementIds, - }); - this.elementSvc - .getElements(metaReqOb, weight) - .then( - (data) => { - if (data.length === 0) { - return; - } - for (let i = 0; i < data.length; i++) { - const prop = data[i]; - const feature: string = prop.definingFeatureId ? prop.definingFeatureId : null; - const value: LiteralObject[] = prop.value ? prop.value : null; - if (!feature || !value || !Array.isArray(value)) { - continue; - } - let result: string[] | number[] = []; - if (feature === this.schemaSvc.getValue('DOCUMENT_IDS', 'Header', this.schema, prop.id)) { - //header - result = this.processSlotStrings(value); - metadata.top = result.length > 0 ? result[0] : ''; - metadata['top-left'] = result.length > 1 ? result[1] : ''; - metadata['top-right'] = result.length > 2 ? result[2] : ''; - } else if ( - feature == this.schemaSvc.getValue('DOCUMENT_IDS', 'Footer', this.schema, prop.id) - ) { - //footer - result = this.processSlotStrings(value); - metadata.bottom = result.length > 0 ? result[0] : ''; - metadata['bottom-left'] = result.length > 1 ? result[1] : ''; - metadata['bottom-right'] = result.length > 2 ? result[2] : ''; - } else if ( - feature == this.schemaSvc.getValue('DOCUMENT_IDS', 'NumDepth', this.schema, prop.id) - ) { - //depth - result = this.processSlotIntegers(value); - metadata.numberingDepth = result.length > 0 ? result[0] : 0; - } else if ( - feature == this.schemaSvc.getValue('DOCUMENT_IDS', 'NumSep', this.schema, prop.id) - ) { - //separator - result = this.processSlotStrings(value); - metadata.numberingSeparator = result.length > 0 ? result[0] : '.'; - } - } - }, - () => { - /* Do nothing */ - } - ) - .finally(() => { - resolve(metadata); - }); - }); - } - - public getPresentationElementType = (instanceSpec: ViewInstanceSpec): string => { - if (instanceSpec.type === 'InstanceSpecification') { - if (this.isSection(instanceSpec)) { - return 'Section'; - } else if (this.isTable(instanceSpec)) { - return 'Table'; - } else if (this.isFigure(instanceSpec)) { - return 'Image'; - } else if (this.isEquation(instanceSpec)) { - return 'Equation'; - } else if (instanceSpec.specification && instanceSpec.specification.value) { - return ( - JSON.parse( - (instanceSpec.specification as LiteralObject).value - ) as PresentationInstanceObject - ).type; - } - } - return; - }; - - public isGroup(ob: InstanceSpecObject | GroupObject): boolean { - if (ob._isGroup) return (ob as GroupObject)._isGroup; - else { - return ( - ob.appliedStereotypeIds !== undefined && - ob.appliedStereotypeIds.length > 0 && - ob.appliedStereotypeIds[0] === this.schemaSvc.getSchema('GROUP_ST_ID', this.schema) - ); - } - } - - public getElementType = (element: ElementObject): string => { - // Get Type - let elementType = ''; - if (this.apiSvc.isRequirement(element)) { - elementType = 'Requirement'; - } else if (this.apiSvc.isDocument(element)) { - elementType = 'Document'; - } else if (this.apiSvc.isView(element)) { - elementType = 'View'; - } else if (this.isGroup(element)) { - elementType = 'Group'; - } else { - elementType = this.getPresentationElementType(element); - } - return elementType; - }; - - public reset = (): void => { - this.inProgress = {}; - }; -} - -veUtils.service('ViewService', ViewService); diff --git a/src/ve-utils/mms-api-client/index.ts b/src/ve-utils/mms-api-client/index.ts deleted file mode 100644 index 5da2df6b5..000000000 --- a/src/ve-utils/mms-api-client/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -import './Api.service'; -import './URL.service'; -import './Authorization.service'; -import './Element.service'; -import './Http.service'; -import './Permissions.service'; -import './Project.service'; -import './View.service'; -import './User.service'; -import './Value.service'; - -export * from './URL.service'; -export * from './Authorization.service'; -export * from './Element.service'; -export * from './Http.service'; -export * from './Permissions.service'; -export * from './Project.service'; -export * from './View.service'; -export * from './Api.service'; -export * from './User.service'; -export * from './Value.service'; diff --git a/src/ve-utils/modals/ve-modal.controller.ts b/src/ve-utils/modals/ve-modal.controller.ts deleted file mode 100644 index 1e140c1c5..000000000 --- a/src/ve-utils/modals/ve-modal.controller.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { VeModalResolve, VeModalController, VeModalInstanceService } from '@ve-types/view-editor'; - -export class VeModalControllerImpl implements VeModalController { - // public close($value?: any): void {}; - // - // public dismiss($value?: any): void {}; - - modalInstance: VeModalInstanceService; - protected resolve: U; -} diff --git a/src/ve-utils/model-schema/CameoSchema.service.ts b/src/ve-utils/model-schema/CameoSchema.service.ts deleted file mode 100644 index 7ee06d610..000000000 --- a/src/ve-utils/model-schema/CameoSchema.service.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { Schema, SchemaMapping } from '@ve-utils/model-schema/Schema.service'; - -import { veUtils } from '@ve-utils'; - -export class CameoSchema implements Schema { - jsonName = 'cameo'; - schema: SchemaMapping = { - VIEW_SID: '_11_5EAPbeta_be00301_1147420760998_43940_227', - OTHER_VIEW_SID: [ - '_17_0_1_407019f_1332453225141_893756_11936', - '_17_0_1_232f03dc_1325612611695_581988_21583', - '_18_0beta_9150291_1392290067481_33752_4359', - ], - DOCUMENT_SID: '_17_0_2_3_87b0275_1371477871400_792964_43374', - BLOCK_SID: '_11_5EAPbeta_be00301_1147424179914_458922_958', - REQUIREMENT_SID: [ - '_project-bundle_mission_PackageableElement-mission_u003aRequirement_PackageableElement', - '_18_0_5_f560360_1476403587924_687681_736366', - '_18_0_5_f560360_1476403587924_687681_736366', - '_11_5EAPbeta_be00301_1147873190330_159934_2220', - ], - TYPE_TO_CLASSIFIER_TYPE: { - Table: 'TableT', - Paragraph: 'ParagraphT', - Section: 'SectionT', - Comment: 'ParagraphT', - List: 'ListT', - Image: 'ImageT', - Equation: 'Equation', - TomSawyerDiagram: 'TomSawyerDiagram', - }, - TYPE_TO_CLASSIFIER_ID: { - Image: '_17_0_5_1_407019f_1430628206190_469511_11978', - List: '_17_0_5_1_407019f_1430628190151_363897_11927', - Paragraph: '_17_0_5_1_407019f_1430628197332_560980_11953', - Table: '_17_0_5_1_407019f_1430628178633_708586_11903', - Section: '_17_0_5_1_407019f_1430628211976_255218_12002', - ListT: '_17_0_5_1_407019f_1431903739087_549326_12013', - TableT: '_17_0_5_1_407019f_1431903724067_825986_11992', - ImageT: '_17_0_5_1_407019f_1431903748021_2367_12034', //manual images + timely, etc - Equation: '_17_0_5_1_407019f_1431905053808_352752_11992', - ParagraphT: '_17_0_5_1_407019f_1431903758416_800749_12055', - SectionT: '_18_0_2_407019f_1435683487667_494971_14412', - TomSawyerDiagram: '_18_5_2_8bf0285_1506035630029_725905_15942', - Figure: '_18_5_2_8bf0285_1506035630979_342273_15944', - FigureT: '_18_5_2_8bf0285_1506035630029_725905_15942', - }, - DOCUMENT_IDS: { - Header: '_17_0_1_407019f_1326234342817_186479_2256', - Footer: '_17_0_1_407019f_1326234349580_411867_2258', - NumDepth: '_18_5_3_8bf0285_1526605771405_96327_15754', - NumSep: '_18_5_3_8bf0285_1526605817077_688557_15755', - }, - GROUP_ST_ID: '_18_5_3_8bf0285_1520469040211_2821_15754', - }; - map: SchemaMapping = { - OPAQUE_CLASSIFIERS: [ - this.schema.TYPE_TO_CLASSIFIER_ID['Image'], - this.schema.TYPE_TO_CLASSIFIER_ID['List'], - this.schema.TYPE_TO_CLASSIFIER_ID['Paragraph'], - this.schema.TYPE_TO_CLASSIFIER_ID['Section'], - this.schema.TYPE_TO_CLASSIFIER_ID['Table'], - this.schema.TYPE_TO_CLASSIFIER_ID['Figure'], - ], - }; -} - -veUtils.service('CameoSchema', CameoSchema); - -// TODO: Create Cameo Project Creation Service -// { -// "elements": [ -// { -// "id": "{{projectId}}_pm", -// "type": "Model", -// "documentation": "Created Automatically by MBEE System", -// "appliedStereotypeInstanceId": "{{projectId}}_pm_asi", -// "ownerId": "{{projectId}}" -// }, -// { -// "id": "{{projectId}}_pm_asi", -// "stereotypedElementId": "{{projectId}}_pm", -// "appliedStereotypeInstanceId": null, -// "type": "InstanceSpecification", -// "ownerId": "{{projectId}}_pm", -// "slotIds": [ -// "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094" -// ], -// "classifierIds": [ -// "_17_0_2_3_407019f_1383165357327_898985_29071" -// ], -// "visibility": null, -// "documentation": "", -// "specification": null, -// "name": "" -// }, -// { -// "appliedStereotypeInstanceId": null, -// "type": "Slot", -// "ownerId": "{{projectId}}_pm_asi", -// "owningInstanceId": "{{projectId}}_pm_asi", -// "id": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094", -// "value": [ -// { -// "type": "LiteralString", -// "ownerId": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094", -// "owningSlotId": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094", -// "owningPackageId": null, -// "id": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094-slotvalue-0-literalstring", -// "supplierDependencyIds": [], -// "value": "https://cae-mms-lb.jpl.nasa.gov" -// }, -// { -// "type": "LiteralString", -// "ownerId": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094", -// "owningSlotId": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094", -// "id": "{{projectId}}_pm_asi-slot-_17_0_2_3_407019f_1383165366792_59388_29094-slotvalue-1-literalstring", -// "supplierDependencyIds": [], -// "value": "http://localhost:8080" -// } -// ], -// "definingFeatureId": "_17_0_2_3_407019f_1383165366792_59388_29094" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-4b2e0639-8830-47bd-b0fc-91b3aabb5e45_pm", -// "mountedElementProjectId": "PROJECT-4b2e0639-8830-47bd-b0fc-91b3aabb5e45", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-72379b04-6dc6-43b6-8e2b-e79a5a6de142_pm", -// "mountedElementProjectId": "PROJECT-72379b04-6dc6-43b6-8e2b-e79a5a6de142", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-275116e7-5669-4796-8d65-3c2c8c8d3f9e_pm", -// "mountedElementProjectId": "PROJECT-275116e7-5669-4796-8d65-3c2c8c8d3f9e", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-44892a3bf693c0a47eb2f3bf10930f_pm", -// "mountedElementProjectId": "PROJECT-44892a3bf693c0a47eb2f3bf10930f", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-9b4d2b1641e6203934d95e7bde5fe08_pm", -// "mountedElementProjectId": "PROJECT-9b4d2b1641e6203934d95e7bde5fe08", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-ID_5_9_12_2_36_25_PM__3355cc91_137159f37b3__5c3b_sscae_cmr_137_78_160_100_pm", -// "mountedElementProjectId": "PROJECT-ID_5_9_12_2_36_25_PM__3355cc91_137159f37b3__5c3b_sscae_cmr_137_78_160_100", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-595f5a46-4bbd-4126-86a6-ec01f155cb67_pm", -// "mountedElementProjectId": "PROJECT-595f5a46-4bbd-4126-86a6-ec01f155cb67", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-b818821ad5fb9956e13d5fa929369fcb_pm", -// "mountedElementProjectId": "PROJECT-b818821ad5fb9956e13d5fa929369fcb", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "_12_0EAPbeta_be00301_1156851270584_552173_1" -// }, -// { -// "twcVersion": -1, -// "mountedElementId": "PROJECT-877558e9224f114d50dea1f39a1c119_pm", -// "mountedElementProjectId": "PROJECT-877558e9224f114d50dea1f39a1c119", -// "type": "Mount", -// "mountedRefId": "master", -// "ownerId": "{{projectId}}_pm" -// } -// ] -// } diff --git a/src/ve-utils/model-schema/JupyterSchema.service.ts b/src/ve-utils/model-schema/JupyterSchema.service.ts deleted file mode 100644 index 7dfe4e420..000000000 --- a/src/ve-utils/model-schema/JupyterSchema.service.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Schema, SchemaMapping } from '@ve-utils/model-schema/Schema.service'; - -import { veUtils } from '@ve-utils'; - -export class JupyterSchema implements Schema { - static $inject = []; - - jsonName: string = 'jupyter'; - schema: SchemaMapping = {}; -} - -veUtils.service('JupyterSchema', JupyterSchema); diff --git a/src/ve-utils/model-schema/Schema.service.ts b/src/ve-utils/model-schema/Schema.service.ts deleted file mode 100644 index 97826883d..000000000 --- a/src/ve-utils/model-schema/Schema.service.ts +++ /dev/null @@ -1,112 +0,0 @@ -import { veUtils } from '@ve-utils'; - -import { VeConfig } from '@ve-types/config'; - -export interface SchemaMapping { - [key: string]: unknown; -} - -export interface Schema { - jsonName: string; - schema: SchemaMapping; - map?: SchemaMapping; -} - -export class SchemaService { - static $inject = ['$q', '$injector']; - - public veConfig: VeConfig = window.__env; - public defaultSchema: 'cameo'; - public schemaList: { [key: string]: string } = { - cameo: 'CameoSchema', - jupyter: 'JupyterSchema', - }; - - public schemas: { [key: string]: Schema } = {}; - - constructor(private $q, private $injector: angular.auto.IInjectorService) { - for (const [key, value] of Object.entries(this.schemaList)) { - this.schemas[key] = this.$injector.get(value); - } - } - - getSchema = (name: string, schemaName?: string, sourceId?: string): T => { - const schema: Schema = this._getSchema(schemaName, sourceId); - if (schema.schema[name]) { - return schema.schema[name] as T; - } else { - this._schemaError(name, schemaName); - } - }; - - getValue = (name: string, key: string, schemaName?: string, sourceId?: string): T => { - const lookup = this.getSchema(name, schemaName, sourceId); - if (lookup && typeof lookup === 'object') { - return lookup[key] as T; - } - }; - - getValues(name: string, keys: string[], schemaName?: string, sourceId?: string): T[] | null { - const lookup = this.getSchema(name, schemaName, sourceId); - if (lookup && typeof lookup === 'object') { - const response: T[] = []; - keys.forEach((key) => { - if (lookup.hasOwnProperty(key)) { - response.push(lookup[key] as T); - } - }); - return response; - } - } - - getMap = (name: string, schemaName?: string, sourceId?: string): T => { - const schema: Schema = this._getSchema(schemaName, sourceId); - if (schema.map && schema.map[name]) { - return schema.map[name] as T; - } else { - this._schemaError(name, schemaName); - return null; - } - }; - - getMappedValue = (name: string, key: string, schemaName?: string, sourceId?: string): T => { - const lookup = this.getMap(name, schemaName, sourceId); - if (lookup && typeof lookup === 'object') { - return lookup[key] as T; - } - }; - - getKeyByValue = (name: string, value: T, schemaName?: string, sourceId?: string): string => { - const lookup = this.getSchema(name, schemaName, sourceId); - if (lookup && typeof lookup === 'object') { - let response = ''; - Object.keys(lookup).some((key) => { - if (lookup[key] === value) { - response = key; - return true; - } - return false; - }); - return response; - } - }; - - private _schemaError = (name: string, schemaName?: string): void => { - schemaName = schemaName ? schemaName : this.defaultSchema; - if (this.veConfig.enableDebug) { - console.log(schemaName + ' does not have table' + name + 'or it is not properly configured'); - } - }; - - private _getSchema = (schemaName?: string, id?: string): Schema | null => { - schemaName = schemaName ? schemaName : this.defaultSchema; - id = id ? id : 'error: unknown'; - if (this.schemas.hasOwnProperty(schemaName)) { - return this.schemas[schemaName]; - } else { - console.log(`Object ${id} uses an unknown schema ${schemaName}`); - } - }; -} - -veUtils.service('SchemaService', SchemaService); diff --git a/src/ve-utils/model-schema/index.ts b/src/ve-utils/model-schema/index.ts deleted file mode 100644 index c17dcefdc..000000000 --- a/src/ve-utils/model-schema/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import './CameoSchema.service'; -import './JupyterSchema.service'; -import './Schema.service'; - -export * from './CameoSchema.service'; -export * from './JupyterSchema.service'; -export * from './Schema.service'; diff --git a/src/ve-utils/third-party/index.ts b/src/ve-utils/third-party/index.ts deleted file mode 100644 index 8b138df6a..000000000 --- a/src/ve-utils/third-party/index.ts +++ /dev/null @@ -1 +0,0 @@ -import './jquery'; diff --git a/src/ve-utils/third-party/jquery/index.ts b/src/ve-utils/third-party/jquery/index.ts deleted file mode 100644 index 9c558addc..000000000 --- a/src/ve-utils/third-party/jquery/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -import './isOnScreen.jquery'; -import './table2CSV.jquery'; diff --git a/src/ve-utils/third-party/jquery/isOnScreen.jquery.ts b/src/ve-utils/third-party/jquery/isOnScreen.jquery.ts deleted file mode 100644 index d2eba58d2..000000000 --- a/src/ve-utils/third-party/jquery/isOnScreen.jquery.ts +++ /dev/null @@ -1,51 +0,0 @@ -import jQuery from 'jquery'; - -jQuery.fn.isOnScreen = (x?, y?): boolean => { - if (x == null || typeof x == 'undefined') x = 1; - if (y == null || typeof y == 'undefined') y = 1; - - const win = $(window); - - const viewport = { - top: win.scrollTop(), - left: win.scrollLeft(), - right: win.scrollLeft() + win.width(), - bottom: win.scrollTop() + win.height(), - }; - - const height = jQuery.fn.outerHeight(); - const width = jQuery.fn.outerWidth(); - - if (!width || !height) { - return false; - } - - const bounds: { - right?: number; - left: number; - bottom?: number; - top: number; - } = jQuery.fn.offset(); - bounds.right = bounds.left + width; - bounds.bottom = bounds.top + height; - - const visible = !( - viewport.right < bounds.left || - viewport.left > bounds.right || - viewport.bottom < bounds.top || - viewport.top > bounds.bottom - ); - - if (!visible) { - return false; - } - - const deltas = { - top: Math.min(1, (bounds.bottom - viewport.top) / height), - bottom: Math.min(1, (viewport.bottom - bounds.top) / height), - left: Math.min(1, (bounds.right - viewport.left) / width), - right: Math.min(1, (viewport.right - bounds.left) / width), - }; - - return deltas.left * deltas.right >= x && deltas.top * deltas.bottom >= y; -}; diff --git a/src/ve-utils/third-party/jquery/table2CSV.jquery.ts b/src/ve-utils/third-party/jquery/table2CSV.jquery.ts deleted file mode 100644 index 3cda1b948..000000000 --- a/src/ve-utils/third-party/jquery/table2CSV.jquery.ts +++ /dev/null @@ -1,118 +0,0 @@ -import jQuery from 'jquery'; - -jQuery.fn.table2CSV = (inputOptions: JQuery.table2CSV.inputOptions): string => { - const options = jQuery.extend( - { - separator: ',', - header: [], - delivery: 'popup', // popup, value - }, - inputOptions - ); - - const csvData: string[] = []; - // const el = this - const row2CSV = (tmpRow: string[]): void => { - const tmp = tmpRow.join(''); // to remove any blank rows - if (tmpRow.length > 0 && tmp != '') { - csvData[csvData.length] = tmpRow.join(options.separator); - } - }; - const formatData = (input: string): string => { - // replace " with “ - const regexp = new RegExp(/["]/g); - let output = input.replace(regexp, '“'); - //HTML - // var regexp = new RegExp(/\<[^\<]+\>/g); - // var output = output.replace(regexp, ""); - const i = output.search(/\S/); //index of first non whitespace char - if (i > 0) { - output = '_'.repeat(i) + $.trim(output); - } - output = $.trim(output); - if (output == '') return ''; - if (output[0] == '+' || output[0] == '=' || output[0] == '-') { - output = ' ' + output; - } - return `"${output}"`; - }; - const popup = (data: string): string => { - const generator = window.open('', 'csv', 'height=400,width=600'); - generator.document.write('CSV'); - generator.document.write(''); - generator.document.write(''); - generator.document.write(''); - generator.document.close(); - return 'ok'; - }; - const handleMatrix = (bodyTag: string, cellTag: string): void => { - const spanData: { [row: number]: { [column: number]: unknown } } = {}; //if spanData[curRow][curCol] is true that means that 'cell' should be "" due to merged cell - let curRow = 0; - $(this) - .children(bodyTag) - .children('tr') - .each((index, element) => { - tmpRow = []; - let curCol = 0; - $(element) - .children(cellTag) - .each((index, element) => { - while (spanData[curRow] && spanData[curRow][curCol]) { - tmpRow.push('""'); - curCol++; - } - tmpRow.push(formatData($(element).text())); - const rowstring = $(element).attr('rowspan'); - const rowspan = parseInt(rowstring); - if (rowspan && rowspan > 1) { - for (let i = 1; i < rowspan; i++) { - if (!spanData[curRow + i]) { - spanData[curRow + i] = {}; - } - spanData[curRow + i][curCol] = true; - } - } - const colstring = $(element).attr('colspan'); - if (!colstring) { - curCol++; - return; - } - let colspan = parseInt(colstring); - while (colspan > 1) { - curCol++; - tmpRow.push('""'); - colspan--; - if (rowspan > 1) { - for (let i = 1; i < rowspan; i++) { - spanData[curRow + i][curCol] = true; - } - } - } - curCol++; - }); - row2CSV(tmpRow); - curRow++; - }); - }; - - //header - const numCols = options.header.length; - let tmpRow: string[] = []; - if (numCols > 0) { - for (let i = 0; i < numCols; i++) { - tmpRow[tmpRow.length] = formatData(options.header[i]); - } - } else { - handleMatrix('thead', 'th'); - } - // actual data - handleMatrix('tbody', 'td'); - const mydata = csvData.join('\n'); - if (options.delivery == 'popup') { - return popup(mydata); - } else { - return mydata; - } -}; diff --git a/src/ve-utils/utils/change.util.ts b/src/ve-utils/utils/change.util.ts deleted file mode 100644 index 8753aaa54..000000000 --- a/src/ve-utils/utils/change.util.ts +++ /dev/null @@ -1,93 +0,0 @@ -import _ from 'lodash'; - -import { EventService } from '@ve-utils/core'; - -import { VeQService } from '@ve-types/angular'; - -/** - * @name onChangesCallback - * @description This function type defines the expected format for a callback added to the {@link handleChange} - * helper function. - * @example - * myCallback: onChangesCallback = (newVal, oldVal, firstChange) => { - * if (newVal != oldVal && !firstChange) { - * doSomething(); - * } - * - * } - * - */ -export type onChangesCallback = (newVal?: T, oldVal?: T, firstChange?: boolean) => U; - -/** - * @name change.utils#handleChange: - * @description This function is a pseudo replacement for most of the boilerplate needed to replace $scope.watch type behavior with - * angular 1.5 components. - * @example - * class ComponentController { - * constructor() {...} - * $onChanges(onChangesObj: angular.IOnChangesObject): void { - * handleChange(onChangesObj,'watchedBinding',myCallback) - * } - * - * myCallback: onChangesCallback = (newVal, oldVal) => { - * if newVal != oldVal - * doSomething(); - * } - * } - * @param {angular.IOnChangesObject} changesObj - * @param {string} watch - * @param {onChangesCallback} callback - * @param {boolean} ignoreFirst - - * @returns {any} - */ -export function handleChange( - changesObj: angular.IOnChangesObject, - watch: string, - callback: onChangesCallback, - ignoreFirst?: boolean -): void { - if (watch === '') { - return callback(); - } else if (changesObj[watch]) { - if (ignoreFirst && changesObj[watch].isFirstChange()) { - return; - } - const newVal: T = changesObj[watch].currentValue as T; - const oldVal: T = changesObj[watch].previousValue as T; - const firstChange = changesObj[watch].isFirstChange(); - callback(newVal, oldVal, firstChange); - } - return; -} - -interface EventWatcher { - $q: VeQService; - eventSvc: EventService; - subs: Rx.IDisposable[]; -} - -export function watchChangeEvent( - $ctrl: EventWatcher & angular.IComponentController, - name: string, - changeAction: onChangesCallback, - update?: boolean -): void { - $ctrl.subs.push( - $ctrl.eventSvc.$on(name, (data) => { - const change: angular.IChangesObject = { - currentValue: data, - previousValue: _.cloneDeep($ctrl[name] as T), - isFirstChange: () => { - return typeof $ctrl[name] === 'undefined'; - }, - }; - if (data !== $ctrl[name]) { - if (update) { - $ctrl[name] = data; - } - changeAction(change.currentValue, change.previousValue, change.isFirstChange()); - } - }) - ); -} diff --git a/src/ve-utils/utils/emf.util.ts b/src/ve-utils/utils/emf.util.ts deleted file mode 100644 index 1c761b7a8..000000000 --- a/src/ve-utils/utils/emf.util.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { ElementObject, ExpressionObject, PackageObject, ValueObject } from '@ve-types/mms'; - -export class Element implements ElementObject { - id: string = ''; - _projectId: string = ''; - _refId: string = ''; - appliedStereotypeIds: string[] = []; - documentation: string = ''; - mdExtensionsIds: string[] = []; - syncElementId: string = null; - type: string = 'Element'; - - constructor(elementOb?: ElementObject) { - if (elementOb) { - Object.assign(this, elementOb); - } - } -} -export class NamedElement extends Element { - name: string = ''; - nameExpression: string = null; - clientDependencyIds: string[] = []; - supplierDependencyIds: string[] = []; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -class PackageableElement extends NamedElement { - ownerId: string = null; - visibility: string = 'public'; - templateParameterId: string = null; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -class TypedElement extends PackageableElement { - typeId: string = null; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -class TemplateableElement extends PackageableElement { - templateBindingIds: string[] = []; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -export class Property extends TypedElement { - type = 'Property'; - defaultValue: any[] = []; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -export class Class extends TemplateableElement { - classifierBehaviorId: string = null; - collaborationUseIds: string[] = []; - elementImportIds: string[] = []; - generalizationIds: string[] = []; - classRealizationIds: string[] = []; - isAbstract: boolean = false; - isActive: boolean = false; - isFinalSpecialization: boolean = false; - isLeaf: boolean = false; - ownedAttributeIds: string[] = []; - ownedOperationIds: string[] = []; - packageImportIds: string[] = []; - powertypeExtentIds: string[] = []; - redefinedClassifierIds: string[] = []; - representationI: string[] = []; - type = 'Class'; - useCaseIds: string[] = []; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} -export class InstanceSpec extends PackageableElement { - classifierIds: string[] = []; - deploymentIds: string[] = []; - slotIds: string[] = []; - specification: Element = null; - stereotypedElementId: string = null; - type = 'InstanceSpecification'; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -export class ValueSpec extends TypedElement implements ValueObject { - valueExpression: string = ''; - type = 'ValueSpecification'; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -export class Expression extends ValueSpec implements ExpressionObject { - operand: T[] = []; - type = 'Expression'; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} - -export class Package extends TemplateableElement implements PackageObject { - type = 'Package'; - visibility = null; - elementImportIds: string[] = []; - packageImportIds: string[] = []; - URI: string = ''; - packageMergeIds: string[] = []; - profileApplicationIds: string[] = []; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} -export class Generalization extends Element { - generalizationSetIds: string[] = []; - isSubstitutable: boolean = true; - type = 'Generalization'; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} -export class Dependency extends PackageableElement { - type = 'Dependency'; - visibility = null; - constructor(elementOb?: ElementObject) { - super(elementOb); - if (elementOb) { - Object.assign(this, elementOb); - } - } -} diff --git a/src/ve-utils/utils/index.ts b/src/ve-utils/utils/index.ts deleted file mode 100644 index 847dc55d5..000000000 --- a/src/ve-utils/utils/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './change.util'; -export * from './emf.util'; diff --git a/test/archive/DirectiveSpecs/old.mmsTranscludNameSpec.js b/test/archive/DirectiveSpecs/old.mmsTranscludNameSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.commentServiceSpec.js b/test/archive/ServiceSpecs/old.commentServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.configServiceSpec.js b/test/archive/ServiceSpecs/old.configServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.elementServiceSpec.js b/test/archive/ServiceSpecs/old.elementServiceSpec.js old mode 100644 new mode 100755 index 8f92ce356..c66da723e --- a/test/archive/ServiceSpecs/old.elementServiceSpec.js +++ b/test/archive/ServiceSpecs/old.elementServiceSpec.js @@ -8,7 +8,7 @@ describe('ElementService', function() { var root = '/alfresco/service'; var forceEmpty, forceFail, modElements; - + beforeEach(inject(function($injector) { ElementService = $injector.get('ElementService'); @@ -24,7 +24,7 @@ describe('ElementService', function() { { elements: [ { sysmlid:12345, specialization: { type:'Comment' }, lastModified: '01-01-2014' } ] } ); $httpBackend.whenGET(root + '/workspaces/master/elements/12345').respond( function(method, url, data) { var elements; - if (forceEmpty) + if (forceEmpty) elements = { elements: [] }; else { elements = {elements: [ { sysmlid:12345, specialization: { type:'Comment' }, @@ -33,12 +33,12 @@ describe('ElementService', function() { return [200, elements];}); $httpBackend.whenGET(root + '/workspaces/master/elements/12346').respond( function(method, url, data) { if (forceFail) { - return [500, undefined, {status: {code:500, name:'Internal Error', + return [500, undefined, {status: {code:500, name:'Internal Error', description:'An error inside the HTTP server which prevented it from fulfilling the request.'}}]; } else { return [200, { elements: [ { sysmlid: 12346, specialization: { type:'Package'} } ] } ]; }}); - + // GetElement misc responses $httpBackend.whenGET(root + '/workspaces/master/elements/badId').respond( function(method, url, data) { @@ -47,16 +47,16 @@ describe('ElementService', function() { $httpBackend.whenGET(root + '/workspaces/master/elements/emptyId').respond( { elements: [] }); $httpBackend.whenGET(root + '/workspaces/master/elements').respond( {elements:[ {sysmlid:12345, name:'commentElement', documentation:'old documentation', - specialization:{type:'Comment'}}, {sysmlid:12346, name:'packageElement', + specialization:{type:'Comment'}}, {sysmlid:12346, name:'packageElement', specialization:{type:'Package'}}]}); $httpBackend.whenGET(root + '/workspaces/master/elements/noSpecialization').respond( { elements: [ { sysmlid: 'noSpecialization', documentation: 'has no specialization' } ] } ); $httpBackend.whenGET(root + '/workspaces/master/elements/operationId').respond( - { elements: [ { sysmlid: 'operationId', specialization: { type: 'Operation', + { elements: [ { sysmlid: 'operationId', specialization: { type: 'Operation', parameters: [ 'paramId', 'paramId2' ], expresion: 'expressionId' } } ] } ); $httpBackend.whenGET(root + '/workspaces/master/elements/productId').respond( - { elements: [ { sysmlid: 'productId', specialization: { type: 'Product', + { elements: [ { sysmlid: 'productId', specialization: { type: 'Product', view2view: [ { sysmlid: 'viewId', childrenViews:[] } ], noSections: [] } } ] } ); // UpdateElement response @@ -83,9 +83,9 @@ describe('ElementService', function() { $httpBackend.whenGET(root + '/workspaces/master/elements?search=muschek').respond(function(method, url, data) { if (forceFail) { return [500, 'Internal Server Error']; } else { - var elements = { elements: [ { sysmlid: 'commentId', author: 'muschek', specialization: { type: 'muschek' } }, - { sysmlid: 'packageId', author: 'muschek', specialization: { type: 'muschek' } }, - { sysmlid: 'paramId', description: 'Chris Muschek want to use this parameter for blah, blah, blah...', specialization: + var elements = { elements: [ { sysmlid: 'commentId', author: 'muschek', specialization: { type: 'muschek' } }, + { sysmlid: 'packageId', author: 'muschek', specialization: { type: 'muschek' } }, + { sysmlid: 'paramId', description: 'Chris Muschek want to use this parameter for blah, blah, blah...', specialization: { type: 'Parameter', direction: 'one', parameterType: 'band name', defaultValue: undefined } } ] }; if (modElements) { @@ -126,7 +126,7 @@ describe('ElementService', function() { expect(response.lastModified).toEqual( '01-01-2014' ); }); $httpBackend.flush(); }).toThrow(); - + // !(inProgress.hasOwnProperty(key)), (ver === 'latest'), !(elements.hasOwnProperty(id)), // $http.get - fail ElementService.getElement('badId', undefined, undefined, 'latest').then(function(response) { displayError(); }, @@ -155,11 +155,11 @@ describe('ElementService', function() { }); $httpBackend.flush(); // elements[12345] now exists - + // Cannot exist because the 'elements' cache does not change between the two checks. // !(inProgress.hasOwnProperty(key)), (ver === 'latest'), !(elements.hasOwnProperty(id)), // $http.get - pass, (data.elements.length > 0), (elements.hasOwnProperty(id)) - + // !(inProgress.hasOwnProperty(key)), (ver === 'latest'), (elements.hasOwnProperty(id)), // !(!update), $http.get - fail @@ -188,11 +188,11 @@ describe('ElementService', function() { $httpBackend.flush(); forceEmpty = false; - + // Cannot exist because the 'elements' cache does not change between the two checks. // !(inProgress.hasOwnProperty(key)), (ver === 'latest'), (elements.hasOwnProperty(id)), // !(!update), $http.get - pass, (data.elements.length > 0), !(elements.hasOwnProperty(id)) - + // !(inProgress.hasOwnProperty(key)), (ver === 'latest'), (elements.hasOwnProperty(id)), // (!update) @@ -262,7 +262,7 @@ describe('ElementService', function() { // Mixed (valid and invalid) ids ids = ['12345', '12346']; - ElementService.getElements(ids, true, undefined, undefined).then(function(response) { displayError(); }, + ElementService.getElements(ids, true, undefined, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(500); expect(failMessage.data).toEqual(undefined); @@ -276,11 +276,11 @@ describe('ElementService', function() { // done - 3 expected to fail it('getElementForEdit', inject(function() { - + // !(edits.hasOwnProperty(id) && !update), getElement - fail // a. (edits.hasOwnProperty(id) && update) // b. (!edits.hasOwnProperty(id) && !update) - + ElementService.getElementForEdit('badId', true, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(404); @@ -288,10 +288,10 @@ describe('ElementService', function() { }); $httpBackend.flush(); - - // !(edits.hasOwnProperty(id) && !update), getElement - pass, !(edits.hasOwnProperty(id)), + + // !(edits.hasOwnProperty(id) && !update), getElement - pass, !(edits.hasOwnProperty(id)), // !(edit.hasOwnProperty('specialization')) - + ElementService.getElementForEdit('noSpecialization', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('noSpecialization'); expect(response.documentation).toEqual('has no specialization'); @@ -299,10 +299,10 @@ describe('ElementService', function() { }); $httpBackend.flush(); // edits[noSpecialization] now exists - - // !(edits.hasOwnProperty(id) && !update), getElement - pass, !(edits.hasOwnProperty(id)), + + // !(edits.hasOwnProperty(id) && !update), getElement - pass, !(edits.hasOwnProperty(id)), // (edit.hasOwnProperty('specialization')), !(edit.specialization.hasOwnProperty(nonEditKeys[i])) - + ElementService.getElementForEdit('operationId', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('operationId'); expect(response.specialization.type).toEqual('Operation'); @@ -311,10 +311,10 @@ describe('ElementService', function() { }); $httpBackend.flush(); // edits[operationId] now exists - - // !(edits.hasOwnProperty(id) && !update), getElement - pass, !(edits.hasOwnProperty(id)), + + // !(edits.hasOwnProperty(id) && !update), getElement - pass, !(edits.hasOwnProperty(id)), // (edit.hasOwnProperty('specialization')), (edit.specialization.hasOwnProperty(nonEditKeys[i])) - + ElementService.getElementForEdit('productId', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('productId'); expect(response.specialization.type).toEqual('Product'); @@ -323,10 +323,10 @@ describe('ElementService', function() { }); $httpBackend.flush(); // edits[productId] now exists - - // !(edits.hasOwnProperty(id) && !update), getElement - pass, (edits.hasOwnProperty(id)), + + // !(edits.hasOwnProperty(id) && !update), getElement - pass, (edits.hasOwnProperty(id)), // !(edit.hasOwnProperty('specialization')) - + ElementService.getElementForEdit('noSpecialization', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('noSpecialization'); expect(response.documentation).toEqual('has no specialization'); @@ -335,7 +335,7 @@ describe('ElementService', function() { // edit the response response.documentation = 'this element has no specialization'; }); $httpBackend.flush(); - + // After edit ElementService.getElementForEdit('noSpecialization', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('noSpecialization'); @@ -343,10 +343,10 @@ describe('ElementService', function() { expect(response.specialization).toEqual(undefined); }); $httpBackend.flush(); - - // !(edits.hasOwnProperty(id) && !update), getElement - pass, (edits.hasOwnProperty(id)), + + // !(edits.hasOwnProperty(id) && !update), getElement - pass, (edits.hasOwnProperty(id)), // (edit.hasOwnProperty('specialization')), !(edit.specialization.hasOwnProperty(nonEditKeys[i])) - + ElementService.getElementForEdit('operationId', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('operationId'); expect(response.specialization.type).toEqual('Operation'); @@ -357,11 +357,11 @@ describe('ElementService', function() { response.documentation = 'operations do not have non-editable properties'; }); $httpBackend.flush(); - + // !-- NOTE: I'm not sure if the element for edit that has been updated from the server, // ought to have the documentation property if it did not already exist, but currently, // it does. -- ! - + //After an edit has been made. ElementService.getElementForEdit('operationId', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('operationId'); @@ -371,10 +371,10 @@ describe('ElementService', function() { expect(response.documentation).toEqual('operations do not have non-editable properties'); }); $httpBackend.flush(); - - // !(edits.hasOwnProperty(id) && !update), getElement - pass, (edits.hasOwnProperty(id)), + + // !(edits.hasOwnProperty(id) && !update), getElement - pass, (edits.hasOwnProperty(id)), // (edit.hasOwnProperty('specialization')), (edit.specialization.hasOwnProperty(nonEditKeys[i])) - + ElementService.getElementForEdit('productId', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('productId'); expect(response.specialization.type).toEqual('Product'); @@ -385,11 +385,11 @@ describe('ElementService', function() { response.documentation = 'products have non-editable properties'; }); $httpBackend.flush(); - + // !-- NOTE: I'm not sure if the element for edit that has been updated from the server, // ought to have the documentation property if it did not already exist, but currently, // it does. -- ! - + //After an edit has been made. ElementService.getElementForEdit('productId', true, undefined).then(function(response) { expect(response.sysmlid).toEqual('productId'); @@ -470,7 +470,7 @@ describe('ElementService', function() { // Mixed (valid and invalid) ids ids = ['12345', '12346']; - ElementService.getElementsForEdit(ids, true, undefined, undefined).then(function(response) { displayError(); }, + ElementService.getElementsForEdit(ids, true, undefined, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(500); expect(failMessage.data).toEqual(undefined); @@ -488,9 +488,9 @@ describe('ElementService', function() { // done - 2 expected to fail it('updateElement', inject(function() { - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - fail - + var elem = { sysmlid: 'badId', specialization: { type: 'Package' } } ElementService.updateElement(elem, undefined).then(function(response) { displayError(); }, function(failMessage) { @@ -499,21 +499,21 @@ describe('ElementService', function() { }); $httpBackend.flush(); - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // !(elements.hasOwnProperty(elem.sysmlid)), !(edits.hasOwnProperty(elem.sysmlid)) - + elem = { sysmlid: '1', specialization: { type: 'Project', version: 'v1' } }; ElementService.updateElement(elem, undefined).then(function(response) { expect(response).toEqual(elem); }); $httpBackend.flush(); // elements[1] now exists - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // !(elements.hasOwnProperty(elem.sysmlid)), (edits.hasOwnProperty(elem.sysmlid)), // !(edit.hasOwnProperty('specialization')) - + var elem2; ElementService.getElementForEdit('noSpecialization', true, 'master').then( function(response) { expect(response.sysmlid).toEqual('noSpecialization'); @@ -530,18 +530,18 @@ describe('ElementService', function() { expect(response.documentation).toEqual('has no specialization'); expect(response.name).toEqual('noSpecialization'); - // Element checked out for editor, was updated when updateElement was called. + // Element checked out for editing, was updated when updateElement was called. expect(elem2).toEqual(response); expect(elem2.name).toEqual('noSpecialization'); }); $httpBackend.flush(); // elements[noSpecialization] now exists - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // !(elements.hasOwnProperty(elem.sysmlid)), (edits.hasOwnProperty(elem.sysmlid)), // (edit.hasOwnProperty('specialization')), !(edit.specialization.hasOwnProperty(nonEditKeys[i])) - + ElementService.getElementForEdit('operationId', true, 'master').then( function(response) { expect(response.sysmlid).toEqual('operationId'); expect(response.specialization).not.toEqual(undefined); @@ -552,7 +552,7 @@ describe('ElementService', function() { }); $httpBackend.flush(); // edits[operationId] now exists - elem = { sysmlid: 'operationId', name: 'operationElement', specialization: { type: 'Operation', + elem = { sysmlid: 'operationId', name: 'operationElement', specialization: { type: 'Operation', parameters: [ 'paramId', 'paramId2' ], expresion: 'expressionId' } }; ElementService.updateElement(elem, undefined).then( function(response) { expect(response.sysmlid).toEqual('operationId'); @@ -564,13 +564,13 @@ describe('ElementService', function() { expect(elem2.name).toEqual(response.name); }); $httpBackend.flush(); // elements[operationId] now exists + - - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // !(elements.hasOwnProperty(elem.sysmlid)), (edits.hasOwnProperty(elem.sysmlid)), // (edit.hasOwnProperty('specialization')), (edit.specialization.hasOwnProperty(nonEditKeys[i])) - + ElementService.getElementForEdit('productId', true, 'master').then( function(response) { expect(response.sysmlid).toEqual('productId'); expect(response.specialization).not.toEqual(undefined); @@ -582,7 +582,7 @@ describe('ElementService', function() { }); $httpBackend.flush(); // edits[productId] now exists - elem = { sysmlid: 'productId', name: 'productElement', specialization: { type: 'Product', + elem = { sysmlid: 'productId', name: 'productElement', specialization: { type: 'Product', view2view: [ { sysmlid: 'viewId', childrenViews:[] }, { sysmlid: 'viewId2', childrenViews: [] } ], noSections: [] } }; ElementService.updateElement(elem, undefined).then( function(response) { @@ -596,10 +596,10 @@ describe('ElementService', function() { }); $httpBackend.flush(); // elements[productId] now exists - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // (elements.hasOwnProperty(elem.sysmlid)), !(edits.hasOwnProperty(elem.sysmlid)) - + elem = { name: '2', specialization: { type: 'Project', version: 'v2' } }; ElementService.createElement(elem, 'master').then( function(response) { expect(response.sysmlid).toBeDefined(); @@ -625,11 +625,11 @@ describe('ElementService', function() { }); $httpBackend.flush(); // edits[2] now exists - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // (elements.hasOwnProperty(elem.sysmlid)), (edits.hasOwnProperty(elem.sysmlid)), // !(edit.hasOwnProperty('specialization')) - + elem = { name: 'noSpec2' }; ElementService.createElement(elem, 'master').then(function(response) { expect(elem.sysmlid).not.toBeDefined(); @@ -646,7 +646,7 @@ describe('ElementService', function() { // edits[noSpec2] now exists var elem3 = { sysmlid: 'noSpec2', name: 'noSpec2', author: 'muschek' }; - // Edit the element checked out for editor + // Edit the element checked out for editing elem2.documentation = 'Another element without a specialization'; ElementService.updateElement(elem3, undefined).then(function(response) { expect(response.sysmlid).toEqual('noSpec2'); @@ -654,21 +654,21 @@ describe('ElementService', function() { expect(response.author).toEqual('muschek'); expect(response.documentation).not.toBeDefined(); - // Expect the element checked out for editor to be updated and maintain it's own properties. + // Expect the element checked out for editing to be updated and maintain it's own properties. expect(elem2.author).toEqual('muschek'); expect(elem2.documentation).toEqual('Another element without a specialization'); - // Expect element not checked for editor to still be updated. + // Expect element not checked for editing to still be updated. expect(elem.author).toEqual('muschek'); expect(elem.documentation).not.toBeDefined(); }); $httpBackend.flush(); - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // (elements.hasOwnProperty(elem.sysmlid)), (edits.hasOwnProperty(elem.sysmlid)), // (edit.hasOwnProperty('specialization')), !(edit.specialization.hasOwnProperty(nonEditKeys[i])) - + elem = { name: 'package2', specialization: { type: 'Package' } }; ElementService.createElement(elem, 'master').then(function(response) { expect(elem.sysmlid).not.toBeDefined(); @@ -686,7 +686,7 @@ describe('ElementService', function() { // edits[noSpec2] now exists elem3 = { sysmlid: 'package2', name: 'package2', author: 'muschek' }; - // Edit the element checked out for editor + // Edit the element checked out for editing elem2.documentation = 'Another package element'; ElementService.updateElement(elem3, undefined).then(function(response) { expect(response.sysmlid).toEqual('package2'); @@ -694,20 +694,20 @@ describe('ElementService', function() { expect(response.author).toEqual('muschek'); expect(response.documentation).not.toBeDefined(); - // Expect the element checked out for editor to be updated and maintain it's own properties. + // Expect the element checked out for editing to be updated and maintain it's own properties. expect(elem2.author).toEqual('muschek'); expect(elem2.documentation).toEqual('Another package element'); - // Expect element not checked for editor to still be updated. + // Expect element not checked for editing to still be updated. expect(elem.author).toEqual('muschek'); expect(elem.documentation).not.toBeDefined(); }); $httpBackend.flush(); - + // !(!elem.hasOwnProperty('sysmlid')), !(elem.hasOwnProperty('owner')), $http.post - pass, // (elements.hasOwnProperty(elem.sysmlid)), (edits.hasOwnProperty(elem.sysmlid)), // (edit.hasOwnProperty('specialization')), (edit.specialization.hasOwnProperty(nonEditKeys[i])) - + elem = { name: 'view', specialization: { type: 'View', contains: [], displayedElements: [], allowedElements: [], childrenViews: [] } }; ElementService.createElement(elem, 'master').then(function(response) { @@ -729,10 +729,10 @@ describe('ElementService', function() { }); $rootScope.$apply(); // edits[noSpec2] now exists - elem3 = { sysmlid: 'view', name: 'view', author: 'muschek', + elem3 = { sysmlid: 'view', name: 'view', author: 'muschek', specialization: { type: 'View', contains: [ 'table', 'list' ], displayedElements: [], allowedElements: [], childrenViews: [] } }; - // Edit the element checked out for editor + // Edit the element checked out for editing elem2.documentation = 'View element'; ElementService.updateElement(elem3, undefined).then(function(response) { expect(response.sysmlid).toEqual('view'); @@ -740,11 +740,11 @@ describe('ElementService', function() { expect(response.author).toEqual('muschek'); expect(response.documentation).not.toBeDefined(); - // Expect the element checked out for editor to be updated and maintain it's own properties. + // Expect the element checked out for editing to be updated and maintain it's own properties. expect(elem2.author).toEqual('muschek'); expect(elem2.documentation).toEqual('View element'); - // Expect element not checked for editor to still be updated. + // Expect element not checked for editing to still be updated. expect(elem.author).toEqual('muschek'); expect(elem.documentation).not.toBeDefined(); }); $httpBackend.flush(); @@ -752,7 +752,7 @@ describe('ElementService', function() { // Only one test case is necessary for the owner property. // !(!elem.hasOwnProperty('sysmlid')), (elem.hasOwnProperty('owner')), $http.post - pass, // !(elements.hasOwnProperty(elem.sysmlid)), !(edits.hasOwnProperty(elem.sysmlid)) - + elem = { sysmlid: 'commentElement', owner: 'anotherElement', specialization: { type: 'Comment' } }; ElementService.updateElement(elem, undefined).then(function(response) { @@ -762,7 +762,7 @@ describe('ElementService', function() { expect(response).toEqual(elem); }); $httpBackend.flush(); - + // (!elem.hasOwnProperty('sysmlid')) elem = { documentation: 'element without sysmlid' }; ElementService.updateElement(elem, undefined).then(function(response) { displayError(); }, @@ -809,15 +809,15 @@ describe('ElementService', function() { // Invalid id elems = [ { documentation: 'invalid element', specialization: { type: 'Comment' } } ]; - ElementService.updateElements(elems, undefined).then(function(response) { displayError(); }, + ElementService.updateElements(elems, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage).toEqual('Element id not found, create element first!'); - }); + }); $rootScope.$apply(); // Mixed (valid and invalid) ids elems.push( { sysmlid: 'valid3', specialization: { type: 'Comment' } } ); - ElementService.updateElements(elems, undefined).then(function(response) { displayError(); }, + ElementService.updateElements(elems, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage).toEqual('Element id not found, create element first!'); }); @@ -825,23 +825,23 @@ describe('ElementService', function() { elems = [ { sysmlid: 'validId4', specialization: { type: 'Comment' } } ]; elems.push( { name: 'invalid', specialization: { type: 'Package' } } ); - ElementService.updateElements(elems, undefined).then(function(response) { displayError(); }, + ElementService.updateElements(elems, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage).toEqual('Element id not found, create element first!'); }); $httpBackend.flush(); })); - // !-- NOTE: I'm not sure if the createElement function ought to add an owner property if + // !-- NOTE: I'm not sure if the createElement function ought to add an owner property if // one does not already exist. --! - // !-- NOTE: When creating an element and receiving an empty array back, the promise ought to + // !-- NOTE: When creating an element and receiving an empty array back, the promise ought to // be rejected. --! // done - expects 1-2 to fail it('createElement', inject(function() { - + // !(!elem.hasOwnProperty('owner')), !(elem.hasOwnProperty('sysmlid')), $http.post - fail - + var elem = { name: 'badElement', specialization: { type: 'Pop-Up' }, documentation: 'Element with non-existant type', owner: 'ownerId' }; ElementService.createElement(elem, undefined).then(function(response) { displayError(); }, @@ -852,7 +852,7 @@ describe('ElementService', function() { // !-- NOTE: This ought to be rejected. --! - + // !(!elem.hasOwnProperty('owner')), !(elem.hasOwnProperty('sysmlid')), $http.post - pass, // !(data.elements.length > 0) forceEmpty = true; @@ -863,10 +863,10 @@ describe('ElementService', function() { }); forceEmpty = false; - + // !(!elem.hasOwnProperty('owner')), !(elem.hasOwnProperty('sysmlid')), $http.post - pass, // (data.elements.length > 0) - + // With clean element elem = { name: 'viewPoint', specialization: { type: 'ViewPoint', method: 'methodId' }, owner: 'ownerId' }; ElementService.createElement(elem, undefined).then(function(response) { @@ -878,7 +878,7 @@ describe('ElementService', function() { // elements[viewPoint] now exists // With dirty element - elem = { name: 'propertyId', specialization: { type: 'Property', isDerived: false, isSlot: false, + elem = { name: 'propertyId', specialization: { type: 'Property', isDerived: false, isSlot: false, propertyType: 'propertyTypeId', value: 'not an array' }, owner: 'ownerId' }; ElementService.createElement(elem, undefined).then(function(response) { expect(response.owner).toEqual('ownerId'); @@ -891,20 +891,20 @@ describe('ElementService', function() { }); $httpBackend.flush(); // elements[propertyId] now exists - + // !(!elem.hasOwnProperty('owner')), (elem.hasOwnProperty('sysmlid')) - + elem = { name: 'alreadyWithId', sysmlid: 'alreadyWithId', owner: 'ownerId' }; - ElementService.createElement(elem, undefined).then(function(response) { displayError(); }, + ElementService.createElement(elem, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(200); expect(failMessage.message).toEqual('Element create cannot have id'); }); $rootScope.$apply(); - + // (!elem.hasOwnProperty('owner')), !(elem.hasOwnProperty('sysmlid')), $http.post - fail - + elem = { name: 'badElement', specialization: { type: 'Pop-Up' }, documentation: 'Element with non-existant type' }; ElementService.createElement(elem, undefined).then(function(response) { displayError(); }, @@ -915,11 +915,11 @@ describe('ElementService', function() { expect(elem.owner).not.toBeDefined(); - + // (!elem.hasOwnProperty('owner')), !(elem.hasOwnProperty('sysmlid')), $http.post - pass, // (data.elements.length > 0) elem = { name: 'project', specialization: { type: 'Project', version: 'v1' } }; - ElementService.createElement(elem, undefined).then(function(response) { + ElementService.createElement(elem, undefined).then(function(response) { expect(response.name).toEqual('project'); expect(response.specialization.type).toEqual('Project'); expect(response.specialization.version).toEqual('v1'); @@ -959,7 +959,7 @@ describe('ElementService', function() { // One invalid element elements = [ { sysmlid: 'badElement', documentation:'This should cause an issue' } ]; - ElementService.createElements(elements, undefined).then(function(response) { displayError(); }, + ElementService.createElements(elements, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(200); expect(failMessage.message).toEqual('Element create cannot have id'); @@ -969,7 +969,7 @@ describe('ElementService', function() { // Mixed valid and invalid elements // [invalid, valid] elements.push( { name: 'goodElement' } ); - ElementService.createElements(elements, undefined).then(function(response) { displayError(); }, + ElementService.createElements(elements, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(200); expect(failMessage.message).toEqual('Element create cannot have id'); @@ -977,9 +977,9 @@ describe('ElementService', function() { $httpBackend.flush(); // [valid, invalid] - elements = [ { name: 'goodElement' }, { sysmlid: 'badElement', + elements = [ { name: 'goodElement' }, { sysmlid: 'badElement', documentation:'This should cause an issue' } ]; - ElementService.createElements(elements, undefined).then(function(response) { displayError(); }, + ElementService.createElements(elements, undefined).then(function(response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(200); expect(failMessage.message).toEqual('Element create cannot have id'); @@ -991,7 +991,7 @@ describe('ElementService', function() { // that had no sysmlid --! // done it('getGenericElements', inject(function() { - // (!inProgress.hasOwnProperty(progress)), (ver !== 'latest') + // (!inProgress.hasOwnProperty(progress)), (ver !== 'latest') var siteProductsURL = '/alfresco/service/workspaces/master/sites/siteId/products'; ElementService.getGenericElements(siteProductsURL, 'products', undefined, undefined, '01-01-2014') .then(function(response) { @@ -1000,7 +1000,7 @@ describe('ElementService', function() { expect(response[1]).toEqual({sysmlid:'PROJECT-2468', name:'Europa FS', projectVersion:'v34'}); }); $httpBackend.flush(); - // (!inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - fail + // (!inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - fail var badURL = '/alfresco/service/workspaces/master/sites/siteId'; ElementService.getGenericElements(badURL, 'sites', undefined, undefined, 'latest') .then(function(response) { console.log('This should not be displayed'); }, function(failMes) { @@ -1008,7 +1008,7 @@ describe('ElementService', function() { expect(failMes.message).toEqual('Server Error'); }); $httpBackend.flush(); - // !(inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - pass, + // !(inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - pass, // !(elements.hasOwnProperty(element.sysmlid)) var elementsURL = '/alfresco/service/workspaces/master/elements'; ElementService.getGenericElements(elementsURL, 'elements', false, undefined, 'latest') @@ -1021,7 +1021,7 @@ describe('ElementService', function() { // elements[12345] and elements[12346] now exist - // !(inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - pass, + // !(inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - pass, // (elements.hasOwnProperty(element.sysmlid)), !update var new_12345 = {sysmlid:12345, name:'commentElement', documentation:'new documentation', specialization:{type:'Comment'}}; @@ -1036,7 +1036,7 @@ describe('ElementService', function() { expect(response[1]).toEqual({sysmlid:12346, name:'packageElement', specialization:{type:'Package'}}); }); $rootScope.$apply(); - // !(inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - pass, + // !(inProgress.hasOwnProperty(progress)), (ver === 'latest'), $http.get(url) - pass, // (elements.hasOwnProperty(element.sysmlid)), update ElementService.getGenericElements(elementsURL, 'elements', true, undefined, 'latest') .then(function(response) { @@ -1057,9 +1057,9 @@ describe('ElementService', function() { // done it('isDirty', inject(function() { - + // !(!edits.hasOwnProperty(id)), !(_.isEqual(elements[id], edits[id])) - + var edit; ElementService.getElementForEdit('productId', true, 'master').then(function(response) { edit = response; @@ -1069,9 +1069,9 @@ describe('ElementService', function() { edit.documentation = 'documentation has now been edited'; expect(ElementService.isDirty( 'productId' )).toEqual(true); - + // !(!edits.hasOwnProperty(id)), (_.isEqual(elements[id], edits[id])) - + ElementService.getElementForEdit('operationId', true, 'master'); $httpBackend.flush(); // edits[operationId] and elements[operationId] now exist expect(ElementService.isDirty( 'operationId' )).toEqual(false); @@ -1087,14 +1087,14 @@ describe('ElementService', function() { // $http.get - fail forceFail = true; - ElementService.search('muschek', undefined, undefined).then(function (response) { displayError(); }, + ElementService.search('muschek', undefined, undefined).then(function (response) { displayError(); }, function(failMessage) { expect(failMessage.status).toEqual(500); expect(failMessage.data).toEqual('Internal Server Error'); }); $httpBackend.flush(); forceFail = false; - + // $http.get - pass, !(elements.hasOwnProperty(element.sysmlid)) ElementService.search('muschek', undefined, undefined).then(function(response) { expect(response.length).toEqual(3); @@ -1104,7 +1104,7 @@ describe('ElementService', function() { expect(response[2]).toEqual( { sysmlid: 'paramId', description: 'Chris Muschek want to use this parameter for blah, blah, blah...', specialization: { type: 'Parameter', direction: 'one', parameterType: 'band name', defaultValue: undefined } } ); }); $httpBackend.flush(); - + // $http.get - pass, (elements.hasOwnProperty(element.sysmlid)), !(update) ElementService.search('muschek', false, undefined).then(function(response) { expect(response.length).toEqual(3); @@ -1114,7 +1114,7 @@ describe('ElementService', function() { expect(response[2]).toEqual( { sysmlid: 'paramId', description: 'Chris Muschek want to use this parameter for blah, blah, blah...', specialization: { type: 'Parameter', direction: 'one', parameterType: 'band name', defaultValue: undefined } } ); }); $rootScope.$apply(); - + // $http.get - pass, (elements.hasOwnProperty(element.sysmlid)), (update) ElementService.search('muschek', true, undefined).then(function(response) { expect(response.length).toEqual(4); @@ -1127,4 +1127,4 @@ describe('ElementService', function() { name: 'muschek\'s image' } ); }); $httpBackend.flush(); })); -}); +}); \ No newline at end of file diff --git a/test/archive/ServiceSpecs/old.notificationServiceSpec.js b/test/archive/ServiceSpecs/old.notificationServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.projectServiceSpec.js b/test/archive/ServiceSpecs/old.projectServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.searchServiceSpec.js b/test/archive/ServiceSpecs/old.searchServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.siteServiceSpec.js b/test/archive/ServiceSpecs/old.siteServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.urlServiceSpec.js b/test/archive/ServiceSpecs/old.urlServiceSpec.js old mode 100644 new mode 100755 index 017c9b726..138dc80d5 --- a/test/archive/ServiceSpecs/old.urlServiceSpec.js +++ b/test/archive/ServiceSpecs/old.urlServiceSpec.js @@ -1,307 +1,233 @@ -'use strict' +'use strict'; // !-- NOTE: need to test handleHttpStatus --! // URLService - done, 16 methods, [16 normal], expect 3 to fail -describe('URLService', function () { - beforeEach(module('mms')) - - var URLService, $rootScope, $q - var expectedReturn - - beforeEach(inject(function ($injector) { - URLService = $injector.get('URLService') - $rootScope = $injector.get('$rootScope') - $q = $injector.get('$q') - - expectedReturn = '' - })) - - var root = '/alfresco/service' - - it('can get an instance of URLService', inject(function () { - //URLService function exists - expect(URLService).toBeDefined() - - //URLService returns object that has all these attributes - expect(URLService.getSiteDashboardURL).toBeDefined() - expect(URLService.getElementURL).toBeDefined() - expect(URLService.getElementVersionsURL).toBeDefined() - expect(URLService.getPostElementsURL).toBeDefined() - expect(URLService.handleHttpStatus).toBeDefined() - expect(URLService.getSitesURL).toBeDefined() - expect(URLService.getElementSearchURL).toBeDefined() - expect(URLService.getImageURL).toBeDefined() - expect(URLService.getProductSnapshotsURL).toBeDefined() - expect(URLService.getConfigSnapshotsURL).toBeDefined() - expect(URLService.getSiteProductsURL).toBeDefined() - expect(URLService.getConfigURL).toBeDefined() - expect(URLService.getSiteConfigsURL).toBeDefined() - expect(URLService.getConfigProductsURL).toBeDefined() - expect(URLService.getViewDatasURL).toBeDefined() - })) - - it('getConfigSnapshotsURL', inject(function () { - expectedReturn = - root + - '/workspaces/master/sites/ems/configurations/configId/snapshots' - expect( - URLService.getConfigSnapshotsURL('configId', 'ems', 'master') - ).toEqual(expectedReturn) - })) - - it('getProductSnapshotsURL', inject(function () { - expectedReturn = - root + '/workspaces/master/sites/ems/products/productId/snapshots' - expect( - URLService.getProductSnapshotsURL('productId', 'ems', 'master') - ).toEqual(expectedReturn) - })) - - it('getSiteConfigsURL', inject(function () { - expectedReturn = root + '/workspaces/master/sites/ems/configurations' - expect(URLService.getSiteConfigsURL('ems', 'master')).toEqual( - expectedReturn - ) - })) - - it('getConfigProductsURL', inject(function () { - expectedReturn = - root + - '/workspaces/master/sites/ems/configurations/configId/products' - expect( - URLService.getConfigProductsURL('configId', 'ems', 'master') - ).toEqual(expectedReturn) - })) - - it('getConfigURL', inject(function () { - expectedReturn = - root + '/workspaces/master/sites/ems/configurations/configId' - expect(URLService.getConfigURL('configId', 'ems', 'master')).toEqual( - expectedReturn - ) - })) - - it('getSiteProductsURL', inject(function () { - expectedReturn = root + '/workspaces/master/sites/ems/products' - expect(URLService.getSiteProductsURL('ems', 'master')).toEqual( - expectedReturn - ) - })) - - it('getImageURL', inject(function () { - expectedReturn = root + '/workspaces/master/artifacts/artifactId' - - // latest - expect( - URLService.getImageURL('artifactId', 'master', 'latest') - ).toEqual(expectedReturn) - - // timestamp - expectedReturn += '?timestamp=01-01-2014' - expect( - URLService.getImageURL('artifactId', 'master', '01-01-2014') - ).toEqual(expectedReturn) - - // version - expectedReturn = - root + '/workspaces/master/artifacts/artifactId/versions/versionId' - expect( - URLService.getImageURL('artifactId', 'master', 'versionId') - ).toEqual(expectedReturn) - })) - - it('getSiteDashboardURL', inject(function () { - expectedReturn = '/share/page/site/ems/dashboard' - expect(URLService.getSiteDashboardURL('ems')).toBe(expectedReturn) - })) - - it('getElementURL', inject(function () { - expectedReturn = root + '/workspaces/master/elements/elementId' - - // latest - expect(URLService.getElementURL('elementId', 'master', 'latest')).toBe( - expectedReturn - ) - - // timestamp - expectedReturn += '?timestamp=01-01-2014' - expect( - URLService.getElementURL('elementId', 'master', '01-01-2014') - ).toBe(expectedReturn) - - // version - expectedReturn = - root + '/workspaces/master/elements/elementId/versions/versionId' - expect( - URLService.getElementURL('elementId', 'master', 'versionId') - ).toBe(expectedReturn) - })) - - // !-- NOTE: this function uses old API web services --! - // !-- NOTE: his function takes versionId as a parameter, however, - // the urls it is calling on do not exist --! - it('getViewDatasURL', inject(function () { - expectedReturn = root + '/workspaces/master/views/viewId/elements' - - // latest - expect( - URLService.getViewDatasURL('viewId', 'master', 'latest') - ).toEqual(expectedReturn) - - // timestamp - expectedReturn += '?timestamp=01-01-2014' - expect( - URLService.getViewDatasURL('viewId', 'master', '01-01-2014') - ).toEqual(expectedReturn) - - // version - expectedReturn = - root + '/workspaces/master/views/viewId/versions/versionId' - expect( - URLService.getViewDatasURL('viewId', 'master', 'versionId') - ).toEqual(expectedReturn) - })) - - // !-- NOTE: this function uses old API web services --! - it('getElementVersionsURL', inject(function () { - expectedReturn = root + '/workspaces/master/elements/elementId/versions' - - expect(URLService.getElementVersionsURL('elementId', 'master')).toEqual( - expectedReturn - ) - })) - - it('getPostElementsURL', inject(function () { - var expectedReturn = root + '/workspaces/master/elements' - expect(URLService.getPostElementsURL('master')).toEqual(expectedReturn) - })) - - it('handleHttpStatus', inject(function () { - // 404 - var deferred = $q.defer() - URLService.handleHttpStatus({}, 404, undefined, undefined, deferred) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(404) - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Not Found') - } - ) - $rootScope.$apply() - - // 500 - deferred = $q.defer() - URLService.handleHttpStatus({}, 500, undefined, undefined, deferred) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(500) - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Server Error') - } - ) - $rootScope.$apply() - - // 401 || 403 - deferred = $q.defer() - URLService.handleHttpStatus({}, 401, undefined, undefined, deferred) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(401) - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Permission Error') - } - ) - $rootScope.$apply() - - deferred = $q.defer() - URLService.handleHttpStatus({}, 403, undefined, undefined, deferred) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(403) - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Permission Error') - } - ) - $rootScope.$apply() - - // 409 - deferred = $q.defer() - URLService.handleHttpStatus({}, 409, undefined, undefined, deferred) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(409) - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Conflict') - } - ) - $rootScope.$apply() - - // else - deferred = $q.defer() - URLService.handleHttpStatus({}, 600, undefined, undefined, deferred) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(600) - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Failed') - } - ) - $rootScope.$apply() - - deferred = $q.defer() - URLService.handleHttpStatus( - {}, - 'string', - undefined, - undefined, - deferred - ) - deferred.promise.then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual('string') - expect(failMessage.data).toEqual({}) - expect(failMessage.message).toEqual('Failed') - } - ) - $rootScope.$apply() - })) - - it('getSitesURL', inject(function () { - var expectedReturn = root + '/rest/sites' - expect(URLService.getSitesURL()).toEqual(expectedReturn) - })) - - // !-- NOTE: this function uses old API web services --! - // !-- NOTE: this function may be removed --! - it('getElementSearchURL', inject(function () { - var query = 'queryKeyword' - expectedReturn = root + '/javawebscripts/element/search?keyword=muschek' - expect(URLService.getElementSearchURL('muschek', 'master')).toBe( - expectedReturn - ) - })) - - // Private methods: isTimestamp, addVersion, handleHttpStatus - // Not tested -}) +describe('URLService', function() { + beforeEach(module('mms')); + + var URLService, $rootScope, $q; + var expectedReturn; + + beforeEach(inject(function($injector) { + URLService = $injector.get('URLService'); + $rootScope = $injector.get('$rootScope'); + $q = $injector.get('$q'); + + expectedReturn = ''; + })); + + var root = '/alfresco/service'; + + it('can get an instance of URLService', inject(function() { + //URLService function exists + expect(URLService).toBeDefined(); + + //URLService returns object that has all these attributes + expect(URLService.getSiteDashboardURL).toBeDefined(); + expect(URLService.getElementURL).toBeDefined(); + expect(URLService.getElementVersionsURL).toBeDefined(); + expect(URLService.getPostElementsURL).toBeDefined(); + expect(URLService.handleHttpStatus).toBeDefined(); + expect(URLService.getSitesURL).toBeDefined(); + expect(URLService.getElementSearchURL).toBeDefined(); + expect(URLService.getImageURL).toBeDefined(); + expect(URLService.getProductSnapshotsURL).toBeDefined(); + expect(URLService.getConfigSnapshotsURL).toBeDefined(); + expect(URLService.getSiteProductsURL).toBeDefined(); + expect(URLService.getConfigURL).toBeDefined(); + expect(URLService.getSiteConfigsURL).toBeDefined(); + expect(URLService.getConfigProductsURL).toBeDefined(); + expect(URLService.getViewElementsURL).toBeDefined(); + })); + + it('getConfigSnapshotsURL', inject(function() { + + expectedReturn = root + '/workspaces/master/sites/ems/configurations/configId/snapshots'; + expect(URLService.getConfigSnapshotsURL('configId', 'ems', 'master')).toEqual(expectedReturn); + })); + + it('getProductSnapshotsURL', inject(function() { + expectedReturn = root + '/workspaces/master/sites/ems/products/productId/snapshots'; + expect(URLService.getProductSnapshotsURL('productId', 'ems', 'master')).toEqual(expectedReturn) + })); + + it('getSiteConfigsURL', inject(function() { + expectedReturn = root + '/workspaces/master/sites/ems/configurations'; + expect(URLService.getSiteConfigsURL('ems', 'master')).toEqual(expectedReturn); + })); + + it('getConfigProductsURL', inject(function() { + expectedReturn = root + '/workspaces/master/sites/ems/configurations/configId/products'; + expect(URLService.getConfigProductsURL('configId', 'ems', 'master')).toEqual(expectedReturn); + })); + + it('getConfigURL', inject(function() { + expectedReturn = root + '/workspaces/master/sites/ems/configurations/configId'; + expect(URLService.getConfigURL('configId', 'ems', 'master')).toEqual(expectedReturn); + })); + + it('getSiteProductsURL', inject(function() { + expectedReturn = root + '/workspaces/master/sites/ems/products'; + expect(URLService.getSiteProductsURL('ems', 'master')).toEqual(expectedReturn); + })); + + it('getImageURL', inject(function() { + expectedReturn = root + '/workspaces/master/artifacts/artifactId'; + + // latest + expect(URLService.getImageURL('artifactId', 'master', 'latest')).toEqual(expectedReturn); + + // timestamp + expectedReturn += '?timestamp=01-01-2014'; + expect(URLService.getImageURL('artifactId', 'master', '01-01-2014')).toEqual(expectedReturn); + + // version + expectedReturn = root + '/workspaces/master/artifacts/artifactId/versions/versionId'; + expect(URLService.getImageURL('artifactId', 'master', 'versionId')).toEqual(expectedReturn); + })); + + it('getSiteDashboardURL', inject(function() { + expectedReturn = '/share/page/site/ems/dashboard'; + expect(URLService.getSiteDashboardURL('ems')).toBe(expectedReturn); + })); + + it('getElementURL', inject(function() { + + expectedReturn = root + '/workspaces/master/elements/elementId'; + + // latest + expect(URLService.getElementURL('elementId', 'master', 'latest')).toBe(expectedReturn); + + // timestamp + expectedReturn += '?timestamp=01-01-2014'; + expect(URLService.getElementURL('elementId', 'master', '01-01-2014')).toBe(expectedReturn); + + // version + expectedReturn = root + '/workspaces/master/elements/elementId/versions/versionId'; + expect(URLService.getElementURL('elementId', 'master', 'versionId')).toBe(expectedReturn); + })); + + // !-- NOTE: this function uses old API web services --! + // !-- NOTE: his function takes versionId as a parameter, however, + // the urls it is calling on do not exist --! + it('getViewElementsURL', inject(function() { + expectedReturn = root + '/workspaces/master/views/viewId/elements'; + + // latest + expect(URLService.getViewElementsURL('viewId', 'master', 'latest')).toEqual(expectedReturn); + + // timestamp + expectedReturn += '?timestamp=01-01-2014'; + expect(URLService.getViewElementsURL('viewId', 'master', '01-01-2014')).toEqual(expectedReturn); + + // version + expectedReturn = root + '/workspaces/master/views/viewId/versions/versionId'; + expect(URLService.getViewElementsURL('viewId', 'master', 'versionId')).toEqual(expectedReturn); + })); + + // !-- NOTE: this function uses old API web services --! + it('getElementVersionsURL', inject(function() { + expectedReturn = root + '/workspaces/master/elements/elementId/versions'; + + expect(URLService.getElementVersionsURL('elementId', 'master')).toEqual(expectedReturn); + })); + + it('getPostElementsURL', inject(function() { + var expectedReturn = root + '/workspaces/master/elements'; + expect(URLService.getPostElementsURL('master')).toEqual(expectedReturn); + })); + + it('handleHttpStatus', inject(function() { + + // 404 + var deferred = $q.defer(); + URLService.handleHttpStatus( {}, 404, undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(404); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Not Found'); + }); + $rootScope.$apply(); + + // 500 + deferred = $q.defer(); + URLService.handleHttpStatus( {}, 500, undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(500); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Server Error'); + }); + $rootScope.$apply(); + + // 401 || 403 + deferred = $q.defer(); + URLService.handleHttpStatus( {}, 401, undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(401); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Permission Error'); + }); + $rootScope.$apply(); + + deferred = $q.defer(); + URLService.handleHttpStatus( {}, 403, undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(403); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Permission Error'); + }); + $rootScope.$apply(); + + // 409 + deferred = $q.defer(); + URLService.handleHttpStatus( {}, 409, undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(409); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Conflict'); + }); + $rootScope.$apply(); + + // else + deferred = $q.defer(); + URLService.handleHttpStatus( {}, 600, undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(600); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Failed'); + }); + $rootScope.$apply(); + + deferred = $q.defer(); + URLService.handleHttpStatus( {}, 'string', undefined, undefined, deferred ); + deferred.promise.then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual('string'); + expect(failMessage.data).toEqual( {} ); + expect(failMessage.message).toEqual('Failed'); + }); + $rootScope.$apply(); + })); + + it('getSitesURL', inject(function() { + var expectedReturn = root + '/rest/sites'; + expect(URLService.getSitesURL()).toEqual(expectedReturn); + })); + + // !-- NOTE: this function uses old API web services --! + // !-- NOTE: this function may be removed --! + it('getElementSearchURL', inject(function() { + var query = 'queryKeyword'; + expectedReturn = root + '/javawebscripts/element/search?keyword=muschek'; + expect(URLService.getElementSearchURL('muschek', 'master')).toBe(expectedReturn); + })); + + // Private methods: isTimestamp, addVersion, handleHttpStatus + // Not tested +}); \ No newline at end of file diff --git a/test/archive/ServiceSpecs/old.utilsServiceSpec.js b/test/archive/ServiceSpecs/old.utilsServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.versionServiceSpec.js b/test/archive/ServiceSpecs/old.versionServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/archive/ServiceSpecs/old.viewServiceSpec.js b/test/archive/ServiceSpecs/old.viewServiceSpec.js old mode 100644 new mode 100755 index 233aeb079..2d090035a --- a/test/archive/ServiceSpecs/old.viewServiceSpec.js +++ b/test/archive/ServiceSpecs/old.viewServiceSpec.js @@ -1,592 +1,311 @@ -'use strict' +'use strict'; // ViewService - done, 18 methods, [5 ElemeServ, 4 empty, 9 tested], expect 3 to fail -describe('ViewService', function () { - beforeEach(module('mms')) - - var root = '/alfresco/service' - var forceFail - var ViewService, $httpBackend, $rootScope - - beforeEach(inject(function ($injector) { - ViewService = $injector.get('ViewService') - $httpBackend = $injector.get('$httpBackend') - $rootScope = $injector.get('$rootScope') - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/views/12345/elements?timestamp=01-01-2014' - ) - .respond({ - elements: [ - { - author: 'muschek', - name: "view's element", - sysmlid: 12346, - owner: 12345, - lastModified: '01-01-2014', - }, - { - author: 'muschek', - name: "view's 2nd element", - sysmlid: 12347, - owner: 12345, - lastModified: '01-01-2014', - }, - ], - }) - $httpBackend - .whenGET('/alfresco/service/workspaces/master/views/12345/elements') - .respond({ - elements: [ - { - author: 'muschek', - name: "view's element", - sysmlid: 12346, - owner: 12345, - lastModified: '07-28-2014', - }, - { - author: 'muschek', - name: "view's 2nd element", - sysmlid: 12347, - owner: 12345, - lastModified: '07-28-2014', - }, - ], - }) - - $httpBackend - .whenGET( - root + - '/workspaces/master/sites/siteId/products/54321/views?timestamp=01-01-2014' - ) - .respond({ - elements: [ - { - author: 'muschek', - name: 'doc view', - owner: 54321, - sysmlid: 54322, - lastModified: '01-01-2014', - }, - ], - }) - $httpBackend - .whenGET( - root + '/workspaces/master/sites/siteId/products/65432/views' - ) - .respond({ - elements: [ - { - author: 'muschek', - name: 'other id view', - owner: 65432, - sysmlid: 65433, - lastModified: '07-28-2014', - }, - ], - }) - - $httpBackend - .whenGET(root + '/workspaces/master/elements/badId') - .respond(function (method, url) { - var warning = - '[ERROR]: Element with id, badId not found\n[WARNING]: No elements found' - return [404, warning] - }) - $httpBackend - .whenGET(root + '/workspaces/master/elements/noSpecDocId') - .respond({ - elements: [ - { - author: 'muschek', - name: 'doc with no spec', - sysmlid: 'noSpecDocId', - }, - ], - }) - $httpBackend - .whenGET(root + '/workspaces/master/elements/emptyView2ViewDocId') - .respond({ - elements: [ - { - author: 'muschek', - name: 'doc with empty view2view', - sysmlid: 'emptyView2ViewDocId', - specialization: { - type: 'Product', - view2view: [], - noSections: [], - }, - }, - ], - }) - $httpBackend - .whenGET(root + '/workspaces/master/elements/noIdMatchDocId') - .respond({ - elements: [ - { - author: 'muschek', - name: 'do with non-empty view2view but no id match', - sysmlid: 'noIdMatchDocId', - specialization: { - type: 'Product', - view2view: [ - { id: 'notMatchingId', childrenViews: [] }, - ], - }, - }, - ], - }) - $httpBackend - .whenGET(root + '/workspaces/master/elements/idMatchDocId') - .respond({ - elements: [ - { - name: 'doc with matching id', - sysmlid: 'idMatchDocId', - specialization: { - type: 'Product', - view2view: [ - { id: 'nonMatchId', childrenViews: [] }, - { id: 'parentViewId', childrenViews: [] }, - ], - }, - }, - ], - }) - - $httpBackend - .when('POST', root + '/workspaces/master/elements') - .respond(function (method, url, data) { - var json = JSON.parse(data) - - if (!json.elements[0].sysmlid) { - json.elements[0].sysmlid = json.elements[0].name + 'Id' - } - - return [200, json] - }) - - $httpBackend - .whenGET(root + '/workspaces/master/sites/ems/products') - .respond(function (method, url, data) { - if (forceFail) { - return [500, 'Internal Server Error'] - } else { - var products = { - products: [ - { - id: 'productId', - name: 'Product Name', - snapshots: [ - { - created: '01-01-2014', - creator: 'muschek', - id: 'snapshotId', - }, - ], - }, - ], - } - return [200, products] - } - }) - })) - - it('can get an instance of the ViewService and methods are valid', inject(function () { - expect(ViewService).toBeDefined() - - expect(ViewService.getView).not.toBe(null) - expect(ViewService.getViews).not.toBe(null) - expect(ViewService.getDocument).not.toBe(null) - expect(ViewService.updateView).not.toBe(null) - expect(ViewService.updateDocument).not.toBe(null) - expect(ViewService.getViewDatas).not.toBe(null) - expect(ViewService.getViewComments).not.toBe(null) - expect(ViewService.addViewComment).not.toBe(null) - expect(ViewService.deleteViewComment).not.toBe(null) - expect(ViewService.updateViewDatas).not.toBe(null) - expect(ViewService.createView).not.toBe(null) - expect(ViewService.addViewToDocument).not.toBe(null) - expect(ViewService.getSiteDocuments).not.toBe(null) - expect(ViewService.setCurrentViewId).not.toBe(null) - expect(ViewService.setCurrentDocumentId).not.toBe(null) - expect(ViewService.getCurrentViewId).not.toBe(null) - expect(ViewService.getCurrentDocumentId).not.toBe(null) - })) - - // done, just calls ElementService - it('getView', inject(function () {})) - - // done, just calls ElementService - it('getViews', inject(function () {})) - - // done, just calls ElementService - it('getDocument', inject(function () {})) - - // done, just calls ElementService - it('updateView', inject(function () {})) - - // done, just calls ElementService - it('updateDocument', inject(function () {})) - - // !-- NOTE: uses old web services API --! - // !-- NOTE: also loses track of version when retrieving from server --! - // done, expected to fail - it('getViewDatas', inject(function () { - // (!ViewDatas.hasOwnProperty(ver) && * && *), fail - ViewService.getViewDatas('badId', false, 'master', '01-01-2014').then( - function (response) { - console.log('This should not be displayed') - }, - function (failMes) { - expect(failMes.status).toEqual(200) - } - ) - - // (!ViewDatas.hasOwnProperty(ver) && * && *), success, !ViewDatas.hasOwnProperty(ver) - ViewService.getViewDatas('12345', false, 'master', '01-01-2014').then( - function (response) { - expect(response.length).toEqual(2) - expect(response[0]).toEqual({ - author: 'muschek', - name: "view's element", - sysmlid: 12346, - owner: 12345, - lastModified: '01-01-2014', - }) - expect(response[1]).toEqual({ - author: 'muschek', - name: "view's 2nd element", - sysmlid: 12347, - owner: 12345, - lastModified: '01-01-2014', - }) - } - ) - $httpBackend.flush() - // ViewDatas['01-01-2014']['12345'] now exists - - // (ViewDatas.hasOwnProperty(ver) && !ViewDatas[ver].hasOwnProperty(id) && *), success, - // ViewDatas.hasOwnProperty(ver) - ViewService.getViewDatas('12345', false, 'master', 'latest').then( - function (response) { - expect(response.length).toEqual(2) - expect(response[0]).toEqual({ - author: 'muschek', - name: "view's element", - sysmlid: 12346, - owner: 12345, - lastModified: '07-28-2014', - }) - expect(response[1]).toEqual({ - author: 'muschek', - name: "view's 2nd element", - sysmlid: 12347, - owner: 12345, - lastModified: '07-28-2014', - }) - } - ) - $httpBackend.flush() - // ViewDatas['latest']['12345'] now exists - - // (ViewDatas.hasOwnProperty(ver) && ViewDatas[ver].hasOwnProperty(id) && !update) - ViewService.getViewDatas('12345', false, 'master', '01-01-2014').then( - function (response) { - expect(response.length).toEqual(2) - expect(response[0]).toEqual({ - author: 'muschek', - name: "view's element", - sysmlid: 12346, - owner: 12345, - lastModified: '01-01-2014', - }) - expect(response[1]).toEqual({ - author: 'muschek', - name: "view's 2nd element", - sysmlid: 12347, - owner: 12345, - lastModified: '01-01-2014', - }) - } - ) - $rootScope.$apply() - - // (ViewDatas.hasOwnProperty(ver) && ViewDatas[ver].hasOwnProperty(id) && update), - // success, ViewDatas.hasOwnProperty(ver) - ViewService.getViewDatas('12345', true, 'master', 'latest').then( - function (response) { - expect(response.length).toEqual(2) - expect(response[0]).toEqual({ - author: 'muschek', - name: "view's element", - sysmlid: 12346, - owner: 12345, - lastModified: '07-28-2014', - }) - expect(response[1]).toEqual({ - author: 'muschek', - name: "view's 2nd element", - sysmlid: 12347, - owner: 12345, - lastModified: '07-28-2014', - }) - } - ) - })) - - // done, empty - it('getViewComments', inject(function () {})) - - // done, empty - it('addViewComment', inject(function () {})) - - // done, empty - it('deleteViewComment', inject(function () {})) - - // done, empty - it('updateViewDatas', inject(function () {})) - - // done - it('addViewToDocument', inject(function () { - // fail - ViewService.addViewToDocument( - 'viewId', - 'badId', - 'parentViewId', - 'master' - ).then( - function (response) { - console.log('This should not be displayed') - }, - function (failMes) { - expect(failMes.status).toEqual(404) - expect(failMes.data).toEqual( - '[ERROR]: Element with id, badId not found\n[WARNING]: No elements found' - ) - } - ) - $httpBackend.flush() - - // success, data.specialization.view2view.length == 0, fail - - // success, data has no specialization - expect(function () { - ViewService.addViewToDocument( - 'viewId', - 'noSpecDocId', - 'parentViewId', - 'master' - ) - $httpBackend.flush() - }).toThrow(new Error('data.specialization is undefined')) - - // success, data.specialization.view2view.length == 0, success - ViewService.addViewToDocument( - 'viewId', - 'emptyView2ViewDocId', - 'parentViewId', - 'master' - ).then(function (response) { - expect(response.sysmlid).toEqual('emptyView2ViewDocId') - expect(response.specialization.view2view.length).not.toEqual(0) - expect(response.specialization.view2view[0]).toEqual({ - id: 'viewId', - childrenViews: [], - }) - }) - $httpBackend.flush() - - // success, data.specialization.view2view.length > 0, fail - - // success, data.specialization.view2view.length > 0, no id match, success - ViewService.addViewToDocument( - 'viewId', - 'noIdMatchDocId', - 'parentViewId', - 'master' - ).then(function (response) { - expect(response.sysmlid).toEqual('noIdMatchDocId') - expect(response.specialization.view2view.length).toEqual(2) - expect(response.specialization.view2view[0]).toEqual({ - id: 'notMatchingId', - childrenViews: [], - }) - expect(response.specialization.view2view[1]).toEqual({ - id: 'viewId', - childrenViews: [], - }) - }) - $httpBackend.flush() - - // success, data.specialization.view2vivew.length > 0, id match, success - ViewService.addViewToDocument( - 'viewId', - 'idMatchDocId', - 'parentViewId', - 'master' - ).then(function (response) { - expect(response.sysmlid).toEqual('idMatchDocId') - expect(response.specialization.view2view.length).toEqual(3) - expect(response.specialization.view2view[0]).toEqual({ - id: 'nonMatchId', - childrenViews: [], - }) - expect(response.specialization.view2view[1]).toEqual({ - id: 'parentViewId', - childrenViews: ['viewId'], - }) - expect(response.specialization.view2view[2]).toEqual({ - id: 'viewId', - childrenViews: [], - }) - }) - $httpBackend.flush() - })) - - // !-- NOTE: due to how ElementService.updateElement works the new view's owner property will be deleted --! - // Test cases assume that ElementService's method both pass correctly - // done - expect this to fail - it('createView', inject(function () { - // createElement - pass, updateElement - pass, !documentId - ViewService.createView('ownerId', undefined, undefined, 'master').then( - function (response) { - expect(response.owner).toEqual('ownerId') - expect(response.name).toEqual('Untitled View') - expect(response.documentation).toEqual('') - expect(response.specialization.type).toEqual('View') - expect(response.specialization.contains).toEqual([ - { - type: 'Paragraph', - sourceType: 'reference', - source: response.sysmlid, - sourceProperty: 'documentation', - }, - ]) - expect(response.specialization.allowedElements).toEqual([ - response.sysmlid, - ]) - expect(response.specialization.displayedElements).toEqual([ - response.sysmlid, - ]) - expect(response.specialization.childrenViews).toEqual([]) - } - ) - $httpBackend.flush() - - // createElement - pass, updateElement - pass, documentId, addViewToDoc - fail - - // createElement - pass, updateElement - pass, documentId, addViewToDoc - pass - ViewService.createView( - 'ownerId', - 'name', - 'idMatchDocId', - 'master' - ).then(function (response) { - expect(response.owner).toEqual('ownerId') - expect(response.name).toEqual('name') - expect(response.documentation).toEqual('') - expect(response.specialization.type).toEqual('View') - expect(response.specialization.contains).toEqual([ - { - type: 'Paragraph', - sourceType: 'reference', - source: response.sysmlid, - sourceProperty: 'documentation', - }, - ]) - expect(response.specialization.allowedElements).toEqual([ - response.sysmlid, - ]) - expect(response.specialization.displayedElements).toEqual([ - response.sysmlid, - ]) - expect(response.specialization.childrenViews).toEqual([]) - }) - $httpBackend.flush() - })) - - // done - it('getSiteDocuments', inject(function () { - // !(siteDocuments.hasOwnProperty(site) && !update), getGenericElements - fail - forceFail = true - ViewService.getSiteDocuments('ems', undefined, undefined).then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(500) - expect(failMessage.data).toEqual('Internal Server Error') - } - ) - $httpBackend.flush() - forceFail = false - - // !(siteDocuments.hasOwnProperty(site) && !update), getGenericElements - pass - ViewService.getSiteDocuments('ems', undefined, undefined).then( - function (response) { - expect(response.length).toEqual(1) - - expect(response[0].id).toEqual('productId') - expect(response[0].name).toEqual('Product Name') - - expect(response[0].snapshots.length).toEqual(1) - expect(response[0].snapshots[0]).toEqual({ - created: '01-01-2014', - creator: 'muschek', - id: 'snapshotId', - }) - } - ) - $httpBackend.flush() - - // (siteDocuments.hasOwnProperty(site) && !update) - ViewService.getSiteDocuments('ems', false, undefined).then(function ( - response - ) { - expect(response.length).toEqual(1) - - expect(response[0].id).toEqual('productId') - expect(response[0].name).toEqual('Product Name') - - expect(response[0].snapshots.length).toEqual(1) - expect(response[0].snapshots[0]).toEqual({ - created: '01-01-2014', - creator: 'muschek', - id: 'snapshotId', - }) - }) - $rootScope.$apply() - })) - - // done - it('getCurrentViewId', inject(function () { - expect(ViewService.getCurrentViewId()).toBe('') - - ViewService.setCurrentViewId('newViewId') - expect(ViewService.getCurrentViewId()).toBe('newViewId') - })) - - // done - it('setCurrentViewId', inject(function () { - ViewService.setCurrentViewId('newViewId') - expect(ViewService.getCurrentViewId()).toBe('newViewId') - })) - - // done - it('getCurrentDocumentId', inject(function () { - expect(ViewService.getCurrentDocumentId()).toBe('') - - ViewService.setCurrentDocumentId('newDocumentId') - expect(ViewService.getCurrentDocumentId()).toBe('newDocumentId') - })) - - // done - it('setCurrentDocumentId', inject(function () { - ViewService.setCurrentDocumentId('newDocumentId') - expect(ViewService.getCurrentDocumentId()).toBe('newDocumentId') - })) -}) +describe('ViewService', function() { + beforeEach(module('mms')); + + var root = '/alfresco/service'; + var forceFail; + var ViewService, $httpBackend, $rootScope; + + beforeEach(inject(function($injector) { + ViewService = $injector.get('ViewService'); + $httpBackend = $injector.get('$httpBackend'); + $rootScope = $injector.get('$rootScope'); + + $httpBackend.whenGET('/alfresco/service/workspaces/master/views/12345/elements?timestamp=01-01-2014').respond( + {elements: [{author:'muschek', name:'view\'s element', sysmlid:12346, owner:12345, lastModified:'01-01-2014'}, + {author:'muschek', name:'view\'s 2nd element', sysmlid:12347, owner:12345, lastModified:'01-01-2014'}]}); + $httpBackend.whenGET('/alfresco/service/workspaces/master/views/12345/elements').respond({elements:[ + {author:'muschek', name:'view\'s element', sysmlid:12346, owner:12345, lastModified:'07-28-2014'}, + {author:'muschek', name:'view\'s 2nd element', sysmlid:12347, owner:12345, lastModified:'07-28-2014'}]}); + + $httpBackend.whenGET(root + '/workspaces/master/sites/siteId/products/54321/views?timestamp=01-01-2014').respond( + {elements:[{author:'muschek', name:'doc view', owner:54321, sysmlid:54322, lastModified:'01-01-2014'}]}); + $httpBackend.whenGET(root + '/workspaces/master/sites/siteId/products/65432/views').respond( + {elements: [{author:'muschek', name:'other id view', owner:65432, sysmlid:65433, lastModified:'07-28-2014'}]}); + + $httpBackend.whenGET(root + '/workspaces/master/elements/badId').respond(function(method, url) { + var warning = '[ERROR]: Element with id, badId not found\n[WARNING]: No elements found'; + return [404, warning]; + }); + $httpBackend.whenGET(root + '/workspaces/master/elements/noSpecDocId').respond( + {elements: [{author:'muschek', name:'doc with no spec', sysmlid:'noSpecDocId'}]}); + $httpBackend.whenGET(root + '/workspaces/master/elements/emptyView2ViewDocId').respond( + {elements: [{author:'muschek', name:'doc with empty view2view', sysmlid:'emptyView2ViewDocId', + specialization: {type:'Product', view2view:[], noSections:[]} + }]}); + $httpBackend.whenGET(root + '/workspaces/master/elements/noIdMatchDocId').respond( + {elements: [{author:'muschek', name:'do with non-empty view2view but no id match', + sysmlid:'noIdMatchDocId', specialization:{type:'Product', + view2view:[{id:'notMatchingId', childrenViews:[]}]}}]}); + $httpBackend.whenGET(root + '/workspaces/master/elements/idMatchDocId').respond( + {elements: [{name:'doc with matching id', sysmlid:'idMatchDocId', specialization:{type:'Product', + view2view:[{id:'nonMatchId', childrenViews:[]}, {id:'parentViewId', childrenViews:[]}]}}]}); + + $httpBackend.when('POST', root + '/workspaces/master/elements').respond(function(method, url, data) { + + var json = JSON.parse(data); + + if (!json.elements[0].sysmlid) { + json.elements[0].sysmlid = json.elements[0].name + 'Id'; + } + + return [200, json]; + }); + + $httpBackend.whenGET(root + '/workspaces/master/sites/ems/products').respond(function(method, url, data) { + if (forceFail) { return [500, 'Internal Server Error']; } + else { + var products = { products: [ { id: 'productId', name: 'Product Name', snapshots: [ { created: '01-01-2014', creator: 'muschek', + id: 'snapshotId' } ] } ] }; + return [200, products]; + } + }); + })); + + it('can get an instance of the ViewService and methods are valid', inject(function() { + expect(ViewService).toBeDefined(); + + expect(ViewService.getView).not.toBe(null); + expect(ViewService.getViews).not.toBe(null); + expect(ViewService.getDocument).not.toBe(null); + expect(ViewService.updateView).not.toBe(null); + expect(ViewService.updateDocument).not.toBe(null); + expect(ViewService.getViewElements).not.toBe(null); + expect(ViewService.getViewComments).not.toBe(null); + expect(ViewService.addViewComment).not.toBe(null); + expect(ViewService.deleteViewComment).not.toBe(null); + expect(ViewService.updateViewElements).not.toBe(null); + expect(ViewService.createView).not.toBe(null); + expect(ViewService.addViewToDocument).not.toBe(null); + expect(ViewService.getSiteDocuments).not.toBe(null); + expect(ViewService.setCurrentViewId).not.toBe(null); + expect(ViewService.setCurrentDocumentId).not.toBe(null); + expect(ViewService.getCurrentViewId).not.toBe(null); + expect(ViewService.getCurrentDocumentId).not.toBe(null); + })); + + // done, just calls ElementService + it('getView', inject(function() { + })); + + // done, just calls ElementService + it('getViews', inject(function() { + })); + + // done, just calls ElementService + it('getDocument', inject(function() { + })); + + // done, just calls ElementService + it('updateView', inject(function() { + })); + + // done, just calls ElementService + it('updateDocument', inject(function() { + })); + + // !-- NOTE: uses old web services API --! + // !-- NOTE: also loses track of version when retrieving from server --! + // done, expected to fail + it('getViewElements', inject(function() { + // (!viewElements.hasOwnProperty(ver) && * && *), fail + ViewService.getViewElements('badId', false, 'master', '01-01-2014').then(function(response) { + console.log('This should not be displayed'); + }, function(failMes) { + expect(failMes.status).toEqual(200); + }); + + // (!viewElements.hasOwnProperty(ver) && * && *), success, !viewElements.hasOwnProperty(ver) + ViewService.getViewElements('12345', false, 'master', '01-01-2014').then(function(response) { + expect(response.length).toEqual(2); + expect(response[0]).toEqual({author:'muschek', name:'view\'s element', sysmlid:12346, owner:12345, lastModified:'01-01-2014'}); + expect(response[1]).toEqual({author:'muschek', name:'view\'s 2nd element', sysmlid:12347, owner:12345, lastModified:'01-01-2014'}); + }); $httpBackend.flush(); + // viewElements['01-01-2014']['12345'] now exists + + // (viewElements.hasOwnProperty(ver) && !viewElements[ver].hasOwnProperty(id) && *), success, + // viewElements.hasOwnProperty(ver) + ViewService.getViewElements('12345', false, 'master', 'latest').then(function(response) { + expect(response.length).toEqual(2); + expect(response[0]).toEqual({author:'muschek', name:'view\'s element', sysmlid:12346, owner:12345, lastModified:'07-28-2014'}); + expect(response[1]).toEqual({author:'muschek', name:'view\'s 2nd element', sysmlid:12347, owner:12345, lastModified:'07-28-2014'}); + }); $httpBackend.flush(); + // viewElements['latest']['12345'] now exists + + // (viewElements.hasOwnProperty(ver) && viewElements[ver].hasOwnProperty(id) && !update) + ViewService.getViewElements('12345', false, 'master', '01-01-2014').then(function(response) { + expect(response.length).toEqual(2); + expect(response[0]).toEqual({author:'muschek', name:'view\'s element', sysmlid:12346, owner:12345, lastModified:'01-01-2014'}); + expect(response[1]).toEqual({author:'muschek', name:'view\'s 2nd element', sysmlid:12347, owner:12345, lastModified:'01-01-2014'}); + }); $rootScope.$apply(); + + // (viewElements.hasOwnProperty(ver) && viewElements[ver].hasOwnProperty(id) && update), + // success, viewElements.hasOwnProperty(ver) + ViewService.getViewElements('12345', true, 'master', 'latest').then(function(response) { + expect(response.length).toEqual(2); + expect(response[0]).toEqual({author:'muschek', name:'view\'s element', sysmlid:12346, owner:12345, lastModified:'07-28-2014'}); + expect(response[1]).toEqual({author:'muschek', name:'view\'s 2nd element', sysmlid:12347, owner:12345, lastModified:'07-28-2014'}); + }); + })); + + // done, empty + it('getViewComments', inject(function() {})); + + // done, empty + it('addViewComment', inject(function() {})); + + // done, empty + it('deleteViewComment', inject(function() {})); + + // done, empty + it('updateViewElements', inject(function() {})); + + // done + it('addViewToDocument', inject(function() { + // fail + ViewService.addViewToDocument('viewId', 'badId', 'parentViewId', 'master').then(function(response) { + console.log('This should not be displayed'); + }, function(failMes) { + expect(failMes.status).toEqual(404); + expect(failMes.data).toEqual('[ERROR]: Element with id, badId not found\n[WARNING]: No elements found'); + }); $httpBackend.flush(); + + // success, data.specialization.view2view.length == 0, fail + + // success, data has no specialization + expect(function() { + ViewService.addViewToDocument('viewId', 'noSpecDocId', 'parentViewId', 'master'); + $httpBackend.flush(); + }).toThrow(new Error('data.specialization is undefined')); + + // success, data.specialization.view2view.length == 0, success + ViewService.addViewToDocument('viewId', 'emptyView2ViewDocId', 'parentViewId', 'master') + .then(function(response) { + expect(response.sysmlid).toEqual('emptyView2ViewDocId'); + expect(response.specialization.view2view.length).not.toEqual(0); + expect(response.specialization.view2view[0]).toEqual({id: 'viewId', childrenViews:[]}); + }); $httpBackend.flush(); + + // success, data.specialization.view2view.length > 0, fail + + // success, data.specialization.view2view.length > 0, no id match, success + ViewService.addViewToDocument('viewId', 'noIdMatchDocId', 'parentViewId', 'master') + .then(function(response) { + expect(response.sysmlid).toEqual('noIdMatchDocId'); + expect(response.specialization.view2view.length).toEqual(2); + expect(response.specialization.view2view[0]).toEqual({id:'notMatchingId', childrenViews:[]}); + expect(response.specialization.view2view[1]).toEqual({id: 'viewId', childrenViews:[]}); + }); $httpBackend.flush(); + + // success, data.specialization.view2vivew.length > 0, id match, success + ViewService.addViewToDocument('viewId', 'idMatchDocId', 'parentViewId', 'master') + .then(function(response) { + expect(response.sysmlid).toEqual('idMatchDocId'); + expect(response.specialization.view2view.length).toEqual(3); + expect(response.specialization.view2view[0]).toEqual({id: 'nonMatchId', childrenViews:[]}); + expect(response.specialization.view2view[1]).toEqual({id: 'parentViewId', childrenViews:['viewId']}); + expect(response.specialization.view2view[2]).toEqual({id: 'viewId', childrenViews:[]}); + }); $httpBackend.flush(); + })); + + // !-- NOTE: due to how ElementService.updateElement works the new view's owner property will be deleted --! + // Test cases assume that ElementService's method both pass correctly + // done - expect this to fail + it('createView', inject(function() { + + // createElement - pass, updateElement - pass, !documentId + ViewService.createView('ownerId', undefined, undefined, 'master').then(function(response) { + expect(response.owner).toEqual('ownerId'); + expect(response.name).toEqual('Untitled View'); + expect(response.documentation).toEqual(''); + expect(response.specialization.type).toEqual('View'); + expect(response.specialization.contains).toEqual([{type:'Paragraph', sourceType:'reference', + source: response.sysmlid, sourceProperty:'documentation'}]); + expect(response.specialization.allowedElements).toEqual([response.sysmlid]); + expect(response.specialization.displayedElements).toEqual([response.sysmlid]); + expect(response.specialization.childrenViews).toEqual([]); + }); $httpBackend.flush(); + + // createElement - pass, updateElement - pass, documentId, addViewToDoc - fail + + // createElement - pass, updateElement - pass, documentId, addViewToDoc - pass + ViewService.createView('ownerId', 'name', 'idMatchDocId', 'master').then(function(response) { + expect(response.owner).toEqual('ownerId'); + expect(response.name).toEqual('name'); + expect(response.documentation).toEqual(''); + expect(response.specialization.type).toEqual('View'); + expect(response.specialization.contains).toEqual([{type:'Paragraph', sourceType:'reference', + source: response.sysmlid, sourceProperty:'documentation'}]); + expect(response.specialization.allowedElements).toEqual([response.sysmlid]); + expect(response.specialization.displayedElements).toEqual([response.sysmlid]); + expect(response.specialization.childrenViews).toEqual([]); + }); $httpBackend.flush(); + + })); + + // done + it('getSiteDocuments', inject(function() { + + // !(siteDocuments.hasOwnProperty(site) && !update), getGenericElements - fail + forceFail = true; + ViewService.getSiteDocuments('ems', undefined, undefined).then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(500); + expect(failMessage.data).toEqual('Internal Server Error'); + }); + $httpBackend.flush(); + forceFail = false; + + // !(siteDocuments.hasOwnProperty(site) && !update), getGenericElements - pass + ViewService.getSiteDocuments('ems', undefined, undefined).then(function(response) { + expect(response.length).toEqual(1); + + expect(response[0].id).toEqual('productId'); + expect(response[0].name).toEqual('Product Name'); + + expect(response[0].snapshots.length).toEqual(1); + expect(response[0].snapshots[0]).toEqual( { created: '01-01-2014', creator: 'muschek', id: 'snapshotId' } ); + }); $httpBackend.flush(); + + // (siteDocuments.hasOwnProperty(site) && !update) + ViewService.getSiteDocuments('ems', false, undefined).then(function(response) { + expect(response.length).toEqual(1); + + expect(response[0].id).toEqual('productId'); + expect(response[0].name).toEqual('Product Name'); + + expect(response[0].snapshots.length).toEqual(1); + expect(response[0].snapshots[0]).toEqual( { created: '01-01-2014', creator: 'muschek', id: 'snapshotId' } ); + }); $rootScope.$apply(); + })); + + // done + it('getCurrentViewId', inject(function() { + expect(ViewService.getCurrentViewId()).toBe(''); + + ViewService.setCurrentViewId('newViewId'); + expect(ViewService.getCurrentViewId()).toBe('newViewId'); + })); + + // done + it('setCurrentViewId', inject(function() { + ViewService.setCurrentViewId('newViewId'); + expect(ViewService.getCurrentViewId()).toBe('newViewId'); + })); + + // done + it('getCurrentDocumentId', inject(function() { + expect(ViewService.getCurrentDocumentId()).toBe(''); + + ViewService.setCurrentDocumentId('newDocumentId'); + expect(ViewService.getCurrentDocumentId()).toBe('newDocumentId'); + })); + + // done + it('setCurrentDocumentId', inject(function() { + ViewService.setCurrentDocumentId('newDocumentId'); + expect(ViewService.getCurrentDocumentId()).toBe('newDocumentId'); + })); +}); \ No newline at end of file diff --git a/test/archive/ServiceSpecs/old.vizServiceSpec.js b/test/archive/ServiceSpecs/old.vizServiceSpec.js old mode 100644 new mode 100755 index 15165bff0..861a567e2 --- a/test/archive/ServiceSpecs/old.vizServiceSpec.js +++ b/test/archive/ServiceSpecs/old.vizServiceSpec.js @@ -1,316 +1,173 @@ -'use strict' +'use strict'; -// !-- NOTE: if more than one artifact is received then it will only accept +// !-- NOTE: if more than one artifact is received then it will only accept // the first one --! // !-- NOTE: timestamp-ing is done incorrectly --! -// VizService - done, 1 method, expect 1 to fail -describe('VizService', function () { - beforeEach(module('mms')) - - var forceFail, forceEmpty - var VizService, $httpBackend, $rootScope - - beforeEach(inject(function ($injector) { - VizService = $injector.get('VizService') - $httpBackend = $injector.get('$httpBackend') - $rootScope = $injector.get('$rootScope') - - forceFail = false - forceEmpty = false - - $httpBackend - .whenGET('/alfresco/service/workspaces/master/artifacts/artifactId') - .respond(function (method, url, data) { - if (forceFail) { - return [500, 'Internal Server Error'] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId1', - url: '/image/url/path/image.png', - }, - ], - } - return [200, artifacts] - } - }) - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/artifacts/artifactId2' - ) - .respond(function (method, url, data) { - if (forceEmpty) { - return [200, { artifacts: [] }] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId2', - url: '/image/url/path/image.gif', - }, - ], - } - return [200, artifacts] - } - }) - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/artifacts/artifactId3' - ) - .respond(function (method, url, data) { - if (forceEmpty) { - return [200, { artifacts: [] }] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId3', - url: '/image/url/path/image.jpg', - }, - { - id: 'imageId4', - url: '/image/url/path/image.svg', - }, - ], - } - return [200, artifacts] - } - }) - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/artifacts/artifactId4?timestamp=01-01-2014' - ) - .respond(function (method, url, data) { - if (forceFail) { - return [500, 'Internal Server Error'] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId1', - url: '/image/url/path/image.png', - }, - ], - } - return [200, artifacts] - } - }) - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/artifacts/artifactId5?timestamp=01-01-2014' - ) - .respond(function (method, url, data) { - if (forceEmpty) { - return [200, { artifacts: [] }] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId2', - url: '/image/url/path/image.gif', - }, - ], - } - return [200, artifacts] - } - }) - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/artifacts/artifactId6?timestamp=01-01-2014' - ) - .respond(function (method, url, data) { - if (forceEmpty) { - return [200, { artifacts: [] }] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId4', - url: '/image/url/path/image.svg', - }, - ], - } - return [200, artifacts] - } - }) - - $httpBackend - .whenGET( - '/alfresco/service/workspaces/master/artifacts/artifactId7/versions/version1' - ) - .respond(function (method, url, data) { - if (forceFail) { - return [500, 'Internal Server Error'] - } else { - var artifacts = { - artifacts: [ - { - id: 'imageId1', - url: '/image/url/path/image.png', - }, - ], - } - return [200, artifacts] - } - }) - })) - - it('can get an instance of the VizService and methods are valid', inject(function () { - expect(VizService).toBeDefined() - - expect(VizService.getImageURL).not.toBe(null) - })) - - // !-- NOTE: if more than one artifact is received then it will only accept - // the first one --! - // !-- NOTE: timestamp-ing is done incorrectly --! - // done, expect to fail - it('getImageURL', inject(function () { - // !(urls.hasOwnProperty(id)), !(URLService.isTimestamp(version)), $http.get -- fail - forceFail = true - VizService.getImageURL( - 'artifactId', - undefined, - undefined, - 'latest' - ).then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(500) - expect(failMessage.data).toEqual('Internal Server Error') - expect(failMessage.message).toEqual('Server Error') - } - ) - $httpBackend.flush() - forceFail = false - // urls['artifactId'] now exists - - // !(urls.hasOwnProperty(id)), !(URLService.isTimestamp(version)), $http.get -- pass, !(data.artifacts.length > 0) - forceEmpty = true - VizService.getImageURL( - 'artifactId2', - undefined, - undefined, - 'latest' - ).then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(200) - expect(failMessage.message).toEqual('Not Found') - } - ) - $httpBackend.flush() - forceEmpty = false - // urls['artifactId2'] now exists - - // !(urls.hasOwnProperty(id)), !(URLService.isTimestamp(version)), $http.get -- pass, (data.artifacts.length > 0) - VizService.getImageURL( - 'artifactId3', - undefined, - undefined, - 'latest' - ).then(function (response) { - expect(response).toEqual('/alfresco/image/url/path/image.jpg') - }) - $httpBackend.flush() - // urls['artifactId3']['latest'] now exists - - // !(urls.hasOwnProperty(id)), (URLService.isTimestamp(version)), $http.get -- fail - forceFail = true - VizService.getImageURL( - 'artifactId4', - undefined, - undefined, - '01-01-2014' - ).then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(500) - expect(failMessage.data).toEqual('Internal Server Error') - expect(failMessage.message).toEqual('Server Error') - } - ) - $httpBackend.flush() - forceFail = false - // urls['artifactId4'] now exists - - // !(urls.hasOwnProperty(id)), (URLService.isTimestamp(version)), $http.get -- pass, !(data.artifacts.length > 0) - forceEmpty = true - VizService.getImageURL( - 'artifactId5', - undefined, - undefined, - '01-01-2014' - ).then( - function (response) { - displayError() - }, - function (failMessage) { - expect(failMessage.status).toEqual(200) - expect(failMessage.message).toEqual('Not Found') - } - ) - $httpBackend.flush() - forceEmpty = false - // urls['artifactId5'] now exists - - // !(urls.hasOwnProperty(id)), (URLService.isTimestamp(version)), $http.get -- pass, (data.artifacts.length > 0) - VizService.getImageURL( - 'artifactId6', - undefined, - undefined, - '01-01-2014' - ).then(function (response) { - expect(response).toEqual('/alfresco/image/url/path/image.svg') - }) - $httpBackend.flush() - // urls['artifactId6']['01-01-2014'] now exists - - // Only need to have one with !(urls[id].hasOwnProperty(ver)) to show that it has no effect. - // (urls.hasOwnProperty(id)), !(urls[id].hasOwnProperty(ver)), !(URLService.isTimestamp(version)), - // $http.get -- pass, (data.artifacts.length > 0) - VizService.getImageURL( - 'artifactId7', - undefined, - undefined, - 'version1' - ).then(function (response) { - expect(response).toEqual('/alfresco/image/url/path/image.png') - }) - $httpBackend.flush() - // urls['artifactId7']['version1'] now exists - - // Only need to have one with !(version !== 'latest' || !update) to show that it has no effect. - // (urls.hasOwnProperty(id)), (urls[id].hasOwnProperty(ver)), !(version !== 'latest' || !update), - // !(URLService.isTimestamp(version)), $http.get -- pass, (data.artifacts.length > 0) - VizService.getImageURL('artifactId3', true, undefined, 'latest').then( - function (response) { - expect(response).toEqual('/alfresco/image/url/path/image.jpg') - } - ) - $httpBackend.flush() - - // (urls.hasOwnProperty(id)), (urls[id].hasOwnProperty(ver)), (version !== 'latest' || !update) - VizService.getImageURL( - 'artifactId6', - false, - undefined, - '01-01-2014' - ).then(function (response) { - expect(response).toEqual('/alfresco/image/url/path/image.svg') - }) - $rootScope.$apply() - })) -}) +// VizService - done,, 1 method, expect 1 to fail +describe('VizService', function() { + beforeEach(module('mms')); + + var forceFail, forceEmpty; + var VizService, $httpBackend, $rootScope; + + beforeEach(inject(function($injector) { + VizService = $injector.get('VizService'); + $httpBackend = $injector.get('$httpBackend'); + $rootScope = $injector.get('$rootScope'); + + forceFail = false; + forceEmpty = false; + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId').respond(function(method, url, data) { + if (forceFail) { return [500, 'Internal Server Error']; } + else { + var artifacts = { artifacts: [ { id: 'imageId1', url: '/image/url/path/image.png' } ] }; + return [200, artifacts]; + } + }); + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId2').respond(function(method, url, data) { + if (forceEmpty) { return [200, { artifacts: [ ] } ]; } + else { + var artifacts = { artifacts: [ { id: 'imageId2', url: '/image/url/path/image.gif' } ] }; + return [200, artifacts]; + } + }); + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId3').respond(function(method, url, data) { + if (forceEmpty) { return [200, { artifacts: [ ] } ]; } + else { + var artifacts = { artifacts: [ { id: 'imageId3', url: '/image/url/path/image.jpg' }, + { id: 'imageId4', url: '/image/url/path/image.svg' } ] }; + return [200, artifacts]; + } + }); + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId4?timestamp=01-01-2014').respond(function(method, url, data) { + if (forceFail) { return [500, 'Internal Server Error']; } + else { + var artifacts = { artifacts: [ { id: 'imageId1', url: '/image/url/path/image.png' } ] }; + return [200, artifacts]; + } + }); + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId5?timestamp=01-01-2014').respond(function(method, url, data) { + if (forceEmpty) { return [200, { artifacts: [ ] } ]; } + else { + var artifacts = { artifacts: [ { id: 'imageId2', url: '/image/url/path/image.gif' } ] }; + return [200, artifacts]; + } + }); + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId6?timestamp=01-01-2014').respond(function(method, url, data) { + if (forceEmpty) { return [200, { artifacts: [ ] } ]; } + else { + var artifacts = { artifacts: [ { id: 'imageId4', url: '/image/url/path/image.svg' } ] }; + return [200, artifacts]; + } + }); + + + $httpBackend.whenGET('/alfresco/service/workspaces/master/artifacts/artifactId7/versions/version1').respond(function(method, url, data) { + if (forceFail) { return [500, 'Internal Server Error']; } + else { + var artifacts = { artifacts: [ { id: 'imageId1', url: '/image/url/path/image.png' } ] }; + return [200, artifacts]; + } + }); + + })); + + it('can get an instance of the VizService and methods are valid', inject(function() { + expect(VizService).toBeDefined(); + + expect(VizService.getImageURL).not.toBe(null); + })); + + // !-- NOTE: if more than one artifact is received then it will only accept + // the first one --! + // !-- NOTE: timestamp-ing is done incorrectly --! + // done, expect to fail + it('getImageURL', inject(function() { + + // !(urls.hasOwnProperty(id)), !(URLService.isTimestamp(version)), $http.get -- fail + forceFail = true; + VizService.getImageURL('artifactId', undefined, undefined, 'latest').then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(500); + expect(failMessage.data).toEqual('Internal Server Error'); + expect(failMessage.message).toEqual('Server Error'); + }); + $httpBackend.flush(); + forceFail = false; + // urls['artifactId'] now exists + + // !(urls.hasOwnProperty(id)), !(URLService.isTimestamp(version)), $http.get -- pass, !(data.artifacts.length > 0) + forceEmpty = true; + VizService.getImageURL('artifactId2', undefined, undefined, 'latest').then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(200); + expect(failMessage.message).toEqual('Not Found'); + }); + $httpBackend.flush(); + forceEmpty = false; + // urls['artifactId2'] now exists + + // !(urls.hasOwnProperty(id)), !(URLService.isTimestamp(version)), $http.get -- pass, (data.artifacts.length > 0) + VizService.getImageURL('artifactId3', undefined, undefined, 'latest').then(function(response) { + expect(response).toEqual('/alfresco/image/url/path/image.jpg'); + }); $httpBackend.flush(); + // urls['artifactId3']['latest'] now exists + + // !(urls.hasOwnProperty(id)), (URLService.isTimestamp(version)), $http.get -- fail + forceFail = true; + VizService.getImageURL('artifactId4', undefined, undefined, '01-01-2014').then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(500); + expect(failMessage.data).toEqual('Internal Server Error'); + expect(failMessage.message).toEqual('Server Error'); + }); + $httpBackend.flush(); + forceFail = false; + // urls['artifactId4'] now exists + + // !(urls.hasOwnProperty(id)), (URLService.isTimestamp(version)), $http.get -- pass, !(data.artifacts.length > 0) + forceEmpty = true; + VizService.getImageURL('artifactId5', undefined, undefined, '01-01-2014').then(function(response) { displayError(); }, + function(failMessage) { + expect(failMessage.status).toEqual(200); + expect(failMessage.message).toEqual('Not Found'); + }); + $httpBackend.flush(); + forceEmpty = false; + // urls['artifactId5'] now exists + + // !(urls.hasOwnProperty(id)), (URLService.isTimestamp(version)), $http.get -- pass, (data.artifacts.length > 0) + VizService.getImageURL('artifactId6', undefined, undefined, '01-01-2014').then(function(response) { + expect(response).toEqual('/alfresco/image/url/path/image.svg'); + }); $httpBackend.flush(); + // urls['artifactId6']['01-01-2014'] now exists + + // Only need to have one with !(urls[id].hasOwnProperty(ver)) to show that it has no effect. + // (urls.hasOwnProperty(id)), !(urls[id].hasOwnProperty(ver)), !(URLService.isTimestamp(version)), + // $http.get -- pass, (data.artifacts.length > 0) + VizService.getImageURL('artifactId7', undefined, undefined, 'version1').then(function(response) { + expect(response).toEqual( '/alfresco/image/url/path/image.png' ); + }); $httpBackend.flush(); + // urls['artifactId7']['version1'] now exists + + + // Only need to have one with !(version !== 'latest' || !update) to show that it has no effect. + // (urls.hasOwnProperty(id)), (urls[id].hasOwnProperty(ver)), !(version !== 'latest' || !update), + // !(URLService.isTimestamp(version)), $http.get -- pass, (data.artifacts.length > 0) + VizService.getImageURL('artifactId3', true, undefined, 'latest').then(function(response) { + expect(response).toEqual('/alfresco/image/url/path/image.jpg'); + }); $httpBackend.flush(); + + + // (urls.hasOwnProperty(id)), (urls[id].hasOwnProperty(ver)), (version !== 'latest' || !update) + VizService.getImageURL('artifactId6', false, undefined, '01-01-2014').then(function(response) { + expect(response).toEqual('/alfresco/image/url/path/image.svg'); + }); $rootScope.$apply(); + })); +}); \ No newline at end of file diff --git a/test/archive/old.elements.json b/test/archive/old.elements.json old mode 100644 new mode 100755 diff --git a/test/archive/old.product.json b/test/archive/old.product.json old mode 100644 new mode 100755 diff --git a/test/archive/old.protractor.spec.js b/test/archive/old.protractor.spec.js old mode 100644 new mode 100755 index cd48261d1..122cf1832 --- a/test/archive/old.protractor.spec.js +++ b/test/archive/old.protractor.spec.js @@ -98,7 +98,7 @@ var MMSApp = function() { this.insertTable = $('div.mce-caret'); this.deleteTable = $('span#mceu_112-text'); this.fourByFourTable = $('a#mcegrid33'); - this.mainPaneTextSave = element(by.tagName('button-bar-component')).$('view-tools'); + this.mainPaneTextSave = element(by.tagName('mms-button-bar')).$('view-tools'); this.tableCells = element(by.tagName('tbody')).all(by.tagName('td')); diff --git a/test/archive/old.scenarios.js b/test/archive/old.scenarios.js old mode 100644 new mode 100755 diff --git a/test/archive/old.views.json b/test/archive/old.views.json old mode 100644 new mode 100755 diff --git a/test/develop/unit/ControllerSpecs/fulldoc.controller.spec.js b/test/develop/unit/ControllerSpecs/fulldoc.controller.spec.js old mode 100644 new mode 100755 index 610b61eac..45bed7571 --- a/test/develop/unit/ControllerSpecs/fulldoc.controller.spec.js +++ b/test/develop/unit/ControllerSpecs/fulldoc.controller.spec.js @@ -1,74 +1,56 @@ -describe('Controller: fullDocController', function () { - var $rootScope - var $httpBackend - var fullDocController - var scope - beforeEach( - module('mmsApp', function ($provide) { - $provide.provider('search', function () { - this.$get = function () { - return {} - } - }) - $provide.provider('orgOb', function () { - this.$get = function () { - return {} - } - }) - $provide.provider('projectOb', function () { - this.$get = function () { - return {} - } - }) - $provide.provider('refOb', function () { - this.$get = function () { - return {} - } - }) - $provide.provider('groupOb', function () { - this.$get = function () { - return {} - } - }) - $provide.provider('documentOb', function () { - this.$get = function () { - return {} - } - }) - }) - ) +describe('Controller: fullDocController', function() { + var $rootScope; + var $httpBackend; + var fullDocController; + var scope; + beforeEach(module('mmsApp', function($provide) { + $provide.provider('search', function() { + this.$get = function () { return {};} + }); + $provide.provider('orgOb', function() { + this.$get = function () { return {};} + }); + $provide.provider('projectOb', function() { + this.$get = function () { return {};} + }); + $provide.provider('refOb', function() { + this.$get = function () { return {};} + }); + $provide.provider('groupOb', function() { + this.$get = function () { return {};} + }); + $provide.provider('documentOb', function() { + this.$get = function () { return {};} + }); + })); beforeEach(inject(function ($injector) { - $httpBackend = $injector.get('$httpBackend') - var $controller = $injector.get('$controller') - $rootScope = $injector.get('$rootScope') - scope = $rootScope.$new() + $httpBackend = $injector.get('$httpBackend'); + var $controller = $injector.get('$controller'); + $rootScope = $injector.get('$rootScope'); + scope = $rootScope.$new(); fullDocController = $controller('FullDocCtrl', { - $scope: scope, - }) + $scope: scope + }); - $httpBackend - .whenGET(function (url) { - return url.indexOf('/alfresco/service/mms/login/ticket/') !== -1 - }) - .respond(200, { username: 'fakeUser' }) - $httpBackend - .whenGET(function (url) { - return url.indexOf('/alfresco/service/orgs?alf_ticket') !== -1 - }) - .respond(200, { orgs: ['org1'] }) - })) + $httpBackend.whenGET(function(url) { + return url.indexOf('/alfresco/service/mms/login/ticket/') !== -1; + } ).respond(200, {username: 'fakeUser'}); + $httpBackend.whenGET(function(url) { + return url.indexOf('/alfresco/service/orgs?alf_ticket') !== -1; + } ).respond(200, {orgs: ['org1']}); + })); - describe('when Lazy loading Views', function () { - it('should setup scrollApi on the scope to communicate with borderLayout library', function () { - expect(scope.scrollApi).toBeDefined() - expect(scope.scrollApi.notifyOnScroll).toBeDefined() - expect(scope.scrollApi.isScrollVisible).toBeDefined() - }) + describe('when Lazy loading Views', function() { + it('should setup scrollApi on the scope to communicate with borderLayout library', function() { + expect(scope.scrollApi).toBeDefined(); + expect(scope.scrollApi.notifyOnScroll).toBeDefined(); + expect(scope.scrollApi.isScrollVisible).toBeDefined(); + }); - it('should setup the following events', function () { - expect(scope.$$listeners['mms-tree-click']).toBeDefined() - expect(scope.$$listeners['view.added']).toBeDefined() - }) - }) -}) + it('should setup the following events', function() { + expect(scope.$$listeners['mms-tree-click']).toBeDefined(); + expect(scope.$$listeners['mms-new-view-added']).toBeDefined(); + }); + }); +}); diff --git a/test/develop/unit/DirectiveSpecs/example.spec.js b/test/develop/unit/DirectiveSpecs/example.spec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmSearchSpec.js b/test/develop/unit/DirectiveSpecs/mmSearchSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsButtonBarSpec.js b/test/develop/unit/DirectiveSpecs/mmsButtonBarSpec.js old mode 100644 new mode 100755 index 1ee6735fc..8b473eeae --- a/test/develop/unit/DirectiveSpecs/mmsButtonBarSpec.js +++ b/test/develop/unit/DirectiveSpecs/mmsButtonBarSpec.js @@ -23,7 +23,7 @@ describe('Directive: mmsButtonBar', function() { it('should test the mmsButtonBar Directive', function() { scope.bbApi = $rootScope.mmsBbApi; scope.buttons = $rootScope.buttons; - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); }); diff --git a/test/develop/unit/DirectiveSpecs/mmsDiffAttrSpec.js b/test/develop/unit/DirectiveSpecs/mmsDiffAttrSpec.js old mode 100644 new mode 100755 index e191def7f..59875a2cf --- a/test/develop/unit/DirectiveSpecs/mmsDiffAttrSpec.js +++ b/test/develop/unit/DirectiveSpecs/mmsDiffAttrSpec.js @@ -24,7 +24,7 @@ xdescribe('Directive: mmsDiffAttr', function() { var testElements = { elements: [ { - _modifier: "merp", + _modifier: "merp", id: "firstelementid", _modified: "2017-05-19T13:22:31.614-0700", _refId: "master", @@ -33,7 +33,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-05-09T17:12:17.165-0700", name: "First Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "merp", //same as element above, but added text in documentation @@ -45,7 +45,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-05-09T17:12:17.165-0700", name: "First Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "merp", //same as element above, but deleted text in documentation @@ -57,7 +57,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-05-09T17:12:17.165-0700", name: "First Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "someperson", @@ -69,7 +69,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-05-01T17:12:17.165-0700", name: "Second Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "someperson", //same as above, but different refs @@ -81,7 +81,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-05-01T17:12:17.165-0700", name: "Second Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "anotherperson", @@ -93,7 +93,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Third Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "anotherperson", //same as above, different commits @@ -105,7 +105,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Third Element", - _projectId: "someprojectid" + _projectId: "someprojectid" }, { _modifier: "anotherperson", @@ -117,7 +117,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-05-20T17:12:17.165-0700", name: "Fourth Element", - _projectId: "anotherprojectid" + _projectId: "anotherprojectid" }, { _modifier: "anotherperson", @@ -129,7 +129,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Fifth Element", - _projectId: "yetanotherprojectid" + _projectId: "yetanotherprojectid" }, { _modifier: "anotherperson", @@ -141,7 +141,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Sixth Element", - _projectId: "yetanotherprojectid" + _projectId: "yetanotherprojectid" }, { _modifier: "anotherperson", @@ -153,7 +153,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Seventh Element", - _projectId: "nthprojectid" + _projectId: "nthprojectid" }, { _modifier: "anotherperson", @@ -165,7 +165,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Eighth Element", - _projectId: "nthprojectid" + _projectId: "nthprojectid" }, { _modifier: "anotherperson", @@ -177,7 +177,7 @@ xdescribe('Directive: mmsDiffAttr', function() { _creator: "merp", _created: "2017-03-01T17:12:17.165-0700", name: "Eighth Element", - _projectId: "nthprojectid" + _projectId: "nthprojectid" } ] }; @@ -207,7 +207,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "fifthelementid", mmsRefOneId: "branchfive", mmsCommitOneId: "latest", - mmsProjectOneId: "yetanotherprojectid" + mmsProjectOneId: "yetanotherprojectid" }; scope.elementTwo = { mmsEidTwo: "sixthelementid", @@ -216,7 +216,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "yetanotherprojectid" }; - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -227,16 +227,16 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "fifthelementid", mmsRefOneId: "branchfive", mmsCommitOneId: "latest", - mmsProjectOneId: "yetanotherprojectid" + mmsProjectOneId: "yetanotherprojectid" }; scope.elementTwo = { mmsEidTwo: "fifthelementid", mmsRefTwoId: "branchfive", mmsCommitTwoId: "latest", - mmsProjectTwoId: "yetanotherprojectid" + mmsProjectTwoId: "yetanotherprojectid" }; - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -248,7 +248,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "fifthelementid", mmsRefOneId: "branchfive", mmsCommitOneId: "latest", - mmsProjectOneId: "yetanotherprojectid" + mmsProjectOneId: "yetanotherprojectid" }; scope.elementTwo = { mmsEidTwo: "fifthelementid", @@ -257,7 +257,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "yetanotherprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementTwo.mmsProjectTwoId + '/refs/' + scope.elementTwo.mmsRefTwoId + '/elements/' + scope.elementTwo.mmsEidTwo).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -274,10 +274,10 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidTwo: "fifthelementid", mmsRefTwoId: "branchfive", mmsCommitTwoId: "latest", - mmsProjectTwoId: "yetanotherprojectid" + mmsProjectTwoId: "yetanotherprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementOne.mmsProjectOneId + '/refs/' + scope.elementOne.mmsRefOneId + '/elements/' + scope.elementOne.mmsEidOne).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -288,7 +288,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "thirdelementid", mmsRefOneId: "branchthree", mmsCommitOneId: "3902839085", - mmsProjectOneId: "someprojectid" + mmsProjectOneId: "someprojectid" }; scope.elementTwo = { mmsEidTwo: "thirdelementid", @@ -297,7 +297,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "someprojectid" }; - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -308,7 +308,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "thirdelementid", mmsRefOneId: "branchthree", mmsCommitOneId: "thiscommitdoesntexist", - mmsProjectOneId: "someprojectid" + mmsProjectOneId: "someprojectid" }; scope.elementTwo = { mmsEidTwo: "thirdelementid", @@ -317,7 +317,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "someprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementOne.mmsProjectOneId + '/refs/' + scope.elementOne.mmsRefOneId + '/elements/' + scope.elementOne.mmsEidOne + '?commitId=' + scope.elementOne.mmsCommitOneId).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -328,7 +328,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "thirdelementid", mmsRefOneId: "branchthree", mmsCommitOneId: "thiscommitdoesntexist", - mmsProjectOneId: "someprojectid" + mmsProjectOneId: "someprojectid" }; scope.elementTwo = { mmsEidTwo: "thirdelementid", @@ -338,7 +338,7 @@ xdescribe('Directive: mmsDiffAttr', function() { }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementOne.mmsProjectOneId + '/refs/' + scope.elementOne.mmsRefOneId + '/elements/' + scope.elementOne.mmsEidOne + '?commitId=' + scope.elementOne.mmsCommitOneId).respond({status: 404, message: "" }); $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementTwo.mmsProjectTwoId + '/refs/' + scope.elementTwo.mmsRefTwoId + '/elements/' + scope.elementTwo.mmsEidTwo + '?commitId=' + scope.elementTwo.mmsCommitTwoId).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -349,7 +349,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "sixthelementid", mmsRefOneId: "master", mmsCommitOneId: "latest", - mmsProjectOneId: "yetanotherprojectid" + mmsProjectOneId: "yetanotherprojectid" }; scope.elementTwo = { mmsEidTwo: "seventhelementid", @@ -358,7 +358,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "nthprojectid" }; - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -369,7 +369,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "sixthelementid", mmsRefOneId: "master", mmsCommitOneId: "latest", - mmsProjectOneId: "thisprojectdoesntexist" + mmsProjectOneId: "thisprojectdoesntexist" }; scope.elementTwo = { mmsEidTwo: "seventhelementid", @@ -378,7 +378,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "nthprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementOne.mmsProjectOneId + '/refs/' + scope.elementOne.mmsRefOneId + '/elements/' + scope.elementOne.mmsEidOne).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -389,7 +389,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "sixthelementid", mmsRefOneId: "master", mmsCommitOneId: "latest", - mmsProjectOneId: "yetanotherprojectid" + mmsProjectOneId: "yetanotherprojectid" }; scope.elementTwo = { mmsEidTwo: "seventhelementid", @@ -398,7 +398,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "thisprojectdoesntexist" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementTwo.mmsProjectTwoId + '/refs/' + scope.elementTwo.mmsRefTwoId + '/elements/' + scope.elementTwo.mmsEidTwo).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -409,7 +409,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "sixthelementid", mmsRefOneId: "master", mmsCommitOneId: "latest", - mmsProjectOneId: "thisprojectdoesntexist" + mmsProjectOneId: "thisprojectdoesntexist" }; scope.elementTwo = { mmsEidTwo: "seventhelementid", @@ -419,7 +419,7 @@ xdescribe('Directive: mmsDiffAttr', function() { }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementOne.mmsProjectOneId + '/refs/' + scope.elementOne.mmsRefOneId + '/elements/' + scope.elementOne.mmsEidOne).respond({status: 404, message: "" }); $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementTwo.mmsProjectTwoId + '/refs/' + scope.elementTwo.mmsRefTwoId + '/elements/' + scope.elementTwo.mmsEidTwo).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -430,7 +430,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "firstelementid", mmsRefOneId: "master", mmsCommitOneId: "9028490394", - mmsProjectOneId: "someprojectid" + mmsProjectOneId: "someprojectid" }; scope.elementTwo = { mmsEidTwo: "firstelementid", @@ -439,7 +439,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "someprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementOne.mmsProjectOneId + '/refs/' + scope.elementOne.mmsRefOneId + '/elements/' + scope.elementOne.mmsEidOne + '?commitId=' + scope.elementOne.mmsCommitOneId).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -450,7 +450,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "eighthelementid", mmsRefOneId: "master", mmsCommitOneId: "89798989897", - mmsProjectOneId: "nthprojectid" + mmsProjectOneId: "nthprojectid" }; scope.elementTwo = { mmsEidTwo: "eighthelementid", @@ -459,7 +459,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "nthprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementTwo.mmsProjectTwoId + '/refs/' + scope.elementTwo.mmsRefTwoId + '/elements/' + scope.elementTwo.mmsEidTwo).respond({status: 200, message: "[ERROR]: Element MMS_1493917957356_969a3e36-f1e0-461d-9a24-c6b6f815cc84 is deleted"}); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); @@ -470,7 +470,7 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsEidOne: "firstelementid", mmsRefOneId: "master", mmsCommitOneId: "3042934", - mmsProjectOneId: "someprojectid" + mmsProjectOneId: "someprojectid" }; scope.elementTwo = { mmsEidTwo: "thiselementdoesnotexist", @@ -479,9 +479,9 @@ xdescribe('Directive: mmsDiffAttr', function() { mmsProjectTwoId: "someprojectid" }; $httpBackend.expect('GET', '/alfresco/service/projects/' + scope.elementTwo.mmsProjectTwoId + '/refs/' + scope.elementTwo.mmsRefTwoId + '/elements/' + scope.elementTwo.mmsEidTwo + '?commitId=' + scope.elementTwo.mmsCommitTwoId).respond({status: 404, message: "" }); - element = angular.element(''); + element = angular.element(''); $compile(element)(scope); scope.$apply(); $httpBackend.flush(); }); -}); +}); \ No newline at end of file diff --git a/test/develop/unit/DirectiveSpecs/mmsSpecSpec.js b/test/develop/unit/DirectiveSpecs/mmsSpecSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsTranscludeComSpec.js b/test/develop/unit/DirectiveSpecs/mmsTranscludeComSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsTranscludeDocSpec.js b/test/develop/unit/DirectiveSpecs/mmsTranscludeDocSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsTranscludeImgSpec.js b/test/develop/unit/DirectiveSpecs/mmsTranscludeImgSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsTranscludeNameSpec.js b/test/develop/unit/DirectiveSpecs/mmsTranscludeNameSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsTranscludeValSpec.js b/test/develop/unit/DirectiveSpecs/mmsTranscludeValSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsValueLinkSpec.js b/test/develop/unit/DirectiveSpecs/mmsValueLinkSpec.js old mode 100644 new mode 100755 index be4d2491d..2a9f0bbf9 --- a/test/develop/unit/DirectiveSpecs/mmsValueLinkSpec.js +++ b/test/develop/unit/DirectiveSpecs/mmsValueLinkSpec.js @@ -1,40 +1,44 @@ -'use strict' - -describe('Directive: mmsValueLink', function () { - var scope - var element - var $httpBackend - var $rootScope, $compile - - beforeEach(module('mms')) - beforeEach(module('mms.directives')) - - beforeEach(function () { - inject(function ($injector) { - $rootScope = $injector.get('$rootScope') - $compile = $injector.get('$compile') - $httpBackend = $injector.get('$httpBackend') - scope = $rootScope.$new() - }) - }) - - it('should generate a hyperlink with a view-cf value', function () { - scope.element = { - elementId: 'heyanelementid', - projectId: 'heyaprojectid', - refId: 'master', - commitId: 'latest', - errorText: 'this is an error', - linkText: 'JS Space', - } - - var url = 'https://js.jpl.nasa.gov' - - var template = '{{element.linkText}}' - element = angular.element(template) - $compile(element)(scope) - scope.$apply() - expect(element.html()).toContain('JS Space') - // console.log(element.html()); - }) -}) +'use strict'; + +describe('Directive: mmsValueLink', function() { + + var scope; + var element; + var $httpBackend; + var $rootScope, + $compile; + + beforeEach(module('mms')); + beforeEach(module('mms.directives')); + + beforeEach(function() { + inject(function($injector) { + $rootScope = $injector.get('$rootScope'); + $compile = $injector.get('$compile'); + $httpBackend = $injector.get('$httpBackend'); + scope = $rootScope.$new(); + }); + }); + + it('should generate a hyperlink with a cross-reference value', function() { + scope.element = { + elementId: 'heyanelementid', + projectId: 'heyaprojectid', + refId: 'master', + commitId: 'latest', + errorText: 'this is an error', + linkText: 'JS Space' + }; + + var url = 'https://js.jpl.nasa.gov' + + var template = '{{element.linkText}}'; + element = angular.element(template); + $compile(element)(scope); + scope.$apply(); + expect(element.html()).toContain('JS Space'); + // console.log(element.html()); + }); + + +}); \ No newline at end of file diff --git a/test/develop/unit/DirectiveSpecs/mmsViewSpec.js b/test/develop/unit/DirectiveSpecs/mmsViewSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/DirectiveSpecs/mmsViewTableSpec.js b/test/develop/unit/DirectiveSpecs/mmsViewTableSpec.js old mode 100644 new mode 100755 index 2c1bfd81e..edb03ae2e --- a/test/develop/unit/DirectiveSpecs/mmsViewTableSpec.js +++ b/test/develop/unit/DirectiveSpecs/mmsViewTableSpec.js @@ -1,6 +1,7 @@ -'use strict' +'use strict'; + +describe('Directive: mmsViewTable', function() { -describe('Directive: mmsViewTable', function () { /** * Figure1: * @@ -36,711 +37,636 @@ describe('Directive: mmsViewTable', function () { */ function applyFilter(filterInputDom, filterTerm) { - scope.$apply(function () { - filterInputDom.val(filterTerm).change() - }) - $timeout.flush() + scope.$apply(function() { + filterInputDom.val(filterTerm).change(); + }); + $timeout.flush(); } function replaceDom(trs) { /** First row **/ - trs.first() - .children('td:nth-child(1)') - .find('view-cf') - .replaceWith( - 'ggg' - ) - trs.first() - .children('td:nth-child(2)') - .find('view-cf') - .replaceWith( - '

    ad

    ' - ) - trs.first() - .children('td:nth-child(3)') - .find('mms-cf') - .first() - .replaceWith( - 'value1' - ) + trs.first().children('td:nth-child(1)').find('mms-cf').replaceWith('ggg'); + trs.first().children('td:nth-child(2)').find('mms-cf').replaceWith('

    ad

    '); + trs.first().children('td:nth-child(3)').find('mms-cf').first().replaceWith('value1'); // child one again coz the earlier replace mms-cf with sth else - trs.first() - .children('td:nth-child(3)') - .find('mms-cf:nth-child(1)') - .replaceWith( - 'value2' - ) + trs.first().children('td:nth-child(3)').find('mms-cf:nth-child(1)').replaceWith('value2'); // - var innerTableBody = trs - .first() - .children('td:nth-child(4)') - .find('tbody') - var innerTableRows = innerTableBody.children('tr') - innerTableRows - .first() - .children('td:nth-child(1)') - .find('mms-cf') - .replaceWith( - 'value1' - ) - innerTableRows - .first() - .children('td:nth-child(2)') - .find('mms-cf') - .replaceWith( - '234111070' - ) - $(innerTableRows[1]) - .children('td:nth-child(1)') - .find('mms-cf') - .replaceWith( - 'value2' - ) - $(innerTableRows[1]) - .children('td:nth-child(2)') - .find('mms-cf') - .replaceWith( - '(no value)' - ) + var innerTableBody = trs.first().children('td:nth-child(4)').find('tbody'); + var innerTableRows = innerTableBody.children('tr'); + innerTableRows.first().children('td:nth-child(1)').find('mms-cf').replaceWith('value1'); + innerTableRows.first().children('td:nth-child(2)').find('mms-cf').replaceWith('234111070'); + $(innerTableRows[1]).children('td:nth-child(1)').find('mms-cf').replaceWith('value2'); + $(innerTableRows[1]).children('td:nth-child(2)').find('mms-cf').replaceWith('(no value)'); /** Second row **/ - $(trs[1]) - .children('td:nth-child(1)') - .find('mms-cf') - .replaceWith('aaa') - $(trs[1]) - .children('td:nth-child(2)') - .find('mms-cf') - .replaceWith( - 'adfew dfvdfdsf' - ) + $(trs[1]).children('td:nth-child(1)').find('mms-cf').replaceWith('aaa'); + $(trs[1]).children('td:nth-child(2)').find('mms-cf').replaceWith('adfew dfvdfdsf'); } - var scope, element - var $rootScope, $compile - var $timeout - var self + var scope, + element; + var $rootScope, + $compile; + var $timeout; + var self; - beforeEach(module('mms')) - beforeEach(module('mms.directives')) - beforeEach(function () { + beforeEach(module('mms')); + beforeEach(module('mms.directives')); + beforeEach(function() { inject(function ($injector) { - $rootScope = $injector.get('$rootScope') - $compile = $injector.get('$compile') - $timeout = $injector.get('$timeout') - scope = $rootScope.$new() - }) - + $rootScope = $injector.get('$rootScope'); + $compile = $injector.get('$compile'); + $timeout = $injector.get('$timeout'); + scope = $rootScope.$new(); + }); + + /** Load mmsViewTable directive **/ scope.presentationElem = { - header: [ + "header": [ [ { - colspan: '1', - rowspan: '2', - content: [ + "colspan": "1", + "rowspan": "2", + "content": [ { - sourceType: 'text', - text: '

    name

    ', - type: 'Paragraph', - }, - ], + "sourceType": "text", + "text": "

    name

    ", + "type": "Paragraph" + } + ] }, { - colspan: '2', - rowspan: '1', - content: [ + "colspan": "2", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    merged header

    ', - type: 'Paragraph', - }, - ], + "sourceType": "text", + "text": "

    merged header

    ", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '2', - content: [ + "colspan": "1", + "rowspan": "2", + "content": [ { - sourceType: 'text', - text: '

    nested table

    ', - type: 'Paragraph', - }, - ], - }, + "sourceType": "text", + "text": "

    nested table

    ", + "type": "Paragraph" + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    doc

    ', - type: 'Paragraph', - }, - ], + "sourceType": "text", + "text": "

    doc

    ", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    properties

    ', - type: 'Paragraph', - }, - ], - }, - ], + "sourceType": "text", + "text": "

    properties

    ", + "type": "Paragraph" + } + ] + } + ] ], - style: 'normal', - body: [ + "style": "normal", + "body": [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'name', - source: '_18_5_1_407019f_1501622199354_603477_47069', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "name", + "source": "_18_5_1_407019f_1501622199354_603477_47069", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'documentation', - source: '_18_5_1_407019f_1501622199354_603477_47069', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "documentation", + "source": "_18_5_1_407019f_1501622199354_603477_47069", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'name', - source: '_18_5_1_407019f_1501622208726_884214_47115', - type: 'Paragraph', + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "name", + "source": "_18_5_1_407019f_1501622208726_884214_47115", + "type": "Paragraph" }, { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'name', - source: '_18_5_1_407019f_1501632597511_631050_47133', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "name", + "source": "_18_5_1_407019f_1501632597511_631050_47133", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - header: [ + "header": [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    prop name

    ', - type: 'Paragraph', - }, - ], + "sourceType": "text", + "text": "

    prop name

    ", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    prop val

    ', - type: 'Paragraph', - }, - ], - }, - ], + "sourceType": "text", + "text": "

    prop val

    ", + "type": "Paragraph" + } + ] + } + ] ], - style: 'normal', - body: [ + "style": "normal", + "body": [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'name', - source: '_18_5_1_407019f_1501622208726_884214_47115', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "name", + "source": "_18_5_1_407019f_1501622208726_884214_47115", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'value', - source: '_18_5_1_407019f_1501622208726_884214_47115', - type: 'Paragraph', - }, - ], - }, + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "value", + "source": "_18_5_1_407019f_1501622208726_884214_47115", + "type": "Paragraph" + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'name', - source: '_18_5_1_407019f_1501632597511_631050_47133', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "name", + "source": "_18_5_1_407019f_1501632597511_631050_47133", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'value', - source: '_18_5_1_407019f_1501632597511_631050_47133', - type: 'Paragraph', - }, - ], - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "value", + "source": "_18_5_1_407019f_1501632597511_631050_47133", + "type": "Paragraph" + } + ] + } + ] ], - title: 'props', - type: 'Table', - showIfEmpty: false, - }, - ], - }, + "title": "props", + "type": "Table", + "showIfEmpty": false + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'name', - source: '_18_5_2_407019f_1509565995142_216176_48126', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "name", + "source": "_18_5_2_407019f_1509565995142_216176_48126", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - nonEditable: false, - sourceType: 'reference', - sourceProperty: 'documentation', - source: '_18_5_2_407019f_1509565995142_216176_48126', - type: 'Paragraph', - }, - ], + "nonEditable": false, + "sourceType": "reference", + "sourceProperty": "documentation", + "source": "_18_5_2_407019f_1509565995142_216176_48126", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [], + "colspan": "1", + "rowspan": "1", + "content": [] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - header: [ + "header": [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    prop name

    ', - type: 'Paragraph', - }, - ], + "sourceType": "text", + "text": "

    prop name

    ", + "type": "Paragraph" + } + ] }, { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '

    prop val

    ', - type: 'Paragraph', - }, - ], - }, - ], + "sourceType": "text", + "text": "

    prop val

    ", + "type": "Paragraph" + } + ] + } + ] ], - style: 'normal', - body: [], - title: 'props', - type: 'Table', - showIfEmpty: false, - }, - ], - }, - ], + "style": "normal", + "body": [], + "title": "props", + "type": "Table", + "showIfEmpty": false + } + ] + } + ] ], - title: 'fancy table', - type: 'Table', - showIfEmpty: false, - colwidths: [null, null, null, null], - } - element = angular.element( - '' - ) - $compile(element)(scope) - scope.$digest() + "title": "fancy table", + "type": "Table", + "showIfEmpty": false, + "colwidths": [ + null, + null, + null, + null + ] + }; + element = angular.element(''); + $compile(element)(scope); + scope.$digest(); + /** Store commonly used variables **/ - var table = element.children('table') - this.mmsViewTableController = element.controller('mmsViewTable') - this.tHeader = table.children('thead') - this.tbody = table.children('tbody') - this.trs = this.tbody.children('tr') - self = this + var table = element.children('table'); + this.mmsViewTableController = element.controller('mmsViewTable'); + this.tHeader = table.children('thead'); + this.tbody = table.children('tbody'); + this.trs = this.tbody.children('tr'); + self = this; /** Modify mmsViewTable's html content to mock nested directives **/ - replaceDom(this.trs) - }) - - it('store rows order as an attribute so that it can reset the sort order', function () { - this.trs.each(function (index) { - expect( - Number( - $(this).attr( - self.mmsViewTableController._rowSortOrderAttrName - ) - ) - ).toEqual(index) - }) - }) - - it('can do column-wise sort and can reset sort order', function () { + replaceDom(this.trs); + }); + + it('store rows order as an attribute so that it can reset the sort order', function() { + this.trs.each(function(index) { + expect(Number($(this).attr(self.mmsViewTableController._rowSortOrderAttrName))).toEqual(index); + }); + }); + + it('can do column-wise sort and can reset sort order', function() { /** Before the sort, 'ggg' is on rowIndex = 0 and 'aaa' is on rowIndex = 1 **/ - expect($(this.trs[0]).children('td').first().text()).toEqual('ggg') - expect($(this.trs[1]).children('td').first().text()).toEqual('aaa') + expect($(this.trs[0]).children('td').first().text()).toEqual('ggg'); + expect($(this.trs[1]).children('td').first().text()).toEqual('aaa'); /** Click sort on the first column and assert that the two rows switch places **/ - this.tHeader - .children('tr') - .first() - .children('th') - .children('span') - .click() - this.trs = this.tbody.children('tr') - expect($(this.trs[0]).children('td').first().text()).toEqual('aaa') - expect($(this.trs[1]).children('td').first().text()).toEqual('ggg') + this.tHeader.children('tr').first().children('th').children('span').click(); + this.trs = this.tbody.children('tr'); + expect($(this.trs[0]).children('td').first().text()).toEqual('aaa'); + expect($(this.trs[1]).children('td').first().text()).toEqual('ggg'); /** Restore sort order **/ - var resortButton = element.find('.reset-sort-button') - resortButton.click() - this.trs = this.tbody.children('tr') - this.trs.each(function (index) { - expect( - Number( - $(this).attr( - self.mmsViewTableController._rowSortOrderAttrName - ) - ) - ).toEqual(index) - }) - }) - - it('can do Full Table Filter ', function () { + var resortButton = element.find('.reset-sort-button'); + resortButton.click(); + this.trs = this.tbody.children('tr'); + this.trs.each(function(index) { + expect(Number($(this).attr(self.mmsViewTableController._rowSortOrderAttrName))).toEqual(index); + }); + }); + + it('can do Full Table Filter ', function() { /** Filter by 'g' **/ - var fullTableFilterInput = element - .find('form') - .children('input') - .first() - applyFilter(fullTableFilterInput, 'g') - this.trs = this.tbody.children('tr') + var fullTableFilterInput = element.find('form').children('input').first(); + applyFilter(fullTableFilterInput, 'g'); + this.trs = this.tbody.children('tr'); /** This row has 'g' as its content **/ - expect($(this.trs[0]).css('display')).not.toEqual('none') - expect($(this.trs[0]).children('td').first().text()).toEqual('ggg') + expect($(this.trs[0]).css('display')).not.toEqual('none'); + expect($(this.trs[0]).children('td').first().text()).toEqual('ggg'); /** This row doesn't have 'g' as its content. Therefore, it is hidden **/ - expect($(this.trs[1]).css('display')).toEqual('none') - expect($(this.trs[1]).children('td').first().text()).toEqual('aaa') - }) + expect($(this.trs[1]).css('display')).toEqual('none'); + expect($(this.trs[1]).children('td').first().text()).toEqual('aaa'); + }); - it('can do column(s)-Wise filter', function () { + it('can do column(s)-Wise filter', function() { /** Refer to Figure1 to set the layout of the filter inputs for this table **/ /** Filter the column index = 0 by 'g' **/ - var column0FilterInput = this.tHeader.find('input').first() - applyFilter(column0FilterInput, 'g') - this.trs = this.tbody.children('tr') + var column0FilterInput = this.tHeader.find('input').first(); + applyFilter(column0FilterInput, 'g'); + this.trs = this.tbody.children('tr'); /** This row has 'g' as its content **/ - expect($(this.trs[0]).css('display')).not.toEqual('none') - expect($(this.trs[0]).children('td').first().text()).toEqual('ggg') + expect($(this.trs[0]).css('display')).not.toEqual('none'); + expect($(this.trs[0]).children('td').first().text()).toEqual('ggg'); /** This row doesn't have 'g' as its content. Therefore, it is hidden **/ - expect($(this.trs[1]).css('display')).toEqual('none') - expect($(this.trs[1]).children('td').first().text()).toEqual('aaa') + expect($(this.trs[1]).css('display')).toEqual('none'); + expect($(this.trs[1]).children('td').first().text()).toEqual('aaa'); + + /** Clear this filter term so that both rows show up again **/ - applyFilter(column0FilterInput, '') - expect($(this.trs[0]).css('display')).not.toEqual('none') - expect($(this.trs[0]).children('td').first().text()).toEqual('ggg') + applyFilter(column0FilterInput, ''); + expect($(this.trs[0]).css('display')).not.toEqual('none'); + expect($(this.trs[0]).children('td').first().text()).toEqual('ggg'); + + expect($(this.trs[1]).css('display')).not.toEqual('none'); + expect($(this.trs[1]).children('td').first().text()).toEqual('aaa'); + - expect($(this.trs[1]).css('display')).not.toEqual('none') - expect($(this.trs[1]).children('td').first().text()).toEqual('aaa') /** Now filter column index = 1 by 'ad'. Both these rows' cells has 'adf' on the column that is filtered by **/ - var column1FilterInput = $(this.tHeader.find('input')[3]) - applyFilter(column1FilterInput, 'ad') - expect($(this.trs[0]).css('display')).not.toEqual('none') - expect($(this.trs[0]).children('td').first().text()).toEqual('ggg') + var column1FilterInput = $(this.tHeader.find('input')[3]); + applyFilter(column1FilterInput, 'ad'); + expect($(this.trs[0]).css('display')).not.toEqual('none'); + expect($(this.trs[0]).children('td').first().text()).toEqual('ggg'); /** This row's cell also has 'ad' as its content. Therefore, it is also shown **/ - expect($(this.trs[1]).css('display')).not.toEqual('none') - expect($(this.trs[1]).children('td').first().text()).toEqual('aaa') + expect($(this.trs[1]).css('display')).not.toEqual('none'); + expect($(this.trs[1]).children('td').first().text()).toEqual('aaa'); + + /** Apply 'g' on column index = 0 and 'ad' on column index = 1. Expect the first row to show up because * it has both 'g' for column index = 0 and 'ad' for column index = 1 **/ - applyFilter(column1FilterInput, '') // reset result first - applyFilter(column0FilterInput, 'g') - applyFilter(column1FilterInput, 'ad') - this.trs = this.tbody.children('tr') + applyFilter(column1FilterInput, ''); // reset result first + applyFilter(column0FilterInput, 'g'); + applyFilter(column1FilterInput, 'ad'); + this.trs = this.tbody.children('tr'); /** This row has both 'g' and 'adf' on both columns that are filtered by **/ - expect($(this.trs[0]).css('display')).not.toEqual('none') - expect($(this.trs[0]).children('td').first().text()).toEqual('ggg') + expect($(this.trs[0]).css('display')).not.toEqual('none'); + expect($(this.trs[0]).children('td').first().text()).toEqual('ggg'); /** This row only has 'adf' on column index = 1, but doesn't have 'g' on column index = 0. Therefore, display = none **/ - expect($(this.trs[1]).css('display')).toEqual('none') - expect($(this.trs[1]).children('td').first().text()).toEqual('aaa') + expect($(this.trs[1]).css('display')).toEqual('none'); + expect($(this.trs[1]).children('td').first().text()).toEqual('aaa'); + /** Do a Full Table filter and make sure that all the Column(s)-Wise filter input boxes are cleared **/ - var fullTableFilterInput = element - .find('form') - .children('input') - .first() - applyFilter(fullTableFilterInput, 'g') - var columnWiseFilterInputs = this.tHeader.find('input') - columnWiseFilterInputs.each(function () { - expect($(this).val()).toEqual('') - }) + var fullTableFilterInput = element.find('form').children('input').first(); + applyFilter(fullTableFilterInput, 'g'); + var columnWiseFilterInputs = this.tHeader.find('input'); + columnWiseFilterInputs.each(function() { + expect($(this).val()).toEqual(''); + }); /** Do a Column-wise filter and make sure that the Full Table Filter input box is cleared **/ - applyFilter(column0FilterInput, 'g') - expect(fullTableFilterInput.val()).toEqual('') - }) + applyFilter(column0FilterInput, 'g'); + expect(fullTableFilterInput.val()).toEqual(''); + }); - it('use the numerical sort when all cells value is a valid number', function () { + it('use the numerical sort when all cells value is a valid number', function() { var tableData = { header: [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: 'Column1', - type: 'Paragraph', - }, - ], - }, - ], + "sourceType": "text", + "text": "Column1", + "type": "Paragraph" + } + ] + } + ] ], body: [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '20', - type: 'Paragraph', - }, - ], - }, + "sourceType": "text", + "text": "20", + "type": "Paragraph" + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '3', - type: 'Paragraph', - }, - ], - }, + "sourceType": "text", + "text": "3", + "type": "Paragraph" + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '-1', - type: 'Paragraph', - }, - ], - }, - ], - ], - } - var element = angular.element( - '' - ) - var scope = $rootScope.$new() - scope.tableData = tableData - $compile(element)(scope) - scope.$digest() - - var table = element.children('table') - var tbody = table.children('tbody') - var trs = tbody.children('tr') + "sourceType": "text", + "text": "-1", + "type": "Paragraph" + } + ] + } + ] + + ] + }; + var element = angular.element(''); + var scope = $rootScope.$new(); + scope.tableData = tableData; + $compile(element)(scope); + scope.$digest(); + + var table = element.children('table'); + var tbody = table.children('tbody'); + var trs = tbody.children('tr'); // all cells' value is a valid number - expect( - self.mmsViewTableController.__areAllCellValidNumber( - trs.toArray(), - 0 - ) - ).toBeTruthy() - - expect($(trs[0]).children('td').first().text()).toEqual('20') - expect($(trs[1]).children('td').first().text()).toEqual('3') - expect($(trs[2]).children('td').first().text()).toEqual('-1') - - table.find('span[ng-click]').click() - trs = tbody.children('tr') - - expect($(trs[0]).children('td').first().text()).toEqual('-1') - expect($(trs[1]).children('td').first().text()).toEqual('3') - expect($(trs[2]).children('td').first().text()).toEqual('20') - }) - - it('do not use the numerical sort when one or more cells value is not a valid number', function () { + expect(self.mmsViewTableController.__areAllCellValidNumber(trs.toArray(), 0)).toBeTruthy(); + + expect($(trs[0]).children('td').first().text()).toEqual('20'); + expect($(trs[1]).children('td').first().text()).toEqual('3'); + expect($(trs[2]).children('td').first().text()).toEqual('-1'); + + table.find('span[ng-click]').click(); + trs = tbody.children('tr'); + + expect($(trs[0]).children('td').first().text()).toEqual('-1'); + expect($(trs[1]).children('td').first().text()).toEqual('3'); + expect($(trs[2]).children('td').first().text()).toEqual('20'); + }); + + it('do not use the numerical sort when one or more cells value is not a valid number', function() { var tableData = { header: [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: 'Column1', - type: 'Paragraph', - }, - ], - }, - ], + "sourceType": "text", + "text": "Column1", + "type": "Paragraph" + } + ] + } + ] ], body: [ [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '3', - type: 'Paragraph', - }, - ], - }, + "sourceType": "text", + "text": "3", + "type": "Paragraph" + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: '20', - type: 'Paragraph', - }, - ], - }, + "sourceType": "text", + "text": "20", + "type": "Paragraph" + } + ] + } ], [ { - colspan: '1', - rowspan: '1', - content: [ + "colspan": "1", + "rowspan": "1", + "content": [ { - sourceType: 'text', - text: 'a', - type: 'Paragraph', - }, - ], - }, - ], - ], - } - var element = angular.element( - '' - ) - var scope = $rootScope.$new() - scope.tableData = tableData - $compile(element)(scope) - scope.$digest() - - var table = element.children('table') - var tbody = table.children('tbody') - var trs = tbody.children('tr') + "sourceType": "text", + "text": "a", + "type": "Paragraph" + } + ] + } + ] + + ] + }; + var element = angular.element(''); + var scope = $rootScope.$new(); + scope.tableData = tableData; + $compile(element)(scope); + scope.$digest(); + + var table = element.children('table'); + var tbody = table.children('tbody'); + var trs = tbody.children('tr'); // the last cell's value("a") is not a valid number, so use alphabetical sorting - expect( - self.mmsViewTableController.__areAllCellValidNumber( - trs.toArray(), - 0 - ) - ).toBeFalsy() - - expect($(trs[0]).children('td').first().text()).toEqual('3') - expect($(trs[1]).children('td').first().text()).toEqual('20') - expect($(trs[2]).children('td').first().text()).toEqual('a') - - table.find('span[ng-click]').click() - trs = tbody.children('tr') - - expect($(trs[0]).children('td').first().text()).toEqual('20') - expect($(trs[1]).children('td').first().text()).toEqual('3') - expect($(trs[2]).children('td').first().text()).toEqual('a') - }) -}) + expect(self.mmsViewTableController.__areAllCellValidNumber(trs.toArray(), 0)).toBeFalsy(); + + expect($(trs[0]).children('td').first().text()).toEqual('3'); + expect($(trs[1]).children('td').first().text()).toEqual('20'); + expect($(trs[2]).children('td').first().text()).toEqual('a'); + + table.find('span[ng-click]').click(); + trs = tbody.children('tr'); + + expect($(trs[0]).children('td').first().text()).toEqual('20'); + expect($(trs[1]).children('td').first().text()).toEqual('3'); + expect($(trs[2]).children('td').first().text()).toEqual('a'); + }); +}); diff --git a/test/develop/unit/ServiceSpecs/ApplicationServiceSpec.js b/test/develop/unit/ServiceSpecs/ApplicationServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/AuthServiceSpec.js b/test/develop/unit/ServiceSpecs/AuthServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/FullDocumentServiceSpec.js b/test/develop/unit/ServiceSpecs/FullDocumentServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/ProjectServiceSpec.js b/test/develop/unit/ServiceSpecs/ProjectServiceSpec.js old mode 100644 new mode 100755 index 377bb2772..1cdeffb80 --- a/test/develop/unit/ServiceSpecs/ProjectServiceSpec.js +++ b/test/develop/unit/ServiceSpecs/ProjectServiceSpec.js @@ -6,7 +6,7 @@ describe('ProjectService', function () { var ProjectServiceObj; var mockQ, mockURLService, mockCacheService, mockApplicationService; var $httpBackend, $window; - var org = {}; + var org = {}; var orgs = {}; var ref = {}; var refs = {}; @@ -354,12 +354,12 @@ describe('ProjectService', function () { }); }); - describe('Method diff-merge: do not need to test', function () { + describe('Method diff: do not need to test', function () { }); - describe('Method merge: do not need to test', function () { + describe('Method merge: do not need to test', function () { }); - describe('Method reset: do not need to test', function () { + describe('Method reset: do not need to test', function () { }); }); diff --git a/test/develop/unit/ServiceSpecs/URLServiceSpec.js b/test/develop/unit/ServiceSpecs/URLServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/UtilsServiceSpec.js b/test/develop/unit/ServiceSpecs/UtilsServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/cacheServiceSpec.js b/test/develop/unit/ServiceSpecs/cacheServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/elementServiceSpec.js b/test/develop/unit/ServiceSpecs/elementServiceSpec.js old mode 100644 new mode 100755 index e70a19a32..695010ede --- a/test/develop/unit/ServiceSpecs/elementServiceSpec.js +++ b/test/develop/unit/ServiceSpecs/elementServiceSpec.js @@ -823,7 +823,7 @@ describe('Service: ElementService', function() { } var mainBoolQuery =[]; mainBoolQuery.push(mainQuery, projectTermsOb); - var queryOb = { //assuming searchField is 'all' + var queryOb = { //assuming searchType is 'all' "sort" : [ "_score", { "_modified" : {"order" : "desc"}} diff --git a/test/develop/unit/ServiceSpecs/httpServiceSpec.js b/test/develop/unit/ServiceSpecs/httpServiceSpec.js old mode 100644 new mode 100755 diff --git a/test/develop/unit/ServiceSpecs/viewServiceSpec.js b/test/develop/unit/ServiceSpecs/viewServiceSpec.js old mode 100644 new mode 100755 index efe67ccd1..883ab7fa7 --- a/test/develop/unit/ServiceSpecs/viewServiceSpec.js +++ b/test/develop/unit/ServiceSpecs/viewServiceSpec.js @@ -1,385 +1,303 @@ -'use strict' +'use strict'; -xdescribe('Service: ViewService', function () { - beforeEach(module('mms')) +xdescribe('Service: ViewService', function() { + beforeEach(module('mms')); - var root = '/alfresco/service/projects/heyaproject/refs/master' + var root = '/alfresco/service/projects/heyaproject/refs/master'; - var ViewServiceObj - var mockCacheService, mockURLService, mockElementService, mockUtilsService - var $httpBackend - var $rootScope - var ownerId - var TYPE_TO_CLASSIFIER_ID - var elemOb + var ViewServiceObj; + var mockCacheService, mockURLService, mockElementService, mockUtilsService; + var $httpBackend; + var $rootScope; + var ownerId; + var TYPE_TO_CLASSIFIER_ID; + var elemOb; - beforeEach(inject(function ($injector) { - ViewServiceObj = $injector.get('ViewService') - mockCacheService = $injector.get('CacheService') - mockURLService = $injector.get('URLService') - mockElementService = $injector.get('ElementService') - mockUtilsService = $injector.get('UtilsService') - $httpBackend = $injector.get('$httpBackend') - $rootScope = $injector.get('$rootScope') + beforeEach(inject(function($injector) { + ViewServiceObj = $injector.get('ViewService'); + mockCacheService = $injector.get('CacheService'); + mockURLService = $injector.get('URLService'); + mockElementService = $injector.get('ElementService'); + mockUtilsService = $injector.get('UtilsService'); + $httpBackend = $injector.get('$httpBackend'); + $rootScope = $injector.get('$rootScope'); - TYPE_TO_CLASSIFIER_ID = { - Image: '_17_0_5_1_407019f_1430628206190_469511_11978', - List: '_17_0_5_1_407019f_1430628190151_363897_11927', - Paragraph: '_17_0_5_1_407019f_1430628197332_560980_11953', - Table: '_17_0_5_1_407019f_1430628178633_708586_11903', - Section: '_17_0_5_1_407019f_1430628211976_255218_12002', - ListT: '_17_0_5_1_407019f_1431903739087_549326_12013', - TableT: '_17_0_5_1_407019f_1431903724067_825986_11992', - Figure: '_17_0_5_1_407019f_1431903748021_2367_12034', //manual images + timely, etc - Equation: '_17_0_5_1_407019f_1431905053808_352752_11992', - ParagraphT: '_17_0_5_1_407019f_1431903758416_800749_12055', - SectionT: '_18_0_2_407019f_1435683487667_494971_14412', - } + TYPE_TO_CLASSIFIER_ID = { + Image: "_17_0_5_1_407019f_1430628206190_469511_11978", + List: "_17_0_5_1_407019f_1430628190151_363897_11927", + Paragraph: "_17_0_5_1_407019f_1430628197332_560980_11953", + Table: "_17_0_5_1_407019f_1430628178633_708586_11903", + Section: "_17_0_5_1_407019f_1430628211976_255218_12002", + ListT: "_17_0_5_1_407019f_1431903739087_549326_12013", + TableT: "_17_0_5_1_407019f_1431903724067_825986_11992", + Figure: "_17_0_5_1_407019f_1431903748021_2367_12034", //manual images + timely, etc + Equation: "_17_0_5_1_407019f_1431905053808_352752_11992", + ParagraphT: "_17_0_5_1_407019f_1431903758416_800749_12055", + SectionT: "_18_0_2_407019f_1435683487667_494971_14412" + }; - elemOb = { - _modifier: 'admin', - powertypeExtentIds: [], - representationId: null, - mdExtensionsIds: [], - templateBindingIds: [], - appliedStereotypeInstanceId: 'applid', - templateParameterId: null, - isActive: false, - ownerId: 'ownerid', - type: 'Class', - isLeaf: false, - clientDependencyIds: [], - _displayedElements: ['diselements'], - useCaseIds: [], - syncElementId: null, - classifierBehaviorId: null, - interfaceRealizationIds: [], - id: 'heyanelement', - _elasticId: 'elasticid', - _refId: 'master', - supplierDependencyIds: [], - _modified: '2017-05-03T10:51:50.270-0700', - _appliedStereotypeIds: ['stereotypeids'], - nameExpression: null, - ownedAttributeIds: [ - 'ownedattr1', - 'ownedattr2', - 'ownedattr3', - 'ownedattr4', - 'ownedattr5', - ], - packageImportIds: [], - visibility: null, - substitutionIds: [], - documentation: '', - redefinedClassifierIds: [], - _editable: true, - isAbstract: false, - _contents: { - type: 'Expression', - operand: [ - { - instanceId: 'instanceid', - type: 'InstanceValue', - }, - ], - }, - _commitId: 'latest', - _childViews: [ - { - aggregation: 'composite', - id: 'heyanelement', - }, - { - aggregation: 'composite', - id: 'child2', - }, - { - aggregation: 'composite', - id: 'child3', - }, - { - aggregation: 'composite', - id: 'child4', - }, - { - aggregation: 'composite', - id: 'child5', - }, - ], - generalizationIds: [], - _creator: 'admin', - ownedOperationIds: [], - _created: '2017-05-01T13:43:19.571-0700', - name: 'Krabby Patties', - elementImportIds: [], - collaborationUseIds: [], - isFinalSpecialization: false, - _projectId: 'heyaproject', - } - })) + elemOb = { + _modifier : "admin", + powertypeExtentIds : [], + representationId : null, + mdExtensionsIds : [], + templateBindingIds : [], + appliedStereotypeInstanceId : "applid", + templateParameterId : null, + isActive : false, + ownerId : "ownerid", + type : "Class", + isLeaf : false, + clientDependencyIds : [], + _displayedElements : ["diselements"], + useCaseIds : [], + syncElementId : null, + classifierBehaviorId : null, + interfaceRealizationIds : [], + id : "heyanelement", + _elasticId : "elasticid", + _refId : "master", + supplierDependencyIds : [], + _modified : "2017-05-03T10:51:50.270-0700", + _appliedStereotypeIds : ["stereotypeids"], + nameExpression : null, + ownedAttributeIds : ["ownedattr1","ownedattr2","ownedattr3","ownedattr4","ownedattr5"], + packageImportIds : [], + visibility : null, + substitutionIds : [], + documentation : "", + redefinedClassifierIds : [], + _editable : true, + isAbstract : false, + _contents: + { + type: "Expression", + operand: [ + { + instanceId: "instanceid", + type: "InstanceValue" + } + ] + }, + _commitId : "latest", + _childViews: [ + { + aggregation: "composite", + id: "heyanelement" + }, + { + aggregation: "composite", + id: "child2" + }, + { + aggregation: "composite", + id: "child3" + }, + { + aggregation: "composite", + id: "child4" + }, + { + aggregation: "composite", + id: "child5" + } + ], + generalizationIds : [], + _creator : "admin", + ownedOperationIds : [], + _created : "2017-05-01T13:43:19.571-0700", + name : "Krabby Patties", + elementImportIds : [], + collaborationUseIds : [], + isFinalSpecialization : false, + _projectId : "heyaproject" + } + })); - afterEach(function () { - $httpBackend.verifyNoOutstandingExpectation() - $httpBackend.verifyNoOutstandingRequest() - }) + afterEach(function () { + $httpBackend.verifyNoOutstandingExpectation(); + $httpBackend.verifyNoOutstandingRequest(); + }); - describe('Method: downgradeDocument', function () { - it('it should demote an object to a view', function () { - var result - var newElemOb = elemOb - newElemOb._appliedStereotypeIds = [ - '_11_5EAPbeta_be00301_1147420760998_43940_227', - ] - $httpBackend - .when('POST', root + '/elements/heyanelement', newElemOb) - .respond(function (method, url, data) { - return [201, ''] - }) - ViewServiceObj.downgradeDocument(elemOb).then( - function (data) { - result = data - }, - function (reason) { - result = reason.message - } - ) - expect(result).toEqual(newElemOb) - }) - }) + describe('Method: downgradeDocument', function() { + it('it should demote an object to a view', function() { + var result; + var newElemOb = elemOb; + newElemOb._appliedStereotypeIds = ['_11_5EAPbeta_be00301_1147420760998_43940_227']; + $httpBackend.when('POST', root + '/elements/heyanelement', newElemOb).respond( + function(method, url, data) { + return [201, '']; + }); + ViewServiceObj.downgradeDocument(elemOb).then(function(data) { + result = data; + }, function(reason) { + result = reason.message; + }); + expect(result).toEqual(newElemOb); + }); + }); - describe('Method: getViewDatas', function () { - it('it should get the element objects for elements allowed in the view', function () { - var result - var testElem = { - projectId: 'heyaproject', - elementId: 'heyanelement', - refId: 'master', - commitId: 'latest', - } - $httpBackend - .when('GET', root + '/elements/heyanelement') - .respond(function (method, url, data) { - return [200, testElem] - }) - ViewServiceObj.getViewDatas(testElem).then( - function (data) { - result = data - }, - function (reason) { - result = reason.message - } - ) - $httpBackend.flush() - expect(result).toEqual(testElem) - }) - }) + describe('Method: getViewElements', function() { + it('it should get the element objects for elements allowed in the view', function() { + var result; + var testElem = { + projectId: "heyaproject", + elementId: "heyanelement", + refId: 'master', + commitId: 'latest' + }; + $httpBackend.when('GET', root + '/elements/heyanelement').respond( + function(method, url, data) { + return [200, testElem]; + }); + ViewServiceObj.getViewElements(testElem).then(function(data) { + result = data; + }, function(reason) { + result = reason.message; + }); + $httpBackend.flush(); + expect(result).toEqual(testElem); + }); + }); - describe('Method: addViewtToParentView', function () { - it('it should get the view objects for a document', function () { - var result - var testElem = { - projectId: 'heyaproject', - elementId: 'heyanelement', - refId: 'master', - commitId: 'latest', - } - $httpBackend - .when('GET', root + '/elements/heyanelement') - .respond(testElem) - ViewServiceObj.addViewToParentView(testElem).then( - function (data) { - result = data - }, - function (reason) { - result = reason.message - } - ) - expect(result).toEqual(testElem) - }) - }) + describe('Method: addViewtToParentView', function() { + it('it should get the view objects for a document', function() { + var result; + var testElem = { + projectId: "heyaproject", + elementId: "heyanelement", + refId: 'master', + commitId: 'latest' + }; + $httpBackend.when('GET', root + '/elements/heyanelement').respond(testElem); + ViewServiceObj.addViewToParentView(testElem).then(function(data) { + result = data; + }, function(reason) { + result = reason.message; + }); + expect(result).toEqual(testElem); + }); + }); - describe('Method CreateView', function () { - it('create a view similar to the workspace state in app.js', inject(function () { - ViewService.createView( - undefined, - 'Untitled View', - undefined, - 'master', - 'viewDoc' - ).then( - function (data) { - //console.log(JSON.stringify(data)); - expect(data.name).toEqual('Untitled View') - expect(data.documentation).toEqual('') - expect(data.type).toEqual('Class') - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - it('create a view similar to the workspace state in the tree controller', inject(function () { - ViewService.createView( - ownerId, - 'create view for tree', - 'idMatchDocId', - 'master' - ).then( - function (data) { - expect(data.ownerId).toEqual( - 'MMS_1442345799882_df10c451-ab83-4b99-8e40-0a8e04b38b9d' - ) - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - }) - xdescribe('Method createDocument', function () { - it('create a document similar to the tree Controller', inject(function () { - ViewService.createDocument('newDocument', 'siteId', 'master').then( - function (data) { - //console.log("The long object " + JSON.stringify(data, null, " ")); - expect(data.name).toEqual('newDocument') - expect(data._view2view).toBeUndefined() - expect(data._contents.operand).toBeDefined() - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - it('should create a document without passing a name', inject(function () { - ViewService.createDocument(undefined, 'siteId', 'master').then( - function (data) { - //console.log("The long object " + JSON.stringify(data, null, " ")); - expect(data.name).toEqual('Untitled View') - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - }) - xdescribe('Method createInstanceSpecification', function () { - it('should update View object called like controller.utils without a name', inject(function () { - ViewService.createInstanceSpecification( - ownerId, - 'master', - 'Paragraph' - ).then( - function (data) { - //console.log("The long object " + JSON.stringify(data, null, " ")); - expect(data.type).toEqual('InstanceSpecification') - expect(data.name).toEqual('Untitled Paragraph') - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - it('should update view object without a site name, but with a name', inject(function () { - ViewService.createInstanceSpecification( - ownerId, - 'master', - 'Paragraph', - null, - 'named' - ).then( - function (data) { - //console.log("The long object " + JSON.stringify(data, null, " ")); - expect(data.type).toEqual('InstanceSpecification') - expect(data.name).toEqual('named') - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - it('should update view object with a site name and with a name', inject(function () { - ViewService.createInstanceSpecification( - ownerId, - 'master', - 'Paragraph', - 'siteId', - 'named' - ).then( - function (data) { - //console.log("The long object " + JSON.stringify(data, null, " ")); - expect(data.type).toEqual('InstanceSpecification') - expect(data.name).toEqual('named') - }, - function (reason) { - console.log('this happened' + reason) - } - ) - $httpBackend.flush() - })) - }) - xdescribe('Method getViewDatas', function () { - // getViewDatas = function(id, update, workspace, version, weight, eidss) - it('should return the latest element in the cache', function () { - var elem = { - sysmlId: 'elemId', - type: 'Class', - name: 'elemId', - documentation: '', - _appliedStereotypeIds: ['7929'], - } - CacheService.put('views|master|elemId|latest|elements', elem) - //console.log(CacheService.get('views|master|elemId|latest|elements')); - ViewService.getViewDatas('elemId', false, 'master', 'latest').then( - function (data) { - //console.log("The long object " + JSON.stringify(data, null, " ")); - expect(data.sysmlId).toEqual('elemId') - }, - function () { - console.log('fail') - } - ) - $rootScope.$apply() - //$httpBackend.flush(); - }) - it('should return promise from the inProgress queue', function () { - //inProgress structure should be replaced - }) - it('should return the element from the mock server', function () { - // get generic elements logic, returns a list of elements when you call by the url alone---applys to products and such - ViewService.getViewDatas('elemId', false, 'master', 'latest').then( - function (data) { - console.log( - 'The long object ' + JSON.stringify(data, null, ' ') - ) - }, - function () { - console.log('fail') - } - ) - $rootScope.$apply() - $httpBackend.flush() - }) - it('should return the element from the generic element method', function () { - // get generic elements logic, returns a list of elements when you call by the url alone---applys to products and such - ViewService.getViewDatas('elemId', false, 'master', 'latest').then( - function (data) { - console.log( - 'The long object ' + JSON.stringify(data, null, ' ') - ) - }, - function () { - console.log('fail') - } - ) - $rootScope.$apply() - $httpBackend.flush() - }) - }) -}) + describe('Method CreateView', function() { + it('create a view similar to the workspace state in app.js', inject(function() { + ViewService.createView(undefined, 'Untitled View', undefined, 'master', 'viewDoc').then(function(data) { + //console.log(JSON.stringify(data)); + expect(data.name).toEqual('Untitled View'); + expect(data.documentation).toEqual(''); + expect(data.type).toEqual('Class'); + }, function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + it('create a view similar to the workspace state in the tree controller', inject(function() { + ViewService.createView(ownerId, 'create view for tree', 'idMatchDocId', 'master').then(function(data){ + expect(data.ownerId).toEqual('MMS_1442345799882_df10c451-ab83-4b99-8e40-0a8e04b38b9d'); + }, + function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + }); + xdescribe('Method createDocument', function() { + it('create a document similar to the tree Controller', inject(function() { + ViewService.createDocument('newDocument','siteId' ,'master').then(function(data){ + //console.log("The long object " + JSON.stringify(data, null, " ")); + expect(data.name).toEqual('newDocument'); + expect(data._view2view).toBeUndefined(); + expect(data._contents.operand).toBeDefined(); + }, + function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + it('should create a document without passing a name', inject(function() { + ViewService.createDocument(undefined,'siteId' ,'master').then(function(data){ + //console.log("The long object " + JSON.stringify(data, null, " ")); + expect(data.name).toEqual('Untitled View'); + }, + function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + }); + xdescribe('Method createInstanceSpecification', function() { + it('should update View object called like controller.utils without a name', inject(function() { + ViewService.createInstanceSpecification(ownerId,'master', 'Paragraph').then(function(data){ + //console.log("The long object " + JSON.stringify(data, null, " ")); + expect(data.type).toEqual('InstanceSpecification'); + expect(data.name).toEqual('Untitled Paragraph'); + }, + function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + it('should update view object without a site name, but with a name', inject(function() { + ViewService.createInstanceSpecification(ownerId,'master', 'Paragraph', null, 'named').then(function(data){ + //console.log("The long object " + JSON.stringify(data, null, " ")); + expect(data.type).toEqual('InstanceSpecification'); + expect(data.name).toEqual('named'); + }, + function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + it('should update view object with a site name and with a name', inject(function() { + ViewService.createInstanceSpecification(ownerId,'master', 'Paragraph', 'siteId', 'named').then(function(data){ + //console.log("The long object " + JSON.stringify(data, null, " ")); + expect(data.type).toEqual('InstanceSpecification'); + expect(data.name).toEqual('named'); + }, + function(reason){ + console.log("this happened" + reason); + }); + $httpBackend.flush(); + })); + }); + xdescribe('Method getViewElements', function() { + // getViewElements = function(id, update, workspace, version, weight, eidss) + it('should return the latest element in the cache', function() { + var elem = {sysmlId:"elemId",type:"Class",name:"elemId", + documentation:"",_appliedStereotypeIds:["7929"]}; + CacheService.put('views|master|elemId|latest|elements', elem ); + //console.log(CacheService.get('views|master|elemId|latest|elements')); + ViewService.getViewElements('elemId', false, 'master','latest').then(function(data) { + //console.log("The long object " + JSON.stringify(data, null, " ")); + expect(data.sysmlId).toEqual('elemId'); + }, function(){ + console.log('fail'); + }); + $rootScope.$apply(); + //$httpBackend.flush(); + }); + it('should return promise from the inProgress queue', function() { + //inProgress structure should be replaced + }); + it('should return the element from the mock server', function() { + // get generic elements logic, returns a list of elements when you call by the url alone---applys to products and such + ViewService.getViewElements('elemId', false, 'master','latest').then(function(data) { + console.log("The long object " + JSON.stringify(data, null, " ")); + }, function(){ + console.log('fail'); + }); + $rootScope.$apply(); + $httpBackend.flush(); + }); + it('should return the element from the generic element method', function() { + // get generic elements logic, returns a list of elements when you call by the url alone---applys to products and such + ViewService.getViewElements('elemId', false, 'master','latest').then(function(data) { + console.log("The long object " + JSON.stringify(data, null, " ")); + }, function(){ + console.log('fail'); + }); + $rootScope.$apply(); + $httpBackend.flush(); + }); + }); +}); \ No newline at end of file diff --git a/test/develop/unit/pluginSpecs/autosave.spec.js b/test/develop/unit/pluginSpecs/autosave.spec.js old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/buildTreeHierarchy.json b/test/mock-data/UtilsService/buildTreeHierarchy.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/getIdInfo.json b/test/mock-data/UtilsService/getIdInfo.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/html/baselineMakeHtmlList.html b/test/mock-data/UtilsService/html/baselineMakeHtmlList.html old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/html/baselineMakeHtmlList_Ordered.html b/test/mock-data/UtilsService/html/baselineMakeHtmlList_Ordered.html old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/html/baselineMakeHtmlList_Unordered.html b/test/mock-data/UtilsService/html/baselineMakeHtmlList_Unordered.html old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/html/baselineMakeHtmlTable.html b/test/mock-data/UtilsService/html/baselineMakeHtmlTable.html old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/isRestrictedValue.json b/test/mock-data/UtilsService/isRestrictedValue.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/lessthan5000elements.json b/test/mock-data/UtilsService/lessthan5000elements.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/makeHtmlList_Ordered.json b/test/mock-data/UtilsService/makeHtmlList_Ordered.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/makeHtmlList_Unordered.json b/test/mock-data/UtilsService/makeHtmlList_Unordered.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/makeHtmlTable.json b/test/mock-data/UtilsService/makeHtmlTable.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/morethan5000elements.json b/test/mock-data/UtilsService/morethan5000elements.json old mode 100644 new mode 100755 diff --git a/test/mock-data/UtilsService/utilsservice-noneditablekeys.json b/test/mock-data/UtilsService/utilsservice-noneditablekeys.json old mode 100644 new mode 100755 diff --git a/test/mock-data/mmsHistory/historyElement.json b/test/mock-data/mmsHistory/historyElement.json old mode 100644 new mode 100755 diff --git a/test/mock-data/owner.js b/test/mock-data/owner.js old mode 100644 new mode 100755 diff --git a/test/mock-data/owner.json b/test/mock-data/owner.json old mode 100644 new mode 100755 diff --git a/yarn.lock b/yarn.lock old mode 100644 new mode 100755 index 8a869db56..ba5704e85 --- a/yarn.lock +++ b/yarn.lock @@ -2,6811 +2,7211 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== - dependencies: - "@jridgewell/gen-mapping" "^0.1.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.1.tgz" - integrity sha512-72a9ghR0gnESIa7jBN53U32FOVCEoztyIlKaNoU05zRhEecduGK9L9c3ww7Mp06JiR+0ls0GBPFJQwwtjn9ksg== - -"@babel/core@^7.0.0", "@babel/core@^7.1.6": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.19.1.tgz" - integrity sha512-1H8VgqXme4UXCRv7/Wa1bq7RVymKOzC7znjyFM8KiEzwFqcKUKYNoQef4GhdklgNvoBXyW4gYhuBNCM5o1zImw== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.0" - "@babel/helper-compilation-targets" "^7.19.1" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helpers" "^7.19.0" - "@babel/parser" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" - -"@babel/generator@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.19.0.tgz" - integrity sha512-S1ahxf1gZ2dpoiFgA+ohK9DIpz50bJ0CWs7Zlzb54Z4sG8qmdIrGrVqmy1sAtTVRb+9CU6U8VqT9L0Zj7hxHVg== - dependencies: - "@babel/types" "^7.19.0" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== - dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.1.tgz" - integrity sha512-LlLkkqhCMyz2lkQPvJNdIYU7O5YjWRgC2R4omjCTpZd8u8KMQzZvX4qce+/BluN1rcQiV7BoGUpmQ0LeHerbhg== - dependencies: - "@babel/compat-data" "^7.19.1" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz" - integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz" - integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.1.0" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== - -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz" - integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz" - integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw== - -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" - -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz" - integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw== - dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz" - integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw== - -"@babel/helper-validator-identifier@^7.18.6": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz" - integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/helpers@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz" - integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.19.0" - "@babel/types" "^7.19.0" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.6", "@babel/parser@^7.18.10", "@babel/parser@^7.19.1", "@babel/parser@^7.9.4": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.1.tgz" - integrity sha512-h7RCSorm1DdTVGJf3P2Mhj3kdnkmF/EiysUkzS2TdgAYqyjFdMQJbVuXOBej2SBJaXan/lIVtT6KkGbyyq753A== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - -"@babel/plugin-proposal-async-generator-functions@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz" - integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.1.0", "@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.1.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz" - integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q== - dependencies: - "@babel/compat-data" "^7.18.8" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.18.8" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.1.0", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz" - integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-flow@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-import-assertions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz" - integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz" - integrity sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"@jridgewell/gen-mapping@0.3.3": + "integrity" "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==" + "resolved" "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + "version" "0.3.3" + dependencies: + "@jridgewell/set-array" "1.1.2" + "@jridgewell/sourcemap-codec" "1.4.15" + "@jridgewell/trace-mapping" "0.3.19" + +"@jridgewell/resolve-uri@3.1.1": + "integrity" "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==" + "resolved" "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + "version" "3.1.1" + +"@jridgewell/set-array@1.1.2": + "integrity" "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + "resolved" "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + "version" "1.1.2" + +"@jridgewell/source-map@0.3.5": + "integrity" "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==" + "resolved" "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" + "version" "0.3.5" + dependencies: + "@jridgewell/gen-mapping" "0.3.3" + "@jridgewell/trace-mapping" "0.3.19" + +"@jridgewell/sourcemap-codec@1.4.15": + "integrity" "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "resolved" "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + "version" "1.4.15" + +"@jridgewell/trace-mapping@0.3.19": + "integrity" "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==" + "resolved" "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" + "version" "0.3.19" + dependencies: + "@jridgewell/resolve-uri" "3.1.1" + "@jridgewell/sourcemap-codec" "1.4.15" + +"@types/babel-types@7.0.11": + "integrity" "sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==" + "resolved" "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.11.tgz" + "version" "7.0.11" + +"@types/babylon@6.16.6": + "integrity" "sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w==" + "resolved" "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.6.tgz" + "version" "6.16.6" + dependencies: + "@types/babel-types" "7.0.11" + +"@types/node@6.14.13": + "integrity" "sha512-J1F0XJ/9zxlZel5ZlbeSuHW2OpabrUAqpFuC2sm2I3by8sERQ8+KCjNKUcq8QHuzpGMWiJpo9ZxeHrqrP2KzQw==" + "resolved" "https://registry.npmjs.org/@types/node/-/node-6.14.13.tgz" + "version" "6.14.13" + +"@types/q@0.0.32": + "integrity" "sha512-qYi3YV9inU/REEfxwVcGZzbS3KG/Xs90lv0Pr+lDtuVjBPGd1A+eciXzVSaRvLify132BfcvhvEjeVahrUl0Ug==" + "resolved" "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz" + "version" "0.0.32" + +"@types/selenium-webdriver@2.53.50": + "integrity" "sha512-VLagihTlCKBanWCo+45Sev2anP4OQY8B6ws2aeewAZVrQ0xZ9ZSI0CbeVx08CU2oRNfUdeM6RgZyXkLiL3e+GQ==" + "resolved" "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-2.53.50.tgz" + "version" "2.53.50" + +"@zeit/schemas@2.29.0": + "integrity" "sha512-g5QiLIfbg3pLuYUJPlisNKY+epQJTcMDsOnVNkscrDP1oi7vmJnzOANYJI/1pZcVJ6umUkBv3aFtlg1UvUHGzA==" + "resolved" "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.29.0.tgz" + "version" "2.29.0" + +"abbrev@1.0.9": + "integrity" "sha512-LEyx4aLEC3x6T0UguF6YILf+ntvmOaWsVfENmIW0E9H09vKlLDGelMjjSm0jkDHALj8A8quZ/HapKNigzwge+Q==" + "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz" + "version" "1.0.9" + +"abbrev@1.1.1": + "integrity" "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + "resolved" "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "version" "1.1.1" + +"accepts@1.3.8": + "integrity" "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==" + "resolved" "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + "version" "1.3.8" + dependencies: + "mime-types" "2.1.35" + "negotiator" "0.6.3" + +"acorn-globals@3.1.0": + "integrity" "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==" + "resolved" "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "acorn" "4.0.13" + +"acorn@3.3.0": + "integrity" "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz" + "version" "3.3.0" + +"acorn@4.0.13": + "integrity" "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + "version" "4.0.13" + +"acorn@8.10.0": + "integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==" + "resolved" "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + "version" "8.10.0" + +"adm-zip@^0.5.2": + "integrity" "sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==" + "resolved" "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz" + "version" "0.5.10" + +"adm-zip@0.4.4": + "integrity" "sha512-SYIiqLfr6QvmEM0yw89mD8ba2HjK+duf7oVPEw79+NPDqyQScAU8IgDPZzFt9CVdD2yaAuWJqFQGLkongB6cJQ==" + "resolved" "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.4.tgz" + "version" "0.4.4" + +"agent-base@2.1.1": + "integrity" "sha512-oDtZV740o3fr5oJtPLOsgH2hl2TRPscNXIx4VzzBwVlXVkv8RHm7XXqGAYg8t20+Gwu6LNDnx8HRMGqVGPZ8Vw==" + "resolved" "https://registry.npmjs.org/agent-base/-/agent-base-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "extend" "3.0.2" + "semver" "5.0.3" + +"ajv@6.12.6": + "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + "version" "6.12.6" + dependencies: + "fast-deep-equal" "3.1.3" + "fast-json-stable-stringify" "2.1.0" + "json-schema-traverse" "0.4.1" + "uri-js" "4.4.1" + +"ajv@8.11.0": + "integrity" "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==" + "resolved" "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" + "version" "8.11.0" + dependencies: + "fast-deep-equal" "^3.1.1" + "json-schema-traverse" "^1.0.0" + "require-from-string" "^2.0.2" + "uri-js" "^4.2.2" + +"align-text@0.1.4": + "integrity" "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==" + "resolved" "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "kind-of" "3.2.2" + "longest" "1.0.1" + "repeat-string" "1.6.1" + +"amdefine@1.0.1": + "integrity" "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==" + "resolved" "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + "version" "1.0.1" + +"ansi-align@^3.0.1": + "integrity" "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==" + "resolved" "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "string-width" "^4.1.0" + +"ansi-regex@^5.0.1": + "integrity" "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + "version" "5.0.1" + +"ansi-regex@^6.0.1": + "integrity" "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + "version" "6.0.1" + +"ansi-regex@0.1.0": + "integrity" "sha512-sKASJ0JEeHkkUN5A7GBQ1JH5EmBGi8dhl9KChCXV40kGmykzW4uLkVB8XbjV7598iK+I/HQOlqJGLCFA+1ZmzQ==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.1.0.tgz" + "version" "0.1.0" + +"ansi-regex@0.2.1": + "integrity" "sha512-sGwIGMjhYdW26/IhwK2gkWWI8DRCVO6uj3hYgHT+zD+QL1pa37tM3ujhyfcJIYSbsxp7Gxhy7zrRW/1AHm4BmA==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + "version" "0.2.1" + +"ansi-regex@1.1.1": + "integrity" "sha512-q5i8bFLg2wDfsuR56c1NzlJFPzVD+9mxhDrhqOGigEFa87OZHlF+9dWeGWzVTP/0ECiA/JUGzfzRr2t3eYORRw==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz" + "version" "1.1.1" + +"ansi-regex@2.1.1": + "integrity" "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + "version" "2.1.1" + +"ansi-regex@4.1.1": + "integrity" "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==" + "resolved" "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" + "version" "4.1.1" + +"ansi-styles@^2.2.1": + "integrity" "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + "version" "2.2.1" + +"ansi-styles@^6.1.0": + "integrity" "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + "version" "6.2.1" + +"ansi-styles@1.1.0": + "integrity" "sha512-f2PKUkN5QngiSemowa6Mrk9MPCdtFiOSmibjZ+j1qhLGHHYsqZwmBMRF3IRMVXo8sybDqx2fJl2d/8OphBoWkA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + "version" "1.1.0" + +"ansi-styles@2.2.1": + "integrity" "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + "version" "2.2.1" + +"ansi-styles@3.2.1": + "integrity" "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + "version" "3.2.1" + dependencies: + "color-convert" "1.9.3" + +"ansi-styles@4.3.0": + "integrity" "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==" + "resolved" "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + "version" "4.3.0" + dependencies: + "color-convert" "2.0.1" + +"anymatch@1.3.2": + "integrity" "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==" + "resolved" "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "micromatch" "2.3.11" + "normalize-path" "2.1.1" + +"aproba@1.2.0": + "integrity" "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + "resolved" "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz" + "version" "1.2.0" + +"arch@^2.2.0": + "integrity" "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==" + "resolved" "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz" + "version" "2.2.0" + +"archy@0.0.2": + "integrity" "sha512-8mMsetjXv4pCPTrMbPPO2cxy9vzJn2jwbd+ug+mf8fEUZG2E78Vo5erJMjrnGuLTKqOLtS5ulFHJSfg1yaCjxA==" + "resolved" "https://registry.npmjs.org/archy/-/archy-0.0.2.tgz" + "version" "0.0.2" + +"are-we-there-yet@1.1.7": + "integrity" "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==" + "resolved" "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz" + "version" "1.1.7" + dependencies: + "delegates" "1.0.0" + "readable-stream" "2.3.8" + +"arg@5.0.2": + "integrity" "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + "resolved" "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + "version" "5.0.2" + +"argparse@1.0.10": + "integrity" "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==" + "resolved" "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "sprintf-js" "1.0.3" + +"arr-diff@2.0.0": + "integrity" "sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==" + "resolved" "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "arr-flatten" "1.1.0" + +"arr-diff@4.0.0": + "integrity" "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==" + "resolved" "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + "version" "4.0.0" + +"arr-flatten@1.1.0": + "integrity" "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "resolved" "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + "version" "1.1.0" + +"arr-union@3.1.0": + "integrity" "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==" + "resolved" "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + "version" "3.1.0" + +"array-each@1.0.1": + "integrity" "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==" + "resolved" "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz" + "version" "1.0.1" + +"array-filter@0.0.1": + "integrity" "sha512-VW0FpCIhjZdarWjIz8Vpva7U95fl2Jn+b+mmFFMLn8PIVscOQcAgEznwUzTEuUHuqZqIxwzRlcaN/urTFFQoiw==" + "resolved" "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz" + "version" "0.0.1" + +"array-find-index@1.0.2": + "integrity" "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==" + "resolved" "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + "version" "1.0.2" + +"array-map@0.0.1": + "integrity" "sha512-sxHIeJTGEsRC8/hYkZzdJNNPZ41EXHVys7pqMw1iwE/Kx8/hto0UbDuGQsSJ0ujPovj9qUZl6EOY/EiZ2g3d9Q==" + "resolved" "https://registry.npmjs.org/array-map/-/array-map-0.0.1.tgz" + "version" "0.0.1" + +"array-reduce@0.0.0": + "integrity" "sha512-8jR+StqaC636u7h3ye1co3lQRefgVVUQUhuAmRbDqIMeR2yuXzRvkCNQiQ5J/wbREmoBLNtp13dhaaVpZQDRUw==" + "resolved" "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz" + "version" "0.0.0" + +"array-slice@1.1.0": + "integrity" "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==" + "resolved" "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz" + "version" "1.1.0" + +"array-union@1.0.2": + "integrity" "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==" + "resolved" "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "array-uniq" "1.0.3" + +"array-uniq@1.0.3": + "integrity" "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==" + "resolved" "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + "version" "1.0.3" + +"array-unique@0.2.1": + "integrity" "sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==" + "resolved" "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" + "version" "0.2.1" + +"array-unique@0.3.2": + "integrity" "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==" + "resolved" "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + "version" "0.3.2" + +"arrify@1.0.1": + "integrity" "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==" + "resolved" "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + "version" "1.0.1" + +"asap@2.0.6": + "integrity" "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + "resolved" "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + "version" "2.0.6" + +"asn1@0.1.11": + "integrity" "sha512-Fh9zh3G2mZ8qM/kwsiKwL2U2FmXxVsboP4x1mXjnhKHv3SmzaBZoYvxEQJz/YS2gnCgd8xlAVWcZnQyC9qZBsA==" + "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz" + "version" "0.1.11" + +"asn1@0.2.6": + "integrity" "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==" + "resolved" "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + "version" "0.2.6" + dependencies: + "safer-buffer" "2.1.2" + +"assert-plus@0.1.5": + "integrity" "sha512-brU24g7ryhRwGCI2y+1dGQmQXiZF7TtIj583S96y0jjdajIe6wn8BuXyELYhvD22dtIxDQVFk04YTJwwdwOYJw==" + "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz" + "version" "0.1.5" + +"assert-plus@1.0.0": + "integrity" "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" + "resolved" "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + "version" "1.0.0" + +"assign-symbols@1.0.0": + "integrity" "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" + "resolved" "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" + "version" "1.0.0" + +"async-each@1.0.6": + "integrity" "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==" + "resolved" "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz" + "version" "1.0.6" + +"async-foreach@0.1.3": + "integrity" "sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==" + "resolved" "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz" + "version" "0.1.3" + +"async@0.2.10": + "integrity" "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + "resolved" "https://registry.npmjs.org/async/-/async-0.2.10.tgz" + "version" "0.2.10" + +"async@0.9.2": + "integrity" "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" + "resolved" "https://registry.npmjs.org/async/-/async-0.9.2.tgz" + "version" "0.9.2" + +"async@1.5.2": + "integrity" "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + "resolved" "https://registry.npmjs.org/async/-/async-1.5.2.tgz" + "version" "1.5.2" + +"async@2.6.4": + "integrity" "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==" + "resolved" "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + "version" "2.6.4" + dependencies: + "lodash" "4.17.21" + +"async@3.2.4": + "integrity" "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + "resolved" "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + "version" "3.2.4" + +"asynckit@0.4.0": + "integrity" "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "resolved" "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + "version" "0.4.0" + +"atob@2.1.2": + "integrity" "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + "resolved" "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + "version" "2.1.2" + +"aws-sign2@0.5.0": + "integrity" "sha512-oqUX0DM5j7aPWPCnpWebiyNIj2wiNI87ZxnOMoGv0aE4TGlBy2N+5iWc6dQ/NOKZaBD2W6PVz8jtOGkWzSC5EA==" + "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz" + "version" "0.5.0" + +"aws-sign2@0.7.0": + "integrity" "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" + "resolved" "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + "version" "0.7.0" + +"aws4@1.12.0": + "integrity" "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + "resolved" "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz" + "version" "1.12.0" + +"babel-polyfill@^6.26.0": + "integrity" "sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==" + "resolved" "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz" + "version" "6.26.0" + dependencies: + "babel-runtime" "6.26.0" + "core-js" "2.6.12" + "regenerator-runtime" "0.10.5" + +"babel-runtime@6.26.0": + "integrity" "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==" + "resolved" "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" + "version" "6.26.0" + dependencies: + "core-js" "2.6.12" + "regenerator-runtime" "0.11.1" + +"babel-types@6.26.0": + "integrity" "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==" + "resolved" "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz" + "version" "6.26.0" + dependencies: + "babel-runtime" "6.26.0" + "esutils" "2.0.3" + "lodash" "4.17.21" + "to-fast-properties" "1.0.3" + +"babylon@6.18.0": + "integrity" "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + "resolved" "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz" + "version" "6.18.0" + +"balanced-match@1.0.2": + "integrity" "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + "resolved" "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + "version" "1.0.2" + +"base@0.11.2": + "integrity" "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==" + "resolved" "https://registry.npmjs.org/base/-/base-0.11.2.tgz" + "version" "0.11.2" + dependencies: + "cache-base" "1.0.1" + "class-utils" "0.3.6" + "component-emitter" "1.3.0" + "define-property" "1.0.0" + "isobject" "3.0.1" + "mixin-deep" "1.3.2" + "pascalcase" "0.1.1" + +"basic-auth@2.0.1": + "integrity" "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==" + "resolved" "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "safe-buffer" "5.1.2" + +"batch@0.6.1": + "integrity" "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + "resolved" "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + "version" "0.6.1" + +"bcrypt-pbkdf@1.0.2": + "integrity" "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==" + "resolved" "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "tweetnacl" "0.14.5" + +"binary-extensions@1.13.1": + "integrity" "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + "resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz" + "version" "1.13.1" + +"binary@0.3.0": + "integrity" "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==" + "resolved" "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "buffers" "0.1.1" + "chainsaw" "0.1.0" + +"bindings@1.5.0": + "integrity" "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==" + "resolved" "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "file-uri-to-path" "1.0.0" + +"bl@0.9.5": + "integrity" "sha512-njlCs8XLBIK7LCChTWfzWuIAxkpmmLXcL7/igCofFT1B039Sz0IPnAmosN5QaO22lU4qr8LcUz2ojUlE6pLkRQ==" + "resolved" "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz" + "version" "0.9.5" + dependencies: + "readable-stream" "1.0.34" + +"block-stream@0.0.9": + "integrity" "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==" + "resolved" "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz" + "version" "0.0.9" + dependencies: + "inherits" "2.0.4" + +"blocking-proxy@1.0.1": + "integrity" "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==" + "resolved" "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "minimist" "1.2.8" + +"body@5.1.0": + "integrity" "sha512-chUsBxGRtuElD6fmw1gHLpvnKdVLK302peeFa9ZqAEk8TyzZ3fygLyUEDDPTJvL9+Bor0dIwn6ePOsRM2y0zQQ==" + "resolved" "https://registry.npmjs.org/body/-/body-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "continuable-cache" "0.3.1" + "error" "7.2.1" + "raw-body" "1.1.7" + "safe-json-parse" "1.0.1" + +"boom@0.4.2": + "integrity" "sha512-OvfN8y1oAxxphzkl2SnCS+ztV/uVKTATtgLjWYg/7KwcNyf3rzpHxNQJZCKtsZd4+MteKczhWbSjtEX4bGgU9g==" + "resolved" "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + "version" "0.4.2" + dependencies: + "hoek" "0.9.1" + +"bower-config@0.5.3": + "integrity" "sha512-Ly0EwAJGD5fX7y7vSvgo+yKPh+oME9jYd5Npqecxs5izpjV8aMZGF3j1ZhDDOCBIFDVNk+gGmKZAFAPmr86jLQ==" + "resolved" "https://registry.npmjs.org/bower-config/-/bower-config-0.5.3.tgz" + "version" "0.5.3" + dependencies: + "graceful-fs" "2.0.3" + "mout" "0.9.1" + "optimist" "0.6.1" + "osenv" "0.0.3" + +"bower-config@1.4.3": + "integrity" "sha512-MVyyUk3d1S7d2cl6YISViwJBc2VXCkxF5AUFykvN0PQj5FsUiMNSgAYTso18oRFfyZ6XEtjrgg9MAaufHbOwNw==" + "resolved" "https://registry.npmjs.org/bower-config/-/bower-config-1.4.3.tgz" + "version" "1.4.3" + dependencies: + "graceful-fs" "4.2.11" + "minimist" "0.2.4" + "mout" "1.2.4" + "osenv" "0.1.5" + "untildify" "2.1.0" + "wordwrap" "0.0.3" + +"bower-endpoint-parser@0.2.2": + "integrity" "sha512-YWZHhWkPdXtIfH3VRu3QIV95sa75O9vrQWBOHjexWCLBCTy5qJvRr36LXTqFwTchSXVlzy5piYJOjzHr7qhsNg==" + "resolved" "https://registry.npmjs.org/bower-endpoint-parser/-/bower-endpoint-parser-0.2.2.tgz" + "version" "0.2.2" + +"bower-installer@git://github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7": + "resolved" "git+ssh://git@github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7" + dependencies: + "async" "0.2.10" + "bower" "1.3.12" + "colors" "0.6.2" + "glob" "3.2.11" + "lodash" "0.9.2" + "mkdirp" "0.3.5" + "node-fs" "0.1.7" + "nopt" "2.1.2" + +"bower-json@0.4.0": + "integrity" "sha512-CiCTvl2OndArvZjWYvaOuQWI/fjeaBz8wPLF8MWadHT+ULaBDqtQIOYqQFsxtzUFw6E206960mlZfiUuR1PPBg==" + "resolved" "https://registry.npmjs.org/bower-json/-/bower-json-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "deep-extend" "0.2.11" + "graceful-fs" "2.0.3" + "intersect" "0.0.3" + +"bower-logger@0.2.2": + "integrity" "sha512-2x4n3GsmV6w3BeMK3zHv6T88HbuMQH2MJ0KZNbQMbJq8XPARdH1p9/CXsdkOBW5sMcnBCOVGxutDJYbkh2A7QQ==" + "resolved" "https://registry.npmjs.org/bower-logger/-/bower-logger-0.2.2.tgz" + "version" "0.2.2" + +"bower-registry-client@0.2.4": + "integrity" "sha512-QtwcgMsDMWvCtA1yrOmahanAFMt5IWjF79erdi366r0X/AZxYwsLyHiAsb1o9WVy4kZb2Sp7kpZRiyN1X0rDiA==" + "resolved" "https://registry.npmjs.org/bower-registry-client/-/bower-registry-client-0.2.4.tgz" + "version" "0.2.4" + dependencies: + "async" "0.2.10" + "bower-config" "0.5.3" + "graceful-fs" "2.0.3" + "lru-cache" "2.3.1" + "mkdirp" "0.3.5" + "request" "2.51.0" + "request-replay" "0.2.0" + "rimraf" "2.2.8" + +"bower@1.3.12": + "integrity" "sha512-YqGbbhwrQHbHI9+M8tVHbq5twIhVfJaQRM3TOmgtz5Dh9sPwYjiT8oo8MIhv0Ma+c4xVsABB+B3ooMJC8hdcbw==" + "resolved" "https://registry.npmjs.org/bower/-/bower-1.3.12.tgz" + "version" "1.3.12" + dependencies: + "abbrev" "1.0.9" + "archy" "0.0.2" + "bower-config" "0.5.3" + "bower-endpoint-parser" "0.2.2" + "bower-json" "0.4.0" + "bower-logger" "0.2.2" + "bower-registry-client" "0.2.4" + "cardinal" "0.4.0" + "chalk" "0.5.0" + "chmodr" "0.1.0" + "decompress-zip" "0.0.8" + "fstream" "1.0.12" + "fstream-ignore" "1.0.5" + "glob" "4.0.6" + "graceful-fs" "3.0.12" + "handlebars" "2.0.0" + "inquirer" "0.7.1" + "insight" "0.4.3" + "is-root" "1.0.0" + "junk" "1.0.3" + "lockfile" "1.0.4" + "lru-cache" "2.5.2" + "mkdirp" "0.5.0" + "mout" "0.9.1" + "nopt" "3.0.6" + "opn" "1.0.2" + "osenv" "0.1.0" + "p-throttler" "0.1.0" + "promptly" "0.2.0" + "q" "1.0.1" + "request" "2.42.0" + "request-progress" "0.3.0" + "retry" "0.6.0" + "rimraf" "2.2.8" + "semver" "2.3.2" + "shell-quote" "1.4.3" + "stringify-object" "1.0.1" + "tar-fs" "0.5.2" + "tmp" "0.0.23" + "update-notifier" "0.2.0" + "which" "1.0.9" + +"bower@1.8.14": + "integrity" "sha512-8Rq058FD91q9Nwthyhw0la9fzpBz0iwZTrt51LWl+w+PnJgZk9J+5wp3nibsJcIUPglMYXr4NRBaR+TUj0OkBQ==" + "resolved" "https://registry.npmjs.org/bower/-/bower-1.8.14.tgz" + "version" "1.8.14" + +"boxen@7.0.0": + "integrity" "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==" + "resolved" "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz" + "version" "7.0.0" + dependencies: + "ansi-align" "^3.0.1" + "camelcase" "^7.0.0" + "chalk" "^5.0.1" + "cli-boxes" "^3.0.0" + "string-width" "^5.1.2" + "type-fest" "^2.13.0" + "widest-line" "^4.0.1" + "wrap-ansi" "^8.0.1" + +"brace-expansion@^1.1.7", "brace-expansion@1.1.11": + "integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==" + "resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + "version" "1.1.11" + dependencies: + "balanced-match" "1.0.2" + "concat-map" "0.0.1" + +"braces@1.8.5": + "integrity" "sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==" + "resolved" "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz" + "version" "1.8.5" + dependencies: + "expand-range" "1.8.2" + "preserve" "0.2.0" + "repeat-element" "1.1.4" + +"braces@2.3.2": + "integrity" "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==" + "resolved" "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" + "version" "2.3.2" + dependencies: + "arr-flatten" "1.1.0" + "array-unique" "0.3.2" + "extend-shallow" "2.0.1" + "fill-range" "4.0.0" + "isobject" "3.0.1" + "repeat-element" "1.1.4" + "snapdragon" "0.8.2" + "snapdragon-node" "2.1.1" + "split-string" "3.1.0" + "to-regex" "3.0.2" + +"braces@3.0.2": + "integrity" "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==" + "resolved" "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "fill-range" "7.0.1" + +"buffer-crc32@0.2.13": + "integrity" "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" + "resolved" "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + "version" "0.2.13" + +"buffer-from@1.1.2": + "integrity" "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "resolved" "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + "version" "1.1.2" + +"buffers@0.1.1": + "integrity" "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + "resolved" "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" + "version" "0.1.1" + +"bytes@1.0.0": + "integrity" "sha512-/x68VkHLeTl3/Ll8IvxdwzhrT+IyKc52e/oyHhA2RwqPqswSnjVbSddfPRwAsJtbilMAPSRWwAlpxdYsSWOTKQ==" + "resolved" "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz" + "version" "1.0.0" + +"bytes@3.0.0": + "integrity" "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + "resolved" "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + "version" "3.0.0" + +"c3@^0.5.4": + "integrity" "sha512-+Ido5E9fAM6Tn+v7MI5VxYbQwCn59WxW+wMfWdgQ4PS3NZu/yG8EwiXW/ZB//kFUmLplEkWabE9kn1ckC6YZ/w==" + "resolved" "https://registry.npmjs.org/c3/-/c3-0.5.4.tgz" + "version" "0.5.4" + dependencies: + "d3" "4.13.0" + +"cache-base@1.0.1": + "integrity" "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==" + "resolved" "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "collection-visit" "1.0.0" + "component-emitter" "1.3.0" + "get-value" "2.0.6" + "has-value" "1.0.0" + "isobject" "3.0.1" + "set-value" "2.0.1" + "to-object-path" "0.3.0" + "union-value" "1.0.1" + "unset-value" "1.0.0" + +"cache-breaker@0.0.4": + "integrity" "sha512-LPJldJ74iN43nAZl/IRRc9SKtlKymhftnlROHXsUmCLjM/yZHO17zDICoAHyluxmUSkI8A3hrFlR6cDsWwQ95Q==" + "resolved" "https://registry.npmjs.org/cache-breaker/-/cache-breaker-0.0.4.tgz" + "version" "0.0.4" + dependencies: + "lodash" "2.2.1" + +"call-bind@1.0.2": + "integrity" "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==" + "resolved" "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "function-bind" "1.1.1" + "get-intrinsic" "1.2.1" + +"camel-case@3.0.0": + "integrity" "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==" + "resolved" "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "no-case" "2.3.2" + "upper-case" "1.1.3" + +"camelcase-keys@2.1.0": + "integrity" "sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==" + "resolved" "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "camelcase" "2.1.1" + "map-obj" "1.0.1" + +"camelcase@^7.0.0": + "integrity" "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz" + "version" "7.0.1" + +"camelcase@1.2.1": + "integrity" "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + "version" "1.2.1" + +"camelcase@2.1.1": + "integrity" "sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz" + "version" "2.1.1" + +"camelcase@5.3.1": + "integrity" "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "resolved" "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + "version" "5.3.1" + +"cardinal@0.4.0": + "integrity" "sha512-v9AEoI0C3hrH8+zh1qcns1KiAaDWmF8siZMXCS6rHbTL3y+R9oP34KESnSnZL+4/L1wVAKPlCRD+kF4aR4YN+w==" + "resolved" "https://registry.npmjs.org/cardinal/-/cardinal-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "redeyed" "0.4.4" + +"caseless@0.12.0": + "integrity" "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + "version" "0.12.0" + +"caseless@0.6.0": + "integrity" "sha512-/X9C8oGbZJ95LwJyK4XvN9GSBgw/rqBnUg6mejGhf/GNfJukt5tzOXP+CJicXdWSqAX0ETaufLDxXuN2m4/mDg==" + "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.6.0.tgz" + "version" "0.6.0" + +"caseless@0.8.0": + "integrity" "sha512-RtOAnto0D6IIVC+dU+vHyH0tXs6BfZ/s0kaaT5+6loiwoi9O3+J5iASBkliQHrd8GSRNGERS7f8pgaRc895bAg==" + "resolved" "https://registry.npmjs.org/caseless/-/caseless-0.8.0.tgz" + "version" "0.8.0" + +"center-align@0.1.3": + "integrity" "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==" + "resolved" "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz" + "version" "0.1.3" + dependencies: + "align-text" "0.1.4" + "lazy-cache" "1.0.4" + +"chainsaw@0.1.0": + "integrity" "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==" + "resolved" "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "traverse" "0.3.9" + +"chalk-template@0.4.0": + "integrity" "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==" + "resolved" "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz" + "version" "0.4.0" + dependencies: + "chalk" "^4.1.2" + +"chalk@^1.1.1": + "integrity" "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "ansi-styles" "^2.2.1" + "escape-string-regexp" "^1.0.2" + "has-ansi" "^2.0.0" + "strip-ansi" "^3.0.0" + "supports-color" "^2.0.0" + +"chalk@^4.1.2", "chalk@4.1.2": + "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "ansi-styles" "4.3.0" + "supports-color" "7.2.0" + +"chalk@^5.0.1": + "integrity" "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" + "version" "5.3.0" + +"chalk@0.5.0": + "integrity" "sha512-rTCcbF0wrwC+kKzA/3SpBc6PrcOx/+PRQVtS3PEDw5tGzqycpB48dRS8ByxFDd8Ij5E1RtafZ34R1X9VLI/vUQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-0.5.0.tgz" + "version" "0.5.0" + dependencies: + "ansi-styles" "1.1.0" + "escape-string-regexp" "1.0.5" + "has-ansi" "0.1.0" + "strip-ansi" "0.3.0" + "supports-color" "0.2.0" + +"chalk@0.5.1": + "integrity" "sha512-bIKA54hP8iZhyDT81TOsJiQvR1gW+ZYSXFaZUAvoD4wCHdbHY2actmpTE4x344ZlFqHbvoxKOaESULTZN2gstg==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + "version" "0.5.1" + dependencies: + "ansi-styles" "1.1.0" + "escape-string-regexp" "1.0.5" + "has-ansi" "0.1.0" + "strip-ansi" "0.3.0" + "supports-color" "0.2.0" + +"chalk@1.1.3": + "integrity" "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "ansi-styles" "2.2.1" + "escape-string-regexp" "1.0.5" + "has-ansi" "2.0.0" + "strip-ansi" "3.0.1" + "supports-color" "2.0.0" + +"chalk@2.4.2": + "integrity" "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + "version" "2.4.2" + dependencies: + "ansi-styles" "3.2.1" + "escape-string-regexp" "1.0.5" + "supports-color" "5.5.0" + +"chalk@5.0.1": + "integrity" "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==" + "resolved" "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz" + "version" "5.0.1" + +"change-case@3.0.2": + "integrity" "sha512-Mww+SLF6MZ0U6kdg11algyKd5BARbyM4TbFBepwowYSR5ClfQGCGtxNXgykpN0uF/bstWeaGDT4JWaDh8zWAHA==" + "resolved" "https://registry.npmjs.org/change-case/-/change-case-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "camel-case" "3.0.0" + "constant-case" "2.0.0" + "dot-case" "2.1.1" + "header-case" "1.0.1" + "is-lower-case" "1.1.3" + "is-upper-case" "1.1.2" + "lower-case" "1.1.4" + "lower-case-first" "1.0.2" + "no-case" "2.3.2" + "param-case" "2.1.1" + "pascal-case" "2.0.1" + "path-case" "2.1.1" + "sentence-case" "2.1.1" + "snake-case" "2.1.0" + "swap-case" "1.1.2" + "title-case" "2.1.1" + "upper-case" "1.1.3" + "upper-case-first" "1.1.2" + +"character-parser@2.2.0": + "integrity" "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==" + "resolved" "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "is-regex" "1.1.4" + +"chmodr@0.1.0": + "integrity" "sha512-TAHgbpLNK/h5D8qvtBUKc892GXWqGLkGmoEv6V2NUDTRCw2nI9IvbFi89cbEAooGwyqAZsePjyuLiWBj+H0twQ==" + "resolved" "https://registry.npmjs.org/chmodr/-/chmodr-0.1.0.tgz" + "version" "0.1.0" + +"chokidar@1.7.0": + "integrity" "sha512-mk8fAWcRUOxY7btlLtitj3A45jOwSAxH4tOFOoEGbVsl6cL6pPMWUy7dwZ/canfj3QEdP6FHSnf/l1c6/WkzVg==" + "resolved" "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz" + "version" "1.7.0" + dependencies: + "anymatch" "1.3.2" + "async-each" "1.0.6" + "glob-parent" "2.0.0" + "inherits" "2.0.4" + "is-binary-path" "1.0.1" + "is-glob" "2.0.1" + "path-is-absolute" "1.0.1" + "readdirp" "2.2.1" + optionalDependencies: + "fsevents" "1.2.13" + +"class-utils@0.3.6": + "integrity" "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==" + "resolved" "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" + "version" "0.3.6" + dependencies: + "arr-union" "3.1.0" + "define-property" "0.2.5" + "isobject" "3.0.1" + "static-extend" "0.1.2" + +"clean-css@3.4.28": + "integrity" "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==" + "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz" + "version" "3.4.28" + dependencies: + "commander" "2.8.1" + "source-map" "0.4.4" + +"clean-css@4.1.11": + "integrity" "sha512-a3ZEe58u+LizPdSCHM0jIGeKu1hN+oqqXXc1i70mnV0x2Ox3/ho1pE6Y8HD6yhDts5lEQs028H9kutlihP77uQ==" + "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-4.1.11.tgz" + "version" "4.1.11" + dependencies: + "source-map" "0.5.7" + +"clean-css@4.2.4": + "integrity" "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==" + "resolved" "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz" + "version" "4.2.4" + dependencies: + "source-map" "0.6.1" + +"cli-boxes@^3.0.0": + "integrity" "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==" + "resolved" "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" + "version" "3.0.0" + +"cli-color@0.3.3": + "integrity" "sha512-e8BuO18ajBxfbL2eJldk8VgYDjshE8hV1ECafR0pl5EzgbyK9YnmGWLHylXVrQgaK4J1SJJzWDjIncfVuJvtpg==" + "resolved" "https://registry.npmjs.org/cli-color/-/cli-color-0.3.3.tgz" + "version" "0.3.3" + dependencies: + "d" "0.1.1" + "es5-ext" "0.10.62" + "memoizee" "0.3.10" + "timers-ext" "0.1.7" + +"cli@1.0.1": + "integrity" "sha512-41U72MB56TfUMGndAKK8vJ78eooOD4Z5NOL4xEfjc0c23s+6EYKXlXsmACBVclLP1yOfWCgEganVzddVrSNoTg==" + "resolved" "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "exit" "0.1.2" + "glob" "7.1.7" + +"clipboardy@3.0.0": + "integrity" "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==" + "resolved" "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "arch" "^2.2.0" + "execa" "^5.1.1" + "is-wsl" "^2.2.0" + +"cliui@2.1.0": + "integrity" "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "center-align" "0.1.3" + "right-align" "0.1.3" + "wordwrap" "0.0.2" + +"cliui@5.0.0": + "integrity" "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==" + "resolved" "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "string-width" "3.1.0" + "strip-ansi" "5.2.0" + "wrap-ansi" "5.1.0" + +"code-point-at@1.1.0": + "integrity" "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==" + "resolved" "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + "version" "1.1.0" + +"collection-visit@1.0.0": + "integrity" "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==" + "resolved" "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "map-visit" "1.0.0" + "object-visit" "1.0.1" + +"color-convert@1.9.3": + "integrity" "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + "version" "1.9.3" + dependencies: + "color-name" "1.1.3" + +"color-convert@2.0.1": + "integrity" "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==" + "resolved" "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "color-name" "1.1.4" + +"color-name@1.1.3": + "integrity" "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + "version" "1.1.3" + +"color-name@1.1.4": + "integrity" "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "resolved" "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + "version" "1.1.4" + +"colors@0.6.2": + "integrity" "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==" + "resolved" "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + "version" "0.6.2" + +"colors@1.1.2": + "integrity" "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==" + "resolved" "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" + "version" "1.1.2" + +"combined-stream@0.0.7": + "integrity" "sha512-qfexlmLp9MyrkajQVyjEDb0Vj+KhRgR/rxLiVhaihlT+ZkX0lReqtH6Ack40CvMDERR4b5eFp3CreskpBs1Pig==" + "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz" + "version" "0.0.7" + dependencies: + "delayed-stream" "0.0.5" + +"combined-stream@1.0.8": + "integrity" "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==" + "resolved" "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "delayed-stream" "1.0.0" + +"commander@2.20.3": + "integrity" "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "resolved" "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" + "version" "2.20.3" + +"commander@2.8.1": + "integrity" "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==" + "resolved" "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz" + "version" "2.8.1" + dependencies: + "graceful-readlink" "1.0.1" + +"commander@2.9.0": + "integrity" "sha512-bmkUukX8wAOjHdN26xj5c4ctEV22TQ7dQYhSmuckKhToXrkUn0iIaolHdIxYYqD55nhpSPA9zPQ1yP57GdXP2A==" + "resolved" "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + "version" "2.9.0" + dependencies: + "graceful-readlink" "1.0.1" + +"component-emitter@1.3.0": + "integrity" "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "resolved" "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" + "version" "1.3.0" + +"compressible@2.0.18": + "integrity" "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==" + "resolved" "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + "version" "2.0.18" + dependencies: + "mime-db" "1.52.0" + +"compression@^1.7.1", "compression@1.7.4": + "integrity" "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==" + "resolved" "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + "version" "1.7.4" + dependencies: + "accepts" "1.3.8" + "bytes" "3.0.0" + "compressible" "2.0.18" + "debug" "2.6.9" + "on-headers" "1.0.2" + "safe-buffer" "5.1.2" + "vary" "1.1.2" + +"concat-map@0.0.1": + "integrity" "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "resolved" "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + "version" "0.0.1" + +"concat-stream@1.6.2": + "integrity" "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==" + "resolved" "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz" + "version" "1.6.2" + dependencies: + "buffer-from" "1.1.2" + "inherits" "2.0.4" + "readable-stream" "2.3.8" + "typedarray" "0.0.6" + +"config-chain@1.1.13": + "integrity" "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==" + "resolved" "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" + "version" "1.1.13" + dependencies: + "ini" "1.3.8" + "proto-list" "1.2.4" + +"configstore@0.3.2": + "integrity" "sha512-2aMMi3erDQwgL7BgnW0aIzILAikpVH4TVEz60F/naT+XsPPX6IaPEuF/zD28XSNFWO/mHQ9OVRxkvcSbq6EFdA==" + "resolved" "https://registry.npmjs.org/configstore/-/configstore-0.3.2.tgz" + "version" "0.3.2" + dependencies: + "graceful-fs" "3.0.12" + "js-yaml" "3.14.1" + "mkdirp" "0.5.6" + "object-assign" "2.1.1" + "osenv" "0.1.5" + "user-home" "1.1.1" + "uuid" "2.0.3" + "xdg-basedir" "1.0.1" + +"connect-livereload@^0.6.0": + "integrity" "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==" + "resolved" "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz" + "version" "0.6.1" + +"connect-livereload@0.5.4": + "integrity" "sha512-3KnRwsWf4VmP01I4hCDQqTc4e2UxOvJIi8i08GiwqX2oymzxNFY7PqjFkwHglYTJ0yzUJkO5yqdPxVaIz3Pbug==" + "resolved" "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz" + "version" "0.5.4" + +"connect-modrewrite@^0.10.2": + "integrity" "sha512-37+kS9t26vxjW5ErNrr8d04F7Us1EH7XhHtxSm8yE8kO2uDF2DsPI+qI2wCeBSaoakXKit0/88sg4vL2Wl8tDw==" + "resolved" "https://registry.npmjs.org/connect-modrewrite/-/connect-modrewrite-0.10.2.tgz" + "version" "0.10.2" + dependencies: + "qs" "6.11.2" + +"connect@3.7.0": + "integrity" "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==" + "resolved" "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz" + "version" "3.7.0" + dependencies: + "debug" "2.6.9" + "finalhandler" "1.1.2" + "parseurl" "1.3.3" + "utils-merge" "1.0.1" + +"console-browserify@1.1.0": + "integrity" "sha512-duS7VP5pvfsNLDvL1O4VOEbw37AI3A4ZUQYemvDlnpGrNu9tprR7BYWpDYwC0Xia0Zxz5ZupdiIrUp0GH1aXfg==" + "resolved" "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "date-now" "0.1.4" + +"console-control-strings@1.1.0": + "integrity" "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + "resolved" "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz" + "version" "1.1.0" + +"constant-case@2.0.0": + "integrity" "sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==" + "resolved" "https://registry.npmjs.org/constant-case/-/constant-case-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "snake-case" "2.1.0" + "upper-case" "1.1.3" + +"constantinople@3.1.2": + "integrity" "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==" + "resolved" "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "@types/babel-types" "7.0.11" + "@types/babylon" "6.16.6" + "babel-types" "6.26.0" + "babylon" "6.18.0" + +"content-disposition@0.5.2": + "integrity" "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" + "resolved" "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + "version" "0.5.2" + +"continuable-cache@0.3.1": + "integrity" "sha512-TF30kpKhTH8AGCG3dut0rdd/19B7Z+qCnrMoBLpyQu/2drZdNrrpcjPEoJeSVsQM+8KmWG5O56oPDjSSUsuTyA==" + "resolved" "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz" + "version" "0.3.1" + +"copy-descriptor@0.1.1": + "integrity" "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==" + "resolved" "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + "version" "0.1.1" + +"core-js@2.6.12": + "integrity" "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + "resolved" "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz" + "version" "2.6.12" + +"core-util-is@1.0.2": + "integrity" "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + "version" "1.0.2" + +"core-util-is@1.0.3": + "integrity" "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + "resolved" "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + "version" "1.0.3" + +"cross-spawn@^7.0.3": + "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + "version" "7.0.3" + dependencies: + "path-key" "^3.1.0" + "shebang-command" "^2.0.0" + "which" "^2.0.1" + +"cross-spawn@3.0.1": + "integrity" "sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "lru-cache" "4.1.5" + "which" "1.3.1" + +"cross-spawn@6.0.5": + "integrity" "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==" + "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" + "version" "6.0.5" + dependencies: + "nice-try" "1.0.5" + "path-key" "2.0.1" + "semver" "5.7.2" + "shebang-command" "1.2.0" + "which" "1.3.1" + +"cryptiles@0.2.2": + "integrity" "sha512-gvWSbgqP+569DdslUiCelxIv3IYK5Lgmq1UrRnk+s1WxQOQ16j3GPDcjdtgL5Au65DU/xQi6q3xPtf5Kta+3IQ==" + "resolved" "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "boom" "0.4.2" + +"ctype@0.5.3": + "integrity" "sha512-T6CEkoSV4q50zW3TlTHMbzy1E5+zlnNcY+yb7tWVYlTwPhx9LpnfAkd4wecpWknDyptp4k97LUZeInlf6jdzBg==" + "resolved" "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz" + "version" "0.5.3" + +"currently-unhandled@0.4.1": + "integrity" "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==" + "resolved" "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz" + "version" "0.4.1" + dependencies: + "array-find-index" "1.0.2" + +"d@0.1.1": + "integrity" "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==" + "resolved" "https://registry.npmjs.org/d/-/d-0.1.1.tgz" + "version" "0.1.1" + dependencies: + "es5-ext" "0.10.62" + +"d@1.0.1": + "integrity" "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==" + "resolved" "https://registry.npmjs.org/d/-/d-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "es5-ext" "0.10.62" + "type" "1.2.0" + +"d3-array@1.2.1": + "integrity" "sha512-CyINJQ0SOUHojDdFDH4JEM0552vCR1utGyLHegJHyYH0JyCpSeTPxi4OBqHMA2jJZq4NH782LtaJWBImqI/HBw==" + "resolved" "https://registry.npmjs.org/d3-array/-/d3-array-1.2.1.tgz" + "version" "1.2.1" + +"d3-axis@1.0.8": + "integrity" "sha512-K0djTb26iQ6AsuD2d6Ka08wBHf4V30awIxV4XFuB/iLzYtTqqJlE/nIN0DBJJCX7lbOqbt2/oeX3r+sU5k2veg==" + "resolved" "https://registry.npmjs.org/d3-axis/-/d3-axis-1.0.8.tgz" + "version" "1.0.8" + +"d3-brush@1.0.4": + "integrity" "sha512-nUFueDzOlvwFvuOBynGSyJM7Wt1H9fKgJeoWFSg3ScS4c7FJBch92FKUJKum4xtgPYHdgH2C3bRg3GzSVltCJQ==" + "resolved" "https://registry.npmjs.org/d3-brush/-/d3-brush-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "d3-dispatch" "1.0.3" + "d3-drag" "1.2.1" + "d3-interpolate" "1.1.6" + "d3-selection" "1.3.0" + "d3-transition" "1.1.1" + +"d3-chord@1.0.4": + "integrity" "sha512-o0ExexkK1N0KikUakKrQwttP5Flu8AYD6iBUh3AdPJqnTh6xlvcX5wFRuuo29sLOAr9+T4yZPUH1S3CCQJ1SlQ==" + "resolved" "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "d3-array" "1.2.1" + "d3-path" "1.0.5" + +"d3-collection@1.0.4": + "integrity" "sha512-+TPxaBFzbzfpLF3Hjz8JPeuStNmJnyWAufu8VUfpDCDn5RieIgY+OQDjhKMDorf2naLgAjjZXLUQN7XFp/kgog==" + "resolved" "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.4.tgz" + "version" "1.0.4" + +"d3-color@1.0.3": + "integrity" "sha512-t+rSOrshj6m2AUOe8kHvTwfUQ5TFoInEkBfmsHHAHPof58dmbRXNpicB7XAyPbMQbcC7i09p2BxeCEdgBd8xmw==" + "resolved" "https://registry.npmjs.org/d3-color/-/d3-color-1.0.3.tgz" + "version" "1.0.3" + +"d3-contour@1.3.2": + "integrity" "sha512-hoPp4K/rJCu0ladiH6zmJUEz6+u3lgR+GSm/QdM2BBvDraU39Vr7YdDCicJcxP1z8i9B/2dJLgDC1NcvlF8WCg==" + "resolved" "https://registry.npmjs.org/d3-contour/-/d3-contour-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "d3-array" "1.2.1" + +"d3-dispatch@1.0.3": + "integrity" "sha512-Qh2DR3neW3lq/ug4oymXHYoIsA91nYt47ERb+fPKjRg6zLij06aP7KqHHl2NyziK9ASxrR3GLkHCtZvXe/jMVg==" + "resolved" "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-1.0.3.tgz" + "version" "1.0.3" + +"d3-drag@1.2.1": + "integrity" "sha512-Cg8/K2rTtzxzrb0fmnYOUeZHvwa4PHzwXOLZZPwtEs2SKLLKLXeYwZKBB+DlOxUvFmarOnmt//cU4+3US2lyyQ==" + "resolved" "https://registry.npmjs.org/d3-drag/-/d3-drag-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "d3-dispatch" "1.0.3" + "d3-selection" "1.3.0" + +"d3-dsv@1.0.8": + "integrity" "sha512-IVCJpQ+YGe3qu6odkPQI0KPqfxkhbP/oM1XhhE/DFiYmcXKfCRub4KXyiuehV1d4drjWVXHUWx4gHqhdZb6n/A==" + "resolved" "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.0.8.tgz" + "version" "1.0.8" + dependencies: + "commander" "2.20.3" + "iconv-lite" "0.4.24" + "rw" "1.3.3" + +"d3-ease@1.0.3": + "integrity" "sha512-io3QwOJwVPAxRF2UXpKpCdz2wm/7VLFCQQ1yy+GzX6YCtt3vi2BGnimI8agSF5jyUrHsADyF303d2S+ps7zU8w==" + "resolved" "https://registry.npmjs.org/d3-ease/-/d3-ease-1.0.3.tgz" + "version" "1.0.3" + +"d3-fetch@1.2.0": + "integrity" "sha512-yC78NBVcd2zFAyR/HnUiBS7Lf6inSCoWcSxFfw8FYL7ydiqe80SazNwoffcqOfs95XaLo7yebsmQqDKSsXUtvA==" + "resolved" "https://registry.npmjs.org/d3-fetch/-/d3-fetch-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "d3-dsv" "1.0.8" + +"d3-force@1.1.0": + "integrity" "sha512-2HVQz3/VCQs0QeRNZTYb7GxoUCeb6bOzMp/cGcLa87awY9ZsPvXOGeZm0iaGBjXic6I1ysKwMn+g+5jSAdzwcg==" + "resolved" "https://registry.npmjs.org/d3-force/-/d3-force-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "d3-collection" "1.0.4" + "d3-dispatch" "1.0.3" + "d3-quadtree" "1.0.3" + "d3-timer" "1.0.7" + +"d3-format@1.2.2": + "integrity" "sha512-zH9CfF/3C8zUI47nsiKfD0+AGDEuM8LwBIP7pBVpyR4l/sKkZqITmMtxRp04rwBrlshIZ17XeFAaovN3++wzkw==" + "resolved" "https://registry.npmjs.org/d3-format/-/d3-format-1.2.2.tgz" + "version" "1.2.2" + +"d3-geo@1.9.1": + "integrity" "sha512-l9wL/cEQkyZQYXw3xbmLsH3eQ5ij+icNfo4r0GrLa5rOCZR/e/3am45IQ0FvQ5uMsv+77zBRunLc9ufTWSQYFA==" + "resolved" "https://registry.npmjs.org/d3-geo/-/d3-geo-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "d3-array" "1.2.1" + +"d3-hierarchy@1.1.5": + "integrity" "sha512-PcsLIhThc60mWnxlojIOH7Sc0tQ2DgLWfEwEAyzCtej5f3H9wSsRmrg5pEhKZLrwiJnI2zyw/pznJxL9a/Eugw==" + "resolved" "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-1.1.5.tgz" + "version" "1.1.5" + +"d3-interpolate@1.1.6": + "integrity" "sha512-mOnv5a+pZzkNIHtw/V6I+w9Lqm9L5bG3OTXPM5A+QO0yyVMQ4W1uZhR+VOJmazaOZXri2ppbiZ5BUNWT0pFM9A==" + "resolved" "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.1.6.tgz" + "version" "1.1.6" + dependencies: + "d3-color" "1.0.3" + +"d3-path@1.0.5": + "integrity" "sha512-eD76prgnTKYkLzHlY2UMyOEZXTpC+WOanCr1BLxo38w4fPPPq/LgCFqRQvqFU3AJngfZmmKR7rgKPZ4EGJ9Atw==" + "resolved" "https://registry.npmjs.org/d3-path/-/d3-path-1.0.5.tgz" + "version" "1.0.5" + +"d3-polygon@1.0.3": + "integrity" "sha512-2zP7GOvf4XOWTeQouK7fCO534yQxyhYYTw6GTqcXifIalHgA6qV/es+4GRQii9m6XxEPFcht4loobD/o2iEo1A==" + "resolved" "https://registry.npmjs.org/d3-polygon/-/d3-polygon-1.0.3.tgz" + "version" "1.0.3" + +"d3-quadtree@1.0.3": + "integrity" "sha512-U2Jc3jF3JOBGXIOnvWY9C4ekRwRX9hEVpMMmeduJyaxAwPmoe7t84iZFTLn1RwYOyrXxJF55H/Hrg186TFQQdw==" + "resolved" "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-1.0.3.tgz" + "version" "1.0.3" + +"d3-queue@3.0.7": + "integrity" "sha512-2rs+6pNFKkrJhqe1rg5znw7dKJ7KZr62j9aLZfhondkrnz6U7VRmJj1UGcbD8MRc46c7H8m4SWhab8EalBQrkw==" + "resolved" "https://registry.npmjs.org/d3-queue/-/d3-queue-3.0.7.tgz" + "version" "3.0.7" + +"d3-random@1.1.0": + "integrity" "sha512-XuMbjx3Jq4EWfJP4g6nR7zns/bZfaVbWHWfR8auDkEiWCzVbWifmasfszV1ZRN3xXK3nY4RUFL2nTIhceGZSFQ==" + "resolved" "https://registry.npmjs.org/d3-random/-/d3-random-1.1.0.tgz" + "version" "1.1.0" + +"d3-request@1.0.6": + "integrity" "sha512-FJj8ySY6GYuAJHZMaCQ83xEYE4KbkPkmxZ3Hu6zA1xxG2GD+z6P+Lyp+zjdsHf0xEbp2xcluDI50rCS855EQ6w==" + "resolved" "https://registry.npmjs.org/d3-request/-/d3-request-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "d3-collection" "1.0.4" + "d3-dispatch" "1.0.3" + "d3-dsv" "1.0.8" + "xmlhttprequest" "1.8.0" + +"d3-scale-chromatic@1.5.0": + "integrity" "sha512-ACcL46DYImpRFMBcpk9HhtIyC7bTBR4fNOPxwVSl0LfulDAwyiHyPOTqcDG1+t5d4P9W7t/2NAuWu59aKko/cg==" + "resolved" "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-1.5.0.tgz" + "version" "1.5.0" + dependencies: + "d3-color" "1.0.3" + "d3-interpolate" "1.1.6" + +"d3-scale@1.0.7": + "integrity" "sha512-KvU92czp2/qse5tUfGms6Kjig0AhHOwkzXG0+PqIJB3ke0WUv088AHMZI0OssO9NCkXt4RP8yju9rpH8aGB7Lw==" + "resolved" "https://registry.npmjs.org/d3-scale/-/d3-scale-1.0.7.tgz" + "version" "1.0.7" + dependencies: + "d3-array" "1.2.1" + "d3-collection" "1.0.4" + "d3-color" "1.0.3" + "d3-format" "1.2.2" + "d3-interpolate" "1.1.6" + "d3-time" "1.0.8" + "d3-time-format" "2.1.1" + +"d3-scale@2.2.2": + "integrity" "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==" + "resolved" "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz" + "version" "2.2.2" + dependencies: + "d3-array" "1.2.1" + "d3-collection" "1.0.4" + "d3-format" "1.2.2" + "d3-interpolate" "1.1.6" + "d3-time" "1.0.8" + "d3-time-format" "2.1.1" + +"d3-selection@1.3.0": + "integrity" "sha512-qgpUOg9tl5CirdqESUAu0t9MU/t3O9klYfGfyKsXEmhyxyzLpzpeh08gaxBUTQw1uXIOkr/30Ut2YRjSSxlmHA==" + "resolved" "https://registry.npmjs.org/d3-selection/-/d3-selection-1.3.0.tgz" + "version" "1.3.0" + +"d3-shape@1.2.0": + "integrity" "sha512-LP48zJ9ykPKjCdd0vSu5k2l4s8v1vI6vvdDeJtmgtTa+L6Ery0lzvOaV7pMunFuLv11hwSRZQnSnlhFl801aiw==" + "resolved" "https://registry.npmjs.org/d3-shape/-/d3-shape-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "d3-path" "1.0.5" + +"d3-time-format@2.1.1": + "integrity" "sha512-8kAkymq2WMfzW7e+s/IUNAtN/y3gZXGRrdGfo6R8NKPAA85UBTxZg5E61bR6nLwjPjj4d3zywSQe1CkYLPFyrw==" + "resolved" "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "d3-time" "1.0.8" + +"d3-time@1.0.8": + "integrity" "sha512-YRZkNhphZh3KcnBfitvF3c6E0JOFGikHZ4YqD+Lzv83ZHn1/u6yGenRU1m+KAk9J1GnZMnKcrtfvSktlA1DXNQ==" + "resolved" "https://registry.npmjs.org/d3-time/-/d3-time-1.0.8.tgz" + "version" "1.0.8" + +"d3-timer@1.0.7": + "integrity" "sha512-vMZXR88XujmG/L5oB96NNKH5lCWwiLM/S2HyyAQLcjWJCloK5shxta4CwOFYLZoY3AWX73v8Lgv4cCAdWtRmOA==" + "resolved" "https://registry.npmjs.org/d3-timer/-/d3-timer-1.0.7.tgz" + "version" "1.0.7" + +"d3-transition@1.1.1": + "integrity" "sha512-xeg8oggyQ+y5eb4J13iDgKIjUcEfIOZs2BqV/eEmXm2twx80wTzJ4tB4vaZ5BKfz7XsI/DFmQL5me6O27/5ykQ==" + "resolved" "https://registry.npmjs.org/d3-transition/-/d3-transition-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "d3-color" "1.0.3" + "d3-dispatch" "1.0.3" + "d3-ease" "1.0.3" + "d3-interpolate" "1.1.6" + "d3-selection" "1.3.0" + "d3-timer" "1.0.7" + +"d3-voronoi@1.1.2": + "integrity" "sha512-RhGS1u2vavcO7ay7ZNAPo4xeDh/VYeGof3x5ZLJBQgYhLegxr3s5IykvWmJ94FTU6mcbtp4sloqZ54mP6R4Utw==" + "resolved" "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.2.tgz" + "version" "1.1.2" + +"d3-zoom@1.7.1": + "integrity" "sha512-sZHQ55DGq5BZBFGnRshUT8tm2sfhPHFnOlmPbbwTkAoPeVdRTkB4Xsf9GCY0TSHrTD8PeJPZGmP/TpGicwJDJQ==" + "resolved" "https://registry.npmjs.org/d3-zoom/-/d3-zoom-1.7.1.tgz" + "version" "1.7.1" + dependencies: + "d3-dispatch" "1.0.3" + "d3-drag" "1.2.1" + "d3-interpolate" "1.1.6" + "d3-selection" "1.3.0" + "d3-transition" "1.1.1" + +"d3@^5.1.0": + "integrity" "sha512-4PL5hHaHwX4m7Zr1UapXW23apo6pexCgdetdJ5kTmADpG/7T9Gkxw0M0tf/pjoB63ezCCm0u5UaFYy2aMt0Mcw==" + "resolved" "https://registry.npmjs.org/d3/-/d3-5.16.0.tgz" + "version" "5.16.0" + dependencies: + "d3-array" "1.2.1" + "d3-axis" "1.0.8" + "d3-brush" "1.0.4" + "d3-chord" "1.0.4" + "d3-collection" "1.0.4" + "d3-color" "1.0.3" + "d3-contour" "1.3.2" + "d3-dispatch" "1.0.3" + "d3-drag" "1.2.1" + "d3-dsv" "1.0.8" + "d3-ease" "1.0.3" + "d3-fetch" "1.2.0" + "d3-force" "1.1.0" + "d3-format" "1.2.2" + "d3-geo" "1.9.1" + "d3-hierarchy" "1.1.5" + "d3-interpolate" "1.1.6" + "d3-path" "1.0.5" + "d3-polygon" "1.0.3" + "d3-quadtree" "1.0.3" + "d3-random" "1.1.0" + "d3-scale" "2.2.2" + "d3-scale-chromatic" "1.5.0" + "d3-selection" "1.3.0" + "d3-shape" "1.2.0" + "d3-time" "1.0.8" + "d3-time-format" "2.1.1" + "d3-timer" "1.0.7" + "d3-transition" "1.1.1" + "d3-voronoi" "1.1.2" + "d3-zoom" "1.7.1" + +"d3@4.13.0": + "integrity" "sha512-l8c4+0SldjVKLaE2WG++EQlqD7mh/dmQjvi2L2lKPadAVC+TbJC4ci7Uk9bRi+To0+ansgsS0iWfPjD7DBy+FQ==" + "resolved" "https://registry.npmjs.org/d3/-/d3-4.13.0.tgz" + "version" "4.13.0" + dependencies: + "d3-array" "1.2.1" + "d3-axis" "1.0.8" + "d3-brush" "1.0.4" + "d3-chord" "1.0.4" + "d3-collection" "1.0.4" + "d3-color" "1.0.3" + "d3-dispatch" "1.0.3" + "d3-drag" "1.2.1" + "d3-dsv" "1.0.8" + "d3-ease" "1.0.3" + "d3-force" "1.1.0" + "d3-format" "1.2.2" + "d3-geo" "1.9.1" + "d3-hierarchy" "1.1.5" + "d3-interpolate" "1.1.6" + "d3-path" "1.0.5" + "d3-polygon" "1.0.3" + "d3-quadtree" "1.0.3" + "d3-queue" "3.0.7" + "d3-random" "1.1.0" + "d3-request" "1.0.6" + "d3-scale" "1.0.7" + "d3-selection" "1.3.0" + "d3-shape" "1.2.0" + "d3-time" "1.0.8" + "d3-time-format" "2.1.1" + "d3-timer" "1.0.7" + "d3-transition" "1.1.1" + "d3-voronoi" "1.1.2" + "d3-zoom" "1.7.1" + +"dargs@6.1.0": + "integrity" "sha512-5dVBvpBLBnPwSsYXqfybFyehMmC/EenKEcf23AhCTgTf48JFBbmJKqoZBsERDnjL0FyiVTYWdFsRfTLHxLyKdQ==" + "resolved" "https://registry.npmjs.org/dargs/-/dargs-6.1.0.tgz" + "version" "6.1.0" + +"dashdash@1.14.1": + "integrity" "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==" + "resolved" "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + "version" "1.14.1" + dependencies: + "assert-plus" "1.0.0" + +"date-now@0.1.4": + "integrity" "sha512-AsElvov3LoNB7tf5k37H2jYSB+ZZPMT5sG2QjJCcdlV5chIv6htBUBUui2IKRjgtKAKtCBN7Zbwa+MtwLjSeNw==" + "resolved" "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" + "version" "0.1.4" + +"date-time@1.1.0": + "integrity" "sha512-RrxZQ06cdKe7YQ5oqIxs3GMc7W3vXscy7Ds+aZIqmxA59QnVtTiCseA4jbzVUub9xCbo9GuYVZo0OrZLYXnnmw==" + "resolved" "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "time-zone" "0.1.0" + +"dateformat@4.6.3": + "integrity" "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==" + "resolved" "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz" + "version" "4.6.3" + +"debug@2.6.9": + "integrity" "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==" + "resolved" "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + "version" "2.6.9" + dependencies: + "ms" "2.0.0" + +"debug@3.2.7": + "integrity" "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==" + "resolved" "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + "version" "3.2.7" + dependencies: + "ms" "2.1.3" + +"decamelize@1.2.0": + "integrity" "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + "resolved" "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + "version" "1.2.0" + +"decode-uri-component@0.2.2": + "integrity" "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" + "resolved" "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz" + "version" "0.2.2" + +"decompress-zip@0.0.8": + "integrity" "sha512-83ZYuMw/GIpxJx8IQMi7xvdFynFJrZkmCTfae26DsPXGaxeDAusP+3LuNYczoA4HCQdWoaZX2w96aZJZdYewBQ==" + "resolved" "https://registry.npmjs.org/decompress-zip/-/decompress-zip-0.0.8.tgz" + "version" "0.0.8" + dependencies: + "binary" "0.3.0" + "graceful-fs" "3.0.12" + "mkpath" "0.1.0" + "nopt" "2.2.1" + "q" "1.0.1" + "readable-stream" "1.1.14" + "touch" "0.0.2" + +"deep-extend@^0.6.0": + "integrity" "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + "version" "0.6.0" + +"deep-extend@0.2.11": + "integrity" "sha512-t2N+4ihO7YgydJOUI47I6GdXpONJ+jUZmYeTNiifALaEduiCja1mKcq3tuSp0RhA9mMfxdMN3YskpwB7puMAtw==" + "resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.2.11.tgz" + "version" "0.2.11" + +"define-property@0.2.5": + "integrity" "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==" + "resolved" "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + "version" "0.2.5" + dependencies: + "is-descriptor" "0.1.6" + +"define-property@1.0.0": + "integrity" "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==" + "resolved" "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "is-descriptor" "1.0.2" + +"define-property@2.0.2": + "integrity" "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==" + "resolved" "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "is-descriptor" "1.0.2" + "isobject" "3.0.1" + +"del@^2.2.0": + "integrity" "sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==" + "resolved" "https://registry.npmjs.org/del/-/del-2.2.2.tgz" + "version" "2.2.2" + dependencies: + "globby" "5.0.0" + "is-path-cwd" "1.0.0" + "is-path-in-cwd" "1.0.1" + "object-assign" "4.1.1" + "pify" "2.3.0" + "pinkie-promise" "2.0.1" + "rimraf" "2.7.1" + +"delayed-stream@0.0.5": + "integrity" "sha512-v+7uBd1pqe5YtgPacIIbZ8HuHeLFVNe4mUEyFDXL6KiqzEykjbw+5mXZXpGFgNVasdL4jWKgaKIXrEHiynN1LA==" + "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz" + "version" "0.0.5" + +"delayed-stream@1.0.0": + "integrity" "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "resolved" "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + "version" "1.0.0" + +"delegates@1.0.0": + "integrity" "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + "resolved" "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz" + "version" "1.0.0" + +"depd@1.1.2": + "integrity" "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + "resolved" "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + "version" "1.1.2" + +"depd@2.0.0": + "integrity" "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + "resolved" "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + "version" "2.0.0" + +"destroy@1.2.0": + "integrity" "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + "resolved" "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + "version" "1.2.0" + +"detect-file@1.0.0": + "integrity" "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==" + "resolved" "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" + "version" "1.0.0" + +"doctypes@1.1.0": + "integrity" "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + "resolved" "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz" + "version" "1.1.0" + +"dom-serializer@0.2.2": + "integrity" "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==" + "resolved" "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "domelementtype" "2.3.0" + "entities" "2.2.0" + +"domelementtype@1.3.1": + "integrity" "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + "version" "1.3.1" + +"domelementtype@2.3.0": + "integrity" "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" + "resolved" "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + "version" "2.3.0" + +"domhandler@2.3.0": + "integrity" "sha512-q9bUwjfp7Eif8jWxxxPSykdRZAb6GkguBGSgvvCrhI9wB71W2K/Kvv4E61CF/mcCfnVJDeDWx/Vb/uAqbDj6UQ==" + "resolved" "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "domelementtype" "1.3.1" + +"domutils@1.5.1": + "integrity" "sha512-gSu5Oi/I+3wDENBsOWBiRK1eoGxcywYSqg3rR960/+EfY0CF4EX1VPkgHOZ3WiS/Jg2DtliF6BhWcHlfpYUcGw==" + "resolved" "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz" + "version" "1.5.1" + dependencies: + "dom-serializer" "0.2.2" + "domelementtype" "1.3.1" + +"dot-case@2.1.1": + "integrity" "sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==" + "resolved" "https://registry.npmjs.org/dot-case/-/dot-case-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "no-case" "2.3.2" + +"duplexer@0.1.2": + "integrity" "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + "resolved" "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + "version" "0.1.2" + +"duplexify@3.7.1": + "integrity" "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==" + "resolved" "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz" + "version" "3.7.1" + dependencies: + "end-of-stream" "1.4.4" + "inherits" "2.0.4" + "readable-stream" "2.3.8" + "stream-shift" "1.0.1" + +"each-async@1.1.1": + "integrity" "sha512-0hJGub96skwr+sUojv7zQ0kc9i4jn3SwLiLk8Jr7KDz7aaaMzkN5UX3a/9ZhzC0OfZVyXHhlHcjC0KVOiKZ+HQ==" + "resolved" "https://registry.npmjs.org/each-async/-/each-async-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "onetime" "1.1.0" + "set-immediate-shim" "1.0.1" + +"eastasianwidth@^0.2.0": + "integrity" "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + "resolved" "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + "version" "0.2.0" + +"ecc-jsbn@0.1.2": + "integrity" "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==" + "resolved" "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "jsbn" "0.1.1" + "safer-buffer" "2.1.2" + +"ee-first@1.1.1": + "integrity" "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "resolved" "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + "version" "1.1.1" + +"emoji-regex@^8.0.0": + "integrity" "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + "version" "8.0.0" + +"emoji-regex@^9.2.2": + "integrity" "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + "version" "9.2.2" + +"emoji-regex@7.0.3": + "integrity" "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "resolved" "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz" + "version" "7.0.3" + +"encodeurl@1.0.2": + "integrity" "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + "resolved" "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + "version" "1.0.2" + +"end-of-stream@1.0.0": + "integrity" "sha512-oniaMOoG/dtbvWRLAlkFeJeJPM4IeE6BPFCHv0GTIIONB7A7kz1/liYWQiU7bqAhUlrKy1Z1MBsKa+qBgoVabw==" + "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "once" "1.3.3" + +"end-of-stream@1.4.4": + "integrity" "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==" + "resolved" "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + "version" "1.4.4" + dependencies: + "once" "1.4.0" + +"entities@1.0.0": + "integrity" "sha512-LbLqfXgJMmy81t+7c14mnulFHJ170cM6E+0vMXR9k/ZiZwgX8i5pNgjTCX3SO4VeUsFLV+8InixoretwU+MjBQ==" + "resolved" "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz" + "version" "1.0.0" + +"entities@2.2.0": + "integrity" "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + "resolved" "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + "version" "2.2.0" + +"error-ex@1.3.2": + "integrity" "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==" + "resolved" "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "is-arrayish" "0.2.1" + +"error@7.2.1": + "integrity" "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==" + "resolved" "https://registry.npmjs.org/error/-/error-7.2.1.tgz" + "version" "7.2.1" + dependencies: + "string-template" "0.2.1" + +"es5-ext@0.10.62": + "integrity" "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==" + "resolved" "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz" + "version" "0.10.62" + dependencies: + "es6-iterator" "2.0.3" + "es6-symbol" "3.1.3" + "next-tick" "1.1.0" + +"es6-iterator@0.1.3": + "integrity" "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==" + "resolved" "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz" + "version" "0.1.3" + dependencies: + "d" "0.1.1" + "es5-ext" "0.10.62" + "es6-symbol" "2.0.1" + +"es6-iterator@2.0.3": + "integrity" "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==" + "resolved" "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "d" "1.0.1" + "es5-ext" "0.10.62" + "es6-symbol" "3.1.3" + +"es6-promise@4.2.8": + "integrity" "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + "resolved" "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" + "version" "4.2.8" + +"es6-symbol@2.0.1": + "integrity" "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==" + "resolved" "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "d" "0.1.1" + "es5-ext" "0.10.62" + +"es6-symbol@3.1.3": + "integrity" "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==" + "resolved" "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz" + "version" "3.1.3" + dependencies: + "d" "1.0.1" + "ext" "1.7.0" + +"es6-weak-map@0.1.4": + "integrity" "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==" + "resolved" "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "d" "0.1.1" + "es5-ext" "0.10.62" + "es6-iterator" "0.1.3" + "es6-symbol" "2.0.1" + +"escape-html@1.0.3": + "integrity" "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + "resolved" "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + "version" "1.0.3" + +"escape-string-regexp@^1.0.2", "escape-string-regexp@1.0.5": + "integrity" "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + "version" "1.0.5" + +"esprima@1.0.4": + "integrity" "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==" + "resolved" "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + "version" "1.0.4" + +"esprima@4.0.1": + "integrity" "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + "resolved" "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + "version" "4.0.1" + +"esutils@2.0.3": + "integrity" "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + "resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + "version" "2.0.3" + +"etag@1.8.1": + "integrity" "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + "resolved" "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + "version" "1.8.1" + +"event-emitter@0.3.5": + "integrity" "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==" + "resolved" "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz" + "version" "0.3.5" + dependencies: + "d" "1.0.1" + "es5-ext" "0.10.62" + +"eventemitter2@0.4.14": + "integrity" "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==" + "resolved" "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" + "version" "0.4.14" + +"eventemitter3@1.2.0": + "integrity" "sha512-DOFqA1MF46fmZl2xtzXR3MPCRsXqgoFqdXcrCVYM3JNnfUeHTm/fh/v/iU7gBFpwkuBmoJPAm5GuhdDfSEJMJA==" + "resolved" "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz" + "version" "1.2.0" + +"execa@^5.1.1": + "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==" + "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "cross-spawn" "^7.0.3" + "get-stream" "^6.0.0" + "human-signals" "^2.1.0" + "is-stream" "^2.0.0" + "merge-stream" "^2.0.0" + "npm-run-path" "^4.0.1" + "onetime" "^5.1.2" + "signal-exit" "^3.0.3" + "strip-final-newline" "^2.0.0" + +"exit@0.1.2": + "integrity" "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==" + "resolved" "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + "version" "0.1.2" + +"expand-brackets@0.1.5": + "integrity" "sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==" + "resolved" "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz" + "version" "0.1.5" + dependencies: + "is-posix-bracket" "0.1.1" + +"expand-brackets@2.1.4": + "integrity" "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==" + "resolved" "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" + "version" "2.1.4" + dependencies: + "debug" "2.6.9" + "define-property" "0.2.5" + "extend-shallow" "2.0.1" + "posix-character-classes" "0.1.1" + "regex-not" "1.0.2" + "snapdragon" "0.8.2" + "to-regex" "3.0.2" + +"expand-range@1.8.2": + "integrity" "sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==" + "resolved" "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz" + "version" "1.8.2" + dependencies: + "fill-range" "2.2.4" + +"expand-tilde@2.0.2": + "integrity" "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==" + "resolved" "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "homedir-polyfill" "1.0.3" + +"ext@1.7.0": + "integrity" "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==" + "resolved" "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz" + "version" "1.7.0" + dependencies: + "type" "2.7.2" + +"extend-shallow@2.0.1": + "integrity" "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==" + "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "is-extendable" "0.1.1" + +"extend-shallow@3.0.2": + "integrity" "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==" + "resolved" "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "assign-symbols" "1.0.0" + "is-extendable" "1.0.1" + +"extend@3.0.2": + "integrity" "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "resolved" "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + "version" "3.0.2" + +"extglob@0.3.2": + "integrity" "sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==" + "resolved" "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" + "version" "0.3.2" + dependencies: + "is-extglob" "1.0.0" + +"extglob@2.0.4": + "integrity" "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==" + "resolved" "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "array-unique" "0.3.2" + "define-property" "1.0.0" + "expand-brackets" "2.1.4" + "extend-shallow" "2.0.1" + "fragment-cache" "0.2.1" + "regex-not" "1.0.2" + "snapdragon" "0.8.2" + "to-regex" "3.0.2" + +"extract-zip@1.7.0": + "integrity" "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==" + "resolved" "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" + "version" "1.7.0" + dependencies: + "concat-stream" "1.6.2" + "debug" "2.6.9" + "mkdirp" "0.5.6" + "yauzl" "2.10.0" + +"extsprintf@1.3.0": + "integrity" "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==" + "resolved" "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + "version" "1.3.0" + +"fast-deep-equal@^3.1.1", "fast-deep-equal@3.1.3": + "integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + "version" "3.1.3" + +"fast-json-stable-stringify@2.1.0": + "integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + "version" "2.1.0" + +"fast-url-parser@1.1.3": + "integrity" "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==" + "resolved" "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "punycode" "^1.3.2" + +"faye-websocket@0.10.0": + "integrity" "sha512-Xhj93RXbMSq8urNCUq4p9l0P6hnySJ/7YNRhYNug0bLOuii7pKO7xQFb5mx9xZXWCar88pLPb805PvUkwrLZpQ==" + "resolved" "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz" + "version" "0.10.0" + dependencies: + "websocket-driver" "0.7.4" + +"fd-slicer@1.1.0": + "integrity" "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==" + "resolved" "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "pend" "1.2.0" + +"figures@1.7.0": + "integrity" "sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==" + "resolved" "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz" + "version" "1.7.0" + dependencies: + "escape-string-regexp" "1.0.5" + "object-assign" "4.1.1" + +"figures@3.2.0": + "integrity" "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==" + "resolved" "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "escape-string-regexp" "1.0.5" + +"file-sync-cmp@0.1.1": + "integrity" "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==" + "resolved" "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz" + "version" "0.1.1" + +"file-uri-to-path@1.0.0": + "integrity" "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + "resolved" "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + "version" "1.0.0" + +"filename-regex@2.0.1": + "integrity" "sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==" + "resolved" "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz" + "version" "2.0.1" + +"fill-range@2.2.4": + "integrity" "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz" + "version" "2.2.4" + dependencies: + "is-number" "2.1.0" + "isobject" "2.1.0" + "randomatic" "3.1.1" + "repeat-element" "1.1.4" + "repeat-string" "1.6.1" + +"fill-range@4.0.0": + "integrity" "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "extend-shallow" "2.0.1" + "is-number" "3.0.0" + "repeat-string" "1.6.1" + "to-regex-range" "2.1.1" + +"fill-range@7.0.1": + "integrity" "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==" + "resolved" "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + "version" "7.0.1" + dependencies: + "to-regex-range" "5.0.1" + +"finalhandler@1.1.2": + "integrity" "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==" + "resolved" "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "debug" "2.6.9" + "encodeurl" "1.0.2" + "escape-html" "1.0.3" + "on-finished" "2.3.0" + "parseurl" "1.3.3" + "statuses" "1.5.0" + "unpipe" "1.0.0" + +"find-up@1.1.2": + "integrity" "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "path-exists" "2.1.0" + "pinkie-promise" "2.0.1" + +"find-up@3.0.0": + "integrity" "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==" + "resolved" "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "locate-path" "3.0.0" + +"findup-sync@4.0.0": + "integrity" "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==" + "resolved" "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "detect-file" "1.0.0" + "is-glob" "4.0.3" + "micromatch" "4.0.5" + "resolve-dir" "1.0.1" + +"findup-sync@5.0.0": + "integrity" "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==" + "resolved" "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "detect-file" "1.0.0" + "is-glob" "4.0.3" + "micromatch" "4.0.5" + "resolve-dir" "1.0.1" + +"fined@1.2.0": + "integrity" "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==" + "resolved" "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "expand-tilde" "2.0.2" + "is-plain-object" "2.0.4" + "object.defaults" "1.1.0" + "object.pick" "1.3.0" + "parse-filepath" "1.0.2" + +"flagged-respawn@1.0.1": + "integrity" "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==" + "resolved" "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz" + "version" "1.0.1" + +"for-in@1.0.2": + "integrity" "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==" + "resolved" "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + "version" "1.0.2" + +"for-own@0.1.5": + "integrity" "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==" + "resolved" "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz" + "version" "0.1.5" + dependencies: + "for-in" "1.0.2" + +"for-own@1.0.0": + "integrity" "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==" + "resolved" "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "for-in" "1.0.2" + +"forever-agent@0.5.2": + "integrity" "sha512-PDG5Ef0Dob/JsZUxUltJOhm/Y9mlteAE+46y3M9RBz/Rd3QVENJ75aGRhN56yekTUboaBIkd8KVWX2NjF6+91A==" + "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + "version" "0.5.2" + +"forever-agent@0.6.1": + "integrity" "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==" + "resolved" "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + "version" "0.6.1" + +"form-data@0.1.4": + "integrity" "sha512-x8eE+nzFtAMA0YYlSxf/Qhq6vP1f8wSoZ7Aw1GuctBcmudCNuTUmmx45TfEplyb6cjsZO/jvh6+1VpZn24ez+w==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "async" "0.9.2" + "combined-stream" "0.0.7" + "mime" "1.2.11" + +"form-data@0.2.0": + "integrity" "sha512-LkinaG6JazVhYj2AKi67NOIAhqXcBOQACraT0WdhWW4ZO3kTiS0X7C1nJ1jFZf6wak4bVHIA/oOzWkh2ThAipg==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "async" "0.9.2" + "combined-stream" "0.0.7" + "mime-types" "2.0.14" + +"form-data@2.3.3": + "integrity" "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==" + "resolved" "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" + "version" "2.3.3" + dependencies: + "asynckit" "0.4.0" + "combined-stream" "1.0.8" + "mime-types" "2.1.35" + +"fragment-cache@0.2.1": + "integrity" "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==" + "resolved" "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + "version" "0.2.1" + dependencies: + "map-cache" "0.2.2" + +"fresh@0.5.2": + "integrity" "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + "resolved" "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + "version" "0.5.2" + +"fs-access@1.0.1": + "integrity" "sha512-05cXDIwNbFaoFWaz5gNHlUTbH5whiss/hr/ibzPd4MH3cR4w0ZKeIPiVdbyJurg3O5r/Bjpvn9KOb1/rPMf3nA==" + "resolved" "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "null-check" "1.0.0" + +"fs-extra@1.0.0": + "integrity" "sha512-VerQV6vEKuhDWD2HGOybV6v5I73syoc/cXAbKlgTC7M/oFVEtklWlp9QH2Ijw3IaWDOQcMkldSPa7zXy79Z/UQ==" + "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "graceful-fs" "4.2.11" + "jsonfile" "2.4.0" + "klaw" "1.3.1" + +"fs-extra@3.0.1": + "integrity" "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==" + "resolved" "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "graceful-fs" "4.2.11" + "jsonfile" "3.0.1" + "universalify" "0.1.2" + +"fs.realpath@1.0.0": + "integrity" "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "resolved" "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + "version" "1.0.0" + +"fsevents@1.2.13": + "integrity" "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==" + "resolved" "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz" + "version" "1.2.13" + dependencies: + "bindings" "1.5.0" + "nan" "2.17.0" + +"fstream-ignore@1.0.5": + "integrity" "sha512-VVRuOs41VUqptEGiR0N5ZoWEcfGvbGRqLINyZAhHRnF3DH5wrqjNkYr3VbRoZnI41BZgO7zIVdiobc13TVI1ow==" + "resolved" "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz" + "version" "1.0.5" + dependencies: + "fstream" "1.0.12" + "inherits" "2.0.4" + "minimatch" "3.0.8" + +"fstream@1.0.12": + "integrity" "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==" + "resolved" "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" + "version" "1.0.12" + dependencies: + "graceful-fs" "4.2.11" + "inherits" "2.0.4" + "mkdirp" "0.5.6" + "rimraf" "2.7.1" + +"function-bind@1.1.1": + "integrity" "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "resolved" "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "version" "1.1.1" + +"gauge@2.7.4": + "integrity" "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==" + "resolved" "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz" + "version" "2.7.4" + dependencies: + "aproba" "1.2.0" + "console-control-strings" "1.1.0" + "has-unicode" "2.0.1" + "object-assign" "4.1.1" + "signal-exit" "3.0.7" + "string-width" "1.0.2" + "strip-ansi" "3.0.1" + "wide-align" "1.1.5" + +"gaze@1.1.3": + "integrity" "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==" + "resolved" "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "globule" "1.3.4" + +"get-caller-file@2.0.5": + "integrity" "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "resolved" "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + "version" "2.0.5" + +"get-intrinsic@1.2.1": + "integrity" "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==" + "resolved" "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + "version" "1.2.1" + dependencies: + "function-bind" "1.1.1" + "has" "1.0.3" + "has-proto" "1.0.1" + "has-symbols" "1.0.3" + +"get-stdin@4.0.1": + "integrity" "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==" + "resolved" "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz" + "version" "4.0.1" + +"get-stream@^6.0.0": + "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + "version" "6.0.1" + +"get-value@2.0.6": + "integrity" "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==" + "resolved" "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + "version" "2.0.6" + +"getobject@1.0.2": + "integrity" "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==" + "resolved" "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz" + "version" "1.0.2" + +"getpass@0.1.7": + "integrity" "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==" + "resolved" "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + "version" "0.1.7" + dependencies: + "assert-plus" "1.0.0" + +"glob-base@0.3.0": + "integrity" "sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==" + "resolved" "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "glob-parent" "2.0.0" + "is-glob" "2.0.1" + +"glob-parent@2.0.0": + "integrity" "sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==" + "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "is-glob" "2.0.1" + +"glob@^7.0.3", "glob@7.1.7": + "integrity" "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==" + "resolved" "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz" + "version" "7.1.7" + dependencies: + "fs.realpath" "1.0.0" + "inflight" "1.0.6" + "inherits" "2.0.4" + "minimatch" "3.0.8" + "once" "1.4.0" + "path-is-absolute" "1.0.1" + +"glob@3.2.11": + "integrity" "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==" + "resolved" "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" + "version" "3.2.11" + dependencies: + "inherits" "2.0.4" + "minimatch" "0.3.0" + +"glob@4.0.6": + "integrity" "sha512-D0H1thJnOVgI0zRV3H/Vmb9HWmDgGTTR7PeT8Lk0ri2kMmfK3oKQBolfqJuRpBVpTx5Q5PKGl9hdQEQNTXJI7Q==" + "resolved" "https://registry.npmjs.org/glob/-/glob-4.0.6.tgz" + "version" "4.0.6" + dependencies: + "graceful-fs" "3.0.12" + "inherits" "2.0.4" + "minimatch" "1.0.0" + "once" "1.4.0" + +"global-modules@1.0.0": + "integrity" "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==" + "resolved" "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "global-prefix" "1.0.2" + "is-windows" "1.0.2" + "resolve-dir" "1.0.1" + +"global-prefix@1.0.2": + "integrity" "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==" + "resolved" "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "expand-tilde" "2.0.2" + "homedir-polyfill" "1.0.3" + "ini" "1.3.8" + "is-windows" "1.0.2" + "which" "1.3.1" + +"globby@5.0.0": + "integrity" "sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==" + "resolved" "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "array-union" "1.0.2" + "arrify" "1.0.1" + "glob" "7.1.7" + "object-assign" "4.1.1" + "pify" "2.3.0" + "pinkie-promise" "2.0.1" + +"globule@1.3.4": + "integrity" "sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==" + "resolved" "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz" + "version" "1.3.4" + dependencies: + "glob" "7.1.7" + "lodash" "4.17.21" + "minimatch" "3.0.8" + +"got@0.3.0": + "integrity" "sha512-6DJBU8c+pWPYdajwiqhe22oPkq8FYr6xIPPcoJLfnQZbvrcOBJhoVmvNBxfqfDrJ3EXrd3pXpyVvPRPLv4K+PQ==" + "resolved" "https://registry.npmjs.org/got/-/got-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "object-assign" "0.3.1" + +"graceful-fs@2.0.3": + "integrity" "sha512-hcj/NTUWv+C3MbqrVb9F+aH6lvTwEHJdx2foBxlrVq5h6zE8Bfu4pv4CAAqbDcZrw/9Ak5lsRXlY9Ao8/F0Tuw==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" + "version" "2.0.3" + +"graceful-fs@3.0.12": + "integrity" "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz" + "version" "3.0.12" + dependencies: + "natives" "1.1.6" + +"graceful-fs@4.2.11": + "integrity" "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + "resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + "version" "4.2.11" + +"graceful-readlink@1.0.1": + "integrity" "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + "resolved" "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + "version" "1.0.1" + +"grunt-bower-install-simple@1.2.4": + "integrity" "sha512-T+jq6ERQjyf4muAxfqthK6XxtJEI28kwbKZTyd6PUw5PT1rzecXfQrA+Y8rnK2wB5nYh/dyIQeOvdtXfUaNAyA==" + "resolved" "https://registry.npmjs.org/grunt-bower-install-simple/-/grunt-bower-install-simple-1.2.4.tgz" + "version" "1.2.4" + dependencies: + "bower" "1.8.14" + "chalk" "1.1.3" + +"grunt-cache-breaker@^2.0.1": + "integrity" "sha512-CXUt/ObRfnxr+//ZjHw18+scIk+cRoDInIlg7KgbjeKhah2qEQIECTaffIsJ2dSgvV3Cjv8LWQm+KDYgbOrI1Q==" + "resolved" "https://registry.npmjs.org/grunt-cache-breaker/-/grunt-cache-breaker-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "cache-breaker" "0.0.4" + "lodash.clonedeep" "3.0.2" + +"grunt-cache-bust@~1.6.0": + "integrity" "sha512-X72wA793N27yBSGnEFT9+pjpT2eRVg2AGd2pAlx5WH63r/e3iX2QhX/E3P16iJk+d3+pIlFbYm4V5fZnWRqUyg==" + "resolved" "https://registry.npmjs.org/grunt-cache-bust/-/grunt-cache-bust-1.6.0.tgz" + "version" "1.6.0" + dependencies: + "fs-extra" "3.0.1" + +"grunt-cli@1.4.3": + "integrity" "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==" + "resolved" "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz" + "version" "1.4.3" + dependencies: + "grunt-known-options" "2.0.0" + "interpret" "1.1.0" + "liftup" "3.0.1" + "nopt" "4.0.3" + "v8flags" "3.2.0" + +"grunt-concurrent@^2.3.1": + "integrity" "sha512-XPf7f39OPjDZAQmNmlLk52xOKPpfi8Z7kX8Ju6kOkUL4W53monshs3U8UF3ByccHxTML7+6njzvNN0ejUYPMmA==" + "resolved" "https://registry.npmjs.org/grunt-concurrent/-/grunt-concurrent-2.3.1.tgz" + "version" "2.3.1" + dependencies: + "arrify" "1.0.1" + "async" "1.5.2" + "indent-string" "2.1.0" + "pad-stream" "1.2.0" + +"grunt-connect-proxy-updated@^0.2.1": + "integrity" "sha512-BOUSFoabioNpIxhMVAeyHC1J3gyFebMokF7v+aX5TkdPzASsmeYEaTUmMroW8Vqr5UVHKSsge/XStfuzifmb6A==" + "resolved" "https://registry.npmjs.org/grunt-connect-proxy-updated/-/grunt-connect-proxy-updated-0.2.1.tgz" + "version" "0.2.1" + dependencies: + "http-proxy" "1.11.3" + "lodash" "0.9.2" + +"grunt-contrib-clean@^1.1.0": + "integrity" "sha512-tET+TYTd8vCtKeGwbLjoH8+SdI8ngVzGbPr7vlWkewG7mYYHIccd2Ldxq+PK3DyBp5Www3ugdkfsjoNKUl5MTg==" + "resolved" "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "async" "1.5.2" + "rimraf" "2.7.1" + +"grunt-contrib-concat@^1.0.1": + "integrity" "sha512-QdTmcxe8aim2Z0dFeuSJ+f7fHIeY7PZaTMZxgvosjXwyMhpy2GUR5WHkr12lksHfZVE80v2wUwqF56wyfPUwoQ==" + "resolved" "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "chalk" "1.1.3" + "source-map" "0.5.7" + +"grunt-contrib-connect@~1.0.2": + "integrity" "sha512-7OPoyfGrpOYzuiRPzGyzWDe/xFcjttXe1ztVSFS8TAVBtpfXeeOV9RiwuyqA4yN1UeOG2Pnpx8s0DcUDAu21Gw==" + "resolved" "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "async" "1.5.2" + "connect" "3.7.0" + "connect-livereload" "0.5.4" + "http2" "3.3.7" + "morgan" "1.10.0" + "opn" "4.0.2" + "portscanner" "1.2.0" + "serve-index" "1.9.1" + "serve-static" "1.15.0" + +"grunt-contrib-copy@^1.0.0": + "integrity" "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==" + "resolved" "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "chalk" "1.1.3" + "file-sync-cmp" "0.1.1" + +"grunt-contrib-cssmin@^2.1.0": + "integrity" "sha512-IXNomhQ5ekVZbDbj/ik5YccoD9khU6LT2fDXqO1+/Txjq8cp0tQKjVS8i8EAbHOrSDkL7/UD6A7b+xj98gqh9w==" + "resolved" "https://registry.npmjs.org/grunt-contrib-cssmin/-/grunt-contrib-cssmin-2.2.1.tgz" + "version" "2.2.1" + dependencies: + "chalk" "1.1.3" + "clean-css" "4.1.11" + "maxmin" "2.1.0" + +"grunt-contrib-jshint@^1.1.0": + "integrity" "sha512-N8jtQ/FmvuRdJoEGphmGt+ov1oi5bJq4hPBPT/g54ed1glF34l2z5VAdHHhcgOaezBxur3kcMPChB0pfZxxcFw==" + "resolved" "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "chalk" "1.1.3" + "hooker" "0.2.3" + "jshint" "2.9.7" + +"grunt-contrib-sass@^2.0.0": + "integrity" "sha512-RxZ3dlZZTX4YBPu2zMu84NPYgJ2AYAlIdEqlBaixNVyLNbgvJBGUr5Gi0ec6IiOQbt/I/z7uZVN9HsRxgznIRw==" + "resolved" "https://registry.npmjs.org/grunt-contrib-sass/-/grunt-contrib-sass-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "async" "2.6.4" + "chalk" "2.4.2" + "cross-spawn" "6.0.5" + "dargs" "6.1.0" + "which" "1.3.1" + +"grunt-contrib-uglify@^5.2.2": + "integrity" "sha512-ITxiWxrjjP+RZu/aJ5GLvdele+sxlznh+6fK9Qckio5ma8f7Iv8woZjRkGfafvpuygxNefOJNc+hfjjBayRn2Q==" + "resolved" "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz" + "version" "5.2.2" + dependencies: + "chalk" "4.1.2" + "maxmin" "3.0.0" + "uglify-js" "3.17.4" + "uri-path" "1.0.0" + +"grunt-contrib-watch@^1.1.0": + "integrity" "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==" + "resolved" "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "async" "2.6.4" + "gaze" "1.1.3" + "lodash" "4.17.21" + "tiny-lr" "1.1.1" + +"grunt-html2js@^0.5.1": + "integrity" "sha512-INlQ9KAvi8SIMoG7WxyE0UXeHejZoR3pZqn3fhBcPWeq6IyRDKMOmJ1rMPkMnRECcbtV+7o/ao/Fm31oEUygpA==" + "resolved" "https://registry.npmjs.org/grunt-html2js/-/grunt-html2js-0.5.1.tgz" + "version" "0.5.1" + dependencies: + "chokidar" "1.7.0" + "html-minifier" "3.0.3" + optionalDependencies: + "pug" "2.0.4" + +"grunt-karma@^2.0.0": + "integrity" "sha512-/5plsdrES8dWrGhg33Q7AiYU1PUHXtMcZLP2pAppUJJKNmCpiGZXpVfHZ7KO19buVxb555UFbfhhbY7FccXH4g==" + "resolved" "https://registry.npmjs.org/grunt-karma/-/grunt-karma-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "lodash" "3.10.1" + +"grunt-known-options@2.0.0": + "integrity" "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==" + "resolved" "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz" + "version" "2.0.0" + +"grunt-legacy-log-utils@2.1.0": + "integrity" "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==" + "resolved" "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "chalk" "4.1.2" + "lodash" "4.17.21" + +"grunt-legacy-log@3.0.0": + "integrity" "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==" + "resolved" "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "colors" "1.1.2" + "grunt-legacy-log-utils" "2.1.0" + "hooker" "0.2.3" + "lodash" "4.17.21" + +"grunt-legacy-util@2.0.1": + "integrity" "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==" + "resolved" "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "async" "3.2.4" + "exit" "0.1.2" + "getobject" "1.0.2" + "hooker" "0.2.3" + "lodash" "4.17.21" + "underscore.string" "3.3.6" + "which" "2.0.2" + +"grunt-middleware-proxy@^1.0.7": + "integrity" "sha512-QlbSPd/LNhMkDiWAmvv8SAKFEttK9sV5SMwCxxTD/hUk3TnRqP+Tn1JkjgHXqUmFITVxrzgb9Se+uoHxVoxlbw==" + "resolved" "https://registry.npmjs.org/grunt-middleware-proxy/-/grunt-middleware-proxy-1.0.7.tgz" + "version" "1.0.7" + +"grunt-mkdir@^1.1.0": + "integrity" "sha512-FRE17OYVveNbVJFX8GPGa5bzH2ZiAdBx3q0Kwk2Dg6l+TzLGaTdufUxiUWUbS2MERFacnmXZwDDOR5ZbYW0o+Q==" + "resolved" "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.1.0.tgz" + "version" "1.1.0" + +"grunt-ngdocs@^0.2.11": + "integrity" "sha512-JUORqj8/Ad6ne8fZlV7CgWF3OxiEtl0VXw9kzeUzXo3ym74M0j/zH6BsFBMMDYOq7DXtD1rZbPnl4s4b/X54iQ==" + "resolved" "https://registry.npmjs.org/grunt-ngdocs/-/grunt-ngdocs-0.2.11.tgz" + "version" "0.2.11" + dependencies: + "lodash" "4.17.21" + "marked" "0.3.19" + "shelljs" "0.3.0" + "upath" "0.2.0" + +"grunt-protractor-runner@^5.0.0": + "integrity" "sha512-VW28paNRjOEurLhfGwLYHNkma0hIxgeqP5Fk35whCcAmRHHPSDrC3YYnEfrwawwY1+qpHFiKk5zr92xRW/8X4A==" + "resolved" "https://registry.npmjs.org/grunt-protractor-runner/-/grunt-protractor-runner-5.0.0.tgz" + "version" "5.0.0" + dependencies: + "protractor" "5.2.2" + "split" "1.0.1" + "through2" "2.0.5" + +"grunt-sass@^2.0.0": + "integrity" "sha512-XkexnQt/9rhReNd+Y7T0n/2g5FqYOQKfi2iSlpwDqvgs7EgEaGTxNhnWzHnbW5oNRvzL9AHopBG3AgRxL0d+DA==" + "resolved" "https://registry.npmjs.org/grunt-sass/-/grunt-sass-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "each-async" "1.1.1" + "node-sass" "4.14.1" + "object-assign" "4.1.1" + +"grunt-terser@^2.0.0": + "integrity" "sha512-9Rw1TiPsqadCJnEaKz+mZiS4k9ydnkNfrfvEq9SS6MqMXUxBC+sndDCHV05s5/PXQsFjFBhoRVFij5FaV36tYA==" + "resolved" "https://registry.npmjs.org/grunt-terser/-/grunt-terser-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "grunt" "1.6.1" + +"grunt-usemin@^3.0.0": + "integrity" "sha512-73g3KOfB2gAxPk5qV1dgfcw/H6cg2S2YPHzt5ssPCiaNXOrN15HzGzP31il+tQymyP/MYYhRAOR+o7F5UGny/A==" + "resolved" "https://registry.npmjs.org/grunt-usemin/-/grunt-usemin-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "chalk" "1.1.3" + "debug" "2.6.9" + "lodash" "3.10.1" + "path-exists" "1.0.0" + +"grunt-wiredep@~3.0.1": + "integrity" "sha512-iI7TjUYyN1s7NY7JDbmF+y8Fa9dYje1xP2kzQYVqL1d24N4+jod6xntM+GQfBOEPF027gahxvhQt1ii3tCaPUw==" + "resolved" "https://registry.npmjs.org/grunt-wiredep/-/grunt-wiredep-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "wiredep" "4.0.0" + +"grunt@^1.0.1", "grunt@1.6.1": + "integrity" "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==" + "resolved" "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz" + "version" "1.6.1" + dependencies: + "dateformat" "4.6.3" + "eventemitter2" "0.4.14" + "exit" "0.1.2" + "findup-sync" "5.0.0" + "glob" "7.1.7" + "grunt-cli" "1.4.3" + "grunt-known-options" "2.0.0" + "grunt-legacy-log" "3.0.0" + "grunt-legacy-util" "2.0.1" + "iconv-lite" "0.6.3" + "js-yaml" "3.14.1" + "minimatch" "3.0.8" + "nopt" "3.0.6" + +"gzip-size@3.0.0": + "integrity" "sha512-6s8trQiK+OMzSaCSVXX+iqIcLV9tC+E73jrJrJTyS4h/AJhlxHvzFKqM1YLDJWRGgHX8uLkBeXkA0njNj39L4w==" + "resolved" "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "duplexer" "0.1.2" + +"gzip-size@5.1.1": + "integrity" "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==" + "resolved" "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "duplexer" "0.1.2" + "pify" "4.0.1" + +"handlebars@2.0.0": + "integrity" "sha512-OdfkaA0M8qGD5EJBkMw3TpguSWl6lz94jdyVmYs5e4TpwepZJ35Y5XlchsIwcN7NP/yzNa3MJYd/dRTO7Nf/fg==" + "resolved" "https://registry.npmjs.org/handlebars/-/handlebars-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "optimist" "0.3.7" + optionalDependencies: + "uglify-js" "2.3.6" + +"har-schema@2.0.0": + "integrity" "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==" + "resolved" "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + "version" "2.0.0" -"@babel/plugin-transform-arrow-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"har-validator@5.1.5": + "integrity" "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==" + "resolved" "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + "version" "5.1.5" + dependencies: + "ajv" "6.12.6" + "har-schema" "2.0.0" + +"has-ansi@^2.0.0", "has-ansi@2.0.0": + "integrity" "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==" + "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "ansi-regex" "2.1.1" + +"has-ansi@0.1.0": + "integrity" "sha512-1YsTg1fk2/6JToQhtZkArMkurq8UoWU1Qe0aR3VUHjgij4nOylSWLWAtBXoZ4/dXOmugfLGm1c+QhuD0JyedFA==" + "resolved" "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "ansi-regex" "0.2.1" + +"has-flag@3.0.0": + "integrity" "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "version" "3.0.0" + +"has-flag@4.0.0": + "integrity" "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + "resolved" "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + "version" "4.0.0" + +"has-proto@1.0.1": + "integrity" "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" + "resolved" "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + "version" "1.0.1" + +"has-symbols@1.0.3": + "integrity" "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "resolved" "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + "version" "1.0.3" + +"has-tostringtag@1.0.0": + "integrity" "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==" + "resolved" "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "has-symbols" "1.0.3" + +"has-unicode@2.0.1": + "integrity" "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + "resolved" "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz" + "version" "2.0.1" + +"has-value@0.3.1": + "integrity" "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==" + "resolved" "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" + "version" "0.3.1" + dependencies: + "get-value" "2.0.6" + "has-values" "0.1.4" + "isobject" "2.1.0" + +"has-value@1.0.0": + "integrity" "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==" + "resolved" "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "get-value" "2.0.6" + "has-values" "1.0.0" + "isobject" "3.0.1" + +"has-values@0.1.4": + "integrity" "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==" + "resolved" "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + "version" "0.1.4" + +"has-values@1.0.0": + "integrity" "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==" + "resolved" "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "is-number" "3.0.0" + "kind-of" "4.0.0" + +"has@1.0.3": + "integrity" "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==" + "resolved" "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "function-bind" "1.1.1" + +"hasha@2.2.0": + "integrity" "sha512-jZ38TU/EBiGKrmyTNNZgnvCZHNowiRI4+w/I9noMlekHTZH3KyGgvJLmhSgykeAQ9j2SYPDosM0Bg3wHfzibAQ==" + "resolved" "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "is-stream" "1.1.0" + "pinkie-promise" "2.0.1" + +"hawk@1.1.1": + "integrity" "sha512-am8sVA2bCJIw8fuuVcKvmmNnGFUGW8spTkVtj2fXTEZVkfN42bwFZFtDem57eFi+NSxurJB8EQ7Jd3uCHLn8Vw==" + "resolved" "https://registry.npmjs.org/hawk/-/hawk-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "boom" "0.4.2" + "cryptiles" "0.2.2" + "hoek" "0.9.1" + "sntp" "0.2.4" + +"he@1.1.1": + "integrity" "sha512-z/GDPjlRMNOa2XJiB4em8wJpuuBfrFOlYKTZxtpkdr1uPdibHI8rYA3MY0KDObpVyaes0e/aunid/t88ZI2EKA==" + "resolved" "https://registry.npmjs.org/he/-/he-1.1.1.tgz" + "version" "1.1.1" + +"header-case@1.0.1": + "integrity" "sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==" + "resolved" "https://registry.npmjs.org/header-case/-/header-case-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "no-case" "2.3.2" + "upper-case" "1.1.3" + +"hoek@0.9.1": + "integrity" "sha512-ZZ6eGyzGjyMTmpSPYVECXy9uNfqBR7x5CavhUaLOeD6W0vWK1mp/b7O3f86XE0Mtfo9rZ6Bh3fnuw9Xr8MF9zA==" + "resolved" "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + "version" "0.9.1" + +"homedir-polyfill@1.0.3": + "integrity" "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==" + "resolved" "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "parse-passwd" "1.0.0" + +"hooker@0.2.3": + "integrity" "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==" + "resolved" "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + "version" "0.2.3" + +"hosted-git-info@2.8.9": + "integrity" "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + "resolved" "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + "version" "2.8.9" + +"html-minifier@3.0.3": + "integrity" "sha512-RLOMzutpO4Mv8ToW2b/CzZQ94IF3Cb6xYGbT+54k8BxQCQuntxdJr99/PkEnLDf92zakibKb5fKHJMSF6t3O/g==" + "resolved" "https://registry.npmjs.org/html-minifier/-/html-minifier-3.0.3.tgz" + "version" "3.0.3" + dependencies: + "change-case" "3.0.2" + "clean-css" "3.4.28" + "commander" "2.9.0" + "he" "1.1.1" + "ncname" "1.0.0" + "relateurl" "0.2.7" + "uglify-js" "2.7.5" + +"htmlparser2@3.8.3": + "integrity" "sha512-hBxEg3CYXe+rPIua8ETe7tmG3XDn9B0edOE/e9wH2nLczxzgdu0m0aNHY+5wFZiviLWLdANPJTssa92dMcXQ5Q==" + "resolved" "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz" + "version" "3.8.3" + dependencies: + "domelementtype" "1.3.1" + "domhandler" "2.3.0" + "domutils" "1.5.1" + "entities" "1.0.0" + "readable-stream" "1.1.14" + +"http-errors@1.6.3": + "integrity" "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==" + "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + "version" "1.6.3" + dependencies: + "depd" "1.1.2" + "inherits" "2.0.3" + "setprototypeof" "1.1.0" + "statuses" "1.5.0" + +"http-errors@2.0.0": + "integrity" "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==" + "resolved" "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "depd" "2.0.0" + "inherits" "2.0.4" + "setprototypeof" "1.2.0" + "statuses" "2.0.1" + "toidentifier" "1.0.1" + +"http-parser-js@0.5.8": + "integrity" "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + "resolved" "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + "version" "0.5.8" + +"http-proxy@1.11.3": + "integrity" "sha512-dVzC6JlPUaRBONwMwVa/x1H5T0Gxn7VEldmfXuA++6+dE1a18VxfZoFIL2qHDVW4Eu+5m9ppPhm9ozeG/EhkmA==" + "resolved" "https://registry.npmjs.org/http-proxy/-/http-proxy-1.11.3.tgz" + "version" "1.11.3" + dependencies: + "eventemitter3" "1.2.0" + "requires-port" "0.0.1" + +"http-signature@0.10.1": + "integrity" "sha512-coK8uR5rq2IMj+Hen+sKPA5ldgbCc1/spPdKCL1Fw6h+D0s/2LzMcRK0Cqufs1h0ryx/niwBHGFu8HC3hwU+lA==" + "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz" + "version" "0.10.1" + dependencies: + "asn1" "0.1.11" + "assert-plus" "0.1.5" + "ctype" "0.5.3" + +"http-signature@1.2.0": + "integrity" "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==" + "resolved" "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "assert-plus" "1.0.0" + "jsprim" "1.4.2" + "sshpk" "1.17.0" + +"http2@3.3.7": + "integrity" "sha512-puSi8M8WNlFJm9Pk4c/Mbz9Gwparuj3gO9/RRO5zv6piQ0FY+9Qywp0PdWshYgsMJSalixFY7eC6oPu0zRxLAQ==" + "resolved" "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz" + "version" "3.3.7" + +"https-proxy-agent@1.0.0": + "integrity" "sha512-OZhm7//JDnQthMVqlPAfkZyPO2fMhfHY6gY+jZcX8rLfFiGtHiIQrfD80WvCDHNMQ77Ak3r5CiPRDD2rNzo2OQ==" + "resolved" "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "agent-base" "2.1.1" + "debug" "2.6.9" + "extend" "3.0.2" + +"human-signals@^2.1.0": + "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + "version" "2.1.0" + +"iconv-lite@0.4.24": + "integrity" "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==" + "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + "version" "0.4.24" + dependencies: + "safer-buffer" "2.1.2" + +"iconv-lite@0.6.3": + "integrity" "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==" + "resolved" "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + "version" "0.6.3" + dependencies: + "safer-buffer" "2.1.2" + +"immediate@3.0.6": + "integrity" "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + "resolved" "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz" + "version" "3.0.6" + +"in-publish@2.0.1": + "integrity" "sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==" + "resolved" "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz" + "version" "2.0.1" + +"indent-string@2.1.0": + "integrity" "sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==" + "resolved" "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "repeating" "2.0.1" + +"inflight@1.0.6": + "integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==" + "resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + "version" "1.0.6" + dependencies: + "once" "1.4.0" + "wrappy" "1.0.2" + +"inherits@2.0.3": + "integrity" "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + "version" "2.0.3" + +"inherits@2.0.4": + "integrity" "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "resolved" "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + "version" "2.0.4" + +"ini@^1.3.4", "ini@~1.3.0", "ini@1.3.8": + "integrity" "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "resolved" "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + "version" "1.3.8" + +"inquirer@0.6.0": + "integrity" "sha512-bJO/y0P+wJaheeHvzQX0D84zPOKGCA1YB0naPAh11dKQU8cq7wEL5gEimW4WqtrD3Jmx5XBCdyR3N3vAaOiO9w==" + "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-0.6.0.tgz" + "version" "0.6.0" + dependencies: + "chalk" "0.5.1" + "cli-color" "0.3.3" + "lodash" "2.4.2" + "mute-stream" "0.0.4" + "readline2" "0.1.1" + "rx" "2.5.3" + "through" "2.3.8" + +"inquirer@0.7.1": + "integrity" "sha512-K7nscvi9u+COKmG4Ft33ohXgZfc9H/SeO86j+0NwIJXqw14oBL5AxnG4Ftgs6ZUjb3YwxHogTj/ZTLFYN4T3ow==" + "resolved" "https://registry.npmjs.org/inquirer/-/inquirer-0.7.1.tgz" + "version" "0.7.1" + dependencies: + "chalk" "0.5.1" + "cli-color" "0.3.3" + "figures" "1.7.0" + "lodash" "2.4.2" + "mute-stream" "0.0.4" + "readline2" "0.1.1" + "rx" "2.5.3" + "through" "2.3.8" + +"insight@0.4.3": + "integrity" "sha512-19hH6UMVq50cdkhQS3h4k9Y3vhbylAuocoPK7TA1wtB9uCGFCvZ3FdyOqKIkv3YzQD0fNurBLgjBAUsc6Jmefw==" + "resolved" "https://registry.npmjs.org/insight/-/insight-0.4.3.tgz" + "version" "0.4.3" + dependencies: + "async" "0.9.2" + "chalk" "0.5.1" + "configstore" "0.3.2" + "inquirer" "0.6.0" + "lodash.debounce" "2.4.1" + "object-assign" "1.0.0" + "os-name" "1.0.3" + "request" "2.88.2" + "tough-cookie" "0.12.1" + +"interpret@1.1.0": + "integrity" "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==" + "resolved" "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz" + "version" "1.1.0" + +"intersect@0.0.3": + "integrity" "sha512-Bp/mSG9dsq/eOMk2Q7DyjKxY62TTU2RvNvycjXHhi5TjrA72H+I3c5+1nAOAqtENcrQvCb5NDlsoPWJ4Bh01SA==" + "resolved" "https://registry.npmjs.org/intersect/-/intersect-0.0.3.tgz" + "version" "0.0.3" + +"is-absolute@1.0.0": + "integrity" "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==" + "resolved" "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "is-relative" "1.0.0" + "is-windows" "1.0.2" + +"is-accessor-descriptor@0.1.6": + "integrity" "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==" + "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" + "version" "0.1.6" + dependencies: + "kind-of" "3.2.2" + +"is-accessor-descriptor@1.0.0": + "integrity" "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==" + "resolved" "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "kind-of" "6.0.3" + +"is-arrayish@0.2.1": + "integrity" "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + "resolved" "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + "version" "0.2.1" + +"is-binary-path@1.0.1": + "integrity" "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==" + "resolved" "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "binary-extensions" "1.13.1" + +"is-buffer@1.1.6": + "integrity" "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "resolved" "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + "version" "1.1.6" + +"is-core-module@2.13.0": + "integrity" "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==" + "resolved" "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" + "version" "2.13.0" + dependencies: + "has" "1.0.3" + +"is-data-descriptor@0.1.4": + "integrity" "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==" + "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" + "version" "0.1.4" + dependencies: + "kind-of" "3.2.2" + +"is-data-descriptor@1.0.0": + "integrity" "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==" + "resolved" "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "kind-of" "6.0.3" + +"is-descriptor@0.1.6": + "integrity" "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==" + "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" + "version" "0.1.6" + dependencies: + "is-accessor-descriptor" "0.1.6" + "is-data-descriptor" "0.1.4" + "kind-of" "5.1.0" + +"is-descriptor@1.0.2": + "integrity" "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==" + "resolved" "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "is-accessor-descriptor" "1.0.0" + "is-data-descriptor" "1.0.0" + "kind-of" "6.0.3" + +"is-docker@^2.0.0": + "integrity" "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + "resolved" "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + "version" "2.2.1" + +"is-dotfile@1.0.3": + "integrity" "sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==" + "resolved" "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz" + "version" "1.0.3" -"@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"is-equal-shallow@0.1.3": + "integrity" "sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==" + "resolved" "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" + "version" "0.1.3" dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "is-primitive" "2.0.0" -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"is-expression@3.0.0": + "integrity" "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==" + "resolved" "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz" + "version" "3.0.0" dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "acorn" "4.0.13" + "object-assign" "4.1.1" -"@babel/plugin-transform-block-scoping@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz" - integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" +"is-extendable@0.1.1": + "integrity" "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==" + "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + "version" "0.1.1" -"@babel/plugin-transform-classes@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz" - integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A== +"is-extendable@1.0.1": + "integrity" "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==" + "resolved" "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" + "version" "1.0.1" dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.19.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-replace-supers" "^7.18.9" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" + "is-plain-object" "2.0.4" -"@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" +"is-extglob@1.0.0": + "integrity" "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + "version" "1.0.0" -"@babel/plugin-transform-destructuring@^7.18.13": - version "7.18.13" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz" - integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" +"is-extglob@2.1.1": + "integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" + "resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + "version" "2.1.1" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"is-finite@1.1.0": + "integrity" "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" + "resolved" "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz" + "version" "1.1.0" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" +"is-fullwidth-code-point@^3.0.0": + "integrity" "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + "version" "3.0.0" + +"is-fullwidth-code-point@1.0.0": + "integrity" "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "number-is-nan" "1.0.1" + +"is-fullwidth-code-point@2.0.0": + "integrity" "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==" + "resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + "version" "2.0.0" + +"is-glob@2.0.1": + "integrity" "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "is-extglob" "1.0.0" + +"is-glob@4.0.3": + "integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==" + "resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "is-extglob" "2.1.1" + +"is-lower-case@1.1.3": + "integrity" "sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==" + "resolved" "https://registry.npmjs.org/is-lower-case/-/is-lower-case-1.1.3.tgz" + "version" "1.1.3" + dependencies: + "lower-case" "1.1.4" + +"is-number@2.1.0": + "integrity" "sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "kind-of" "3.2.2" + +"is-number@3.0.0": + "integrity" "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "kind-of" "3.2.2" + +"is-number@4.0.0": + "integrity" "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz" + "version" "4.0.0" -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"is-number@7.0.0": + "integrity" "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + "resolved" "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + "version" "7.0.0" -"@babel/plugin-transform-flow-strip-types@^7.18.6": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz" - integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-flow" "^7.18.6" +"is-path-cwd@1.0.0": + "integrity" "sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==" + "resolved" "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz" + "version" "1.0.0" + +"is-path-in-cwd@1.0.1": + "integrity" "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==" + "resolved" "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "is-path-inside" "1.0.1" + +"is-path-inside@1.0.1": + "integrity" "sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==" + "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "path-is-inside" "1.0.2" + +"is-plain-object@2.0.4": + "integrity" "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==" + "resolved" "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "isobject" "3.0.1" + +"is-port-reachable@4.0.0": + "integrity" "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==" + "resolved" "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz" + "version" "4.0.0" + +"is-posix-bracket@0.1.1": + "integrity" "sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==" + "resolved" "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + "version" "0.1.1" + +"is-primitive@2.0.0": + "integrity" "sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==" + "resolved" "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + "version" "2.0.0" + +"is-promise@2.2.2": + "integrity" "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "resolved" "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz" + "version" "2.2.2" + +"is-regex@1.1.4": + "integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==" + "resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + "version" "1.1.4" + dependencies: + "call-bind" "1.0.2" + "has-tostringtag" "1.0.0" + +"is-relative@1.0.0": + "integrity" "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==" + "resolved" "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "is-unc-path" "1.0.0" + +"is-root@1.0.0": + "integrity" "sha512-1d50EJ7ipFxb9bIx213o6KPaJmHN8f+nR48UZWxWVzDx+NA3kpscxi02oQX3rGkEaLBi9m3ZayHngQc3+bBX9w==" + "resolved" "https://registry.npmjs.org/is-root/-/is-root-1.0.0.tgz" + "version" "1.0.0" + +"is-stream@^2.0.0": + "integrity" "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + "version" "2.0.1" + +"is-stream@1.1.0": + "integrity" "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==" + "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + "version" "1.1.0" + +"is-typedarray@1.0.0": + "integrity" "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + "resolved" "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + "version" "1.0.0" + +"is-unc-path@1.0.0": + "integrity" "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==" + "resolved" "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "unc-path-regex" "0.1.2" + +"is-upper-case@1.1.2": + "integrity" "sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==" + "resolved" "https://registry.npmjs.org/is-upper-case/-/is-upper-case-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "upper-case" "1.1.3" + +"is-utf8@0.2.1": + "integrity" "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==" + "resolved" "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + "version" "0.2.1" + +"is-windows@1.0.2": + "integrity" "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + "resolved" "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + "version" "1.0.2" + +"is-wsl@^2.2.0": + "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==" + "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "is-docker" "^2.0.0" + +"isarray@0.0.1": + "integrity" "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "version" "0.0.1" + +"isarray@1.0.0": + "integrity" "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + "resolved" "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + "version" "1.0.0" + +"isexe@^2.0.0", "isexe@2.0.0": + "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + "version" "2.0.0" + +"isobject@2.1.0": + "integrity" "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==" + "resolved" "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "isarray" "1.0.0" + +"isobject@3.0.1": + "integrity" "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" + "resolved" "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + "version" "3.0.1" + +"isstream@0.1.2": + "integrity" "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + "resolved" "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + "version" "0.1.2" + +"jasmine-core@~2.8.0": + "integrity" "sha512-SNkOkS+/jMZvLhuSx1fjhcNWUC/KG6oVyFUGkSBEr9n1axSNduWU8GlI7suaHXr4yxjet6KjrUZxUTE5WzzWwQ==" + "resolved" "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz" + "version" "2.8.0" + +"jasmine-core@2.99.1": + "integrity" "sha512-ra97U4qu3OCcIxvN6eg3kyy8bLrID/TgxafSGMMICg3SFx5C/sUfDPpiOh7yoIsHdtjrOVdtT9rieYhqOsh9Ww==" + "resolved" "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz" + "version" "2.99.1" + +"jasmine-jquery@^2.1.1": + "integrity" "sha512-13d18zXTGeiNAjd4sAhoUGQbCEXTMbUyjrnQ9JFQM/atyyFubHejL5RCE5iyW7jOh1cwjoqVefAAsSA4SFtooQ==" + "resolved" "https://registry.npmjs.org/jasmine-jquery/-/jasmine-jquery-2.1.1.tgz" + "version" "2.1.1" + +"jasmine@2.99.0": + "integrity" "sha512-kmuDC+6c9tA8BAZGd7wmucWKrM/aCCBSzCJEqRghvw9lKValw+pg88aN/BFIikmZwRTD57QmHamQ2wRpKb3FDQ==" + "resolved" "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz" + "version" "2.99.0" + dependencies: + "exit" "0.1.2" + "glob" "7.1.7" + "jasmine-core" "2.99.1" + +"jasminewd2@2.2.0": + "integrity" "sha512-Rn0nZe4rfDhzA63Al3ZGh0E+JTmM6ESZYXJGKuqKGZObsAB9fwXPD03GjtIEvJBDOhN94T5MzbwZSqzFHSQPzg==" + "resolved" "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz" + "version" "2.2.0" + +"jit-grunt@~0.10.0": + "integrity" "sha512-eT/f4c9wgZ3buXB7X1JY1w6uNtAV0bhrbOGf/mFmBb0CDNLUETJ/VRoydayWOI54tOoam0cz9RooVCn3QY1WoA==" + "resolved" "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz" + "version" "0.10.0" + +"js-base64@2.6.4": + "integrity" "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + "resolved" "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz" + "version" "2.6.4" + +"js-stringify@1.0.2": + "integrity" "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + "resolved" "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz" + "version" "1.0.2" + +"js-yaml@3.14.1": + "integrity" "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==" + "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + "version" "3.14.1" + dependencies: + "argparse" "1.0.10" + "esprima" "4.0.1" + +"jsbn@0.1.1": + "integrity" "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + "resolved" "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + "version" "0.1.1" + +"jshint@2.9.7": + "integrity" "sha512-Q8XN38hGsVQhdlM+4gd1Xl7OB1VieSuCJf+fEJjpo59JH99bVJhXRXAh26qQ15wfdd1VPMuDWNeSWoNl53T4YA==" + "resolved" "https://registry.npmjs.org/jshint/-/jshint-2.9.7.tgz" + "version" "2.9.7" + dependencies: + "cli" "1.0.1" + "console-browserify" "1.1.0" + "exit" "0.1.2" + "htmlparser2" "3.8.3" + "lodash" "4.17.21" + "minimatch" "3.0.8" + "shelljs" "0.3.0" + "strip-json-comments" "1.0.4" + +"json-schema-traverse@^1.0.0": + "integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + "version" "1.0.0" + +"json-schema-traverse@0.4.1": + "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + "version" "0.4.1" + +"json-schema@0.4.0": + "integrity" "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + "resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + "version" "0.4.0" + +"json-stringify-safe@5.0.1": + "integrity" "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + "resolved" "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + "version" "5.0.1" + +"jsonfile@2.4.0": + "integrity" "sha512-PKllAqbgLgxHaj8TElYymKCAgrASebJrWpTnEkOaTowt23VKXXN0sUeriJ+eh7y6ufb/CC5ap11pz71/cM0hUw==" + "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz" + "version" "2.4.0" + dependencies: + "graceful-fs" "4.2.11" + +"jsonfile@3.0.1": + "integrity" "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==" + "resolved" "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "graceful-fs" "4.2.11" + +"jsonify@0.0.1": + "integrity" "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==" + "resolved" "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz" + "version" "0.0.1" + +"jsprim@1.4.2": + "integrity" "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==" + "resolved" "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" + "version" "1.4.2" + dependencies: + "assert-plus" "1.0.0" + "extsprintf" "1.3.0" + "json-schema" "0.4.0" + "verror" "1.10.0" + +"jstransformer@1.0.0": + "integrity" "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==" + "resolved" "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "is-promise" "2.2.2" + "promise" "7.3.1" + +"jszip@3.10.1": + "integrity" "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==" + "resolved" "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz" + "version" "3.10.1" + dependencies: + "lie" "3.3.0" + "pako" "1.0.11" + "readable-stream" "2.3.8" + "setimmediate" "1.0.5" + +"junk@1.0.3": + "integrity" "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==" + "resolved" "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz" + "version" "1.0.3" + +"karma-chrome-launcher@^2.1.1": + "integrity" "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==" + "resolved" "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "fs-access" "1.0.1" + "which" "1.3.1" + +"karma-fixture@^0.2.6": + "integrity" "sha512-7jVtBtUclZ7r6BIn5YK3BQO6Xkgyo/v3K51BwXde9Fn884lHV0Gy+UhCzJxsioMh1jCRr0NO+Mkm6EsxdVxRKA==" + "resolved" "https://registry.npmjs.org/karma-fixture/-/karma-fixture-0.2.6.tgz" + "version" "0.2.6" + +"karma-html2js-preprocessor@^1.0.0": + "integrity" "sha512-SiaPXNxIQjzBnxbi0mOT24zCzjFWBGaxWM/DqnEhp4WbI5kNpiZ35Jb/h7etrob+wiDSuDkltCuxE/fMSayqeQ==" + "resolved" "https://registry.npmjs.org/karma-html2js-preprocessor/-/karma-html2js-preprocessor-1.1.0.tgz" + "version" "1.1.0" + +"karma-jasmine-jquery@^0.1.1": + "integrity" "sha512-0cokjpPXKmAH5RtoLacqV/lO3O4Mmm9Lfwv3XWMePQHtl8TcX7rQhczDUL7kHtd3R9md49NWiDDGWPkTxDi29A==" + "resolved" "https://registry.npmjs.org/karma-jasmine-jquery/-/karma-jasmine-jquery-0.1.1.tgz" + "version" "0.1.1" + dependencies: + "bower" "1.8.14" + "bower-installer" "git://github.com/bessdsv/bower-installer.git#7f9cece1e6fada50f44dc0851e1d85815cd1b4a7" + +"karma-jasmine@^1.1.1": + "integrity" "sha512-SENGE9DhlIIFTSZWiNq4eGeXL8G6z9cqHIOdkx9jh1qhhQqwEy3tAoLRyER0vOcHqdOlKmGpOuXk+HOipIy7sg==" + "resolved" "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.2.tgz" + "version" "1.1.2" + +"karma-json-fixtures-preprocessor@0.0.6": + "integrity" "sha512-weEt31YeOgui3Lmw1KYWgvkcjOb3Mr8xvB3SgjKg0wDlAGqCDhhXkff6UHaK5J0fIZzJMur18PqHMgzulM5bzA==" + "resolved" "https://registry.npmjs.org/karma-json-fixtures-preprocessor/-/karma-json-fixtures-preprocessor-0.0.6.tgz" + "version" "0.0.6" + +"karma-junit-reporter@^1.2.0": + "integrity" "sha512-FeuLOKlXNtJhIQK3oQASbO5QOib762CEHV8+L9wwTQpiZJgp7xKg3sNno66rL5bQPV2soG6fJdAFWqqnMJuh2w==" + "resolved" "https://registry.npmjs.org/karma-junit-reporter/-/karma-junit-reporter-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "path-is-absolute" "1.0.1" + "xmlbuilder" "8.2.2" + +"karma-nyan-reporter@^0.2.3": + "integrity" "sha512-t4/2zTMkGINeB+7gIxo7lsoNT4mvaFEuZ1AJIFwFPOpVjiECbXHVqDw9nzIgBG4Qu7Jccb3+SFERX0aLKGdStw==" + "resolved" "https://registry.npmjs.org/karma-nyan-reporter/-/karma-nyan-reporter-0.2.5.tgz" + "version" "0.2.5" + dependencies: + "cli-color" "0.3.3" + +"karma-phantomjs-launcher@^1.0.4": + "integrity" "sha512-tf4P3plsE7wb5Pqh8GJ6RnElxfI/UM4MtVnjbSIZFpdFJlKnjRzfIx8MLCcSYJBwZ1+qSKFz4uBe3XNoq2t3KA==" + "resolved" "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "lodash" "4.17.21" + "phantomjs-prebuilt" "2.1.16" + +"kew@0.7.0": + "integrity" "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==" + "resolved" "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz" + "version" "0.7.0" + +"kind-of@3.2.2": + "integrity" "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==" + "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + "version" "3.2.2" + dependencies: + "is-buffer" "1.1.6" + +"kind-of@4.0.0": + "integrity" "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==" + "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "is-buffer" "1.1.6" + +"kind-of@5.1.0": + "integrity" "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" + "version" "5.1.0" + +"kind-of@6.0.3": + "integrity" "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + "resolved" "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + "version" "6.0.3" + +"klaw@1.3.1": + "integrity" "sha512-TED5xi9gGQjGpNnvRWknrwAB1eL5GciPfVFOt3Vk1OJCVDQbzuSfrF3hkUQKlsgKrG1F+0t5W0m+Fje1jIt8rw==" + "resolved" "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz" + "version" "1.3.1" + dependencies: + "graceful-fs" "4.2.11" + +"latest-version@0.2.0": + "integrity" "sha512-tw4eCzlFfcaQcmQBeZTKAh0HTc96ta9kHTud6b2kxoiV1Mpymx2aR4PMFQI0UQDDNUzvuyVfOwq4/Qp1a1/eTw==" + "resolved" "https://registry.npmjs.org/latest-version/-/latest-version-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "package-json" "0.2.0" + +"lazy-cache@1.0.4": + "integrity" "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==" + "resolved" "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + "version" "1.0.4" + +"lie@3.3.0": + "integrity" "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==" + "resolved" "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "immediate" "3.0.6" + +"liftup@3.0.1": + "integrity" "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==" + "resolved" "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "extend" "3.0.2" + "findup-sync" "4.0.0" + "fined" "1.2.0" + "flagged-respawn" "1.0.1" + "is-plain-object" "2.0.4" + "object.map" "1.0.1" + "rechoir" "0.7.1" + "resolve" "1.22.4" + +"livereload-js@2.4.0": + "integrity" "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==" + "resolved" "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz" + "version" "2.4.0" + +"load-json-file@1.1.0": + "integrity" "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==" + "resolved" "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "graceful-fs" "4.2.11" + "parse-json" "2.2.0" + "pify" "2.3.0" + "pinkie-promise" "2.0.1" + "strip-bom" "2.0.0" + +"locate-path@3.0.0": + "integrity" "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==" + "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "p-locate" "3.0.0" + "path-exists" "3.0.0" + +"lockfile@1.0.4": + "integrity" "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==" + "resolved" "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "signal-exit" "3.0.7" + +"lodash._arraycopy@3.0.0": + "integrity" "sha512-RHShTDnPKP7aWxlvXKiDT6IX2jCs6YZLCtNhOru/OX2Q/tzX295vVBK5oX1ECtN+2r86S0Ogy8ykP1sgCZAN0A==" + "resolved" "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz" + "version" "3.0.0" + +"lodash._arrayeach@3.0.0": + "integrity" "sha512-Mn7HidOVcl3mkQtbPsuKR0Fj0N6Q6DQB77CtYncZcJc0bx5qv2q4Gl6a0LC1AN+GSxpnBDNnK3CKEm9XNA4zqQ==" + "resolved" "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz" + "version" "3.0.0" + +"lodash._baseassign@3.2.0": + "integrity" "sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==" + "resolved" "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "lodash._basecopy" "3.0.1" + "lodash.keys" "3.1.2" + +"lodash._baseclone@3.3.0": + "integrity" "sha512-1K0dntf2dFQ5my0WoGKkduewR6+pTNaqX03kvs45y7G5bzl4B3kTR4hDfJIc2aCQDeLyQHhS280tc814m1QC1Q==" + "resolved" "https://registry.npmjs.org/lodash._baseclone/-/lodash._baseclone-3.3.0.tgz" + "version" "3.3.0" + dependencies: + "lodash._arraycopy" "3.0.0" + "lodash._arrayeach" "3.0.0" + "lodash._baseassign" "3.2.0" + "lodash._basefor" "3.0.3" + "lodash.isarray" "3.0.4" + "lodash.keys" "3.1.2" + +"lodash._basecopy@3.0.1": + "integrity" "sha512-rFR6Vpm4HeCK1WPGvjZSJ+7yik8d8PVUdCJx5rT2pogG4Ve/2ZS7kfmO5l5T2o5V2mqlNIfSF5MZlr1+xOoYQQ==" + "resolved" "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz" + "version" "3.0.1" + +"lodash._basefor@3.0.3": + "integrity" "sha512-6bc3b8grkpMgDcVJv9JYZAk/mHgcqMljzm7OsbmcE2FGUMmmLQTPHlh/dFqR8LA0GQ7z4K67JSotVKu5058v1A==" + "resolved" "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz" + "version" "3.0.3" + +"lodash._bindcallback@3.0.1": + "integrity" "sha512-2wlI0JRAGX8WEf4Gm1p/mv/SZ+jLijpj0jyaE/AXeuQphzCgD8ZQW4oSpoN8JAopujOFGU3KMuq7qfHBWlGpjQ==" + "resolved" "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz" + "version" "3.0.1" + +"lodash._getnative@3.9.1": + "integrity" "sha512-RrL9VxMEPyDMHOd9uFbvMe8X55X16/cGM5IgOKgRElQZutpX89iS6vwl64duTV1/16w5JY7tuFNXqoekmh1EmA==" + "resolved" "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz" + "version" "3.9.1" + +"lodash._isnative@2.4.1": + "integrity" "sha512-BOlKGKNHhCHswGOWtmVb5zBygyxN7EmTuzVOSQI6QSoGhG+kvv71gICFS1TBpnqvT1n53txK8CDK3u5D2/GZxQ==" + "resolved" "https://registry.npmjs.org/lodash._isnative/-/lodash._isnative-2.4.1.tgz" + "version" "2.4.1" + +"lodash._objecttypes@2.4.1": + "integrity" "sha512-XpqGh1e7hhkOzftBfWE7zt+Yn9mVHFkDhicVttvKLsoCMLVVL+xTQjfjB4X4vtznauxv0QZ5ZAeqjvat0dh62Q==" + "resolved" "https://registry.npmjs.org/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz" + "version" "2.4.1" + +"lodash.clonedeep@3.0.2": + "integrity" "sha512-I8MpGh5z+6OixDAAb21teLSZDmqVPjlq02Q7ZFrbn2xnQHYYuJf6on/94SWpF/p0s3p/cEv/53ro4AhDOfCR0g==" + "resolved" "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "lodash._baseclone" "3.3.0" + "lodash._bindcallback" "3.0.1" + +"lodash.debounce@2.4.1": + "integrity" "sha512-lzSGKuZQhTFRd4v809TAn1sdMXasHZ1TY3t/NxuXsdcvUcKfnUdnl5E4+g7PWVBdSl1mIe5jCDZbwF8Gu8MD+A==" + "resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "lodash.isfunction" "2.4.1" + "lodash.isobject" "2.4.1" + "lodash.now" "2.4.1" + +"lodash.isarguments@3.1.0": + "integrity" "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" + "resolved" "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz" + "version" "3.1.0" + +"lodash.isarray@3.0.4": + "integrity" "sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==" + "resolved" "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz" + "version" "3.0.4" + +"lodash.isfunction@2.4.1": + "integrity" "sha512-6XcAB3izeQxPOQQNAJbbdjXbvWEt2Pn9ezPrjr4CwoLwmqsLVbsiEXD19cmmt4mbzOCOCdHzOQiUivUOJLra7w==" + "resolved" "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-2.4.1.tgz" + "version" "2.4.1" + +"lodash.isobject@2.4.1": + "integrity" "sha512-sTebg2a1PoicYEZXD5PBdQcTlIJ6hUslrlWr7iV0O7n+i4596s2NQ9I5CaZ5FbXSfya/9WQsrYLANUJv9paYVA==" + "resolved" "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "lodash._objecttypes" "2.4.1" + +"lodash.keys@3.1.2": + "integrity" "sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==" + "resolved" "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "lodash._getnative" "3.9.1" + "lodash.isarguments" "3.1.0" + "lodash.isarray" "3.0.4" + +"lodash.now@2.4.1": + "integrity" "sha512-KrUkev+xdqFbHHPSiVMnztWVJsHHeEda1IJshDG54m1oEvmO6F37kkMR9fmyeK6yLPg/QSXcyO6L56OmZuNQig==" + "resolved" "https://registry.npmjs.org/lodash.now/-/lodash.now-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "lodash._isnative" "2.4.1" + +"lodash@0.9.2": + "integrity" "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + "version" "0.9.2" + +"lodash@2.2.1": + "integrity" "sha512-rGaKzxe4Biu8YdCPD/tUkBF4/fnAqgj63A6PeAyQnH/NEKNUHgppGZUgYBYOmAZsBKwwAb343Q1Zew0RDB2jIg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-2.2.1.tgz" + "version" "2.2.1" + +"lodash@2.4.2": + "integrity" "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + "version" "2.4.2" + +"lodash@3.10.1": + "integrity" "sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz" + "version" "3.10.1" + +"lodash@4.17.21": + "integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + "version" "4.17.21" + +"longest@1.0.1": + "integrity" "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==" + "resolved" "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" + "version" "1.0.1" + +"loud-rejection@1.6.0": + "integrity" "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==" + "resolved" "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz" + "version" "1.6.0" + dependencies: + "currently-unhandled" "0.4.1" + "signal-exit" "3.0.7" + +"lower-case-first@1.0.2": + "integrity" "sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==" + "resolved" "https://registry.npmjs.org/lower-case-first/-/lower-case-first-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "lower-case" "1.1.4" + +"lower-case@1.1.4": + "integrity" "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==" + "resolved" "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" + "version" "1.1.4" + +"lru-cache@2.3.1": + "integrity" "sha512-EjtmtXFUu+wXm6PW3T6RT1ekQUxobC7B5TDCU0CS0212wzpwKiXs6vLun+JI+OoWmmliWdYqnrpjrlK7W3ELdQ==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-2.3.1.tgz" + "version" "2.3.1" + +"lru-cache@2.5.2": + "integrity" "sha512-wyqfj+623mgqv+bpjTdivSoC/LtY9oOrmKz2Cke0NZcgYW9Kce/qWjd9e5PDYf8wuiKfVeo8VnyOSSyeRiUsLw==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-2.5.2.tgz" + "version" "2.5.2" + +"lru-cache@4.1.5": + "integrity" "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==" + "resolved" "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + "version" "4.1.5" + dependencies: + "pseudomap" "1.0.2" + "yallist" "2.1.2" + +"lru-queue@0.1.0": + "integrity" "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==" + "resolved" "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "es5-ext" "0.10.62" + +"make-iterator@1.0.1": + "integrity" "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==" + "resolved" "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "kind-of" "6.0.3" + +"map-cache@0.2.2": + "integrity" "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==" + "resolved" "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + "version" "0.2.2" + +"map-obj@1.0.1": + "integrity" "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==" + "resolved" "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + "version" "1.0.1" + +"map-visit@1.0.0": + "integrity" "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==" + "resolved" "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "object-visit" "1.0.1" + +"marked@0.3.19": + "integrity" "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==" + "resolved" "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz" + "version" "0.3.19" + +"math-random@1.0.4": + "integrity" "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==" + "resolved" "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz" + "version" "1.0.4" + +"maxmin@2.1.0": + "integrity" "sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==" + "resolved" "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "chalk" "1.1.3" + "figures" "1.7.0" + "gzip-size" "3.0.0" + "pretty-bytes" "3.0.1" + +"maxmin@3.0.0": + "integrity" "sha512-wcahMInmGtg/7c6a75fr21Ch/Ks1Tb+Jtoan5Ft4bAI0ZvJqyOw8kkM7e7p8hDSzY805vmxwHT50KcjGwKyJ0g==" + "resolved" "https://registry.npmjs.org/maxmin/-/maxmin-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "chalk" "4.1.2" + "figures" "3.2.0" + "gzip-size" "5.1.1" + "pretty-bytes" "5.6.0" + +"memoizee@0.3.10": + "integrity" "sha512-LLzVUuWwGBKK188spgOK/ukrp5zvd9JGsiLDH41pH9vt5jvhZfsu5pxDuAnYAMG8YEGce72KO07sSBy9KkvOfw==" + "resolved" "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz" + "version" "0.3.10" + dependencies: + "d" "0.1.1" + "es5-ext" "0.10.62" + "es6-weak-map" "0.1.4" + "event-emitter" "0.3.5" + "lru-queue" "0.1.0" + "next-tick" "0.2.2" + "timers-ext" "0.1.7" + +"meow@3.7.0": + "integrity" "sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==" + "resolved" "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz" + "version" "3.7.0" + dependencies: + "camelcase-keys" "2.1.0" + "decamelize" "1.2.0" + "loud-rejection" "1.6.0" + "map-obj" "1.0.1" + "minimist" "1.2.8" + "normalize-package-data" "2.5.0" + "object-assign" "4.1.1" + "read-pkg-up" "1.0.1" + "redent" "1.0.0" + "trim-newlines" "1.0.0" + +"merge-stream@^2.0.0": + "integrity" "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + "resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + "version" "2.0.0" + +"micromatch@2.3.11": + "integrity" "sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" + "version" "2.3.11" + dependencies: + "arr-diff" "2.0.0" + "array-unique" "0.2.1" + "braces" "1.8.5" + "expand-brackets" "0.1.5" + "extglob" "0.3.2" + "filename-regex" "2.0.1" + "is-extglob" "1.0.0" + "is-glob" "2.0.1" + "kind-of" "3.2.2" + "normalize-path" "2.1.1" + "object.omit" "2.0.1" + "parse-glob" "3.0.4" + "regex-cache" "0.4.4" + +"micromatch@3.1.10": + "integrity" "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" + "version" "3.1.10" + dependencies: + "arr-diff" "4.0.0" + "array-unique" "0.3.2" + "braces" "2.3.2" + "define-property" "2.0.2" + "extend-shallow" "3.0.2" + "extglob" "2.0.4" + "fragment-cache" "0.2.1" + "kind-of" "6.0.3" + "nanomatch" "1.2.13" + "object.pick" "1.3.0" + "regex-not" "1.0.2" + "snapdragon" "0.8.2" + "to-regex" "3.0.2" + +"micromatch@4.0.5": + "integrity" "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==" + "resolved" "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + "version" "4.0.5" + dependencies: + "braces" "3.0.2" + "picomatch" "2.3.1" + +"mime-db@~1.33.0": + "integrity" "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + "version" "1.33.0" + +"mime-db@1.12.0": + "integrity" "sha512-5aMAW7I4jZoZB27fXRuekqc4DVvJ7+hM8UcWrNj2mqibE54gXgPSonBYBdQW5hyaVNGmiYjY0ZMqn9fBefWYvA==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.12.0.tgz" + "version" "1.12.0" + +"mime-db@1.52.0": + "integrity" "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "resolved" "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + "version" "1.52.0" + +"mime-types@1.0.2": + "integrity" "sha512-echfutj/t5SoTL4WZpqjA1DCud1XO0WQF3/GJ48YBmc4ZMhCK77QA6Z/w6VTQERLKuJ4drze3kw2TUT8xZXVNw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-1.0.2.tgz" + "version" "1.0.2" + +"mime-types@2.0.14": + "integrity" "sha512-2ZHUEstNkIf2oTWgtODr6X0Cc4Ns/RN/hktdozndiEhhAC2wxXejF1FH0XLHTEImE9h6gr/tcnr3YOnSGsxc7Q==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.0.14.tgz" + "version" "2.0.14" + dependencies: + "mime-db" "1.12.0" + +"mime-types@2.1.18": + "integrity" "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + "version" "2.1.18" + dependencies: + "mime-db" "~1.33.0" + +"mime-types@2.1.35": + "integrity" "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==" + "resolved" "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + "version" "2.1.35" + dependencies: + "mime-db" "1.52.0" + +"mime@1.2.11": + "integrity" "sha512-Ysa2F/nqTNGHhhm9MV8ure4+Hc+Y8AWiqUdHxsO7xu8zc92ND9f3kpALHjaP026Ft17UfxrMt95c50PLUeynBw==" + "resolved" "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + "version" "1.2.11" + +"mime@1.6.0": + "integrity" "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "resolved" "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + "version" "1.6.0" + +"mimic-fn@^2.1.0": + "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + "version" "2.1.0" + +"minimatch@0.3.0": + "integrity" "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "lru-cache" "2.5.2" + "sigmund" "1.0.1" + +"minimatch@1.0.0": + "integrity" "sha512-Ejh5Odk/uFXAj5nf/NSXk0UamqcGAfOdHI7nY0zvCHyn4f3nKLFoUTp+lYxDxSih/40uW8lpwDplOWHdWkQXWA==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "lru-cache" "2.5.2" + "sigmund" "1.0.1" + +"minimatch@3.0.8": + "integrity" "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz" + "version" "3.0.8" + dependencies: + "brace-expansion" "1.1.11" + +"minimatch@3.1.2": + "integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==" + "resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + "version" "3.1.2" + dependencies: + "brace-expansion" "^1.1.7" + +"minimist@^1.2.0", "minimist@1.2.8": + "integrity" "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + "version" "1.2.8" + +"minimist@0.0.10": + "integrity" "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz" + "version" "0.0.10" + +"minimist@0.0.8": + "integrity" "sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + "version" "0.0.8" + +"minimist@0.2.4": + "integrity" "sha512-Pkrrm8NjyQ8yVt8Am9M+yUt74zE3iokhzbG1bFVNjLB92vwM71hf40RkEsryg98BujhVOncKm/C1xROxZ030LQ==" + "resolved" "https://registry.npmjs.org/minimist/-/minimist-0.2.4.tgz" + "version" "0.2.4" + +"mixin-deep@1.3.2": + "integrity" "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==" + "resolved" "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" + "version" "1.3.2" + dependencies: + "for-in" "1.0.2" + "is-extendable" "1.0.1" + +"mkdirp@0.3.5": + "integrity" "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + "version" "0.3.5" + +"mkdirp@0.5.0": + "integrity" "sha512-xjjNGy+ry1lhtIKcr2PT6ok3aszhQfgrUDp4OZLHacgRgFmF6XR9XCOJVcXlVGQonIqXcK1DvqgKKQOPWYGSfw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz" + "version" "0.5.0" + dependencies: + "minimist" "0.0.8" + +"mkdirp@0.5.6": + "integrity" "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==" + "resolved" "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + "version" "0.5.6" + dependencies: + "minimist" "1.2.8" + +"mkpath@0.1.0": + "integrity" "sha512-bauHShmaxVQiEvlrAPWxSPn8spSL8gDVRl11r8vLT4r/KdnknLqtqwQbToZ2Oa8sJkExYY1z6/d+X7pNiqo4yg==" + "resolved" "https://registry.npmjs.org/mkpath/-/mkpath-0.1.0.tgz" + "version" "0.1.0" + +"morgan@1.10.0": + "integrity" "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==" + "resolved" "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" + "version" "1.10.0" + dependencies: + "basic-auth" "2.0.1" + "debug" "2.6.9" + "depd" "2.0.0" + "on-finished" "2.3.0" + "on-headers" "1.0.2" + +"mout@0.9.1": + "integrity" "sha512-mZMABHAQPQ87JDQuxZIndS6XXDYZfeAfcTvHYyEFG4SEUiGNkInNZi/WhesQjCKUWih1bDDkqHw63wyCaczhsw==" + "resolved" "https://registry.npmjs.org/mout/-/mout-0.9.1.tgz" + "version" "0.9.1" + +"mout@1.2.4": + "integrity" "sha512-mZb9uOruMWgn/fw28DG4/yE3Kehfk1zKCLhuDU2O3vlKdnBBr4XaOCqVTflJ5aODavGUPqFHZgrFX3NJVuxGhQ==" + "resolved" "https://registry.npmjs.org/mout/-/mout-1.2.4.tgz" + "version" "1.2.4" + +"ms@2.0.0": + "integrity" "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + "version" "2.0.0" + +"ms@2.1.3": + "integrity" "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "resolved" "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + "version" "2.1.3" + +"mute-stream@0.0.4": + "integrity" "sha512-amvrY4m/7oZamehMoFi1tbwU/kXbVvRTGM2S7F+PZi3n51Jx+9AcSQ3EQsag3tR+hS2higfgOP/Kl8kri/X52A==" + "resolved" "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.4.tgz" + "version" "0.0.4" + +"nan@2.17.0": + "integrity" "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + "resolved" "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz" + "version" "2.17.0" + +"nanomatch@1.2.13": + "integrity" "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==" + "resolved" "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" + "version" "1.2.13" + dependencies: + "arr-diff" "4.0.0" + "array-unique" "0.3.2" + "define-property" "2.0.2" + "extend-shallow" "3.0.2" + "fragment-cache" "0.2.1" + "is-windows" "1.0.2" + "kind-of" "6.0.3" + "object.pick" "1.3.0" + "regex-not" "1.0.2" + "snapdragon" "0.8.2" + "to-regex" "3.0.2" + +"natives@1.1.6": + "integrity" "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" + "resolved" "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz" + "version" "1.1.6" + +"ncname@1.0.0": + "integrity" "sha512-VLkyYr2kmPzVzrmkER9i13RJIdGbjNr855gfh2VvuboO1eYnb9k+nFS+JygfSVgtbo/HMpLz5pEYLK4Xjy7XGg==" + "resolved" "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "xml-char-classes" "1.0.0" + +"negotiator@0.6.3": + "integrity" "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + "resolved" "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + "version" "0.6.3" + +"next-tick@0.2.2": + "integrity" "sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q==" + "resolved" "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz" + "version" "0.2.2" + +"next-tick@1.1.0": + "integrity" "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + "resolved" "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz" + "version" "1.1.0" + +"ng@*": + "integrity" "sha512-HwR40IBJa1ZU+CIGyuy7vSCN3xFYlSRfw5eIwwKOdOMNNNIl8KhT6PXKmHuFEFYpfrbOMaCYtr4QOJ3gkkubcg==" + "resolved" "https://registry.npmjs.org/ng/-/ng-0.0.0.tgz" + "version" "0.0.0" + +"nice-try@1.0.5": + "integrity" "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + "resolved" "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" + "version" "1.0.5" + +"no-case@2.3.2": + "integrity" "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==" + "resolved" "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz" + "version" "2.3.2" + dependencies: + "lower-case" "1.1.4" + +"node-fs@0.1.7": + "integrity" "sha512-XqDBlmUKgDGe76+lZ/0sRBF3XW2vVcK07+ZPvdpUTK8jrvtPahUd0aBqJ9+ZjB01ANjZLuvK3O/eoMVmz62rpA==" + "resolved" "https://registry.npmjs.org/node-fs/-/node-fs-0.1.7.tgz" + "version" "0.1.7" + +"node-gyp@3.8.0": + "integrity" "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==" + "resolved" "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz" + "version" "3.8.0" + dependencies: + "fstream" "1.0.12" + "glob" "7.1.7" + "graceful-fs" "4.2.11" + "mkdirp" "0.5.6" + "nopt" "3.0.6" + "npmlog" "4.1.2" + "osenv" "0.1.5" + "request" "2.88.2" + "rimraf" "2.7.1" + "semver" "5.3.0" + "tar" "2.2.2" + "which" "1.3.1" + +"node-sass@4.14.1": + "integrity" "sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==" + "resolved" "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz" + "version" "4.14.1" + dependencies: + "async-foreach" "0.1.3" + "chalk" "1.1.3" + "cross-spawn" "3.0.1" + "gaze" "1.1.3" + "get-stdin" "4.0.1" + "glob" "7.1.7" + "in-publish" "2.0.1" + "lodash" "4.17.21" + "meow" "3.7.0" + "mkdirp" "0.5.6" + "nan" "2.17.0" + "node-gyp" "3.8.0" + "npmlog" "4.1.2" + "request" "2.88.2" + "sass-graph" "2.2.5" + "stdout-stream" "1.4.1" + "true-case-path" "1.0.3" + +"node-uuid@1.4.8": + "integrity" "sha512-TkCET/3rr9mUuRp+CpO7qfgT++aAxfDRaalQhwPFzI9BY/2rCDn6OfpZOVggi1AXfTPpfkTrg5f5WQx5G1uLxA==" + "resolved" "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz" + "version" "1.4.8" + +"nopt@1.0.10": + "integrity" "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + "version" "1.0.10" + dependencies: + "abbrev" "1.1.1" + +"nopt@2.1.2": + "integrity" "sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz" + "version" "2.1.2" + dependencies: + "abbrev" "1.0.9" + +"nopt@2.2.1": + "integrity" "sha512-gIOTA/uJuhPwFqp+spY7VQ1satbnGlD+iQVZxI18K6hs8Evq4sX81Ml7BB5byP/LsbR2yBVtmvdEmhi7evJ6Aw==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz" + "version" "2.2.1" + dependencies: + "abbrev" "1.1.1" + +"nopt@3.0.6": + "integrity" "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz" + "version" "3.0.6" + dependencies: + "abbrev" "1.0.9" + +"nopt@4.0.3": + "integrity" "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==" + "resolved" "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz" + "version" "4.0.3" + dependencies: + "abbrev" "1.1.1" + "osenv" "0.1.5" + +"normalize-package-data@2.5.0": + "integrity" "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==" + "resolved" "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + "version" "2.5.0" + dependencies: + "hosted-git-info" "2.8.9" + "resolve" "1.22.4" + "semver" "5.7.2" + "validate-npm-package-license" "3.0.4" + +"normalize-path@2.1.1": + "integrity" "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==" + "resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "remove-trailing-separator" "1.1.0" + +"npm-run-path@^4.0.1": + "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==" + "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "path-key" "^3.0.0" + +"npmconf@2.1.3": + "integrity" "sha512-iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==" + "resolved" "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz" + "version" "2.1.3" + dependencies: + "config-chain" "1.1.13" + "inherits" "2.0.4" + "ini" "1.3.8" + "mkdirp" "0.5.6" + "nopt" "3.0.6" + "once" "1.3.3" + "osenv" "0.1.5" + "safe-buffer" "5.1.2" + "semver" "4.3.6" + "uid-number" "0.0.5" + +"npmlog@4.1.2": + "integrity" "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==" + "resolved" "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" + "version" "4.1.2" + dependencies: + "are-we-there-yet" "1.1.7" + "console-control-strings" "1.1.0" + "gauge" "2.7.4" + "set-blocking" "2.0.0" + +"null-check@1.0.0": + "integrity" "sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==" + "resolved" "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz" + "version" "1.0.0" + +"number-is-nan@1.0.1": + "integrity" "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==" + "resolved" "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + "version" "1.0.1" + +"oauth-sign@0.4.0": + "integrity" "sha512-vF36cbrUyfy7Yr6kTIzrj3RsuaPYeJKU3IUOC6MglfNTyiGT6leGvEVOa3UsSsgwBzfVfRnvMiMVyUnpXNqN8w==" + "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.4.0.tgz" + "version" "0.4.0" + +"oauth-sign@0.5.0": + "integrity" "sha512-jXeZq5EriUSGdNIePO45lhemfuCBKi5DARdE30v173MPCLymq2DxR477J/RuCXLphNx7OVAqXVyj3JoUaiHpNw==" + "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.5.0.tgz" + "version" "0.5.0" + +"oauth-sign@0.9.0": + "integrity" "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "resolved" "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + "version" "0.9.0" + +"object-assign@0.3.1": + "integrity" "sha512-4gWmwoU6o9UImLLzq+8R+kzWT0ABYdKXuvSp08JpYzhibFvdUirMfE9nE5yYHcG1k9ClcVueR4TolZpRvwg5og==" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-0.3.1.tgz" + "version" "0.3.1" + +"object-assign@1.0.0": + "integrity" "sha512-LpUkixU1BUMQ6bwUHbOue4IGGbdRbxi+IEZw7zHniw78erlxrKGHbhfLbHIsI35LGbGqys6QOrjVmLnD2ie+1A==" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-1.0.0.tgz" + "version" "1.0.0" + +"object-assign@2.1.1": + "integrity" "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz" + "version" "2.1.1" + +"object-assign@4.1.1": + "integrity" "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + "resolved" "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + "version" "4.1.1" + +"object-copy@0.1.0": + "integrity" "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==" + "resolved" "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "copy-descriptor" "0.1.1" + "define-property" "0.2.5" + "kind-of" "3.2.2" + +"object-inspect@1.12.3": + "integrity" "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + "resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + "version" "1.12.3" + +"object-visit@1.0.1": + "integrity" "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==" + "resolved" "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "isobject" "3.0.1" + +"object.defaults@1.1.0": + "integrity" "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==" + "resolved" "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "array-each" "1.0.1" + "array-slice" "1.1.0" + "for-own" "1.0.0" + "isobject" "3.0.1" + +"object.map@1.0.1": + "integrity" "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==" + "resolved" "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "for-own" "1.0.0" + "make-iterator" "1.0.1" + +"object.omit@2.0.1": + "integrity" "sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==" + "resolved" "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "for-own" "0.1.5" + "is-extendable" "0.1.1" + +"object.pick@1.3.0": + "integrity" "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==" + "resolved" "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "isobject" "3.0.1" + +"on-finished@2.3.0": + "integrity" "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==" + "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "ee-first" "1.1.1" + +"on-finished@2.4.1": + "integrity" "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==" + "resolved" "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + "version" "2.4.1" + dependencies: + "ee-first" "1.1.1" + +"on-headers@1.0.2": + "integrity" "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + "resolved" "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + "version" "1.0.2" + +"once@1.2.0": + "integrity" "sha512-WBd9yDi3JRrEsysh0s4px+jinLuW/DGRydS+ZGPTHVKu4JrIBmKj3uDC9LfnwEbXHFVLieUuZvunY74wln6arg==" + "resolved" "https://registry.npmjs.org/once/-/once-1.2.0.tgz" + "version" "1.2.0" + +"once@1.3.3": + "integrity" "sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.3.3.tgz" + "version" "1.3.3" + dependencies: + "wrappy" "1.0.2" + +"once@1.4.0": + "integrity" "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==" + "resolved" "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "wrappy" "1.0.2" + +"onetime@^5.1.2": + "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==" + "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "mimic-fn" "^2.1.0" -"@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"onetime@1.1.0": + "integrity" "sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==" + "resolved" "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz" + "version" "1.1.0" -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" +"opn@1.0.2": + "integrity" "sha512-4w6LXX5mR/XGoM8QfFOfixA7aCLTUwNXPPAvUM5pXfc/8oGyQx6IskSzjuRvNZvD6tT6SCsBTlw4VBMUR6dA2w==" + "resolved" "https://registry.npmjs.org/opn/-/opn-1.0.2.tgz" + "version" "1.0.2" -"@babel/plugin-transform-modules-amd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz" - integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" - -"@babel/plugin-transform-modules-commonjs@^7.1.0", "@babel/plugin-transform-modules-commonjs@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz" - integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q== +"opn@4.0.2": + "integrity" "sha512-iPBWbPP4OEOzR1xfhpGLDh+ypKBOygunZhM9jBtA7FS5sKjEiMZw0EFb82hnDOmTZX90ZWLoZKUza4cVt8MexA==" + "resolved" "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz" + "version" "4.0.2" dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" + "object-assign" "4.1.1" + "pinkie-promise" "2.0.1" -"@babel/plugin-transform-modules-systemjs@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz" - integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-identifier" "^7.18.6" - babel-plugin-dynamic-import-node "^2.3.3" +"optimist@0.3.7": + "integrity" "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==" + "resolved" "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz" + "version" "0.3.7" + dependencies: + "wordwrap" "0.0.2" + +"optimist@0.6.1": + "integrity" "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==" + "resolved" "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz" + "version" "0.6.1" + dependencies: + "minimist" "0.0.10" + "wordwrap" "0.0.2" + +"options@0.0.6": + "integrity" "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==" + "resolved" "https://registry.npmjs.org/options/-/options-0.0.6.tgz" + "version" "0.0.6" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"os-homedir@1.0.2": + "integrity" "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==" + "resolved" "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + "version" "1.0.2" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz" - integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw== +"os-name@1.0.3": + "integrity" "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==" + "resolved" "https://registry.npmjs.org/os-name/-/os-name-1.0.3.tgz" + "version" "1.0.3" dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-parameters@^7.18.8": - version "7.18.8" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz" - integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz" - integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - regenerator-transform "^0.15.0" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.18.6": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.19.1.tgz" - integrity sha512-+ILcOU+6mWLlvCwnL920m2Ow3wWx3Wo8n2t5aROQmV55GZt+hOiLvBaa3DNzRjSEHa1aauRs4/YLmkCfFkhhRQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.19.0" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-typescript" "^7.18.6" - -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/preset-env@^7.1.6": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.19.1.tgz" - integrity sha512-c8B2c6D16Lp+Nt6HcD+nHl0VbPKVnNPTpszahuxJJnurfMtKeZ80A+qUv48Y7wqvS+dTFuLuaM9oYxyNHbCLWA== - dependencies: - "@babel/compat-data" "^7.19.1" - "@babel/helper-compilation-targets" "^7.19.1" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.19.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.18.9" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.18.9" - "@babel/plugin-transform-classes" "^7.19.0" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.18.13" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.18.6" - "@babel/plugin-transform-modules-commonjs" "^7.18.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.0" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.18.8" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-flow@^7.0.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.18.6.tgz" - integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-flow-strip-types" "^7.18.6" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-typescript@^7.1.0": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" - -"@babel/register@^7.0.0": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/register/-/register-7.18.9.tgz" - integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== - dependencies: - clone-deep "^4.0.1" - find-cache-dir "^2.0.0" - make-dir "^2.1.0" - pirates "^4.0.5" - source-map-support "^0.5.16" - -"@babel/runtime@^7.8.4": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz" - integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== - dependencies: - regenerator-runtime "^0.13.4" - -"@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.1.tgz" - integrity sha512-0j/ZfZMxKukDaag2PtOPDbwuELqIar6lLskVPPJDjXMXjfLb1Obo/1yjxIGqqAJrmfaTIY3z2wFLAQ7qSkLsuA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.19.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.19.1" - "@babel/types" "^7.19.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.4.4": - version "7.19.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.19.0.tgz" - integrity sha512-YuGopBq3ke25BVSiS6fgF49Ul9gH1x70Bcr6bqRLjWCkcX8Hre1/5+z+IiWOIerRMSSEfGZVB9z9kyq7wVs9YA== - dependencies: - "@babel/helper-string-parser" "^7.18.10" - "@babel/helper-validator-identifier" "^7.18.6" - to-fast-properties "^2.0.0" - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@csstools/selector-specificity@^2.0.2": - version "2.0.2" - resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz" - integrity sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg== - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@eslint/eslintrc@^1.3.2": - version "1.3.2" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.3.2.tgz#58b69582f3b7271d8fa67fe5251767a5b38ea356" - integrity sha512-AXYd23w1S/bv3fTs3Lz0vjiYemS08jWkI3hYyS9I1ry+0f+Yjs1wm+sU0BS8qDOPrBIkp4qHYC16I8uVtpLajQ== - dependencies: - ajv "^6.12.4" - debug "^4.3.2" - espree "^9.4.0" - globals "^13.15.0" - ignore "^5.2.0" - import-fresh "^3.2.1" - js-yaml "^4.1.0" - minimatch "^3.1.2" - strip-json-comments "^3.1.1" - -"@fortawesome/fontawesome-free@^6.1.0": - version "6.2.0" - resolved "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.2.0.tgz" - integrity sha512-CNR7qRIfCwWHNN7FnKUniva94edPdyQzil/zCwk3v6k4R6rR2Fr8i4s3PM7n/lyfPA6Zfko9z5WDzFxG9SW1uQ== - -"@humanwhocodes/config-array@^0.10.5": - version "0.10.7" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" - integrity sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w== - dependencies: - "@humanwhocodes/object-schema" "^1.2.1" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/gitignore-to-minimatch@^1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz#316b0a63b91c10e53f242efb4ace5c3b34e8728d" - integrity sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA== - -"@humanwhocodes/module-importer@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" - integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== - -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== - -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.15" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz" - integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@openmbee/angularjs-dropdown-multiselect@./lib/openmbee-angularjs-dropdown-multiselect-v1.0.2.tgz": - version "1.0.2" - resolved "./lib/openmbee-angularjs-dropdown-multiselect-v1.0.2.tgz#d219ab5df1b76b2c1690b20df09119f7746973e3" - dependencies: - angular "1.8.3" - jquery "^3.6.0" - lodash "^4.17.21" - -"@openmbee/html-to-vdom@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@openmbee/html-to-vdom/-/html-to-vdom-0.9.0.tgz#0da7385a3b933934fed6aaf5272d1c771d2a458f" - integrity sha512-VuoHeQ4ypFubyAIlTWbuEhoAc1rXSsQgCZo0pRI/JgZp1z05eN15/+YMu8iRCPA6h2hVNjb4MajrRUTlUXm+3A== - dependencies: - ent "2.2.0" - htmlparser2 "^6.1.0" - -"@openmbee/pane-layout@^1.0.40": - version "1.0.41" - resolved "https://registry.npmjs.org/@openmbee/pane-layout/-/pane-layout-1.0.41.tgz" - integrity sha512-nI0i8cX0cBeKyiRZnwUQJUb1Tgd8Zm/uKNBMnLYaSKtqMaK8XHKiBk0BuDLuKEv97xrHct7grguygNL6al5BJQ== - dependencies: - "@uirouter/angularjs" "^1.0.30" - angular "^1.8.2" - jquery "^3.6.0" - rx-lite "^4.0.8" - -"@pkgr/utils@^2.3.1": - version "2.3.1" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.3.1.tgz#0a9b06ffddee364d6642b3cd562ca76f55b34a03" - integrity sha512-wfzX8kc1PMyUILA+1Z/EqoE4UCXGy0iRGMhPwdfae1+f0OXlLqCk+By+aMzgJBzR9AzS4CDizioG6Ss1gvAFJw== - dependencies: - cross-spawn "^7.0.3" - is-glob "^4.0.3" - open "^8.4.0" - picocolors "^1.0.0" - tiny-glob "^0.2.9" - tslib "^2.4.0" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== - -"@types/angular-cookies@^1.8.1": - version "1.8.1" - resolved "https://registry.npmjs.org/@types/angular-cookies/-/angular-cookies-1.8.1.tgz" - integrity sha512-wcc/YtJTSRQNFrbXMj9nW8jLKWAkY1j0NkVKtbKBqhrP4Oz0tT0/Gug/Gjks87nXERfT/+fBnLWQB+RFiceKJQ== - dependencies: - "@types/angular" "*" - -"@types/angular-growl-v2@^0.7.2": - version "0.7.2" - resolved "https://registry.npmjs.org/@types/angular-growl-v2/-/angular-growl-v2-0.7.2.tgz" - integrity sha512-1kk5Ib+XeyL7S8HtoWEzlHRc7ArfiBy6OC/HlwoMaOcTcbzSOYbitXb6FXrYmg0MOZ7sytMDtMbgqu1ch4ovlQ== - dependencies: - "@types/angular" "*" - -"@types/angular-hotkeys@^1.7.3": - version "1.7.3" - resolved "https://registry.npmjs.org/@types/angular-hotkeys/-/angular-hotkeys-1.7.3.tgz" - integrity sha512-wB7nhrOzacczovUiB6W2vGBxoI4wIHKB3pYvBq4HkgsNaSEmNywJ3YPfGEFgZaBpR+3O79d2nwh6XFo8R3cVng== - dependencies: - "@types/angular" "*" - -"@types/angular-sanitize@^1.8.1": - version "1.8.1" - resolved "https://registry.npmjs.org/@types/angular-sanitize/-/angular-sanitize-1.8.1.tgz" - integrity sha512-tQ6kyi7Q5iWv5k3yFmpqzTaBe1ZiCF5+rlGgmyLO/4ltu2ELXMPDnq38KACwNnHVWuLJJXXn2V+TfMFwUvF5qw== - dependencies: - "@types/angular" "*" - -"@types/angular-ui-bootstrap@^1.0.1": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/angular-ui-bootstrap/-/angular-ui-bootstrap-1.0.1.tgz" - integrity sha512-hxr+LpMs8wPVt4wjaZat2qd+XmSf5HlwfG3wQSXebbKX4Eh16eU0pIDKc9tvqv9dHKMrqk/u+HKq7XktoiH33w== - dependencies: - "@types/angular" "*" - -"@types/angular-ui-router@^1.1.41": - version "1.1.41" - resolved "https://registry.npmjs.org/@types/angular-ui-router/-/angular-ui-router-1.1.41.tgz" - integrity sha512-fVDy2lE/AWDmVgD26mmB86MeFq8tFYodrLpf5c4VFsKTkTtUteTTsjdLQsQpFHBhY5v9JbIdvLaueYiXX6MkAQ== - dependencies: - "@types/angular" "*" - -"@types/angular@*", "@types/angular@^1.8.4": - version "1.8.4" - resolved "https://registry.npmjs.org/@types/angular/-/angular-1.8.4.tgz" - integrity sha512-wPS/ncJWhyxJsndsW1B6Ta8D4mi97x1yItSu+rkLDytU3oRIh2CFAjMuJceYwFAh9+DIohndWM0QBA9OU2Hv0g== - -"@types/ckeditor4@^4.20.0": - version "4.20.0" - resolved "https://registry.yarnpkg.com/@types/ckeditor4/-/ckeditor4-4.20.0.tgz#b6ff5630266e5bc6c0e832941ac08718115d05fa" - integrity sha512-qpLHaH3TLNKJz4hr8dYCqhHo1HZRh6BgfUC8uFQ/VrhR0d+c32YYn9+ZvZvIFZ8V6COX1a66n6k3d8WWjBje4g== - -"@types/diff@^3.5.0": - version "3.5.5" - resolved "https://registry.npmjs.org/@types/diff/-/diff-3.5.5.tgz" - integrity sha512-aqcrAbqT/0+ULJJ73bwKWsiFkBh3ZnAelj9u+iI5/cr4Nz3yXGf3w4glx5am6uvvgBbKinK1PAqSJs7fSKD6ig== - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.4.6" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.6.tgz" - integrity sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "1.0.0" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz" - integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== - -"@types/estree@^0.0.51": - version "0.0.51" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz" - integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/jquery@3.5.5": - version "3.5.5" - resolved "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz" - integrity sha512-6RXU9Xzpc6vxNrS6FPPapN1SxSHgQ336WC6Jj/N8q30OiaBZ00l1GBgeP7usjVZPivSkGUfL1z/WW6TX989M+w== - dependencies: - "@types/sizzle" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-3.0.2.tgz" - integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== - -"@types/lodash@^4.14.181": - version "4.14.185" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.185.tgz" - integrity sha512-evMDG1bC4rgQg4ku9tKpuMh5iBNEwNa3tf9zRHdP1qlv+1WUg44xat4IxCE14gIpZRGUUWAx2VhItCZc25NfMA== - -"@types/markdown-it@^12.2.3": - version "12.2.3" - resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-12.2.3.tgz" - integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== - dependencies: - "@types/linkify-it" "*" - "@types/mdurl" "*" - -"@types/mdurl@*": - version "1.0.2" - resolved "https://registry.npmjs.org/@types/mdurl/-/mdurl-1.0.2.tgz" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== - -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - -"@types/ngstorage@^0.3.37": - version "0.3.37" - resolved "https://registry.npmjs.org/@types/ngstorage/-/ngstorage-0.3.37.tgz" - integrity sha512-na3ERiccrrm1kOVRabD0SV1UOZf+4btDXFR9rSAMZNXj4pJpA50P57E6f5napcAbPMKgNKbypQhneiLeR+n8og== - -"@types/node@*", "@types/node@^18.7.11": - version "18.7.18" - resolved "https://registry.npmjs.org/@types/node/-/node-18.7.18.tgz" - integrity sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg== - -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/rx-core-binding@*": - version "4.0.4" - resolved "https://registry.npmjs.org/@types/rx-core-binding/-/rx-core-binding-4.0.4.tgz" - integrity sha512-5pkfxnC4w810LqBPUwP5bg7SFR/USwhMSaAeZQQbEHeBp57pjKXRlXmqpMrLJB4y1oglR/c2502853uN0I+DAQ== - dependencies: - "@types/rx-core" "*" - -"@types/rx-core@*": - version "4.0.3" - resolved "https://registry.npmjs.org/@types/rx-core/-/rx-core-4.0.3.tgz" - integrity sha512-XqPap57hhipi8whgvYSFOEj7mUz2BpITUsS/vkWeyhEZ06XoEw2qSQSvgRgolxXn8hvpKj+YZDIvobJG5JFAxw== - -"@types/rx-lite@^4.0.6": - version "4.0.6" - resolved "https://registry.npmjs.org/@types/rx-lite/-/rx-lite-4.0.6.tgz" - integrity sha512-oYiDrFIcor9zDm0VDUca1UbROiMYBxMLMaM6qzz4ADAfOmA9r1dYEcAFH+2fsPI5BCCjPvV9pWC3X3flbrvs7w== - dependencies: - "@types/rx-core" "*" - "@types/rx-core-binding" "*" - -"@types/sizzle@*": - version "2.3.3" - resolved "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz" - integrity sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ== - -"@types/stompjs@2.3.2": - version "2.3.2" - resolved "https://registry.npmjs.org/@types/stompjs/-/stompjs-2.3.2.tgz" - integrity sha512-fRuGnnuHyFeeuFnuouk8pT9XSVdFxr8gBNCZz6p9rEmthoxRVf3Z0Wae78KCvlRDabD9POz3Hatkb8cSXQC7yg== - dependencies: - "@types/node" "*" - -"@types/uuid@^8.3.4": - version "8.3.4" - resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" - integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== - -"@types/virtual-dom@^2.1.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@types/virtual-dom/-/virtual-dom-2.1.1.tgz#c895327d55d7f340b11bbcd84c626c8d9d1f37af" - integrity sha512-BPy2A3WXWL9RMoQQ0UQueKX93N/NL9KmlyNiSklj+Sbn91unDLcIUS00diWzV32N9CD7rRUrXE9VIzqMAZ3Wcg== - -"@types/webpack@^5.28.0": - version "5.28.0" - resolved "https://registry.npmjs.org/@types/webpack/-/webpack-5.28.0.tgz" - integrity sha512-8cP0CzcxUiFuA9xGJkfeVpqmWTk9nx6CWwamRGCj95ph1SmlRRk9KlCZ6avhCbZd4L68LvYT6l1kpdEnQXrF8w== - dependencies: - "@types/node" "*" - tapable "^2.2.0" - webpack "^5" - -"@typescript-eslint/eslint-plugin@^5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.39.0.tgz#778b2d9e7f293502c7feeea6c74dca8eb3e67511" - integrity sha512-xVfKOkBm5iWMNGKQ2fwX5GVgBuHmZBO1tCRwXmY5oAIsPscfwm2UADDuNB8ZVYCtpQvJK4xpjrK7jEhcJ0zY9A== - dependencies: - "@typescript-eslint/scope-manager" "5.39.0" - "@typescript-eslint/type-utils" "5.39.0" - "@typescript-eslint/utils" "5.39.0" - debug "^4.3.4" - ignore "^5.2.0" - regexpp "^3.2.0" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/parser@^5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.39.0.tgz#93fa0bc980a3a501e081824f6097f7ca30aaa22b" - integrity sha512-PhxLjrZnHShe431sBAGHaNe6BDdxAASDySgsBCGxcBecVCi8NQWxQZMcizNA4g0pN51bBAn/FUfkWG3SDVcGlA== - dependencies: - "@typescript-eslint/scope-manager" "5.39.0" - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/typescript-estree" "5.39.0" - debug "^4.3.4" - -"@typescript-eslint/scope-manager@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.39.0.tgz#873e1465afa3d6c78d8ed2da68aed266a08008d0" - integrity sha512-/I13vAqmG3dyqMVSZPjsbuNQlYS082Y7OMkwhCfLXYsmlI0ca4nkL7wJ/4gjX70LD4P8Hnw1JywUVVAwepURBw== - dependencies: - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/visitor-keys" "5.39.0" - -"@typescript-eslint/type-utils@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.39.0.tgz#0a8c00f95dce4335832ad2dc6bc431c14e32a0a6" - integrity sha512-KJHJkOothljQWzR3t/GunL0TPKY+fGJtnpl+pX+sJ0YiKTz3q2Zr87SGTmFqsCMFrLt5E0+o+S6eQY0FAXj9uA== - dependencies: - "@typescript-eslint/typescript-estree" "5.39.0" - "@typescript-eslint/utils" "5.39.0" - debug "^4.3.4" - tsutils "^3.21.0" - -"@typescript-eslint/types@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.39.0.tgz#f4e9f207ebb4579fd854b25c0bf64433bb5ed78d" - integrity sha512-gQMZrnfEBFXK38hYqt8Lkwt8f4U6yq+2H5VDSgP/qiTzC8Nw8JO3OuSUOQ2qW37S/dlwdkHDntkZM6SQhKyPhw== - -"@typescript-eslint/typescript-estree@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.39.0.tgz#c0316aa04a1a1f4f7f9498e3c13ef1d3dc4cf88b" - integrity sha512-qLFQP0f398sdnogJoLtd43pUgB18Q50QSA+BTE5h3sUxySzbWDpTSdgt4UyxNSozY/oDK2ta6HVAzvGgq8JYnA== - dependencies: - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/visitor-keys" "5.39.0" - debug "^4.3.4" - globby "^11.1.0" - is-glob "^4.0.3" - semver "^7.3.7" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.39.0.tgz#b7063cca1dcf08d1d21b0d91db491161ad0be110" - integrity sha512-+DnY5jkpOpgj+EBtYPyHRjXampJfC0yUZZzfzLuUWVZvCuKqSdJVC8UhdWipIw7VKNTfwfAPiOWzYkAwuIhiAg== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.39.0" - "@typescript-eslint/types" "5.39.0" - "@typescript-eslint/typescript-estree" "5.39.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@5.39.0": - version "5.39.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.39.0.tgz#8f41f7d241b47257b081ddba5d3ce80deaae61e2" - integrity sha512-yyE3RPwOG+XJBLrhvsxAidUgybJVQ/hG8BhiJo0k8JSAYfk/CshVcxf0HwP4Jt7WZZ6vLmxdo1p6EyN3tzFTkg== - dependencies: - "@typescript-eslint/types" "5.39.0" - eslint-visitor-keys "^3.3.0" - -"@uirouter/angularjs@^1.0.30": - version "1.0.30" - resolved "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-1.0.30.tgz" - integrity sha512-qkc3RFZc91S5K0gc/QVAXc9LGDPXjR04vDgG/11j8+yyZEuQojXxKxdLhKIepiPzqLmGRVqzBmBc27gtqaEeZg== - dependencies: - "@uirouter/core" "6.0.8" - -"@uirouter/core@6.0.8": - version "6.0.8" - resolved "https://registry.npmjs.org/@uirouter/core/-/core-6.0.8.tgz" - integrity sha512-Gc/BAW47i4L54p8dqYCJJZuv2s3tqlXQ0fvl6Zp2xrblELPVfxmjnc0eurx3XwfQdaqm3T6uls6tQKkof/4QMw== - -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== - -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== - -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== - -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== - -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== - -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" - -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" - integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== - -"@webpack-cli/info@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz" - integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== - dependencies: - envinfo "^7.7.3" - -"@webpack-cli/serve@^1.7.0": - version "1.7.0" - resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz" - integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@zeit/schemas@2.6.0": - version "2.6.0" - resolved "https://registry.yarnpkg.com/@zeit/schemas/-/schemas-2.6.0.tgz#004e8e553b4cd53d538bd38eac7bcbf58a867fe3" - integrity sha512-uUrgZ8AxS+Lio0fZKAipJjAh415JyrOZowliZAzmnJSsf7piVL5w+G0+gFJ0KSu3QRhvui/7zuvpLz03YjXAhg== - -accepts@~1.3.5: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-jsx@^5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" - integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== - -acorn-walk@^8.1.1: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.0: - version "8.8.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -adjust-sourcemap-loader@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" - integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== - dependencies: - loader-utils "^2.0.0" - regex-parser "^2.2.11" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@6.5.3: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: - version "8.11.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz" - integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -alias-hq@^5.4.0: - version "5.4.0" - resolved "https://registry.npmjs.org/alias-hq/-/alias-hq-5.4.0.tgz" - integrity sha512-AEMlBK//mAF0zIIHf0tWuCnSPqEz97rGQR/2crkoPzo+N42A5njofn/rQ0IHzaPvkvrZDL0gD/FZQwu9Scjmyg== - dependencies: - colors "^1.4.0" - glob "^7.1.6" - inquirer "^7.3.3" - jscodeshift "^0.10.0" - module-alias "^2.2.2" - node-fetch "^2.6.0" - open "^7.0.0" - typescript "^4.5.2" - vue-jscodeshift-adapter "^2.1.0" - -angular-animate@^1.8.2: - version "1.8.3" - resolved "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.3.tgz" - integrity sha512-/LtTKvy5sD6MZbV0v+nHgOIpnFF0mrUp+j5WIxVprVhcrJriYpuCZf4S7Owj1o76De/J0eRzANUozNJ6hVepnQ== - -angular-cookies@^1.8.2: - version "1.8.3" - resolved "https://registry.npmjs.org/angular-cookies/-/angular-cookies-1.8.3.tgz" - integrity sha512-uRd+zWgqiVnly7+YFRosM8E9tUQeY82dAZdtvonh/CeD/sf5SKN/BNIlMlHxZtoAk72ahTIjqUQGfeHdYcSsRQ== - -angular-growl-v2@^0.7.5: - version "0.7.5" - resolved "https://registry.npmjs.org/angular-growl-v2/-/angular-growl-v2-0.7.5.tgz" - integrity sha512-kGAW0lG0bZ9vlbiUV7lkOB7r/4PGTIHEAdKW5BHH1eiQd/sqNkOtkMzSrIOMibmrD1tJ4WEyOBLQO9WZnSipbA== - -angular-hotkeys@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/angular-hotkeys/-/angular-hotkeys-1.7.0.tgz" - integrity sha512-yw4BYutP4fVbnG8Yssuyo2DqAch+wGhSpdX7C1PURjHQzbyXPq/hNM1QupxHor0nwYcHy+57Tb1tzgngTrd+SA== - -angular-sanitize@^1.8.2: - version "1.8.3" - resolved "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.3.tgz" - integrity sha512-2rxdqzlUVafUeWOwvY/FtyWk1pFTyCtzreeiTytG9m4smpuAEKaIJAjYeVwWsoV+nlTOcgpwV4W1OCmR+BQbUg== - -angular-ui-bootstrap@^2.5.6: - version "2.5.6" - resolved "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-2.5.6.tgz" - integrity sha512-yzcHpPMLQl0232nDzm5P4iAFTFQ9dMw0QgFLuKYbDj9M0xJ62z0oudYD/Lvh1pWfRsukiytP4Xj6BHOSrSXP8A== - -angular-ui-tree@^2.22.6: - version "2.22.6" - resolved "https://registry.npmjs.org/angular-ui-tree/-/angular-ui-tree-2.22.6.tgz" - integrity sha512-VzuXM6NdYeQD0Y1RF5oTYc3o8yoW9mtxhnJs5Fvwu40V1Alzq7ybJj+kvApXZ69M0mvRd8LLM+3Q4pI26md+fA== - -angular@1.8.3, angular@^1.8.2: - version "1.8.3" - resolved "https://registry.yarnpkg.com/angular/-/angular-1.8.3.tgz#851ad75d5163c105a7e329555ef70c90aa706894" - integrity sha512-5qjkWIQQVsHj4Sb5TcEs4WZWpFeVFHXwxEBHUhrny41D8UrBAd6T/6nPPAsLngJCReIOqi95W3mxdveveutpZw== - -angulartics-piwik@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/angulartics-piwik/-/angulartics-piwik-1.0.6.tgz" - integrity sha512-FuIPY5XYK/nHtu6EGXBMc1wXyiACrY2KkuyVWY66WeBJDcI/db3h1Ow62lQkjl/ICaDKtcTKO8jCLPeNsNV8TA== - dependencies: - angulartics "*" - -angulartics@*, angulartics@^1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/angulartics/-/angulartics-1.6.0.tgz" - integrity sha512-fywhCi1InawcX+rpLv9NQ32Ed87KoZeH20SUIsRUz9dYJSxuk4/uxiKiopITveGxTC8THYHFEATj9Y/X+BvMqA== - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz" - integrity sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA== - dependencies: - string-width "^2.0.0" - -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" - integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arch@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11" - integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ== - -arg@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" - integrity sha512-XxNTUzKnz1ctK3ZIcI2XUPlD96wbHP2nGqkPKpvk/HNRlPveYrXIVSTk9m3LcqOgDPg3B1nMvdV/K8wZd7PG4w== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" - integrity sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA== - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" - integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== - -array-includes@^3.1.4: - version "3.1.5" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" - integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - get-intrinsic "^1.1.1" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" - integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== - -array.prototype.flat@^1.2.5: - version "1.3.0" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" - integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.2" - es-shim-unscopables "^1.0.0" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz" - integrity sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw== - -ast-types@0.13.3: - version "0.13.3" - resolved "https://registry.npmjs.org/ast-types/-/ast-types-0.13.3.tgz" - integrity sha512-XTZ7xGML849LkQP86sWdQzfhwbt3YwIO6MqbX9mUNYY98VKaaVZP7YNNm70IpwecbkkxmfC5IYAzOQ/2p29zRA== - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -author-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/author-regex/-/author-regex-1.0.0.tgz" - integrity sha512-KbWgR8wOYRAPekEmMXrYYdc7BRyhn2Ftk7KWfMUnQ43hFdojWEFRxhhRUm3/OFEdPa1r0KAvTTg9YQK57xTe0g== - -babel-core@^7.0.0-bridge.0: - version "7.0.0-bridge.0" - resolved "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz" - integrity sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg== - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -balanced-match@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz" - integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@^3.7.2: - version "3.7.2" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw== - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-split@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/browser-split/-/browser-split-0.0.1.tgz" - integrity sha512-JhvgRb2ihQhsljNda3BI8/UcRHVzrVwo3Q+P8vDtSiyobXuFpuZ9mq+MbRGMnC22CjW3RrfXdg6j6ITX8M+7Ow== - -browserslist@^4.14.5, browserslist@^4.21.3: - version "4.21.4" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== - dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" - integrity sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw== - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelize@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz" - integrity sha512-W2lPwkBkMZwFlPCXhIlYgxu+7gC/NUlCtdK652DAJ1JdgV0sTrvuPFshNPrFa1TY2JOkLhgdeEBplB4ezEa+xg== - -caniuse-lite@^1.0.30001400: - version "1.0.30001400" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001400.tgz" - integrity sha512-Mv659Hn65Z4LgZdJ7ge5JTVbE3rqbJaaXgW5LEI9/tOaXclfIZ8DW7D7FCWWWmWiiPS7AC48S8kf3DApSxQdgA== - -catharsis@^0.9.0: - version "0.9.0" - resolved "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz" - integrity sha512-prMTQVpcns/tzFgFVkVp6ak6RykZyWb3gu8ckUpd6YkTlacOd3DXGJjIpD4Q6zJirizvaiAjSSHlOsA+6sNh2A== - dependencies: - lodash "^4.17.15" - -chalk@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^2.0.0, chalk@^2.0.1: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -"chokidar@>=3.0.0 <4.0.0": - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" + "osx-release" "1.1.0" + "win-release" "1.1.1" + +"os-tmpdir@1.0.2": + "integrity" "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==" + "resolved" "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + "version" "1.0.2" + +"osenv@0.0.3": + "integrity" "sha512-VBk1bfdaO4gh3OWO8LBuDY2alp0buL8YzQ6t13xyc8PQPrnUg5AgQvINQx3UkS4dom8UGCL597q4Y2+M4TPvmw==" + "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.0.3.tgz" + "version" "0.0.3" + +"osenv@0.1.0": + "integrity" "sha512-PenJexmyQ/42JhvtcLRdVaWobP+JccHIclnQeTL2t66j6aAB79iVdOzwC1DtRDuv49e/QjFq7CMC5YYPVw1rcg==" + "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.1.0.tgz" + "version" "0.1.0" + +"osenv@0.1.5": + "integrity" "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==" + "resolved" "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" + "version" "0.1.5" + dependencies: + "os-homedir" "1.0.2" + "os-tmpdir" "1.0.2" + +"osx-release@1.1.0": + "integrity" "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==" + "resolved" "https://registry.npmjs.org/osx-release/-/osx-release-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "minimist" "1.2.8" + +"p-limit@2.3.0": + "integrity" "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==" + "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + "version" "2.3.0" + dependencies: + "p-try" "2.2.0" + +"p-locate@3.0.0": + "integrity" "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==" + "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + "version" "3.0.0" + dependencies: + "p-limit" "2.3.0" + +"p-throttler@0.1.0": + "integrity" "sha512-qjBriqtlwhS2o/Yq4rU7ZQ4+Yy9Vy9d7qss15rof2viXAwwXcxjPq8jLXVJosXygOs3WZtKnLEzRw0FyX/l9PQ==" + "resolved" "https://registry.npmjs.org/p-throttler/-/p-throttler-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "q" "0.9.7" + +"p-try@2.2.0": + "integrity" "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "resolved" "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + "version" "2.2.0" + +"package-json@0.2.0": + "integrity" "sha512-JbTs9F2CwqCEEhNZXsvgQtQpNmzgKlCk4adhYxGObzcc70rU0nzy2FPqgTdP2To5wZKbCv0IJp+zTMYLEn9eMA==" + "resolved" "https://registry.npmjs.org/package-json/-/package-json-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "got" "0.3.0" + "registry-url" "0.1.1" + +"pad-stream@1.2.0": + "integrity" "sha512-2SSTZIZSdYL+kV4LMKocpynfDGRsW7a9WmdmGYZm6kHhNduSortn3DGCSAEZ3J3XkWu9ZrKWXAdSrUqFmY9WgQ==" + "resolved" "https://registry.npmjs.org/pad-stream/-/pad-stream-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "meow" "3.7.0" + "pumpify" "1.5.1" + "repeating" "2.0.1" + "split2" "1.1.1" + "through2" "2.0.5" + +"pako@1.0.11": + "integrity" "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "resolved" "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz" + "version" "1.0.11" + +"param-case@2.1.1": + "integrity" "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==" + "resolved" "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "no-case" "2.3.2" + +"parse-filepath@1.0.2": + "integrity" "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==" + "resolved" "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "is-absolute" "1.0.0" + "map-cache" "0.2.2" + "path-root" "0.1.1" + +"parse-glob@3.0.4": + "integrity" "sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==" + "resolved" "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "glob-base" "0.3.0" + "is-dotfile" "1.0.3" + "is-extglob" "1.0.0" + "is-glob" "2.0.1" + +"parse-json@2.2.0": + "integrity" "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==" + "resolved" "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + "version" "2.2.0" + dependencies: + "error-ex" "1.3.2" + +"parse-ms@1.0.1": + "integrity" "sha512-LpH1Cf5EYuVjkBvCDBYvkUPh+iv2bk3FHflxHkpCYT0/FZ1d3N3uJaLiHr4yGuMcFUhv6eAivitTvWZI4B/chg==" + "resolved" "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz" + "version" "1.0.1" + +"parse-passwd@1.0.0": + "integrity" "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==" + "resolved" "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + "version" "1.0.0" + +"parseurl@1.3.3": + "integrity" "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "resolved" "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + "version" "1.3.3" + +"pascal-case@2.0.1": + "integrity" "sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==" + "resolved" "https://registry.npmjs.org/pascal-case/-/pascal-case-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "camel-case" "3.0.0" + "upper-case-first" "1.1.2" + +"pascalcase@0.1.1": + "integrity" "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==" + "resolved" "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + "version" "0.1.1" + +"path-case@2.1.1": + "integrity" "sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==" + "resolved" "https://registry.npmjs.org/path-case/-/path-case-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "no-case" "2.3.2" + +"path-exists@1.0.0": + "integrity" "sha512-BD2vrQBPFI3VkVKzTrOmaG2WtPQoduNXu1A5tLYMOW8RN6G9CdhdSkmw+ljxUkJcj4pbXQGw0lzl7MFLnhba9Q==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-1.0.0.tgz" + "version" "1.0.0" + +"path-exists@2.1.0": + "integrity" "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "pinkie-promise" "2.0.1" + +"path-exists@3.0.0": + "integrity" "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" + "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + "version" "3.0.0" + +"path-is-absolute@1.0.1": + "integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + "resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + "version" "1.0.1" + +"path-is-inside@1.0.2": + "integrity" "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" + "resolved" "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" + "version" "1.0.2" + +"path-key@^3.0.0", "path-key@^3.1.0": + "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + "version" "3.1.1" + +"path-key@2.0.1": + "integrity" "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" + "resolved" "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + "version" "2.0.1" + +"path-parse@1.0.7": + "integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + "version" "1.0.7" + +"path-root-regex@0.1.2": + "integrity" "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==" + "resolved" "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz" + "version" "0.1.2" + +"path-root@0.1.1": + "integrity" "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==" + "resolved" "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz" + "version" "0.1.1" + dependencies: + "path-root-regex" "0.1.2" + +"path-to-regexp@2.2.1": + "integrity" "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "resolved" "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" + "version" "2.2.1" + +"path-type@1.1.0": + "integrity" "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==" + "resolved" "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "graceful-fs" "4.2.11" + "pify" "2.3.0" + "pinkie-promise" "2.0.1" + +"pend@1.2.0": + "integrity" "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + "resolved" "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + "version" "1.2.0" + +"performance-now@2.1.0": + "integrity" "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + "resolved" "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + "version" "2.1.0" + +"phantomjs-prebuilt@^2.1.16", "phantomjs-prebuilt@2.1.16": + "integrity" "sha512-PIiRzBhW85xco2fuj41FmsyuYHKjKuXWmhjy3A/Y+CMpN/63TV+s9uzfVhsUwFe0G77xWtHBG8xmXf5BqEUEuQ==" + "resolved" "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz" + "version" "2.1.16" + dependencies: + "es6-promise" "4.2.8" + "extract-zip" "1.7.0" + "fs-extra" "1.0.0" + "hasha" "2.2.0" + "kew" "0.7.0" + "progress" "1.1.8" + "request" "2.88.2" + "request-progress" "2.0.1" + "which" "1.3.1" + +"picomatch@2.3.1": + "integrity" "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + "resolved" "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + "version" "2.3.1" + +"pify@2.3.0": + "integrity" "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + "resolved" "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + "version" "2.3.0" + +"pify@4.0.1": + "integrity" "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "resolved" "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + "version" "4.0.1" + +"pinkie-promise@2.0.1": + "integrity" "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==" + "resolved" "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "pinkie" "2.0.4" + +"pinkie@2.0.4": + "integrity" "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==" + "resolved" "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + "version" "2.0.4" + +"plur@1.0.0": + "integrity" "sha512-qSnKBSZeDY8ApxwhfVIwKwF36KVJqb1/9nzYYq3j3vdwocULCXT8f8fQGkiw1Nk9BGfxiDagEe/pwakA+bOBqw==" + "resolved" "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz" + "version" "1.0.0" + +"portscanner@1.2.0": + "integrity" "sha512-3MCx40XO6ChNJJHw1tTFukQK/M/8FacGZK/vGbnrKpozObrJzembYtfi7ZdA2hkF2Lojg77XhsKUPvF8eHKcDA==" + "resolved" "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "async" "1.5.2" + +"posix-character-classes@0.1.1": + "integrity" "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==" + "resolved" "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + "version" "0.1.1" + +"preserve@0.2.0": + "integrity" "sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==" + "resolved" "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" + "version" "0.2.0" + +"pretty-bytes@3.0.1": + "integrity" "sha512-eb7ZAeUTgfh294cElcu51w+OTRp/6ItW758LjwJSK72LDevcuJn0P4eD71PLMDGPwwatXmAmYHTkzvpKlJE3ow==" + "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "number-is-nan" "1.0.1" + +"pretty-bytes@5.6.0": + "integrity" "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==" + "resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + "version" "5.6.0" + +"pretty-ms@2.1.0": + "integrity" "sha512-H2enpsxzDhuzRl3zeSQpQMirn8dB0Z/gxW96j06tMfTviUWvX14gjKb7qd1gtkUyYhDPuoNe00K5PqNvy2oQNg==" + "resolved" "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "is-finite" "1.1.0" + "parse-ms" "1.0.1" + "plur" "1.0.0" + +"process-nextick-args@2.0.1": + "integrity" "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + "resolved" "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + "version" "2.0.1" + +"progress@1.1.8": + "integrity" "sha512-UdA8mJ4weIkUBO224tIarHzuHs4HuYiJvsuGT7j/SPQiUJVjYvNDBIPa0hAorduOfjGohB/qHWRa/lrrWX/mXw==" + "resolved" "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz" + "version" "1.1.8" + +"promise@7.3.1": + "integrity" "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==" + "resolved" "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" + "version" "7.3.1" + dependencies: + "asap" "2.0.6" + +"promptly@0.2.0": + "integrity" "sha512-HG+4CGfxDIcto6WSwa8CNSMxgRYrjOgGbh0JSr3F4yy5aK95qJANaTnRq+U1g/J2h6IIgLD+qRPzDR4AnUh/1g==" + "resolved" "https://registry.npmjs.org/promptly/-/promptly-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "read" "1.0.7" + +"propprop@0.3.1": + "integrity" "sha512-EbFINeqVaaw4MKPC9978G5aZhP0Jv49kAQHGlIBd6SKEPBBuf+l4W/zCiL6SCVuxxrOkSdZSB70YXW1xKCSD4Q==" + "resolved" "https://registry.npmjs.org/propprop/-/propprop-0.3.1.tgz" + "version" "0.3.1" + +"proto-list@1.2.4": + "integrity" "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" + "resolved" "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz" + "version" "1.2.4" + +"protractor@~5.2.0", "protractor@5.2.2": + "integrity" "sha512-KxYw0ySvmWFQHpbSRvrHA5HLlyeAkCENSUZvJroKV1u0gWXX9kvHjc9wEK5IoW7h9UfPV1F3R2i+Own0go5s0g==" + "resolved" "https://registry.npmjs.org/protractor/-/protractor-5.2.2.tgz" + "version" "5.2.2" + dependencies: + "@types/node" "6.14.13" + "@types/q" "0.0.32" + "@types/selenium-webdriver" "2.53.50" + "blocking-proxy" "1.0.1" + "chalk" "1.1.3" + "glob" "7.1.7" + "jasmine" "2.99.0" + "jasminewd2" "2.2.0" + "optimist" "0.6.1" + "q" "1.4.1" + "saucelabs" "1.3.0" + "selenium-webdriver" "3.6.0" + "source-map-support" "0.4.18" + "webdriver-js-extender" "1.0.0" + "webdriver-manager" "12.1.9" + +"pseudomap@1.0.2": + "integrity" "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==" + "resolved" "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + "version" "1.0.2" + +"psl@1.9.0": + "integrity" "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + "resolved" "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + "version" "1.9.0" + +"pug-attrs@2.0.4": + "integrity" "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==" + "resolved" "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "constantinople" "3.1.2" + "js-stringify" "1.0.2" + "pug-runtime" "2.0.5" + +"pug-code-gen@2.0.3": + "integrity" "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==" + "resolved" "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.3.tgz" + "version" "2.0.3" + dependencies: + "constantinople" "3.1.2" + "doctypes" "1.1.0" + "js-stringify" "1.0.2" + "pug-attrs" "2.0.4" + "pug-error" "1.3.3" + "pug-runtime" "2.0.5" + "void-elements" "2.0.1" + "with" "5.1.1" + +"pug-error@1.3.3": + "integrity" "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" + "resolved" "https://registry.npmjs.org/pug-error/-/pug-error-1.3.3.tgz" + "version" "1.3.3" + +"pug-filters@3.1.1": + "integrity" "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==" + "resolved" "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "clean-css" "4.2.4" + "constantinople" "3.1.2" + "jstransformer" "1.0.0" + "pug-error" "1.3.3" + "pug-walk" "1.1.8" + "resolve" "1.22.4" + "uglify-js" "2.8.29" + +"pug-lexer@4.1.0": + "integrity" "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==" + "resolved" "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.1.0.tgz" + "version" "4.1.0" + dependencies: + "character-parser" "2.2.0" + "is-expression" "3.0.0" + "pug-error" "1.3.3" + +"pug-linker@3.0.6": + "integrity" "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==" + "resolved" "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.6.tgz" + "version" "3.0.6" + dependencies: + "pug-error" "1.3.3" + "pug-walk" "1.1.8" + +"pug-load@2.0.12": + "integrity" "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==" + "resolved" "https://registry.npmjs.org/pug-load/-/pug-load-2.0.12.tgz" + "version" "2.0.12" + dependencies: + "object-assign" "4.1.1" + "pug-walk" "1.1.8" + +"pug-parser@5.0.1": + "integrity" "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==" + "resolved" "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "pug-error" "1.3.3" + "token-stream" "0.0.1" + +"pug-runtime@2.0.5": + "integrity" "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" + "resolved" "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.5.tgz" + "version" "2.0.5" + +"pug-strip-comments@1.0.4": + "integrity" "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==" + "resolved" "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "pug-error" "1.3.3" + +"pug-walk@1.1.8": + "integrity" "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" + "resolved" "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.8.tgz" + "version" "1.1.8" + +"pug@2.0.4": + "integrity" "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==" + "resolved" "https://registry.npmjs.org/pug/-/pug-2.0.4.tgz" + "version" "2.0.4" + dependencies: + "pug-code-gen" "2.0.3" + "pug-filters" "3.1.1" + "pug-lexer" "4.1.0" + "pug-linker" "3.0.6" + "pug-load" "2.0.12" + "pug-parser" "5.0.1" + "pug-runtime" "2.0.5" + "pug-strip-comments" "1.0.4" + +"pump@0.3.5": + "integrity" "sha512-U0S7cdRuBLfk1ylK32jc8No8ex3Xj2ok3XOPAYfXXXfVd3zMA2BT5Vl7XxfqXoIioNSxczI0/OGENv68XN7Oyg==" + "resolved" "https://registry.npmjs.org/pump/-/pump-0.3.5.tgz" + "version" "0.3.5" + dependencies: + "end-of-stream" "1.0.0" + "once" "1.2.0" + +"pump@2.0.1": + "integrity" "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==" + "resolved" "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "end-of-stream" "1.4.4" + "once" "1.4.0" + +"pumpify@1.5.1": + "integrity" "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==" + "resolved" "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz" + "version" "1.5.1" + dependencies: + "duplexify" "3.7.1" + "inherits" "2.0.4" + "pump" "2.0.1" + +"punycode@^1.3.2": + "integrity" "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + "version" "1.4.1" + +"punycode@2.3.0": + "integrity" "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" + "resolved" "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + "version" "2.3.0" + +"q@^1.4.1", "q@1.4.1": + "integrity" "sha512-/CdEdaw49VZVmyIDGUQKDDT53c7qBkO6g5CefWz91Ae+l4+cRtcDYwMTXh6me4O8TMldeGHG3N2Bl84V78Ywbg==" + "resolved" "https://registry.npmjs.org/q/-/q-1.4.1.tgz" + "version" "1.4.1" + +"q@0.9.7": + "integrity" "sha512-ijt0LhxWClXBtc1RCt8H0WhlZLAdVX26nWbpsJy+Hblmp81d2F/pFsvlrJhJDDruFHM+ECtxP0H0HzGSrARkwg==" + "resolved" "https://registry.npmjs.org/q/-/q-0.9.7.tgz" + "version" "0.9.7" + +"q@1.0.1": + "integrity" "sha512-18MnBaCeBX9sLRUdtxz/6onlb7wLzFxCylklyO8n27y5JxJYaGLPu4ccyc5zih58SpEzY8QmfwaWqguqXU6Y+A==" + "resolved" "https://registry.npmjs.org/q/-/q-1.0.1.tgz" + "version" "1.0.1" + +"qs@1.2.2": + "integrity" "sha512-xEqT+49YIt+BdwQthXKTOkp7atENe6JqrGGerxBPiER6BArOIiVJtpZZYpWOpq2IOkTPVnDM8CgYvppFoJNwyQ==" + "resolved" "https://registry.npmjs.org/qs/-/qs-1.2.2.tgz" + "version" "1.2.2" + +"qs@2.3.3": + "integrity" "sha512-f5M0HQqZWkzU8GELTY8LyMrGkr3bPjKoFtTkwUEqJQbcljbeK8M7mliP9Ia2xoOI6oMerp+QPS7oYJtpGmWe/A==" + "resolved" "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz" + "version" "2.3.3" + +"qs@6.11.2": + "integrity" "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==" + "resolved" "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz" + "version" "6.11.2" + dependencies: + "side-channel" "1.0.4" + +"qs@6.5.3": + "integrity" "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==" + "resolved" "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + "version" "6.5.3" + +"randomatic@3.1.1": + "integrity" "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==" + "resolved" "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz" + "version" "3.1.1" + dependencies: + "is-number" "4.0.0" + "kind-of" "6.0.3" + "math-random" "1.0.4" + +"range-parser@1.2.0": + "integrity" "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" + "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + "version" "1.2.0" + +"range-parser@1.2.1": + "integrity" "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "resolved" "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + "version" "1.2.1" + +"raw-body@1.1.7": + "integrity" "sha512-WmJJU2e9Y6M5UzTOkHaM7xJGAPQD8PNzx3bAd2+uhZAim6wDk6dAZxPVYLF67XhbR4hmKGh33Lpmh4XWrCH5Mg==" + "resolved" "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz" + "version" "1.1.7" + dependencies: + "bytes" "1.0.0" + "string_decoder" "0.10.31" + +"rc@^1.0.1", "rc@^1.1.6": + "integrity" "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==" + "resolved" "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + "version" "1.2.8" + dependencies: + "deep-extend" "^0.6.0" + "ini" "~1.3.0" + "minimist" "^1.2.0" + "strip-json-comments" "~2.0.1" + +"read-pkg-up@1.0.1": + "integrity" "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==" + "resolved" "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "find-up" "1.1.2" + "read-pkg" "1.1.0" + +"read-pkg@1.1.0": + "integrity" "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==" + "resolved" "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "load-json-file" "1.1.0" + "normalize-package-data" "2.5.0" + "path-type" "1.1.0" + +"read@1.0.7": + "integrity" "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==" + "resolved" "https://registry.npmjs.org/read/-/read-1.0.7.tgz" + "version" "1.0.7" + dependencies: + "mute-stream" "0.0.4" + +"readable-stream@1.0.34": + "integrity" "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" + "version" "1.0.34" + dependencies: + "core-util-is" "1.0.3" + "inherits" "2.0.4" + "isarray" "0.0.1" + "string_decoder" "0.10.31" + +"readable-stream@1.1.14": + "integrity" "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz" + "version" "1.1.14" + dependencies: + "core-util-is" "1.0.3" + "inherits" "2.0.4" + "isarray" "0.0.1" + "string_decoder" "0.10.31" + +"readable-stream@2.3.8": + "integrity" "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==" + "resolved" "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + "version" "2.3.8" + dependencies: + "core-util-is" "1.0.3" + "inherits" "2.0.4" + "isarray" "1.0.0" + "process-nextick-args" "2.0.1" + "safe-buffer" "5.1.2" + "string_decoder" "1.1.1" + "util-deprecate" "1.0.2" + +"readdirp@2.2.1": + "integrity" "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==" + "resolved" "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz" + "version" "2.2.1" + dependencies: + "graceful-fs" "4.2.11" + "micromatch" "3.1.10" + "readable-stream" "2.3.8" + +"readline2@0.1.1": + "integrity" "sha512-qs8GGG+hLGMaDOGjd+mDglDoYcHDkjIY7z5RU0/ApsGT0qypyrWskNeemUqD+UxIXiZoMYT5aLwGp4ehoyZhIg==" + "resolved" "https://registry.npmjs.org/readline2/-/readline2-0.1.1.tgz" + "version" "0.1.1" + dependencies: + "mute-stream" "0.0.4" + "strip-ansi" "2.0.1" + +"rechoir@0.7.1": + "integrity" "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==" + "resolved" "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" + "version" "0.7.1" + dependencies: + "resolve" "1.22.4" + +"redent@1.0.0": + "integrity" "sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==" + "resolved" "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "indent-string" "2.1.0" + "strip-indent" "1.0.1" + +"redeyed@0.4.4": + "integrity" "sha512-pnk1vsaNLu1UAAClKsImKz9HjBvg9i8cbRqTRzJbiCjGF0fZSMqpdcA5W3juO3c4etFvTrabECkq9wjC45ZyxA==" + "resolved" "https://registry.npmjs.org/redeyed/-/redeyed-0.4.4.tgz" + "version" "0.4.4" + dependencies: + "esprima" "1.0.4" + +"regenerator-runtime@0.10.5": + "integrity" "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" + "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz" + "version" "0.10.5" + +"regenerator-runtime@0.11.1": + "integrity" "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "resolved" "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz" + "version" "0.11.1" + +"regex-cache@0.4.4": + "integrity" "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==" + "resolved" "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + "version" "0.4.4" + dependencies: + "is-equal-shallow" "0.1.3" + +"regex-not@1.0.2": + "integrity" "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==" + "resolved" "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "extend-shallow" "3.0.2" + "safe-regex" "1.1.0" + +"registry-auth-token@3.3.2": + "integrity" "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==" + "resolved" "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz" + "version" "3.3.2" + dependencies: + "rc" "^1.1.6" + "safe-buffer" "^5.0.1" + +"registry-url@0.1.1": + "integrity" "sha512-b6QxEheOmmIsC5eTFuBZsUucrjn2fqpJoZ84ihwGwh5iw07hiSjeTmrYRKzVHlom2jHlSX3/lNCvQJaDQZlVJg==" + "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-0.1.1.tgz" + "version" "0.1.1" + dependencies: + "npmconf" "2.1.3" + +"registry-url@3.1.0": + "integrity" "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==" + "resolved" "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "rc" "^1.0.1" + +"relateurl@0.2.7": + "integrity" "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" + "resolved" "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + "version" "0.2.7" + +"remove-trailing-separator@1.1.0": + "integrity" "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==" + "resolved" "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + "version" "1.1.0" + +"repeat-element@1.1.4": + "integrity" "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + "resolved" "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" + "version" "1.1.4" + +"repeat-string@1.6.1": + "integrity" "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + "resolved" "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + "version" "1.6.1" + +"repeating@2.0.1": + "integrity" "sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==" + "resolved" "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "is-finite" "1.1.0" + +"request-progress@0.3.0": + "integrity" "sha512-q5GKsnZyTFRi6FuO5GqAjqM6BYYaJ+3kVOpcC8F8qW3kLW/1WFUNENd7GOtyWD8m/7Lsx/MWjLS6pO4DaH7zTg==" + "resolved" "https://registry.npmjs.org/request-progress/-/request-progress-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "throttleit" "0.0.2" + +"request-progress@2.0.1": + "integrity" "sha512-dxdraeZVUNEn9AvLrxkgB2k6buTlym71dJk1fk4v8j3Ou3RKNm07BcgbHdj2lLgYGfqX71F+awb1MR+tWPFJzA==" + "resolved" "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "throttleit" "1.0.0" + +"request-replay@0.2.0": + "integrity" "sha512-7S/WaWWPkEIDLWcSwQoZcZAWrX6A5dpE/6tFGEhap0UCm77E4jjcBUmVlbKKLnEzv+wlsBvSjg11RcceYp+6Ww==" + "resolved" "https://registry.npmjs.org/request-replay/-/request-replay-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "retry" "0.6.0" + +"request@^2.87.0", "request@2.88.2": + "integrity" "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==" + "resolved" "https://registry.npmjs.org/request/-/request-2.88.2.tgz" + "version" "2.88.2" + dependencies: + "aws-sign2" "0.7.0" + "aws4" "1.12.0" + "caseless" "0.12.0" + "combined-stream" "1.0.8" + "extend" "3.0.2" + "forever-agent" "0.6.1" + "form-data" "2.3.3" + "har-validator" "5.1.5" + "http-signature" "1.2.0" + "is-typedarray" "1.0.0" + "isstream" "0.1.2" + "json-stringify-safe" "5.0.1" + "mime-types" "2.1.35" + "oauth-sign" "0.9.0" + "performance-now" "2.1.0" + "qs" "6.5.3" + "safe-buffer" "5.1.2" + "tough-cookie" "2.5.0" + "tunnel-agent" "0.6.0" + "uuid" "3.4.0" + +"request@2.42.0": + "integrity" "sha512-ZpqQyQWQ7AdVurjxpmP/fgpN3wAZBruO2GeD3zDijWmnqg3SYz9YY6uZC8tJF++IhZ/P2VZkZug/fFEshAkD6g==" + "resolved" "https://registry.npmjs.org/request/-/request-2.42.0.tgz" + "version" "2.42.0" + dependencies: + "bl" "0.9.5" + "caseless" "0.6.0" + "forever-agent" "0.5.2" + "hawk" "1.1.1" + "json-stringify-safe" "5.0.1" + "mime-types" "1.0.2" + "node-uuid" "1.4.8" + "qs" "1.2.2" + "stringstream" "0.0.6" + "tough-cookie" "2.5.0" + "tunnel-agent" "0.4.3" optionalDependencies: - fsevents "~2.3.2" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-css@^5.2.2: - version "5.3.1" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.1.tgz" - integrity sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg== - dependencies: - source-map "~0.6.0" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz" - integrity sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg== - -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -clipboardy@1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/clipboardy/-/clipboardy-1.2.3.tgz#0526361bf78724c1f20be248d428e365433c07ef" - integrity sha512-2WNImOvCRe6r63Gk9pShfkwXsVtKCroMAevIbiae021mS850UkWPbevxsBz3tnvjZIEGvlwaqCPsw+4ulzNgJA== - dependencies: - arch "^2.1.0" - execa "^0.8.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz" - integrity sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw== - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colord@^2.9.3: - version "2.9.3" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.14: - version "2.0.19" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz" - integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== - -colors@^1.1.2, colors@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -commander@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz" - integrity sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -compressible@~2.0.14: - version "2.0.18" - resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@1.7.3: - version "1.7.3" - resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.3.tgz#27e0e176aaf260f7f2c2813c3e440adb9f1993db" - integrity sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.14" - debug "2.6.9" - on-headers "~1.0.1" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -convert-source-map@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" - integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -core-js-compat@^3.25.1: - version "3.25.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.1.tgz" - integrity sha512-pOHS7O0i8Qt4zlPW/eIFjwp+NrTPx+wTL0ctgI2fHn31sZOq89rDsmtc/A2vAX7r6shl+bmVI+678He46jgBlw== - dependencies: - browserslist "^4.21.3" - -cosmiconfig@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" - integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -css-functions-list@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz" - integrity sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w== - -css-loader@^6.7.1: - version "6.7.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz" - integrity sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.7" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.5" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-what@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -d3-color@1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-1.4.1.tgz#c52002bf8846ada4424d55d97982fef26eb3bc8a" - integrity sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q== - -d3-hierarchy@^1.0.3: - version "1.1.9" - resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-1.1.9.tgz#2f6bee24caaea43f8dc37545fa01628559647a83" - integrity sha512-j8tPxlqh1srJHAtxfvOUwKNYJkQuBFdM1+JAUfq6xqH5eAqf93L7oG1NVqDa4CpFZNvnNKtCYEUC8KY9yEn9lQ== - -d3-interpolate@^1.1.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-1.4.0.tgz#526e79e2d80daa383f9e0c1c1c7dcc0f0583e987" - integrity sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA== - dependencies: - d3-color "1" - -de-indent@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz" - integrity sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg== - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz" - integrity sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz" - integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og== - -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deep-is@^0.1.3: - version "0.1.4" - resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" - integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" - integrity sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA== - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" - integrity sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA== - dependencies: - is-descriptor "^1.0.0" + "aws-sign2" "0.5.0" + "form-data" "0.1.4" + "http-signature" "0.10.1" + "oauth-sign" "0.4.0" + +"request@2.51.0": + "integrity" "sha512-6pfShjLfn6ThOlPHyQo7nBxEwTa2PzvqHruxQS51TrADjWj3qetRZ2Ae5gRzMF7N2fKG5Ww7su+Z6jA3sFv0Gw==" + "resolved" "https://registry.npmjs.org/request/-/request-2.51.0.tgz" + "version" "2.51.0" + dependencies: + "aws-sign2" "0.5.0" + "bl" "0.9.5" + "caseless" "0.8.0" + "combined-stream" "0.0.7" + "forever-agent" "0.5.2" + "form-data" "0.2.0" + "hawk" "1.1.1" + "http-signature" "0.10.1" + "json-stringify-safe" "5.0.1" + "mime-types" "1.0.2" + "node-uuid" "1.4.8" + "oauth-sign" "0.5.0" + "qs" "2.3.3" + "stringstream" "0.0.6" + "tough-cookie" "2.5.0" + "tunnel-agent" "0.4.3" + +"require-directory@2.1.1": + "integrity" "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + "resolved" "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + "version" "2.1.1" + +"require-from-string@^2.0.2": + "integrity" "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + "resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + "version" "2.0.2" + +"require-main-filename@2.0.0": + "integrity" "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + "resolved" "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz" + "version" "2.0.0" + +"requires-port@0.0.1": + "integrity" "sha512-AzPDCliPoWDSvEVYRQmpzuPhGGEnPrQz9YiOEvn+UdB9ixBpw+4IOZWtwctmpzySLZTy7ynpn47V14H4yaowtA==" + "resolved" "https://registry.npmjs.org/requires-port/-/requires-port-0.0.1.tgz" + "version" "0.0.1" + +"resolve-dir@1.0.1": + "integrity" "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==" + "resolved" "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "expand-tilde" "2.0.2" + "global-modules" "1.0.0" + +"resolve-url@0.2.1": + "integrity" "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + "resolved" "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + "version" "0.2.1" + +"resolve@1.22.4": + "integrity" "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==" + "resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz" + "version" "1.22.4" + dependencies: + "is-core-module" "2.13.0" + "path-parse" "1.0.7" + "supports-preserve-symlinks-flag" "1.0.0" + +"ret@0.1.15": + "integrity" "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + "resolved" "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" + "version" "0.1.15" + +"retry@0.6.0": + "integrity" "sha512-RgncoxLF1GqwAzTZs/K2YpZkWrdIYbXsmesdomi+iPilSzjUyr/wzNIuteoTVaWokzdwZIJ9NHRNQa/RUiOB2g==" + "resolved" "https://registry.npmjs.org/retry/-/retry-0.6.0.tgz" + "version" "0.6.0" + +"right-align@0.1.3": + "integrity" "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==" + "resolved" "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz" + "version" "0.1.3" + dependencies: + "align-text" "0.1.4" + +"rimraf@^2.5.2", "rimraf@2.7.1": + "integrity" "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + "version" "2.7.1" + dependencies: + "glob" "7.1.7" + +"rimraf@2.2.8": + "integrity" "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==" + "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + "version" "2.2.8" + +"rw@1.3.3": + "integrity" "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "resolved" "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz" + "version" "1.3.3" + +"rx@2.5.3": + "integrity" "sha512-u5qvfulb7NXoY/+OE28920WEgFi6aiDjf5iF9rA2f9tBXejLgTLd0WxkclvIQWjFFHfNJlb7pSTsrjgiDh+Uug==" + "resolved" "https://registry.npmjs.org/rx/-/rx-2.5.3.tgz" + "version" "2.5.3" + +"safe-buffer@^5.0.1", "safe-buffer@5.1.2": + "integrity" "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "resolved" "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + "version" "5.1.2" + +"safe-json-parse@1.0.1": + "integrity" "sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A==" + "resolved" "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz" + "version" "1.0.1" + +"safe-regex@1.1.0": + "integrity" "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==" + "resolved" "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" + "version" "1.1.0" + dependencies: + "ret" "0.1.15" + +"safer-buffer@2.1.2": + "integrity" "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "resolved" "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + "version" "2.1.2" + +"sass-graph@2.2.5": + "integrity" "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==" + "resolved" "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz" + "version" "2.2.5" + dependencies: + "glob" "7.1.7" + "lodash" "4.17.21" + "scss-tokenizer" "0.2.3" + "yargs" "13.3.2" + +"saucelabs@1.3.0": + "integrity" "sha512-y1fLynzP8S8BJPgBTzMSvZmZX073FpmyCsJif9w4pT8Je3LutU1/DNX8yVH0ju3sVCo/UD8tRxl+HpgWpi9PSg==" + "resolved" "https://registry.npmjs.org/saucelabs/-/saucelabs-1.3.0.tgz" + "version" "1.3.0" + dependencies: + "https-proxy-agent" "1.0.0" + +"sax@0.6.1": + "integrity" "sha512-8ip+qnRh7m8OEyvoM1JoSBzlrepp3ajVR8nqgrfTig+TewfyvTijl0am8/anFqgbcdz62ofEUKE1hHNDCdbeSQ==" + "resolved" "https://registry.npmjs.org/sax/-/sax-0.6.1.tgz" + "version" "0.6.1" + +"sax@1.2.4": + "integrity" "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + "resolved" "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + "version" "1.2.4" + +"scss-tokenizer@0.2.3": + "integrity" "sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==" + "resolved" "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz" + "version" "0.2.3" + dependencies: + "js-base64" "2.6.4" + "source-map" "0.4.4" + +"selenium-webdriver@2.53.3": + "integrity" "sha512-frrFcVqQEIwn88dTQdlrK1BOB23Hj8wKyEAlyvxGqNItyQqbNfLIBtvXvhvO5l0ePhsak3rtrzRNeTLW3esp1Q==" + "resolved" "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-2.53.3.tgz" + "version" "2.53.3" + dependencies: + "adm-zip" "0.4.4" + "rimraf" "2.7.1" + "tmp" "0.0.24" + "ws" "1.1.5" + "xml2js" "0.4.4" + +"selenium-webdriver@3.6.0": + "integrity" "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==" + "resolved" "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz" + "version" "3.6.0" + dependencies: + "jszip" "3.10.1" + "rimraf" "2.7.1" + "tmp" "0.0.30" + "xml2js" "0.4.23" + +"semver-diff@0.1.0": + "integrity" "sha512-YZ8p8EFvhPEFhCf9iHGhC8N4xA9kMR8ZufYUMdmaqRsVo50rxLQzhHhI9BAecpPWCXwlOWs4IstHtYlG5S/NGQ==" + "resolved" "https://registry.npmjs.org/semver-diff/-/semver-diff-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "semver" "2.3.2" + +"semver@^5.3.0", "semver@5.7.2": + "integrity" "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + "version" "5.7.2" + +"semver@2.3.2": + "integrity" "sha512-abLdIKCosKfpnmhS52NCTjO4RiLspDfsn37prjzGrp9im5DPJOgh82Os92vtwGh6XdQryKI/7SREZnV+aqiXrA==" + "resolved" "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz" + "version" "2.3.2" + +"semver@4.3.6": + "integrity" "sha512-IrpJ+yoG4EOH8DFWuVg+8H1kW1Oaof0Wxe7cPcXW3x9BjkN/eVo54F15LyqemnDIUYskQWr9qvl/RihmSy6+xQ==" + "resolved" "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz" + "version" "4.3.6" + +"semver@5.0.3": + "integrity" "sha512-5OkOBiw69xqmxOFIXwXsiY1HlE+om8nNptg1ZIf95fzcnfgOv2fLm7pmmGbRJsjJIqPpW5Kwy4wpDBTz5wQlUw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.0.3.tgz" + "version" "5.0.3" + +"semver@5.3.0": + "integrity" "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==" + "resolved" "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" + "version" "5.3.0" + +"send@0.18.0": + "integrity" "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==" + "resolved" "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + "version" "0.18.0" + dependencies: + "debug" "2.6.9" + "depd" "2.0.0" + "destroy" "1.2.0" + "encodeurl" "1.0.2" + "escape-html" "1.0.3" + "etag" "1.8.1" + "fresh" "0.5.2" + "http-errors" "2.0.0" + "mime" "1.6.0" + "ms" "2.1.3" + "on-finished" "2.4.1" + "range-parser" "1.2.1" + "statuses" "2.0.1" + +"sentence-case@2.1.1": + "integrity" "sha512-ENl7cYHaK/Ktwk5OTD+aDbQ3uC8IByu/6Bkg+HDv8Mm+XnBnppVNalcfJTNsp1ibstKh030/JKQQWglDvtKwEQ==" + "resolved" "https://registry.npmjs.org/sentence-case/-/sentence-case-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "no-case" "2.3.2" + "upper-case-first" "1.1.2" + +"serve-handler@6.1.5": + "integrity" "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==" + "resolved" "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" + "version" "6.1.5" + dependencies: + "bytes" "3.0.0" + "content-disposition" "0.5.2" + "fast-url-parser" "1.1.3" + "mime-types" "2.1.18" + "minimatch" "3.1.2" + "path-is-inside" "1.0.2" + "path-to-regexp" "2.2.1" + "range-parser" "1.2.0" + +"serve-index@1.9.1": + "integrity" "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==" + "resolved" "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + "version" "1.9.1" + dependencies: + "accepts" "1.3.8" + "batch" "0.6.1" + "debug" "2.6.9" + "escape-html" "1.0.3" + "http-errors" "1.6.3" + "mime-types" "2.1.35" + "parseurl" "1.3.3" + +"serve-static@1.15.0": + "integrity" "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==" + "resolved" "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + "version" "1.15.0" + dependencies: + "encodeurl" "1.0.2" + "escape-html" "1.0.3" + "parseurl" "1.3.3" + "send" "0.18.0" + +"serve@^14.2.1": + "integrity" "sha512-48er5fzHh7GCShLnNyPBRPEjs2I6QBozeGr02gaacROiyS/8ARADlj595j39iZXAqBbJHH/ivJJyPRWY9sQWZA==" + "resolved" "https://registry.npmjs.org/serve/-/serve-14.2.1.tgz" + "version" "14.2.1" + dependencies: + "@zeit/schemas" "2.29.0" + "ajv" "8.11.0" + "arg" "5.0.2" + "boxen" "7.0.0" + "chalk" "5.0.1" + "chalk-template" "0.4.0" + "clipboardy" "3.0.0" + "compression" "1.7.4" + "is-port-reachable" "4.0.0" + "serve-handler" "6.1.5" + "update-check" "1.5.4" + +"set-blocking@2.0.0": + "integrity" "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + "resolved" "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + "version" "2.0.0" + +"set-immediate-shim@1.0.1": + "integrity" "sha512-Li5AOqrZWCVA2n5kryzEmqai6bKSIvpz5oUJHPVj6+dsbD3X1ixtsY5tEnsaNpH3pFAHmG8eIHUrtEtohrg+UQ==" + "resolved" "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + "version" "1.0.1" + +"set-value@2.0.1": + "integrity" "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==" + "resolved" "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" + "version" "2.0.1" + dependencies: + "extend-shallow" "2.0.1" + "is-extendable" "0.1.1" + "is-plain-object" "2.0.4" + "split-string" "3.1.0" + +"setimmediate@1.0.5": + "integrity" "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "resolved" "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + "version" "1.0.5" + +"setprototypeof@1.1.0": + "integrity" "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + "version" "1.1.0" + +"setprototypeof@1.2.0": + "integrity" "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "resolved" "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + "version" "1.2.0" + +"shebang-command@^2.0.0": + "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "shebang-regex" "^3.0.0" + +"shebang-command@1.2.0": + "integrity" "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==" + "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + "version" "1.2.0" + dependencies: + "shebang-regex" "1.0.0" + +"shebang-regex@^3.0.0": + "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + "version" "3.0.0" + +"shebang-regex@1.0.0": + "integrity" "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==" + "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + "version" "1.0.0" + +"shell-quote@1.4.3": + "integrity" "sha512-0Y4SH6mnoNZNW29pNEC0E1F//X7AmbpOj/j5oTssXFUvg2J9MbKIVH3S5ca8Je1Hr36utXJqlzCbYxEYsPAR4A==" + "resolved" "https://registry.npmjs.org/shell-quote/-/shell-quote-1.4.3.tgz" + "version" "1.4.3" + dependencies: + "array-filter" "0.0.1" + "array-map" "0.0.1" + "array-reduce" "0.0.0" + "jsonify" "0.0.1" + +"shelljs@0.3.0": + "integrity" "sha512-Ny0KN4dyT8ZSCE0frtcbAJGoM/HTArpyPkeli1/00aYfm0sbD/Gk/4x7N2DP9QKGpBsiQH7n6rpm1L79RtviEQ==" + "resolved" "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz" + "version" "0.3.0" + +"side-channel@1.0.4": + "integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==" + "resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + "version" "1.0.4" + dependencies: + "call-bind" "1.0.2" + "get-intrinsic" "1.2.1" + "object-inspect" "1.12.3" + +"sigmund@1.0.1": + "integrity" "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==" + "resolved" "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + "version" "1.0.1" + +"signal-exit@^3.0.3", "signal-exit@3.0.7": + "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + "version" "3.0.7" + +"snake-case@2.1.0": + "integrity" "sha512-FMR5YoPFwOLuh4rRz92dywJjyKYZNLpMn1R5ujVpIYkbA9p01fq8RMg0FkO4M+Yobt4MjHeLTJVm5xFFBHSV2Q==" + "resolved" "https://registry.npmjs.org/snake-case/-/snake-case-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "no-case" "2.3.2" + +"snapdragon-node@2.1.1": + "integrity" "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==" + "resolved" "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "define-property" "1.0.0" + "isobject" "3.0.1" + "snapdragon-util" "3.0.1" + +"snapdragon-util@3.0.1": + "integrity" "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==" + "resolved" "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "kind-of" "3.2.2" + +"snapdragon@0.8.2": + "integrity" "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==" + "resolved" "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" + "version" "0.8.2" + dependencies: + "base" "0.11.2" + "debug" "2.6.9" + "define-property" "0.2.5" + "extend-shallow" "2.0.1" + "map-cache" "0.2.2" + "source-map" "0.5.7" + "source-map-resolve" "0.5.3" + "use" "3.1.1" + +"sntp@0.2.4": + "integrity" "sha512-bDLrKa/ywz65gCl+LmOiIhteP1bhEsAAzhfMedPoiHP3dyYnAevlaJshdqb9Yu0sRifyP/fRqSt8t+5qGIWlGQ==" + "resolved" "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz" + "version" "0.2.4" + dependencies: + "hoek" "0.9.1" + +"source-map-resolve@0.5.3": + "integrity" "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==" + "resolved" "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" + "version" "0.5.3" + dependencies: + "atob" "2.1.2" + "decode-uri-component" "0.2.2" + "resolve-url" "0.2.1" + "source-map-url" "0.4.1" + "urix" "0.1.0" + +"source-map-support@0.4.18": + "integrity" "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz" + "version" "0.4.18" + dependencies: + "source-map" "0.5.7" + +"source-map-support@0.5.21": + "integrity" "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==" + "resolved" "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + "version" "0.5.21" + dependencies: + "buffer-from" "1.1.2" + "source-map" "0.6.1" + +"source-map-url@0.4.1": + "integrity" "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + "resolved" "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" + "version" "0.4.1" + +"source-map@0.1.43": + "integrity" "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + "version" "0.1.43" + dependencies: + "amdefine" "1.0.1" + +"source-map@0.4.4": + "integrity" "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz" + "version" "0.4.4" + dependencies: + "amdefine" "1.0.1" + +"source-map@0.5.7": + "integrity" "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + "version" "0.5.7" + +"source-map@0.6.1": + "integrity" "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "resolved" "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + "version" "0.6.1" + +"spdx-correct@3.2.0": + "integrity" "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==" + "resolved" "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "spdx-expression-parse" "3.0.1" + "spdx-license-ids" "3.0.13" + +"spdx-exceptions@2.3.0": + "integrity" "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + "resolved" "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + "version" "2.3.0" + +"spdx-expression-parse@3.0.1": + "integrity" "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==" + "resolved" "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + "version" "3.0.1" + dependencies: + "spdx-exceptions" "2.3.0" + "spdx-license-ids" "3.0.13" + +"spdx-license-ids@3.0.13": + "integrity" "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==" + "resolved" "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" + "version" "3.0.13" + +"split-string@3.1.0": + "integrity" "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==" + "resolved" "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "extend-shallow" "3.0.2" + +"split@1.0.1": + "integrity" "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==" + "resolved" "https://registry.npmjs.org/split/-/split-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "through" "2.3.8" + +"split2@1.1.1": + "integrity" "sha512-cfurE2q8LamExY+lJ9Ex3ZfBwqAPduzOKVscPDXNCLLMvyaeD3DTz1yk7fVIs6Chco+12XeD0BB6HEoYzPYbXA==" + "resolved" "https://registry.npmjs.org/split2/-/split2-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "through2" "2.0.5" + +"sprintf-js@1.0.3": + "integrity" "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + "version" "1.0.3" + +"sprintf-js@1.1.2": + "integrity" "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==" + "resolved" "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz" + "version" "1.1.2" + +"sshpk@1.17.0": + "integrity" "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==" + "resolved" "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz" + "version" "1.17.0" + dependencies: + "asn1" "0.2.6" + "assert-plus" "1.0.0" + "bcrypt-pbkdf" "1.0.2" + "dashdash" "1.14.1" + "ecc-jsbn" "0.1.2" + "getpass" "0.1.7" + "jsbn" "0.1.1" + "safer-buffer" "2.1.2" + "tweetnacl" "0.14.5" + +"static-extend@0.1.2": + "integrity" "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==" + "resolved" "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "define-property" "0.2.5" + "object-copy" "0.1.0" + +"statuses@1.5.0": + "integrity" "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + "resolved" "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + "version" "1.5.0" + +"statuses@2.0.1": + "integrity" "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + "resolved" "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + "version" "2.0.1" + +"stdout-stream@1.4.1": + "integrity" "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==" + "resolved" "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz" + "version" "1.4.1" + dependencies: + "readable-stream" "2.3.8" + +"stream-shift@1.0.1": + "integrity" "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + "resolved" "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz" + "version" "1.0.1" + +"string_decoder@0.10.31": + "integrity" "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + "version" "0.10.31" + +"string_decoder@1.1.1": + "integrity" "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==" + "resolved" "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "safe-buffer" "5.1.2" + +"string-length@0.1.2": + "integrity" "sha512-Z7ZCUHl1mkGe1v4rybhTTVm0LSWeeX1hJ4pVsX0jcYNCwMJsLByDfVV3PUJ5kyC/ZigzPbUP+nEBNCbZza5VyA==" + "resolved" "https://registry.npmjs.org/string-length/-/string-length-0.1.2.tgz" + "version" "0.1.2" + dependencies: + "strip-ansi" "0.2.2" + +"string-template@0.2.1": + "integrity" "sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==" + "resolved" "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz" + "version" "0.2.1" + +"string-width@^4.1.0": + "integrity" "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + "version" "4.2.3" + dependencies: + "emoji-regex" "^8.0.0" + "is-fullwidth-code-point" "^3.0.0" + "strip-ansi" "^6.0.1" + +"string-width@^5.0.1", "string-width@^5.1.2": + "integrity" "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + "version" "5.1.2" + dependencies: + "eastasianwidth" "^0.2.0" + "emoji-regex" "^9.2.2" + "strip-ansi" "^7.0.1" + +"string-width@1.0.2": + "integrity" "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + "version" "1.0.2" + dependencies: + "code-point-at" "1.1.0" + "is-fullwidth-code-point" "1.0.0" + "strip-ansi" "3.0.1" + +"string-width@3.1.0": + "integrity" "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==" + "resolved" "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz" + "version" "3.1.0" + dependencies: + "emoji-regex" "7.0.3" + "is-fullwidth-code-point" "2.0.0" + "strip-ansi" "5.2.0" + +"stringify-object@1.0.1": + "integrity" "sha512-RDGXBy5t6y1birIZGEgKW1mE+cG9XqXQT23wKLIcMzvm8zZZrCWWUxLZndhuV2zJ1ZCDjm/QnWED8/6rfIzg4g==" + "resolved" "https://registry.npmjs.org/stringify-object/-/stringify-object-1.0.1.tgz" + "version" "1.0.1" + +"stringstream@0.0.6": + "integrity" "sha512-87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==" + "resolved" "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz" + "version" "0.0.6" -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== +"strip-ansi@^3.0.0", "strip-ansi@3.0.1": + "integrity" "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + "version" "3.0.1" dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -detect-libc@^2.0.0, detect-libc@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz" - integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== - -diff@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" - integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-walk@^0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz" - integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== - -domelementtype@^2.0.1, domelementtype@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -electron-to-chromium@^1.4.251: - version "1.4.251" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.251.tgz" - integrity sha512-k4o4cFrWPv4SoJGGAydd07GmlRVzmeDIJ6MaEChTUjk4Dmomn189tCicSzil2oyvbPoGgg2suwPDNWq4gWRhoQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -end-of-stream@^1.1.0, end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.0.0, enhanced-resolve@^5.10.0: - version "5.10.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz" - integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -ent@2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" - integrity sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" - integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== - -entities@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== - -envinfo@^7.7.3: - version "7.8.1" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -error@^4.3.0: - version "4.4.0" - resolved "https://registry.npmjs.org/error/-/error-4.4.0.tgz" - integrity sha512-SNDKualLUtT4StGFP7xNfuFybL2f6iJujFtrWuvJqGbVQGaN+adE23veqzPz1hjUjTunLi2EnJ+0SJxtbJreKw== - dependencies: - camelize "^1.0.0" - string-template "~0.2.0" - xtend "~4.0.0" - -es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: - version "1.20.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.4.tgz#1d103f9f8d78d4cf0713edcd6d0ed1a46eed5861" - integrity sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA== - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" - get-symbol-description "^1.0.0" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-symbols "^1.0.3" - internal-slot "^1.0.3" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-weakref "^1.0.2" - object-inspect "^1.12.2" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" - safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.5" - string.prototype.trimstart "^1.0.5" - unbox-primitive "^1.0.2" - -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-html@^1.0.1, escape-html@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-import-resolver-node@^0.3.6: - version "0.3.6" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" - integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== - dependencies: - debug "^3.2.7" - resolve "^1.20.0" - -eslint-import-resolver-typescript@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.1.tgz#c72634da072eebd04fe73007fa58a62c333c8147" - integrity sha512-U7LUjNJPYjNsHvAUAkt/RU3fcTSpbllA0//35B4eLYTX74frmOepbt7F7J3D1IGtj9k21buOpaqtDd4ZlS/BYQ== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.10.0" - get-tsconfig "^4.2.0" - globby "^13.1.2" - is-core-module "^2.10.0" - is-glob "^4.0.3" - synckit "^0.8.3" - -eslint-module-utils@^2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974" - integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA== - dependencies: - debug "^3.2.7" - -eslint-plugin-angular@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-angular/-/eslint-plugin-angular-4.1.0.tgz#53d03d829edff50d517e81f862782e3efa591953" - integrity sha512-dacledMPxVOZA3T0xcYFuvrMCy5dHxg0ZTMWUaHqSBQef3/XLyXJ9s1LNj0NikJ/dYx6OhqlnnNpKmrJhEUB+Q== - -eslint-plugin-import@^2.26.0: - version "2.26.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" - integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== - dependencies: - array-includes "^3.1.4" - array.prototype.flat "^1.2.5" - debug "^2.6.9" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.6" - eslint-module-utils "^2.7.3" - has "^1.0.3" - is-core-module "^2.8.1" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.5" - resolve "^1.22.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-prettier@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" - integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-unused-imports@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-2.0.0.tgz#d8db8c4d0cfa0637a8b51ce3fd7d1b6bc3f08520" - integrity sha512-3APeS/tQlTrFa167ThtP0Zm0vctjr4M44HMpeg1P4bK6wItarumq0Ma82xorMKdFsWpphQBlRPzw/pxiVELX1A== - dependencies: - eslint-rule-composer "^0.3.0" - -eslint-rule-composer@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" - integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== - -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== - dependencies: - esrecurse "^4.3.0" - estraverse "^5.2.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@^8.24.0: - version "8.24.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.24.0.tgz#489516c927a5da11b3979dbfb2679394523383c8" - integrity sha512-dWFaPhGhTAiPcCgm3f6LI2MBWbogMnTJzFBbhXVRQDJPkr9pGZvVjlVfXd+vyDcWPA2Ic9L2AXPIQM0+vk/cSQ== - dependencies: - "@eslint/eslintrc" "^1.3.2" - "@humanwhocodes/config-array" "^0.10.5" - "@humanwhocodes/gitignore-to-minimatch" "^1.0.2" - "@humanwhocodes/module-importer" "^1.0.1" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.3.2" - doctrine "^3.0.0" - escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - find-up "^5.0.0" - glob-parent "^6.0.1" - globals "^13.15.0" - globby "^11.1.0" - grapheme-splitter "^1.0.4" - ignore "^5.2.0" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-sdsl "^4.1.4" - js-yaml "^4.1.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.1.2" - natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" - strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" - text-table "^0.2.0" - -esm@^3.2.25: - version "3.2.25" - resolved "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz" - integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== - -espree@^9.4.0: - version "9.4.0" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.0.tgz#cd4bc3d6e9336c433265fc0aa016fc1aaf182f8a" - integrity sha512-DQmnRpLj7f6TgN/NYb0MTzJXL+vJF9h3pHy4JhCIs3zwcgez8xmGg3sXHcEO97BrmO2OSvCwMdfdlyl+E9KjOw== - dependencies: - acorn "^8.8.0" - acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" - -esprima@~4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0, estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -ev-store@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/ev-store/-/ev-store-7.0.0.tgz" - integrity sha512-otazchNRnGzp2YarBJ+GXKVGvhxVATB1zmaStxJBYet0Dyq7A9VhH8IUEB/gRcL6Ch52lfpgPTRJ2m49epyMsQ== - dependencies: - individual "^3.0.0" - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz" - integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -execa@^0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" - integrity sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA== - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz" - integrity sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA== - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz" - integrity sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q== - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== - -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: - version "1.0.16" - resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" - integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== - -fastq@^1.6.0: - version "1.13.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz" - integrity sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw== - dependencies: - reusify "^1.0.4" - -favicons-webpack-plugin@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/favicons-webpack-plugin/-/favicons-webpack-plugin-6.0.0.tgz#a54777103e98ad64929e3ed5fbcafe6b3bae357c" - integrity sha512-wryICW2NjR9BORYjP1PN3CDbjVzXDxcemLMWQBdLJGhZlj0sYF7NNq+ddQtO/YJvBurYQ3YR1df5uXZRmcF9hw== - dependencies: - find-root "^1.1.0" - parse-author "^2.0.0" - parse5 "^7.1.1" - optionalDependencies: - html-webpack-plugin "^5.5.0" + "ansi-regex" "2.1.1" -favicons@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/favicons/-/favicons-7.0.2.tgz#a4a5b34928d61e007fb8814d2eee283aeb3c9304" - integrity sha512-M/qE3ERHOBu0+Op+61jx8CdvOnSKrrl2zxUPpoGgsNyfjuGqRsK80zYoA5Uwdxl8QM4egfhBWZp1j7KK3YnOMg== +"strip-ansi@^6.0.1": + "integrity" "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + "version" "6.0.1" dependencies: - escape-html "^1.0.3" - sharp "^0.31.1" - xml2js "^0.4.23" - -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" - integrity sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ== - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-cache-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flatpickr@^4.6.9: - version "4.6.13" - resolved "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz" - integrity sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw== - -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -flow-parser@0.*: - version "0.187.0" - resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.187.0.tgz" - integrity sha512-wTOuvmW6YyrcqkuLggk/GeSl65R5KQPEbxh0eAfCvlwxp8X08r+5owgZjdbLf8/typZQl/cSJL6D9vVwCkzf3g== - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" - integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" - integrity sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA== - dependencies: - map-cache "^0.2.2" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functions-have-names@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz" - integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.2.0.tgz#ff368dd7104dab47bf923404eb93838245c66543" - integrity sha512-X8u8fREiYOE6S8hLbq99PeykTDoLVnxvF4DjWKJmz9xy2nNRdUcV8ZN9tniJFeKyTU3qnC9lL8n4Chd6LmVKHg== - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" - integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" - integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.1.3, glob@^7.1.6, glob@^7.2.0: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -global@^4.3.0: - version "4.4.0" - resolved "https://registry.npmjs.org/global/-/global-4.4.0.tgz" - integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== - dependencies: - min-document "^2.19.0" - process "^0.11.10" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.15.0: - version "13.17.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.17.0.tgz#902eb1e680a41da93945adbdcb5a9f361ba69bd4" - integrity sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw== - dependencies: - type-fest "^0.20.2" - -globalyzer@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.0.tgz#cb76da79555669a1519d5a8edf093afaa0bf1465" - integrity sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q== - -globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.1, globby@^13.1.2: - version "13.1.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz" - integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== - -globrex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" - integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== - -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4, graceful-fs@^4.2.9: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz" - integrity sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q== - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz" - integrity sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw== - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" - integrity sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ== - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz" - integrity sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ== - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -html-minifier-terser@^6.0.2: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz" - integrity sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg== - -html-webpack-plugin@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz" - integrity sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" - integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz" - integrity sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -individual@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/individual/-/individual-3.0.0.tgz" - integrity sha512-rUY5vtT748NMRbEMrTNiFfy29BgGZwGXUi2NFUVMWQrogSLzlJvQV9eeMWi+g1aVaQ53tpyLAQtd5x/JH0Nh1g== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inquirer@^7.3.3: - version "7.3.3" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - -internal-slot@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" - integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== - dependencies: - get-intrinsic "^1.1.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" - integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-core-module@^2.10.0, is-core-module@^2.5.0, is-core-module@^2.8.1, is-core-module@^2.9.0: - version "2.10.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz" - integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + "ansi-regex" "^5.0.1" + +"strip-ansi@^7.0.1": + "integrity" "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + "version" "7.1.0" + dependencies: + "ansi-regex" "^6.0.1" -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" - integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== +"strip-ansi@0.2.2": + "integrity" "sha512-1uWiYlJgR31DGid87j930IpH4YUsxX3hOLvdGmnUAm++BWpEkWXMWYcQCUDXUNdEsRA9GZevI4q8UszDfozHxw==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.2.2.tgz" + "version" "0.2.2" + dependencies: + "ansi-regex" "0.1.0" + +"strip-ansi@0.3.0": + "integrity" "sha512-DerhZL7j6i6/nEnVG0qViKXI0OKouvvpsAiaj7c+LfqZZZxdwZtv8+UiA/w4VUJpT8UzX0pR1dcHOii1GbmruQ==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "ansi-regex" "0.2.1" -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== +"strip-ansi@2.0.1": + "integrity" "sha512-2h8q2CP3EeOhDJ+jd932PRMpa3/pOJFGoF22J1U/DNbEK2gSW2DqeF46VjCXsSQXhC+k/l8/gaaRBQKL6hUPfQ==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz" + "version" "2.0.1" dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz" - integrity sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg== - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-object@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz" - integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== - -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" - integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" - integrity sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA== - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jquery@^3.6.0: - version "3.6.1" - resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz" - integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw== - -jquery@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.4.tgz#ba065c188142100be4833699852bf7c24dc0252f" - integrity sha512-v28EW9DWDFpzcD9O5iyJXg3R3+q+mET5JhnjJzQUZMHOv67bpSIHq81GEYpPNZHG+XXHsfSme3nxp/hndKEcsQ== - -js-sdsl@^4.1.4: - version "4.1.5" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.1.5.tgz#1ff1645e6b4d1b028cd3f862db88c9d887f26e2a" - integrity sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q== - -js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -js2xmlparser@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz" - integrity sha512-6n4D8gLlLf1n5mNLQPRfViYzu9RATblzPEtm1SthMX1Pjao0r9YI9nw7ZIfRxQMERS87mcswrg+r/OYrPRX6jA== - dependencies: - xmlcreate "^2.0.4" - -jscodeshift@^0.10.0: - version "0.10.0" - resolved "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.10.0.tgz" - integrity sha512-xpH2FVSEepXoNr6+cPlPHzPzBY1W9bPulufhCHOShzk8+CTCzAOQKytuOXT0b/9PvmO4biRi0g/ZIylVew815w== - dependencies: - "@babel/core" "^7.1.6" - "@babel/parser" "^7.1.6" - "@babel/plugin-proposal-class-properties" "^7.1.0" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.1.0" - "@babel/plugin-proposal-optional-chaining" "^7.1.0" - "@babel/plugin-transform-modules-commonjs" "^7.1.0" - "@babel/preset-flow" "^7.0.0" - "@babel/preset-typescript" "^7.1.0" - "@babel/register" "^7.0.0" - babel-core "^7.0.0-bridge.0" - colors "^1.1.2" - flow-parser "0.*" - graceful-fs "^4.1.11" - micromatch "^3.1.10" - neo-async "^2.5.0" - node-dir "^0.1.17" - recast "^0.18.1" - temp "^0.8.1" - write-file-atomic "^2.3.0" - -jsdoc@^3.6.10: - version "3.6.11" - resolved "https://registry.npmjs.org/jsdoc/-/jsdoc-3.6.11.tgz" - integrity sha512-8UCU0TYeIYD9KeLzEcAu2q8N/mx9O3phAGl32nmHlE0LpaJL71mMkP4d+QE5zWfNt50qheHtOZ0qoxVrsX5TUg== - dependencies: - "@babel/parser" "^7.9.4" - "@types/markdown-it" "^12.2.3" - bluebird "^3.7.2" - catharsis "^0.9.0" - escape-string-regexp "^2.0.0" - js2xmlparser "^4.0.2" - klaw "^3.0.0" - markdown-it "^12.3.2" - markdown-it-anchor "^8.4.1" - marked "^4.0.10" - mkdirp "^1.0.4" - requizzle "^0.2.3" - strip-json-comments "^3.1.0" - taffydb "2.6.2" - underscore "~1.13.2" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== - -json5@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -json5@^2.1.2, json5@^2.2.1: - version "2.2.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" - integrity sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw== - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz" - integrity sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g== - dependencies: - graceful-fs "^4.1.9" - -klona@^2.0.4: - version "2.0.5" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== - -known-css-properties@^0.25.0: - version "0.25.0" - resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.25.0.tgz" - integrity sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -linkify-it@^3.0.1: - version "3.0.3" - resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz" - integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== - dependencies: - uc.micro "^1.0.1" - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" - integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== - -lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -lower-case@^1.1.1: - version "1.1.4" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" - integrity sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA== - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lru-cache@^4.0.1: - version "4.1.5" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" - integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^2.0.0, make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" - integrity sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg== - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz" - integrity sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w== - dependencies: - object-visit "^1.0.0" - -markdown-it-anchor@^8.4.1: - version "8.6.5" - resolved "https://registry.npmjs.org/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz" - integrity sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ== - -markdown-it@^12.3.2: - version "12.3.2" - resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz" - integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== - dependencies: - argparse "^2.0.1" - entities "~2.1.0" - linkify-it "^3.0.1" - mdurl "^1.0.1" - uc.micro "^1.0.5" - -marked@^4.0.10: - version "4.1.0" - resolved "https://registry.npmjs.org/marked/-/marked-4.1.0.tgz" - integrity sha512-+Z6KDjSPa6/723PQYyc1axYZpYYpDnECDaU6hkaf5gqBieBkMKYReL5hteF2QizhlMbgbo8umXl/clZ67+GlsA== - -mathjax-full@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz" - integrity sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w== - dependencies: - esm "^3.2.25" - mhchemparser "^4.1.0" - mj-context-menu "^0.6.1" - speech-rule-engine "^4.0.6" - -mathjax@3: - version "3.2.2" - resolved "https://registry.yarnpkg.com/mathjax/-/mathjax-3.2.2.tgz#c754d7b46a679d7f3fa03543d6b8bf124ddf9f6b" - integrity sha512-Bt+SSVU8eBG27zChVewOicYs7Xsdt40qm4+UpHyX7k0/O9NliPc+x77k1/FEsPsjKPZGJvtRZM1vO+geW0OhGw== - -mathml-tag-names@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" - integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== - -mdurl@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -mhchemparser@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.1.1.tgz" - integrity sha512-R75CUN6O6e1t8bgailrF1qPq+HhVeFTM3XQ0uzI+mXTybmphy3b6h4NbLOYhemViQ3lUs+6CKRkC3Ws1TlYREA== - -micromatch@^3.1.10: - version "3.1.10" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.0, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.27, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz" - integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== - dependencies: - dom-walk "^0.1.0" - -min-indent@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" - integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== - -mini-css-extract-plugin@^2.6.0: - version "2.6.1" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz" - integrity sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg== - dependencies: - schema-utils "^4.0.0" - -minimatch@3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mj-context-menu@^0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz" - integrity sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA== - -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -module-alias@^2.2.2: - version "2.2.2" - resolved "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz" - integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== - -moment@^2.29.1: - version "2.29.4" - resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" - integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nanoid@^3.3.4: - version "3.3.4" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" - integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.5.0, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next-tick@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/next-tick/-/next-tick-0.2.2.tgz" - integrity sha512-f7h4svPtl+QidoBv4taKXUjJ70G2asaZ8G28nS0OkqaalX8dwwrtWtyxEDPK62AC00ur/+/E0pUwBwY5EPn15Q== - -ngstorage@^0.3.11: - version "0.3.11" - resolved "https://registry.npmjs.org/ngstorage/-/ngstorage-0.3.11.tgz" - integrity sha512-IXOcCZ/4f0bU24e0dIzzEJKz/8l00S0k8XXpnROC912iJDL3WQtdens50ayWtTI9EbXOeYhc7FCea4LzFG+WlQ== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-abi@^3.3.0: - version "3.24.0" - resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz" - integrity sha512-YPG3Co0luSu6GwOBsmIdGW6Wx0NyNDLg/hriIyDllVsNwnI6UeqaWShxC3lbH4LtEQUgoLP3XR1ndXiDAWvmRw== - dependencies: - semver "^7.3.5" - -node-addon-api@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz" - integrity sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA== - -node-bin-setup@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/node-bin-setup/-/node-bin-setup-1.1.0.tgz" - integrity sha512-pTeU6NgUrexiLNtd+AKwvg6cngHMvj5FZ5e2bbv2ogBSIc9yhkXSSaTScfSRZnwHIh5YFmYSYlemLWkiKD7rog== - -node-dir@^0.1.17: - version "0.1.17" - resolved "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz" - integrity sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg== - dependencies: - minimatch "^3.0.2" - -node-fetch@^2.6.0: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== - -node@^18.7.0: - version "18.9.0" - resolved "https://registry.npmjs.org/node/-/node-18.9.0.tgz" - integrity sha512-s+JrNt8qOeV2Uci4aYs7jsFSRXgko7jThozysqeZ2bJGp3PGaBKA+kpCCP+TDrg4TRcTLyw3bcHCJx9drxTQtQ== - dependencies: - node-bin-setup "^1.0.0" - -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz" - integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== - dependencies: - path-key "^2.0.0" - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz" - integrity sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ== - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz" - integrity sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA== - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.0, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz" - integrity sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ== - dependencies: - isobject "^3.0.1" - -object.values@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" - integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.1" - -on-headers@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^7.0.0: - version "7.4.2" - resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" - integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -param-case@^1.0.1: - version "1.1.2" - resolved "https://registry.npmjs.org/param-case/-/param-case-1.1.2.tgz" - integrity sha512-gksk6zeZQxwBm1AHsKh+XDFsTGf1LvdZSkkpSIkfDtzW+EQj/P2PBgNb3Cs0Y9Xxqmbciv2JZe3fWU6Xbher+Q== - dependencies: - sentence-case "^1.1.2" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-author@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/parse-author/-/parse-author-2.0.0.tgz" - integrity sha512-yx5DfvkN8JsHL2xk2Os9oTia467qnvRgey4ahSm2X8epehBLx/gWLcy5KI+Y36ful5DzGbCS6RazqZGgy1gHNw== - dependencies: - author-regex "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse5@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" - integrity sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== - -path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" - integrity sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg== - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" - integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-resolve-nested-selector@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz" - integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== - -postcss-safe-parser@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz" - integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== - -postcss-scss@^4.0.2: - version "4.0.5" - resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.5.tgz" - integrity sha512-F7xpB6TrXyqUh3GKdyB4Gkp3QL3DDW1+uI+gxx/oJnUt/qXI4trj5OGlp9rOKdoABGULuqtqeG+3HEVQk4DjmA== - -postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.6: - version "6.0.10" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz" - integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss@^8.2.14, postcss@^8.3.3, postcss@^8.4.16, postcss@^8.4.7: - version "8.4.16" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz" - integrity sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -preact@^7.2.0: - version "7.2.1" - resolved "https://registry.yarnpkg.com/preact/-/preact-7.2.1.tgz#159e1892f614985e49eb0a96fd6e6d8bdf8bbcc5" - integrity sha512-wl0cdALBv1M4CbOpT7FN6Hol5PjFsYxW32yDSLB5GHzQgEhZPXRL+IawQBzt5waO9jhgMmFcCMyprUqKaw5ZPw== - -prebuild-install@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" - integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== - dependencies: - detect-libc "^2.0.0" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^3.3.0" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^4.0.0" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.5.1: - version "2.7.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz" - integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -private@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz" - integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -rc@^1.0.1, rc@^1.1.6, rc@^1.2.7: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@^3.1.1, readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -recast@^0.18.1: - version "0.18.10" - resolved "https://registry.npmjs.org/recast/-/recast-0.18.10.tgz" - integrity sha512-XNvYvkfdAN9QewbrxeTOjgINkdY/odTgTS56ZNEWL9Ml0weT4T3sFtvnTuF+Gxyu46ANcRm1ntrF6F5LAJPAaQ== - dependencies: - ast-types "0.13.3" - esprima "~4.0.0" - private "^0.1.8" - source-map "~0.6.1" - -rechoir@^0.7.0: - version "0.7.1" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" - integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== - dependencies: - resolve "^1.9.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.4: - version "0.13.9" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz" - integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== - -regenerator-transform@^0.15.0: - version "0.15.0" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz" - integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg== - dependencies: - "@babel/runtime" "^7.8.4" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regex-parser@^2.2.11: - version "2.2.11" - resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" - integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== - -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -regexpu-core@^5.1.0: - version "5.2.1" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz" - integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ== - dependencies: - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.0.0" - -registry-auth-token@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" - integrity sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ== - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA== - dependencies: - rc "^1.0.1" - -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -replace-in-file@^6.3.2: - version "6.3.5" - resolved "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz" - integrity sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg== - dependencies: - chalk "^4.1.2" - glob "^7.2.0" - yargs "^17.2.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -requizzle@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/requizzle/-/requizzle-0.2.3.tgz" - integrity sha512-YanoyJjykPxGHii0fZP0uUPEXpvqfBDxWV7s6GKAiiOsiqhX6vHNyW3Qzdmqp/iq/ExbhaGbVrjB4ruEVSM4GQ== - dependencies: - lodash "^4.17.14" - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-url-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz" - integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== - dependencies: - adjust-sourcemap-loader "^4.0.0" - convert-source-map "^1.7.0" - loader-utils "^2.0.0" - postcss "^8.2.14" - source-map "0.6.1" - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" - integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== - -resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: - version "1.22.1" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== - dependencies: - is-core-module "^2.9.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^2.6.2: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@~2.6.2: - version "2.6.3" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== - dependencies: - glob "^7.1.3" - -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rx-lite@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz" - integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== - -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz" - integrity sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg== - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sass-loader@^12.6.0: - version "12.6.0" - resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" - integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== - dependencies: - klona "^2.0.4" - neo-async "^2.6.2" - -sass-migrator@^1.7.1: - version "1.7.1" - resolved "https://registry.npmjs.org/sass-migrator/-/sass-migrator-1.7.1.tgz" - integrity sha512-e40lWzdO+1yBDb9ev6v+suP0LReaHriC8ptpJtxODO+7y9iVni1yJDZUUPS5SRDrNdNAMTu/8IcKUuiz0f2XtQ== - -sass@^1.49.9: - version "1.54.9" - resolved "https://registry.npmjs.org/sass/-/sass-1.54.9.tgz" - integrity sha512-xb1hjASzEH+0L0WI9oFjqhRi51t/gagWnxLiwUNMltA0Ab6jIDkAacgKiGYKM9Jhy109osM7woEEai6SXeJo5Q== - dependencies: - chokidar ">=3.0.0 <4.0.0" - immutable "^4.0.0" - source-map-js ">=0.6.2 <2.0.0" - -sax@>=0.6.0: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz" - integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.8.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.0.0" - -"semver@2 || 3 || 4 || 5", semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: - version "7.3.7" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - -semver@^7.3.8: - version "7.3.8" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -sentence-case@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz" - integrity sha512-laa/UDTPXsrQnoN/Kc8ZO7gTeEjMsuPiDgUCk9N0iINRZvqAMCTXjGl8+tD27op1eF/JHbdUlEUmovDh6AX7sA== - dependencies: - lower-case "^1.1.1" - -serialize-javascript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz" - integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== - dependencies: - randombytes "^2.1.0" - -serve-handler@5.0.8: - version "5.0.8" - resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-5.0.8.tgz#790dbe340dabf1d61bdbaa02ea37dcab372377a8" - integrity sha512-pqk0SChbBLLHfMIxQ55czjdiW7tj2cFy53svvP8e5VqEN/uB/QpfiTJ8k1uIYeFTDVoi+FGi5aqXScuu88bymg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.0.4" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve@^10.1.2: - version "10.1.2" - resolved "https://registry.yarnpkg.com/serve/-/serve-10.1.2.tgz#805917f2692ed5d8720bbd1981ac3974d38b7d8d" - integrity sha512-TVH35uwndRlCqSeX3grR3Ntrjx2aBTeu6sx+zTD2CzN2N/rHuEDTvxiBwWbrellJNyWiQFz2xZmoW+UxV+Zahg== - dependencies: - "@zeit/schemas" "2.6.0" - ajv "6.5.3" - arg "2.0.0" - boxen "1.3.0" - chalk "2.4.1" - clipboardy "1.2.3" - compression "1.7.3" - serve-handler "5.0.8" - update-check "1.5.2" - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -sharp@^0.31.1: - version "0.31.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.31.3.tgz#60227edc5c2be90e7378a210466c99aefcf32688" - integrity sha512-XcR4+FCLBFKw1bdB+GEhnUNXNXvnt0tDo4WsBsraKymuo/IAuPuCBVAL2wIkUw2r/dwFW5Q5+g66Kwl2dgDFVg== - dependencies: - color "^4.2.3" - detect-libc "^2.0.1" - node-addon-api "^5.0.0" - prebuild-install "^7.1.1" - semver "^7.3.8" - simple-get "^4.0.1" - tar-fs "^2.1.1" - tunnel-agent "^0.6.0" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" - integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== - dependencies: - shebang-regex "^1.0.0" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^4.0.0, simple-get@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" - integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.16, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - -source-map@0.6.1, source-map@^0.6.0, source-map@~0.6.0, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== - -speech-rule-engine@^4.0.6: - version "4.0.7" - resolved "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz" - integrity sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g== - dependencies: - commander "9.2.0" - wicked-good-xpath "1.3.0" - xmldom-sre "0.1.31" - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz" - integrity sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g== - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -string-template@~0.2.0: - version "0.2.1" - resolved "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz" - integrity sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw== - -string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string.prototype.trimend@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" - integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string.prototype.trimstart@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" - integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.19.5" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-loader@^3.3.1: - version "3.3.1" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz" - integrity sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ== - -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz" - integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== - -stylelint-config-recommended-scss@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-7.0.0.tgz" - integrity sha512-rGz1J4rMAyJkvoJW4hZasuQBB7y9KIrShb20l9DVEKKZSEi1HAy0vuNlR8HyCKy/jveb/BdaQFcoiYnmx4HoiA== - dependencies: - postcss-scss "^4.0.2" - stylelint-config-recommended "^8.0.0" - stylelint-scss "^4.0.0" - -stylelint-config-recommended@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-8.0.0.tgz" - integrity sha512-IK6dWvE000+xBv9jbnHOnBq01gt6HGVB2ZTsot+QsMpe82doDQ9hvplxfv4YnpEuUwVGGd9y6nbaAnhrjcxhZQ== - -stylelint-config-recommended@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-9.0.0.tgz" - integrity sha512-9YQSrJq4NvvRuTbzDsWX3rrFOzOlYBmZP+o513BJN/yfEmGSr0AxdvrWs0P/ilSpVV/wisamAHu5XSk8Rcf4CQ== - -stylelint-config-standard-scss@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-5.0.0.tgz" - integrity sha512-zoXLibojHZYPFjtkc4STZtAJ2yGTq3Bb4MYO0oiyO6f/vNxDKRcSDZYoqN260Gv2eD5niQIr1/kr5SXlFj9kcQ== - dependencies: - stylelint-config-recommended-scss "^7.0.0" - stylelint-config-standard "^26.0.0" - -stylelint-config-standard@^26.0.0: - version "26.0.0" - resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-26.0.0.tgz" - integrity sha512-hUuB7LaaqM8abvkOO84wh5oYSkpXgTzHu2Zza6e7mY+aOmpNTjoFBRxSLlzY0uAOMWEFx0OMKzr+reG1BUtcqQ== - dependencies: - stylelint-config-recommended "^8.0.0" - -stylelint-config-standard@^28.0.0: - version "28.0.0" - resolved "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-28.0.0.tgz" - integrity sha512-q/StuowDdDmFCravzGHAwgS9pjX0bdOQUEBBDIkIWsQuYGgYz/xsO8CM6eepmIQ1fc5bKdDVimlJZ6MoOUcJ5Q== - dependencies: - stylelint-config-recommended "^9.0.0" - -stylelint-scss@^4.0.0: - version "4.3.0" - resolved "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.3.0.tgz" - integrity sha512-GvSaKCA3tipzZHoz+nNO7S02ZqOsdBzMiCx9poSmLlb3tdJlGddEX/8QzCOD8O7GQan9bjsvLMsO5xiw6IhhIQ== - dependencies: - lodash "^4.17.21" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.1" - postcss-selector-parser "^6.0.6" - postcss-value-parser "^4.1.0" - -stylelint@^14.13.0: - version "14.13.0" - resolved "https://registry.npmjs.org/stylelint/-/stylelint-14.13.0.tgz" - integrity sha512-NJSAdloiAB/jgVJKxMR90mWlctvmeBFGFVUvyKngi9+j/qPSJ5ZB+u8jOmGbLTnS7OHrII9NFGehPRyar8U5vg== - dependencies: - "@csstools/selector-specificity" "^2.0.2" - balanced-match "^2.0.0" - colord "^2.9.3" - cosmiconfig "^7.0.1" - css-functions-list "^3.1.0" - debug "^4.3.4" - fast-glob "^3.2.12" - fastest-levenshtein "^1.0.16" - file-entry-cache "^6.0.1" - global-modules "^2.0.0" - globby "^11.1.0" - globjoin "^0.1.4" - html-tags "^3.2.0" - ignore "^5.2.0" - import-lazy "^4.0.0" - imurmurhash "^0.1.4" - is-plain-object "^5.0.0" - known-css-properties "^0.25.0" - mathml-tag-names "^2.1.3" - meow "^9.0.0" - micromatch "^4.0.5" - normalize-path "^3.0.0" - picocolors "^1.0.0" - postcss "^8.4.16" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^6.0.0" - postcss-selector-parser "^6.0.10" - postcss-value-parser "^4.2.0" - resolve-from "^5.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - style-search "^0.1.0" - supports-hyperlinks "^2.3.0" - svg-tags "^1.0.0" - table "^6.8.0" - v8-compile-cache "^2.3.0" - write-file-atomic "^4.0.2" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-hyperlinks@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" - integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== - -synckit@^0.8.3: - version "0.8.4" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.4.tgz#0e6b392b73fafdafcde56692e3352500261d64ec" - integrity sha512-Dn2ZkzMdSX827QbowGbU/4yjWuvNaCoScLLoMo/yKbu+P4GBR6cRGKZH27k6a9bRzdqcyd1DE96pQtQ6uNkmyw== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.4.0" - -table@^6.8.0: - version "6.8.0" - resolved "https://registry.npmjs.org/table/-/table-6.8.0.tgz" - integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA== - dependencies: - ajv "^8.0.1" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.3" - strip-ansi "^6.0.1" - -taffydb@2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/taffydb/-/taffydb-2.6.2.tgz" - integrity sha512-y3JaeRSplks6NYQuCOj3ZFMO3j60rTwbuKCvZxsAraGYH2epusatvZ0baZYA01WsGqJBq/Dl6vOrMUJqyMj8kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== - dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" - -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -temp@^0.8.1: - version "0.8.4" - resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" - integrity sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg== - dependencies: - rimraf "~2.6.2" - -term-size@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz" - integrity sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ== - dependencies: - execa "^0.7.0" - -terser-webpack-plugin@^5.1.3: - version "5.3.6" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz" - integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.14" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" - -terser@^5.10.0, terser@^5.14.1: - version "5.15.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.15.0.tgz" - integrity sha512-L1BJiXVmheAQQy+as0oF3Pwtlo4s3Wi1X2zNZ2NxOB4wx9bdS9Vk67XQENLFdLYGCK/Z2di53mTj/hBafR+dTA== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" - integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== - -tiny-glob@^0.2.9: - version "0.2.9" - resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2" - integrity sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg== - dependencies: - globalyzer "0.1.0" - globrex "^0.1.2" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" - integrity sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg== - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" - integrity sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg== - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - -ts-loader@^9.2.8: - version "9.3.1" - resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.3.1.tgz" - integrity sha512-OkyShkcZTsTwyS3Kt7a4rsT/t2qvEVQuKCTg4LJmpj9fhFR7ukGdZwV6Qq3tRUkqcXtfGpPR7+hFKHCG/0d3Lw== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -tsconfig-paths@^3.14.1: - version "3.14.1" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" - integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.1" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" - integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" - integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== - dependencies: - safe-buffer "^5.0.1" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -type-fest@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.5.1.tgz#9555ae435f560c1b4447b70bdd195bb2c86c6c92" - integrity sha512-70T99cpILFk2fzwuljwWxmazSphFrdOe3gRHbp6bqs71pxFBbJwFqnmkLO2lQL6aLHxHmYAnP/sL+AJWpT70jA== - -typescript@^4.5.2, typescript@^4.6.2: - version "4.8.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz" - integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== - -uc.micro@^1.0.1, uc.micro@^1.0.5: - version "1.0.6" - resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" - integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== - -ui-router-visualizer@3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/ui-router-visualizer/-/ui-router-visualizer-3.1.3.tgz#dd3b8ff10f543886c01e27a5cd7c4a32fc291df2" - integrity sha512-NAAy27V6efm671tlY63/nuTwqSIRAs9gm6w3XUxYaSR+8SqpuhNdToqq2AX2yW4yR+RebI++Utu85BMGE2k6sA== - dependencies: - d3-hierarchy "^1.0.3" - d3-interpolate "^1.1.3" - preact "^7.2.0" - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -underscore@~1.13.2: - version "1.13.4" - resolved "https://registry.npmjs.org/underscore/-/underscore-1.13.4.tgz" - integrity sha512-BQFnUDuAQ4Yf/cYY5LNrK9NCJFKriaRbD9uR1fTeXnBeoa97W0i41qkZfGO9pSo8I5KzjAcSY2XYtdf0oKd7KQ== - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz" - integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" - integrity sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ== - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -update-browserslist-db@^1.0.9: - version "1.0.9" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz" - integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-check@1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/update-check/-/update-check-1.5.2.tgz#2fe09f725c543440b3d7dabe8971f2d5caaedc28" - integrity sha512-1TrmYLuLj/5ZovwUS7fFd1jMH3NnFDN1y1A8dboedIDt7zs/zJMo6TwwlhYKkSeEwzleeiSBV5/3c9ufAQWDaQ== - dependencies: - registry-auth-token "3.3.2" - registry-url "3.1.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" - integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg== - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -uuid@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" - integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -v8-compile-cache@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vdom-to-html@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/vdom-to-html/-/vdom-to-html-2.3.1.tgz" - integrity sha512-59821BQjYIdmpkBri2w6RktLmC/cDGSK0SrnpsW/Fr1V5iRVRbp+VIxhgvbl2uQV5gPVYC2lyYkf4OGrVhYf/A== - dependencies: - escape-html "^1.0.1" - param-case "^1.0.1" - xtend "^4.0.0" - -"virtual-dom@https://github.com/chhaymenghong/virtual-dom.git#master": - version "2.1.1" - resolved "git+ssh://git@github.com/chhaymenghong/virtual-dom.git#726bed0b12f607417b6ebb7e5111479bca91c63a" - dependencies: - browser-split "0.0.1" - error "^4.3.0" - ev-store "^7.0.0" - global "^4.3.0" - is-object "^1.0.1" - next-tick "^0.2.2" - x-is-array "0.1.0" - x-is-string "0.1.0" - -vue-jscodeshift-adapter@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/vue-jscodeshift-adapter/-/vue-jscodeshift-adapter-2.2.0.tgz" - integrity sha512-hC/eplyzKq68GbCmHKz9xFdiGvl0TSObGUX2SIVOZlcElaJXQiB/H7au5tg7wAcbqv7vDQvNERbtAf/kMsyVHA== - dependencies: - vue-sfc-descriptor-to-string "^1.0.0" - vue-template-compiler "^2.5.13" - -vue-sfc-descriptor-to-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/vue-sfc-descriptor-to-string/-/vue-sfc-descriptor-to-string-1.0.0.tgz" - integrity sha512-VYNMsrIPZQZau5Gk8IVtgonN1quOznP9/pLIF5m2c4R30KCDDe3NwthrsM7lSUY2K4lezcb8j3Wu8cQhBuZEMQ== - dependencies: - indent-string "^3.2.0" - -vue-template-compiler@^2.5.13: - version "2.7.10" - resolved "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.10.tgz" - integrity sha512-QO+8R9YRq1Gudm8ZMdo/lImZLJVUIAM8c07Vp84ojdDAf8HmPJc7XB556PcXV218k2AkKznsRz6xB5uOjAC4EQ== - dependencies: - de-indent "^1.0.2" - he "^1.2.0" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-cli@^4.10.0: - version "4.10.0" - resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" - integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^1.2.0" - "@webpack-cli/info" "^1.5.0" - "@webpack-cli/serve" "^1.7.0" - colorette "^2.0.14" - commander "^7.0.0" - cross-spawn "^7.0.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^2.2.0" - rechoir "^0.7.0" - webpack-merge "^5.7.3" - -webpack-merge@^5.7.3: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack-virtual-modules@^0.4.3: - version "0.4.4" - resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.4.tgz" - integrity sha512-h9atBP/bsZohWpHnr+2sic8Iecb60GxftXsWNLLLSqewgIsGzByd2gcIID4nXcG+3tNe4GQG3dLcff3kXupdRA== - -webpack@^5, webpack@^5.76.0: - version "5.76.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" - integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -wicked-good-xpath@1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz" - integrity sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw== - -widest-line@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz" - integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== - dependencies: - string-width "^2.1.1" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^2.3.0: - version "2.4.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz" - integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -x-is-array@0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/x-is-array/-/x-is-array-0.1.0.tgz" - integrity sha512-goHPif61oNrr0jJgsXRfc8oqtYzvfiMJpTqwE7Z4y9uH+T3UozkGqQ4d2nX9mB9khvA8U2o/UbPOFjgC7hLWIA== - -x-is-string@0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz" - integrity sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w== - -xml2js@^0.4.23: - version "0.4.23" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - -xmlcreate@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz" - integrity sha512-nquOebG4sngPmGPICTS5EnxqhKbCmz5Ox5hsszI2T6U5qdrJizBc+0ilYSEjTSzU0yZcmvppztXe/5Al5fUwdg== - -xmldom-sre@0.1.31: - version "0.1.31" - resolved "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz" - integrity sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw== - -xtend@^4.0.0, xtend@~4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.0.0: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^17.2.1: - version "17.5.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz" - integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.0.0" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + "ansi-regex" "1.1.1" + +"strip-ansi@5.2.0": + "integrity" "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==" + "resolved" "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" + "version" "5.2.0" + dependencies: + "ansi-regex" "4.1.1" + +"strip-bom@2.0.0": + "integrity" "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==" + "resolved" "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + "version" "2.0.0" + dependencies: + "is-utf8" "0.2.1" + +"strip-final-newline@^2.0.0": + "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + "version" "2.0.0" + +"strip-indent@1.0.1": + "integrity" "sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==" + "resolved" "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "get-stdin" "4.0.1" + +"strip-json-comments@~2.0.1": + "integrity" "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + "version" "2.0.1" + +"strip-json-comments@1.0.4": + "integrity" "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==" + "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz" + "version" "1.0.4" + +"supports-color@^2.0.0": + "integrity" "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "version" "2.0.0" + +"supports-color@0.2.0": + "integrity" "sha512-tdCZ28MnM7k7cJDJc7Eq80A9CsRFAAOZUy41npOZCs++qSjfIy7o5Rh46CBk+Dk5FbKJ33X3Tqg4YrV07N5RaA==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + "version" "0.2.0" + +"supports-color@2.0.0": + "integrity" "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + "version" "2.0.0" + +"supports-color@5.5.0": + "integrity" "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "version" "5.5.0" + dependencies: + "has-flag" "3.0.0" + +"supports-color@7.2.0": + "integrity" "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==" + "resolved" "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + "version" "7.2.0" + dependencies: + "has-flag" "4.0.0" + +"supports-preserve-symlinks-flag@1.0.0": + "integrity" "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + "resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + "version" "1.0.0" + +"swap-case@1.1.2": + "integrity" "sha512-BAmWG6/bx8syfc6qXPprof3Mn5vQgf5dwdUNJhsNqU9WdPt5P+ES/wQ5bxfijy8zwZgZZHslC3iAsxsuQMCzJQ==" + "resolved" "https://registry.npmjs.org/swap-case/-/swap-case-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "lower-case" "1.1.4" + "upper-case" "1.1.3" + +"tar-fs@0.5.2": + "integrity" "sha512-MqmfOi0c4YcprB8WfyE2nKZPE//2253LQueyliGfZ6Hy9L6N4QM9zJNXXSSmp+PfdljyAkHB30Vapm0aFa6G2g==" + "resolved" "https://registry.npmjs.org/tar-fs/-/tar-fs-0.5.2.tgz" + "version" "0.5.2" + dependencies: + "mkdirp" "0.5.6" + "pump" "0.3.5" + "tar-stream" "0.4.7" + +"tar-stream@0.4.7": + "integrity" "sha512-8/A2iGloynV8Q0cb43ez+aK1PEYWueUr4yPrenbwOJR3Y63VjaIPIravWB6VcYAz4jQfzr4TLX8i3/tDhkzPRw==" + "resolved" "https://registry.npmjs.org/tar-stream/-/tar-stream-0.4.7.tgz" + "version" "0.4.7" + dependencies: + "bl" "0.9.5" + "end-of-stream" "1.4.4" + "readable-stream" "1.1.14" + "xtend" "4.0.2" + +"tar@2.2.2": + "integrity" "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==" + "resolved" "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz" + "version" "2.2.2" + dependencies: + "block-stream" "0.0.9" + "fstream" "1.0.12" + "inherits" "2.0.4" + +"terser@^5.10.0": + "integrity" "sha512-pQzJ9UJzM0IgmT4FAtYI6+VqFf0lj/to58AV0Xfgg0Up37RyPG7Al+1cepC6/BVuAxR9oNb41/DL4DEoHJvTdg==" + "resolved" "https://registry.npmjs.org/terser/-/terser-5.19.3.tgz" + "version" "5.19.3" + dependencies: + "@jridgewell/source-map" "0.3.5" + "acorn" "8.10.0" + "commander" "2.20.3" + "source-map-support" "0.5.21" + +"text-table@0.2.0": + "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + "version" "0.2.0" + +"throttleit@0.0.2": + "integrity" "sha512-HtlTFeyYs1elDM2txiIGsdXHaq8kffVaZH/QEBRbo95zQqzlsBx5ELKhkPOZVad9OK9oxzwx6UrQN8Vfh/+yag==" + "resolved" "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz" + "version" "0.0.2" + +"throttleit@1.0.0": + "integrity" "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==" + "resolved" "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz" + "version" "1.0.0" + +"through@2.3.8": + "integrity" "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + "resolved" "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + "version" "2.3.8" + +"through2@2.0.5": + "integrity" "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==" + "resolved" "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + "version" "2.0.5" + dependencies: + "readable-stream" "2.3.8" + "xtend" "4.0.2" + +"time-grunt@^1.4.0": + "integrity" "sha512-u8n+ZOcdNDkrqlyN+x1ayHN0X+hMgg3SS191EE5xO03nRVnVpNp3UJSmUBCQCAbe959LqWttMaELNclfmWM+fQ==" + "resolved" "https://registry.npmjs.org/time-grunt/-/time-grunt-1.4.0.tgz" + "version" "1.4.0" + dependencies: + "chalk" "1.1.3" + "date-time" "1.1.0" + "figures" "1.7.0" + "hooker" "0.2.3" + "number-is-nan" "1.0.1" + "pretty-ms" "2.1.0" + "text-table" "0.2.0" + +"time-zone@0.1.0": + "integrity" "sha512-S5CjtVIkeBTnlsaZP3gjsTb78ClBe74sEcgEoBwAVUKnTRDAGqUtLLIZHMsIyqOWjt9DGQpLMMoD8ZKIfP2ddQ==" + "resolved" "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz" + "version" "0.1.0" + +"timers-ext@0.1.7": + "integrity" "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==" + "resolved" "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz" + "version" "0.1.7" + dependencies: + "es5-ext" "0.10.62" + "next-tick" "1.1.0" + +"tiny-lr@1.1.1": + "integrity" "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==" + "resolved" "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "body" "5.1.0" + "debug" "3.2.7" + "faye-websocket" "0.10.0" + "livereload-js" "2.4.0" + "object-assign" "4.1.1" + "qs" "6.11.2" + +"title-case@2.1.1": + "integrity" "sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==" + "resolved" "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "no-case" "2.3.2" + "upper-case" "1.1.3" + +"tmp@0.0.23": + "integrity" "sha512-zR0TtNGw3OoChmmzHNnMVh6LRY7fCkxXnHOEI9/CZE5zn6TzZbyMknZdmQZzD0EhcQVT/9rZHeg1KqiqfAC5jw==" + "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.23.tgz" + "version" "0.0.23" + +"tmp@0.0.24": + "integrity" "sha512-z6TbUngjp7wMWIKNeUTuA24oRTW+HGCN7LlBgUPfNzCv5J/JsLsuF/qBh6tCUS2+ALGQ/4U5W4L4yUk7qIFWrg==" + "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.24.tgz" + "version" "0.0.24" + +"tmp@0.0.30": + "integrity" "sha512-HXdTB7lvMwcb55XFfrTM8CPr/IYREk4hVBFaQ4b/6nInrluSL86hfHm7vu0luYKCfyBZp2trCjpc8caC3vVM3w==" + "resolved" "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz" + "version" "0.0.30" + dependencies: + "os-tmpdir" "1.0.2" + +"to-fast-properties@1.0.3": + "integrity" "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==" + "resolved" "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" + "version" "1.0.3" + +"to-object-path@0.3.0": + "integrity" "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==" + "resolved" "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz" + "version" "0.3.0" + dependencies: + "kind-of" "3.2.2" + +"to-regex-range@2.1.1": + "integrity" "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + "version" "2.1.1" + dependencies: + "is-number" "3.0.0" + "repeat-string" "1.6.1" + +"to-regex-range@5.0.1": + "integrity" "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==" + "resolved" "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + "version" "5.0.1" + dependencies: + "is-number" "7.0.0" + +"to-regex@3.0.2": + "integrity" "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==" + "resolved" "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz" + "version" "3.0.2" + dependencies: + "define-property" "2.0.2" + "extend-shallow" "3.0.2" + "regex-not" "1.0.2" + "safe-regex" "1.1.0" + +"toidentifier@1.0.1": + "integrity" "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + "resolved" "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + "version" "1.0.1" + +"token-stream@0.0.1": + "integrity" "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==" + "resolved" "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz" + "version" "0.0.1" + +"touch@0.0.2": + "integrity" "sha512-JUyt3LWZRqkmKH0paN3IqVqhLV11FuXMz0c+/OZED9Abs+sFxSdtgBLknwqZmicSBtue+RGX4jXvbCIjipDMCA==" + "resolved" "https://registry.npmjs.org/touch/-/touch-0.0.2.tgz" + "version" "0.0.2" + dependencies: + "nopt" "1.0.10" + +"tough-cookie@0.12.1": + "integrity" "sha512-+gd4PklNJsxzu1NoNjhGRfOZZ5llND6VtQZGuaDXdmI0Ii79V5+YCa2sLx8Q6lYhYN2+9frCzUwOLQpuwHvO4Q==" + "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-0.12.1.tgz" + "version" "0.12.1" + dependencies: + "punycode" "2.3.0" + +"tough-cookie@2.5.0": + "integrity" "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==" + "resolved" "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz" + "version" "2.5.0" + dependencies: + "psl" "1.9.0" + "punycode" "2.3.0" + +"traverse@0.3.9": + "integrity" "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + "resolved" "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz" + "version" "0.3.9" + +"trim-newlines@1.0.0": + "integrity" "sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==" + "resolved" "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz" + "version" "1.0.0" + +"true-case-path@1.0.3": + "integrity" "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==" + "resolved" "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz" + "version" "1.0.3" + dependencies: + "glob" "7.1.7" + +"tunnel-agent@0.4.3": + "integrity" "sha512-e0IoVDWx8SDHc/hwFTqJDQ7CCDTEeGhmcT9jkWJjoGQSpgBz20nAMr80E3Tpk7PatJ1b37DQDgJR3CNSzcMOZQ==" + "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz" + "version" "0.4.3" + +"tunnel-agent@0.6.0": + "integrity" "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==" + "resolved" "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + "version" "0.6.0" + dependencies: + "safe-buffer" "5.1.2" + +"tweetnacl@0.14.5": + "integrity" "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + "resolved" "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + "version" "0.14.5" + +"type-fest@^2.13.0": + "integrity" "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" + "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" + "version" "2.19.0" + +"type@1.2.0": + "integrity" "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + "resolved" "https://registry.npmjs.org/type/-/type-1.2.0.tgz" + "version" "1.2.0" + +"type@2.7.2": + "integrity" "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + "resolved" "https://registry.npmjs.org/type/-/type-2.7.2.tgz" + "version" "2.7.2" + +"typedarray@0.0.6": + "integrity" "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "resolved" "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" + "version" "0.0.6" + +"uglify-js@2.3.6": + "integrity" "sha512-T2LWWydxf5+Btpb0S/Gg/yKFmYjnX9jtQ4mdN9YRq73BhN21EhU0Dvw3wYDLqd3TooGUJlCKf3Gfyjjy/RTcWA==" + "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz" + "version" "2.3.6" + dependencies: + "async" "0.2.10" + "optimist" "0.3.7" + "source-map" "0.1.43" + +"uglify-js@2.7.5": + "integrity" "sha512-RvbIYn4DIadCg1MV7YP7OrpxnVrtEieZzbK0KSQvwWGAHojqWJxInkQhmtYGRo9PTwwkJkljIgzMyA1VitEc4Q==" + "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz" + "version" "2.7.5" + dependencies: + "async" "0.2.10" + "source-map" "0.5.7" + "uglify-to-browserify" "1.0.2" + "yargs" "3.10.0" + +"uglify-js@2.8.29": + "integrity" "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==" + "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" + "version" "2.8.29" + dependencies: + "source-map" "0.5.7" + "uglify-to-browserify" "1.0.2" + "yargs" "3.10.0" + +"uglify-js@3.17.4": + "integrity" "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==" + "resolved" "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz" + "version" "3.17.4" + +"uglify-to-browserify@1.0.2": + "integrity" "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==" + "resolved" "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz" + "version" "1.0.2" + +"uid-number@0.0.5": + "integrity" "sha512-ZiLtQrdrFvWVXW5wickjtHiyOkn+cG74B0r33DQ2vJuz12FsFO7dU2q0dumrrYk6ny4wl2Vjsodpxk0+Z10/rA==" + "resolved" "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz" + "version" "0.0.5" + +"ultron@1.0.2": + "integrity" "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==" + "resolved" "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz" + "version" "1.0.2" + +"unc-path-regex@0.1.2": + "integrity" "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==" + "resolved" "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz" + "version" "0.1.2" + +"underscore.string@2.3.3": + "integrity" "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==" + "resolved" "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + "version" "2.3.3" + +"underscore.string@3.3.6": + "integrity" "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==" + "resolved" "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz" + "version" "3.3.6" + dependencies: + "sprintf-js" "1.1.2" + "util-deprecate" "1.0.2" + +"union-value@1.0.1": + "integrity" "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==" + "resolved" "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "arr-union" "3.1.0" + "get-value" "2.0.6" + "is-extendable" "0.1.1" + "set-value" "2.0.1" + +"universalify@0.1.2": + "integrity" "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + "resolved" "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" + "version" "0.1.2" + +"unpipe@1.0.0": + "integrity" "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + "resolved" "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + "version" "1.0.0" + +"unset-value@1.0.0": + "integrity" "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==" + "resolved" "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "has-value" "0.3.1" + "isobject" "3.0.1" + +"untildify@2.1.0": + "integrity" "sha512-sJjbDp2GodvkB0FZZcn7k6afVisqX5BZD7Yq3xp4nN2O15BBK0cLm3Vwn2vQaF7UDS0UUsrQMkkplmDI5fskig==" + "resolved" "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz" + "version" "2.1.0" + dependencies: + "os-homedir" "1.0.2" + +"upath@0.2.0": + "integrity" "sha512-Cy5aaZvwbMdU9Hik7SLGQZsZJY/6AJOQ2ORc4XCWa1TCIvhRk46qDEB+HW8JVDnYBrtVvUX4AKWBH/LuyminAw==" + "resolved" "https://registry.npmjs.org/upath/-/upath-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "lodash" "3.10.1" + "underscore.string" "2.3.3" + +"update-check@1.5.4": + "integrity" "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==" + "resolved" "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz" + "version" "1.5.4" + dependencies: + "registry-auth-token" "3.3.2" + "registry-url" "3.1.0" + +"update-notifier@0.2.0": + "integrity" "sha512-F1Z9wSB3q0a0MAHcfM68LpVjszoc1wVRV7mE0l/vWzoSZv0AcVCfZiLsV5olMXy6jThwu/ZOQyXFIYmq+78Arg==" + "resolved" "https://registry.npmjs.org/update-notifier/-/update-notifier-0.2.0.tgz" + "version" "0.2.0" + dependencies: + "chalk" "0.5.1" + "configstore" "0.3.2" + "latest-version" "0.2.0" + "semver-diff" "0.1.0" + "string-length" "0.1.2" + +"upper-case-first@1.1.2": + "integrity" "sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==" + "resolved" "https://registry.npmjs.org/upper-case-first/-/upper-case-first-1.1.2.tgz" + "version" "1.1.2" + dependencies: + "upper-case" "1.1.3" + +"upper-case@1.1.3": + "integrity" "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==" + "resolved" "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" + "version" "1.1.3" + +"uri-js@^4.2.2", "uri-js@4.4.1": + "integrity" "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==" + "resolved" "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + "version" "4.4.1" + dependencies: + "punycode" "2.3.0" + +"uri-path@1.0.0": + "integrity" "sha512-8pMuAn4KacYdGMkFaoQARicp4HSw24/DHOVKWqVRJ8LhhAwPPFpdGvdL9184JVmUwe7vz7Z9n6IqI6t5n2ELdg==" + "resolved" "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz" + "version" "1.0.0" + +"urix@0.1.0": + "integrity" "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + "resolved" "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + "version" "0.1.0" + +"use@3.1.1": + "integrity" "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + "resolved" "https://registry.npmjs.org/use/-/use-3.1.1.tgz" + "version" "3.1.1" + +"user-home@1.1.1": + "integrity" "sha512-aggiKfEEubv3UwRNqTzLInZpAOmKzwdHqEBmW/hBA/mt99eg+b4VrX6i+IRLxU8+WJYfa33rGwRseg4eElUgsQ==" + "resolved" "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz" + "version" "1.1.1" + +"util-deprecate@1.0.2": + "integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + "version" "1.0.2" + +"utils-merge@1.0.1": + "integrity" "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + "resolved" "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + "version" "1.0.1" + +"uuid@2.0.3": + "integrity" "sha512-FULf7fayPdpASncVy4DLh3xydlXEJJpvIELjYjNeQWYUZ9pclcpvCZSr2gkmN2FrrGcI7G/cJsIEwk5/8vfXpg==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz" + "version" "2.0.3" + +"uuid@3.4.0": + "integrity" "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + "resolved" "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz" + "version" "3.4.0" + +"v8flags@3.2.0": + "integrity" "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==" + "resolved" "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz" + "version" "3.2.0" + dependencies: + "homedir-polyfill" "1.0.3" + +"validate-npm-package-license@3.0.4": + "integrity" "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==" + "resolved" "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + "version" "3.0.4" + dependencies: + "spdx-correct" "3.2.0" + "spdx-expression-parse" "3.0.1" + +"vary@1.1.2": + "integrity" "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + "resolved" "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + "version" "1.1.2" + +"verror@1.10.0": + "integrity" "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==" + "resolved" "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + "version" "1.10.0" + dependencies: + "assert-plus" "1.0.0" + "core-util-is" "1.0.2" + "extsprintf" "1.3.0" + +"void-elements@2.0.1": + "integrity" "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==" + "resolved" "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz" + "version" "2.0.1" + +"webdriver-js-extender@1.0.0": + "integrity" "sha512-fG8GxPsSj9JDPGcHP0A1XTrUT1uRFbD8U7W9qA169fYJ2Hanvn/n8w4QWXvun1cNU7dZuvRjcLbuPoVqLWsylw==" + "resolved" "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-1.0.0.tgz" + "version" "1.0.0" + dependencies: + "@types/selenium-webdriver" "2.53.50" + "selenium-webdriver" "2.53.3" + +"webdriver-manager@12.1.9": + "integrity" "sha512-Yl113uKm8z4m/KMUVWHq1Sjtla2uxEBtx2Ue3AmIlnlPAKloDn/Lvmy6pqWCUersVISpdMeVpAaGbNnvMuT2LQ==" + "resolved" "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.9.tgz" + "version" "12.1.9" + dependencies: + "adm-zip" "^0.5.2" + "chalk" "^1.1.1" + "del" "^2.2.0" + "glob" "^7.0.3" + "ini" "^1.3.4" + "minimist" "^1.2.0" + "q" "^1.4.1" + "request" "^2.87.0" + "rimraf" "^2.5.2" + "semver" "^5.3.0" + "xml2js" "^0.4.17" + +"websocket-driver@0.7.4": + "integrity" "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==" + "resolved" "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + "version" "0.7.4" + dependencies: + "http-parser-js" "0.5.8" + "safe-buffer" "5.1.2" + "websocket-extensions" "0.1.4" + +"websocket-extensions@0.1.4": + "integrity" "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + "resolved" "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + "version" "0.1.4" + +"which-module@2.0.1": + "integrity" "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==" + "resolved" "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz" + "version" "2.0.1" + +"which@^2.0.1": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "^2.0.0" + +"which@1.0.9": + "integrity" "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==" + "resolved" "https://registry.npmjs.org/which/-/which-1.0.9.tgz" + "version" "1.0.9" + +"which@1.3.1": + "integrity" "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==" + "resolved" "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + "version" "1.3.1" + dependencies: + "isexe" "2.0.0" + +"which@2.0.2": + "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==" + "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + "version" "2.0.2" + dependencies: + "isexe" "2.0.0" + +"wide-align@1.1.5": + "integrity" "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==" + "resolved" "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz" + "version" "1.1.5" + dependencies: + "string-width" "1.0.2" + +"widest-line@^4.0.1": + "integrity" "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==" + "resolved" "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" + "version" "4.0.1" + dependencies: + "string-width" "^5.0.1" + +"win-release@1.1.1": + "integrity" "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==" + "resolved" "https://registry.npmjs.org/win-release/-/win-release-1.1.1.tgz" + "version" "1.1.1" + dependencies: + "semver" "5.7.2" + +"window-size@0.1.0": + "integrity" "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==" + "resolved" "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + "version" "0.1.0" + +"wiredep-cli@0.1.0": + "integrity" "sha512-Gayaqg8UXk5qPH0MuVP35m7h9GvvCE8XJd1AeXOFgjHxxowhjyfeKSd4BNBsbPAy5kRQ1c5A4tJKcNV8LiE6jw==" + "resolved" "https://registry.npmjs.org/wiredep-cli/-/wiredep-cli-0.1.0.tgz" + "version" "0.1.0" + dependencies: + "chalk" "1.1.3" + "minimist" "1.2.8" + "wiredep" "4.0.0" + +"wiredep@4.0.0": + "integrity" "sha512-w4QDvO5bgcpOBHFBCEH4oKKcMBTeG2pMEzkLSAhjKZ0X6+yb1dAS3vUEtjjz6Rg1M3ox3PG6BSCFZJEQh+TF8w==" + "resolved" "https://registry.npmjs.org/wiredep/-/wiredep-4.0.0.tgz" + "version" "4.0.0" + dependencies: + "bower-config" "1.4.3" + "glob" "7.1.7" + "lodash" "4.17.21" + "propprop" "0.3.1" + "through2" "2.0.5" + "wiredep-cli" "0.1.0" + +"with@5.1.1": + "integrity" "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==" + "resolved" "https://registry.npmjs.org/with/-/with-5.1.1.tgz" + "version" "5.1.1" + dependencies: + "acorn" "3.3.0" + "acorn-globals" "3.1.0" + +"wordwrap@0.0.2": + "integrity" "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==" + "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + "version" "0.0.2" + +"wordwrap@0.0.3": + "integrity" "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==" + "resolved" "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + "version" "0.0.3" + +"wrap-ansi@^8.0.1": + "integrity" "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + "version" "8.1.0" + dependencies: + "ansi-styles" "^6.1.0" + "string-width" "^5.0.1" + "strip-ansi" "^7.0.1" + +"wrap-ansi@5.1.0": + "integrity" "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==" + "resolved" "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz" + "version" "5.1.0" + dependencies: + "ansi-styles" "3.2.1" + "string-width" "3.1.0" + "strip-ansi" "5.2.0" + +"wrappy@1.0.2": + "integrity" "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "resolved" "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + "version" "1.0.2" + +"ws@1.1.5": + "integrity" "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==" + "resolved" "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz" + "version" "1.1.5" + dependencies: + "options" "0.0.6" + "ultron" "1.0.2" + +"xdg-basedir@1.0.1": + "integrity" "sha512-ugGW++yvGoxr4IrSoxsieH2b/NlZbXsBaL85Off3z487yS9eiiRjrfdkBw1iBvzv/SK0XjjYy+KBix5PIseOtQ==" + "resolved" "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-1.0.1.tgz" + "version" "1.0.1" + dependencies: + "user-home" "1.1.1" + +"xml-char-classes@1.0.0": + "integrity" "sha512-dTaaRwm4ccF8UF15/PLT3pNNlZP04qko/FUcr0QBppYLk8+J7xA9gg2vI2X4Kr1PcJAVxwI9NdADex29FX2QVQ==" + "resolved" "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz" + "version" "1.0.0" + +"xml2js@^0.4.17", "xml2js@0.4.23": + "integrity" "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==" + "resolved" "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" + "version" "0.4.23" + dependencies: + "sax" "1.2.4" + "xmlbuilder" "11.0.1" + +"xml2js@0.4.4": + "integrity" "sha512-9ERdxLOo4EazMDHAS/vsuZiTXIMur6ydcRfzGrFVJ4qM78zD3ohUgPJC7NYpGwd5rnS0ufSydMJClh6jyH+V0w==" + "resolved" "https://registry.npmjs.org/xml2js/-/xml2js-0.4.4.tgz" + "version" "0.4.4" + dependencies: + "sax" "0.6.1" + "xmlbuilder" "11.0.1" + +"xmlbuilder@11.0.1": + "integrity" "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + "resolved" "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + "version" "11.0.1" + +"xmlbuilder@8.2.2": + "integrity" "sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==" + "resolved" "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz" + "version" "8.2.2" + +"xmlhttprequest@1.8.0": + "integrity" "sha512-58Im/U0mlVBLM38NdZjHyhuMtCqa61469k2YP/AaPbvCoV9aQGUpbJBj1QRm2ytRiVQBD/fsw7L2bJGDVQswBA==" + "resolved" "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz" + "version" "1.8.0" + +"xtend@4.0.2": + "integrity" "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + "resolved" "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + "version" "4.0.2" + +"y18n@4.0.3": + "integrity" "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + "resolved" "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz" + "version" "4.0.3" + +"yallist@2.1.2": + "integrity" "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" + "resolved" "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + "version" "2.1.2" + +"yargs-parser@13.1.2": + "integrity" "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==" + "resolved" "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz" + "version" "13.1.2" + dependencies: + "camelcase" "5.3.1" + "decamelize" "1.2.0" + +"yargs@13.3.2": + "integrity" "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz" + "version" "13.3.2" + dependencies: + "cliui" "5.0.0" + "find-up" "3.0.0" + "get-caller-file" "2.0.5" + "require-directory" "2.1.1" + "require-main-filename" "2.0.0" + "set-blocking" "2.0.0" + "string-width" "3.1.0" + "which-module" "2.0.1" + "y18n" "4.0.3" + "yargs-parser" "13.1.2" + +"yargs@3.10.0": + "integrity" "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==" + "resolved" "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + "version" "3.10.0" + dependencies: + "camelcase" "1.2.1" + "cliui" "2.1.0" + "decamelize" "1.2.0" + "window-size" "0.1.0" + +"yauzl@2.10.0": + "integrity" "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==" + "resolved" "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + "version" "2.10.0" + dependencies: + "buffer-crc32" "0.2.13" + "fd-slicer" "1.1.0"