@memberjunction/global 6.2.0-edge.2 → 6.2.0-edge.4

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 (47) hide show
  1. package/README.md +26 -0
  2. package/dist/__tests__/BinaryEncoding.test.d.ts +2 -0
  3. package/dist/__tests__/BinaryEncoding.test.d.ts.map +1 -0
  4. package/dist/__tests__/BinaryEncoding.test.js +244 -0
  5. package/dist/__tests__/BinaryEncoding.test.js.map +1 -0
  6. package/dist/__tests__/BinaryEncodingRows.test.d.ts +2 -0
  7. package/dist/__tests__/BinaryEncodingRows.test.d.ts.map +1 -0
  8. package/dist/__tests__/BinaryEncodingRows.test.js +146 -0
  9. package/dist/__tests__/BinaryEncodingRows.test.js.map +1 -0
  10. package/dist/__tests__/BinaryEncodingValidation.test.d.ts +2 -0
  11. package/dist/__tests__/BinaryEncodingValidation.test.d.ts.map +1 -0
  12. package/dist/__tests__/BinaryEncodingValidation.test.js +98 -0
  13. package/dist/__tests__/BinaryEncodingValidation.test.js.map +1 -0
  14. package/dist/__tests__/UUIDCollections.test.d.ts +2 -0
  15. package/dist/__tests__/UUIDCollections.test.d.ts.map +1 -0
  16. package/dist/__tests__/UUIDCollections.test.js +173 -0
  17. package/dist/__tests__/UUIDCollections.test.js.map +1 -0
  18. package/dist/__tests__/UUIDCompliance.test.d.ts +2 -1
  19. package/dist/__tests__/UUIDCompliance.test.d.ts.map +1 -1
  20. package/dist/__tests__/UUIDCompliance.test.js +290 -8
  21. package/dist/__tests__/UUIDCompliance.test.js.map +1 -1
  22. package/dist/__tests__/UUIDUtils.test.js +55 -0
  23. package/dist/__tests__/UUIDUtils.test.js.map +1 -1
  24. package/dist/__tests__/util.trimTrailingSlashes.test.d.ts +2 -0
  25. package/dist/__tests__/util.trimTrailingSlashes.test.d.ts.map +1 -0
  26. package/dist/__tests__/util.trimTrailingSlashes.test.js +23 -0
  27. package/dist/__tests__/util.trimTrailingSlashes.test.js.map +1 -0
  28. package/dist/index.d.ts +2 -0
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +2 -0
  31. package/dist/index.js.map +1 -1
  32. package/dist/util/BinaryEncoding.d.ts +197 -0
  33. package/dist/util/BinaryEncoding.d.ts.map +1 -0
  34. package/dist/util/BinaryEncoding.js +388 -0
  35. package/dist/util/BinaryEncoding.js.map +1 -0
  36. package/dist/util/UUIDCollections.d.ts +111 -0
  37. package/dist/util/UUIDCollections.d.ts.map +1 -0
  38. package/dist/util/UUIDCollections.js +163 -0
  39. package/dist/util/UUIDCollections.js.map +1 -0
  40. package/dist/util/UUIDUtils.d.ts.map +1 -1
  41. package/dist/util/UUIDUtils.js +58 -3
  42. package/dist/util/UUIDUtils.js.map +1 -1
  43. package/dist/util.d.ts +14 -0
  44. package/dist/util.d.ts.map +1 -1
  45. package/dist/util.js +20 -0
  46. package/dist/util.js.map +1 -1
  47. package/package.json +1 -1
@@ -140,4 +140,59 @@ describe('IsValidUUID', () => {
140
140
  expect(IsValidUUID('g1b2c3d4-e5f6-7890-abcd-ef1234567890')).toBe(false);
141
141
  });
142
142
  });
143
+ /**
144
+ * UUIDsEqual compares without allocating, but must give EXACTLY the answer of the original
145
+ * expression for every input, including non-ASCII and every whitespace character `trim()` removes.
146
+ */
147
+ describe('UUIDsEqual matches the original trim().toLowerCase() comparison', () => {
148
+ const reference = (a, b) => {
149
+ if (a == null && b == null)
150
+ return true;
151
+ if (a == null || b == null)
152
+ return false;
153
+ return a.trim().toLowerCase() === b.trim().toLowerCase();
154
+ };
155
+ it('on UUID-shaped input in every casing and padding', () => {
156
+ const id = 'a1b2c3d4-e5f6-7890-abcd-ef1234567890';
157
+ const variants = [id, id.toUpperCase(), ` ${id}`, `${id.toUpperCase()}\n`, ' ' + id + '', id.replace('a1', 'a2')];
158
+ for (const a of variants) {
159
+ for (const b of variants) {
160
+ expect(UUIDsEqual(a, b), `${JSON.stringify(a)} vs ${JSON.stringify(b)}`).toBe(reference(a, b));
161
+ }
162
+ }
163
+ });
164
+ it('on Unicode case rules that ASCII folding cannot decide', () => {
165
+ const pairs = [
166
+ ['İ', 'i̇'], // lower-cases to two code units
167
+ ['İ', 'i'],
168
+ ['K', 'K'], // Kelvin sign lower-cases to ASCII 'k'
169
+ ['k', 'K'],
170
+ ['ß', 'SS'],
171
+ ['Σ', 'σ'],
172
+ ['aΣ', 'aς'], // final-sigma rule
173
+ ['É', 'é'],
174
+ ['ÉA', 'éa'],
175
+ ['x', 'xé'],
176
+ ];
177
+ for (const [a, b] of pairs) {
178
+ expect(UUIDsEqual(a, b), `${a} vs ${b}`).toBe(reference(a, b));
179
+ expect(UUIDsEqual(b, a), `${b} vs ${a}`).toBe(reference(b, a));
180
+ }
181
+ });
182
+ it('on 100,000 seeded random pairs over ASCII, Unicode and whitespace', () => {
183
+ const alphabet = ['a', 'A', 'f', 'F', '0', '9', '-', ' ', '\t', '\n', ' ', '
', '', ' ', 'İ', 'i', '̇', 'ß', 'K', 'K', 'é', 'É', 'Σ', 'σ', 'ς', 'z'];
184
+ let seed = 20260924;
185
+ const next = () => (seed = (seed * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff;
186
+ const word = () => Array.from({ length: Math.floor(next() * 7) }, () => alphabet[Math.floor(next() * alphabet.length)]).join('');
187
+ let mismatches = 0;
188
+ for (let i = 0; i < 100_000; i++) {
189
+ const a = word();
190
+ // Bias half the pairs toward near-matches, which are the cases that exercise the fold.
191
+ const b = next() < 0.5 ? (next() < 0.5 ? a.toUpperCase() : ` ${a.toLowerCase()} `) : word();
192
+ if (UUIDsEqual(a, b) !== reference(a, b))
193
+ mismatches++;
194
+ }
195
+ expect(mismatches).toBe(0);
196
+ });
197
+ });
143
198
  //# sourceMappingURL=UUIDUtils.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UUIDUtils.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDUtils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3E,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,aAAa,CAAC,sCAAsC,CAAC,CAAC;aACxD,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,aAAa,CAAC,sCAAsC,CAAC,CAAC;aACxD,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,aAAa,CAAC,sCAAsC,CAAC,CAAC;aACxD,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACxB,MAAM,SAAS,GAAG,sCAAsC,CAAC;IACzD,MAAM,SAAS,GAAG,sCAAsC,CAAC;IAEzD,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACrF,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,UAAU,CAAC,sCAAsC,EACrC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,0EAA0E;IAE1E,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC7D,MAAM,GAAG,GAAG,SAAS,CAAC;QACtB,4EAA4E;QAC5E,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QAC/E,yFAAyF;QACzF,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QACxF,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC5F,yFAAyF;QACzF,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,UAAU,CAAC,IAAI,GAAG,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC3F,2FAA2F;QAC3F,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,MAAM,SAAS,GAAG,sCAAsC,CAAC;IACzD,MAAM,SAAS,GAAG,sCAAsC,CAAC;IAEzD,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACnE,MAAM,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,CAAC,WAAW,CAAC,mDAAmD,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB;QAC9F,MAAM,CAAC,WAAW,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;IACtF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,WAAW,CAAC,sCAAsC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"UUIDUtils.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDUtils.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=util.trimTrailingSlashes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.trimTrailingSlashes.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/util.trimTrailingSlashes.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { TrimTrailingSlashes } from '../util.js';
3
+ describe('TrimTrailingSlashes', () => {
4
+ it('removes every trailing slash', () => {
5
+ expect(TrimTrailingSlashes('http://localhost:4000///')).toBe('http://localhost:4000');
6
+ expect(TrimTrailingSlashes('https://api.example.com/graphql/')).toBe('https://api.example.com/graphql');
7
+ });
8
+ it('leaves a string without a trailing slash unchanged, inner slashes included', () => {
9
+ expect(TrimTrailingSlashes('http://a//b')).toBe('http://a//b');
10
+ expect(TrimTrailingSlashes('')).toBe('');
11
+ });
12
+ it('reduces a string of only slashes to empty', () => {
13
+ expect(TrimTrailingSlashes('/')).toBe('');
14
+ expect(TrimTrailingSlashes('////')).toBe('');
15
+ });
16
+ it('stays linear on input that makes /\\/+$/ backtrack', () => {
17
+ const hostile = '/'.repeat(200_000) + 'x';
18
+ const started = performance.now();
19
+ expect(TrimTrailingSlashes(hostile)).toBe(hostile);
20
+ expect(performance.now() - started).toBeLessThan(250);
21
+ });
22
+ });
23
+ //# sourceMappingURL=util.trimTrailingSlashes.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.trimTrailingSlashes.test.js","sourceRoot":"","sources":["../../src/__tests__/util.trimTrailingSlashes.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE9C,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,mBAAmB,CAAC,0BAA0B,CAAC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACtF,MAAM,CAAC,mBAAmB,CAAC,kCAAkC,CAAC,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC1G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/D,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;QAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -11,8 +11,10 @@ export * from './ClassUtils.js';
11
11
  export * from './util/PatternUtils.js';
12
12
  export * from './util/ResourcePatternUtils.js';
13
13
  export * from './util/UUIDUtils.js';
14
+ export * from './util/UUIDCollections.js';
14
15
  export * from './util/CronUtils.js';
15
16
  export * from './util/SerializationUtils.js';
17
+ export * from './util/BinaryEncoding.js';
16
18
  export * from './ValidationTypes.js';
17
19
  export * from './JSONValidator.js';
18
20
  export * from './SafeExpressionEvaluator.js';
@@ -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,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAMtC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,+BAA+B,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,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAMtC,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,+BAA+B,CAAA"}
package/dist/index.js CHANGED
@@ -12,8 +12,10 @@ export * from './ClassUtils.js';
12
12
  export * from './util/PatternUtils.js';
13
13
  export * from './util/ResourcePatternUtils.js';
14
14
  export * from './util/UUIDUtils.js';
15
+ export * from './util/UUIDCollections.js';
15
16
  export * from './util/CronUtils.js';
16
17
  export * from './util/SerializationUtils.js';
18
+ export * from './util/BinaryEncoding.js';
17
19
  export * from './ValidationTypes.js';
18
20
  export * from './JSONValidator.js';
19
21
  export * from './SafeExpressionEvaluator.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAEtC,2DAA2D;AAC3D,oCAAoC;AAEpC,0BAA0B;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,+BAA+B,CAAA;AAE7C,6DAA6D;AAC7D,oCAAoC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAChE,cAAc,aAAa,CAAA;AAC3B,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,YAAY,CAAA;AAC1B,cAAc,cAAc,CAAA;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kBAAkB,CAAC;AACjC,cAAc,wBAAwB,CAAC;AACvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,2BAA2B,CAAA;AACzC,cAAc,cAAc,CAAA;AAC5B,cAAc,0BAA0B,CAAA;AACxC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,uBAAuB,CAAA;AACrC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AACtC,cAAc,wBAAwB,CAAA;AAEtC,2DAA2D;AAC3D,oCAAoC;AAEpC,0BAA0B;AAC1B,cAAc,UAAU,CAAA;AACxB,cAAc,iBAAiB,CAAA;AAC/B,cAAc,oBAAoB,CAAA;AAClC,cAAc,+BAA+B,CAAA;AAE7C,6DAA6D;AAC7D,oCAAoC"}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Binary encoding primitives shared by every MemberJunction tier.
3
+ *
4
+ * MemberJunction stores binary database columns (SQL Server `binary` / `varbinary` / `image`,
5
+ * PostgreSQL `bytea`) in `BaseEntity` and on the wire as **base64 strings**. A string keeps the
6
+ * value JSON-safe, so dirty tracking, Record Changes, the RunView caches, GraphQL and remote
7
+ * invalidation broadcasts all handle it without special cases. Code that needs the actual bytes
8
+ * converts at the edge with the functions in this module.
9
+ *
10
+ * Everything here is dependency-free and runs unchanged in browsers, Node and workers. Each
11
+ * conversion picks the fastest implementation the host offers:
12
+ *
13
+ * | Host | base64 → bytes | bytes → base64 |
14
+ * |---|---|---|
15
+ * | Browsers with the TC39 base64 API (Chrome 140+, Firefox 133+, Safari 18.2+) | `Uint8Array.fromBase64` | `Uint8Array.prototype.toBase64` |
16
+ * | Node.js | `Buffer.from(s, 'base64')` | `Buffer#toString('base64')` |
17
+ * | Anything else | `atob` | `btoa` (chunked) |
18
+ *
19
+ * The fast paths are detected by duck typing, once per process, so older browsers keep working.
20
+ * All three implementations accept and produce exactly the same strings, and the decoders
21
+ * validate input identically, so a value never decodes on one tier and fails on another.
22
+ *
23
+ * @module BinaryEncoding
24
+ */
25
+ /**
26
+ * One way of converting between bytes and base64. Every implementation must accept and produce
27
+ * the same strings; {@link Base64Codecs} lists them so tests can prove that.
28
+ */
29
+ export interface Base64Codec {
30
+ /** Human-readable name, used in diagnostics and tests. */
31
+ readonly Name: string;
32
+ /** True when the host supports this implementation. */
33
+ IsAvailable(): boolean;
34
+ /** Encodes bytes as standard, padded base64 (RFC 4648 §4). */
35
+ Encode(bytes: Uint8Array): string;
36
+ /**
37
+ * Decodes base64 that has already passed {@link IsValidBase64}. Implementations may assume
38
+ * valid input; the public functions validate first so every implementation fails the same way.
39
+ */
40
+ Decode(base64: string): Uint8Array;
41
+ /**
42
+ * Optional fused validate-and-decode: returns the bytes when `base64` passes
43
+ * {@link IsValidBase64}, else `null` — exactly the same accept/reject decision, made more cheaply
44
+ * than a separate character scan. Codecs without it are validated with {@link IsValidBase64}.
45
+ */
46
+ TryDecode?(base64: string): Uint8Array | null;
47
+ }
48
+ /**
49
+ * Every base64 implementation, fastest first. Exposed so tests can prove the implementations are
50
+ * interchangeable; application code should call {@link BytesToBase64} / {@link Base64ToBytes}.
51
+ */
52
+ export declare const Base64Codecs: readonly Base64Codec[];
53
+ /**
54
+ * Returns the fastest base64 implementation this host supports. The choice is made once and
55
+ * cached; it cannot change during a process's life.
56
+ *
57
+ * @throws Error when the host offers none of the implementations (no JavaScript host MJ supports).
58
+ */
59
+ export declare function GetBase64Codec(): Base64Codec;
60
+ /**
61
+ * True when `value` is canonical base64: the standard alphabet (`A–Z a–z 0–9 + /`), optional
62
+ * `=` padding, no whitespace, and a length that can encode whole bytes. The empty string is valid
63
+ * and decodes to zero bytes.
64
+ *
65
+ * @param value - The string to check.
66
+ */
67
+ export declare function IsValidBase64(value: string): boolean;
68
+ /**
69
+ * The length rules of canonical base64, without looking at the characters: a length that can
70
+ * encode whole bytes, and padding only on a full final quantum ("xx==" or "xxx="), never on a bare
71
+ * remainder. Part of {@link IsValidBase64}; exposed so a codec's fused validate-and-decode
72
+ * ({@link Base64Codec.TryDecode}) applies the same rules.
73
+ *
74
+ * @param value - The string to check.
75
+ */
76
+ export declare function HasValidBase64Shape(value: string): boolean;
77
+ /**
78
+ * Returns how many bytes a base64 string decodes to, without decoding it. Useful for size checks
79
+ * on large values. The input is assumed to be valid (see {@link IsValidBase64}); padding is
80
+ * optional.
81
+ *
82
+ * @param base64 - Canonical base64.
83
+ */
84
+ export declare function Base64DecodedByteLength(base64: string): number;
85
+ /** Prefix of the text recorded in a change log in place of a binary value. See {@link FormatBinaryChangeValue}. */
86
+ export declare const BINARY_CHANGE_VALUE_PREFIX = "[binary:";
87
+ /**
88
+ * The text a change log records, and change history shows, in place of a binary field's base64
89
+ * value: `[binary: 6,144 bytes]`. The bytes themselves stay in the record snapshot
90
+ * (`FullRecordJSON`), which restore reads; only the per-field diff (`ChangesJSON`) and its
91
+ * on-screen rendering use this, so a change to an embedding or a file is visible without carrying
92
+ * the content twice more per save. Invalid base64 is reported as such rather than thrown on.
93
+ *
94
+ * @param base64 - The field's value as held above the database.
95
+ */
96
+ export declare function FormatBinaryChangeValue(base64: string): string;
97
+ /** Whether `value` is text produced by {@link FormatBinaryChangeValue}, so it is shown as-is and never decoded. */
98
+ export declare function IsBinaryChangeValue(value: unknown): value is string;
99
+ /**
100
+ * Encodes bytes as standard, padded base64 using the fastest implementation the host offers.
101
+ *
102
+ * @param bytes - The bytes to encode. Any `Uint8Array` works, including a Node `Buffer` or a view
103
+ * into a larger buffer; only the viewed range is encoded.
104
+ * @returns The base64 string; `''` for zero bytes.
105
+ */
106
+ export declare function BytesToBase64(bytes: Uint8Array): string;
107
+ /**
108
+ * Decodes base64 into a new `Uint8Array` that owns its own `ArrayBuffer` (offset 0, never a view
109
+ * into a shared pool), using the fastest implementation the host offers.
110
+ *
111
+ * @param base64 - Canonical base64 (see {@link IsValidBase64}); padding may be omitted.
112
+ * @returns The decoded bytes.
113
+ * @throws Error when `base64` is not valid base64. Use {@link TryBase64ToBytes} to get `null` instead.
114
+ */
115
+ export declare function Base64ToBytes(base64: string): Uint8Array;
116
+ /**
117
+ * Like {@link Base64ToBytes}, but returns `null` instead of throwing when the input is not a
118
+ * string or not valid base64. Convenient for reading a nullable binary entity field.
119
+ *
120
+ * @param base64 - The value to decode, typically a binary entity field (`string | null`).
121
+ */
122
+ export declare function TryBase64ToBytes(base64: string | null | undefined): Uint8Array | null;
123
+ /**
124
+ * True when `value` is a byte array: a `Uint8Array`, which includes a Node `Buffer`. Database
125
+ * drivers return binary columns this way; use it at the provider boundary to recognise values
126
+ * that must be converted to base64 before they reach a `BaseEntity`.
127
+ *
128
+ * @param value - Any value.
129
+ */
130
+ export declare function IsByteArray(value: unknown): value is Uint8Array;
131
+ /**
132
+ * Returns `row` with every top-level byte-array value replaced by its base64 string.
133
+ *
134
+ * Copy-on-write: when the row holds no byte arrays (the normal case, since the database providers
135
+ * already convert binary columns) the same object is returned untouched; otherwise a shallow copy
136
+ * is returned and the original — which may be a frozen cache entry — is never modified.
137
+ *
138
+ * Use it as a safety net wherever rows are serialized for a transport: `JSON.stringify` turns a
139
+ * Node `Buffer` into `{"type":"Buffer","data":[...]}` and GraphQL's `String` scalar rejects it.
140
+ *
141
+ * @param row - A data row.
142
+ */
143
+ export declare function ReplaceByteArraysWithBase64<T extends Record<string, unknown>>(row: T): T;
144
+ /**
145
+ * The byte layout MemberJunction uses for persisted embedding vectors: consecutive
146
+ * IEEE-754 single-precision values, little-endian, 4 bytes each, no header. The dimension count
147
+ * is `byteLength / 4`. This is the layout of a `Float32Array` on every little-endian host, which
148
+ * is every platform MemberJunction runs on; big-endian hosts are still handled correctly.
149
+ */
150
+ export declare const FLOAT32_VECTOR_BYTES_PER_VALUE = 4;
151
+ /**
152
+ * Converts between numbers and the {@link FLOAT32_VECTOR_BYTES_PER_VALUE little-endian float32}
153
+ * layout. Two implementations exist so the result is correct on any host:
154
+ * a typed-array copy (little-endian hosts) and an explicit `DataView` (any host).
155
+ */
156
+ export interface Float32VectorCodec {
157
+ /** Human-readable name, used in tests. */
158
+ readonly Name: string;
159
+ /** Writes `values` as little-endian float32 bytes into a new array. */
160
+ Encode(values: ArrayLike<number>): Uint8Array;
161
+ /** Reads little-endian float32 bytes (length already checked to be a positive multiple of 4). */
162
+ Decode(bytes: Uint8Array): Float32Array;
163
+ }
164
+ /** Both float32 vector implementations. Exposed for tests; use the functions below instead. */
165
+ export declare const Float32VectorCodecs: readonly Float32VectorCodec[];
166
+ /**
167
+ * Encodes a vector as little-endian float32 bytes. Values are rounded to single precision, which
168
+ * is the precision embedding models produce; `NaN` and infinities are stored as-is.
169
+ *
170
+ * @param values - The vector, e.g. a `number[]` or a `Float32Array`.
171
+ * @returns A new byte array of `values.length × 4` bytes.
172
+ */
173
+ export declare function Float32VectorToBytes(values: ArrayLike<number>): Uint8Array;
174
+ /**
175
+ * Decodes little-endian float32 bytes into a new `Float32Array` that owns its memory.
176
+ *
177
+ * @param bytes - Bytes in the {@link FLOAT32_VECTOR_BYTES_PER_VALUE persisted vector layout}.
178
+ * @returns The vector, or `null` when `bytes` is empty or not a whole number of float32 values,
179
+ * so a truncated or foreign value is treated as missing rather than misread.
180
+ */
181
+ export declare function BytesToFloat32Vector(bytes: Uint8Array | null | undefined): Float32Array | null;
182
+ /**
183
+ * Encodes a vector as base64 of its little-endian float32 bytes: the value stored in a binary
184
+ * vector entity field such as `VectorBinary`.
185
+ *
186
+ * @param values - The vector.
187
+ */
188
+ export declare function Float32VectorToBase64(values: ArrayLike<number>): string;
189
+ /**
190
+ * Decodes a binary vector entity field (base64 of little-endian float32 bytes).
191
+ *
192
+ * @param base64 - The field value; `null` / `undefined` are allowed.
193
+ * @returns The vector, or `null` when the value is missing, not valid base64, empty, or not a
194
+ * whole number of float32 values. Callers usually fall back to a JSON copy of the vector.
195
+ */
196
+ export declare function Base64ToFloat32Vector(base64: string | null | undefined): Float32Array | null;
197
+ //# sourceMappingURL=BinaryEncoding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BinaryEncoding.d.ts","sourceRoot":"","sources":["../../src/util/BinaryEncoding.ts"],"names":[],"mappings":"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"}