@memberjunction/global 5.0.0 → 5.2.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 (138) hide show
  1. package/README.md +19 -3
  2. package/dist/DynamicPackageLoader.d.ts +61 -0
  3. package/dist/DynamicPackageLoader.d.ts.map +1 -0
  4. package/dist/DynamicPackageLoader.js +56 -0
  5. package/dist/DynamicPackageLoader.js.map +1 -0
  6. package/dist/SQLExpressionValidator.d.ts +31 -4
  7. package/dist/SQLExpressionValidator.d.ts.map +1 -1
  8. package/dist/SQLExpressionValidator.js +107 -22
  9. package/dist/SQLExpressionValidator.js.map +1 -1
  10. package/dist/__tests__/SQLExpressionValidator.security.test.d.ts +2 -0
  11. package/dist/__tests__/SQLExpressionValidator.security.test.d.ts.map +1 -0
  12. package/dist/__tests__/SQLExpressionValidator.security.test.js +328 -0
  13. package/dist/__tests__/SQLExpressionValidator.security.test.js.map +1 -0
  14. package/dist/__tests__/SQLExpressionValidator.test.d.ts +2 -0
  15. package/dist/__tests__/SQLExpressionValidator.test.d.ts.map +1 -0
  16. package/dist/__tests__/SQLExpressionValidator.test.js +350 -0
  17. package/dist/__tests__/SQLExpressionValidator.test.js.map +1 -0
  18. package/dist/index.d.ts +1 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/package.json +1 -1
  23. package/dist/Core.d.ts +0 -29
  24. package/dist/Core.d.ts.map +0 -1
  25. package/dist/Core.js +0 -58
  26. package/dist/Core.js.map +0 -1
  27. package/dist/generic/QueryCache.d.ts +0 -85
  28. package/dist/generic/QueryCache.d.ts.map +0 -1
  29. package/dist/generic/QueryCache.js +0 -198
  30. package/dist/generic/QueryCache.js.map +0 -1
  31. package/dist/generic/QueryCacheConfig.d.ts +0 -72
  32. package/dist/generic/QueryCacheConfig.d.ts.map +0 -1
  33. package/dist/generic/QueryCacheConfig.js +0 -3
  34. package/dist/generic/QueryCacheConfig.js.map +0 -1
  35. package/dist/generic/applicationInfo.d.ts +0 -138
  36. package/dist/generic/applicationInfo.d.ts.map +0 -1
  37. package/dist/generic/applicationInfo.js +0 -177
  38. package/dist/generic/applicationInfo.js.map +0 -1
  39. package/dist/generic/authEvaluator.d.ts +0 -25
  40. package/dist/generic/authEvaluator.d.ts.map +0 -1
  41. package/dist/generic/authEvaluator.js +0 -49
  42. package/dist/generic/authEvaluator.js.map +0 -1
  43. package/dist/generic/authTypes.d.ts +0 -193
  44. package/dist/generic/authTypes.d.ts.map +0 -1
  45. package/dist/generic/authTypes.js +0 -19
  46. package/dist/generic/authTypes.js.map +0 -1
  47. package/dist/generic/baseEngine.d.ts +0 -260
  48. package/dist/generic/baseEngine.d.ts.map +0 -1
  49. package/dist/generic/baseEngine.js +0 -510
  50. package/dist/generic/baseEngine.js.map +0 -1
  51. package/dist/generic/baseEntity.d.ts +0 -691
  52. package/dist/generic/baseEntity.d.ts.map +0 -1
  53. package/dist/generic/baseEntity.js +0 -1688
  54. package/dist/generic/baseEntity.js.map +0 -1
  55. package/dist/generic/baseInfo.d.ts +0 -24
  56. package/dist/generic/baseInfo.d.ts.map +0 -1
  57. package/dist/generic/baseInfo.js +0 -53
  58. package/dist/generic/baseInfo.js.map +0 -1
  59. package/dist/generic/compositeKey.d.ts +0 -206
  60. package/dist/generic/compositeKey.d.ts.map +0 -1
  61. package/dist/generic/compositeKey.js +0 -412
  62. package/dist/generic/compositeKey.js.map +0 -1
  63. package/dist/generic/databaseProviderBase.d.ts +0 -46
  64. package/dist/generic/databaseProviderBase.d.ts.map +0 -1
  65. package/dist/generic/databaseProviderBase.js +0 -14
  66. package/dist/generic/databaseProviderBase.js.map +0 -1
  67. package/dist/generic/entityInfo.d.ts +0 -983
  68. package/dist/generic/entityInfo.d.ts.map +0 -1
  69. package/dist/generic/entityInfo.js +0 -1401
  70. package/dist/generic/entityInfo.js.map +0 -1
  71. package/dist/generic/explorerNavigationItem.d.ts +0 -20
  72. package/dist/generic/explorerNavigationItem.d.ts.map +0 -1
  73. package/dist/generic/explorerNavigationItem.js +0 -29
  74. package/dist/generic/explorerNavigationItem.js.map +0 -1
  75. package/dist/generic/interfaces.d.ts +0 -610
  76. package/dist/generic/interfaces.d.ts.map +0 -1
  77. package/dist/generic/interfaces.js +0 -211
  78. package/dist/generic/interfaces.js.map +0 -1
  79. package/dist/generic/libraryInfo.d.ts +0 -40
  80. package/dist/generic/libraryInfo.d.ts.map +0 -1
  81. package/dist/generic/libraryInfo.js +0 -56
  82. package/dist/generic/libraryInfo.js.map +0 -1
  83. package/dist/generic/logging.d.ts +0 -179
  84. package/dist/generic/logging.d.ts.map +0 -1
  85. package/dist/generic/logging.js +0 -382
  86. package/dist/generic/logging.js.map +0 -1
  87. package/dist/generic/metadata.d.ts +0 -305
  88. package/dist/generic/metadata.d.ts.map +0 -1
  89. package/dist/generic/metadata.js +0 -454
  90. package/dist/generic/metadata.js.map +0 -1
  91. package/dist/generic/metadataUtil.d.ts +0 -8
  92. package/dist/generic/metadataUtil.d.ts.map +0 -1
  93. package/dist/generic/metadataUtil.js +0 -36
  94. package/dist/generic/metadataUtil.js.map +0 -1
  95. package/dist/generic/providerBase.d.ts +0 -546
  96. package/dist/generic/providerBase.d.ts.map +0 -1
  97. package/dist/generic/providerBase.js +0 -999
  98. package/dist/generic/providerBase.js.map +0 -1
  99. package/dist/generic/queryInfo.d.ts +0 -460
  100. package/dist/generic/queryInfo.d.ts.map +0 -1
  101. package/dist/generic/queryInfo.js +0 -633
  102. package/dist/generic/queryInfo.js.map +0 -1
  103. package/dist/generic/querySQLFilters.d.ts +0 -54
  104. package/dist/generic/querySQLFilters.d.ts.map +0 -1
  105. package/dist/generic/querySQLFilters.js +0 -84
  106. package/dist/generic/querySQLFilters.js.map +0 -1
  107. package/dist/generic/runQuery.d.ts +0 -96
  108. package/dist/generic/runQuery.d.ts.map +0 -1
  109. package/dist/generic/runQuery.js +0 -66
  110. package/dist/generic/runQuery.js.map +0 -1
  111. package/dist/generic/runQuerySQLFilterImplementations.d.ts +0 -51
  112. package/dist/generic/runQuerySQLFilterImplementations.d.ts.map +0 -1
  113. package/dist/generic/runQuerySQLFilterImplementations.js +0 -238
  114. package/dist/generic/runQuerySQLFilterImplementations.js.map +0 -1
  115. package/dist/generic/runReport.d.ts +0 -25
  116. package/dist/generic/runReport.d.ts.map +0 -1
  117. package/dist/generic/runReport.js +0 -42
  118. package/dist/generic/runReport.js.map +0 -1
  119. package/dist/generic/securityInfo.d.ts +0 -355
  120. package/dist/generic/securityInfo.d.ts.map +0 -1
  121. package/dist/generic/securityInfo.js +0 -425
  122. package/dist/generic/securityInfo.js.map +0 -1
  123. package/dist/generic/transactionGroup.d.ts +0 -184
  124. package/dist/generic/transactionGroup.d.ts.map +0 -1
  125. package/dist/generic/transactionGroup.js +0 -357
  126. package/dist/generic/transactionGroup.js.map +0 -1
  127. package/dist/generic/util.d.ts +0 -81
  128. package/dist/generic/util.d.ts.map +0 -1
  129. package/dist/generic/util.js +0 -301
  130. package/dist/generic/util.js.map +0 -1
  131. package/dist/views/runView.d.ts +0 -150
  132. package/dist/views/runView.d.ts.map +0 -1
  133. package/dist/views/runView.js +0 -100
  134. package/dist/views/runView.js.map +0 -1
  135. package/dist/views/viewInfo.d.ts +0 -121
  136. package/dist/views/viewInfo.d.ts.map +0 -1
  137. package/dist/views/viewInfo.js +0 -182
  138. package/dist/views/viewInfo.js.map +0 -1
@@ -0,0 +1,328 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { SQLExpressionValidator } from '../SQLExpressionValidator.js';
3
+ /**
4
+ * Adversarial security tests for SQLExpressionValidator.
5
+ * These tests simulate real-world SQL injection attempts that an attacker
6
+ * (or a misguided LLM) might produce.
7
+ */
8
+ describe('SQLExpressionValidator - Security', () => {
9
+ let validator;
10
+ beforeEach(() => {
11
+ validator = SQLExpressionValidator.Instance;
12
+ });
13
+ // ---------------------------------------------------------------
14
+ // Classic SQL injection patterns (full_query context)
15
+ // ---------------------------------------------------------------
16
+ describe('SQL injection attempts (full_query)', () => {
17
+ const ctx = { context: 'full_query' };
18
+ it('should block tautology + stacked DROP', () => {
19
+ const r = validator.validateFullQuery("SELECT * FROM Users WHERE 1=1; DROP TABLE Users");
20
+ expect(r.valid).toBe(false);
21
+ // DROP is detected before semicolon in the keyword scan
22
+ expect(r.trigger).toBe('DROP');
23
+ });
24
+ it('should block UNION-based data exfiltration', () => {
25
+ // This is valid in full_query because UNION is allowed—
26
+ // BUT it must still start with SELECT. The attack vector here
27
+ // is actually fine for full_query (UNION is legitimate).
28
+ // The real guard is that only SELECT queries can be submitted.
29
+ const r = validator.validateFullQuery("SELECT 1 UNION SELECT password FROM sys.sql_logins");
30
+ // UNION is allowed in full_query, so this is valid from a syntax perspective.
31
+ // The protection is that ad-hoc queries run on a read-only connection.
32
+ expect(r.valid).toBe(true);
33
+ });
34
+ it('should block stacked DELETE after SELECT', () => {
35
+ const r = validator.validateFullQuery("SELECT 1; DELETE FROM Users");
36
+ expect(r.valid).toBe(false);
37
+ // DELETE is detected before semicolon in the keyword scan
38
+ expect(r.trigger).toBe('DELETE');
39
+ });
40
+ it('should block INSERT disguised after comment', () => {
41
+ const r = validator.validateFullQuery("SELECT 1 -- \nINSERT INTO Users (Name) VALUES ('hacked')");
42
+ // After stripping comments, "INSERT INTO Users..." is detected
43
+ expect(r.valid).toBe(false);
44
+ expect(r.trigger).toBe('INSERT');
45
+ });
46
+ it('should block EXEC sp_executesql', () => {
47
+ const r = validator.validateFullQuery("EXEC sp_executesql N'SELECT 1'");
48
+ expect(r.valid).toBe(false);
49
+ expect(r.trigger).toBe('EXEC');
50
+ });
51
+ it('should block EXECUTE xp_cmdshell', () => {
52
+ const r = validator.validateFullQuery("EXECUTE xp_cmdshell 'dir'");
53
+ expect(r.valid).toBe(false);
54
+ expect(r.trigger).toBe('EXECUTE');
55
+ });
56
+ it('should block WAITFOR DELAY (time-based blind injection)', () => {
57
+ const r = validator.validateFullQuery("SELECT 1 WHERE 1=1 WAITFOR DELAY '00:00:10'");
58
+ expect(r.valid).toBe(false);
59
+ expect(r.trigger).toBe('WAITFOR');
60
+ });
61
+ it('should block xp_cmdshell via keyword detection', () => {
62
+ const r = validator.validateFullQuery("SELECT 1; EXEC xp_cmdshell 'whoami'");
63
+ expect(r.valid).toBe(false);
64
+ // EXEC is detected before semicolon in the keyword scan
65
+ expect(r.trigger).toBe('EXEC');
66
+ });
67
+ it('should block OPENROWSET file access', () => {
68
+ const r = validator.validateFullQuery("SELECT * FROM OPENROWSET('SQLNCLI', 'Server=evil;', 'SELECT 1')");
69
+ expect(r.valid).toBe(false);
70
+ expect(r.trigger).toBe('OPENROWSET');
71
+ });
72
+ it('should block OPENDATASOURCE', () => {
73
+ const r = validator.validateFullQuery("SELECT * FROM OPENDATASOURCE('SQLNCLI', 'Data Source=evil;').db.dbo.Users");
74
+ expect(r.valid).toBe(false);
75
+ expect(r.trigger).toBe('OPENDATASOURCE');
76
+ });
77
+ it('should block BULK INSERT', () => {
78
+ const r = validator.validateFullQuery("BULK INSERT Users FROM '\\\\evil\\share\\data.csv'");
79
+ expect(r.valid).toBe(false);
80
+ // INSERT comes before BULK in the keyword scan order
81
+ expect(r.trigger).toBe('INSERT');
82
+ });
83
+ it('should block CREATE TABLE', () => {
84
+ const r = validator.validateFullQuery("CREATE TABLE Evil (ID INT)");
85
+ expect(r.valid).toBe(false);
86
+ });
87
+ it('should block ALTER TABLE', () => {
88
+ const r = validator.validateFullQuery("ALTER TABLE Users ADD HackedColumn NVARCHAR(100)");
89
+ expect(r.valid).toBe(false);
90
+ expect(r.trigger).toBe('ALTER');
91
+ });
92
+ it('should block GRANT privilege escalation', () => {
93
+ const r = validator.validateFullQuery("GRANT CONTROL ON DATABASE::mydb TO public");
94
+ expect(r.valid).toBe(false);
95
+ expect(r.trigger).toBe('GRANT');
96
+ });
97
+ it('should block REVOKE', () => {
98
+ const r = validator.validateFullQuery("REVOKE SELECT ON Users FROM someuser");
99
+ expect(r.valid).toBe(false);
100
+ expect(r.trigger).toBe('REVOKE');
101
+ });
102
+ it('should block DENY', () => {
103
+ const r = validator.validateFullQuery("DENY SELECT ON Users TO someuser");
104
+ expect(r.valid).toBe(false);
105
+ expect(r.trigger).toBe('DENY');
106
+ });
107
+ it('should block SHUTDOWN', () => {
108
+ const r = validator.validateFullQuery("SHUTDOWN WITH NOWAIT");
109
+ expect(r.valid).toBe(false);
110
+ expect(r.trigger).toBe('SHUTDOWN');
111
+ });
112
+ it('should block RECONFIGURE', () => {
113
+ const r = validator.validateFullQuery("RECONFIGURE WITH OVERRIDE");
114
+ expect(r.valid).toBe(false);
115
+ expect(r.trigger).toBe('RECONFIGURE');
116
+ });
117
+ it('should block statement not starting with SELECT/WITH', () => {
118
+ const r = validator.validateFullQuery("UPDATE Users SET IsAdmin = 1");
119
+ expect(r.valid).toBe(false);
120
+ expect(r.trigger).toBe('UPDATE');
121
+ });
122
+ it('should block MERGE statement', () => {
123
+ const r = validator.validateFullQuery("MERGE INTO Users AS t USING (SELECT 1 AS ID) AS s ON t.ID = s.ID WHEN MATCHED THEN DELETE");
124
+ expect(r.valid).toBe(false);
125
+ // DELETE comes before MERGE in the keyword scan order
126
+ expect(r.trigger).toBe('DELETE');
127
+ });
128
+ it('should block TRUNCATE TABLE', () => {
129
+ const r = validator.validateFullQuery("TRUNCATE TABLE Users");
130
+ expect(r.valid).toBe(false);
131
+ expect(r.trigger).toBe('TRUNCATE');
132
+ });
133
+ });
134
+ // ---------------------------------------------------------------
135
+ // Obfuscation and bypass attempts
136
+ // ---------------------------------------------------------------
137
+ describe('obfuscation and bypass attempts', () => {
138
+ it('should block keyword in mixed case (DrOp)', () => {
139
+ const r = validator.validateFullQuery("DrOp TaBlE Users");
140
+ expect(r.valid).toBe(false);
141
+ });
142
+ it('should block with extra whitespace around dangerous keyword', () => {
143
+ const r = validator.validateFullQuery(" DELETE FROM Users ");
144
+ expect(r.valid).toBe(false);
145
+ expect(r.trigger).toBe('DELETE');
146
+ });
147
+ it('should block multi-statement via semicolon with whitespace', () => {
148
+ const r = validator.validateFullQuery("SELECT 1 ; DROP TABLE Users");
149
+ expect(r.valid).toBe(false);
150
+ // DROP is detected before semicolon in the keyword scan
151
+ expect(r.trigger).toBe('DROP');
152
+ });
153
+ it('should block newline-separated stacked statements', () => {
154
+ const r = validator.validateFullQuery("SELECT 1;\nDROP TABLE Users");
155
+ expect(r.valid).toBe(false);
156
+ // DROP is detected before semicolon in the keyword scan
157
+ expect(r.trigger).toBe('DROP');
158
+ });
159
+ it('should not be fooled by tab characters in keywords', () => {
160
+ const r = validator.validateFullQuery("SELECT 1;\tDELETE FROM Users");
161
+ expect(r.valid).toBe(false);
162
+ // DELETE is detected before semicolon in the keyword scan
163
+ expect(r.trigger).toBe('DELETE');
164
+ });
165
+ });
166
+ // ---------------------------------------------------------------
167
+ // String literal false-positive prevention
168
+ // ---------------------------------------------------------------
169
+ describe('string literal false-positive prevention', () => {
170
+ it('should allow DROP inside a string literal', () => {
171
+ const r = validator.validateFullQuery("SELECT * FROM __mj.vwLogs WHERE Message = 'We need to DROP the old approach'");
172
+ expect(r.valid).toBe(true);
173
+ });
174
+ it('should allow INSERT inside a string literal', () => {
175
+ const r = validator.validateFullQuery("SELECT * FROM __mj.vwAuditLog WHERE Action = 'INSERT completed'");
176
+ expect(r.valid).toBe(true);
177
+ });
178
+ it('should allow DELETE inside a string literal', () => {
179
+ const r = validator.validateFullQuery("SELECT * FROM __mj.vwUsers WHERE Bio LIKE '%DELETE old records%'");
180
+ expect(r.valid).toBe(true);
181
+ });
182
+ it('should allow EXEC inside a string literal', () => {
183
+ const r = validator.validateFullQuery("SELECT * FROM __mj.vwJobs WHERE Description = 'EXEC the plan'");
184
+ expect(r.valid).toBe(true);
185
+ });
186
+ it('should still block REAL DROP outside string context', () => {
187
+ const r = validator.validateFullQuery("SELECT 'safe text' FROM Users; DROP TABLE Users");
188
+ expect(r.valid).toBe(false);
189
+ // DROP is detected before semicolon in the keyword scan
190
+ expect(r.trigger).toBe('DROP');
191
+ });
192
+ });
193
+ // ---------------------------------------------------------------
194
+ // Expression-level injection (where_clause context)
195
+ // ---------------------------------------------------------------
196
+ describe('expression-level injection (where_clause)', () => {
197
+ const ctx = { context: 'where_clause' };
198
+ it('should block subquery without allowSubqueries', () => {
199
+ const r = validator.validate("ID IN (SELECT ID FROM Users WHERE IsAdmin = 1)", ctx);
200
+ expect(r.valid).toBe(false);
201
+ expect(r.trigger).toBe('SELECT');
202
+ });
203
+ it('should block UNION injection in WHERE clause', () => {
204
+ const r = validator.validate("1=1 UNION SELECT password FROM sys.sql_logins", ctx);
205
+ expect(r.valid).toBe(false);
206
+ expect(r.trigger).toBe('UNION');
207
+ });
208
+ it('should block comment injection in WHERE clause', () => {
209
+ const r = validator.validate("Status = 'Active' -- OR 1=1", ctx);
210
+ expect(r.valid).toBe(false);
211
+ expect(r.trigger).toBe('comment');
212
+ });
213
+ it('should block block comment injection in WHERE clause', () => {
214
+ const r = validator.validate("Status = 'Active' /* OR 1=1 */", ctx);
215
+ expect(r.valid).toBe(false);
216
+ expect(r.trigger).toBe('comment');
217
+ });
218
+ it('should block semicolon injection in WHERE clause', () => {
219
+ const r = validator.validate("1=1; DROP TABLE Users --", ctx);
220
+ expect(r.valid).toBe(false);
221
+ // Either semicolon or comment should trigger
222
+ });
223
+ it('should block EXEC in WHERE clause', () => {
224
+ const r = validator.validate("1=1 AND EXEC sp_help", ctx);
225
+ expect(r.valid).toBe(false);
226
+ expect(r.trigger).toBe('EXEC');
227
+ });
228
+ it('should block WAITFOR in WHERE clause', () => {
229
+ const r = validator.validate("1=1 WAITFOR DELAY '00:00:05'", ctx);
230
+ expect(r.valid).toBe(false);
231
+ expect(r.trigger).toBe('WAITFOR');
232
+ });
233
+ it('should block CREATE in WHERE clause', () => {
234
+ const r = validator.validate("1=1 CREATE TABLE Evil (ID INT)", ctx);
235
+ expect(r.valid).toBe(false);
236
+ expect(r.trigger).toBe('CREATE');
237
+ });
238
+ });
239
+ // ---------------------------------------------------------------
240
+ // Edge cases
241
+ // ---------------------------------------------------------------
242
+ describe('edge cases', () => {
243
+ it('should reject empty string', () => {
244
+ const r = validator.validateFullQuery('');
245
+ expect(r.valid).toBe(false);
246
+ });
247
+ it('should reject whitespace-only string', () => {
248
+ const r = validator.validateFullQuery(' \n\t ');
249
+ expect(r.valid).toBe(false);
250
+ });
251
+ it('should handle very long SELECT query', () => {
252
+ // Build a long but valid query
253
+ const conditions = Array.from({ length: 100 }, (_, i) => `Field${i} = ${i}`).join(' AND ');
254
+ const sql = `SELECT * FROM __mj.vwUsers WHERE ${conditions}`;
255
+ const r = validator.validateFullQuery(sql);
256
+ expect(r.valid).toBe(true);
257
+ });
258
+ it('should handle deeply nested subqueries', () => {
259
+ const sql = `
260
+ SELECT * FROM __mj.vwUsers
261
+ WHERE ID IN (
262
+ SELECT UserID FROM __mj.vwUserRoles
263
+ WHERE RoleID IN (
264
+ SELECT RoleID FROM __mj.vwRoles
265
+ WHERE Name IN (
266
+ SELECT RoleName FROM __mj.vwDefaultRoles
267
+ )
268
+ )
269
+ )
270
+ `;
271
+ const r = validator.validateFullQuery(sql);
272
+ expect(r.valid).toBe(true);
273
+ });
274
+ it('should handle query with only comments (no actual SQL)', () => {
275
+ const sql = `
276
+ -- This is just a comment
277
+ /* Another comment */
278
+ `;
279
+ const r = validator.validateFullQuery(sql);
280
+ // After stripping comments, there's no SELECT/WITH
281
+ expect(r.valid).toBe(false);
282
+ });
283
+ it('should handle query with unicode characters in string literals', () => {
284
+ const sql = "SELECT * FROM __mj.vwUsers WHERE Name = N'Ünïcödé Tëst'";
285
+ const r = validator.validateFullQuery(sql);
286
+ expect(r.valid).toBe(true);
287
+ });
288
+ it('should handle query with escaped single quotes', () => {
289
+ const sql = "SELECT * FROM __mj.vwUsers WHERE Name = 'O''Brien'";
290
+ const r = validator.validateFullQuery(sql);
291
+ expect(r.valid).toBe(true);
292
+ });
293
+ it('should handle query with numeric literals', () => {
294
+ const sql = "SELECT * FROM __mj.vwOrders WHERE Total > 1000.50 AND Quantity < 100";
295
+ const r = validator.validateFullQuery(sql);
296
+ expect(r.valid).toBe(true);
297
+ });
298
+ it('should handle query with multiple CTEs', () => {
299
+ const sql = `
300
+ WITH CTE1 AS (SELECT ID FROM __mj.vwUsers),
301
+ CTE2 AS (SELECT UserID FROM __mj.vwUserRoles)
302
+ SELECT * FROM CTE1 INNER JOIN CTE2 ON CTE1.ID = CTE2.UserID
303
+ `;
304
+ const r = validator.validateFullQuery(sql);
305
+ expect(r.valid).toBe(true);
306
+ });
307
+ it('should handle CROSS APPLY and OUTER APPLY', () => {
308
+ const sql = `
309
+ SELECT u.Name, r.RoleName
310
+ FROM __mj.vwUsers u
311
+ CROSS APPLY (SELECT TOP 1 RoleName FROM __mj.vwUserRoles WHERE UserID = u.ID) r
312
+ `;
313
+ const r = validator.validateFullQuery(sql);
314
+ expect(r.valid).toBe(true);
315
+ });
316
+ it('should handle window functions', () => {
317
+ const sql = `
318
+ SELECT Name,
319
+ ROW_NUMBER() OVER (PARTITION BY Department ORDER BY HireDate) AS RowNum,
320
+ RANK() OVER (ORDER BY Salary DESC) AS SalaryRank
321
+ FROM __mj.vwEmployees
322
+ `;
323
+ const r = validator.validateFullQuery(sql);
324
+ expect(r.valid).toBe(true);
325
+ });
326
+ });
327
+ });
328
+ //# sourceMappingURL=SQLExpressionValidator.security.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLExpressionValidator.security.test.js","sourceRoot":"","sources":["../../src/__tests__/SQLExpressionValidator.security.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=SQLExpressionValidator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLExpressionValidator.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/SQLExpressionValidator.test.ts"],"names":[],"mappings":""}