a127-magic
Advanced tools
Comparing version 0.0.2 to 0.1.0
'use strict'; | ||
// todo: potentially pull stuff from vault as well... | ||
var path = require('path'); | ||
var swaggerFile = path.resolve(path.dirname(require.main.filename), 'api/swagger/swagger.yaml'); | ||
var fs = require('fs'); | ||
var yaml = require('yamljs'); | ||
var debug = require('debug')('a127'); | ||
var _ = require('underscore'); | ||
module.exports = { | ||
swaggerFile: swaggerFile, | ||
env: getEnvironment, | ||
load: getConfig, | ||
reload: useConfig | ||
}; | ||
var ENV_FILENAME = '.a127_env'; | ||
var APP_ROOT = path.dirname(require.main.filename); | ||
var CONFIG_DIR = path.resolve(APP_ROOT, 'config'); | ||
var BASE_DEFAULTS = { | ||
swaggerFile: path.resolve(APP_ROOT, 'api/swagger/swagger.yaml'), | ||
controllers: { | ||
useStubs: true, | ||
useStubs: false, | ||
controllers: './api/controllers' | ||
@@ -14,1 +29,60 @@ }, | ||
}; | ||
var configDir, config, env; | ||
function useConfig(a127Env) { | ||
env = config = undefined; | ||
configDir = process.env.A127_CONFIG || CONFIG_DIR; | ||
if (!fs.existsSync(configDir)) { | ||
throw new Error('config directory doesn\'t exist: ' + configDir); | ||
} | ||
env = a127Env ? a127Env : getEnvironment(); | ||
var defaultConfig = readYamlFromConfigFile('default.yaml'); | ||
var currentConfig = env ? readYamlFromConfigFile(env + '.yaml') : {}; | ||
if (debug.enabled) { debug('No config for env: ' + env + '. Using default.'); } | ||
config = _.extend(BASE_DEFAULTS, defaultConfig, currentConfig); | ||
return config; | ||
} | ||
function getEnvironment() { | ||
if (env) { return env; } | ||
env = process.env.A127_ENV || process.env.NODE_ENV; | ||
if (!env) { // load from file | ||
var envFile = path.resolve(configDir, ENV_FILENAME); | ||
env = readFileNoError(envFile); | ||
} | ||
if (debug.enabled) { debug('set environment: ' + env); } | ||
return env; | ||
} | ||
function readYamlFromConfigFile(fileName) { | ||
try { | ||
var file = path.resolve(configDir, fileName); | ||
var obj = yaml.load(file); | ||
if (debug.enabled) { debug('read config file: ' + file); } | ||
return obj; | ||
} | ||
catch(err) { | ||
if (debug.enabled) { debug('failed attempt to read config: ' + file); } | ||
return {}; | ||
} | ||
} | ||
function readFileNoError(file) { | ||
try { | ||
return fs.readFileSync(file, 'utf8'); | ||
} catch (ex) { | ||
return null; | ||
} | ||
} | ||
function getConfig(a127Env) { | ||
if (!config || (a127Env && env !== a127Env)) { useConfig(a127Env); } | ||
return config; | ||
} |
'use strict'; | ||
var fs = require('fs'); | ||
var yaml = require('js-yaml'); | ||
var yaml = require('yamljs'); | ||
var a127Config = require('./config'); | ||
var _ = require('underscore'); | ||
var stream = require('stream'); | ||
@@ -10,5 +13,81 @@ module.exports = { | ||
function load(file) { | ||
var swaggerObject = yaml.safeLoad(fs.readFileSync(file, 'utf8')); | ||
return swaggerObject; | ||
function load(file, config) { | ||
if (!config) { config = a127Config.load();} | ||
if (!file) { file = config.swaggerFile; } | ||
var sourceString = fs.readFileSync(file, 'utf8'); | ||
var replacementString = doConfigReplacements(sourceString, config); | ||
return yaml.parse(replacementString); | ||
} | ||
function doConfigReplacements(source, config) { | ||
var sourceLines = source.split('\n'); | ||
var returnLines = []; | ||
var inConfig, anchorIndent, finished; | ||
sourceLines.forEach(function(line) { | ||
if (finished) { | ||
returnLines.push(line); | ||
} else { | ||
if (inConfig && line[0] !== ' ') { // back to 0 indent after x-a127-config == we're done | ||
finished = true; | ||
returnLines.push(line); | ||
} else { | ||
var tokens = line.trim().split(' '); | ||
var firstToken = tokens[0]; | ||
if (inConfig) { // this is potential config stuff, let's do it | ||
var indent = line.indexOf(tokens[0]); | ||
if (anchorIndent) { // we're inside a tag | ||
if (indent <= anchorIndent) { anchorIndent = null; } | ||
} | ||
if (!anchorIndent) { // start a tag? | ||
var anchor = getAnchor(tokens); | ||
if (anchor) { | ||
var configKey = anchor.slice(1); | ||
var configValue = config[configKey]; | ||
if (configValue) { // we need to do a replacement | ||
anchorIndent = indent; | ||
var upTo = line.lastIndexOf(anchor) + anchor.length; | ||
var partialLine = line.slice(0, upTo); // cut off anything after the reference | ||
var configYaml = yaml.stringify(configValue); | ||
if (typeof(configValue) === 'string') { // string goes inline | ||
partialLine += ' ' + configYaml; | ||
returnLines.push(partialLine); | ||
} else { | ||
returnLines.push(partialLine); // anything else on following lines | ||
var yamlLines = configYaml.split('\n'); | ||
var spaces = Array(indent + 3).join(' '); | ||
for (var i = 0; i < yamlLines.length - 1; i++) { // length - 1 because last line is empty (was \n) | ||
returnLines.push(spaces + yamlLines[i]); | ||
} | ||
} | ||
} else { | ||
returnLines.push(line); | ||
} | ||
} else { | ||
returnLines.push(line); | ||
} | ||
} | ||
} else if (firstToken.indexOf('x-a127-config') === 0) { | ||
inConfig = true; | ||
returnLines.push(line); | ||
} else { | ||
returnLines.push(line); | ||
} | ||
} | ||
} | ||
}); | ||
var replacementString = returnLines.join('\n'); | ||
return replacementString; | ||
} | ||
function getAnchor(tokens) { | ||
for (var i = tokens.length - 1; i > 0; i--) { | ||
if (tokens[i][0] === '&') { return tokens[i]; } | ||
} | ||
return undefined; | ||
} | ||
function isAnchor(token) { | ||
return token[token.length - 1] === '&'; | ||
} |
'use strict'; | ||
var config = require('./config'); | ||
var a127Config = require('./config'); | ||
var swaggerTools = require('swagger-tools').middleware.v2_0; | ||
@@ -11,3 +11,4 @@ var volosSwagger = require('volos-swagger'); | ||
var swaggerObject = config.loader.load(config.swaggerFile); | ||
var config = a127Config.load(); | ||
var swaggerObject = config.loader.load(); | ||
@@ -14,0 +15,0 @@ return chain([ |
{ | ||
"name": "a127-magic", | ||
"version": "0.0.2", | ||
"version": "0.1.0", | ||
"description": "Apigee 127 Swagger Loader and Middleware", | ||
@@ -18,3 +18,4 @@ "keywords": [ | ||
"underscore": "", | ||
"js-yaml": "" | ||
"yamljs": "", | ||
"debug": "" | ||
}, | ||
@@ -21,0 +22,0 @@ "devDependencies": { |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Bad dependency semver
QualityPackage has dependencies with an invalid semantic version. This could be a sign of beta, low quality, or unmaintained dependencies.
Found 2 instances in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 3 instances in 1 package
Bad dependency semver
QualityPackage has dependencies with an invalid semantic version. This could be a sign of beta, low quality, or unmaintained dependencies.
Found 1 instance in 1 package
64708
27
314
5
7
15
1