js/lib/browser/Configuration.js
var extend = require('node.extend');
var _overrides = require('../overrides/all');
var s = require('../helpers/string');
var ONE_INDENT = /(\d+)([st])/;
var styles = {
nested: null,
expanded: null,
compact: null,
compressed: null
};
var newlines = {
lf: '\n',
crlf: '\r\n'
};
var quotes = {
'double': '"',
'single': '\''
};
var Configuration = (function () {
function Configuration(options) {
this.raw = {};
this.set(require('../../defaults.browser.json'));
this.set(options);
}
Configuration.prototype.clone = function () {
var clone = new Configuration(this.raw);
clone.overrides = this.overrides;
return clone;
};
Configuration.prototype.set = function (options) {
extend(this.raw, options || {});
return this;
};
Configuration.prototype.toString = function () {
return JSON.stringify(this.raw);
};
Object.defineProperty(Configuration.prototype, "config", {
/**
* The location of the config file
*/
get: function () {
return this.raw.config;
},
set: function (path) {
this.raw.config = path;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "quiet", {
get: function () {
return this.raw.quiet;
},
set: function (value) {
this.raw.quiet = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "trace", {
get: function () {
return this.raw.trace;
},
set: function (value) {
this.raw.trace = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "force", {
get: function () {
return this.raw.force;
},
set: function (value) {
this.raw.force = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "boring", {
get: function () {
return this.raw.boring;
},
set: function (value) {
this.raw.boring = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "style", {
get: function () {
return this.raw.style;
},
set: function (value) {
value = value.toLowerCase();
if (!styles.hasOwnProperty(value)) {
throw new Error('Unsupported style: ' + value);
}
this.raw.style = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "oneIndent", {
get: function () {
switch (this.style) {
case 'compact':
case 'compressed':
return '';
default:
if (this.raw.oneIndent === '0') {
return '';
}
var m = this.raw.oneIndent.match(ONE_INDENT);
return s.repeat({ s: ' ', t: '\t' }[m[2]], parseInt(m[1], 10));
}
},
set: function (value) {
if (value.toString()[0] === '0') {
this.raw.oneIndent = '0';
return;
}
value = value.toString().toLowerCase();
if (!ONE_INDENT.test(value)) {
throw new Error('Unsupported oneIndent format: ' + value);
}
this.raw.oneIndent = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "newline", {
get: function () {
switch (this.style) {
case 'compact':
case 'compressed':
return '';
default:
return newlines[this.raw.newline];
}
},
set: function (value) {
value = value.toLowerCase();
if (!newlines.hasOwnProperty(value)) {
throw new Error('Unsupported newline: ' + value);
}
this.raw.newline = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "quote", {
get: function () {
return quotes[this.raw.quote];
},
set: function (value) {
value = value.toLowerCase();
if (!quotes.hasOwnProperty(value)) {
throw new Error('Unsupported quote type: ' + value);
}
this.raw.quote = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "oneSpace", {
get: function () {
return (this.style === 'compressed') ? '' : ' ';
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "declarationSeparator", {
get: function () {
switch (this.style) {
case 'compact':
return ' ';
case 'compressed':
return '';
default:
return this.newline;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "ruleSeparator", {
get: function () {
switch (this.style) {
case 'compact':
return newlines[this.raw.newline];
case 'compressed':
return '';
default:
return this.newline;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "block", {
get: function () {
return this.raw.block;
},
set: function (value) {
if (value.indexOf('%s') === -1) {
throw new Error('Invalid block format. Expected "%s".');
}
this.raw.block = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "element", {
get: function () {
return this.raw.element;
},
set: function (value) {
if (value.indexOf('%s') === -1) {
throw new Error('Invalid element format. Expected "%s".');
}
this.raw.element = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "modifier", {
get: function () {
return this.raw.modifier;
},
set: function (value) {
if (value.indexOf('%s') === -1) {
throw new Error('Invalid modifier format. Expected "%s".');
}
this.raw.modifier = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(Configuration.prototype, "overrides", {
get: function () {
return _overrides;
},
enumerable: true,
configurable: true
});
return Configuration;
})();
module.exports = Configuration;