Compare commits

..

12 Commits

Author SHA1 Message Date
b9d1080829 1.0.7 2016-06-21 16:13:45 +02:00
a84a257e4b improve log output 2016-06-21 16:13:29 +02:00
2fa659a22a 1.0.6 2016-06-20 22:19:11 +02:00
bdc99cc3a6 link typings om package.json 2016-06-20 22:18:48 +02:00
2956278369 cosmetics 2016-06-20 12:05:35 +02:00
c61ef2eeba 1.0.5 2016-06-20 11:21:26 +02:00
41c97c4c05 improve README 2016-06-20 11:21:21 +02:00
8870f9adf2 1.0.4 2016-06-20 11:04:19 +02:00
dfb400ba5c improve README 2016-06-20 11:04:16 +02:00
38609031d9 1.0.3 2016-06-20 10:45:46 +02:00
1d4808ed4a ready for primetime 2016-06-20 10:45:43 +02:00
612f8307b8 improve 2016-06-20 07:06:15 +02:00
13 changed files with 183 additions and 21 deletions

View File

@ -2,6 +2,18 @@
provides an easy way for promised environments
## Usage
qenv looks for an qenv.yml that defines needed env vars. qenv dirst checks if they are already specified.
If not, qenv by default looks for a .nogit/env.yml file.
If any env var is not specified, qenv throws an error and exits.
qenv works with two files:
* **qenv.yml** - specifies which ENV vars are required.
* **env.yml** - specifies all env vars that are not already set in the current environment.
Now obviously you can set build specific env vars in many CI environments.
So there we do not need an **env.yml** since all ENV vars are in place
However when on another machine you can have a env.yml that will be added to the environment by qenv.
```typescript
import {Qenv} from "qenv";
myQenv = new Qenv("path/to/dir/where/qenv.yml/is/","path/to/dir/where/env.yml/is(");
```

6
dist/index.d.ts vendored
View File

@ -0,0 +1,6 @@
export declare class Qenv {
requiredEnvVars: string[];
availableEnvVars: string[];
missingEnvVars: string[];
constructor(basePathArg: string, envYmlPathArg: any, failOnMissing?: boolean);
}

61
dist/index.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,5 @@
import "typings-global";
export import beautylog = require("beautylog");
export declare let lodash: any;
export import path = require("path");
export import smartfile = require("smartfile");

View File

@ -1,6 +1,8 @@
"use strict";
require("typings-global");
exports.beautylog = require("beautylog");
exports.lodash = require("lodash");
exports.path = require("path");
exports.smartfile = require("smartfile");
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInFlbnYucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNqQyxpQkFBUyxXQUFXLFdBQVcsQ0FBQyxDQUFDIiwiZmlsZSI6InFlbnYucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5leHBvcnQgaW1wb3J0IGJlYXV0eWxvZyA9IHJlcXVpcmUoXCJiZWF1dHlsb2dcIik7XG5leHBvcnQgaW1wb3J0IHNtYXJ0ZmlsZSA9IHJlcXVpcmUoXCJzbWFydGZpbGVcIik7XG4iXX0=
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInFlbnYucGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFBZ0IsQ0FBQyxDQUFBO0FBQ1YsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNwQyxjQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3hCLFlBQUksV0FBVyxNQUFNLENBQUMsQ0FBQztBQUN2QixpQkFBUyxXQUFXLFdBQVcsQ0FBQyxDQUFDIiwiZmlsZSI6InFlbnYucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCI7XG5leHBvcnQgaW1wb3J0IGJlYXV0eWxvZyA9IHJlcXVpcmUoXCJiZWF1dHlsb2dcIik7XG5leHBvcnQgbGV0IGxvZGFzaCA9IHJlcXVpcmUoXCJsb2Rhc2hcIik7XG5leHBvcnQgaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmV4cG9ydCBpbXBvcnQgc21hcnRmaWxlID0gcmVxdWlyZShcInNtYXJ0ZmlsZVwiKTtcbiJdfQ==

View File

@ -1,8 +1,9 @@
{
"name": "qenv",
"version": "1.0.2",
"version": "1.0.7",
"description": "promised environments",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"scripts": {
"test": "(npmts)"
},
@ -28,6 +29,7 @@
},
"dependencies": {
"beautylog": "^5.0.12",
"lodash": "^4.13.1",
"q": "^1.4.1",
"smartfile": "^3.0.10",
"typings-global": "^1.0.3"

2
test/assets/env.yml Normal file
View File

@ -0,0 +1,2 @@
key1: fromYml
key2: fromYml

4
test/assets/qenv.yml Normal file
View File

@ -0,0 +1,4 @@
vars:
- key1
- key2
- key3

2
test/test.d.ts vendored Normal file
View File

@ -0,0 +1,2 @@
import "typings-test";
import "should";

23
test/test.js Normal file
View File

@ -0,0 +1,23 @@
"use strict";
require("typings-test");
var path = require("path");
require("should");
var index_1 = require("../dist/index");
process.cwd = function () {
return path.join(__dirname, "./assets/");
};
process.env["key1"] = "original";
var qenvTestObject;
describe("Qenv class", function () {
it("should create a new class", function () {
qenvTestObject = new index_1.Qenv(process.cwd(), process.cwd(), false);
});
it("key1 should be not be overwritten since it is already present", function () {
process.env.key1.should.equal("original");
});
it("key2 should be read from Yml", function () {
process.env.key2.should.equal("fromYml");
});
});
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sY0FBYyxDQUFDLENBQUE7QUFDdEIsSUFBWSxJQUFJLFdBQU0sTUFBTSxDQUFDLENBQUE7QUFDN0IsUUFBTyxRQUFRLENBQUMsQ0FBQTtBQUNoQixzQkFBbUIsZUFBZSxDQUFDLENBQUE7QUFFbkMsT0FBTyxDQUFDLEdBQUcsR0FBRztJQUNWLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBQyxXQUFXLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUE7QUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQTtBQUVoQyxJQUFJLGNBQW1CLENBQUM7QUFDeEIsUUFBUSxDQUFDLFlBQVksRUFBQztJQUNsQixFQUFFLENBQUMsMkJBQTJCLEVBQUM7UUFDM0IsY0FBYyxHQUFHLElBQUksWUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsK0RBQStELEVBQUM7UUFDL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5QyxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyw4QkFBOEIsRUFBQztRQUM5QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFBO0FBRU4sQ0FBQyxDQUFDLENBQUMiLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtdGVzdFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IFwic2hvdWxkXCI7XG5pbXBvcnQge1FlbnZ9IGZyb20gXCIuLi9kaXN0L2luZGV4XCI7XG5cbnByb2Nlc3MuY3dkID0gKCkgPT4ge1xuICAgIHJldHVybiBwYXRoLmpvaW4oX19kaXJuYW1lLFwiLi9hc3NldHMvXCIpO1xufVxuXG5wcm9jZXNzLmVudltcImtleTFcIl0gPSBcIm9yaWdpbmFsXCJcblxubGV0IHFlbnZUZXN0T2JqZWN0OlFlbnY7XG5kZXNjcmliZShcIlFlbnYgY2xhc3NcIixmdW5jdGlvbigpe1xuICAgIGl0KFwic2hvdWxkIGNyZWF0ZSBhIG5ldyBjbGFzc1wiLGZ1bmN0aW9uKCl7XG4gICAgICAgIHFlbnZUZXN0T2JqZWN0ID0gbmV3IFFlbnYocHJvY2Vzcy5jd2QoKSxwcm9jZXNzLmN3ZCgpLGZhbHNlKTtcbiAgICB9KTtcbiAgICBpdChcImtleTEgc2hvdWxkIGJlIG5vdCBiZSBvdmVyd3JpdHRlbiBzaW5jZSBpdCBpcyBhbHJlYWR5IHByZXNlbnRcIixmdW5jdGlvbigpe1xuICAgICAgICBwcm9jZXNzLmVudi5rZXkxLnNob3VsZC5lcXVhbChcIm9yaWdpbmFsXCIpO1xuICAgIH0pO1xuICAgIGl0KFwia2V5MiBzaG91bGQgYmUgcmVhZCBmcm9tIFltbFwiLGZ1bmN0aW9uKCl7XG4gICAgICAgIHByb2Nlc3MuZW52LmtleTIuc2hvdWxkLmVxdWFsKFwiZnJvbVltbFwiKTtcbiAgICB9KVxuXG59KTsiXX0=

24
test/test.ts Normal file
View File

@ -0,0 +1,24 @@
import "typings-test";
import * as path from "path";
import "should";
import {Qenv} from "../dist/index";
process.cwd = () => {
return path.join(__dirname,"./assets/");
}
process.env["key1"] = "original"
let qenvTestObject:Qenv;
describe("Qenv class",function(){
it("should create a new class",function(){
qenvTestObject = new Qenv(process.cwd(),process.cwd(),false);
});
it("key1 should be not be overwritten since it is already present",function(){
process.env.key1.should.equal("original");
});
it("key2 should be read from Yml",function(){
process.env.key2.should.equal("fromYml");
})
});

View File

@ -1,16 +1,27 @@
import * as plugins from "./qenv.plugins";
export class qenv {
envVarsRequired:string[];
envVarsAvailable:string[];
envVarsMissing:string[];
constructor(basePathArg = "./qenv.yml",envYmlPathArg){
this.envVarsRequired = getEnvVarsRequired(basePathArg);
this.envVarsAvailable;
export class Qenv {
requiredEnvVars:string[];
availableEnvVars:string[];
missingEnvVars:string[];
constructor(basePathArg = process.cwd(),envYmlPathArg,failOnMissing = true){
this.requiredEnvVars = getRequiredEnvVars(basePathArg);
this.availableEnvVars = getAvailableEnvVars(this.requiredEnvVars,envYmlPathArg);
this.missingEnvVars = getMissingEnvVars(this.requiredEnvVars,this.availableEnvVars);
//handle missing variables
if (this.missingEnvVars.length > 0){
plugins.beautylog.error("Some Env variables could not be resolved:")
console.log(this.missingEnvVars);
if(failOnMissing){
plugins.beautylog.error("Exiting!")
process.exit(1);
}
}
}
};
let getEnvVarsRequired = (pathArg:string):string[] => {
let getRequiredEnvVars = (pathArg:string):string[] => {
let result:string[] = [];
let qenvFilePath = plugins.path.join(pathArg,"qenv.yml");
let qenvFile = plugins.smartfile.local.toObjectSync(qenvFilePath);
@ -20,15 +31,29 @@ let getEnvVarsRequired = (pathArg:string):string[] => {
return result;
}
let getEnvVarsAvailable = (requiredEnvVarsArg:string[]):string[] => {
let getAvailableEnvVars = (requiredEnvVarsArg:string[],envYmlPathArg:string):string[] => {
let result = [];
envYmlPathArg = plugins.path.join(envYmlPathArg,"env.yml")
let envYml;
try {
envYml = plugins.smartfile.local.toObjectSync(envYmlPathArg);
}
catch(err){
plugins.beautylog.log("env file couldn't be found at " + envYmlPathArg)
envYml = {};
}
for(let keyArg in requiredEnvVarsArg){
let envVar = requiredEnvVarsArg[keyArg];
if(process.env[envVar]){
result.push(envVar);
} else {
let requiredEnvVar:string = requiredEnvVarsArg[keyArg];
if(process.env[requiredEnvVar]){
result.push(requiredEnvVar);
} else if(envYml.hasOwnProperty(requiredEnvVar)){
process.env[requiredEnvVar] = envYml[requiredEnvVar];
result.push(requiredEnvVar);
}
}
return result;
}
let getMissingEnvVars = (requiredEnvVarsArray:string[],availableEnvVarsArray:string[]) => {
return plugins.lodash.difference(requiredEnvVarsArray,availableEnvVarsArray);
}

View File

@ -1,4 +1,5 @@
import "typings-global";
export import beautylog = require("beautylog");
export let lodash = require("lodash");
export import path = require("path");
export import smartfile = require("smartfile");