@pdfme/common 5.3.5 → 5.3.7-dev.1

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.
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PDFME_VERSION = void 0;
4
- exports.PDFME_VERSION = '5.3.5';
4
+ exports.PDFME_VERSION = '5.3.7';
5
5
  //# sourceMappingURL=version.js.map
@@ -1,2 +1,2 @@
1
- export const PDFME_VERSION = '5.3.5';
1
+ export const PDFME_VERSION = '5.3.7';
2
2
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const fs_1 = require("fs");
27
+ const path = __importStar(require("path"));
28
+ const dynamicTemplate_1 = require("../src/dynamicTemplate");
29
+ const sansData = (0, fs_1.readFileSync)(path.join(__dirname, `/assets/fonts/SauceHanSansJP.ttf`));
30
+ const serifData = (0, fs_1.readFileSync)(path.join(__dirname, `/assets/fonts/SauceHanSerifJP.ttf`));
31
+ const getSampleFont = () => ({
32
+ SauceHanSansJP: { fallback: true, data: sansData },
33
+ SauceHanSerifJP: { data: serifData },
34
+ });
35
+ describe('getDynamicTemplate', () => {
36
+ const height = 10;
37
+ const aPositionY = 10;
38
+ const bPositionY = 30;
39
+ const padding = 10;
40
+ const template = {
41
+ schemas: [
42
+ [
43
+ {
44
+ name: 'a',
45
+ content: 'a',
46
+ type: 'a',
47
+ position: { x: 10, y: aPositionY },
48
+ width: 10,
49
+ height,
50
+ },
51
+ {
52
+ name: 'b',
53
+ content: 'b',
54
+ type: 'b',
55
+ position: { x: 10, y: bPositionY },
56
+ width: 10,
57
+ height,
58
+ },
59
+ ],
60
+ ],
61
+ basePdf: { width: 100, height: 100, padding: [padding, padding, padding, padding] },
62
+ };
63
+ const input = { a: 'a', b: 'b' };
64
+ const options = { font: getSampleFont() };
65
+ const _cache = new Map();
66
+ const getDynamicTemplateArg = { template, input, options, _cache };
67
+ const createGetDynamicTemplateArg = (increaseHeights, bHeight) => ({
68
+ ...getDynamicTemplateArg,
69
+ getDynamicHeights: async (value, args) => {
70
+ if (args.schema.type === 'a') {
71
+ return Promise.resolve(increaseHeights);
72
+ }
73
+ return Promise.resolve([bHeight || args.schema.height]);
74
+ },
75
+ });
76
+ const verifyBasicStructure = (dynamicTemplate) => {
77
+ expect(dynamicTemplate.schemas).toBeDefined();
78
+ expect(Array.isArray(dynamicTemplate.schemas)).toBe(true);
79
+ expect(dynamicTemplate.basePdf).toEqual({
80
+ width: 100,
81
+ height: 100,
82
+ padding: [padding, padding, padding, padding],
83
+ });
84
+ };
85
+ describe('Single page scenarios', () => {
86
+ test('should handle no page break', async () => {
87
+ const increaseHeights = [10, 10, 10, 10, 10];
88
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
89
+ verifyBasicStructure(dynamicTemplate);
90
+ expect(dynamicTemplate.schemas.length).toBe(1);
91
+ expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
92
+ expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
93
+ expect(dynamicTemplate.schemas[0][1].position.y).toEqual(increaseHeights.reduce((a, b) => a + b, 0) - height + bPositionY);
94
+ expect(dynamicTemplate.schemas[0][1].name).toEqual('b');
95
+ });
96
+ });
97
+ describe('Multiple page scenarios', () => {
98
+ test('should handle page break with a on page 1 and b on page 2', async () => {
99
+ const increaseHeights = [20, 20, 20, 20];
100
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
101
+ verifyBasicStructure(dynamicTemplate);
102
+ expect(dynamicTemplate.schemas.length).toBe(2);
103
+ expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
104
+ expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
105
+ expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
106
+ expect(dynamicTemplate.schemas[1][0].name).toEqual('b');
107
+ expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
108
+ expect(dynamicTemplate.schemas[1][1]).toBeUndefined();
109
+ });
110
+ test('should handle page break with a on page 1 and 2, b on page 2', async () => {
111
+ const increaseHeights = [20, 20, 20, 20, 20];
112
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
113
+ verifyBasicStructure(dynamicTemplate);
114
+ expect(dynamicTemplate.schemas.length).toBe(2);
115
+ expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
116
+ expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
117
+ expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
118
+ expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
119
+ expect(dynamicTemplate.schemas[1][0].name).toEqual('a');
120
+ expect(dynamicTemplate.schemas[1][1].position.y).toEqual(increaseHeights.slice(3).reduce((a, b) => a + b, 0) - height + padding);
121
+ expect(dynamicTemplate.schemas[1][1].name).toEqual('b');
122
+ });
123
+ test('should handle multiple page breaks', async () => {
124
+ const increaseHeights = [50, 50, 50, 50, 50];
125
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
126
+ verifyBasicStructure(dynamicTemplate);
127
+ expect(dynamicTemplate.schemas.length).toBe(5);
128
+ // Verify 'a' elements
129
+ for (let i = 0; i < 4; i++) {
130
+ expect(dynamicTemplate.schemas[i][0]).toBeDefined();
131
+ expect(dynamicTemplate.schemas[i][0].position.y).toEqual(i === 0 ? aPositionY : padding);
132
+ expect(dynamicTemplate.schemas[i][0].height).toEqual(i === 3 ? 100 : 50);
133
+ expect(dynamicTemplate.schemas[i][0].name).toEqual('a');
134
+ expect(dynamicTemplate.schemas[i][1]).toBeUndefined();
135
+ }
136
+ // Verify 'b' element
137
+ expect(dynamicTemplate.schemas[4][0]).toBeDefined();
138
+ expect(dynamicTemplate.schemas[4][0].name).toEqual('b');
139
+ expect(dynamicTemplate.schemas[4][0].position.y).toEqual(padding);
140
+ expect(dynamicTemplate.schemas[4][0].height).toEqual(10);
141
+ });
142
+ test('should handle both a and b on next page', async () => {
143
+ const increaseHeights = [80, 10, 10];
144
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
145
+ verifyBasicStructure(dynamicTemplate);
146
+ expect(dynamicTemplate.schemas.length).toBe(2);
147
+ // Check first page
148
+ expect(dynamicTemplate.schemas[0][0]).toBeDefined();
149
+ expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
150
+ expect(dynamicTemplate.schemas[0][0].height).toEqual(80);
151
+ expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
152
+ // Check second page
153
+ expect(dynamicTemplate.schemas[1][0]).toBeDefined();
154
+ expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
155
+ expect(dynamicTemplate.schemas[1][0].height).toEqual(20);
156
+ expect(dynamicTemplate.schemas[1][1]).toBeDefined();
157
+ expect(dynamicTemplate.schemas[1][1].position.y).toBeGreaterThanOrEqual(dynamicTemplate.schemas[1][0].position.y + dynamicTemplate.schemas[1][0].height);
158
+ });
159
+ });
160
+ describe('Element height modifications', () => {
161
+ test('should handle increased height for b', async () => {
162
+ const increaseHeights = [10, 10, 10, 10, 10];
163
+ const bHeight = 30;
164
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights, bHeight));
165
+ verifyBasicStructure(dynamicTemplate);
166
+ expect(dynamicTemplate.schemas.length).toBe(2);
167
+ // Check 'a' element
168
+ expect(dynamicTemplate.schemas[0][0]).toBeDefined();
169
+ expect(dynamicTemplate.schemas[0][0].position.y).toEqual(aPositionY);
170
+ expect(dynamicTemplate.schemas[0][0].height).toEqual(50);
171
+ expect(dynamicTemplate.schemas[0][0].name).toEqual('a');
172
+ // Check 'b' element
173
+ expect(dynamicTemplate.schemas[1][0]).toBeDefined();
174
+ expect(dynamicTemplate.schemas[1][0].position.y).toEqual(padding);
175
+ expect(dynamicTemplate.schemas[1][0].height).toEqual(bHeight);
176
+ expect(dynamicTemplate.schemas[1][0].name).toEqual('b');
177
+ });
178
+ });
179
+ describe('Edge cases', () => {
180
+ test('should handle empty increase heights', async () => {
181
+ const increaseHeights = [];
182
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
183
+ verifyBasicStructure(dynamicTemplate);
184
+ expect(dynamicTemplate.schemas.length).toBe(1);
185
+ expect(dynamicTemplate.schemas[0][0]).toBeDefined();
186
+ expect(dynamicTemplate.schemas[0][0].name).toEqual('b');
187
+ expect(dynamicTemplate.schemas[0][1]).toBeUndefined();
188
+ });
189
+ test('should handle very large increase heights', async () => {
190
+ const increaseHeights = [1000, 1000];
191
+ const dynamicTemplate = await (0, dynamicTemplate_1.getDynamicTemplate)(createGetDynamicTemplateArg(increaseHeights));
192
+ verifyBasicStructure(dynamicTemplate);
193
+ expect(dynamicTemplate.schemas.length).toBeGreaterThan(1);
194
+ });
195
+ });
196
+ });
197
+ //# sourceMappingURL=dynamicTemplate.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamicTemplate.test.js","sourceRoot":"","sources":["../../../__tests__/dynamicTemplate.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const expression_1 = require("../src/expression");
4
+ describe('replacePlaceholders', () => {
5
+ it('should return content as is if there are no placeholders', () => {
6
+ const content = 'Hello, world!';
7
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
8
+ expect(result).toBe(content);
9
+ });
10
+ it('should replace placeholders with variables', () => {
11
+ const content = 'Hello, {name}!';
12
+ const variables = { name: 'Alice' };
13
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas: [] });
14
+ expect(result).toBe('Hello, Alice!');
15
+ });
16
+ it('should evaluate expressions within placeholders', () => {
17
+ const content = 'The sum is {1 + 2}.';
18
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
19
+ expect(result).toBe('The sum is 3.');
20
+ });
21
+ it('should handle date and dateTime placeholders', () => {
22
+ const content = 'Today is {date} and now is {dateTime}.';
23
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
24
+ const date = new Date();
25
+ const padZero = (num) => String(num).padStart(2, '0');
26
+ const formattedDate = `${date.getFullYear()}/${padZero(date.getMonth() + 1)}/${padZero(date.getDate())}`;
27
+ const formattedDateTime = `${formattedDate} ${padZero(date.getHours())}:${padZero(date.getMinutes())}`;
28
+ expect(result).toBe(`Today is ${formattedDate} and now is ${formattedDateTime}.`);
29
+ });
30
+ it('should handle data from schemas', () => {
31
+ const content = 'Schema content: {name}';
32
+ const variables = {};
33
+ const schemas = [
34
+ [
35
+ {
36
+ name: 'name',
37
+ type: 'text',
38
+ content: 'SchemaName',
39
+ readOnly: true,
40
+ },
41
+ ],
42
+ ];
43
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas });
44
+ expect(result).toBe('Schema content: SchemaName');
45
+ });
46
+ it('should prioritize variables over schemas', () => {
47
+ const content = 'Name: {name}';
48
+ const variables = { name: 'VariableName' };
49
+ const schemas = [
50
+ [
51
+ {
52
+ name: 'name',
53
+ type: 'text',
54
+ content: 'SchemaName',
55
+ readOnly: true,
56
+ },
57
+ ],
58
+ ];
59
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas });
60
+ expect(result).toBe('Name: VariableName');
61
+ });
62
+ it('should handle nested placeholders in variables', () => {
63
+ const content = 'Nested variable: {greeting}';
64
+ const variables = { greeting: 'Hello, {name}!' };
65
+ const schemas = [
66
+ [
67
+ {
68
+ name: 'name',
69
+ type: 'text',
70
+ content: 'Bob',
71
+ readOnly: true,
72
+ },
73
+ ],
74
+ ];
75
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas });
76
+ expect(result).toBe('Nested variable: Hello, Bob!');
77
+ });
78
+ it('should return content unchanged when placeholders are invalid', () => {
79
+ const content = 'Invalid placeholder: {name';
80
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
81
+ expect(result).toBe('Invalid placeholder: {name');
82
+ });
83
+ it('should evaluate expressions even if they result in Infinity', () => {
84
+ const content = 'Divide by zero: {1 / 0}';
85
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
86
+ expect(result).toBe('Divide by zero: Infinity');
87
+ });
88
+ it('should handle complex expressions', () => {
89
+ const content = 'Result: {Math.max(1, 2, 3)}';
90
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
91
+ expect(result).toBe('Result: 3');
92
+ });
93
+ it('should parse JSON strings in variables', () => {
94
+ const content = 'Data: {data.value}';
95
+ const variables = { data: '{"value": "42"}' };
96
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas: [] });
97
+ expect(result).toBe('Data: 42');
98
+ });
99
+ it('should handle variables of different types', () => {
100
+ const content = 'Number: {num}, Boolean: {bool}, Array: {arr[0]}, Object: {obj.key}';
101
+ const variables = {
102
+ num: 42,
103
+ bool: true,
104
+ arr: ['first', 'second'],
105
+ obj: { key: 'value' },
106
+ };
107
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas: [] });
108
+ expect(result).toBe('Number: 42, Boolean: true, Array: first, Object: value');
109
+ });
110
+ it('should use content from readOnly schemas', () => {
111
+ const content = 'Content: {readOnlyField}';
112
+ const variables = {};
113
+ const schemas = [
114
+ [
115
+ {
116
+ name: 'readOnlyField',
117
+ type: 'text',
118
+ content: 'ReadOnlyContent',
119
+ readOnly: true,
120
+ },
121
+ ],
122
+ ];
123
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas });
124
+ expect(result).toBe('Content: ReadOnlyContent');
125
+ });
126
+ it('should use empty string for non-readOnly schema content', () => {
127
+ const content = 'Content: {editableField}';
128
+ const variables = {};
129
+ const schemas = [
130
+ [
131
+ {
132
+ name: 'editableField',
133
+ type: 'text',
134
+ content: 'Should not be used',
135
+ readOnly: false,
136
+ },
137
+ ],
138
+ ];
139
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas });
140
+ expect(result).toBe('Content: ');
141
+ });
142
+ it('should allow method chaining on permitted global objects', () => {
143
+ const content = 'Chained: {Math.random().toString()}';
144
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
145
+ // Math.random() generates a random number, which is then converted to a string using toString()
146
+ const regex = /^Chained: \d+\.\d+$/;
147
+ expect(regex.test(result)).toBe(true);
148
+ });
149
+ });
150
+ describe('replacePlaceholders - Security Tests', () => {
151
+ it('should prevent access to __proto__ property', () => {
152
+ const content = 'Proto: {__proto__}';
153
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
154
+ // Since __proto__ access is prohibited, the placeholder should remain unchanged
155
+ expect(result).toBe('Proto: {__proto__}');
156
+ });
157
+ it('should prevent access to constructor property', () => {
158
+ const content = 'Constructor: {constructor}';
159
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
160
+ // 'constructor' is allowed if defined in context or globals; assuming it's not, placeholder remains
161
+ expect(result).toBe('Constructor: {constructor}');
162
+ });
163
+ it('should prevent access to prototype property', () => {
164
+ const content = 'Prototype: {prototype}';
165
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
166
+ // 'prototype' access is prohibited
167
+ expect(result).toBe('Prototype: {prototype}');
168
+ });
169
+ it('should prevent access to nested prohibited properties', () => {
170
+ const content = 'Nested: {user.__proto__.polluted}';
171
+ const variables = { user: {} };
172
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas: [] });
173
+ // Access to '__proto__' is prohibited; placeholder remains unchanged
174
+ expect(result).toBe('Nested: {user.__proto__.polluted}');
175
+ });
176
+ it('should prevent use of Function constructor', () => {
177
+ const content = 'Function: {Function("return 42")()}';
178
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
179
+ // Use of Function constructor is not allowed; placeholder remains unchanged
180
+ expect(result).toBe('Function: {Function("return 42")()}');
181
+ });
182
+ it('should prevent access to disallowed global variables', () => {
183
+ const content = 'Process: {process.env}';
184
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
185
+ // 'process' is not in allowedGlobals; placeholder remains unchanged
186
+ expect(result).toBe('Process: {process.env}');
187
+ });
188
+ it('should prevent prototype pollution via JSON.parse', () => {
189
+ const content = 'Polluted: {JSON.parse(\'{"__proto__":{"polluted":true}}\').polluted}';
190
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
191
+ // Even if 'polluted' is accessed, the prototype is not polluted, so undefined is returned.
192
+ expect(result).toBe('Polluted: undefined');
193
+ });
194
+ it('should prevent accessing nested prohibited properties in functions', () => {
195
+ const content = 'Access: {( () => { return this.constructor } )()}';
196
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
197
+ // Attempting to access 'constructor' via 'this' should be prohibited; placeholder remains unchanged
198
+ expect(result).toBe('Access: {( () => { return this.constructor } )()}');
199
+ });
200
+ it('should prevent accessing global objects not in allowedGlobals', () => {
201
+ const content = 'Global: {global}';
202
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
203
+ // 'global' is not in allowedGlobals; placeholder remains unchanged
204
+ expect(result).toBe('Global: {global}');
205
+ });
206
+ it('should prevent accessing Object constructor via allowed globals', () => {
207
+ const content = 'ObjectConstructor: {Object.constructor}';
208
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
209
+ // Accessing 'constructor' of 'Object' is prohibited
210
+ expect(result).toBe('ObjectConstructor: {Object.constructor}');
211
+ });
212
+ it('should prevent accessing Function from allowed globals', () => {
213
+ const content = 'FunctionAccess: {Function("return 42")()}';
214
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
215
+ // 'Function' is not in allowedGlobals, so this should fail
216
+ expect(result).toBe('FunctionAccess: {Function("return 42")()}');
217
+ });
218
+ it('should prevent accessing nested properties via allowed globals', () => {
219
+ const content = 'NestedAccess: {Math.__proto__.polluted}';
220
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
221
+ // Accessing '__proto__' of allowed global 'Math' is prohibited
222
+ expect(result).toBe('NestedAccess: {Math.__proto__.polluted}');
223
+ });
224
+ it('should prevent execution of arbitrary code via ternary operator', () => {
225
+ const content = 'ArbitraryCode: {true ? (() => { return "Hacked" })() : "Safe"}';
226
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
227
+ // Execution of arbitrary functions is not allowed; placeholder remains unchanged
228
+ expect(result).toBe('ArbitraryCode: {true ? (() => { return "Hacked" })() : "Safe"}');
229
+ });
230
+ it('should handle attempts to override context variables', () => {
231
+ const content = 'Override: {date = "Hacked"} {date}';
232
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
233
+ // Assignment operations are not supported; placeholders remain unchanged
234
+ const date = new Date();
235
+ const padZero = (num) => String(num).padStart(2, '0');
236
+ const dateFmt = `${date.getFullYear()}/${padZero(date.getMonth() + 1)}/${padZero(date.getDate())}`;
237
+ expect(result).toBe(`Override: {date = "Hacked"} ${dateFmt}`);
238
+ });
239
+ it('should prevent using eval-like expressions', () => {
240
+ const content = 'Eval: {eval("2 + 2")';
241
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
242
+ // 'eval' is not in allowedGlobals; placeholder remains unchanged
243
+ expect(result).toBe('Eval: {eval("2 + 2")');
244
+ });
245
+ it('should prevent accessing undefined variables', () => {
246
+ const content = 'Undefined: {undefinedVar}';
247
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
248
+ // 'undefinedVar' is not defined; placeholder remains unchanged
249
+ expect(result).toBe('Undefined: {undefinedVar}');
250
+ });
251
+ it('should prevent accessing nested properties of undefined variables', () => {
252
+ const content = 'NestedUndefined: {user.name}';
253
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
254
+ // 'user' is undefined; accessing 'name' should fail and placeholder remains unchanged
255
+ expect(result).toBe('NestedUndefined: {user.name}');
256
+ });
257
+ it('should prevent accessing nested prohibited properties in objects', () => {
258
+ const content = 'Nested: {user.__proto__.polluted}';
259
+ const variables = { user: {} };
260
+ const result = (0, expression_1.replacePlaceholders)({ content, variables, schemas: [] });
261
+ // Since access to '__proto__' is prohibited, the placeholder remains unchanged.
262
+ expect(result).toBe('Nested: {user.__proto__.polluted}');
263
+ });
264
+ it('should prevent using Function constructor', () => {
265
+ const content = 'Function: {Function("return 42")()}';
266
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
267
+ // Since 'Function' is not included in allowedGlobals, the placeholder remains unchanged.
268
+ expect(result).toBe('Function: {Function("return 42")()}');
269
+ });
270
+ });
271
+ describe('replacePlaceholders - Comparison Operators Tests', () => {
272
+ it('should evaluate expressions with == operator', () => {
273
+ const content = 'Equals: {1 == 1}';
274
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
275
+ expect(result).toBe('Equals: true');
276
+ });
277
+ it('should evaluate expressions with != operator', () => {
278
+ const content = 'NotEquals: {1 != 2}';
279
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
280
+ expect(result).toBe('NotEquals: true');
281
+ });
282
+ it('should evaluate expressions with === operator', () => {
283
+ const content = 'StrictEquals: {1 === 1}';
284
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
285
+ expect(result).toBe('StrictEquals: true');
286
+ });
287
+ it('should evaluate expressions with !== operator', () => {
288
+ const content = 'StrictNotEquals: {1 !== "1"}';
289
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
290
+ expect(result).toBe('StrictNotEquals: true');
291
+ });
292
+ it('should evaluate expressions with < operator', () => {
293
+ const content = 'LessThan: {1 < 2}';
294
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
295
+ expect(result).toBe('LessThan: true');
296
+ });
297
+ it('should evaluate expressions with > operator', () => {
298
+ const content = 'GreaterThan: {2 > 1}';
299
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
300
+ expect(result).toBe('GreaterThan: true');
301
+ });
302
+ it('should evaluate expressions with <= operator', () => {
303
+ const content = 'LessThanOrEquals: {1 <= 1}';
304
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
305
+ expect(result).toBe('LessThanOrEquals: true');
306
+ });
307
+ it('should evaluate expressions with >= operator', () => {
308
+ const content = 'GreaterThanOrEquals: {2 >= 1}';
309
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
310
+ expect(result).toBe('GreaterThanOrEquals: true');
311
+ });
312
+ it('should handle complex expressions with comparison operators', () => {
313
+ const content = 'Complex: {1 + 2 > 2 && 4 - 1 < 5}';
314
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
315
+ expect(result).toBe('Complex: true');
316
+ });
317
+ it('should prevent execution of arbitrary code via comparison operators', () => {
318
+ const content = 'ArbitraryCode: {1 < (() => { return "Hacked" })()}';
319
+ const result = (0, expression_1.replacePlaceholders)({ content, variables: {}, schemas: [] });
320
+ // Execution of arbitrary functions is not allowed; placeholder remains unchanged
321
+ expect(result).toBe('ArbitraryCode: {1 < (() => { return "Hacked" })()}');
322
+ });
323
+ });
324
+ //# sourceMappingURL=expression.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.test.js","sourceRoot":"","sources":["../../../__tests__/expression.test.ts"],"names":[],"mappings":"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"}