fix(core): update
This commit is contained in:
		@@ -26,6 +26,7 @@ mirror:
 | 
			
		||||
snyk:
 | 
			
		||||
  stage: security
 | 
			
		||||
  script:
 | 
			
		||||
    - npmci npm prepare
 | 
			
		||||
    - npmci command npm install -g snyk
 | 
			
		||||
    - npmci command npm install --ignore-scripts
 | 
			
		||||
    - npmci command snyk test
 | 
			
		||||
@@ -33,24 +34,39 @@ snyk:
 | 
			
		||||
  - docker
 | 
			
		||||
  - notpriv
 | 
			
		||||
 | 
			
		||||
sast:
 | 
			
		||||
  stage: security
 | 
			
		||||
  image: registry.gitlab.com/hosttoday/ht-docker-dbase:npmci
 | 
			
		||||
  variables:
 | 
			
		||||
    DOCKER_DRIVER: overlay2
 | 
			
		||||
  allow_failure: true
 | 
			
		||||
  services:
 | 
			
		||||
    - docker:stable-dind
 | 
			
		||||
  script:
 | 
			
		||||
    - npmci npm prepare
 | 
			
		||||
    - npmci npm install
 | 
			
		||||
    - npmci command npm run build
 | 
			
		||||
    - export SP_VERSION=$(echo "$CI_SERVER_VERSION" | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1-\2-stable/')
 | 
			
		||||
    - docker run
 | 
			
		||||
        --env SAST_CONFIDENCE_LEVEL="${SAST_CONFIDENCE_LEVEL:-3}"
 | 
			
		||||
        --volume "$PWD:/code"
 | 
			
		||||
        --volume /var/run/docker.sock:/var/run/docker.sock
 | 
			
		||||
        "registry.gitlab.com/gitlab-org/security-products/sast:$SP_VERSION" /app/bin/run /code
 | 
			
		||||
  artifacts:
 | 
			
		||||
    reports:
 | 
			
		||||
      sast: gl-sast-report.json
 | 
			
		||||
  tags:
 | 
			
		||||
  - docker
 | 
			
		||||
  - priv
 | 
			
		||||
 | 
			
		||||
# ====================
 | 
			
		||||
# test stage
 | 
			
		||||
# ====================
 | 
			
		||||
testLEGACY:
 | 
			
		||||
  stage: test
 | 
			
		||||
  script:
 | 
			
		||||
  - npmci node install legacy
 | 
			
		||||
  - npmci npm install
 | 
			
		||||
  - npmci npm test
 | 
			
		||||
  coverage: /\d+.?\d+?\%\s*coverage/
 | 
			
		||||
  tags:
 | 
			
		||||
  - docker
 | 
			
		||||
  - notpriv
 | 
			
		||||
  allow_failure: true
 | 
			
		||||
 | 
			
		||||
testLTS:
 | 
			
		||||
  stage: test
 | 
			
		||||
  script:
 | 
			
		||||
  - npmci npm prepare
 | 
			
		||||
  - npmci node install lts
 | 
			
		||||
  - npmci npm install
 | 
			
		||||
  - npmci npm test
 | 
			
		||||
@@ -62,6 +78,7 @@ testLTS:
 | 
			
		||||
testSTABLE:
 | 
			
		||||
  stage: test
 | 
			
		||||
  script:
 | 
			
		||||
  - npmci npm prepare
 | 
			
		||||
  - npmci node install stable
 | 
			
		||||
  - npmci npm install
 | 
			
		||||
  - npmci npm test
 | 
			
		||||
@@ -118,6 +135,7 @@ pages:
 | 
			
		||||
  stage: metadata
 | 
			
		||||
  script:
 | 
			
		||||
    - npmci command npm install -g typedoc typescript
 | 
			
		||||
    - npmci npm prepare
 | 
			
		||||
    - npmci npm install
 | 
			
		||||
    - npmci command typedoc --module "commonjs" --target "ES2016" --out public/ ts/
 | 
			
		||||
  tags:
 | 
			
		||||
@@ -130,13 +148,3 @@ pages:
 | 
			
		||||
    paths:
 | 
			
		||||
    - public
 | 
			
		||||
  allow_failure: true
 | 
			
		||||
 | 
			
		||||
windowsCompatibility:
 | 
			
		||||
  image: stefanscherer/node-windows:10-build-tools
 | 
			
		||||
  stage: metadata
 | 
			
		||||
  script:
 | 
			
		||||
  - npm install & npm test
 | 
			
		||||
  coverage: /\d+.?\d+?\%\s*coverage/
 | 
			
		||||
  tags:
 | 
			
		||||
  - windows
 | 
			
		||||
  allow_failure: true
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										218
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										218
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,5 +1,5 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "qenv",
 | 
			
		||||
  "name": "@pushrocks/qenv",
 | 
			
		||||
  "version": "2.0.2",
 | 
			
		||||
  "lockfileVersion": 1,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
@@ -157,19 +157,17 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@pushrocks/smartlog": {
 | 
			
		||||
      "version": "2.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@pushrocks/smartlog/-/smartlog-2.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-GtsDTGIUF3VuWPyF8FV5dF31ZCEIcaJ56ZlvJsWxjnyJq57X25mk5/K0QAaRE9IIeHg6fORcukFomb5C+AOQrg==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "version": "2.0.9",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog/-/smartlog-2.0.9.tgz",
 | 
			
		||||
      "integrity": "sha512-F2u3O8OOQ7QXgg9o0lI7HnqEhSQZo2A8u0EuNbQH+Kj2oL62xDwjAg6KkINwH7ObSWpaldZ+I28prG0JxaRzvg==",
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "@pushrocks/smartlog-interfaces": "^1.0.9"
 | 
			
		||||
        "@pushrocks/smartlog-interfaces": "^2.0.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "@pushrocks/smartlog-interfaces": {
 | 
			
		||||
      "version": "1.0.9",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/@pushrocks/smartlog-interfaces/-/smartlog-interfaces-1.0.9.tgz",
 | 
			
		||||
      "integrity": "sha512-0qwpomrRN0kFjmhR9m1iHYXoISoNuXtRP0Wr+JtkYyURLwKHMaW8Xoznf8MzXJptRfqufJi3Fxh5HodpPrIZUA==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
      "version": "2.0.5",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/@pushrocks%2fsmartlog-interfaces/-/smartlog-interfaces-2.0.5.tgz",
 | 
			
		||||
      "integrity": "sha512-eLNlRpDwy3E+6v/B6fo/NiAo+UxBO3SxKgIIsgUGbWfVpsyUi0PG2xfVCdhJlhL1AsRRvKglfHSOB8qKE+XCLw=="
 | 
			
		||||
    },
 | 
			
		||||
    "@pushrocks/smartpath": {
 | 
			
		||||
      "version": "4.0.1",
 | 
			
		||||
@@ -286,6 +284,18 @@
 | 
			
		||||
      "integrity": "sha1-kQ3lDvzHwJ49gvL4er1rcAwYgYo=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "ansi-regex": {
 | 
			
		||||
      "version": "2.1.1",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/ansi-regex/-/ansi-regex-2.1.1.tgz",
 | 
			
		||||
      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "ansi-styles": {
 | 
			
		||||
      "version": "2.2.1",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/ansi-styles/-/ansi-styles-2.2.1.tgz",
 | 
			
		||||
      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "argparse": {
 | 
			
		||||
      "version": "1.0.10",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
 | 
			
		||||
@@ -311,6 +321,32 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
 | 
			
		||||
      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
 | 
			
		||||
    },
 | 
			
		||||
    "babel-code-frame": {
 | 
			
		||||
      "version": "6.26.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
 | 
			
		||||
      "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "chalk": "^1.1.3",
 | 
			
		||||
        "esutils": "^2.0.2",
 | 
			
		||||
        "js-tokens": "^3.0.2"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "chalk": {
 | 
			
		||||
          "version": "1.1.3",
 | 
			
		||||
          "resolved": "https://verdaccio.lossless.one/chalk/-/chalk-1.1.3.tgz",
 | 
			
		||||
          "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "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"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "balanced-match": {
 | 
			
		||||
      "version": "1.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
 | 
			
		||||
@@ -337,6 +373,12 @@
 | 
			
		||||
      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "builtin-modules": {
 | 
			
		||||
      "version": "1.1.1",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/builtin-modules/-/builtin-modules-1.1.1.tgz",
 | 
			
		||||
      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "chai": {
 | 
			
		||||
      "version": "4.1.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
 | 
			
		||||
@@ -366,6 +408,37 @@
 | 
			
		||||
      "integrity": "sha1-NZFAwFHTak5LGl/GuRAVL0OKjUk=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "chalk": {
 | 
			
		||||
      "version": "2.4.2",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/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.3.0"
 | 
			
		||||
      },
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "ansi-styles": {
 | 
			
		||||
          "version": "3.2.1",
 | 
			
		||||
          "resolved": "https://verdaccio.lossless.one/ansi-styles/-/ansi-styles-3.2.1.tgz",
 | 
			
		||||
          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "color-convert": "^1.9.0"
 | 
			
		||||
          }
 | 
			
		||||
        },
 | 
			
		||||
        "supports-color": {
 | 
			
		||||
          "version": "5.5.0",
 | 
			
		||||
          "resolved": "https://verdaccio.lossless.one/supports-color/-/supports-color-5.5.0.tgz",
 | 
			
		||||
          "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
 | 
			
		||||
          "dev": true,
 | 
			
		||||
          "requires": {
 | 
			
		||||
            "has-flag": "^3.0.0"
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "check-error": {
 | 
			
		||||
      "version": "1.0.2",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
 | 
			
		||||
@@ -397,6 +470,21 @@
 | 
			
		||||
        "readable-stream": "^2.3.5"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "color-convert": {
 | 
			
		||||
      "version": "1.9.3",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/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://verdaccio.lossless.one/color-name/-/color-name-1.1.3.tgz",
 | 
			
		||||
      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "combined-stream": {
 | 
			
		||||
      "version": "1.0.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
 | 
			
		||||
@@ -405,6 +493,12 @@
 | 
			
		||||
        "delayed-stream": "~1.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "commander": {
 | 
			
		||||
      "version": "2.19.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/commander/-/commander-2.19.0.tgz",
 | 
			
		||||
      "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "concat-map": {
 | 
			
		||||
      "version": "0.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
 | 
			
		||||
@@ -452,6 +546,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
 | 
			
		||||
      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
 | 
			
		||||
    },
 | 
			
		||||
    "esutils": {
 | 
			
		||||
      "version": "2.0.2",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/esutils/-/esutils-2.0.2.tgz",
 | 
			
		||||
      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "figures": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
 | 
			
		||||
@@ -518,6 +618,21 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
 | 
			
		||||
      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
 | 
			
		||||
    },
 | 
			
		||||
    "has-ansi": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/has-ansi/-/has-ansi-2.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "ansi-regex": "^2.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "has-flag": {
 | 
			
		||||
      "version": "3.0.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/has-flag/-/has-flag-3.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "inflight": {
 | 
			
		||||
      "version": "1.0.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
 | 
			
		||||
@@ -548,6 +663,12 @@
 | 
			
		||||
      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "js-tokens": {
 | 
			
		||||
      "version": "3.0.2",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/js-tokens/-/js-tokens-3.0.2.tgz",
 | 
			
		||||
      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "js-yaml": {
 | 
			
		||||
      "version": "3.12.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
 | 
			
		||||
@@ -653,6 +774,12 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
 | 
			
		||||
    },
 | 
			
		||||
    "path-parse": {
 | 
			
		||||
      "version": "1.0.6",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/path-parse/-/path-parse-1.0.6.tgz",
 | 
			
		||||
      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "pathval": {
 | 
			
		||||
      "version": "1.1.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
 | 
			
		||||
@@ -699,11 +826,26 @@
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs="
 | 
			
		||||
    },
 | 
			
		||||
    "resolve": {
 | 
			
		||||
      "version": "1.9.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/resolve/-/resolve-1.9.0.tgz",
 | 
			
		||||
      "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "path-parse": "^1.0.6"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "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=="
 | 
			
		||||
    },
 | 
			
		||||
    "semver": {
 | 
			
		||||
      "version": "5.6.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/semver/-/semver-5.6.0.tgz",
 | 
			
		||||
      "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "smartchai": {
 | 
			
		||||
      "version": "2.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/smartchai/-/smartchai-2.0.1.tgz",
 | 
			
		||||
@@ -747,6 +889,15 @@
 | 
			
		||||
        "safe-buffer": "~5.1.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "strip-ansi": {
 | 
			
		||||
      "version": "3.0.1",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/strip-ansi/-/strip-ansi-3.0.1.tgz",
 | 
			
		||||
      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "ansi-regex": "^2.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "strip-bom": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
 | 
			
		||||
@@ -772,6 +923,12 @@
 | 
			
		||||
        "strip-bom": "^2.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "supports-color": {
 | 
			
		||||
      "version": "2.0.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/supports-color/-/supports-color-2.0.0.tgz",
 | 
			
		||||
      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "ts-node": {
 | 
			
		||||
      "version": "7.0.1",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz",
 | 
			
		||||
@@ -788,6 +945,47 @@
 | 
			
		||||
        "yn": "^2.0.0"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "tslib": {
 | 
			
		||||
      "version": "1.9.3",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/tslib/-/tslib-1.9.3.tgz",
 | 
			
		||||
      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "tslint": {
 | 
			
		||||
      "version": "5.12.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/tslint/-/tslint-5.12.0.tgz",
 | 
			
		||||
      "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "babel-code-frame": "^6.22.0",
 | 
			
		||||
        "builtin-modules": "^1.1.1",
 | 
			
		||||
        "chalk": "^2.3.0",
 | 
			
		||||
        "commander": "^2.12.1",
 | 
			
		||||
        "diff": "^3.2.0",
 | 
			
		||||
        "glob": "^7.1.1",
 | 
			
		||||
        "js-yaml": "^3.7.0",
 | 
			
		||||
        "minimatch": "^3.0.4",
 | 
			
		||||
        "resolve": "^1.3.2",
 | 
			
		||||
        "semver": "^5.3.0",
 | 
			
		||||
        "tslib": "^1.8.0",
 | 
			
		||||
        "tsutils": "^2.27.2"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "tslint-config-prettier": {
 | 
			
		||||
      "version": "1.17.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/tslint-config-prettier/-/tslint-config-prettier-1.17.0.tgz",
 | 
			
		||||
      "integrity": "sha512-NKWNkThwqE4Snn4Cm6SZB7lV5RMDDFsBwz6fWUkTxOKGjMx8ycOHnjIbhn7dZd5XmssW3CwqUjlANR6EhP9YQw==",
 | 
			
		||||
      "dev": true
 | 
			
		||||
    },
 | 
			
		||||
    "tsutils": {
 | 
			
		||||
      "version": "2.29.0",
 | 
			
		||||
      "resolved": "https://verdaccio.lossless.one/tsutils/-/tsutils-2.29.0.tgz",
 | 
			
		||||
      "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
 | 
			
		||||
      "dev": true,
 | 
			
		||||
      "requires": {
 | 
			
		||||
        "tslib": "^1.8.1"
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "type-detect": {
 | 
			
		||||
      "version": "4.0.8",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
 | 
			
		||||
 
 | 
			
		||||
@@ -29,9 +29,12 @@
 | 
			
		||||
    "@gitzone/tsrun": "^1.1.12",
 | 
			
		||||
    "@gitzone/tstest": "^1.0.13",
 | 
			
		||||
    "@pushrocks/tapbundle": "^3.0.5",
 | 
			
		||||
    "@types/node": "^10.5.8"
 | 
			
		||||
    "@types/node": "^10.5.8",
 | 
			
		||||
    "tslint": "^5.12.0",
 | 
			
		||||
    "tslint-config-prettier": "^1.17.0"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "@pushrocks/smartfile": "^6.0.6"
 | 
			
		||||
    "@pushrocks/smartfile": "^6.0.6",
 | 
			
		||||
    "@pushrocks/smartlog": "^2.0.9"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
vars:
 | 
			
		||||
required:
 | 
			
		||||
  - key1
 | 
			
		||||
  - key2
 | 
			
		||||
  - key3
 | 
			
		||||
@@ -1,5 +1,4 @@
 | 
			
		||||
import * as plugins from './qenv.plugins';
 | 
			
		||||
import * as helpers from './qenv.helpers';
 | 
			
		||||
 | 
			
		||||
export interface IKeyValueObject {
 | 
			
		||||
  key: string;
 | 
			
		||||
@@ -7,21 +6,32 @@ export interface IKeyValueObject {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export class Qenv {
 | 
			
		||||
  requiredEnvVars: string[] = [];
 | 
			
		||||
  availableEnvVars: string[] = [];
 | 
			
		||||
  missingEnvVars: string[] = [];
 | 
			
		||||
  keyValueObjectArray: IKeyValueObject[] = [];
 | 
			
		||||
  constructor(basePathArg = process.cwd(), envYmlPathArg, failOnMissing = true) {
 | 
			
		||||
    basePathArg = plugins.path.resolve(basePathArg);
 | 
			
		||||
    envYmlPathArg = plugins.path.resolve(envYmlPathArg);
 | 
			
		||||
    helpers.getRequiredEnvVars(basePathArg, this.requiredEnvVars);
 | 
			
		||||
    helpers.getAvailableEnvVars(
 | 
			
		||||
      this.requiredEnvVars,
 | 
			
		||||
      envYmlPathArg,
 | 
			
		||||
      this.availableEnvVars,
 | 
			
		||||
      this.keyValueObjectArray
 | 
			
		||||
    );
 | 
			
		||||
    this.missingEnvVars = helpers.getMissingEnvVars(this.requiredEnvVars, this.availableEnvVars);
 | 
			
		||||
  public requiredEnvVars: string[] = [];
 | 
			
		||||
  public availableEnvVars: string[] = [];
 | 
			
		||||
  public missingEnvVars: string[] = [];
 | 
			
		||||
  public keyValueObjectArray: IKeyValueObject[] = [];
 | 
			
		||||
  public logger: plugins.smartlog.Smartlog;
 | 
			
		||||
 | 
			
		||||
  // filePaths
 | 
			
		||||
  public qenvFilePathAbsolute: string;
 | 
			
		||||
  public envFilePathAbsolute: string;
 | 
			
		||||
 | 
			
		||||
  constructor(
 | 
			
		||||
    qenvFileBasePathArg = process.cwd(),
 | 
			
		||||
    envFileBasePathArg,
 | 
			
		||||
    failOnMissing = true,
 | 
			
		||||
    loggerArg: plugins.smartlog.Smartlog = plugins.smartlog.defaultLogger
 | 
			
		||||
  ) {
 | 
			
		||||
    this.logger = loggerArg;
 | 
			
		||||
 | 
			
		||||
    // lets make sure paths are absolute
 | 
			
		||||
    this.qenvFilePathAbsolute = plugins.path.join(plugins.path.resolve(qenvFileBasePathArg), 'qenv.yml');
 | 
			
		||||
    this.envFilePathAbsolute = plugins.path.join(plugins.path.resolve(envFileBasePathArg), 'env.yml');
 | 
			
		||||
 | 
			
		||||
    this.getRequiredEnvVars();
 | 
			
		||||
    this.getAvailableEnvVars();
 | 
			
		||||
 | 
			
		||||
    this.missingEnvVars = this.getMissingEnvVars();
 | 
			
		||||
 | 
			
		||||
    // handle missing variables
 | 
			
		||||
    if (this.missingEnvVars.length > 0) {
 | 
			
		||||
@@ -36,7 +46,101 @@ export class Qenv {
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getEnvVar(envVarName): string {
 | 
			
		||||
  public getEnvVar(envVarName): string {
 | 
			
		||||
    return process.env[envVarName];
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public getEnvVarOnDemand(requiredEnvVar: string): string {
 | 
			
		||||
    // lets determine the actual env yml
 | 
			
		||||
    let envYml;
 | 
			
		||||
    try {
 | 
			
		||||
      envYml = plugins.smartfile.fs.toObjectSync(this.envFilePathAbsolute);
 | 
			
		||||
    } catch (err) {
 | 
			
		||||
      console.log("env file couldn't be found at " + this.envFilePathAbsolute);
 | 
			
		||||
      envYml = {};
 | 
			
		||||
    }
 | 
			
		||||
    let envVar: string;
 | 
			
		||||
      let envFileVar: string;
 | 
			
		||||
      let dockerSecret: string;
 | 
			
		||||
 | 
			
		||||
      // env var check
 | 
			
		||||
      if (process.env[requiredEnvVar]) {
 | 
			
		||||
        this.availableEnvVars.push(requiredEnvVar);
 | 
			
		||||
        envVar = process.env[requiredEnvVar];
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      // env file check
 | 
			
		||||
      if (envYml.hasOwnProperty(requiredEnvVar)) {
 | 
			
		||||
        envFileVar = envYml[requiredEnvVar];
 | 
			
		||||
        this.availableEnvVars.push(requiredEnvVar);
 | 
			
		||||
      }
 | 
			
		||||
      if (
 | 
			
		||||
        plugins.smartfile.fs.isDirectory('/run') &&
 | 
			
		||||
        plugins.smartfile.fs.isDirectory('/run/secrets') &&
 | 
			
		||||
        plugins.smartfile.fs.fileExists(`/run/secrets/${requiredEnvVar}`)
 | 
			
		||||
      ) {
 | 
			
		||||
        dockerSecret = plugins.smartfile.fs.toStringSync(`/run/secrets/${requiredEnvVar}`);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if ((envVar && envFileVar) || (envVar && dockerSecret) || (envFileVar && dockerSecret)) {
 | 
			
		||||
        this.logger.log(
 | 
			
		||||
          'warn',
 | 
			
		||||
          `found multiple candidates for ${requiredEnvVar} Choosing in the order of envVar, envFileVar, dockerSecret`
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      let chosenVar: string = null;
 | 
			
		||||
      if (envVar) {
 | 
			
		||||
        chosenVar = envVar;
 | 
			
		||||
      } else if (envFileVar) {
 | 
			
		||||
        chosenVar = envFileVar;
 | 
			
		||||
      } else if (dockerSecret) {
 | 
			
		||||
        chosenVar = dockerSecret;
 | 
			
		||||
      }
 | 
			
		||||
      return chosenVar;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * gets the required env values
 | 
			
		||||
   */
 | 
			
		||||
  private getRequiredEnvVars = () => {
 | 
			
		||||
    const qenvFile = plugins.smartfile.fs.toObjectSync(this.qenvFilePathAbsolute);
 | 
			
		||||
    if (!qenvFile.required) {
 | 
			
		||||
      this.logger.log('warn', `env File does not contain a 'required' Array!`);
 | 
			
		||||
    }
 | 
			
		||||
    for (const keyArg of Reflect.ownKeys(qenvFile.required)) {
 | 
			
		||||
      this.requiredEnvVars.push(qenvFile.required[keyArg]);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * gets the available env vars
 | 
			
		||||
   */
 | 
			
		||||
  private getAvailableEnvVars = () => {
 | 
			
		||||
 | 
			
		||||
    for (const requiredEnvVar of this.requiredEnvVars) {
 | 
			
		||||
      const chosenVar = this.getEnvVarOnDemand(requiredEnvVar);
 | 
			
		||||
      if (chosenVar) {
 | 
			
		||||
        this.availableEnvVars.push(requiredEnvVar);
 | 
			
		||||
        process.env[requiredEnvVar] = chosenVar;
 | 
			
		||||
        this.keyValueObjectArray.push({
 | 
			
		||||
          key: requiredEnvVar,
 | 
			
		||||
          value: chosenVar
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * gets missing env vars
 | 
			
		||||
   */
 | 
			
		||||
  private getMissingEnvVars = (): string[] => {
 | 
			
		||||
    const missingEnvVars: string[] = [];
 | 
			
		||||
    for (const envVar of this.requiredEnvVars) {
 | 
			
		||||
      if (!this.availableEnvVars.includes(envVar)) {
 | 
			
		||||
        missingEnvVars.push(envVar);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return missingEnvVars;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,55 +0,0 @@
 | 
			
		||||
import * as plugins from './qenv.plugins';
 | 
			
		||||
import { IKeyValueObject } from './qenv.classes.qenv';
 | 
			
		||||
 | 
			
		||||
export let getRequiredEnvVars = (pathArg: string, requiredEnvVarsArray: string[]) => {
 | 
			
		||||
  let qenvFilePath = plugins.path.join(pathArg, 'qenv.yml');
 | 
			
		||||
  let qenvFile = plugins.smartfile.fs.toObjectSync(qenvFilePath);
 | 
			
		||||
  for (let keyArg in qenvFile.vars) {
 | 
			
		||||
    requiredEnvVarsArray.push(qenvFile.vars[keyArg]);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export let getAvailableEnvVars = (
 | 
			
		||||
  requiredEnvVarsArg: string[],
 | 
			
		||||
  envYmlPathArg: string,
 | 
			
		||||
  availableEnvVarsArray: string[],
 | 
			
		||||
  keyValueObjectArrayArg: IKeyValueObject[]
 | 
			
		||||
) => {
 | 
			
		||||
  envYmlPathArg = plugins.path.join(envYmlPathArg, 'env.yml');
 | 
			
		||||
  let envYml;
 | 
			
		||||
  try {
 | 
			
		||||
    envYml = plugins.smartfile.fs.toObjectSync(envYmlPathArg);
 | 
			
		||||
  } catch (err) {
 | 
			
		||||
    console.log("env file couldn't be found at " + envYmlPathArg);
 | 
			
		||||
    envYml = {};
 | 
			
		||||
  }
 | 
			
		||||
  for (let requiredEnvVar of requiredEnvVarsArg) {
 | 
			
		||||
    if (process.env[requiredEnvVar]) {
 | 
			
		||||
      availableEnvVarsArray.push(requiredEnvVar);
 | 
			
		||||
      keyValueObjectArrayArg.push({
 | 
			
		||||
        key: requiredEnvVar,
 | 
			
		||||
        value: process.env[requiredEnvVar]
 | 
			
		||||
      });
 | 
			
		||||
    } else if (envYml.hasOwnProperty(requiredEnvVar)) {
 | 
			
		||||
      process.env[requiredEnvVar] = envYml[requiredEnvVar];
 | 
			
		||||
      availableEnvVarsArray.push(requiredEnvVar);
 | 
			
		||||
      keyValueObjectArrayArg.push({
 | 
			
		||||
        key: requiredEnvVar,
 | 
			
		||||
        value: process.env[requiredEnvVar]
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export let getMissingEnvVars = (
 | 
			
		||||
  requiredEnvVarsArray: string[],
 | 
			
		||||
  availableEnvVarsArray: string[]
 | 
			
		||||
): string[] => {
 | 
			
		||||
  const missingEnvVars: string[] = [];
 | 
			
		||||
  for (const envVar of requiredEnvVarsArray) {
 | 
			
		||||
    if (!availableEnvVarsArray.includes(envVar)) {
 | 
			
		||||
      missingEnvVars.push(envVar);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return missingEnvVars;
 | 
			
		||||
};
 | 
			
		||||
@@ -1,2 +1,16 @@
 | 
			
		||||
export import path = require('path');
 | 
			
		||||
export import smartfile = require('@pushrocks/smartfile');
 | 
			
		||||
// native
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  path
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// @pushrocks scope
 | 
			
		||||
import * as smartfile from '@pushrocks/smartfile';
 | 
			
		||||
import * as smartlog from '@pushrocks/smartlog';
 | 
			
		||||
 | 
			
		||||
export {
 | 
			
		||||
  smartfile,
 | 
			
		||||
  smartlog
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										16
									
								
								tslint.json
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								tslint.json
									
									
									
									
									
								
							@@ -1,3 +1,17 @@
 | 
			
		||||
{
 | 
			
		||||
    "extends": "tslint-config-standard"
 | 
			
		||||
  "extends": ["tslint:latest", "tslint-config-prettier"],
 | 
			
		||||
  "rules": {
 | 
			
		||||
    "semicolon": [true, "always"],
 | 
			
		||||
    "no-console": false,
 | 
			
		||||
    "ordered-imports": false,
 | 
			
		||||
    "object-literal-sort-keys": false,
 | 
			
		||||
    "member-ordering": {
 | 
			
		||||
      "options":{
 | 
			
		||||
        "order": [
 | 
			
		||||
          "static-method"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "defaultSeverity": "warning"
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user