@truto/replace-placeholders 1.0.5 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/main.cjs +36 -30
- package/dist/main.cjs.map +1 -1
- package/dist/module.js +33 -30
- package/dist/module.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +13 -8
package/dist/main.cjs
CHANGED
|
@@ -3,12 +3,15 @@ var $g5Y9E$lodashes = require("lodash-es");
|
|
|
3
3
|
var $g5Y9E$traverse = require("traverse");
|
|
4
4
|
var $g5Y9E$wildwildpath = require("wild-wild-path");
|
|
5
5
|
|
|
6
|
+
|
|
6
7
|
function $parcel$defineInteropFlag(a) {
|
|
7
8
|
Object.defineProperty(a, '__esModule', {value: true, configurable: true});
|
|
8
9
|
}
|
|
10
|
+
|
|
9
11
|
function $parcel$export(e, n, v, s) {
|
|
10
12
|
Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
|
|
11
13
|
}
|
|
14
|
+
|
|
12
15
|
function $parcel$interopDefault(a) {
|
|
13
16
|
return a && a.__esModule ? a.default : a;
|
|
14
17
|
}
|
|
@@ -21,24 +24,24 @@ $parcel$export(module.exports, "default", () => $80bd448eb6ea085b$export$2e2bcd8
|
|
|
21
24
|
|
|
22
25
|
|
|
23
26
|
|
|
24
|
-
function $a169b0c20575e4d3$var$replace(str =
|
|
27
|
+
function $a169b0c20575e4d3$var$replace(str = '', obj = {}) {
|
|
25
28
|
const regex = /{{([\w-./|:?\s]+)}}/gi;
|
|
26
29
|
const typeSplitRegex = /:(?=[\w\s]+)/gm;
|
|
27
30
|
const matches = str.match(regex);
|
|
28
31
|
let result = str;
|
|
29
32
|
if (matches) matches.forEach((match)=>{
|
|
30
|
-
const [matchStr, defaultStr] = match.slice(2, -2).split(
|
|
31
|
-
const parts = matchStr.split(
|
|
32
|
-
const isNullAllowed = parts.some((part)=>part.includes(
|
|
33
|
-
const ignoreEmptyString = parts.some((part)=>part.includes(
|
|
34
|
-
const setUndefined = parts.some((part)=>part.includes(
|
|
33
|
+
const [matchStr, defaultStr] = match.slice(2, -2).split('?:');
|
|
34
|
+
const parts = matchStr.split('|');
|
|
35
|
+
const isNullAllowed = parts.some((part)=>part.includes(':null'));
|
|
36
|
+
const ignoreEmptyString = parts.some((part)=>part.includes(':ignore-empty-str'));
|
|
37
|
+
const setUndefined = parts.some((part)=>part.includes(':undefined'));
|
|
35
38
|
const isWholeString = match === str;
|
|
36
39
|
let value = undefined;
|
|
37
40
|
for (const part of parts){
|
|
38
41
|
const [path, ...typeParts] = part.split(typeSplitRegex);
|
|
39
|
-
const type = (typeParts[0] ||
|
|
42
|
+
const type = (typeParts[0] || 'str').trim();
|
|
40
43
|
const tempValue = (0, $g5Y9E$wildwildpath.get)(obj, path.trim());
|
|
41
|
-
if (tempValue ===
|
|
44
|
+
if (tempValue === '' && ignoreEmptyString) continue;
|
|
42
45
|
if (tempValue !== undefined) {
|
|
43
46
|
value = $a169b0c20575e4d3$var$typeCast(tempValue, type, isWholeString);
|
|
44
47
|
break;
|
|
@@ -46,12 +49,12 @@ function $a169b0c20575e4d3$var$replace(str = "", obj = {}) {
|
|
|
46
49
|
}
|
|
47
50
|
if (value === undefined && defaultStr) {
|
|
48
51
|
const [defaultValue, defaultType] = defaultStr.split(typeSplitRegex);
|
|
49
|
-
const type = defaultType ||
|
|
52
|
+
const type = defaultType || 'str';
|
|
50
53
|
value = $a169b0c20575e4d3$var$typeCast(defaultValue, type, isWholeString);
|
|
51
54
|
} else if (value === undefined) {
|
|
52
55
|
if (setUndefined) {
|
|
53
56
|
if (isWholeString) value = undefined;
|
|
54
|
-
else value =
|
|
57
|
+
else value = '';
|
|
55
58
|
} else if (isNullAllowed) value = null;
|
|
56
59
|
else value = match // Keep the placeholder intact
|
|
57
60
|
;
|
|
@@ -64,31 +67,31 @@ function $a169b0c20575e4d3$var$replace(str = "", obj = {}) {
|
|
|
64
67
|
function $a169b0c20575e4d3$var$typeCast(value, type, isWholeString) {
|
|
65
68
|
if (value === undefined || value === null) return value;
|
|
66
69
|
let valueToCheck = value;
|
|
67
|
-
if ((0, $g5Y9E$lodashes.isString)(value) && type !==
|
|
70
|
+
if ((0, $g5Y9E$lodashes.isString)(value) && type !== 'str') valueToCheck = (0, $g5Y9E$lodashes.trim)(value);
|
|
68
71
|
if (valueToCheck instanceof Blob || valueToCheck instanceof ReadableStream || valueToCheck instanceof WritableStream || valueToCheck instanceof TransformStream) return valueToCheck;
|
|
69
72
|
let castValue;
|
|
70
73
|
switch(type){
|
|
71
|
-
case
|
|
74
|
+
case 'ignore-empty-str':
|
|
72
75
|
return valueToCheck;
|
|
73
|
-
case
|
|
76
|
+
case 'undefined':
|
|
74
77
|
return valueToCheck;
|
|
75
|
-
case
|
|
76
|
-
if (valueToCheck ===
|
|
77
|
-
return isWholeString ? valueToCheck :
|
|
78
|
-
case
|
|
78
|
+
case 'null':
|
|
79
|
+
if (valueToCheck === 'null' || valueToCheck === null) return null;
|
|
80
|
+
return isWholeString ? valueToCheck : 'null';
|
|
81
|
+
case 'int':
|
|
79
82
|
castValue = parseInt(valueToCheck);
|
|
80
83
|
return isNaN(castValue) ? valueToCheck : castValue;
|
|
81
|
-
case
|
|
84
|
+
case 'num':
|
|
82
85
|
castValue = parseFloat(valueToCheck);
|
|
83
86
|
return isNaN(castValue) ? valueToCheck : castValue;
|
|
84
|
-
case
|
|
87
|
+
case 'str':
|
|
85
88
|
return (0, $g5Y9E$lodashes.toString)(value);
|
|
86
|
-
case
|
|
87
|
-
if (valueToCheck ===
|
|
88
|
-
if (valueToCheck ===
|
|
89
|
+
case 'bool':
|
|
90
|
+
if (valueToCheck === 'true' || valueToCheck === true) return true;
|
|
91
|
+
if (valueToCheck === 'false' || valueToCheck === false) return false;
|
|
89
92
|
return valueToCheck // Return the original value if it's not 'true' or 'false'
|
|
90
93
|
;
|
|
91
|
-
case
|
|
94
|
+
case 'json':
|
|
92
95
|
if (isWholeString) {
|
|
93
96
|
if ((0, $g5Y9E$lodashes.isPlainObject)(valueToCheck) || (0, $g5Y9E$lodashes.isArray)(valueToCheck)) return valueToCheck;
|
|
94
97
|
try {
|
|
@@ -98,7 +101,7 @@ function $a169b0c20575e4d3$var$typeCast(value, type, isWholeString) {
|
|
|
98
101
|
}
|
|
99
102
|
}
|
|
100
103
|
return valueToCheck;
|
|
101
|
-
case
|
|
104
|
+
case 'any':
|
|
102
105
|
return valueToCheck;
|
|
103
106
|
default:
|
|
104
107
|
throw new Error(`Unsupported type: ${type}`);
|
|
@@ -111,9 +114,11 @@ function $72af1098ef591494$export$2e2bcd8739ae039(obj, context) {
|
|
|
111
114
|
if ((0, $g5Y9E$lodashes.isString)(obj)) return (0, $a169b0c20575e4d3$export$2e2bcd8739ae039)(obj, context);
|
|
112
115
|
if ((0, $g5Y9E$lodashes.isArray)(obj)) return obj.map((item)=>$72af1098ef591494$export$2e2bcd8739ae039(item, context));
|
|
113
116
|
if ((0, $g5Y9E$lodashes.isPlainObject)(obj)) {
|
|
114
|
-
// First pass: replace all string placeholders
|
|
117
|
+
// First pass: replace all string placeholders and track if $truto_merge exists
|
|
118
|
+
let hasMergeKey = false;
|
|
115
119
|
const replaced = (0, ($parcel$interopDefault($g5Y9E$traverse)))(obj).map(function(value) {
|
|
116
120
|
if (this.circular) this.remove();
|
|
121
|
+
else if ((0, $g5Y9E$lodashes.isPlainObject)(value) && '$truto_merge' in value) hasMergeKey = true;
|
|
117
122
|
else if ((0, $g5Y9E$lodashes.isString)(value)) this.update((0, $a169b0c20575e4d3$export$2e2bcd8739ae039)(value, context));
|
|
118
123
|
else if ((0, $g5Y9E$lodashes.isArrayBuffer)(value) || value instanceof Blob) {
|
|
119
124
|
const val = (0, $g5Y9E$lodashes.get)(obj, this.path);
|
|
@@ -121,17 +126,18 @@ function $72af1098ef591494$export$2e2bcd8739ae039(obj, context) {
|
|
|
121
126
|
this.block();
|
|
122
127
|
}
|
|
123
128
|
});
|
|
124
|
-
// Second pass: handle $truto_merge
|
|
129
|
+
// Second pass: handle $truto_merge (only if needed)
|
|
130
|
+
if (!hasMergeKey) return replaced;
|
|
125
131
|
return (0, ($parcel$interopDefault($g5Y9E$traverse)))(replaced).map(function(value) {
|
|
126
132
|
if (this.circular) this.remove();
|
|
127
|
-
else if ((0, $g5Y9E$lodashes.isPlainObject)(value) &&
|
|
128
|
-
const mergeValue = value[
|
|
133
|
+
else if ((0, $g5Y9E$lodashes.isPlainObject)(value) && '$truto_merge' in value) {
|
|
134
|
+
const mergeValue = value['$truto_merge'];
|
|
129
135
|
const mergeValues = (0, $g5Y9E$lodashes.isArray)(mergeValue) ? mergeValue : [
|
|
130
136
|
mergeValue
|
|
131
137
|
];
|
|
132
138
|
// Start with the base object (without $truto_merge key)
|
|
133
139
|
let result = {};
|
|
134
|
-
for(const key in value)if (key !==
|
|
140
|
+
for(const key in value)if (key !== '$truto_merge') result[key] = value[key];
|
|
135
141
|
// Merge each resolved value (already resolved in first pass)
|
|
136
142
|
for (const resolvedValue of mergeValues)// Only merge if it's a plain object
|
|
137
143
|
if ((0, $g5Y9E$lodashes.isPlainObject)(resolvedValue)) result = (0, ($parcel$interopDefault($g5Y9E$deepmerge)))(result, resolvedValue);
|
|
@@ -139,7 +145,7 @@ function $72af1098ef591494$export$2e2bcd8739ae039(obj, context) {
|
|
|
139
145
|
}
|
|
140
146
|
});
|
|
141
147
|
}
|
|
142
|
-
throw new Error(
|
|
148
|
+
throw new Error('Invalid type');
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
|
package/dist/main.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"
|
|
1
|
+
{"mappings":"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","sources":["index.ts","replacePlaceholders.ts","replace.ts"],"sourcesContent":["import replacePlaceholders from './replacePlaceholders';\nexport default replacePlaceholders;\n","import deepmerge from 'deepmerge'\nimport { get, isArray, isArrayBuffer, isPlainObject, isString } from 'lodash-es'\nimport traverse from 'traverse'\nimport replace from './replace'\nexport default function replacePlaceholders<T>(\n obj: T extends string | string[] | Record<string, unknown> ? T : never,\n context: Record<string, unknown>\n): T {\n if (isString(obj)) {\n return replace(obj, context) as T\n }\n\n if (isArray(obj)) {\n return obj.map(item => replacePlaceholders(item, context)) as T\n }\n\n if (isPlainObject(obj)) {\n // First pass: replace all string placeholders and track if $truto_merge exists\n let hasMergeKey = false\n const replaced = traverse(obj).map(function (value) {\n if (this.circular) {\n this.remove()\n } else if (isPlainObject(value) && '$truto_merge' in value) {\n hasMergeKey = true\n } else if (isString(value)) {\n this.update(replace(value, context))\n } else if (isArrayBuffer(value) || value instanceof Blob) {\n const val = get(obj, this.path)\n this.update(val)\n this.block()\n }\n })\n\n // Second pass: handle $truto_merge (only if needed)\n if (!hasMergeKey) {\n return replaced as T\n }\n\n return traverse(replaced).map(function (value) {\n if (this.circular) {\n this.remove()\n } else if (isPlainObject(value) && '$truto_merge' in value) {\n const mergeValue = value['$truto_merge']\n const mergeValues = isArray(mergeValue) ? mergeValue : [mergeValue]\n\n // Start with the base object (without $truto_merge key)\n let result: Record<string, unknown> = {}\n for (const key in value) {\n if (key !== '$truto_merge') {\n result[key] = value[key]\n }\n }\n\n // Merge each resolved value (already resolved in first pass)\n for (const resolvedValue of mergeValues) {\n // Only merge if it's a plain object\n if (isPlainObject(resolvedValue)) {\n result = deepmerge(result, resolvedValue as Record<string, unknown>)\n }\n // Skip if it's undefined, null, a string (unresolved placeholder), or any non-object\n }\n\n this.update(result)\n }\n }) as T\n }\n\n throw new Error('Invalid type')\n}\n","import { isArray, isPlainObject, isString, toString, trim } from 'lodash-es'\nimport { get as getWild } from 'wild-wild-path'\n\nfunction replace(\n str = '',\n obj: object = {}\n):\n | string\n | number\n | boolean\n | Record<string, unknown>\n | null\n | undefined\n | unknown {\n const regex = /{{([\\w-./|:?\\s]+)}}/gi\n const typeSplitRegex = /:(?=[\\w\\s]+)/gm\n const matches = str.match(regex)\n let result: string | any = str\n\n if (matches) {\n matches.forEach(match => {\n const [matchStr, defaultStr] = match.slice(2, -2).split('?:')\n const parts = matchStr.split('|')\n const isNullAllowed = parts.some(part => part.includes(':null'))\n const ignoreEmptyString = parts.some(part =>\n part.includes(':ignore-empty-str')\n )\n const setUndefined = parts.some(part => part.includes(':undefined'))\n\n const isWholeString = match === str\n\n let value: any = undefined\n for (const part of parts) {\n const [path, ...typeParts] = part.split(typeSplitRegex)\n const type: string = (typeParts[0] || 'str').trim()\n\n const tempValue = getWild(obj, path.trim())\n if (tempValue === '' && ignoreEmptyString) {\n continue\n }\n if (tempValue !== undefined) {\n value = typeCast(tempValue, type, isWholeString)\n break\n }\n }\n\n if (value === undefined && defaultStr) {\n const [defaultValue, defaultType] = defaultStr.split(typeSplitRegex)\n const type = defaultType || 'str'\n value = typeCast(defaultValue, type, isWholeString)\n } else if (value === undefined) {\n if (setUndefined) {\n if (isWholeString) {\n value = undefined\n } else {\n value = ''\n }\n } else if (isNullAllowed) {\n value = null\n } else {\n value = match // Keep the placeholder intact\n }\n }\n\n if (match === str) {\n result = value\n } else {\n result = result.replace(match, value)\n }\n })\n }\n\n return result\n}\n\nfunction typeCast(\n value: unknown,\n type: string,\n isWholeString: boolean\n):\n | string\n | number\n | boolean\n | Record<string, unknown>\n | null\n | undefined\n | unknown {\n if (value === undefined || value === null) return value\n\n let valueToCheck = value\n if (isString(value) && type !== 'str') {\n valueToCheck = trim(value)\n }\n\n if (\n valueToCheck instanceof Blob ||\n valueToCheck instanceof ReadableStream ||\n valueToCheck instanceof WritableStream ||\n valueToCheck instanceof TransformStream\n ) {\n return valueToCheck\n }\n\n let castValue: any\n switch (type) {\n case 'ignore-empty-str':\n return valueToCheck\n case 'undefined':\n return valueToCheck\n case 'null':\n if (valueToCheck === 'null' || valueToCheck === null) return null\n return isWholeString ? valueToCheck : 'null'\n case 'int':\n castValue = parseInt(valueToCheck as string)\n return isNaN(castValue) ? valueToCheck : castValue\n case 'num':\n castValue = parseFloat(valueToCheck as string)\n return isNaN(castValue) ? valueToCheck : castValue\n case 'str':\n return toString(value)\n case 'bool':\n if (valueToCheck === 'true' || valueToCheck === true) return true\n if (valueToCheck === 'false' || valueToCheck === false) return false\n return valueToCheck // Return the original value if it's not 'true' or 'false'\n case 'json':\n if (isWholeString) {\n if (isPlainObject(valueToCheck) || isArray(valueToCheck))\n return valueToCheck\n try {\n return JSON.parse(valueToCheck as string)\n } catch (err) {\n return valueToCheck\n }\n }\n return valueToCheck\n case 'any':\n return valueToCheck\n default:\n throw new Error(`Unsupported type: ${type}`)\n }\n}\n\nexport default replace\n"],"names":[],"version":3,"file":"main.cjs.map"}
|
package/dist/module.js
CHANGED
|
@@ -8,24 +8,24 @@ import {get as $hCgyA$get1} from "wild-wild-path";
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
|
|
11
|
-
function $67f2b908c91abfcc$var$replace(str =
|
|
11
|
+
function $67f2b908c91abfcc$var$replace(str = '', obj = {}) {
|
|
12
12
|
const regex = /{{([\w-./|:?\s]+)}}/gi;
|
|
13
13
|
const typeSplitRegex = /:(?=[\w\s]+)/gm;
|
|
14
14
|
const matches = str.match(regex);
|
|
15
15
|
let result = str;
|
|
16
16
|
if (matches) matches.forEach((match)=>{
|
|
17
|
-
const [matchStr, defaultStr] = match.slice(2, -2).split(
|
|
18
|
-
const parts = matchStr.split(
|
|
19
|
-
const isNullAllowed = parts.some((part)=>part.includes(
|
|
20
|
-
const ignoreEmptyString = parts.some((part)=>part.includes(
|
|
21
|
-
const setUndefined = parts.some((part)=>part.includes(
|
|
17
|
+
const [matchStr, defaultStr] = match.slice(2, -2).split('?:');
|
|
18
|
+
const parts = matchStr.split('|');
|
|
19
|
+
const isNullAllowed = parts.some((part)=>part.includes(':null'));
|
|
20
|
+
const ignoreEmptyString = parts.some((part)=>part.includes(':ignore-empty-str'));
|
|
21
|
+
const setUndefined = parts.some((part)=>part.includes(':undefined'));
|
|
22
22
|
const isWholeString = match === str;
|
|
23
23
|
let value = undefined;
|
|
24
24
|
for (const part of parts){
|
|
25
25
|
const [path, ...typeParts] = part.split(typeSplitRegex);
|
|
26
|
-
const type = (typeParts[0] ||
|
|
26
|
+
const type = (typeParts[0] || 'str').trim();
|
|
27
27
|
const tempValue = (0, $hCgyA$get1)(obj, path.trim());
|
|
28
|
-
if (tempValue ===
|
|
28
|
+
if (tempValue === '' && ignoreEmptyString) continue;
|
|
29
29
|
if (tempValue !== undefined) {
|
|
30
30
|
value = $67f2b908c91abfcc$var$typeCast(tempValue, type, isWholeString);
|
|
31
31
|
break;
|
|
@@ -33,12 +33,12 @@ function $67f2b908c91abfcc$var$replace(str = "", obj = {}) {
|
|
|
33
33
|
}
|
|
34
34
|
if (value === undefined && defaultStr) {
|
|
35
35
|
const [defaultValue, defaultType] = defaultStr.split(typeSplitRegex);
|
|
36
|
-
const type = defaultType ||
|
|
36
|
+
const type = defaultType || 'str';
|
|
37
37
|
value = $67f2b908c91abfcc$var$typeCast(defaultValue, type, isWholeString);
|
|
38
38
|
} else if (value === undefined) {
|
|
39
39
|
if (setUndefined) {
|
|
40
40
|
if (isWholeString) value = undefined;
|
|
41
|
-
else value =
|
|
41
|
+
else value = '';
|
|
42
42
|
} else if (isNullAllowed) value = null;
|
|
43
43
|
else value = match // Keep the placeholder intact
|
|
44
44
|
;
|
|
@@ -51,31 +51,31 @@ function $67f2b908c91abfcc$var$replace(str = "", obj = {}) {
|
|
|
51
51
|
function $67f2b908c91abfcc$var$typeCast(value, type, isWholeString) {
|
|
52
52
|
if (value === undefined || value === null) return value;
|
|
53
53
|
let valueToCheck = value;
|
|
54
|
-
if ((0, $hCgyA$isString)(value) && type !==
|
|
54
|
+
if ((0, $hCgyA$isString)(value) && type !== 'str') valueToCheck = (0, $hCgyA$trim)(value);
|
|
55
55
|
if (valueToCheck instanceof Blob || valueToCheck instanceof ReadableStream || valueToCheck instanceof WritableStream || valueToCheck instanceof TransformStream) return valueToCheck;
|
|
56
56
|
let castValue;
|
|
57
57
|
switch(type){
|
|
58
|
-
case
|
|
58
|
+
case 'ignore-empty-str':
|
|
59
59
|
return valueToCheck;
|
|
60
|
-
case
|
|
60
|
+
case 'undefined':
|
|
61
61
|
return valueToCheck;
|
|
62
|
-
case
|
|
63
|
-
if (valueToCheck ===
|
|
64
|
-
return isWholeString ? valueToCheck :
|
|
65
|
-
case
|
|
62
|
+
case 'null':
|
|
63
|
+
if (valueToCheck === 'null' || valueToCheck === null) return null;
|
|
64
|
+
return isWholeString ? valueToCheck : 'null';
|
|
65
|
+
case 'int':
|
|
66
66
|
castValue = parseInt(valueToCheck);
|
|
67
67
|
return isNaN(castValue) ? valueToCheck : castValue;
|
|
68
|
-
case
|
|
68
|
+
case 'num':
|
|
69
69
|
castValue = parseFloat(valueToCheck);
|
|
70
70
|
return isNaN(castValue) ? valueToCheck : castValue;
|
|
71
|
-
case
|
|
71
|
+
case 'str':
|
|
72
72
|
return (0, $hCgyA$toString)(value);
|
|
73
|
-
case
|
|
74
|
-
if (valueToCheck ===
|
|
75
|
-
if (valueToCheck ===
|
|
73
|
+
case 'bool':
|
|
74
|
+
if (valueToCheck === 'true' || valueToCheck === true) return true;
|
|
75
|
+
if (valueToCheck === 'false' || valueToCheck === false) return false;
|
|
76
76
|
return valueToCheck // Return the original value if it's not 'true' or 'false'
|
|
77
77
|
;
|
|
78
|
-
case
|
|
78
|
+
case 'json':
|
|
79
79
|
if (isWholeString) {
|
|
80
80
|
if ((0, $hCgyA$isPlainObject)(valueToCheck) || (0, $hCgyA$isArray)(valueToCheck)) return valueToCheck;
|
|
81
81
|
try {
|
|
@@ -85,7 +85,7 @@ function $67f2b908c91abfcc$var$typeCast(value, type, isWholeString) {
|
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
return valueToCheck;
|
|
88
|
-
case
|
|
88
|
+
case 'any':
|
|
89
89
|
return valueToCheck;
|
|
90
90
|
default:
|
|
91
91
|
throw new Error(`Unsupported type: ${type}`);
|
|
@@ -98,9 +98,11 @@ function $4e62acd4800cacd9$export$2e2bcd8739ae039(obj, context) {
|
|
|
98
98
|
if ((0, $hCgyA$isString)(obj)) return (0, $67f2b908c91abfcc$export$2e2bcd8739ae039)(obj, context);
|
|
99
99
|
if ((0, $hCgyA$isArray)(obj)) return obj.map((item)=>$4e62acd4800cacd9$export$2e2bcd8739ae039(item, context));
|
|
100
100
|
if ((0, $hCgyA$isPlainObject)(obj)) {
|
|
101
|
-
// First pass: replace all string placeholders
|
|
101
|
+
// First pass: replace all string placeholders and track if $truto_merge exists
|
|
102
|
+
let hasMergeKey = false;
|
|
102
103
|
const replaced = (0, $hCgyA$traverse)(obj).map(function(value) {
|
|
103
104
|
if (this.circular) this.remove();
|
|
105
|
+
else if ((0, $hCgyA$isPlainObject)(value) && '$truto_merge' in value) hasMergeKey = true;
|
|
104
106
|
else if ((0, $hCgyA$isString)(value)) this.update((0, $67f2b908c91abfcc$export$2e2bcd8739ae039)(value, context));
|
|
105
107
|
else if ((0, $hCgyA$isArrayBuffer)(value) || value instanceof Blob) {
|
|
106
108
|
const val = (0, $hCgyA$get)(obj, this.path);
|
|
@@ -108,17 +110,18 @@ function $4e62acd4800cacd9$export$2e2bcd8739ae039(obj, context) {
|
|
|
108
110
|
this.block();
|
|
109
111
|
}
|
|
110
112
|
});
|
|
111
|
-
// Second pass: handle $truto_merge
|
|
113
|
+
// Second pass: handle $truto_merge (only if needed)
|
|
114
|
+
if (!hasMergeKey) return replaced;
|
|
112
115
|
return (0, $hCgyA$traverse)(replaced).map(function(value) {
|
|
113
116
|
if (this.circular) this.remove();
|
|
114
|
-
else if ((0, $hCgyA$isPlainObject)(value) &&
|
|
115
|
-
const mergeValue = value[
|
|
117
|
+
else if ((0, $hCgyA$isPlainObject)(value) && '$truto_merge' in value) {
|
|
118
|
+
const mergeValue = value['$truto_merge'];
|
|
116
119
|
const mergeValues = (0, $hCgyA$isArray)(mergeValue) ? mergeValue : [
|
|
117
120
|
mergeValue
|
|
118
121
|
];
|
|
119
122
|
// Start with the base object (without $truto_merge key)
|
|
120
123
|
let result = {};
|
|
121
|
-
for(const key in value)if (key !==
|
|
124
|
+
for(const key in value)if (key !== '$truto_merge') result[key] = value[key];
|
|
122
125
|
// Merge each resolved value (already resolved in first pass)
|
|
123
126
|
for (const resolvedValue of mergeValues)// Only merge if it's a plain object
|
|
124
127
|
if ((0, $hCgyA$isPlainObject)(resolvedValue)) result = (0, $hCgyA$deepmerge)(result, resolvedValue);
|
|
@@ -126,7 +129,7 @@ function $4e62acd4800cacd9$export$2e2bcd8739ae039(obj, context) {
|
|
|
126
129
|
}
|
|
127
130
|
});
|
|
128
131
|
}
|
|
129
|
-
throw new Error(
|
|
132
|
+
throw new Error('Invalid type');
|
|
130
133
|
}
|
|
131
134
|
|
|
132
135
|
|
package/dist/module.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"
|
|
1
|
+
{"mappings":"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","sources":["index.ts","replacePlaceholders.ts","replace.ts"],"sourcesContent":["import replacePlaceholders from './replacePlaceholders';\nexport default replacePlaceholders;\n","import deepmerge from 'deepmerge'\nimport { get, isArray, isArrayBuffer, isPlainObject, isString } from 'lodash-es'\nimport traverse from 'traverse'\nimport replace from './replace'\nexport default function replacePlaceholders<T>(\n obj: T extends string | string[] | Record<string, unknown> ? T : never,\n context: Record<string, unknown>\n): T {\n if (isString(obj)) {\n return replace(obj, context) as T\n }\n\n if (isArray(obj)) {\n return obj.map(item => replacePlaceholders(item, context)) as T\n }\n\n if (isPlainObject(obj)) {\n // First pass: replace all string placeholders and track if $truto_merge exists\n let hasMergeKey = false\n const replaced = traverse(obj).map(function (value) {\n if (this.circular) {\n this.remove()\n } else if (isPlainObject(value) && '$truto_merge' in value) {\n hasMergeKey = true\n } else if (isString(value)) {\n this.update(replace(value, context))\n } else if (isArrayBuffer(value) || value instanceof Blob) {\n const val = get(obj, this.path)\n this.update(val)\n this.block()\n }\n })\n\n // Second pass: handle $truto_merge (only if needed)\n if (!hasMergeKey) {\n return replaced as T\n }\n\n return traverse(replaced).map(function (value) {\n if (this.circular) {\n this.remove()\n } else if (isPlainObject(value) && '$truto_merge' in value) {\n const mergeValue = value['$truto_merge']\n const mergeValues = isArray(mergeValue) ? mergeValue : [mergeValue]\n\n // Start with the base object (without $truto_merge key)\n let result: Record<string, unknown> = {}\n for (const key in value) {\n if (key !== '$truto_merge') {\n result[key] = value[key]\n }\n }\n\n // Merge each resolved value (already resolved in first pass)\n for (const resolvedValue of mergeValues) {\n // Only merge if it's a plain object\n if (isPlainObject(resolvedValue)) {\n result = deepmerge(result, resolvedValue as Record<string, unknown>)\n }\n // Skip if it's undefined, null, a string (unresolved placeholder), or any non-object\n }\n\n this.update(result)\n }\n }) as T\n }\n\n throw new Error('Invalid type')\n}\n","import { isArray, isPlainObject, isString, toString, trim } from 'lodash-es'\nimport { get as getWild } from 'wild-wild-path'\n\nfunction replace(\n str = '',\n obj: object = {}\n):\n | string\n | number\n | boolean\n | Record<string, unknown>\n | null\n | undefined\n | unknown {\n const regex = /{{([\\w-./|:?\\s]+)}}/gi\n const typeSplitRegex = /:(?=[\\w\\s]+)/gm\n const matches = str.match(regex)\n let result: string | any = str\n\n if (matches) {\n matches.forEach(match => {\n const [matchStr, defaultStr] = match.slice(2, -2).split('?:')\n const parts = matchStr.split('|')\n const isNullAllowed = parts.some(part => part.includes(':null'))\n const ignoreEmptyString = parts.some(part =>\n part.includes(':ignore-empty-str')\n )\n const setUndefined = parts.some(part => part.includes(':undefined'))\n\n const isWholeString = match === str\n\n let value: any = undefined\n for (const part of parts) {\n const [path, ...typeParts] = part.split(typeSplitRegex)\n const type: string = (typeParts[0] || 'str').trim()\n\n const tempValue = getWild(obj, path.trim())\n if (tempValue === '' && ignoreEmptyString) {\n continue\n }\n if (tempValue !== undefined) {\n value = typeCast(tempValue, type, isWholeString)\n break\n }\n }\n\n if (value === undefined && defaultStr) {\n const [defaultValue, defaultType] = defaultStr.split(typeSplitRegex)\n const type = defaultType || 'str'\n value = typeCast(defaultValue, type, isWholeString)\n } else if (value === undefined) {\n if (setUndefined) {\n if (isWholeString) {\n value = undefined\n } else {\n value = ''\n }\n } else if (isNullAllowed) {\n value = null\n } else {\n value = match // Keep the placeholder intact\n }\n }\n\n if (match === str) {\n result = value\n } else {\n result = result.replace(match, value)\n }\n })\n }\n\n return result\n}\n\nfunction typeCast(\n value: unknown,\n type: string,\n isWholeString: boolean\n):\n | string\n | number\n | boolean\n | Record<string, unknown>\n | null\n | undefined\n | unknown {\n if (value === undefined || value === null) return value\n\n let valueToCheck = value\n if (isString(value) && type !== 'str') {\n valueToCheck = trim(value)\n }\n\n if (\n valueToCheck instanceof Blob ||\n valueToCheck instanceof ReadableStream ||\n valueToCheck instanceof WritableStream ||\n valueToCheck instanceof TransformStream\n ) {\n return valueToCheck\n }\n\n let castValue: any\n switch (type) {\n case 'ignore-empty-str':\n return valueToCheck\n case 'undefined':\n return valueToCheck\n case 'null':\n if (valueToCheck === 'null' || valueToCheck === null) return null\n return isWholeString ? valueToCheck : 'null'\n case 'int':\n castValue = parseInt(valueToCheck as string)\n return isNaN(castValue) ? valueToCheck : castValue\n case 'num':\n castValue = parseFloat(valueToCheck as string)\n return isNaN(castValue) ? valueToCheck : castValue\n case 'str':\n return toString(value)\n case 'bool':\n if (valueToCheck === 'true' || valueToCheck === true) return true\n if (valueToCheck === 'false' || valueToCheck === false) return false\n return valueToCheck // Return the original value if it's not 'true' or 'false'\n case 'json':\n if (isWholeString) {\n if (isPlainObject(valueToCheck) || isArray(valueToCheck))\n return valueToCheck\n try {\n return JSON.parse(valueToCheck as string)\n } catch (err) {\n return valueToCheck\n }\n }\n return valueToCheck\n case 'any':\n return valueToCheck\n default:\n throw new Error(`Unsupported type: ${type}`)\n }\n}\n\nexport default replace\n"],"names":[],"version":3,"file":"module.js.map"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"ACIA,qCAA4C,CAAC,EAC3C,GAAG,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,EACtE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,CAAC,
|
|
1
|
+
{"mappings":"ACIA,qCAA4C,CAAC,EAC3C,GAAG,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,EACtE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,CAAC,CA6DH;ACnED,eAAe,mBAAmB,CAAC","sources":["replace.ts","replacePlaceholders.ts","index.ts"],"sourcesContent":["import { isArray, isPlainObject, isString, toString, trim } from 'lodash-es'\nimport { get as getWild } from 'wild-wild-path'\n\nfunction replace(\n str = '',\n obj: object = {}\n):\n | string\n | number\n | boolean\n | Record<string, unknown>\n | null\n | undefined\n | unknown {\n const regex = /{{([\\w-./|:?\\s]+)}}/gi\n const typeSplitRegex = /:(?=[\\w\\s]+)/gm\n const matches = str.match(regex)\n let result: string | any = str\n\n if (matches) {\n matches.forEach(match => {\n const [matchStr, defaultStr] = match.slice(2, -2).split('?:')\n const parts = matchStr.split('|')\n const isNullAllowed = parts.some(part => part.includes(':null'))\n const ignoreEmptyString = parts.some(part =>\n part.includes(':ignore-empty-str')\n )\n const setUndefined = parts.some(part => part.includes(':undefined'))\n\n const isWholeString = match === str\n\n let value: any = undefined\n for (const part of parts) {\n const [path, ...typeParts] = part.split(typeSplitRegex)\n const type: string = (typeParts[0] || 'str').trim()\n\n const tempValue = getWild(obj, path.trim())\n if (tempValue === '' && ignoreEmptyString) {\n continue\n }\n if (tempValue !== undefined) {\n value = typeCast(tempValue, type, isWholeString)\n break\n }\n }\n\n if (value === undefined && defaultStr) {\n const [defaultValue, defaultType] = defaultStr.split(typeSplitRegex)\n const type = defaultType || 'str'\n value = typeCast(defaultValue, type, isWholeString)\n } else if (value === undefined) {\n if (setUndefined) {\n if (isWholeString) {\n value = undefined\n } else {\n value = ''\n }\n } else if (isNullAllowed) {\n value = null\n } else {\n value = match // Keep the placeholder intact\n }\n }\n\n if (match === str) {\n result = value\n } else {\n result = result.replace(match, value)\n }\n })\n }\n\n return result\n}\n\nfunction typeCast(\n value: unknown,\n type: string,\n isWholeString: boolean\n):\n | string\n | number\n | boolean\n | Record<string, unknown>\n | null\n | undefined\n | unknown {\n if (value === undefined || value === null) return value\n\n let valueToCheck = value\n if (isString(value) && type !== 'str') {\n valueToCheck = trim(value)\n }\n\n if (\n valueToCheck instanceof Blob ||\n valueToCheck instanceof ReadableStream ||\n valueToCheck instanceof WritableStream ||\n valueToCheck instanceof TransformStream\n ) {\n return valueToCheck\n }\n\n let castValue: any\n switch (type) {\n case 'ignore-empty-str':\n return valueToCheck\n case 'undefined':\n return valueToCheck\n case 'null':\n if (valueToCheck === 'null' || valueToCheck === null) return null\n return isWholeString ? valueToCheck : 'null'\n case 'int':\n castValue = parseInt(valueToCheck as string)\n return isNaN(castValue) ? valueToCheck : castValue\n case 'num':\n castValue = parseFloat(valueToCheck as string)\n return isNaN(castValue) ? valueToCheck : castValue\n case 'str':\n return toString(value)\n case 'bool':\n if (valueToCheck === 'true' || valueToCheck === true) return true\n if (valueToCheck === 'false' || valueToCheck === false) return false\n return valueToCheck // Return the original value if it's not 'true' or 'false'\n case 'json':\n if (isWholeString) {\n if (isPlainObject(valueToCheck) || isArray(valueToCheck))\n return valueToCheck\n try {\n return JSON.parse(valueToCheck as string)\n } catch (err) {\n return valueToCheck\n }\n }\n return valueToCheck\n case 'any':\n return valueToCheck\n default:\n throw new Error(`Unsupported type: ${type}`)\n }\n}\n\nexport default replace\n","import deepmerge from 'deepmerge'\nimport { get, isArray, isArrayBuffer, isPlainObject, isString } from 'lodash-es'\nimport traverse from 'traverse'\nimport replace from './replace'\nexport default function replacePlaceholders<T>(\n obj: T extends string | string[] | Record<string, unknown> ? T : never,\n context: Record<string, unknown>\n): T {\n if (isString(obj)) {\n return replace(obj, context) as T\n }\n\n if (isArray(obj)) {\n return obj.map(item => replacePlaceholders(item, context)) as T\n }\n\n if (isPlainObject(obj)) {\n // First pass: replace all string placeholders and track if $truto_merge exists\n let hasMergeKey = false\n const replaced = traverse(obj).map(function (value) {\n if (this.circular) {\n this.remove()\n } else if (isPlainObject(value) && '$truto_merge' in value) {\n hasMergeKey = true\n } else if (isString(value)) {\n this.update(replace(value, context))\n } else if (isArrayBuffer(value) || value instanceof Blob) {\n const val = get(obj, this.path)\n this.update(val)\n this.block()\n }\n })\n\n // Second pass: handle $truto_merge (only if needed)\n if (!hasMergeKey) {\n return replaced as T\n }\n\n return traverse(replaced).map(function (value) {\n if (this.circular) {\n this.remove()\n } else if (isPlainObject(value) && '$truto_merge' in value) {\n const mergeValue = value['$truto_merge']\n const mergeValues = isArray(mergeValue) ? mergeValue : [mergeValue]\n\n // Start with the base object (without $truto_merge key)\n let result: Record<string, unknown> = {}\n for (const key in value) {\n if (key !== '$truto_merge') {\n result[key] = value[key]\n }\n }\n\n // Merge each resolved value (already resolved in first pass)\n for (const resolvedValue of mergeValues) {\n // Only merge if it's a plain object\n if (isPlainObject(resolvedValue)) {\n result = deepmerge(result, resolvedValue as Record<string, unknown>)\n }\n // Skip if it's undefined, null, a string (unresolved placeholder), or any non-object\n }\n\n this.update(result)\n }\n }) as T\n }\n\n throw new Error('Invalid type')\n}\n","import replacePlaceholders from './replacePlaceholders';\nexport default replacePlaceholders;\n"],"names":[],"version":3,"file":"types.d.ts.map"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truto/replace-placeholders",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.7",
|
|
4
4
|
"description": "Efficiently replace placeholders in strings, arrays, and objects using data from specified paths. Powered by 'wild-wild-path' and 'lodash' for robust functionality.",
|
|
5
5
|
"repository": "https://github.com/trutohq/replace-placeholders.git",
|
|
6
6
|
"dependencies": {
|
|
@@ -37,22 +37,22 @@
|
|
|
37
37
|
"yarn": "1.22.19"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@parcel/packager-ts": "2.
|
|
41
|
-
"@parcel/transformer-typescript-types": "2.
|
|
40
|
+
"@parcel/packager-ts": "2.16.3",
|
|
41
|
+
"@parcel/transformer-typescript-types": "2.16.3",
|
|
42
42
|
"@types/deepmerge": "2.2.3",
|
|
43
43
|
"@types/lodash-es": "4.17.7",
|
|
44
44
|
"@types/traverse": "0.6.32",
|
|
45
45
|
"@cloudflare/workers-types": "4.20250214.0",
|
|
46
46
|
"@typescript-eslint/eslint-plugin": "5.46.1",
|
|
47
47
|
"@typescript-eslint/parser": "5.46.1",
|
|
48
|
-
"eslint": "8.
|
|
48
|
+
"eslint": "8.57.1",
|
|
49
49
|
"eslint-config-prettier": "8.5.0",
|
|
50
50
|
"eslint-plugin-prettier": "4.2.1",
|
|
51
|
-
"parcel": "2.
|
|
51
|
+
"parcel": "2.16.3",
|
|
52
52
|
"prettier": "2.8.4",
|
|
53
53
|
"ts-node": "10.9.1",
|
|
54
54
|
"typescript": "4.9.5",
|
|
55
|
-
"vitest": "0.34.
|
|
55
|
+
"vitest": "0.34.6"
|
|
56
56
|
},
|
|
57
57
|
"private": false,
|
|
58
58
|
"publishConfig": {
|
|
@@ -66,6 +66,11 @@
|
|
|
66
66
|
"test": "vitest"
|
|
67
67
|
},
|
|
68
68
|
"resolutions": {
|
|
69
|
-
"postcss": "npm:postcss@8.4.31"
|
|
69
|
+
"postcss": "npm:postcss@8.4.31",
|
|
70
|
+
"esbuild": "npm:esbuild@0.27.2",
|
|
71
|
+
"vite": "npm:vite@5.4.21",
|
|
72
|
+
"js-yaml": "npm:js-yaml@4.1.1",
|
|
73
|
+
"base-x": "npm:base-x@5.0.1",
|
|
74
|
+
"brace-expansion": "npm:brace-expansion@1.1.12"
|
|
70
75
|
}
|
|
71
|
-
}
|
|
76
|
+
}
|