@memberjunction/global 2.63.1 → 2.65.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.
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './ObjectCache';
5
5
  export * from './BaseSingleton';
6
6
  export * from './DeepDiff';
7
7
  export * from './ClassUtils';
8
+ export * from './util/PatternUtils';
8
9
  export * from './Global';
9
10
  export * from './RegisterClass';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAG5B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,eAAe,CAAA;AAC7B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AAGpC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA"}
package/dist/index.js CHANGED
@@ -25,6 +25,7 @@ __exportStar(require("./ObjectCache"), exports);
25
25
  __exportStar(require("./BaseSingleton"), exports);
26
26
  __exportStar(require("./DeepDiff"), exports);
27
27
  __exportStar(require("./ClassUtils"), exports);
28
+ __exportStar(require("./util/PatternUtils"), exports);
28
29
  // Export the main classes
29
30
  __exportStar(require("./Global"), exports);
30
31
  __exportStar(require("./RegisterClass"), exports);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iCAAiC;AACjC,+CAAgE;AAAvD,4GAAA,YAAY,OAAA;AAAE,iHAAA,iBAAiB,OAAA;AACxC,8CAA2B;AAC3B,yCAAsB;AACtB,gDAA6B;AAC7B,kDAA+B;AAC/B,6CAA0B;AAC1B,+CAA4B;AAE5B,0BAA0B;AAC1B,2CAAwB;AACxB,kDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,iCAAiC;AACjC,+CAAgE;AAAvD,4GAAA,YAAY,OAAA;AAAE,iHAAA,iBAAiB,OAAA;AACxC,8CAA2B;AAC3B,yCAAsB;AACtB,gDAA6B;AAC7B,kDAA+B;AAC/B,6CAA0B;AAC1B,+CAA4B;AAC5B,sDAAoC;AAEpC,0BAA0B;AAC1B,2CAAwB;AACxB,kDAA+B"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @fileoverview Pattern matching utility functions for MemberJunction
3
+ *
4
+ * This module provides functions for converting string patterns to RegExp objects,
5
+ * supporting both simple wildcard patterns and full regex syntax.
6
+ * Works in both Node.js and browser environments.
7
+ *
8
+ * @module @memberjunction/global/PatternUtils
9
+ */
10
+ /**
11
+ * Converts a string pattern to a RegExp object.
12
+ * Supports both regex strings and simple wildcard patterns.
13
+ *
14
+ * @param pattern - The pattern string to convert
15
+ * @returns A RegExp object
16
+ *
17
+ * @example
18
+ * // Regex pattern (starts with /)
19
+ * parsePattern("/spCreate.*Run/i") // Returns: /spCreate.*Run/i
20
+ *
21
+ * // Simple wildcard patterns
22
+ * parsePattern("*AIPrompt*") // Returns: /AIPrompt/i
23
+ * parsePattern("spCreate*") // Returns: /^spCreate/i
24
+ * parsePattern("*Run") // Returns: /Run$/i
25
+ * parsePattern("exact") // Returns: /^exact$/i
26
+ */
27
+ export declare function parsePattern(pattern: string): RegExp;
28
+ /**
29
+ * Converts an array of string patterns to RegExp objects
30
+ *
31
+ * @param patterns - Array of pattern strings
32
+ * @returns Array of RegExp objects
33
+ */
34
+ export declare function parsePatterns(patterns: string[]): RegExp[];
35
+ /**
36
+ * Converts a pattern (string or RegExp) to a RegExp object
37
+ *
38
+ * @param pattern - String pattern or RegExp object
39
+ * @returns RegExp object
40
+ */
41
+ export declare function ensureRegExp(pattern: string | RegExp): RegExp;
42
+ /**
43
+ * Converts an array of patterns (strings or RegExps) to RegExp objects
44
+ *
45
+ * @param patterns - Array of string patterns or RegExp objects
46
+ * @returns Array of RegExp objects
47
+ */
48
+ export declare function ensureRegExps(patterns: (string | RegExp)[]): RegExp[];
49
+ /**
50
+ * Tests if a string matches any of the provided patterns
51
+ *
52
+ * @param text - The text to test
53
+ * @param patterns - Array of patterns (strings or RegExps)
54
+ * @returns true if any pattern matches
55
+ */
56
+ export declare function matchesAnyPattern(text: string, patterns: (string | RegExp)[]): boolean;
57
+ /**
58
+ * Tests if a string matches all of the provided patterns
59
+ *
60
+ * @param text - The text to test
61
+ * @param patterns - Array of patterns (strings or RegExps)
62
+ * @returns true if all patterns match
63
+ */
64
+ export declare function matchesAllPatterns(text: string, patterns: (string | RegExp)[]): boolean;
65
+ //# sourceMappingURL=PatternUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternUtils.d.ts","sourceRoot":"","sources":["../../src/util/PatternUtils.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAsCpD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE1D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE7D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAErE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAGtF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAGvF"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ /**
3
+ * @fileoverview Pattern matching utility functions for MemberJunction
4
+ *
5
+ * This module provides functions for converting string patterns to RegExp objects,
6
+ * supporting both simple wildcard patterns and full regex syntax.
7
+ * Works in both Node.js and browser environments.
8
+ *
9
+ * @module @memberjunction/global/PatternUtils
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.matchesAllPatterns = exports.matchesAnyPattern = exports.ensureRegExps = exports.ensureRegExp = exports.parsePatterns = exports.parsePattern = void 0;
13
+ /**
14
+ * Converts a string pattern to a RegExp object.
15
+ * Supports both regex strings and simple wildcard patterns.
16
+ *
17
+ * @param pattern - The pattern string to convert
18
+ * @returns A RegExp object
19
+ *
20
+ * @example
21
+ * // Regex pattern (starts with /)
22
+ * parsePattern("/spCreate.*Run/i") // Returns: /spCreate.*Run/i
23
+ *
24
+ * // Simple wildcard patterns
25
+ * parsePattern("*AIPrompt*") // Returns: /AIPrompt/i
26
+ * parsePattern("spCreate*") // Returns: /^spCreate/i
27
+ * parsePattern("*Run") // Returns: /Run$/i
28
+ * parsePattern("exact") // Returns: /^exact$/i
29
+ */
30
+ function parsePattern(pattern) {
31
+ // Check if it's already a regex pattern (starts with /)
32
+ if (pattern.startsWith('/')) {
33
+ // Extract pattern and flags from regex string like "/pattern/flags"
34
+ const lastSlash = pattern.lastIndexOf('/');
35
+ if (lastSlash > 0) {
36
+ const regexPattern = pattern.slice(1, lastSlash);
37
+ const flags = pattern.slice(lastSlash + 1);
38
+ return new RegExp(regexPattern, flags);
39
+ }
40
+ // If no closing slash, treat as literal pattern
41
+ return new RegExp(pattern.slice(1), 'i');
42
+ }
43
+ // Convert simple wildcard pattern to regex
44
+ // Escape special regex characters except for *
45
+ let regexPattern = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
46
+ // Handle wildcards
47
+ const hasLeadingWildcard = pattern.startsWith('*');
48
+ const hasTrailingWildcard = pattern.endsWith('*');
49
+ // Remove wildcards for processing
50
+ regexPattern = regexPattern.replace(/^\*/, '').replace(/\*$/, '');
51
+ // Replace internal wildcards with .*
52
+ regexPattern = regexPattern.replace(/\*/g, '.*');
53
+ // Add anchors based on wildcards
54
+ if (!hasLeadingWildcard) {
55
+ regexPattern = '^' + regexPattern;
56
+ }
57
+ if (!hasTrailingWildcard) {
58
+ regexPattern = regexPattern + '$';
59
+ }
60
+ // Simple patterns are case-insensitive by default
61
+ return new RegExp(regexPattern, 'i');
62
+ }
63
+ exports.parsePattern = parsePattern;
64
+ /**
65
+ * Converts an array of string patterns to RegExp objects
66
+ *
67
+ * @param patterns - Array of pattern strings
68
+ * @returns Array of RegExp objects
69
+ */
70
+ function parsePatterns(patterns) {
71
+ return patterns.map(parsePattern);
72
+ }
73
+ exports.parsePatterns = parsePatterns;
74
+ /**
75
+ * Converts a pattern (string or RegExp) to a RegExp object
76
+ *
77
+ * @param pattern - String pattern or RegExp object
78
+ * @returns RegExp object
79
+ */
80
+ function ensureRegExp(pattern) {
81
+ return pattern instanceof RegExp ? pattern : parsePattern(pattern);
82
+ }
83
+ exports.ensureRegExp = ensureRegExp;
84
+ /**
85
+ * Converts an array of patterns (strings or RegExps) to RegExp objects
86
+ *
87
+ * @param patterns - Array of string patterns or RegExp objects
88
+ * @returns Array of RegExp objects
89
+ */
90
+ function ensureRegExps(patterns) {
91
+ return patterns.map(ensureRegExp);
92
+ }
93
+ exports.ensureRegExps = ensureRegExps;
94
+ /**
95
+ * Tests if a string matches any of the provided patterns
96
+ *
97
+ * @param text - The text to test
98
+ * @param patterns - Array of patterns (strings or RegExps)
99
+ * @returns true if any pattern matches
100
+ */
101
+ function matchesAnyPattern(text, patterns) {
102
+ const regexps = ensureRegExps(patterns);
103
+ return regexps.some(pattern => pattern.test(text));
104
+ }
105
+ exports.matchesAnyPattern = matchesAnyPattern;
106
+ /**
107
+ * Tests if a string matches all of the provided patterns
108
+ *
109
+ * @param text - The text to test
110
+ * @param patterns - Array of patterns (strings or RegExps)
111
+ * @returns true if all patterns match
112
+ */
113
+ function matchesAllPatterns(text, patterns) {
114
+ const regexps = ensureRegExps(patterns);
115
+ return regexps.every(pattern => pattern.test(text));
116
+ }
117
+ exports.matchesAllPatterns = matchesAllPatterns;
118
+ //# sourceMappingURL=PatternUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PatternUtils.js","sourceRoot":"","sources":["../../src/util/PatternUtils.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,YAAY,CAAC,OAAe;IAC1C,wDAAwD;IACxD,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,oEAAoE;QACpE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;YACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;YAC3C,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;QACzC,CAAC;QACD,gDAAgD;QAChD,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,2CAA2C;IAC3C,+CAA+C;IAC/C,IAAI,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,CAAC;IAEjE,mBAAmB;IACnB,MAAM,kBAAkB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACnD,MAAM,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAElD,kCAAkC;IAClC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAElE,qCAAqC;IACrC,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAEjD,iCAAiC;IACjC,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxB,YAAY,GAAG,GAAG,GAAG,YAAY,CAAC;IACpC,CAAC;IACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,YAAY,GAAG,YAAY,GAAG,GAAG,CAAC;IACpC,CAAC;IAED,kDAAkD;IAClD,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,GAAG,CAAC,CAAC;AACvC,CAAC;AAtCD,oCAsCC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,QAAkB;IAC9C,OAAO,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC;AAFD,sCAEC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,OAAwB;IACnD,OAAO,OAAO,YAAY,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;AACrE,CAAC;AAFD,oCAEC;AAED;;;;;GAKG;AACH,SAAgB,aAAa,CAAC,QAA6B;IACzD,OAAO,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AACpC,CAAC;AAFD,sCAEC;AAED;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,IAAY,EAAE,QAA6B;IAC3E,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAHD,8CAGC;AAED;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,IAAY,EAAE,QAA6B;IAC5E,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACxC,OAAO,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACtD,CAAC;AAHD,gDAGC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/global",
3
- "version": "2.63.1",
3
+ "version": "2.65.0",
4
4
  "description": "MemberJunction: Global Object - Needed for ALL other MJ components",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/readme.md CHANGED
@@ -18,7 +18,7 @@ The `@memberjunction/global` library serves as the foundation for cross-componen
18
18
  - **Object Caching** - In-memory object cache for application lifetime
19
19
  - **Class Reflection Utilities** - Runtime class hierarchy inspection and analysis
20
20
  - **Deep Diff Engine** - Comprehensive object comparison and change tracking
21
- - **Utility Functions** - Common string manipulation, JSON parsing (including recursive nested JSON parsing), and formatting utilities
21
+ - **Utility Functions** - Common string manipulation, JSON parsing (including recursive nested JSON parsing), pattern matching, and formatting utilities
22
22
 
23
23
  ## Core Components
24
24
 
@@ -359,6 +359,92 @@ const html = ConvertMarkdownStringToHtmlList('Unordered', '- Item 1\n- Item 2\n-
359
359
  // Returns: <ul><li>Item 1</li><li>Item 2</li><li>Item 3</li></ul>
360
360
  ```
361
361
 
362
+ ### Pattern Matching Utilities
363
+
364
+ Convert string patterns to RegExp objects with support for simple wildcards and full regex syntax:
365
+
366
+ ```typescript
367
+ import {
368
+ parsePattern,
369
+ parsePatterns,
370
+ ensureRegExp,
371
+ ensureRegExps,
372
+ matchesAnyPattern,
373
+ matchesAllPatterns
374
+ } from '@memberjunction/global';
375
+
376
+ // Parse simple wildcard patterns
377
+ parsePattern('*AIPrompt*'); // Returns: /AIPrompt/i (case-insensitive)
378
+ parsePattern('spCreate*'); // Returns: /^spCreate/i
379
+ parsePattern('*Run'); // Returns: /Run$/i
380
+ parsePattern('exact'); // Returns: /^exact$/i
381
+
382
+ // Parse regex string patterns
383
+ parsePattern('/spCreate.*Run/i'); // Returns: /spCreate.*Run/i
384
+ parsePattern('/^SELECT.*FROM.*vw/'); // Returns: /^SELECT.*FROM.*vw/
385
+ parsePattern('/INSERT INTO (Users|Roles)/i'); // Returns: /INSERT INTO (Users|Roles)/i
386
+
387
+ // Parse multiple patterns at once
388
+ const patterns = parsePatterns([
389
+ '*User*', // Simple wildcard
390
+ '/^EXEC sp_/i', // Regex string
391
+ '*EntityFieldValue*' // Simple wildcard
392
+ ]);
393
+
394
+ // Convert mixed string/RegExp arrays
395
+ const mixed = ['*User*', /^Admin/i, '/DELETE.*WHERE/i'];
396
+ const regexps = ensureRegExps(mixed); // All converted to RegExp objects
397
+
398
+ // Test if text matches any pattern
399
+ const sql = 'SELECT * FROM Users WHERE Active = 1';
400
+ matchesAnyPattern(sql, ['*User*', '*Role*', '/^UPDATE/i']); // true
401
+
402
+ // Test if text matches all patterns
403
+ const filename = 'UserRoleManager.ts';
404
+ matchesAllPatterns(filename, ['*User*', '*Role*', '*.ts']); // true
405
+ ```
406
+
407
+ #### Pattern Syntax
408
+
409
+ **Simple Wildcard Patterns** (Recommended for most users):
410
+ - `*` acts as a wildcard matching any characters
411
+ - Case-insensitive by default
412
+ - Examples:
413
+ - `*pattern*` - Contains "pattern" anywhere
414
+ - `pattern*` - Starts with "pattern"
415
+ - `*pattern` - Ends with "pattern"
416
+ - `pattern` - Exact match only
417
+
418
+ **Regex String Patterns** (For advanced users):
419
+ - Must start with `/` to be recognized as regex
420
+ - Optionally end with flags like `/pattern/i`
421
+ - Full JavaScript regex syntax supported
422
+ - Examples:
423
+ - `/^start/i` - Case-insensitive start match
424
+ - `/end$/` - Case-sensitive end match
425
+ - `/(option1|option2)/` - Match alternatives
426
+
427
+ #### Common Use Cases
428
+
429
+ ```typescript
430
+ // SQL statement filtering
431
+ const sqlFilters = [
432
+ '*AIPrompt*', // Exclude AI prompt operations
433
+ '/^EXEC sp_/i', // Exclude system stored procedures
434
+ '*EntityFieldValue*' // Exclude field value operations
435
+ ];
436
+
437
+ const shouldLog = !matchesAnyPattern(sqlStatement, sqlFilters);
438
+
439
+ // File pattern matching
440
+ const includePatterns = ['*.ts', '*.js', '/^(?!test)/']; // TS/JS files not starting with "test"
441
+ const shouldProcess = matchesAnyPattern(filename, includePatterns);
442
+
443
+ // User input validation
444
+ const allowedFormats = ['*@*.com', '*@*.org', '*@company.net'];
445
+ const isValidEmail = matchesAnyPattern(email, allowedFormats);
446
+ ```
447
+
362
448
  ### Global Object Store
363
449
 
364
450
  Access the global object store for cross-module state sharing: