lang-json 1.0.0 → 1.0.2
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/README.md +0 -0
- package/babel.config.js +8 -0
- package/coverage/clover.xml +6 -0
- package/coverage/coverage-final.json +1 -0
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +101 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +196 -0
- package/dist/esm/src/index.d.ts +18 -0
- package/dist/esm/src/index.js +369 -0
- package/dist/esm/src/index.js.map +1 -0
- package/dist/esm/src/modules/is-this/index.d.ts +136 -0
- package/dist/esm/src/modules/is-this/index.js +484 -0
- package/dist/esm/src/modules/is-this/index.js.map +1 -0
- package/dist/esm/tests/helpers.test.d.ts +1 -0
- package/dist/esm/tests/helpers.test.js +284 -0
- package/dist/esm/tests/helpers.test.js.map +1 -0
- package/dist/esm/tests/index.test.d.ts +1 -0
- package/dist/esm/tests/index.test.js +537 -0
- package/dist/esm/tests/index.test.js.map +1 -0
- package/dist/esm/tests/readme.test.d.ts +1 -0
- package/dist/esm/tests/readme.test.js +73 -0
- package/dist/esm/tests/readme.test.js.map +1 -0
- package/jest.config.ts +212 -0
- package/package.json +40 -12
- package/src/index.ts +404 -295
- package/src/modules/is-this/index.ts +682 -0
- package/tests/helpers.test.ts +331 -0
- package/tests/index.test.ts +681 -0
- package/tests/readme.test.ts +78 -0
- package/tsconfig.json +15 -16
- package/dist/esm/dump.js +0 -2
- package/dist/esm/dump.js.map +0 -1
- package/dist/esm/example.d.ts +0 -13
- package/dist/esm/example.js +0 -93
- package/dist/esm/example.js.map +0 -1
- package/dist/esm/index.d.ts +0 -36
- package/dist/esm/index.js +0 -326
- package/dist/esm/index.js.map +0 -1
- package/src/example.ts +0 -116
- /package/{dist/esm/dump.d.ts → coverage/lcov.info} +0 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
import LangJSON from "../src/index";
|
2
|
+
|
3
|
+
// Create an instance of LangJSON
|
4
|
+
const langJSON = new LangJSON();
|
5
|
+
|
6
|
+
describe("LangJSON Templating Tests", () => {
|
7
|
+
test("String Manipulation - Uppercase", () => {
|
8
|
+
const template = {
|
9
|
+
greeting: "{{#uppercase 'hello'}} world",
|
10
|
+
};
|
11
|
+
const data = {};
|
12
|
+
const result = langJSON.applyTemplate(template, data);
|
13
|
+
expect(result).toEqual({ greeting: "HELLO world" });
|
14
|
+
});
|
15
|
+
|
16
|
+
test("Conditional Statements - Active Status", () => {
|
17
|
+
const template = {
|
18
|
+
status: "{{#if isActive 'Active' 'Inactive'}}",
|
19
|
+
};
|
20
|
+
const data = { isActive: true };
|
21
|
+
const result = langJSON.applyTemplate(template, data);
|
22
|
+
expect(result).toEqual({ status: "Active" });
|
23
|
+
});
|
24
|
+
|
25
|
+
test("Looping Through Arrays - Users List", () => {
|
26
|
+
const template = {
|
27
|
+
users: {
|
28
|
+
"{{#each users}}": {
|
29
|
+
name: "{{#var item.name}}",
|
30
|
+
age: "{{#var item.age}}",
|
31
|
+
},
|
32
|
+
},
|
33
|
+
};
|
34
|
+
const data = {
|
35
|
+
users: [
|
36
|
+
{ name: "John", age: 30 },
|
37
|
+
{ name: "Jane", age: 25 },
|
38
|
+
{ name: "Doe", age: 40 },
|
39
|
+
],
|
40
|
+
};
|
41
|
+
const result = langJSON.applyTemplate(template, data);
|
42
|
+
expect(result).toEqual({
|
43
|
+
users: [
|
44
|
+
{ name: "John", age: 30 },
|
45
|
+
{ name: "Jane", age: 25 },
|
46
|
+
{ name: "Doe", age: 40 },
|
47
|
+
],
|
48
|
+
});
|
49
|
+
});
|
50
|
+
|
51
|
+
test("Chaining Helpers - Concatenation and Uppercase", () => {
|
52
|
+
const template = {
|
53
|
+
message: "{{#uppercase (concat 'hello' ', world')}}",
|
54
|
+
};
|
55
|
+
const data = {};
|
56
|
+
const result = langJSON.applyTemplate(template, data);
|
57
|
+
expect(result).toEqual({ message: "HELLO, WORLD" });
|
58
|
+
});
|
59
|
+
|
60
|
+
test("Performance Tips - Large Data", () => {
|
61
|
+
const largeData = {
|
62
|
+
users: Array.from({ length: 1000 }, (_, index) => ({
|
63
|
+
name: `User${index + 1}`,
|
64
|
+
age: 20 + (index % 50),
|
65
|
+
})),
|
66
|
+
};
|
67
|
+
const template = {
|
68
|
+
users: {
|
69
|
+
"{{#each users}}": {
|
70
|
+
name: "{{#var item.name}}",
|
71
|
+
age: "{{#var item.age}}",
|
72
|
+
},
|
73
|
+
},
|
74
|
+
};
|
75
|
+
const result = langJSON.applyTemplate(template, largeData);
|
76
|
+
expect(result.users.length).toBe(1000);
|
77
|
+
});
|
78
|
+
});
|
package/tsconfig.json
CHANGED
@@ -1,17 +1,16 @@
|
|
1
1
|
{
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
2
|
+
"compilerOptions": {
|
3
|
+
"target": "ESNext",
|
4
|
+
"module": "ESNext",
|
5
|
+
"lib": ["DOM", "ESNext"],
|
6
|
+
"outDir": "./dist",
|
7
|
+
"declaration": true,
|
8
|
+
"sourceMap": true,
|
9
|
+
"strict": true,
|
10
|
+
"esModuleInterop": true,
|
11
|
+
"skipLibCheck": true,
|
12
|
+
"moduleResolution": "node"
|
13
|
+
},
|
14
|
+
"include": ["src/**/*", "tests/**/*"],
|
15
|
+
"exclude": ["node_modules", "dist"]
|
16
|
+
}
|
package/dist/esm/dump.js
DELETED
package/dist/esm/dump.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"dump.js","sourceRoot":"","sources":["../../src/dump.ts"],"names":[],"mappings":""}
|
package/dist/esm/example.d.ts
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
type HelperFunction = (context: any, data: any, engine: JsonTemplateEngine) => any;
|
2
|
-
export declare class JsonTemplateEngine {
|
3
|
-
private helpers;
|
4
|
-
constructor();
|
5
|
-
registerHelper(name: string, fn: HelperFunction): void;
|
6
|
-
applyTemplate(template: any, data: any): any;
|
7
|
-
private replaceVars;
|
8
|
-
private lookup;
|
9
|
-
private eachHelper;
|
10
|
-
private ifHelper;
|
11
|
-
private varHelper;
|
12
|
-
}
|
13
|
-
export {};
|
package/dist/esm/example.js
DELETED
@@ -1,93 +0,0 @@
|
|
1
|
-
export class JsonTemplateEngine {
|
2
|
-
helpers = {};
|
3
|
-
constructor() {
|
4
|
-
console.log("registering helpers");
|
5
|
-
this.registerHelper("each", this.eachHelper.bind(this));
|
6
|
-
this.registerHelper("if", this.ifHelper.bind(this));
|
7
|
-
this.registerHelper("var", this.varHelper.bind(this));
|
8
|
-
}
|
9
|
-
// Register a custom helper
|
10
|
-
registerHelper(name, fn) {
|
11
|
-
this.helpers[name] = fn;
|
12
|
-
}
|
13
|
-
// Core function to parse and apply template (now fully recursive)
|
14
|
-
applyTemplate(template, data) {
|
15
|
-
console.log("template : ", template);
|
16
|
-
if (typeof template === "string") {
|
17
|
-
console.log("string template");
|
18
|
-
return this.replaceVars(template, data); // Replace string variables (dynamic)
|
19
|
-
}
|
20
|
-
else if (Array.isArray(template)) {
|
21
|
-
console.log("Array template");
|
22
|
-
return template.map((item) => this.applyTemplate(item, data)); // Handle arrays recursively
|
23
|
-
}
|
24
|
-
else if (typeof template === "object") {
|
25
|
-
console.log("object template");
|
26
|
-
const result = {};
|
27
|
-
for (const key in template) {
|
28
|
-
if (key.startsWith("{{#")) {
|
29
|
-
const helperName = key.slice(3, key.indexOf("}}"));
|
30
|
-
const helperArg = key.slice(key.indexOf(" ") + 1, -2).trim();
|
31
|
-
if (this.helpers[helperName]) {
|
32
|
-
const helperFn = this.helpers[helperName];
|
33
|
-
console.log("applying helper", helperName);
|
34
|
-
const helperResult = helperFn(template[key], { ...data, helperArg }, this);
|
35
|
-
console.log("helperRe", helperResult);
|
36
|
-
}
|
37
|
-
}
|
38
|
-
else if (key.includes("{{else}}")) {
|
39
|
-
const elseKey = key.replace("{{else}}", "").trim();
|
40
|
-
result[elseKey] = this.applyTemplate(template[key], data);
|
41
|
-
}
|
42
|
-
else {
|
43
|
-
console.log("going deep down");
|
44
|
-
result[key] = this.applyTemplate(template[key], data);
|
45
|
-
}
|
46
|
-
}
|
47
|
-
return result;
|
48
|
-
}
|
49
|
-
return template;
|
50
|
-
}
|
51
|
-
// Helper function to replace {{var}} with values from data
|
52
|
-
replaceVars(template, data) {
|
53
|
-
if (typeof template === "string") {
|
54
|
-
return template.replace(/{{\s*([\w.]+)\s*}}/g, (match, varPath) => {
|
55
|
-
return this.lookup(varPath, data) || "";
|
56
|
-
});
|
57
|
-
}
|
58
|
-
return template;
|
59
|
-
}
|
60
|
-
// Lookup a variable in data (supports nested keys like 'menu.name')
|
61
|
-
lookup(varPath, data) {
|
62
|
-
console.log("looking up", varPath, data);
|
63
|
-
return varPath.split(".").reduce((acc, part) => acc?.[part], data);
|
64
|
-
}
|
65
|
-
// Each helper {{#each}}
|
66
|
-
eachHelper(context, data, engine) {
|
67
|
-
const array = engine.lookup(data.helperArg, data);
|
68
|
-
if (!Array.isArray(array)) {
|
69
|
-
throw new Error(`${data.helperArg} is not an array`);
|
70
|
-
}
|
71
|
-
// Recursively apply template for each item in the array
|
72
|
-
return array.map((item) => engine.applyTemplate(context, { ...data, ...item }));
|
73
|
-
}
|
74
|
-
// If/else helper {{#if}}
|
75
|
-
ifHelper(context, data, engine) {
|
76
|
-
const condition = engine.lookup(data.helperArg, data);
|
77
|
-
if (condition) {
|
78
|
-
return engine.applyTemplate(context, data);
|
79
|
-
}
|
80
|
-
else {
|
81
|
-
const elseKey = Object.keys(context).find((key) => key.includes("{{else}}"));
|
82
|
-
if (elseKey) {
|
83
|
-
return engine.applyTemplate(context[elseKey.replace("{{else}}", "").trim()], data);
|
84
|
-
}
|
85
|
-
}
|
86
|
-
return null;
|
87
|
-
}
|
88
|
-
// Variable helper {{var}}
|
89
|
-
varHelper(context, data) {
|
90
|
-
return this.lookup(data.helperArg, data);
|
91
|
-
}
|
92
|
-
}
|
93
|
-
//# sourceMappingURL=example.js.map
|
package/dist/esm/example.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"example.js","sourceRoot":"","sources":["../../src/example.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.d.ts
DELETED
@@ -1,36 +0,0 @@
|
|
1
|
-
type HelperFunction = (context: any, data: any, innerTemplate: any) => any;
|
2
|
-
export declare class JsonTemplateEngine {
|
3
|
-
helpers: Record<string, HelperFunction>;
|
4
|
-
constructor();
|
5
|
-
registerHelper(name: string, fn: HelperFunction): void;
|
6
|
-
applyTemplate(template: any, data: any): any;
|
7
|
-
lookup(varPath: string, data: any): any;
|
8
|
-
proccessHelper(string: string, data: any, innerTemplate?: any): any;
|
9
|
-
logHelper(varPath: string, data: any, innerTemplate: any): any;
|
10
|
-
varHelper(string: any, data: any): any;
|
11
|
-
lengthHelper(varPath: string, data: any): any;
|
12
|
-
eachHelper(string: any, data: any, innerTemplate: any): any;
|
13
|
-
loopHelper(string: any, data: any, innerTemplate: any): any;
|
14
|
-
ifHelper(condition: string, data: any, innerTemplate: any): boolean;
|
15
|
-
unlessHelper(condition: string, data: any, innerTemplate: any): boolean;
|
16
|
-
withHelper(scopePath: string, data: any, innerTemplate: any): any;
|
17
|
-
setHelper(varName: string, data: any, innerTemplate: any): any;
|
18
|
-
concatHelper(args: string, data: any): any;
|
19
|
-
mathHelper(expression: string, data: any): any;
|
20
|
-
compareHelper(expression: string, data: any): boolean;
|
21
|
-
upperCaseHelper(varPath: string, data: any): any;
|
22
|
-
lowerCaseHelper(varPath: string, data: any): any;
|
23
|
-
jsonStringifyHelper(varPath: string, data: any): any;
|
24
|
-
jsonParseHelper(varPath: string, data: any): any;
|
25
|
-
dateHelper(varPath: string, data: any): any;
|
26
|
-
repeatHelper(args: string, data: any): any;
|
27
|
-
sliceHelper(args: string, data: any): any;
|
28
|
-
joinHelper(args: string, data: any): any;
|
29
|
-
findHelper(args: string, data: any): any;
|
30
|
-
mapHelper(args: string, data: any, innerTemplate: any): any;
|
31
|
-
uniqueHelper(varPath: string, data: any): any;
|
32
|
-
randomHelper(varPath: string, data: any): any;
|
33
|
-
reverseHelper(varPath: string, data: any): any;
|
34
|
-
existsHelper(varPath: string, data: any): boolean;
|
35
|
-
}
|
36
|
-
export {};
|
package/dist/esm/index.js
DELETED
@@ -1,326 +0,0 @@
|
|
1
|
-
export class JsonTemplateEngine {
|
2
|
-
helpers = {};
|
3
|
-
constructor() {
|
4
|
-
this.registerHelper("each", this.eachHelper.bind(this));
|
5
|
-
this.registerHelper("loop", this.loopHelper.bind(this));
|
6
|
-
this.registerHelper("if", this.ifHelper.bind(this));
|
7
|
-
this.registerHelper("with", this.withHelper.bind(this));
|
8
|
-
this.registerHelper("set", this.setHelper.bind(this));
|
9
|
-
this.registerHelper("unless", this.unlessHelper.bind(this));
|
10
|
-
this.registerHelper("log", this.logHelper.bind(this));
|
11
|
-
this.registerHelper("concat", this.concatHelper.bind(this));
|
12
|
-
this.registerHelper("length", this.lengthHelper.bind(this));
|
13
|
-
this.registerHelper("math", this.mathHelper.bind(this));
|
14
|
-
this.registerHelper("var", this.varHelper.bind(this));
|
15
|
-
this.registerHelper("compare", this.compareHelper.bind(this));
|
16
|
-
this.registerHelper("upperCase", this.upperCaseHelper.bind(this));
|
17
|
-
this.registerHelper("lowerCase", this.lowerCaseHelper.bind(this));
|
18
|
-
this.registerHelper("jsonStringify", this.jsonStringifyHelper.bind(this));
|
19
|
-
this.registerHelper("jsonParse", this.jsonParseHelper.bind(this));
|
20
|
-
this.registerHelper("date", this.dateHelper.bind(this));
|
21
|
-
this.registerHelper("repeat", this.repeatHelper.bind(this));
|
22
|
-
this.registerHelper("slice", this.sliceHelper.bind(this));
|
23
|
-
this.registerHelper("join", this.joinHelper.bind(this));
|
24
|
-
this.registerHelper("find", this.findHelper.bind(this));
|
25
|
-
this.registerHelper("map", this.mapHelper.bind(this));
|
26
|
-
this.registerHelper("unique", this.uniqueHelper.bind(this));
|
27
|
-
this.registerHelper("random", this.randomHelper.bind(this));
|
28
|
-
this.registerHelper("reverse", this.reverseHelper.bind(this));
|
29
|
-
this.registerHelper("exists", this.existsHelper.bind(this));
|
30
|
-
}
|
31
|
-
// Register a custom helper
|
32
|
-
registerHelper(name, fn) {
|
33
|
-
this.helpers[name] = fn;
|
34
|
-
}
|
35
|
-
applyTemplate(template, data) {
|
36
|
-
if (typeof template === "string") {
|
37
|
-
return this.proccessHelper(template, data);
|
38
|
-
}
|
39
|
-
else if (Array.isArray(template)) {
|
40
|
-
return template.map((item, index) => this.applyTemplate(item, { ...data, currentItem: item, index }));
|
41
|
-
}
|
42
|
-
else if (typeof template === "object") {
|
43
|
-
let result = {};
|
44
|
-
for (const key in template) {
|
45
|
-
if (Object.prototype.hasOwnProperty.call(template, key)) {
|
46
|
-
const value = template[key];
|
47
|
-
const currentKeyResult = this.proccessHelper(key, data, value);
|
48
|
-
if (typeof currentKeyResult === "string") {
|
49
|
-
if (value) {
|
50
|
-
result[currentKeyResult] = this.applyTemplate(value, data);
|
51
|
-
}
|
52
|
-
else {
|
53
|
-
result = currentKeyResult;
|
54
|
-
}
|
55
|
-
}
|
56
|
-
else if (Array.isArray(currentKeyResult)) {
|
57
|
-
result = this.applyTemplate(currentKeyResult, data);
|
58
|
-
}
|
59
|
-
else if (typeof currentKeyResult === "object") {
|
60
|
-
result = this.applyTemplate(currentKeyResult, data);
|
61
|
-
}
|
62
|
-
else if (typeof currentKeyResult === "boolean") {
|
63
|
-
if (currentKeyResult) {
|
64
|
-
result = this.applyTemplate(value, data);
|
65
|
-
}
|
66
|
-
}
|
67
|
-
}
|
68
|
-
}
|
69
|
-
return result;
|
70
|
-
}
|
71
|
-
return template;
|
72
|
-
}
|
73
|
-
lookup(varPath, data) {
|
74
|
-
if (typeof varPath !== "string")
|
75
|
-
return varPath;
|
76
|
-
let normalizedPath = varPath.replace(/\[(\d+)\]/g, ".$1");
|
77
|
-
if (normalizedPath.startsWith(".")) {
|
78
|
-
normalizedPath = normalizedPath.slice(1);
|
79
|
-
}
|
80
|
-
const returnValue = normalizedPath.split(".").reduce((acc, part) => {
|
81
|
-
return acc?.[part];
|
82
|
-
}, data);
|
83
|
-
if (returnValue) {
|
84
|
-
return returnValue;
|
85
|
-
}
|
86
|
-
else {
|
87
|
-
return varPath;
|
88
|
-
}
|
89
|
-
}
|
90
|
-
proccessHelper(string, data, innerTemplate) {
|
91
|
-
const helperMatch = string.match(/{{#(\w+)\s+(.*?)}}/);
|
92
|
-
if (helperMatch) {
|
93
|
-
const [helperString, helperName, helperArg] = helperMatch;
|
94
|
-
const helperFn = this.helpers[helperName];
|
95
|
-
if (helperFn) {
|
96
|
-
// Check if there's an inner expression (e.g., compare user.age 30)
|
97
|
-
const innerExpressionMatch = helperArg.match(/\((.*?)\)/);
|
98
|
-
if (innerExpressionMatch) {
|
99
|
-
const innerExpression = innerExpressionMatch[1]; // e.g., 'compare user.age 30'
|
100
|
-
const [innerHelperName, ...innerArgs] = innerExpression.split(" "); // ['compare', 'user.age', '30']
|
101
|
-
const innerHelperFn = this.helpers[innerHelperName];
|
102
|
-
if (innerHelperFn) {
|
103
|
-
// Look up values for arguments, treat them as variables
|
104
|
-
const evaluatedArgs = innerArgs.map((arg) => this.lookup(arg, data) || arg);
|
105
|
-
console.log(evaluatedArgs);
|
106
|
-
// Ensure innerHelperFn can handle an array directly or accept rest parameters
|
107
|
-
const innerResult = innerHelperFn(evaluatedArgs.join(" "), data, innerTemplate);
|
108
|
-
// Apply the outer helper (e.g., ifHelper) with the result of the inner expression
|
109
|
-
const outerResult = helperFn(innerResult, data, innerTemplate);
|
110
|
-
if (typeof outerResult === "string" ||
|
111
|
-
typeof outerResult === "number") {
|
112
|
-
return string.replace(helperString, `${outerResult}`);
|
113
|
-
}
|
114
|
-
else {
|
115
|
-
return outerResult;
|
116
|
-
}
|
117
|
-
}
|
118
|
-
}
|
119
|
-
else {
|
120
|
-
// Handle the normal case where there is no inner expression
|
121
|
-
const result = helperFn(helperArg, data, innerTemplate);
|
122
|
-
if (typeof result === "string" || typeof result === "number") {
|
123
|
-
return string.replace(helperString, `${result}`);
|
124
|
-
}
|
125
|
-
else {
|
126
|
-
return result;
|
127
|
-
}
|
128
|
-
}
|
129
|
-
}
|
130
|
-
}
|
131
|
-
else {
|
132
|
-
return string;
|
133
|
-
}
|
134
|
-
}
|
135
|
-
// helpers
|
136
|
-
logHelper(varPath, data, innerTemplate) {
|
137
|
-
const value = this.lookup(varPath, data);
|
138
|
-
console.log(value);
|
139
|
-
return innerTemplate;
|
140
|
-
}
|
141
|
-
varHelper(string, data) {
|
142
|
-
return this.lookup(string, data);
|
143
|
-
}
|
144
|
-
lengthHelper(varPath, data) {
|
145
|
-
const value = this.lookup(varPath, data);
|
146
|
-
return Array.isArray(value) || typeof value === "string" ? value.length : 0;
|
147
|
-
}
|
148
|
-
eachHelper(string, data, innerTemplate) {
|
149
|
-
const array = this.lookup(string, data);
|
150
|
-
if (!Array.isArray(array)) {
|
151
|
-
throw new Error(`${data.helperArg} is not an array`);
|
152
|
-
}
|
153
|
-
return array.map((item) => this.applyTemplate(innerTemplate, { ...data, item }));
|
154
|
-
}
|
155
|
-
loopHelper(string, data, innerTemplate) {
|
156
|
-
const count = this.lookup(string, data);
|
157
|
-
return Array(+count)
|
158
|
-
.fill(null)
|
159
|
-
.map((item) => this.applyTemplate(innerTemplate, { ...data, item }));
|
160
|
-
}
|
161
|
-
ifHelper(condition, data, innerTemplate) {
|
162
|
-
console.log(condition, data);
|
163
|
-
return !!this.lookup(condition, data);
|
164
|
-
}
|
165
|
-
unlessHelper(condition, data, innerTemplate) {
|
166
|
-
return !!this.lookup(condition, data);
|
167
|
-
}
|
168
|
-
withHelper(scopePath, data, innerTemplate) {
|
169
|
-
const newContext = this.lookup(scopePath, data);
|
170
|
-
return this.applyTemplate(innerTemplate, { ...data, ...newContext });
|
171
|
-
}
|
172
|
-
setHelper(varName, data, innerTemplate) {
|
173
|
-
const [key, valuePath] = varName.split(" ");
|
174
|
-
const value = this.lookup(valuePath, data);
|
175
|
-
return this.applyTemplate(innerTemplate, { ...data, [key]: value });
|
176
|
-
}
|
177
|
-
concatHelper(args, data) {
|
178
|
-
const values = args.split(" ").map((arg) => this.lookup(arg, data) || arg);
|
179
|
-
return values.join(" ");
|
180
|
-
}
|
181
|
-
mathHelper(expression, data) {
|
182
|
-
const [left, operator, right] = expression.split(" ");
|
183
|
-
const leftValue = parseFloat(this.lookup(left, data));
|
184
|
-
const rightValue = parseFloat(this.lookup(right, data));
|
185
|
-
switch (operator) {
|
186
|
-
case "+":
|
187
|
-
return leftValue + rightValue;
|
188
|
-
case "-":
|
189
|
-
return leftValue - rightValue;
|
190
|
-
case "*":
|
191
|
-
return leftValue * rightValue;
|
192
|
-
case "/":
|
193
|
-
return leftValue / rightValue;
|
194
|
-
default:
|
195
|
-
return 0;
|
196
|
-
}
|
197
|
-
}
|
198
|
-
compareHelper(expression, data) {
|
199
|
-
const [left, operator, right] = expression.split(" ");
|
200
|
-
const leftValue = this.lookup(left, data);
|
201
|
-
const rightValue = this.lookup(right, data);
|
202
|
-
switch (operator) {
|
203
|
-
case "==":
|
204
|
-
return leftValue == rightValue;
|
205
|
-
case "===":
|
206
|
-
return leftValue === rightValue;
|
207
|
-
case "!=":
|
208
|
-
return leftValue != rightValue;
|
209
|
-
case "!==":
|
210
|
-
return leftValue !== rightValue;
|
211
|
-
case ">":
|
212
|
-
return leftValue > rightValue;
|
213
|
-
case "<":
|
214
|
-
return leftValue < rightValue;
|
215
|
-
case ">=":
|
216
|
-
return leftValue >= rightValue;
|
217
|
-
case "<=":
|
218
|
-
return leftValue <= rightValue;
|
219
|
-
default:
|
220
|
-
throw new Error(`Unknown operator: ${operator}`);
|
221
|
-
}
|
222
|
-
}
|
223
|
-
upperCaseHelper(varPath, data) {
|
224
|
-
const value = this.lookup(varPath, data);
|
225
|
-
return typeof value === "string" ? value.toUpperCase() : value;
|
226
|
-
}
|
227
|
-
lowerCaseHelper(varPath, data) {
|
228
|
-
const value = this.lookup(varPath, data);
|
229
|
-
return typeof value === "string" ? value.toLowerCase() : value;
|
230
|
-
}
|
231
|
-
jsonStringifyHelper(varPath, data) {
|
232
|
-
const value = this.lookup(varPath, data);
|
233
|
-
return JSON.stringify(value);
|
234
|
-
}
|
235
|
-
jsonParseHelper(varPath, data) {
|
236
|
-
const value = this.lookup(varPath, data);
|
237
|
-
return typeof value === "string" ? JSON.parse(value) : value;
|
238
|
-
}
|
239
|
-
dateHelper(varPath, data) {
|
240
|
-
const dateString = varPath.split(" ");
|
241
|
-
const date = new Date(dateString[0]);
|
242
|
-
return date.toISOString(); // Default format YYYY-MM-DD
|
243
|
-
}
|
244
|
-
repeatHelper(args, data) {
|
245
|
-
const [str, count] = args.split(" ");
|
246
|
-
const repeatData = this.lookup(str, data) || str;
|
247
|
-
const repeatCount = parseInt(count);
|
248
|
-
console.log(repeatCount, repeatData);
|
249
|
-
if (typeof repeatData === "string") {
|
250
|
-
return repeatData.repeat(repeatCount);
|
251
|
-
}
|
252
|
-
else if (typeof repeatData === "object") {
|
253
|
-
return Array(repeatCount).fill(repeatData);
|
254
|
-
}
|
255
|
-
}
|
256
|
-
sliceHelper(args, data) {
|
257
|
-
console.log(args);
|
258
|
-
const [varPath, start, end] = args
|
259
|
-
.split(" ")
|
260
|
-
.map((arg) => this.lookup(arg, data));
|
261
|
-
const value = this.lookup(varPath, data);
|
262
|
-
console.log(start, end, value);
|
263
|
-
if (Array.isArray(value)) {
|
264
|
-
return value.slice(start, end);
|
265
|
-
}
|
266
|
-
else if (typeof value === "string") {
|
267
|
-
return value.slice(start, end);
|
268
|
-
}
|
269
|
-
return value;
|
270
|
-
}
|
271
|
-
joinHelper(args, data) {
|
272
|
-
const [varPath, separator] = args.split(" ");
|
273
|
-
const value = this.lookup(varPath, data);
|
274
|
-
if (Array.isArray(value)) {
|
275
|
-
return value.join(separator);
|
276
|
-
}
|
277
|
-
return value;
|
278
|
-
}
|
279
|
-
findHelper(args, data) {
|
280
|
-
const [arrayPath, property, value] = args.split(" ");
|
281
|
-
const array = this.lookup(arrayPath, data);
|
282
|
-
if (Array.isArray(array)) {
|
283
|
-
return array.find((item) => this.lookup(property, item) === value);
|
284
|
-
}
|
285
|
-
return null;
|
286
|
-
}
|
287
|
-
mapHelper(args, data, innerTemplate) {
|
288
|
-
const [arrayPath] = args.split(" ");
|
289
|
-
const array = this.lookup(arrayPath, data);
|
290
|
-
if (!Array.isArray(array)) {
|
291
|
-
throw new Error(`${arrayPath} is not an array`);
|
292
|
-
}
|
293
|
-
console.log(innerTemplate);
|
294
|
-
return array.map((item) => this.applyTemplate(innerTemplate, { ...data, item }));
|
295
|
-
}
|
296
|
-
uniqueHelper(varPath, data) {
|
297
|
-
const value = this.lookup(varPath, data);
|
298
|
-
if (Array.isArray(value)) {
|
299
|
-
return Array.from(new Set(value));
|
300
|
-
}
|
301
|
-
return value;
|
302
|
-
}
|
303
|
-
randomHelper(varPath, data) {
|
304
|
-
const array = this.lookup(varPath, data);
|
305
|
-
if (Array.isArray(array)) {
|
306
|
-
const randomIndex = Math.floor(Math.random() * array.length);
|
307
|
-
return array[randomIndex];
|
308
|
-
}
|
309
|
-
return null;
|
310
|
-
}
|
311
|
-
reverseHelper(varPath, data) {
|
312
|
-
const value = this.lookup(varPath, data);
|
313
|
-
if (Array.isArray(value)) {
|
314
|
-
return value.reverse();
|
315
|
-
}
|
316
|
-
else if (typeof value === "string") {
|
317
|
-
return value.split("").reverse().join("");
|
318
|
-
}
|
319
|
-
return value;
|
320
|
-
}
|
321
|
-
existsHelper(varPath, data) {
|
322
|
-
const value = this.lookup(varPath, data);
|
323
|
-
return value !== undefined && value !== null;
|
324
|
-
}
|
325
|
-
}
|
326
|
-
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|