@pdfme/common 0.0.0

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.
Files changed (108) hide show
  1. package/README.md +5 -0
  2. package/dist/cjs/__tests__/dynamicTemplate.test.js +275 -0
  3. package/dist/cjs/__tests__/dynamicTemplate.test.js.map +1 -0
  4. package/dist/cjs/__tests__/expression.test.js +474 -0
  5. package/dist/cjs/__tests__/expression.test.js.map +1 -0
  6. package/dist/cjs/__tests__/helper.test.js +647 -0
  7. package/dist/cjs/__tests__/helper.test.js.map +1 -0
  8. package/dist/cjs/__tests__/pluginRegistry.test.js +83 -0
  9. package/dist/cjs/__tests__/pluginRegistry.test.js.map +1 -0
  10. package/dist/cjs/src/constants.js +27 -0
  11. package/dist/cjs/src/constants.js.map +1 -0
  12. package/dist/cjs/src/dynamicTemplate.js +284 -0
  13. package/dist/cjs/src/dynamicTemplate.js.map +1 -0
  14. package/dist/cjs/src/expression.js +463 -0
  15. package/dist/cjs/src/expression.js.map +1 -0
  16. package/dist/cjs/src/helper.js +217 -0
  17. package/dist/cjs/src/helper.js.map +1 -0
  18. package/dist/cjs/src/index.js +42 -0
  19. package/dist/cjs/src/index.js.map +1 -0
  20. package/dist/cjs/src/pluginRegistry.js +33 -0
  21. package/dist/cjs/src/pluginRegistry.js.map +1 -0
  22. package/dist/cjs/src/schema.js +190 -0
  23. package/dist/cjs/src/schema.js.map +1 -0
  24. package/dist/cjs/src/types.js +3 -0
  25. package/dist/cjs/src/types.js.map +1 -0
  26. package/dist/cjs/src/version.js +5 -0
  27. package/dist/cjs/src/version.js.map +1 -0
  28. package/dist/esm/__tests__/dynamicTemplate.test.js +240 -0
  29. package/dist/esm/__tests__/dynamicTemplate.test.js.map +1 -0
  30. package/dist/esm/__tests__/expression.test.js +472 -0
  31. package/dist/esm/__tests__/expression.test.js.map +1 -0
  32. package/dist/esm/__tests__/helper.test.js +612 -0
  33. package/dist/esm/__tests__/helper.test.js.map +1 -0
  34. package/dist/esm/__tests__/pluginRegistry.test.js +81 -0
  35. package/dist/esm/__tests__/pluginRegistry.test.js.map +1 -0
  36. package/dist/esm/src/constants.js +24 -0
  37. package/dist/esm/src/constants.js.map +1 -0
  38. package/dist/esm/src/dynamicTemplate.js +280 -0
  39. package/dist/esm/src/dynamicTemplate.js.map +1 -0
  40. package/dist/esm/src/expression.js +426 -0
  41. package/dist/esm/src/expression.js.map +1 -0
  42. package/dist/esm/src/helper.js +193 -0
  43. package/dist/esm/src/helper.js.map +1 -0
  44. package/dist/esm/src/index.js +8 -0
  45. package/dist/esm/src/index.js.map +1 -0
  46. package/dist/esm/src/pluginRegistry.js +29 -0
  47. package/dist/esm/src/pluginRegistry.js.map +1 -0
  48. package/dist/esm/src/schema.js +187 -0
  49. package/dist/esm/src/schema.js.map +1 -0
  50. package/dist/esm/src/types.js +2 -0
  51. package/dist/esm/src/types.js.map +1 -0
  52. package/dist/esm/src/version.js +2 -0
  53. package/dist/esm/src/version.js.map +1 -0
  54. package/dist/node/__tests__/dynamicTemplate.test.js +275 -0
  55. package/dist/node/__tests__/dynamicTemplate.test.js.map +1 -0
  56. package/dist/node/__tests__/expression.test.js +474 -0
  57. package/dist/node/__tests__/expression.test.js.map +1 -0
  58. package/dist/node/__tests__/helper.test.js +647 -0
  59. package/dist/node/__tests__/helper.test.js.map +1 -0
  60. package/dist/node/__tests__/pluginRegistry.test.js +83 -0
  61. package/dist/node/__tests__/pluginRegistry.test.js.map +1 -0
  62. package/dist/node/src/constants.js +27 -0
  63. package/dist/node/src/constants.js.map +1 -0
  64. package/dist/node/src/dynamicTemplate.js +284 -0
  65. package/dist/node/src/dynamicTemplate.js.map +1 -0
  66. package/dist/node/src/expression.js +463 -0
  67. package/dist/node/src/expression.js.map +1 -0
  68. package/dist/node/src/helper.js +217 -0
  69. package/dist/node/src/helper.js.map +1 -0
  70. package/dist/node/src/index.js +42 -0
  71. package/dist/node/src/index.js.map +1 -0
  72. package/dist/node/src/pluginRegistry.js +33 -0
  73. package/dist/node/src/pluginRegistry.js.map +1 -0
  74. package/dist/node/src/schema.js +190 -0
  75. package/dist/node/src/schema.js.map +1 -0
  76. package/dist/node/src/types.js +3 -0
  77. package/dist/node/src/types.js.map +1 -0
  78. package/dist/node/src/version.js +5 -0
  79. package/dist/node/src/version.js.map +1 -0
  80. package/dist/types/__tests__/dynamicTemplate.test.d.ts +1 -0
  81. package/dist/types/__tests__/expression.test.d.ts +1 -0
  82. package/dist/types/__tests__/helper.test.d.ts +1 -0
  83. package/dist/types/__tests__/pluginRegistry.test.d.ts +1 -0
  84. package/dist/types/src/constants.d.ts +20 -0
  85. package/dist/types/src/dynamicTemplate.d.ts +15 -0
  86. package/dist/types/src/expression.d.ts +6 -0
  87. package/dist/types/src/helper.d.ts +35 -0
  88. package/dist/types/src/index.d.ts +9 -0
  89. package/dist/types/src/pluginRegistry.d.ts +5 -0
  90. package/dist/types/src/schema.d.ts +820 -0
  91. package/dist/types/src/types.d.ts +181 -0
  92. package/dist/types/src/version.d.ts +1 -0
  93. package/eslint.config.mjs +22 -0
  94. package/package.json +84 -0
  95. package/set-version.js +31 -0
  96. package/src/constants.ts +30 -0
  97. package/src/dynamicTemplate.ts +349 -0
  98. package/src/expression.ts +460 -0
  99. package/src/helper.ts +284 -0
  100. package/src/index.ts +136 -0
  101. package/src/pluginRegistry.ts +30 -0
  102. package/src/schema.ts +223 -0
  103. package/src/types.ts +198 -0
  104. package/src/version.ts +1 -0
  105. package/tsconfig.cjs.json +10 -0
  106. package/tsconfig.esm.json +11 -0
  107. package/tsconfig.json +6 -0
  108. package/tsconfig.node.json +11 -0
@@ -0,0 +1,472 @@
1
+ import { replacePlaceholders } from '../src/expression.js';
2
+ describe('replacePlaceholders', () => {
3
+ it('should return content as is if there are no placeholders', () => {
4
+ const content = 'Hello, world!';
5
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
6
+ expect(result).toBe(content);
7
+ });
8
+ it('should replace placeholders with variables', () => {
9
+ const content = 'Hello, {name}!';
10
+ const variables = { name: 'Alice' };
11
+ const result = replacePlaceholders({ content, variables, schemas: [] });
12
+ expect(result).toBe('Hello, Alice!');
13
+ });
14
+ it('should evaluate expressions within placeholders', () => {
15
+ const content = 'The sum is {1 + 2}.';
16
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
17
+ expect(result).toBe('The sum is 3.');
18
+ });
19
+ it('should handle date and dateTime placeholders', () => {
20
+ const content = 'Today is {date} and now is {dateTime}.';
21
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
22
+ const date = new Date();
23
+ const padZero = (num) => String(num).padStart(2, '0');
24
+ const formattedDate = `${date.getFullYear()}/${padZero(date.getMonth() + 1)}/${padZero(date.getDate())}`;
25
+ const formattedDateTime = `${formattedDate} ${padZero(date.getHours())}:${padZero(date.getMinutes())}`;
26
+ expect(result).toBe(`Today is ${formattedDate} and now is ${formattedDateTime}.`);
27
+ });
28
+ it('should handle data from schemas', () => {
29
+ const content = 'Schema content: {name}';
30
+ const variables = {};
31
+ const schemas = [
32
+ [
33
+ {
34
+ name: 'name',
35
+ type: 'text',
36
+ content: 'SchemaName',
37
+ readOnly: true,
38
+ },
39
+ ],
40
+ ];
41
+ const result = replacePlaceholders({ content, variables, schemas });
42
+ expect(result).toBe('Schema content: SchemaName');
43
+ });
44
+ it('should prioritize variables over schemas', () => {
45
+ const content = 'Name: {name}';
46
+ const variables = { name: 'VariableName' };
47
+ const schemas = [
48
+ [
49
+ {
50
+ name: 'name',
51
+ type: 'text',
52
+ content: 'SchemaName',
53
+ readOnly: true,
54
+ },
55
+ ],
56
+ ];
57
+ const result = replacePlaceholders({ content, variables, schemas });
58
+ expect(result).toBe('Name: VariableName');
59
+ });
60
+ it('should handle nested placeholders in variables', () => {
61
+ const content = 'Nested variable: {greeting}';
62
+ const variables = { greeting: 'Hello, {name}!' };
63
+ const schemas = [
64
+ [
65
+ {
66
+ name: 'name',
67
+ type: 'text',
68
+ content: 'Bob',
69
+ readOnly: true,
70
+ },
71
+ ],
72
+ ];
73
+ const result = replacePlaceholders({ content, variables, schemas });
74
+ expect(result).toBe('Nested variable: Hello, Bob!');
75
+ });
76
+ it('should return content unchanged when placeholders are invalid', () => {
77
+ const content = 'Invalid placeholder: {name';
78
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
79
+ expect(result).toBe('Invalid placeholder: {name');
80
+ });
81
+ it('should evaluate expressions even if they result in Infinity', () => {
82
+ const content = 'Divide by zero: {1 / 0}';
83
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
84
+ expect(result).toBe('Divide by zero: Infinity');
85
+ });
86
+ it('should handle complex expressions', () => {
87
+ const content = 'Result: {Math.max(1, 2, 3)}';
88
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
89
+ expect(result).toBe('Result: 3');
90
+ });
91
+ it('should parse JSON strings in variables', () => {
92
+ const content = 'Data: {data.value}';
93
+ const variables = { data: '{"value": "42"}' };
94
+ const result = replacePlaceholders({ content, variables, schemas: [] });
95
+ expect(result).toBe('Data: 42');
96
+ });
97
+ it('should handle variables of different types', () => {
98
+ const content = 'Number: {num}, Boolean: {bool}, Array: {arr[0]}, Object: {obj.key}';
99
+ const variables = {
100
+ num: 42,
101
+ bool: true,
102
+ arr: ['first', 'second'],
103
+ obj: { key: 'value' },
104
+ };
105
+ const result = replacePlaceholders({ content, variables, schemas: [] });
106
+ expect(result).toBe('Number: 42, Boolean: true, Array: first, Object: value');
107
+ });
108
+ it('should use content from readOnly schemas', () => {
109
+ const content = 'Content: {readOnlyField}';
110
+ const variables = {};
111
+ const schemas = [
112
+ [
113
+ {
114
+ name: 'readOnlyField',
115
+ type: 'text',
116
+ content: 'ReadOnlyContent',
117
+ readOnly: true,
118
+ },
119
+ ],
120
+ ];
121
+ const result = replacePlaceholders({ content, variables, schemas });
122
+ expect(result).toBe('Content: ReadOnlyContent');
123
+ });
124
+ it('should use empty string for non-readOnly schema content', () => {
125
+ const content = 'Content: {editableField}';
126
+ const variables = {};
127
+ const schemas = [
128
+ [
129
+ {
130
+ name: 'editableField',
131
+ type: 'text',
132
+ content: 'Should not be used',
133
+ readOnly: false,
134
+ },
135
+ ],
136
+ ];
137
+ const result = replacePlaceholders({ content, variables, schemas });
138
+ expect(result).toBe('Content: ');
139
+ });
140
+ it('should allow method chaining on permitted global objects', () => {
141
+ const content = 'Chained: {Math.random().toString()}';
142
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
143
+ // Math.random() generates a random number, which is then converted to a string using toString()
144
+ const regex = /^Chained: \d+\.\d+$/;
145
+ expect(regex.test(result)).toBe(true);
146
+ });
147
+ });
148
+ describe('replacePlaceholders - Security Tests', () => {
149
+ it('should prevent access to __proto__ property', () => {
150
+ const content = 'Proto: {__proto__}';
151
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
152
+ // Since __proto__ access is prohibited, the placeholder should remain unchanged
153
+ expect(result).toBe('Proto: {__proto__}');
154
+ });
155
+ it('should prevent access to constructor property', () => {
156
+ const content = 'Constructor: {constructor}';
157
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
158
+ // 'constructor' is allowed if defined in context or globals; assuming it's not, placeholder remains
159
+ expect(result).toBe('Constructor: {constructor}');
160
+ });
161
+ it('should prevent access to prototype property', () => {
162
+ const content = 'Prototype: {prototype}';
163
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
164
+ // 'prototype' access is prohibited
165
+ expect(result).toBe('Prototype: {prototype}');
166
+ });
167
+ it('should prevent access to nested prohibited properties', () => {
168
+ const content = 'Nested: {user.__proto__.polluted}';
169
+ const variables = { user: {} };
170
+ const result = replacePlaceholders({ content, variables, schemas: [] });
171
+ // Access to '__proto__' is prohibited; placeholder remains unchanged
172
+ expect(result).toBe('Nested: {user.__proto__.polluted}');
173
+ });
174
+ it('should prevent use of Function constructor', () => {
175
+ const content = 'Function: {Function("return 42")()}';
176
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
177
+ // Use of Function constructor is not allowed; placeholder remains unchanged
178
+ expect(result).toBe('Function: {Function("return 42")()}');
179
+ });
180
+ it('should prevent access to disallowed global variables', () => {
181
+ const content = 'Process: {process.env}';
182
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
183
+ // 'process' is not in allowedGlobals; placeholder remains unchanged
184
+ expect(result).toBe('Process: {process.env}');
185
+ });
186
+ it('should prevent prototype pollution via JSON.parse', () => {
187
+ const content = 'Polluted: {JSON.parse(\'{"__proto__":{"polluted":true}}\').polluted}';
188
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
189
+ // Even if 'polluted' is accessed, the prototype is not polluted, so undefined is returned.
190
+ expect(result).toBe('Polluted: undefined');
191
+ });
192
+ it('should prevent accessing nested prohibited properties in functions', () => {
193
+ const content = 'Access: {( () => { return this.constructor } )()}';
194
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
195
+ // Attempting to access 'constructor' via 'this' should be prohibited; placeholder remains unchanged
196
+ expect(result).toBe('Access: {( () => { return this.constructor } )()}');
197
+ });
198
+ it('should prevent accessing global objects not in allowedGlobals', () => {
199
+ const content = 'Global: {global}';
200
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
201
+ // 'global' is not in allowedGlobals; placeholder remains unchanged
202
+ expect(result).toBe('Global: {global}');
203
+ });
204
+ it('should prevent accessing Object constructor via allowed globals', () => {
205
+ const content = 'ObjectConstructor: {Object.constructor}';
206
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
207
+ // Accessing 'constructor' of 'Object' is prohibited
208
+ expect(result).toBe('ObjectConstructor: {Object.constructor}');
209
+ });
210
+ it('should prevent accessing Function from allowed globals', () => {
211
+ const content = 'FunctionAccess: {Function("return 42")()}';
212
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
213
+ // 'Function' is not in allowedGlobals, so this should fail
214
+ expect(result).toBe('FunctionAccess: {Function("return 42")()}');
215
+ });
216
+ it('should prevent accessing nested properties via allowed globals', () => {
217
+ const content = 'NestedAccess: {Math.__proto__.polluted}';
218
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
219
+ // Accessing '__proto__' of allowed global 'Math' is prohibited
220
+ expect(result).toBe('NestedAccess: {Math.__proto__.polluted}');
221
+ });
222
+ it('should prevent execution of arbitrary code via ternary operator', () => {
223
+ const content = 'ArbitraryCode: {true ? (() => { return "Hacked" })() : "Safe"}';
224
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
225
+ // Execution of arbitrary functions is not allowed; placeholder remains unchanged
226
+ expect(result).toBe('ArbitraryCode: {true ? (() => { return "Hacked" })() : "Safe"}');
227
+ });
228
+ it('should handle attempts to override context variables', () => {
229
+ const content = 'Override: {date = "Hacked"} {date}';
230
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
231
+ // Assignment operations are not supported; placeholders remain unchanged
232
+ const date = new Date();
233
+ const padZero = (num) => String(num).padStart(2, '0');
234
+ const dateFmt = `${date.getFullYear()}/${padZero(date.getMonth() + 1)}/${padZero(date.getDate())}`;
235
+ expect(result).toBe(`Override: {date = "Hacked"} ${dateFmt}`);
236
+ });
237
+ it('should prevent using eval-like expressions', () => {
238
+ const content = 'Eval: {eval("2 + 2")';
239
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
240
+ // 'eval' is not in allowedGlobals; placeholder remains unchanged
241
+ expect(result).toBe('Eval: {eval("2 + 2")');
242
+ });
243
+ it('should prevent accessing undefined variables', () => {
244
+ const content = 'Undefined: {undefinedVar}';
245
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
246
+ // 'undefinedVar' is not defined; placeholder remains unchanged
247
+ expect(result).toBe('Undefined: {undefinedVar}');
248
+ });
249
+ it('should prevent accessing nested properties of undefined variables', () => {
250
+ const content = 'NestedUndefined: {user.name}';
251
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
252
+ // 'user' is undefined; accessing 'name' should fail and placeholder remains unchanged
253
+ expect(result).toBe('NestedUndefined: {user.name}');
254
+ });
255
+ it('should prevent accessing nested prohibited properties in objects', () => {
256
+ const content = 'Nested: {user.__proto__.polluted}';
257
+ const variables = { user: {} };
258
+ const result = replacePlaceholders({ content, variables, schemas: [] });
259
+ // Since access to '__proto__' is prohibited, the placeholder remains unchanged.
260
+ expect(result).toBe('Nested: {user.__proto__.polluted}');
261
+ });
262
+ it('should prevent using Function constructor', () => {
263
+ const content = 'Function: {Function("return 42")()}';
264
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
265
+ // Since 'Function' is not included in allowedGlobals, the placeholder remains unchanged.
266
+ expect(result).toBe('Function: {Function("return 42")()}');
267
+ });
268
+ });
269
+ describe('replacePlaceholders - Comparison Operators Tests', () => {
270
+ it('should evaluate expressions with == operator', () => {
271
+ const content = 'Equals: {1 == 1}';
272
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
273
+ expect(result).toBe('Equals: true');
274
+ });
275
+ it('should evaluate expressions with != operator', () => {
276
+ const content = 'NotEquals: {1 != 2}';
277
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
278
+ expect(result).toBe('NotEquals: true');
279
+ });
280
+ it('should evaluate expressions with === operator', () => {
281
+ const content = 'StrictEquals: {1 === 1}';
282
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
283
+ expect(result).toBe('StrictEquals: true');
284
+ });
285
+ it('should evaluate expressions with !== operator', () => {
286
+ const content = 'StrictNotEquals: {1 !== "1"}';
287
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
288
+ expect(result).toBe('StrictNotEquals: true');
289
+ });
290
+ it('should evaluate expressions with < operator', () => {
291
+ const content = 'LessThan: {1 < 2}';
292
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
293
+ expect(result).toBe('LessThan: true');
294
+ });
295
+ it('should evaluate expressions with > operator', () => {
296
+ const content = 'GreaterThan: {2 > 1}';
297
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
298
+ expect(result).toBe('GreaterThan: true');
299
+ });
300
+ it('should evaluate expressions with <= operator', () => {
301
+ const content = 'LessThanOrEquals: {1 <= 1}';
302
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
303
+ expect(result).toBe('LessThanOrEquals: true');
304
+ });
305
+ it('should evaluate expressions with >= operator', () => {
306
+ const content = 'GreaterThanOrEquals: {2 >= 1}';
307
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
308
+ expect(result).toBe('GreaterThanOrEquals: true');
309
+ });
310
+ it('should handle complex expressions with comparison operators', () => {
311
+ const content = 'Complex: {1 + 2 > 2 && 4 - 1 < 5}';
312
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
313
+ expect(result).toBe('Complex: true');
314
+ });
315
+ it('should prevent execution of arbitrary code via comparison operators', () => {
316
+ const content = 'ArbitraryCode: {1 < (() => { return "Hacked" })()}';
317
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
318
+ // Execution of arbitrary functions is not allowed; placeholder remains unchanged
319
+ expect(result).toBe('ArbitraryCode: {1 < (() => { return "Hacked" })()}');
320
+ });
321
+ });
322
+ describe('replacePlaceholders - XSS Vulnerability Prevention Tests', () => {
323
+ it('should prevent XSS via Object.getOwnPropertyDescriptor and Object.getPrototypeOf (CVE payload 1)', () => {
324
+ const content = '{ ((f, g) => f(g(Object), "constructor").value)(Object.getOwnPropertyDescriptor, Object.getPrototypeOf)("alert(location)")() }';
325
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
326
+ // The dangerous expression should not be evaluated and should return as-is
327
+ expect(result).toBe(content);
328
+ });
329
+ it('should prevent XSS via object property assignment (CVE payload 2)', () => {
330
+ const content = '{ { f: Object.getOwnPropertyDescriptor }.f({ g: Object.getPrototypeOf }.g(Object), "constructor").value("alert(location)")() }';
331
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
332
+ // The dangerous expression should not be evaluated and should return as-is
333
+ expect(result).toBe(content);
334
+ });
335
+ it('should prevent direct access to Object.getOwnPropertyDescriptor', () => {
336
+ const content = '{ Object.getOwnPropertyDescriptor(Object, "constructor") }';
337
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
338
+ // Direct access to dangerous method should be blocked
339
+ expect(result).toBe(content);
340
+ });
341
+ it('should prevent direct access to Object.getPrototypeOf', () => {
342
+ const content = '{ Object.getPrototypeOf(Object) }';
343
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
344
+ // Direct access to dangerous method should be blocked
345
+ expect(result).toBe(content);
346
+ });
347
+ it('should prevent access to Object.setPrototypeOf', () => {
348
+ const content = '{ Object.setPrototypeOf({}, null) }';
349
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
350
+ // Direct access to dangerous method should be blocked
351
+ expect(result).toBe(content);
352
+ });
353
+ it('should prevent access to Object.defineProperty', () => {
354
+ const content = '{ Object.defineProperty({}, "prop", { value: 42 }) }';
355
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
356
+ // Direct access to dangerous method should be blocked
357
+ expect(result).toBe(content);
358
+ });
359
+ it('should prevent access to Object.defineProperties', () => {
360
+ const content = '{ Object.defineProperties({}, { prop: { value: 42 } }) }';
361
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
362
+ // Direct access to dangerous method should be blocked
363
+ expect(result).toBe(content);
364
+ });
365
+ it('should prevent access to Object.getOwnPropertyNames', () => {
366
+ const content = '{ Object.getOwnPropertyNames(Object) }';
367
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
368
+ // Direct access to dangerous method should be blocked
369
+ expect(result).toBe(content);
370
+ });
371
+ it('should prevent access to Object.getOwnPropertySymbols', () => {
372
+ const content = '{ Object.getOwnPropertySymbols(Object) }';
373
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
374
+ // Direct access to dangerous method should be blocked
375
+ expect(result).toBe(content);
376
+ });
377
+ it('should allow safe Object methods', () => {
378
+ // Test Object.keys
379
+ const keysContent = '{ Object.keys({ a: 1, b: 2 }) }';
380
+ const keysResult = replacePlaceholders({ content: keysContent, variables: {}, schemas: [] });
381
+ expect(keysResult).toBe('a,b');
382
+ // Test Object.values
383
+ const valuesContent = '{ Object.values({ a: 1, b: 2 }) }';
384
+ const valuesResult = replacePlaceholders({ content: valuesContent, variables: {}, schemas: [] });
385
+ expect(valuesResult).toBe('1,2');
386
+ // Test Object.entries
387
+ const entriesContent = '{ Object.entries({ a: 1 })[0] }';
388
+ const entriesResult = replacePlaceholders({ content: entriesContent, variables: {}, schemas: [] });
389
+ expect(entriesResult).toBe('a,1');
390
+ // Test safe Object.assign
391
+ const assignContent = '{ Object.assign({}, { a: 1 }, { b: 2 }).a }';
392
+ const assignResult = replacePlaceholders({ content: assignContent, variables: {}, schemas: [] });
393
+ expect(assignResult).toBe('1'); // Safe assign should work
394
+ });
395
+ it('should prevent complex XSS attempts via nested function calls', () => {
396
+ const content = '{ [].map.call("abc", Object.getOwnPropertyDescriptor) }';
397
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
398
+ // Complex attempts to access dangerous functions should be blocked
399
+ expect(result).toBe(content);
400
+ });
401
+ it('should prevent Function constructor access via constructor property', () => {
402
+ const content = '{ "".constructor.constructor("alert(1)")() }';
403
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
404
+ // Attempts to access Function constructor should be blocked
405
+ expect(result).toBe(content);
406
+ });
407
+ it('should prevent prototype pollution via Object.assign and __lookupGetter__', () => {
408
+ const content = '{ { assign: Object.assign }.assign({ f: {}.__lookupGetter__("__proto__") }.f(), { polluted: "yes" }) }';
409
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
410
+ // The dangerous expression should not be evaluated due to __lookupGetter__ being blocked
411
+ expect(result).toBe(content);
412
+ // Verify that prototype is not polluted
413
+ expect({}.polluted).toBeUndefined();
414
+ });
415
+ it('should prevent access to __lookupGetter__', () => {
416
+ const content = '{ {}.__lookupGetter__("__proto__") }';
417
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
418
+ expect(result).toBe(content);
419
+ });
420
+ it('should prevent access to __lookupSetter__', () => {
421
+ const content = '{ {}.__lookupSetter__("__proto__") }';
422
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
423
+ expect(result).toBe(content);
424
+ });
425
+ it('should prevent access to __defineGetter__', () => {
426
+ const content = '{ {}.__defineGetter__("test", () => "hacked") }';
427
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
428
+ expect(result).toBe(content);
429
+ });
430
+ it('should prevent access to __defineSetter__', () => {
431
+ const content = '{ {}.__defineSetter__("test", () => {}) }';
432
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
433
+ expect(result).toBe(content);
434
+ });
435
+ it('should allow safe Object.assign but prevent prototype pollution', () => {
436
+ const content = '{ Object.assign({}, { a: 1 }) }';
437
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
438
+ // Safe assign should work
439
+ expect(result).toBe('[object Object]');
440
+ });
441
+ it('should prevent prototype pollution via Object.assign', () => {
442
+ const pollutionContent = '{ Object.assign({}, { "__proto__": { polluted: "yes" } }) }';
443
+ const result = replacePlaceholders({ content: pollutionContent, variables: {}, schemas: [] });
444
+ // Should execute but not pollute prototype
445
+ expect(result).toBe('[object Object]');
446
+ expect({}.polluted).toBeUndefined();
447
+ // Test with constructor
448
+ const constructorContent = '{ Object.assign({}, { "constructor": { polluted: "yes" } }) }';
449
+ const result2 = replacePlaceholders({ content: constructorContent, variables: {}, schemas: [] });
450
+ expect(result2).toBe('[object Object]');
451
+ expect({}.constructor.polluted).toBeUndefined();
452
+ });
453
+ it('should no longer allow Object.create due to security concerns', () => {
454
+ const content = '{ Object.create(null) }';
455
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
456
+ // Object.create is now blocked
457
+ expect(result).toBe(content);
458
+ });
459
+ it('should no longer allow Object.freeze due to security concerns', () => {
460
+ const content = '{ Object.freeze({}) }';
461
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
462
+ // Object.freeze is now blocked
463
+ expect(result).toBe(content);
464
+ });
465
+ it('should no longer allow Object.seal due to security concerns', () => {
466
+ const content = '{ Object.seal({}) }';
467
+ const result = replacePlaceholders({ content, variables: {}, schemas: [] });
468
+ // Object.seal is now blocked
469
+ expect(result).toBe(content);
470
+ });
471
+ });
472
+ //# 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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"}