UNPKG

1.96 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6
7const getProperty = (obj, name) => {
8 name = name.split(".");
9 for (let i = 0; i < name.length - 1; i++) {
10 obj = obj[name[i]];
11 if (typeof obj !== "object" || !obj || Array.isArray(obj)) return;
12 }
13 return obj[name.pop()];
14};
15
16const setProperty = (obj, name, value) => {
17 name = name.split(".");
18 for (let i = 0; i < name.length - 1; i++) {
19 if (typeof obj[name[i]] !== "object" && obj[name[i]] !== undefined) return;
20 if (Array.isArray(obj[name[i]])) return;
21 if (!obj[name[i]]) obj[name[i]] = {};
22 obj = obj[name[i]];
23 }
24 obj[name.pop()] = value;
25};
26
27class OptionsDefaulter {
28 constructor() {
29 this.defaults = {};
30 this.config = {};
31 }
32
33 process(options) {
34 options = Object.assign({}, options);
35 for (let name in this.defaults) {
36 switch (this.config[name]) {
37 case undefined:
38 if (getProperty(options, name) === undefined) {
39 setProperty(options, name, this.defaults[name]);
40 }
41 break;
42 case "call":
43 setProperty(
44 options,
45 name,
46 this.defaults[name].call(this, getProperty(options, name), options)
47 );
48 break;
49 case "make":
50 if (getProperty(options, name) === undefined) {
51 setProperty(options, name, this.defaults[name].call(this, options));
52 }
53 break;
54 case "append": {
55 let oldValue = getProperty(options, name);
56 if (!Array.isArray(oldValue)) {
57 oldValue = [];
58 }
59 oldValue.push(...this.defaults[name]);
60 setProperty(options, name, oldValue);
61 break;
62 }
63 default:
64 throw new Error(
65 "OptionsDefaulter cannot process " + this.config[name]
66 );
67 }
68 }
69 return options;
70 }
71
72 set(name, config, def) {
73 if (def !== undefined) {
74 this.defaults[name] = def;
75 this.config[name] = config;
76 } else {
77 this.defaults[name] = config;
78 delete this.config[name];
79 }
80 }
81}
82
83module.exports = OptionsDefaulter;