This repository has been archived by the owner on Sep 17, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 9
/
index.js
97 lines (87 loc) · 2.18 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
'use strict'
/*
* pope
*
* (c) Harminder Virk <[email protected]>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/*
|--------------------------------------------------------------------------
| ES5
|--------------------------------------------------------------------------
|
| Since I want this module to work as it is in browsers, I have used the
| possible plain Javascript
|
*/
function uncurryThis (fn) {
return function () {
return Function.call.apply(fn, arguments)
}
}
const hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty)
function isObj (obj) {
return obj !== null && typeof (obj) === 'object'
}
/**
* @description get nested properties from a given
* object using dot notation
*
* @method prop
*
* @param {Object} obj
* @param {String} path
*
* @return {Mixed}
*/
function prop (obj, path) {
if (!isObj(obj) || typeof path !== 'string') {
return obj
}
const pathArr = path.split('.')
for (let i = 0; i < pathArr.length; i++) {
const p = pathArr[i]
obj = hasOwnProperty(obj, p) ? obj[p] : null
if (obj === null) {
break
}
}
return obj
}
/**
* @description parses a given template string and
* replace dynamic placeholders with actual data.
*
* @method pope
*
* @param {String} string
* @param {Object} data
*
* @return {String}
*/
function pope (string, data, options) {
options = options || { skipUndefined: false, throwOnUndefined: false }
const regex = /{{2}(.+?)}{2}/g
let result
let formattedString = string
while ((result = regex.exec(string)) !== null) {
const item = result[1].trim()
if (item) {
const value = prop(data, item)
if (value !== undefined && value !== null) {
formattedString = formattedString.replace(result[0], value)
} else if (options.throwOnUndefined) {
const error = new Error('Missing value for ' + result[0])
error.key = item
error.code = 'E_MISSING_KEY'
throw error
} else if (!options.skipUndefined) {
formattedString = formattedString.replace(result[0], '')
}
}
}
return formattedString
}
export { pope, prop }