diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index a1d614e..0dfb491 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 diff --git a/package-lock.json b/package-lock.json index f29235c..a63a840 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index ecc5cc8..feccd06 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/test/assets/qenv.yml b/test/assets/qenv.yml index 66f816f..404f0e1 100644 --- a/test/assets/qenv.yml +++ b/test/assets/qenv.yml @@ -1,4 +1,4 @@ -vars: +required: - key1 - key2 - key3 \ No newline at end of file diff --git a/ts/qenv.classes.qenv.ts b/ts/qenv.classes.qenv.ts index 6be1586..8a0148f 100644 --- a/ts/qenv.classes.qenv.ts +++ b/ts/qenv.classes.qenv.ts @@ -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; + } } diff --git a/ts/qenv.helpers.ts b/ts/qenv.helpers.ts deleted file mode 100644 index e472478..0000000 --- a/ts/qenv.helpers.ts +++ /dev/null @@ -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; -}; diff --git a/ts/qenv.plugins.ts b/ts/qenv.plugins.ts index e7cb633..ed0cc96 100644 --- a/ts/qenv.plugins.ts +++ b/ts/qenv.plugins.ts @@ -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 +} + diff --git a/tslint.json b/tslint.json index 45052ad..d4ea2e9 100644 --- a/tslint.json +++ b/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" }