Compare commits

..

23 Commits

Author SHA1 Message Date
7527049fd0 1.1.3 2017-01-21 11:57:09 +01:00
25589d4ca2 cleanup dependencies 2017-01-21 11:57:04 +01:00
73c223af6c 1.1.2 2017-01-21 11:51:35 +01:00
ead69f3bb9 remove beautylog dependency 2017-01-21 11:51:30 +01:00
7de17bbefa add better README 2016-12-31 19:26:32 +01:00
4e39970dd7 1.1.1 2016-08-04 16:44:48 +02:00
2a7c239176 fix interface naming 2016-08-04 16:44:42 +02:00
35e71ccf00 1.1.0 2016-08-04 16:09:44 +02:00
11a2cf83ee add keyValueObjectArray 2016-08-04 16:09:39 +02:00
d7a0541d81 1.0.8 2016-06-21 16:25:09 +02:00
c03e17d522 improve log output 2016-06-21 16:25:03 +02:00
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
16 changed files with 297 additions and 57 deletions

3
.gitignore vendored
View File

@ -1,3 +1,4 @@
node_modules/
coverage/
docs/
pages/
public/

View File

@ -3,13 +3,16 @@ image: hosttoday/ht-docker-node:npmts
stages:
- test
- release
- trigger
- pages
testLEGACY:
stage: test
script:
- npmci test lts
- npmci test legacy
tags:
- docker
allow_failure: true
testLTS:
stage: test
@ -33,3 +36,24 @@ release:
- tags
tags:
- docker
trigger:
stage: trigger
script:
- npmci trigger
only:
- tags
tags:
- docker
pages:
image: hosttoday/ht-docker-node:npmpage
stage: pages
script:
- npmci command npmpage --publish gitlab
only:
- tags
artifacts:
expire_in: 1 week
paths:
- public

View File

@ -1,7 +1,40 @@
# qenv
provides an easy way for promised environments
easy promised environments
## Availabililty
[![npm](https://push.rocks/assets/repo-button-npm.svg)](https://www.npmjs.com/package/qenv)
[![git](https://push.rocks/assets/repo-button-git.svg)](https://GitLab.com/pushrocks/qenv)
[![git](https://push.rocks/assets/repo-button-mirror.svg)](https://github.com/pushrocks/qenv)
[![docs](https://push.rocks/assets/repo-button-docs.svg)](https://pushrocks.gitlab.io/qenv/)
## Status for master
[![build status](https://GitLab.com/pushrocks/qenv/badges/master/build.svg)](https://GitLab.com/pushrocks/qenv/commits/master)
[![coverage report](https://GitLab.com/pushrocks/qenv/badges/master/coverage.svg)](https://GitLab.com/pushrocks/qenv/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/qenv.svg)](https://www.npmjs.com/package/qenv)
[![Dependency Status](https://david-dm.org/pushrocks/qenv.svg)](https://david-dm.org/pushrocks/qenv)
[![bitHound Dependencies](https://www.bithound.io/github/pushrocks/qenv/badges/dependencies.svg)](https://www.bithound.io/github/pushrocks/qenv/master/dependencies/npm)
[![bitHound Code](https://www.bithound.io/github/pushrocks/qenv/badges/code.svg)](https://www.bithound.io/github/pushrocks/qenv)
[![TypeScript](https://img.shields.io/badge/TypeScript-2.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%206.x.x-blue.svg)](https://nodejs.org/dist/latest-v6.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-standard-brightgreen.svg)](http://standardjs.com/)
## 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.
Use TypeScript for best in class instellisense.
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.
```javascript
import {Qenv} from "qenv";
myQenv = new Qenv("path/to/dir/where/qenv.yml/is/","path/to/dir/where/env.yml/is(");
```
[![npm](https://push.rocks/assets/repo-header.svg)](https://push.rocks)

11
dist/index.d.ts vendored
View File

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

72
dist/index.js vendored
View File

@ -1,3 +1,69 @@
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbXX0=
"use strict";
const plugins = require("./qenv.plugins");
;
class Qenv {
constructor(basePathArg = process.cwd(), envYmlPathArg, failOnMissing = true) {
this.requiredEnvVars = [];
this.availableEnvVars = [];
this.missingEnvVars = [];
this.keyValueObjectArray = [];
getRequiredEnvVars(basePathArg, this.requiredEnvVars);
getAvailableEnvVars(this.requiredEnvVars, envYmlPathArg, this.availableEnvVars, this.keyValueObjectArray);
this.missingEnvVars = getMissingEnvVars(this.requiredEnvVars, this.availableEnvVars);
// handle missing variables
if (this.missingEnvVars.length > 0) {
console.info('Required Env Vars are:');
console.log(this.requiredEnvVars);
console.error('However some Env variables could not be resolved:');
console.log(this.missingEnvVars);
if (failOnMissing) {
console.error('Exiting!');
process.exit(1);
}
}
}
;
}
exports.Qenv = Qenv;
;
let getRequiredEnvVars = (pathArg, requiredEnvVarsArray) => {
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]);
}
;
};
let getAvailableEnvVars = (requiredEnvVarsArg, envYmlPathArg, availableEnvVarsArray, keyValueObjectArrayArg) => {
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]
});
}
}
;
};
let getMissingEnvVars = (requiredEnvVarsArray, availableEnvVarsArray) => {
return plugins.lodash.difference(requiredEnvVarsArray, availableEnvVarsArray);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsMENBQXlDO0FBS3hDLENBQUM7QUFFRjtJQUtJLFlBQVksV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxhQUFhLEVBQUMsYUFBYSxHQUFHLElBQUk7UUFKMUUsb0JBQWUsR0FBYSxFQUFFLENBQUE7UUFDOUIscUJBQWdCLEdBQWEsRUFBRSxDQUFBO1FBQy9CLG1CQUFjLEdBQWEsRUFBRSxDQUFBO1FBQzdCLHdCQUFtQixHQUFzQixFQUFFLENBQUE7UUFFdkMsa0JBQWtCLENBQUMsV0FBVyxFQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtRQUNwRCxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFDLGFBQWEsRUFBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUE7UUFDdEcsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBRW5GLDJCQUEyQjtRQUMzQixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQTtZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUNqQyxPQUFPLENBQUMsS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUE7WUFDbEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDaEMsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtn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

View File

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

View File

@ -1,6 +1,6 @@
"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;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWVudi5wbHVnaW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvcWVudi5wbHVnaW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwwQkFBdUI7QUFDWixRQUFBLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDckMsK0JBQW9DO0FBQ3BDLHlDQUE4QyJ9

View File

@ -1,8 +1,9 @@
{
"name": "qenv",
"version": "1.0.2",
"description": "promised environments",
"version": "1.1.3",
"description": "easy promised environments",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
"scripts": {
"test": "(npmts)"
},
@ -22,14 +23,13 @@
},
"homepage": "https://gitlab.com/pushrocks/qenv#README",
"devDependencies": {
"npmts-g": "^5.2.6",
"should": "^9.0.2",
"typings-test": "^1.0.1"
"npmts-g": "^6.0.0",
"smartchai": "^1.0.1",
"typings-test": "^1.0.3"
},
"dependencies": {
"beautylog": "^5.0.12",
"q": "^1.4.1",
"smartfile": "^3.0.10",
"typings-global": "^1.0.3"
"lodash": "^4.17.4",
"smartfile": "^4.1.3",
"typings-global": "^1.0.14"
}
}

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

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

@ -0,0 +1 @@
import 'typings-test';

26
test/test.js Normal file
View File

@ -0,0 +1,26 @@
"use strict";
require("typings-test");
const path = require("path");
const smartchai_1 = require("smartchai");
const index_1 = require("../dist/index");
process.cwd = () => {
return path.join(__dirname, './assets/');
};
process.env['key1'] = 'original';
let 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 () {
smartchai_1.expect(process.env.key1).to.equal('original');
});
it('key2 should be read from Yml', function () {
smartchai_1.expect(process.env.key2).to.equal('fromYml');
});
it('keyValueObjectArray should hold all retrieved values', function () {
smartchai_1.expect(qenvTestObject.keyValueObjectArray[0].value).to.equal('original');
smartchai_1.expect(qenvTestObject.keyValueObjectArray[1].value).to.equal('fromYml');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUFxQjtBQUNyQiw2QkFBNEI7QUFDNUIseUNBQWtDO0FBQ2xDLHlDQUFrQztBQUVsQyxPQUFPLENBQUMsR0FBRyxHQUFHO0lBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFDLFdBQVcsQ0FBQyxDQUFBO0FBQzNDLENBQUMsQ0FBQTtBQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFBO0FBRWhDLElBQUksY0FBb0IsQ0FBQTtBQUN4QixRQUFRLENBQUMsWUFBWSxFQUFDO0lBQ2xCLEVBQUUsQ0FBQywyQkFBMkIsRUFBQztRQUMzQixjQUFjLEdBQUcsSUFBSSxZQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBQyxLQUFLLENBQUMsQ0FBQTtJQUNoRSxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQywrREFBK0QsRUFBQztRQUMvRCxrQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNqRCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyw4QkFBOEIsRUFBQztRQUM5QixrQkFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQTtJQUNoRCxDQUFDLENBQUMsQ0FBQTtJQUNGLEVBQUUsQ0FBQyxzREFBc0QsRUFBQztRQUN0RCxrQkFBTSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3hFLGtCQUFNLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDM0UsQ0FBQyxDQUFDLENBQUE7QUFFTixDQUFDLENBQUMsQ0FBQSJ9

28
test/test.ts Normal file
View File

@ -0,0 +1,28 @@
import 'typings-test'
import * as path from 'path'
import { expect } from 'smartchai'
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(){
expect(process.env.key1).to.equal('original')
})
it('key2 should be read from Yml',function(){
expect(process.env.key2).to.equal('fromYml')
})
it('keyValueObjectArray should hold all retrieved values',function(){
expect(qenvTestObject.keyValueObjectArray[0].value).to.equal('original')
expect(qenvTestObject.keyValueObjectArray[1].value).to.equal('fromYml')
})
})

View File

@ -1,34 +1,74 @@
import * as plugins from "./qenv.plugins";
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 interface IKeyValueObject {
key: string,
value: string
};
let getEnvVarsRequired = (pathArg:string):string[] => {
let result:string[] = [];
let qenvFilePath = plugins.path.join(pathArg,"qenv.yml");
let qenvFile = plugins.smartfile.local.toObjectSync(qenvFilePath);
export class Qenv {
requiredEnvVars: string[] = []
availableEnvVars: string[] = []
missingEnvVars: string[] = []
keyValueObjectArray: IKeyValueObject[] = []
constructor(basePathArg = process.cwd(),envYmlPathArg,failOnMissing = true) {
getRequiredEnvVars(basePathArg,this.requiredEnvVars)
getAvailableEnvVars(this.requiredEnvVars,envYmlPathArg,this.availableEnvVars,this.keyValueObjectArray)
this.missingEnvVars = getMissingEnvVars(this.requiredEnvVars,this.availableEnvVars)
// handle missing variables
if (this.missingEnvVars.length > 0) {
console.info('Required Env Vars are:')
console.log(this.requiredEnvVars)
console.error('However some Env variables could not be resolved:')
console.log(this.missingEnvVars)
if (failOnMissing) {
console.error('Exiting!')
process.exit(1)
}
}
};
};
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) {
result.push(qenvFile.vars[keyArg]);
}
return result;
requiredEnvVarsArray.push(qenvFile.vars[keyArg])
};
}
let getEnvVarsAvailable = (requiredEnvVarsArg:string[]):string[] => {
let result = [];
for(let keyArg in requiredEnvVarsArg){
let envVar = requiredEnvVarsArg[keyArg];
if(process.env[envVar]){
result.push(envVar);
} else {
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]
})
}
};
}
}
}
return result;
let getMissingEnvVars = (requiredEnvVarsArray: string[],availableEnvVarsArray: string[]) => {
return plugins.lodash.difference(requiredEnvVarsArray,availableEnvVarsArray)
}

View File

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

3
tslint.json Normal file
View File

@ -0,0 +1,3 @@
{
"extends": "tslint-config-standard"
}