@memberjunction/ng-shared-generic 5.43.0 → 5.44.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-shared-generic",
3
- "version": "5.43.0",
3
+ "version": "5.44.0",
4
4
  "description": "MemberJunction: Generic Angular Shared Package - utility services and reusable elements used in any Angular application.",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -23,6 +23,7 @@
23
23
  "devDependencies": {
24
24
  "@angular/compiler": "21.1.3",
25
25
  "@angular/compiler-cli": "21.1.3",
26
+ "@memberjunction/ng-test-utils": "5.44.0",
26
27
  "vitest": "^4.0.18"
27
28
  },
28
29
  "peerDependencies": {
@@ -32,10 +33,10 @@
32
33
  "rxjs": "^7.8.2"
33
34
  },
34
35
  "dependencies": {
35
- "@memberjunction/core": "5.43.0",
36
- "@memberjunction/ng-base-types": "5.43.0",
37
- "@memberjunction/core-entities": "5.43.0",
38
- "@memberjunction/global": "5.43.0",
36
+ "@memberjunction/core": "5.44.0",
37
+ "@memberjunction/ng-base-types": "5.44.0",
38
+ "@memberjunction/core-entities": "5.44.0",
39
+ "@memberjunction/global": "5.44.0",
39
40
  "dompurify": "^3.3.0",
40
41
  "tslib": "^2.8.1"
41
42
  },
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=exports.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":""}
@@ -1,17 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { existsSync } from 'fs';
3
- import { resolve } from 'path';
4
- describe('@memberjunction/ng-shared-generic', () => {
5
- it('should have a public API entry point', () => {
6
- const pkgRoot = resolve(__dirname, '../..');
7
- const hasPublicApi = existsSync(resolve(pkgRoot, 'src/public-api.ts'));
8
- const hasIndex = existsSync(resolve(pkgRoot, 'src/index.ts'));
9
- expect(hasPublicApi || hasIndex).toBe(true);
10
- });
11
- it('should have a package.json with correct name', () => {
12
- const pkgRoot = resolve(__dirname, '../..');
13
- const pkg = require(resolve(pkgRoot, 'package.json'));
14
- expect(pkg.name).toBe('@memberjunction/ng-shared-generic');
15
- });
16
- });
17
- //# sourceMappingURL=exports.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC9D,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect } from 'vitest';\nimport { existsSync } from 'fs';\nimport { resolve } from 'path';\n\ndescribe('@memberjunction/ng-shared-generic', () => {\n it('should have a public API entry point', () => {\n const pkgRoot = resolve(__dirname, '../..');\n const hasPublicApi = existsSync(resolve(pkgRoot, 'src/public-api.ts'));\n const hasIndex = existsSync(resolve(pkgRoot, 'src/index.ts'));\n expect(hasPublicApi || hasIndex).toBe(true);\n });\n\n it('should have a package.json with correct name', () => {\n const pkgRoot = resolve(__dirname, '../..');\n const pkg = require(resolve(pkgRoot, 'package.json'));\n expect(pkg.name).toBe('@memberjunction/ng-shared-generic');\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -1,7 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- describe('@memberjunction/ng-shared-generic', () => {
3
- it('should have a passing test', () => {
4
- expect(true).toBe(true);
5
- });
6
- });
7
- //# sourceMappingURL=index.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { describe, it, expect } from 'vitest';\n\ndescribe('@memberjunction/ng-shared-generic', () => {\n it('should have a passing test', () => {\n expect(true).toBe(true);\n });\n});\n"]}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=rich-text-sanitize.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rich-text-sanitize.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rich-text-sanitize.test.ts"],"names":[],"mappings":""}
@@ -1,54 +0,0 @@
1
- // @vitest-environment jsdom
2
- import { describe, it, expect } from 'vitest';
3
- import { PurifyRichTextHtml } from '../lib/rich-text/rich-text-sanitize';
4
- describe('PurifyRichTextHtml', () => {
5
- describe('strips dangerous vectors', () => {
6
- it('removes <script> tags', () => {
7
- const out = PurifyRichTextHtml('<p>ok</p><script>alert(1)</script>');
8
- expect(out).toContain('<p>ok</p>');
9
- expect(out.toLowerCase()).not.toContain('<script');
10
- expect(out).not.toContain('alert(1)');
11
- });
12
- it('strips on* event handler attributes', () => {
13
- const out = PurifyRichTextHtml('<img src="x" onerror="alert(1)">');
14
- expect(out.toLowerCase()).not.toContain('onerror');
15
- });
16
- it('strips javascript: URLs', () => {
17
- const out = PurifyRichTextHtml('<a href="javascript:alert(1)">x</a>');
18
- expect(out.toLowerCase()).not.toContain('javascript:');
19
- });
20
- it('removes <script> embedded inside SVG', () => {
21
- const out = PurifyRichTextHtml('<svg><script>alert(1)</script><rect/></svg>');
22
- expect(out.toLowerCase()).not.toContain('<script');
23
- expect(out).not.toContain('alert(1)');
24
- });
25
- });
26
- describe('keeps safe rich content', () => {
27
- it('preserves structural HTML', () => {
28
- const out = PurifyRichTextHtml('<h2>Title</h2><ul><li>a</li></ul><table><tr><td>c</td></tr></table>');
29
- expect(out).toContain('<h2>Title</h2>');
30
- expect(out).toContain('<li>a</li>');
31
- expect(out).toContain('<td>c</td>');
32
- });
33
- it('preserves inline SVG shapes (the whole point of swapping the sanitizer)', () => {
34
- const svg = '<svg viewBox="0 0 10 10"><defs><linearGradient id="g"><stop offset="0%"/></linearGradient></defs><rect fill="url(#g)"/><path d="M0 0 L10 10"/><circle cx="5" cy="5" r="3"/></svg>';
35
- const out = PurifyRichTextHtml(svg);
36
- expect(out.toLowerCase()).toContain('<svg');
37
- expect(out.toLowerCase()).toContain('<rect');
38
- expect(out.toLowerCase()).toContain('<path');
39
- expect(out.toLowerCase()).toContain('<circle');
40
- expect(out.toLowerCase()).toContain('lineargradient');
41
- });
42
- });
43
- describe('edge cases', () => {
44
- it('returns empty string for null/undefined/empty', () => {
45
- expect(PurifyRichTextHtml(null)).toBe('');
46
- expect(PurifyRichTextHtml(undefined)).toBe('');
47
- expect(PurifyRichTextHtml('')).toBe('');
48
- });
49
- it('passes plain text through unchanged', () => {
50
- expect(PurifyRichTextHtml('just text')).toBe('just text');
51
- });
52
- });
53
- });
54
- //# sourceMappingURL=rich-text-sanitize.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rich-text-sanitize.test.js","sourceRoot":"","sources":["../../src/__tests__/rich-text-sanitize.test.ts"],"names":[],"mappings":"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","sourcesContent":["// @vitest-environment jsdom\nimport { describe, it, expect } from 'vitest';\nimport { PurifyRichTextHtml } from '../lib/rich-text/rich-text-sanitize';\n\ndescribe('PurifyRichTextHtml', () => {\n describe('strips dangerous vectors', () => {\n it('removes <script> tags', () => {\n const out = PurifyRichTextHtml('<p>ok</p><script>alert(1)</script>');\n expect(out).toContain('<p>ok</p>');\n expect(out.toLowerCase()).not.toContain('<script');\n expect(out).not.toContain('alert(1)');\n });\n\n it('strips on* event handler attributes', () => {\n const out = PurifyRichTextHtml('<img src=\"x\" onerror=\"alert(1)\">');\n expect(out.toLowerCase()).not.toContain('onerror');\n });\n\n it('strips javascript: URLs', () => {\n const out = PurifyRichTextHtml('<a href=\"javascript:alert(1)\">x</a>');\n expect(out.toLowerCase()).not.toContain('javascript:');\n });\n\n it('removes <script> embedded inside SVG', () => {\n const out = PurifyRichTextHtml('<svg><script>alert(1)</script><rect/></svg>');\n expect(out.toLowerCase()).not.toContain('<script');\n expect(out).not.toContain('alert(1)');\n });\n });\n\n describe('keeps safe rich content', () => {\n it('preserves structural HTML', () => {\n const out = PurifyRichTextHtml('<h2>Title</h2><ul><li>a</li></ul><table><tr><td>c</td></tr></table>');\n expect(out).toContain('<h2>Title</h2>');\n expect(out).toContain('<li>a</li>');\n expect(out).toContain('<td>c</td>');\n });\n\n it('preserves inline SVG shapes (the whole point of swapping the sanitizer)', () => {\n const svg = '<svg viewBox=\"0 0 10 10\"><defs><linearGradient id=\"g\"><stop offset=\"0%\"/></linearGradient></defs><rect fill=\"url(#g)\"/><path d=\"M0 0 L10 10\"/><circle cx=\"5\" cy=\"5\" r=\"3\"/></svg>';\n const out = PurifyRichTextHtml(svg);\n expect(out.toLowerCase()).toContain('<svg');\n expect(out.toLowerCase()).toContain('<rect');\n expect(out.toLowerCase()).toContain('<path');\n expect(out.toLowerCase()).toContain('<circle');\n expect(out.toLowerCase()).toContain('lineargradient');\n });\n });\n\n describe('edge cases', () => {\n it('returns empty string for null/undefined/empty', () => {\n expect(PurifyRichTextHtml(null)).toBe('');\n expect(PurifyRichTextHtml(undefined)).toBe('');\n expect(PurifyRichTextHtml('')).toBe('');\n });\n\n it('passes plain text through unchanged', () => {\n expect(PurifyRichTextHtml('just text')).toBe('just text');\n });\n });\n});\n"]}