lang-json 1.0.0 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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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"}
|