@memberjunction/core 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 (30) hide show
  1. package/dist/generic/graphqlTypeNames.d.ts +23 -1
  2. package/dist/generic/graphqlTypeNames.d.ts.map +1 -1
  3. package/dist/generic/graphqlTypeNames.js +36 -5
  4. package/dist/generic/graphqlTypeNames.js.map +1 -1
  5. package/dist/generic/providerBase.d.ts.map +1 -1
  6. package/dist/generic/providerBase.js +11 -0
  7. package/dist/generic/providerBase.js.map +1 -1
  8. package/dist/generic/queryInfo.d.ts +1 -1
  9. package/dist/generic/queryInfo.js +1 -1
  10. package/dist/generic/runQuery.d.ts +7 -0
  11. package/dist/generic/runQuery.d.ts.map +1 -1
  12. package/dist/generic/runQuery.js.map +1 -1
  13. package/package.json +2 -2
  14. package/readme.md +5 -0
  15. package/dist/__tests__/mocks/TestMetadataProvider.d.ts +0 -45
  16. package/dist/__tests__/mocks/TestMetadataProvider.d.ts.map +0 -1
  17. package/dist/__tests__/mocks/TestMetadataProvider.js +0 -217
  18. package/dist/__tests__/mocks/TestMetadataProvider.js.map +0 -1
  19. package/dist/__tests__/providerBase.concurrency.test.d.ts +0 -10
  20. package/dist/__tests__/providerBase.concurrency.test.d.ts.map +0 -1
  21. package/dist/__tests__/providerBase.concurrency.test.js +0 -253
  22. package/dist/__tests__/providerBase.concurrency.test.js.map +0 -1
  23. package/dist/__tests__/providerBase.refresh.test.d.ts +0 -10
  24. package/dist/__tests__/providerBase.refresh.test.d.ts.map +0 -1
  25. package/dist/__tests__/providerBase.refresh.test.js +0 -161
  26. package/dist/__tests__/providerBase.refresh.test.js.map +0 -1
  27. package/dist/__tests__/setup.d.ts +0 -5
  28. package/dist/__tests__/setup.d.ts.map +0 -1
  29. package/dist/__tests__/setup.js +0 -17
  30. package/dist/__tests__/setup.js.map +0 -1
@@ -1,161 +0,0 @@
1
- "use strict";
2
- /**
3
- * Baseline Tests for ProviderBase.Refresh() and Config()
4
- *
5
- * Purpose: Document current behavior before implementing thread safety fixes
6
- * These tests establish a baseline to ensure the fix doesn't break existing functionality
7
- *
8
- * Related: METADATA_THREAD_SAFETY_IMPLEMENTATION.md - Phase 1, Task 1.3
9
- */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- const interfaces_1 = require("../generic/interfaces.js");
12
- const TestMetadataProvider_1 = require("./mocks/TestMetadataProvider.js");
13
- describe('ProviderBase.Refresh - Baseline Behavior', () => {
14
- let provider;
15
- let testConfig;
16
- beforeEach(() => {
17
- provider = new TestMetadataProvider_1.TestMetadataProvider();
18
- testConfig = new interfaces_1.ProviderConfigDataBase({}, // data
19
- '__mj', // MJCoreSchemaName
20
- [], // includeSchemas
21
- [], // excludeSchemas
22
- true // ignoreExistingMetadata - don't copy from global
23
- );
24
- });
25
- describe('Single Refresh Operations', () => {
26
- test('Config() loads metadata successfully', async () => {
27
- const result = await provider.Config(testConfig);
28
- expect(result).toBe(true);
29
- expect(provider.Entities).toBeDefined();
30
- expect(provider.Entities.length).toBeGreaterThan(0);
31
- });
32
- test('Entities have Fields populated', async () => {
33
- await provider.Config(testConfig);
34
- const entity = provider.Entities[0];
35
- expect(entity).toBeDefined();
36
- expect(entity.Fields).toBeDefined();
37
- expect(entity.Fields.length).toBe(2);
38
- expect(entity.Fields[0].Name).toBe('ID');
39
- });
40
- test('Refresh() triggers Config() and reloads metadata', async () => {
41
- // Initial load
42
- await provider.Config(testConfig);
43
- const initialCount = provider.Entities.length;
44
- // Change mock data
45
- provider.setMockMetadata({
46
- ...await provider['GetAllMetadata'](),
47
- Entities: [
48
- {
49
- ID: '3',
50
- Name: 'New Entity',
51
- SchemaName: 'dbo',
52
- BaseView: 'vwNewEntity',
53
- BaseTable: 'NewEntity',
54
- Fields: [{ ID: 'f5', Name: 'ID', Type: 'uniqueidentifier', IsPrimaryKey: true }]
55
- }
56
- ]
57
- });
58
- // Refresh
59
- await provider.Refresh();
60
- // Should have new data
61
- expect(provider.Entities.length).toBe(1);
62
- expect(provider.Entities[0].Name).toBe('New Entity');
63
- });
64
- test('AllowRefresh=false prevents refresh', async () => {
65
- await provider.Config(testConfig);
66
- const initialCount = provider.Entities.length;
67
- // Disable refresh
68
- provider.setAllowRefresh(false);
69
- // Try to refresh
70
- const result = await provider.Refresh();
71
- // Should return true but not actually refresh
72
- expect(result).toBe(true);
73
- expect(provider.Entities.length).toBe(initialCount);
74
- });
75
- });
76
- describe('Metadata Access During Operations', () => {
77
- test('Entities accessible immediately after Config()', async () => {
78
- await provider.Config(testConfig);
79
- // Should be able to access metadata immediately
80
- const entities = provider.Entities;
81
- expect(entities).toBeDefined();
82
- expect(Array.isArray(entities)).toBe(true);
83
- expect(entities.length).toBeGreaterThan(0);
84
- });
85
- test('Entities array is stable across multiple reads', async () => {
86
- await provider.Config(testConfig);
87
- const read1 = provider.Entities;
88
- const read2 = provider.Entities;
89
- const read3 = provider.Entities;
90
- // Should return same array instance
91
- expect(read1).toBe(read2);
92
- expect(read2).toBe(read3);
93
- });
94
- test('Fields arrays are accessible', async () => {
95
- await provider.Config(testConfig);
96
- const entity = provider.Entities[0];
97
- const fields1 = entity.Fields;
98
- const fields2 = entity.Fields;
99
- expect(fields1).toBeDefined();
100
- expect(fields1).toBe(fields2); // Same array instance
101
- expect(fields1.length).toBeGreaterThan(0);
102
- });
103
- });
104
- describe('Current Behavior - Documenting Issues', () => {
105
- test('KNOWN ISSUE: Reading metadata during Config() may see empty data', async () => {
106
- /**
107
- * This test documents the current race condition.
108
- * When Config() is called, it immediately clears metadata (line 341 of providerBase.ts)
109
- * before GetAllMetadata() completes.
110
- *
111
- * During this window, readers see empty metadata.
112
- * This test will FAIL before the fix and PASS after the atomic update fix.
113
- */
114
- // Start config but don't await
115
- const configPromise = provider.Config(testConfig);
116
- // Try to read metadata during config (after slight delay)
117
- await new Promise(resolve => setTimeout(resolve, 10));
118
- const entitiesDuringConfig = provider.Entities;
119
- // CURRENT BEHAVIOR: This might be empty or undefined
120
- // DESIRED BEHAVIOR: Should return either old metadata (if any) or wait for new
121
- // Note: On first call, there is no "old" metadata, so empty is expected
122
- // Wait for config to complete
123
- await configPromise;
124
- // After config, should definitely have data
125
- expect(provider.Entities.length).toBeGreaterThan(0);
126
- // Document current behavior
127
- console.log('Entities during config:', entitiesDuringConfig?.length ?? 'undefined/empty');
128
- console.log('Entities after config:', provider.Entities.length);
129
- });
130
- test('✅ FIXED: Multiple concurrent Config() calls now safe', async () => {
131
- /**
132
- * This test verifies that concurrent Config() calls don't cause race conditions.
133
- * With the atomic update fix, readers always see valid metadata (old or new).
134
- *
135
- * Before fix: Metadata would be cleared, causing empty array errors
136
- * After fix: Metadata is atomically swapped, no intermediate empty state
137
- */
138
- provider.resetCallCount();
139
- // Start 3 concurrent Config() calls
140
- const promises = [
141
- provider.Config(testConfig),
142
- provider.Config(testConfig),
143
- provider.Config(testConfig),
144
- ];
145
- // Wait for all to complete
146
- const results = await Promise.all(promises);
147
- // All should succeed
148
- expect(results.every(r => r === true)).toBe(true);
149
- // Should have valid metadata
150
- expect(provider.Entities).toBeDefined();
151
- expect(provider.Entities.length).toBeGreaterThan(0);
152
- // Check efficiency - may coalesce some calls
153
- const callCount = provider.getCallCount();
154
- console.log('GetAllMetadata called:', callCount, 'times for 3 Config() calls');
155
- console.log('Final entity count:', provider.Entities.length);
156
- // ✅ FIXED: No more race conditions - metadata is always valid
157
- // DESIRED BEHAVIOR: All calls complete safely, metadata is consistent
158
- });
159
- });
160
- });
161
- //# sourceMappingURL=providerBase.refresh.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providerBase.refresh.test.js","sourceRoot":"","sources":["../../src/__tests__/providerBase.refresh.test.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAEH,sDAA+D;AAC/D,uEAAoE;AAEpE,QAAQ,CAAC,0CAA0C,EAAE,GAAG,EAAE;IACtD,IAAI,QAA8B,CAAC;IACnC,IAAI,UAAkC,CAAC;IAEvC,UAAU,CAAC,GAAG,EAAE;QACZ,QAAQ,GAAG,IAAI,2CAAoB,EAAE,CAAC;QACtC,UAAU,GAAG,IAAI,mCAAsB,CACnC,EAAE,EAAE,OAAO;QACX,MAAM,EAAE,mBAAmB;QAC3B,EAAE,EAAE,iBAAiB;QACrB,EAAE,EAAE,iBAAiB;QACrB,IAAI,CAAC,kDAAkD;SAC1D,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACvC,IAAI,CAAC,sCAAsC,EAAE,KAAK,IAAI,EAAE;YACpD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;YAChE,eAAe;YACf,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAE9C,mBAAmB;YACnB,QAAQ,CAAC,eAAe,CAAC;gBACrB,GAAG,MAAM,QAAQ,CAAC,gBAAgB,CAAC,EAAE;gBACrC,QAAQ,EAAE;oBACN;wBACI,EAAE,EAAE,GAAG;wBACP,IAAI,EAAE,YAAY;wBAClB,UAAU,EAAE,KAAK;wBACjB,QAAQ,EAAE,aAAa;wBACvB,SAAS,EAAE,WAAW;wBACtB,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;qBACnF;iBACJ;aACJ,CAAC,CAAC;YAEH,UAAU;YACV,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAEzB,uBAAuB;YACvB,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;YAE9C,kBAAkB;YAClB,QAAQ,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEhC,iBAAiB;YACjB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;YAExC,8CAA8C;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC/C,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElC,gDAAgD;YAChD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YAC/B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAEhC,oCAAoC;YACpC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;YAC5C,MAAM,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElC,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAE9B,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,sBAAsB;YACrD,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;QACnD,IAAI,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF;;;;;;;eAOG;YAEH,+BAA+B;YAC/B,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAElD,0DAA0D;YAC1D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,oBAAoB,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAE/C,qDAAqD;YACrD,+EAA+E;YAC/E,wEAAwE;YAExE,8BAA8B;YAC9B,MAAM,aAAa,CAAC;YAEpB,4CAA4C;YAC5C,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,4BAA4B;YAC5B,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,IAAI,iBAAiB,CAAC,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE;;;;;;eAMG;YAEH,QAAQ,CAAC,cAAc,EAAE,CAAC;YAE1B,oCAAoC;YACpC,MAAM,QAAQ,GAAG;gBACb,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC3B,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;gBAC3B,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC;aAC9B,CAAC;YAEF,2BAA2B;YAC3B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE5C,qBAAqB;YACrB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAElD,6BAA6B;YAC7B,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAEpD,6CAA6C;YAC7C,MAAM,SAAS,GAAG,QAAQ,CAAC,YAAY,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,SAAS,EAAE,4BAA4B,CAAC,CAAC;YAC/E,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAE7D,8DAA8D;YAC9D,sEAAsE;QAC1E,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,5 +0,0 @@
1
- /**
2
- * Jest setup file for MJCore tests
3
- * Runs before each test file
4
- */
5
- //# sourceMappingURL=setup.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Jest setup file for MJCore tests
3
- * Runs before each test file
4
- */
5
- // Increase timeout for async operations
6
- jest.setTimeout(30000);
7
- // Mock console methods to reduce noise (can be enabled per test)
8
- global.console = {
9
- ...console,
10
- // Uncomment to silence logs during tests
11
- // log: jest.fn(),
12
- // debug: jest.fn(),
13
- // info: jest.fn(),
14
- // warn: jest.fn(),
15
- // error: jest.fn(),
16
- };
17
- //# sourceMappingURL=setup.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/__tests__/setup.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wCAAwC;AACxC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAEvB,iEAAiE;AACjE,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,OAAO;IACV,yCAAyC;IACzC,kBAAkB;IAClB,oBAAoB;IACpB,mBAAmB;IACnB,mBAAmB;IACnB,oBAAoB;CACrB,CAAC"}