@gravity-ui/data-source 0.7.0 → 0.8.1

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 (148) hide show
  1. package/README.md +752 -15
  2. package/build/cjs/core/index.d.ts +1 -0
  3. package/build/cjs/core/index.js.map +1 -1
  4. package/build/cjs/core/types/DataManager.d.ts +5 -0
  5. package/build/cjs/core/types/DataManager.js.map +1 -1
  6. package/build/cjs/core/types/Normalizer.d.ts +29 -0
  7. package/build/cjs/core/types/Normalizer.js +6 -0
  8. package/build/cjs/core/types/Normalizer.js.map +1 -0
  9. package/build/cjs/react/DataManagerProvider.d.ts +7 -0
  10. package/build/cjs/react/DataManagerProvider.js +19 -0
  11. package/build/cjs/react/DataManagerProvider.js.map +1 -0
  12. package/build/cjs/react/__tests__/DataManagerContext.test.js +7 -6
  13. package/build/cjs/react/__tests__/DataManagerContext.test.js.map +1 -1
  14. package/build/cjs/react/__tests__/withDataManager.test.js +3 -0
  15. package/build/cjs/react/__tests__/withDataManager.test.js.map +1 -1
  16. package/build/cjs/react/index.d.ts +2 -0
  17. package/build/cjs/react/index.js +8 -0
  18. package/build/cjs/react/index.js.map +1 -1
  19. package/build/cjs/react-query/ClientDataManager.d.ts +16 -3
  20. package/build/cjs/react-query/ClientDataManager.js +158 -13
  21. package/build/cjs/react-query/ClientDataManager.js.map +1 -1
  22. package/build/cjs/react-query/DataSourceProvider.d.ts +7 -0
  23. package/build/cjs/react-query/DataSourceProvider.js +35 -0
  24. package/build/cjs/react-query/DataSourceProvider.js.map +1 -0
  25. package/build/cjs/react-query/__tests__/createQueryNormalizer.test.js +177 -0
  26. package/build/cjs/react-query/__tests__/createQueryNormalizer.test.js.map +1 -0
  27. package/build/cjs/react-query/__tests__/normalizationEdgeCases.test.js +100 -0
  28. package/build/cjs/react-query/__tests__/normalizationEdgeCases.test.js.map +1 -0
  29. package/build/cjs/react-query/__tests__/subscriptions.test.js +1180 -0
  30. package/build/cjs/react-query/__tests__/subscriptions.test.js.map +1 -0
  31. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js +659 -0
  32. package/build/cjs/react-query/__tests__/threeLevelIntegration.test.js.map +1 -0
  33. package/build/cjs/react-query/__tests__/updateQueriesFromMutationData.test.js +229 -0
  34. package/build/cjs/react-query/__tests__/updateQueriesFromMutationData.test.js.map +1 -0
  35. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js +195 -0
  36. package/build/cjs/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +1 -0
  37. package/build/cjs/react-query/impl/infinite/hooks.js +4 -1
  38. package/build/cjs/react-query/impl/infinite/hooks.js.map +1 -1
  39. package/build/cjs/react-query/impl/infinite/types.d.ts +2 -2
  40. package/build/cjs/react-query/impl/infinite/types.js.map +1 -1
  41. package/build/cjs/react-query/impl/infinite/utils.js +6 -1
  42. package/build/cjs/react-query/impl/infinite/utils.js.map +1 -1
  43. package/build/cjs/react-query/impl/plain/hooks.js +4 -1
  44. package/build/cjs/react-query/impl/plain/hooks.js.map +1 -1
  45. package/build/cjs/react-query/impl/plain/types.d.ts +2 -2
  46. package/build/cjs/react-query/impl/plain/types.js.map +1 -1
  47. package/build/cjs/react-query/impl/plain/utils.js +6 -1
  48. package/build/cjs/react-query/impl/plain/utils.js.map +1 -1
  49. package/build/cjs/react-query/index.d.ts +2 -0
  50. package/build/cjs/react-query/index.js +7 -0
  51. package/build/cjs/react-query/index.js.map +1 -1
  52. package/build/cjs/react-query/types/normalizer.d.ts +21 -0
  53. package/build/cjs/react-query/types/normalizer.js +6 -0
  54. package/build/cjs/react-query/types/normalizer.js.map +1 -0
  55. package/build/cjs/react-query/types/options.d.ts +12 -0
  56. package/build/cjs/react-query/types/options.js.map +1 -1
  57. package/build/cjs/react-query/types/query-meta.d.ts +12 -0
  58. package/build/cjs/react-query/utils/__tests__/checkMutationObjectsKeys.test.js +295 -0
  59. package/build/cjs/react-query/utils/__tests__/checkMutationObjectsKeys.test.js.map +1 -0
  60. package/build/cjs/react-query/utils/checkMutationObjectsKeys.d.ts +17 -0
  61. package/build/cjs/react-query/utils/checkMutationObjectsKeys.js +88 -0
  62. package/build/cjs/react-query/utils/checkMutationObjectsKeys.js.map +1 -0
  63. package/build/cjs/react-query/utils/normalize.d.ts +22 -0
  64. package/build/cjs/react-query/utils/normalize.js +150 -0
  65. package/build/cjs/react-query/utils/normalize.js.map +1 -0
  66. package/build/cjs/react-query/utils/parseQueryKey.d.ts +2 -0
  67. package/build/cjs/react-query/utils/parseQueryKey.js +10 -0
  68. package/build/cjs/react-query/utils/parseQueryKey.js.map +1 -0
  69. package/build/cjs/react-query/utils/warn.d.ts +1 -0
  70. package/build/cjs/react-query/utils/warn.js +15 -0
  71. package/build/cjs/react-query/utils/warn.js.map +1 -0
  72. package/build/cjs/react-query/utils/warnDisabledRefetch.d.ts +1 -0
  73. package/build/cjs/react-query/utils/warnDisabledRefetch.js +11 -0
  74. package/build/cjs/react-query/utils/warnDisabledRefetch.js.map +1 -0
  75. package/build/esm/core/index.d.ts +1 -0
  76. package/build/esm/core/index.js.map +1 -1
  77. package/build/esm/core/types/DataManager.d.ts +5 -0
  78. package/build/esm/core/types/DataManager.js.map +1 -1
  79. package/build/esm/core/types/Normalizer.d.ts +29 -0
  80. package/build/esm/core/types/Normalizer.js +2 -0
  81. package/build/esm/core/types/Normalizer.js.map +1 -0
  82. package/build/esm/react/DataManagerProvider.d.ts +7 -0
  83. package/build/esm/react/DataManagerProvider.js +12 -0
  84. package/build/esm/react/DataManagerProvider.js.map +1 -0
  85. package/build/esm/react/__tests__/DataManagerContext.test.js +7 -6
  86. package/build/esm/react/__tests__/DataManagerContext.test.js.map +1 -1
  87. package/build/esm/react/__tests__/withDataManager.test.js +3 -0
  88. package/build/esm/react/__tests__/withDataManager.test.js.map +1 -1
  89. package/build/esm/react/index.d.ts +2 -0
  90. package/build/esm/react/index.js +1 -0
  91. package/build/esm/react/index.js.map +1 -1
  92. package/build/esm/react-query/ClientDataManager.d.ts +16 -3
  93. package/build/esm/react-query/ClientDataManager.js +152 -7
  94. package/build/esm/react-query/ClientDataManager.js.map +1 -1
  95. package/build/esm/react-query/DataSourceProvider.d.ts +7 -0
  96. package/build/esm/react-query/DataSourceProvider.js +28 -0
  97. package/build/esm/react-query/DataSourceProvider.js.map +1 -0
  98. package/build/esm/react-query/__tests__/createQueryNormalizer.test.js +174 -0
  99. package/build/esm/react-query/__tests__/createQueryNormalizer.test.js.map +1 -0
  100. package/build/esm/react-query/__tests__/normalizationEdgeCases.test.js +98 -0
  101. package/build/esm/react-query/__tests__/normalizationEdgeCases.test.js.map +1 -0
  102. package/build/esm/react-query/__tests__/subscriptions.test.js +1176 -0
  103. package/build/esm/react-query/__tests__/subscriptions.test.js.map +1 -0
  104. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js +656 -0
  105. package/build/esm/react-query/__tests__/threeLevelIntegration.test.js.map +1 -0
  106. package/build/esm/react-query/__tests__/updateQueriesFromMutationData.test.js +227 -0
  107. package/build/esm/react-query/__tests__/updateQueriesFromMutationData.test.js.map +1 -0
  108. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js +192 -0
  109. package/build/esm/react-query/hooks/__tests__/useQueryData.refetch.test.js.map +1 -0
  110. package/build/esm/react-query/impl/infinite/hooks.js +5 -2
  111. package/build/esm/react-query/impl/infinite/hooks.js.map +1 -1
  112. package/build/esm/react-query/impl/infinite/types.d.ts +2 -2
  113. package/build/esm/react-query/impl/infinite/types.js.map +1 -1
  114. package/build/esm/react-query/impl/infinite/utils.js +6 -1
  115. package/build/esm/react-query/impl/infinite/utils.js.map +1 -1
  116. package/build/esm/react-query/impl/plain/hooks.js +5 -2
  117. package/build/esm/react-query/impl/plain/hooks.js.map +1 -1
  118. package/build/esm/react-query/impl/plain/types.d.ts +2 -2
  119. package/build/esm/react-query/impl/plain/types.js.map +1 -1
  120. package/build/esm/react-query/impl/plain/utils.js +6 -1
  121. package/build/esm/react-query/impl/plain/utils.js.map +1 -1
  122. package/build/esm/react-query/index.d.ts +2 -0
  123. package/build/esm/react-query/index.js +1 -0
  124. package/build/esm/react-query/index.js.map +1 -1
  125. package/build/esm/react-query/types/normalizer.d.ts +21 -0
  126. package/build/esm/react-query/types/normalizer.js +2 -0
  127. package/build/esm/react-query/types/normalizer.js.map +1 -0
  128. package/build/esm/react-query/types/options.d.ts +12 -0
  129. package/build/esm/react-query/types/options.js.map +1 -1
  130. package/build/esm/react-query/types/query-meta.d.ts +12 -0
  131. package/build/esm/react-query/utils/__tests__/checkMutationObjectsKeys.test.js +292 -0
  132. package/build/esm/react-query/utils/__tests__/checkMutationObjectsKeys.test.js.map +1 -0
  133. package/build/esm/react-query/utils/checkMutationObjectsKeys.d.ts +17 -0
  134. package/build/esm/react-query/utils/checkMutationObjectsKeys.js +81 -0
  135. package/build/esm/react-query/utils/checkMutationObjectsKeys.js.map +1 -0
  136. package/build/esm/react-query/utils/normalize.d.ts +22 -0
  137. package/build/esm/react-query/utils/normalize.js +143 -0
  138. package/build/esm/react-query/utils/normalize.js.map +1 -0
  139. package/build/esm/react-query/utils/parseQueryKey.d.ts +2 -0
  140. package/build/esm/react-query/utils/parseQueryKey.js +4 -0
  141. package/build/esm/react-query/utils/parseQueryKey.js.map +1 -0
  142. package/build/esm/react-query/utils/warn.d.ts +1 -0
  143. package/build/esm/react-query/utils/warn.js +9 -0
  144. package/build/esm/react-query/utils/warn.js.map +1 -0
  145. package/build/esm/react-query/utils/warnDisabledRefetch.d.ts +1 -0
  146. package/build/esm/react-query/utils/warnDisabledRefetch.js +5 -0
  147. package/build/esm/react-query/utils/warnDisabledRefetch.js.map +1 -0
  148. package/package.json +2 -1
@@ -12,6 +12,9 @@ jest.mock('../DataManagerContext', function () {
12
12
  });
13
13
  describe('withDataManager', function () {
14
14
  var mockDataManager = {
15
+ normalizer: undefined,
16
+ optimisticUpdate: jest.fn(),
17
+ invalidateData: jest.fn(),
15
18
  invalidateTag: jest.fn(),
16
19
  invalidateTags: jest.fn(),
17
20
  invalidateSource: jest.fn(),
@@ -1 +1 @@
1
- {"version":3,"names":["React","render","screen","useDataManager","withDataManager","jsx","_jsx","jest","mock","originalModule","requireActual","_objectSpread","fn","describe","mockDataManager","invalidateTag","invalidateTags","invalidateSource","resetSource","invalidateParams","resetParams","invalidateSourceTags","beforeEach","clearAllMocks","mockReturnValue","it","TestComponent","_ref","dataManager","children","WrappedComponent","expect","getByTestId","toHaveTextContent","_ref2","testProp","concat"],"sources":["withDataManager.test.tsx"],"sourcesContent":["import React from 'react';\n\nimport {render, screen} from '@testing-library/react';\n\nimport type {DataManager} from '../../core';\nimport {useDataManager} from '../DataManagerContext';\nimport type {WithDataManagerProps} from '../withDataManager';\nimport {withDataManager} from '../withDataManager';\n\njest.mock('../DataManagerContext', () => {\n const originalModule = jest.requireActual('../DataManagerContext');\n return {\n ...originalModule,\n useDataManager: jest.fn(),\n };\n});\n\ndescribe('withDataManager', () => {\n const mockDataManager: DataManager = {\n invalidateTag: jest.fn(),\n invalidateTags: jest.fn(),\n invalidateSource: jest.fn(),\n resetSource: jest.fn(),\n invalidateParams: jest.fn(),\n resetParams: jest.fn(),\n invalidateSourceTags: jest.fn(),\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n (useDataManager as jest.Mock).mockReturnValue(mockDataManager);\n });\n\n it('should pass dataManager to wrapped component', () => {\n const TestComponent: React.FC<WithDataManagerProps> = ({dataManager}) => (\n <div data-testid=\"test-component\">\n {dataManager ? 'DataManager provided' : 'No DataManager'}\n </div>\n );\n const WrappedComponent = withDataManager(TestComponent);\n\n render(<WrappedComponent />);\n\n expect(screen.getByTestId('test-component')).toHaveTextContent('DataManager provided');\n });\n\n it('should pass through additional props', () => {\n const TestComponent: React.FC<WithDataManagerProps & {testProp: string}> = ({\n dataManager,\n testProp,\n }) => (\n <div data-testid=\"test-component\">\n {dataManager ? `DataManager provided, testProp: ${testProp}` : 'No DataManager'}\n </div>\n );\n const WrappedComponent = withDataManager(TestComponent);\n\n render(<WrappedComponent testProp=\"test value\" />);\n\n expect(screen.getByTestId('test-component')).toHaveTextContent(\n 'DataManager provided, testProp: test value',\n );\n });\n});\n"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAAQC,MAAM,EAAEC,MAAM,QAAO,wBAAwB;AAGrD,SAAQC,cAAc,QAAO,uBAAuB;AAEpD,SAAQC,eAAe,QAAO,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEnDC,IAAI,CAACC,IAAI,CAAC,uBAAuB,EAAE,YAAM;EACrC,IAAMC,cAAc,GAAGF,IAAI,CAACG,aAAa,CAAC,uBAAuB,CAAC;EAClE,OAAAC,aAAA,CAAAA,aAAA,KACOF,cAAc;IACjBN,cAAc,EAAEI,IAAI,CAACK,EAAE,CAAC;EAAC;AAEjC,CAAC,CAAC;AAEFC,QAAQ,CAAC,iBAAiB,EAAE,YAAM;EAC9B,IAAMC,eAA4B,GAAG;IACjCC,aAAa,EAAER,IAAI,CAACK,EAAE,CAAC,CAAC;IACxBI,cAAc,EAAET,IAAI,CAACK,EAAE,CAAC,CAAC;IACzBK,gBAAgB,EAAEV,IAAI,CAACK,EAAE,CAAC,CAAC;IAC3BM,WAAW,EAAEX,IAAI,CAACK,EAAE,CAAC,CAAC;IACtBO,gBAAgB,EAAEZ,IAAI,CAACK,EAAE,CAAC,CAAC;IAC3BQ,WAAW,EAAEb,IAAI,CAACK,EAAE,CAAC,CAAC;IACtBS,oBAAoB,EAAEd,IAAI,CAACK,EAAE,CAAC;EAClC,CAAC;EAEDU,UAAU,CAAC,YAAM;IACbf,IAAI,CAACgB,aAAa,CAAC,CAAC;IAEnBpB,cAAc,CAAeqB,eAAe,CAACV,eAAe,CAAC;EAClE,CAAC,CAAC;EAEFW,EAAE,CAAC,8CAA8C,EAAE,YAAM;IACrD,IAAMC,aAA6C,GAAG,SAAhDA,aAA6CA,CAAAC,IAAA;MAAA,IAAKC,WAAW,GAAAD,IAAA,CAAXC,WAAW;MAAA,oBAC/DtB,IAAA;QAAK,eAAY,gBAAgB;QAAAuB,QAAA,EAC5BD,WAAW,GAAG,sBAAsB,GAAG;MAAgB,CACvD,CAAC;IAAA,CACT;IACD,IAAME,gBAAgB,GAAG1B,eAAe,CAACsB,aAAa,CAAC;IAEvDzB,MAAM,cAACK,IAAA,CAACwB,gBAAgB,IAAE,CAAC,CAAC;IAE5BC,MAAM,CAAC7B,MAAM,CAAC8B,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAACC,iBAAiB,CAAC,sBAAsB,CAAC;EAC1F,CAAC,CAAC;EAEFR,EAAE,CAAC,sCAAsC,EAAE,YAAM;IAC7C,IAAMC,aAAkE,GAAG,SAArEA,aAAkEA,CAAAQ,KAAA;MAAA,IACpEN,WAAW,GAAAM,KAAA,CAAXN,WAAW;QACXO,QAAQ,GAAAD,KAAA,CAARC,QAAQ;MAAA,oBAER7B,IAAA;QAAK,eAAY,gBAAgB;QAAAuB,QAAA,EAC5BD,WAAW,sCAAAQ,MAAA,CAAsCD,QAAQ,IAAK;MAAgB,CAC9E,CAAC;IAAA,CACT;IACD,IAAML,gBAAgB,GAAG1B,eAAe,CAACsB,aAAa,CAAC;IAEvDzB,MAAM,cAACK,IAAA,CAACwB,gBAAgB;MAACK,QAAQ,EAAC;IAAY,CAAE,CAAC,CAAC;IAElDJ,MAAM,CAAC7B,MAAM,CAAC8B,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAACC,iBAAiB,CAC1D,4CACJ,CAAC;EACL,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","render","screen","useDataManager","withDataManager","jsx","_jsx","jest","mock","originalModule","requireActual","_objectSpread","fn","describe","mockDataManager","normalizer","undefined","optimisticUpdate","invalidateData","invalidateTag","invalidateTags","invalidateSource","resetSource","invalidateParams","resetParams","invalidateSourceTags","beforeEach","clearAllMocks","mockReturnValue","it","TestComponent","_ref","dataManager","children","WrappedComponent","expect","getByTestId","toHaveTextContent","_ref2","testProp","concat"],"sources":["withDataManager.test.tsx"],"sourcesContent":["import React from 'react';\n\nimport {render, screen} from '@testing-library/react';\n\nimport type {DataManager} from '../../core';\nimport {useDataManager} from '../DataManagerContext';\nimport type {WithDataManagerProps} from '../withDataManager';\nimport {withDataManager} from '../withDataManager';\n\njest.mock('../DataManagerContext', () => {\n const originalModule = jest.requireActual('../DataManagerContext');\n return {\n ...originalModule,\n useDataManager: jest.fn(),\n };\n});\n\ndescribe('withDataManager', () => {\n const mockDataManager: DataManager = {\n normalizer: undefined,\n optimisticUpdate: jest.fn(),\n invalidateData: jest.fn(),\n invalidateTag: jest.fn(),\n invalidateTags: jest.fn(),\n invalidateSource: jest.fn(),\n resetSource: jest.fn(),\n invalidateParams: jest.fn(),\n resetParams: jest.fn(),\n invalidateSourceTags: jest.fn(),\n };\n\n beforeEach(() => {\n jest.clearAllMocks();\n\n (useDataManager as jest.Mock).mockReturnValue(mockDataManager);\n });\n\n it('should pass dataManager to wrapped component', () => {\n const TestComponent: React.FC<WithDataManagerProps> = ({dataManager}) => (\n <div data-testid=\"test-component\">\n {dataManager ? 'DataManager provided' : 'No DataManager'}\n </div>\n );\n const WrappedComponent = withDataManager(TestComponent);\n\n render(<WrappedComponent />);\n\n expect(screen.getByTestId('test-component')).toHaveTextContent('DataManager provided');\n });\n\n it('should pass through additional props', () => {\n const TestComponent: React.FC<WithDataManagerProps & {testProp: string}> = ({\n dataManager,\n testProp,\n }) => (\n <div data-testid=\"test-component\">\n {dataManager ? `DataManager provided, testProp: ${testProp}` : 'No DataManager'}\n </div>\n );\n const WrappedComponent = withDataManager(TestComponent);\n\n render(<WrappedComponent testProp=\"test value\" />);\n\n expect(screen.getByTestId('test-component')).toHaveTextContent(\n 'DataManager provided, testProp: test value',\n );\n });\n});\n"],"mappings":";AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAAQC,MAAM,EAAEC,MAAM,QAAO,wBAAwB;AAGrD,SAAQC,cAAc,QAAO,uBAAuB;AAEpD,SAAQC,eAAe,QAAO,oBAAoB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAEnDC,IAAI,CAACC,IAAI,CAAC,uBAAuB,EAAE,YAAM;EACrC,IAAMC,cAAc,GAAGF,IAAI,CAACG,aAAa,CAAC,uBAAuB,CAAC;EAClE,OAAAC,aAAA,CAAAA,aAAA,KACOF,cAAc;IACjBN,cAAc,EAAEI,IAAI,CAACK,EAAE,CAAC;EAAC;AAEjC,CAAC,CAAC;AAEFC,QAAQ,CAAC,iBAAiB,EAAE,YAAM;EAC9B,IAAMC,eAA4B,GAAG;IACjCC,UAAU,EAAEC,SAAS;IACrBC,gBAAgB,EAAEV,IAAI,CAACK,EAAE,CAAC,CAAC;IAC3BM,cAAc,EAAEX,IAAI,CAACK,EAAE,CAAC,CAAC;IACzBO,aAAa,EAAEZ,IAAI,CAACK,EAAE,CAAC,CAAC;IACxBQ,cAAc,EAAEb,IAAI,CAACK,EAAE,CAAC,CAAC;IACzBS,gBAAgB,EAAEd,IAAI,CAACK,EAAE,CAAC,CAAC;IAC3BU,WAAW,EAAEf,IAAI,CAACK,EAAE,CAAC,CAAC;IACtBW,gBAAgB,EAAEhB,IAAI,CAACK,EAAE,CAAC,CAAC;IAC3BY,WAAW,EAAEjB,IAAI,CAACK,EAAE,CAAC,CAAC;IACtBa,oBAAoB,EAAElB,IAAI,CAACK,EAAE,CAAC;EAClC,CAAC;EAEDc,UAAU,CAAC,YAAM;IACbnB,IAAI,CAACoB,aAAa,CAAC,CAAC;IAEnBxB,cAAc,CAAeyB,eAAe,CAACd,eAAe,CAAC;EAClE,CAAC,CAAC;EAEFe,EAAE,CAAC,8CAA8C,EAAE,YAAM;IACrD,IAAMC,aAA6C,GAAG,SAAhDA,aAA6CA,CAAAC,IAAA;MAAA,IAAKC,WAAW,GAAAD,IAAA,CAAXC,WAAW;MAAA,oBAC/D1B,IAAA;QAAK,eAAY,gBAAgB;QAAA2B,QAAA,EAC5BD,WAAW,GAAG,sBAAsB,GAAG;MAAgB,CACvD,CAAC;IAAA,CACT;IACD,IAAME,gBAAgB,GAAG9B,eAAe,CAAC0B,aAAa,CAAC;IAEvD7B,MAAM,cAACK,IAAA,CAAC4B,gBAAgB,IAAE,CAAC,CAAC;IAE5BC,MAAM,CAACjC,MAAM,CAACkC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAACC,iBAAiB,CAAC,sBAAsB,CAAC;EAC1F,CAAC,CAAC;EAEFR,EAAE,CAAC,sCAAsC,EAAE,YAAM;IAC7C,IAAMC,aAAkE,GAAG,SAArEA,aAAkEA,CAAAQ,KAAA;MAAA,IACpEN,WAAW,GAAAM,KAAA,CAAXN,WAAW;QACXO,QAAQ,GAAAD,KAAA,CAARC,QAAQ;MAAA,oBAERjC,IAAA;QAAK,eAAY,gBAAgB;QAAA2B,QAAA,EAC5BD,WAAW,sCAAAQ,MAAA,CAAsCD,QAAQ,IAAK;MAAgB,CAC9E,CAAC;IAAA,CACT;IACD,IAAML,gBAAgB,GAAG9B,eAAe,CAAC0B,aAAa,CAAC;IAEvD7B,MAAM,cAACK,IAAA,CAAC4B,gBAAgB;MAACK,QAAQ,EAAC;IAAY,CAAE,CAAC,CAAC;IAElDJ,MAAM,CAACjC,MAAM,CAACkC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAACC,iBAAiB,CAC1D,4CACJ,CAAC;EACL,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
@@ -1,4 +1,6 @@
1
1
  export { DataManagerContext, useDataManager } from './DataManagerContext';
2
+ export { DataManagerProvider } from './DataManagerProvider';
3
+ export type { DataManagerProviderProps } from './DataManagerProvider';
2
4
  export type { WithDataManagerProps } from './withDataManager';
3
5
  export { withDataManager } from './withDataManager';
4
6
  export type { ErrorAction, ErrorViewProps } from './components/types';
@@ -1,4 +1,5 @@
1
1
  export { DataManagerContext, useDataManager } from './DataManagerContext';
2
+ export { DataManagerProvider } from './DataManagerProvider';
2
3
  export { withDataManager } from './withDataManager';
3
4
  export * from './components/DataLoader';
4
5
  export * from './components/DataInfiniteLoader';
@@ -1 +1 @@
1
- {"version":3,"names":["DataManagerContext","useDataManager","withDataManager"],"sources":["index.ts"],"sourcesContent":["export {DataManagerContext, useDataManager} from './DataManagerContext';\n\nexport type {WithDataManagerProps} from './withDataManager';\nexport {withDataManager} from './withDataManager';\n\nexport type {ErrorAction, ErrorViewProps} from './components/types';\nexport * from './components/DataLoader';\nexport * from './components/DataInfiniteLoader';\n"],"mappings":"AAAA,SAAQA,kBAAkB,EAAEC,cAAc,QAAO,sBAAsB;AAGvE,SAAQC,eAAe,QAAO,mBAAmB;AAGjD,cAAc,yBAAyB;AACvC,cAAc,iCAAiC","ignoreList":[]}
1
+ {"version":3,"names":["DataManagerContext","useDataManager","DataManagerProvider","withDataManager"],"sources":["index.ts"],"sourcesContent":["export {DataManagerContext, useDataManager} from './DataManagerContext';\nexport {DataManagerProvider} from './DataManagerProvider';\nexport type {DataManagerProviderProps} from './DataManagerProvider';\n\nexport type {WithDataManagerProps} from './withDataManager';\nexport {withDataManager} from './withDataManager';\n\nexport type {ErrorAction, ErrorViewProps} from './components/types';\nexport * from './components/DataLoader';\nexport * from './components/DataInfiniteLoader';\n"],"mappings":"AAAA,SAAQA,kBAAkB,EAAEC,cAAc,QAAO,sBAAsB;AACvE,SAAQC,mBAAmB,QAAO,uBAAuB;AAIzD,SAAQC,eAAe,QAAO,mBAAmB;AAGjD,cAAc,yBAAyB;AACvC,cAAc,iCAAiC","ignoreList":[]}
@@ -1,11 +1,21 @@
1
- import type { InvalidateQueryFilters, QueryClientConfig } from '@tanstack/react-query';
1
+ import type { Data } from '@normy/core';
2
+ import type { InvalidateQueryFilters, QueryClientConfig, QueryKey } from '@tanstack/react-query';
2
3
  import { QueryClient } from '@tanstack/react-query';
3
- import { type AnyDataSource, type DataManager, type DataSourceParams, type DataSourceTag } from '../core';
4
+ import { type AnyDataSource, type DataManager, type DataSourceParams, type DataSourceTag, type Normalizer, type NormalizerConfig } from '../core';
4
5
  import type { InvalidateOptions, InvalidateRepeatOptions } from '../core/types/DataManagerOptions';
5
- export type ClientDataManagerConfig = QueryClientConfig;
6
+ import type { QueryNormalizer } from './types/normalizer';
7
+ export interface ClientDataManagerConfig extends QueryClientConfig {
8
+ normalizerConfig?: NormalizerConfig | boolean;
9
+ }
6
10
  export declare class ClientDataManager implements DataManager {
7
11
  readonly queryClient: QueryClient;
12
+ readonly normalizer?: Normalizer | undefined;
13
+ readonly queryNormalizer?: QueryNormalizer | undefined;
14
+ readonly normalizerConfig?: NormalizerConfig | boolean;
8
15
  constructor(config?: ClientDataManagerConfig);
16
+ optimisticUpdate(mutationData: Data, queryKey?: QueryKey, queryData?: Data): void;
17
+ invalidateData(data: Data, queryKey?: QueryKey): void;
18
+ update(data: Data): void;
9
19
  invalidateTag(tag: DataSourceTag, invalidateOptions?: InvalidateOptions): Promise<void>;
10
20
  invalidateTags(tags: DataSourceTag[], invalidateOptions?: InvalidateOptions): Promise<void>;
11
21
  invalidateSource<TDataSource extends AnyDataSource>(dataSource: TDataSource, invalidateOptions?: InvalidateOptions): Promise<void>;
@@ -15,4 +25,7 @@ export declare class ClientDataManager implements DataManager {
15
25
  invalidateSourceTags<TDataSource extends AnyDataSource>(dataSource: TDataSource, params: DataSourceParams<TDataSource>, invalidateOptions?: InvalidateOptions): Promise<void>;
16
26
  protected invalidateQueries(filters: InvalidateQueryFilters, invalidateOptions?: InvalidateOptions): Promise<void>;
17
27
  protected repeatInvalidate(invalidate: () => Promise<void>, repeat?: InvalidateRepeatOptions): void;
28
+ private createNormalize;
29
+ private invalidateQuery;
30
+ private optimisticUpdateQuery;
18
31
  }
@@ -1,14 +1,25 @@
1
+ import _typeof from "@babel/runtime/helpers/typeof";
1
2
  import _objectSpread from "@babel/runtime/helpers/objectSpread2";
2
3
  import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
4
  import _createClass from "@babel/runtime/helpers/createClass";
5
+ import { createNormalizer } from '@normy/core';
4
6
  import { QueryClient } from '@tanstack/react-query';
5
7
  import { composeFullKey, hasTag } from '../core';
8
+ import { checkMutationObjectsKeys } from './utils/checkMutationObjectsKeys';
9
+ import { createQueryNormalizer } from './utils/normalize';
10
+ import { parseQueryKey } from './utils/parseQueryKey';
6
11
  export var ClientDataManager = /*#__PURE__*/function () {
7
12
  function ClientDataManager() {
8
- var _config$defaultOption, _config$defaultOption2;
13
+ var _config$defaultOption,
14
+ _config$defaultOption2,
15
+ _this = this;
9
16
  var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
10
17
  _classCallCheck(this, ClientDataManager);
11
18
  this.queryClient = void 0;
19
+ this.normalizer = void 0;
20
+ this.queryNormalizer = void 0;
21
+ this.normalizerConfig = void 0;
22
+ this.normalizerConfig = config.normalizerConfig;
12
23
  this.queryClient = new QueryClient(_objectSpread(_objectSpread({}, config), {}, {
13
24
  defaultOptions: _objectSpread(_objectSpread({}, config.defaultOptions), {}, {
14
25
  queries: _objectSpread({
@@ -19,13 +30,103 @@ export var ClientDataManager = /*#__PURE__*/function () {
19
30
  }, (_config$defaultOption2 = config.defaultOptions) === null || _config$defaultOption2 === void 0 ? void 0 : _config$defaultOption2.mutations)
20
31
  })
21
32
  }));
33
+ this.normalizer = this.createNormalize(config.normalizerConfig);
34
+ this.queryNormalizer = createQueryNormalizer(this.normalizer, this.queryClient, config.normalizerConfig, function (data) {
35
+ return _this.optimisticUpdate(data);
36
+ }, function (data) {
37
+ return _this.invalidateData(data);
38
+ });
22
39
  }
23
40
  return _createClass(ClientDataManager, [{
41
+ key: "optimisticUpdate",
42
+ value: function optimisticUpdate(mutationData, queryKey, queryData) {
43
+ var _this2 = this;
44
+ if (!this.normalizer) {
45
+ return;
46
+ }
47
+ if (queryKey && queryData) {
48
+ this.optimisticUpdateQuery(queryKey, queryData);
49
+ return;
50
+ }
51
+ var queriesToUpdate = this.normalizer.getQueriesToUpdate(mutationData);
52
+ queriesToUpdate.forEach(function (query) {
53
+ var parsedQueryKey = parseQueryKey(query.queryKey);
54
+ _this2.optimisticUpdateQuery(parsedQueryKey, query.data);
55
+ });
56
+ }
57
+ }, {
58
+ key: "invalidateData",
59
+ value: function invalidateData(data, queryKey) {
60
+ var _this3 = this;
61
+ if (!this.normalizer) {
62
+ return;
63
+ }
64
+ if (queryKey) {
65
+ this.invalidateQuery(queryKey);
66
+ return;
67
+ }
68
+ var queriesToUpdate = this.normalizer.getQueriesToUpdate(data);
69
+ queriesToUpdate.forEach(function (query) {
70
+ var parsedQueryKey = parseQueryKey(query.queryKey);
71
+ _this3.invalidateQuery(parsedQueryKey);
72
+ });
73
+ }
74
+ }, {
75
+ key: "update",
76
+ value: function update(data) {
77
+ var _this4 = this;
78
+ if (!this.normalizer) {
79
+ return;
80
+ }
81
+ var _ref = _typeof(this.normalizerConfig) === 'object' ? this.normalizerConfig : {
82
+ optimistic: false,
83
+ invalidate: false
84
+ },
85
+ globalOptimistic = _ref.optimistic,
86
+ globalInvalidate = _ref.invalidate;
87
+ var queriesToUpdate = this.normalizer.getQueriesToUpdate(data);
88
+ if (queriesToUpdate.length === 0) {
89
+ var completeness = checkMutationObjectsKeys(data, this.normalizer);
90
+ var dependentQueries = this.normalizer.getDependentQueries(data);
91
+ if (completeness.needsRefetch) {
92
+ dependentQueries.forEach(function (queryKeyString) {
93
+ var _cachedQuery$meta;
94
+ var parsedQueryKey = parseQueryKey(queryKeyString);
95
+ var cachedQuery = _this4.queryClient.getQueryCache().find({
96
+ queryKey: parsedQueryKey
97
+ });
98
+ var _ref2 = (_cachedQuery$meta = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.meta) !== null && _cachedQuery$meta !== void 0 ? _cachedQuery$meta : {},
99
+ invalidate = _ref2.invalidate;
100
+ if (invalidate === true || invalidate === undefined && globalInvalidate === true) {
101
+ _this4.invalidateData(data, parsedQueryKey);
102
+ }
103
+ });
104
+ }
105
+ return;
106
+ }
107
+ queriesToUpdate.forEach(function (query) {
108
+ var _cachedQuery$meta2;
109
+ var parsedQueryKey = parseQueryKey(query.queryKey);
110
+ var cachedQuery = _this4.queryClient.getQueryCache().find({
111
+ queryKey: parsedQueryKey
112
+ });
113
+ var _ref3 = (_cachedQuery$meta2 = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.meta) !== null && _cachedQuery$meta2 !== void 0 ? _cachedQuery$meta2 : {},
114
+ optimistic = _ref3.optimistic,
115
+ invalidate = _ref3.invalidate;
116
+ if (optimistic === true || optimistic === undefined && globalOptimistic === true) {
117
+ _this4.optimisticUpdate(data, parsedQueryKey, query.data);
118
+ }
119
+ if (invalidate === true || invalidate === undefined && globalInvalidate === true) {
120
+ _this4.invalidateData(data, parsedQueryKey);
121
+ }
122
+ });
123
+ }
124
+ }, {
24
125
  key: "invalidateTag",
25
126
  value: function invalidateTag(tag, invalidateOptions) {
26
127
  return this.invalidateQueries({
27
- predicate: function predicate(_ref) {
28
- var queryKey = _ref.queryKey;
128
+ predicate: function predicate(_ref4) {
129
+ var queryKey = _ref4.queryKey;
29
130
  return hasTag(queryKey, tag);
30
131
  }
31
132
  }, invalidateOptions);
@@ -34,8 +135,8 @@ export var ClientDataManager = /*#__PURE__*/function () {
34
135
  key: "invalidateTags",
35
136
  value: function invalidateTags(tags, invalidateOptions) {
36
137
  return this.invalidateQueries({
37
- predicate: function predicate(_ref2) {
38
- var queryKey = _ref2.queryKey;
138
+ predicate: function predicate(_ref5) {
139
+ var queryKey = _ref5.queryKey;
39
140
  return tags.every(function (tag) {
40
141
  return hasTag(queryKey, tag);
41
142
  });
@@ -85,9 +186,9 @@ export var ClientDataManager = /*#__PURE__*/function () {
85
186
  }, {
86
187
  key: "invalidateQueries",
87
188
  value: function invalidateQueries(filters, invalidateOptions) {
88
- var _this = this;
189
+ var _this5 = this;
89
190
  var invalidate = function invalidate() {
90
- return _this.queryClient.invalidateQueries(filters);
191
+ return _this5.queryClient.invalidateQueries(filters);
91
192
  };
92
193
  this.repeatInvalidate(invalidate, invalidateOptions === null || invalidateOptions === void 0 ? void 0 : invalidateOptions.repeat);
93
194
  return invalidate();
@@ -102,6 +203,50 @@ export var ClientDataManager = /*#__PURE__*/function () {
102
203
  setTimeout(invalidate, repeat.interval * i);
103
204
  }
104
205
  }
206
+ }, {
207
+ key: "createNormalize",
208
+ value: function createNormalize(config) {
209
+ if (!config) {
210
+ return undefined;
211
+ }
212
+ if (config === true) {
213
+ return createNormalizer({});
214
+ }
215
+ return createNormalizer(config);
216
+ }
217
+ }, {
218
+ key: "invalidateQuery",
219
+ value: function invalidateQuery(queryKey) {
220
+ var cachedQuery = this.queryClient.getQueryCache().find({
221
+ queryKey: queryKey
222
+ });
223
+ if ((cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.fetchStatus) !== 'fetching' && (cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.status) === 'success' && !(cachedQuery !== null && cachedQuery !== void 0 && cachedQuery.state.isInvalidated)) {
224
+ this.queryClient.invalidateQueries({
225
+ queryKey: queryKey
226
+ });
227
+ }
228
+ }
229
+ }, {
230
+ key: "optimisticUpdateQuery",
231
+ value: function optimisticUpdateQuery(queryKey, queryData) {
232
+ var cachedQuery = this.queryClient.getQueryCache().find({
233
+ queryKey: queryKey
234
+ });
235
+ var dataUpdatedAt = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.dataUpdatedAt;
236
+ var isInvalidated = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.isInvalidated;
237
+ var error = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.error;
238
+ var status = cachedQuery === null || cachedQuery === void 0 ? void 0 : cachedQuery.state.status;
239
+ this.queryClient.setQueryData(queryKey, function () {
240
+ return queryData;
241
+ }, {
242
+ updatedAt: dataUpdatedAt
243
+ });
244
+ cachedQuery === null || cachedQuery === void 0 || cachedQuery.setState({
245
+ isInvalidated: isInvalidated,
246
+ error: error,
247
+ status: status
248
+ });
249
+ }
105
250
  }]);
106
251
  }();
107
252
  // #sourceMappingURL=ClientDataManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["QueryClient","composeFullKey","hasTag","ClientDataManager","_config$defaultOption","_config$defaultOption2","config","arguments","length","undefined","_classCallCheck","queryClient","_objectSpread","defaultOptions","queries","networkMode","mutations","_createClass","key","value","invalidateTag","tag","invalidateOptions","invalidateQueries","predicate","_ref","queryKey","invalidateTags","tags","_ref2","every","invalidateSource","dataSource","name","resetSource","resetQueries","invalidateParams","params","exact","resetParams","invalidateSourceTags","slice","filters","_this","invalidate","repeatInvalidate","repeat","i","count","setTimeout","interval"],"sources":["ClientDataManager.ts"],"sourcesContent":["import type {InvalidateQueryFilters, QueryClientConfig} from '@tanstack/react-query';\nimport {QueryClient} from '@tanstack/react-query';\n\nimport {\n type AnyDataSource,\n type DataManager,\n type DataSourceParams,\n type DataSourceTag,\n composeFullKey,\n hasTag,\n} from '../core';\nimport type {InvalidateOptions, InvalidateRepeatOptions} from '../core/types/DataManagerOptions';\n\nexport type ClientDataManagerConfig = QueryClientConfig;\n\nexport class ClientDataManager implements DataManager {\n readonly queryClient: QueryClient;\n\n constructor(config: ClientDataManagerConfig = {}) {\n this.queryClient = new QueryClient({\n ...config,\n defaultOptions: {\n ...config.defaultOptions,\n queries: {\n networkMode: 'always',\n ...config.defaultOptions?.queries,\n },\n mutations: {\n networkMode: 'always',\n ...config.defaultOptions?.mutations,\n },\n },\n });\n }\n\n invalidateTag(tag: DataSourceTag, invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => hasTag(queryKey, tag),\n },\n invalidateOptions,\n );\n }\n\n invalidateTags(tags: DataSourceTag[], invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => tags.every((tag) => hasTag(queryKey, tag)),\n },\n invalidateOptions,\n );\n }\n\n invalidateSource<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // First element is a data source name\n queryKey: [dataSource.name],\n },\n invalidateOptions,\n );\n }\n\n resetSource<TDataSource extends AnyDataSource>(dataSource: TDataSource) {\n return this.queryClient.resetQueries({\n // First element is a data source name\n queryKey: [dataSource.name],\n });\n }\n\n invalidateParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n },\n invalidateOptions,\n );\n }\n\n resetParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n ) {\n return this.queryClient.resetQueries({\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n });\n }\n\n invalidateSourceTags<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // Last element is a full key\n queryKey: composeFullKey(dataSource, params).slice(0, -1),\n },\n invalidateOptions,\n );\n }\n\n protected invalidateQueries(\n filters: InvalidateQueryFilters,\n invalidateOptions?: InvalidateOptions,\n ) {\n const invalidate = () => this.queryClient.invalidateQueries(filters);\n\n this.repeatInvalidate(invalidate, invalidateOptions?.repeat);\n\n return invalidate();\n }\n\n protected repeatInvalidate(invalidate: () => Promise<void>, repeat?: InvalidateRepeatOptions) {\n if (!repeat) {\n return;\n }\n\n for (let i = 1; i <= repeat.count; i++) {\n setTimeout(invalidate, repeat.interval * i);\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["createNormalizer","QueryClient","composeFullKey","hasTag","checkMutationObjectsKeys","createQueryNormalizer","parseQueryKey","ClientDataManager","_config$defaultOption","_config$defaultOption2","_this","config","arguments","length","undefined","_classCallCheck","queryClient","normalizer","queryNormalizer","normalizerConfig","_objectSpread","defaultOptions","queries","networkMode","mutations","createNormalize","data","optimisticUpdate","invalidateData","_createClass","key","value","mutationData","queryKey","queryData","_this2","optimisticUpdateQuery","queriesToUpdate","getQueriesToUpdate","forEach","query","parsedQueryKey","_this3","invalidateQuery","update","_this4","_ref","_typeof","optimistic","invalidate","globalOptimistic","globalInvalidate","completeness","dependentQueries","getDependentQueries","needsRefetch","queryKeyString","_cachedQuery$meta","cachedQuery","getQueryCache","find","_ref2","meta","_cachedQuery$meta2","_ref3","invalidateTag","tag","invalidateOptions","invalidateQueries","predicate","_ref4","invalidateTags","tags","_ref5","every","invalidateSource","dataSource","name","resetSource","resetQueries","invalidateParams","params","exact","resetParams","invalidateSourceTags","slice","filters","_this5","repeatInvalidate","repeat","i","count","setTimeout","interval","state","fetchStatus","status","isInvalidated","dataUpdatedAt","error","setQueryData","updatedAt","setState"],"sources":["ClientDataManager.ts"],"sourcesContent":["import type {Data} from '@normy/core';\nimport {createNormalizer} from '@normy/core';\nimport type {InvalidateQueryFilters, QueryClientConfig, QueryKey} from '@tanstack/react-query';\nimport {QueryClient} from '@tanstack/react-query';\n\nimport {\n type AnyDataSource,\n type DataManager,\n type DataSourceParams,\n type DataSourceTag,\n type Normalizer,\n type NormalizerConfig,\n composeFullKey,\n hasTag,\n} from '../core';\nimport type {InvalidateOptions, InvalidateRepeatOptions} from '../core/types/DataManagerOptions';\n\nimport type {QueryNormalizer} from './types/normalizer';\nimport {checkMutationObjectsKeys} from './utils/checkMutationObjectsKeys';\nimport {createQueryNormalizer} from './utils/normalize';\nimport {parseQueryKey} from './utils/parseQueryKey';\n\nexport interface ClientDataManagerConfig extends QueryClientConfig {\n normalizerConfig?: NormalizerConfig | boolean;\n}\n\nexport class ClientDataManager implements DataManager {\n readonly queryClient: QueryClient;\n readonly normalizer?: Normalizer | undefined;\n readonly queryNormalizer?: QueryNormalizer | undefined;\n readonly normalizerConfig?: NormalizerConfig | boolean;\n\n constructor(config: ClientDataManagerConfig = {}) {\n this.normalizerConfig = config.normalizerConfig;\n\n this.queryClient = new QueryClient({\n ...config,\n defaultOptions: {\n ...config.defaultOptions,\n queries: {\n networkMode: 'always',\n ...config.defaultOptions?.queries,\n },\n mutations: {\n networkMode: 'always',\n ...config.defaultOptions?.mutations,\n },\n },\n });\n\n this.normalizer = this.createNormalize(config.normalizerConfig);\n this.queryNormalizer = createQueryNormalizer(\n this.normalizer,\n this.queryClient,\n config.normalizerConfig,\n (data) => this.optimisticUpdate(data),\n (data) => this.invalidateData(data),\n );\n }\n\n optimisticUpdate(mutationData: Data, queryKey?: QueryKey, queryData?: Data) {\n if (!this.normalizer) {\n return;\n }\n\n if (queryKey && queryData) {\n this.optimisticUpdateQuery(queryKey, queryData);\n\n return;\n }\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(mutationData);\n\n queriesToUpdate.forEach((query) => {\n const parsedQueryKey = parseQueryKey(query.queryKey);\n\n this.optimisticUpdateQuery(parsedQueryKey, query.data);\n });\n }\n\n invalidateData(data: Data, queryKey?: QueryKey): void {\n if (!this.normalizer) {\n return;\n }\n\n if (queryKey) {\n this.invalidateQuery(queryKey);\n\n return;\n }\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(data);\n\n queriesToUpdate.forEach((query) => {\n const parsedQueryKey = parseQueryKey(query.queryKey);\n\n this.invalidateQuery(parsedQueryKey);\n });\n }\n\n update(data: Data) {\n if (!this.normalizer) {\n return;\n }\n\n const {optimistic: globalOptimistic, invalidate: globalInvalidate} =\n typeof this.normalizerConfig === 'object'\n ? this.normalizerConfig\n : {optimistic: false, invalidate: false};\n\n const queriesToUpdate = this.normalizer.getQueriesToUpdate(data);\n\n if (queriesToUpdate.length === 0) {\n const completeness = checkMutationObjectsKeys(data, this.normalizer);\n const dependentQueries = this.normalizer.getDependentQueries(data);\n\n if (completeness.needsRefetch) {\n dependentQueries.forEach((queryKeyString) => {\n const parsedQueryKey = parseQueryKey(queryKeyString);\n\n const cachedQuery = this.queryClient\n .getQueryCache()\n .find({queryKey: parsedQueryKey});\n\n const {invalidate} = cachedQuery?.meta ?? {};\n\n if (\n invalidate === true ||\n (invalidate === undefined && globalInvalidate === true)\n ) {\n this.invalidateData(data, parsedQueryKey);\n }\n });\n }\n\n return;\n }\n\n queriesToUpdate.forEach((query) => {\n const parsedQueryKey = parseQueryKey(query.queryKey);\n\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey: parsedQueryKey});\n\n const {optimistic, invalidate} = cachedQuery?.meta ?? {};\n\n if (optimistic === true || (optimistic === undefined && globalOptimistic === true)) {\n this.optimisticUpdate(data, parsedQueryKey, query.data);\n }\n\n if (invalidate === true || (invalidate === undefined && globalInvalidate === true)) {\n this.invalidateData(data, parsedQueryKey);\n }\n });\n }\n\n invalidateTag(tag: DataSourceTag, invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => hasTag(queryKey, tag),\n },\n invalidateOptions,\n );\n }\n\n invalidateTags(tags: DataSourceTag[], invalidateOptions?: InvalidateOptions) {\n return this.invalidateQueries(\n {\n predicate: ({queryKey}) => tags.every((tag) => hasTag(queryKey, tag)),\n },\n invalidateOptions,\n );\n }\n\n invalidateSource<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // First element is a data source name\n queryKey: [dataSource.name],\n },\n invalidateOptions,\n );\n }\n\n resetSource<TDataSource extends AnyDataSource>(dataSource: TDataSource) {\n return this.queryClient.resetQueries({\n // First element is a data source name\n queryKey: [dataSource.name],\n });\n }\n\n invalidateParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n },\n invalidateOptions,\n );\n }\n\n resetParams<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n ) {\n return this.queryClient.resetQueries({\n queryKey: composeFullKey(dataSource, params),\n exact: true,\n });\n }\n\n invalidateSourceTags<TDataSource extends AnyDataSource>(\n dataSource: TDataSource,\n params: DataSourceParams<TDataSource>,\n invalidateOptions?: InvalidateOptions,\n ) {\n return this.invalidateQueries(\n {\n // Last element is a full key\n queryKey: composeFullKey(dataSource, params).slice(0, -1),\n },\n invalidateOptions,\n );\n }\n\n protected invalidateQueries(\n filters: InvalidateQueryFilters,\n invalidateOptions?: InvalidateOptions,\n ) {\n const invalidate = () => this.queryClient.invalidateQueries(filters);\n\n this.repeatInvalidate(invalidate, invalidateOptions?.repeat);\n\n return invalidate();\n }\n\n protected repeatInvalidate(invalidate: () => Promise<void>, repeat?: InvalidateRepeatOptions) {\n if (!repeat) {\n return;\n }\n\n for (let i = 1; i <= repeat.count; i++) {\n setTimeout(invalidate, repeat.interval * i);\n }\n }\n\n private createNormalize(\n config: boolean | NormalizerConfig | undefined,\n ): Normalizer | undefined {\n if (!config) {\n return undefined;\n }\n\n if (config === true) {\n return createNormalizer({});\n }\n\n return createNormalizer(config);\n }\n\n private invalidateQuery(queryKey: QueryKey) {\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey});\n\n if (\n cachedQuery?.state.fetchStatus !== 'fetching' &&\n cachedQuery?.state.status === 'success' &&\n !cachedQuery?.state.isInvalidated\n ) {\n this.queryClient.invalidateQueries({queryKey});\n }\n }\n\n private optimisticUpdateQuery(queryKey: QueryKey, queryData: Data) {\n const cachedQuery = this.queryClient.getQueryCache().find({queryKey});\n\n const dataUpdatedAt = cachedQuery?.state.dataUpdatedAt;\n const isInvalidated = cachedQuery?.state.isInvalidated;\n const error = cachedQuery?.state.error;\n const status = cachedQuery?.state.status;\n\n this.queryClient.setQueryData(queryKey, () => queryData, {\n updatedAt: dataUpdatedAt,\n });\n\n cachedQuery?.setState({isInvalidated, error, status});\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { ClientDataManager } from './ClientDataManager';
3
+ export interface DataSourceProviderProps {
4
+ dataManager: ClientDataManager;
5
+ children: React.ReactNode;
6
+ }
7
+ export declare const DataSourceProvider: React.FC<DataSourceProviderProps>;
@@ -0,0 +1,28 @@
1
+ import React from 'react';
2
+ import { QueryClientProvider } from '@tanstack/react-query';
3
+ import { DataManagerProvider } from '../react/DataManagerProvider';
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ export var DataSourceProvider = function DataSourceProvider(_ref) {
6
+ var children = _ref.children,
7
+ dataManager = _ref.dataManager;
8
+ React.useEffect(function () {
9
+ if (!dataManager.queryNormalizer) {
10
+ return undefined;
11
+ }
12
+ dataManager.queryNormalizer.subscribe();
13
+ return function () {
14
+ var _dataManager$queryNor, _dataManager$queryNor2;
15
+ (_dataManager$queryNor = dataManager.queryNormalizer) === null || _dataManager$queryNor === void 0 || _dataManager$queryNor.unsubscribe();
16
+ (_dataManager$queryNor2 = dataManager.queryNormalizer) === null || _dataManager$queryNor2 === void 0 || _dataManager$queryNor2.clear();
17
+ };
18
+ // eslint-disable-next-line react-hooks/exhaustive-deps
19
+ }, []);
20
+ return /*#__PURE__*/_jsx(QueryClientProvider, {
21
+ client: dataManager.queryClient,
22
+ children: /*#__PURE__*/_jsx(DataManagerProvider, {
23
+ dataManager: dataManager,
24
+ children: children
25
+ })
26
+ });
27
+ };
28
+ // #sourceMappingURL=DataSourceProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["React","QueryClientProvider","DataManagerProvider","jsx","_jsx","DataSourceProvider","_ref","children","dataManager","useEffect","queryNormalizer","undefined","subscribe","_dataManager$queryNor","_dataManager$queryNor2","unsubscribe","clear","client","queryClient"],"sources":["DataSourceProvider.tsx"],"sourcesContent":["import React from 'react';\n\nimport {QueryClientProvider} from '@tanstack/react-query';\n\nimport {DataManagerProvider} from '../react/DataManagerProvider';\n\nimport type {ClientDataManager} from './ClientDataManager';\n\nexport interface DataSourceProviderProps {\n dataManager: ClientDataManager;\n children: React.ReactNode;\n}\n\nexport const DataSourceProvider: React.FC<DataSourceProviderProps> = ({children, dataManager}) => {\n React.useEffect(() => {\n if (!dataManager.queryNormalizer) {\n return undefined;\n }\n\n dataManager.queryNormalizer.subscribe();\n\n return () => {\n dataManager.queryNormalizer?.unsubscribe();\n dataManager.queryNormalizer?.clear();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <QueryClientProvider client={dataManager.queryClient}>\n <DataManagerProvider dataManager={dataManager}>{children}</DataManagerProvider>\n </QueryClientProvider>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AAEzB,SAAQC,mBAAmB,QAAO,uBAAuB;AAEzD,SAAQC,mBAAmB,QAAO,8BAA8B;AAAC,SAAAC,GAAA,IAAAC,IAAA;AASjE,OAAO,IAAMC,kBAAqD,GAAG,SAAxDA,kBAAqDA,CAAAC,IAAA,EAAgC;EAAA,IAA3BC,QAAQ,GAAAD,IAAA,CAARC,QAAQ;IAAEC,WAAW,GAAAF,IAAA,CAAXE,WAAW;EACxFR,KAAK,CAACS,SAAS,CAAC,YAAM;IAClB,IAAI,CAACD,WAAW,CAACE,eAAe,EAAE;MAC9B,OAAOC,SAAS;IACpB;IAEAH,WAAW,CAACE,eAAe,CAACE,SAAS,CAAC,CAAC;IAEvC,OAAO,YAAM;MAAA,IAAAC,qBAAA,EAAAC,sBAAA;MACT,CAAAD,qBAAA,GAAAL,WAAW,CAACE,eAAe,cAAAG,qBAAA,eAA3BA,qBAAA,CAA6BE,WAAW,CAAC,CAAC;MAC1C,CAAAD,sBAAA,GAAAN,WAAW,CAACE,eAAe,cAAAI,sBAAA,eAA3BA,sBAAA,CAA6BE,KAAK,CAAC,CAAC;IACxC,CAAC;IACD;EACJ,CAAC,EAAE,EAAE,CAAC;EAEN,oBACIZ,IAAA,CAACH,mBAAmB;IAACgB,MAAM,EAAET,WAAW,CAACU,WAAY;IAAAX,QAAA,eACjDH,IAAA,CAACF,mBAAmB;MAACM,WAAW,EAAEA,WAAY;MAAAD,QAAA,EAAEA;IAAQ,CAAsB;EAAC,CAC9D,CAAC;AAE9B,CAAC","ignoreList":[]}
@@ -0,0 +1,174 @@
1
+ import _typeof from "@babel/runtime/helpers/typeof";
2
+ import { ClientDataManager } from '../ClientDataManager';
3
+ describe('QueryNormalizer API', function () {
4
+ var dataManager;
5
+ beforeEach(function () {
6
+ dataManager = new ClientDataManager({
7
+ defaultOptions: {
8
+ queries: {
9
+ retry: false
10
+ },
11
+ mutations: {
12
+ retry: false
13
+ }
14
+ },
15
+ normalizerConfig: {
16
+ devLogging: false
17
+ }
18
+ });
19
+ });
20
+ afterEach(function () {
21
+ dataManager.queryClient.clear();
22
+ });
23
+ it('should create queryNormalizer with required methods', function () {
24
+ var _dataManager$queryNor, _dataManager$queryNor2, _dataManager$queryNor3, _dataManager$queryNor4, _dataManager$queryNor5, _dataManager$queryNor6, _dataManager$queryNor7, _dataManager$queryNor8, _dataManager$queryNor9;
25
+ expect(dataManager.queryNormalizer).toBeDefined();
26
+ expect((_dataManager$queryNor = dataManager.queryNormalizer) === null || _dataManager$queryNor === void 0 ? void 0 : _dataManager$queryNor.getNormalizedData).toBeDefined();
27
+ expect((_dataManager$queryNor2 = dataManager.queryNormalizer) === null || _dataManager$queryNor2 === void 0 ? void 0 : _dataManager$queryNor2.setNormalizedData).toBeDefined();
28
+ expect((_dataManager$queryNor3 = dataManager.queryNormalizer) === null || _dataManager$queryNor3 === void 0 ? void 0 : _dataManager$queryNor3.clear).toBeDefined();
29
+ expect((_dataManager$queryNor4 = dataManager.queryNormalizer) === null || _dataManager$queryNor4 === void 0 ? void 0 : _dataManager$queryNor4.getObjectById).toBeDefined();
30
+ expect((_dataManager$queryNor5 = dataManager.queryNormalizer) === null || _dataManager$queryNor5 === void 0 ? void 0 : _dataManager$queryNor5.getQueryFragment).toBeDefined();
31
+ expect((_dataManager$queryNor6 = dataManager.queryNormalizer) === null || _dataManager$queryNor6 === void 0 ? void 0 : _dataManager$queryNor6.getDependentQueries).toBeDefined();
32
+ expect((_dataManager$queryNor7 = dataManager.queryNormalizer) === null || _dataManager$queryNor7 === void 0 ? void 0 : _dataManager$queryNor7.getDependentQueriesByIds).toBeDefined();
33
+ expect((_dataManager$queryNor8 = dataManager.queryNormalizer) === null || _dataManager$queryNor8 === void 0 ? void 0 : _dataManager$queryNor8.subscribe).toBeDefined();
34
+ expect((_dataManager$queryNor9 = dataManager.queryNormalizer) === null || _dataManager$queryNor9 === void 0 ? void 0 : _dataManager$queryNor9.unsubscribe).toBeDefined();
35
+ });
36
+ it('getNormalizedData should return normalized data', function () {
37
+ expect(dataManager.queryNormalizer).toBeDefined();
38
+ var data = dataManager.queryNormalizer.getNormalizedData();
39
+ expect(data).toBeDefined();
40
+ expect(data.objects).toBeDefined();
41
+ expect(data.queries).toBeDefined();
42
+ });
43
+ it('setNormalizedData should update queries', function () {
44
+ expect(dataManager.normalizer).toBeDefined();
45
+ expect(dataManager.queryNormalizer).toBeDefined();
46
+ var queryKey = ['users'];
47
+ dataManager.queryClient.setQueryData(queryKey, [{
48
+ id: '1',
49
+ name: 'Old'
50
+ }]);
51
+ dataManager.normalizer.setQuery(JSON.stringify(queryKey), [{
52
+ id: '1',
53
+ name: 'Old'
54
+ }]);
55
+ dataManager.queryNormalizer.setNormalizedData({
56
+ id: '1',
57
+ name: 'New'
58
+ });
59
+ var data = dataManager.queryClient.getQueryData(queryKey);
60
+ expect(data[0].name).toBe('New');
61
+ });
62
+ it('clear should clear normalized data', function () {
63
+ expect(dataManager.normalizer).toBeDefined();
64
+ expect(dataManager.queryNormalizer).toBeDefined();
65
+ var queryKey = ['users'];
66
+ dataManager.queryClient.setQueryData(queryKey, [{
67
+ id: '1',
68
+ name: 'User'
69
+ }]);
70
+ dataManager.normalizer.setQuery(JSON.stringify(queryKey), [{
71
+ id: '1',
72
+ name: 'User'
73
+ }]);
74
+ dataManager.queryNormalizer.clear();
75
+ var data = dataManager.queryNormalizer.getNormalizedData();
76
+ expect(Object.keys(data.objects)).toHaveLength(0);
77
+ });
78
+ it('getObjectById should return object by ID', function () {
79
+ expect(dataManager.normalizer).toBeDefined();
80
+ expect(dataManager.queryNormalizer).toBeDefined();
81
+ var queryKey = ['users'];
82
+ var userData = [{
83
+ id: '1',
84
+ name: 'User 1'
85
+ }];
86
+
87
+ // Add to normalizer
88
+ dataManager.normalizer.setQuery(JSON.stringify(queryKey), userData);
89
+
90
+ // Get normalized data
91
+ var normalized = dataManager.queryNormalizer.getNormalizedData();
92
+ expect(Object.keys(normalized.objects).length).toBeGreaterThan(0);
93
+
94
+ // getObjectById should be defined and available
95
+ expect(dataManager.queryNormalizer.getObjectById).toBeDefined();
96
+ expect(_typeof(dataManager.queryNormalizer.getObjectById)).toBe('function');
97
+ });
98
+ it('getDependentQueries should return dependent queries', function () {
99
+ expect(dataManager.normalizer).toBeDefined();
100
+ expect(dataManager.queryNormalizer).toBeDefined();
101
+ var queryKey1 = ['users'];
102
+ var queryKey2 = ['user', '1'];
103
+ dataManager.queryClient.setQueryData(queryKey1, [{
104
+ id: '1',
105
+ name: 'User'
106
+ }]);
107
+ dataManager.queryClient.setQueryData(queryKey2, {
108
+ id: '1',
109
+ name: 'User'
110
+ });
111
+ dataManager.normalizer.setQuery(JSON.stringify(queryKey1), [{
112
+ id: '1',
113
+ name: 'User'
114
+ }]);
115
+ dataManager.normalizer.setQuery(JSON.stringify(queryKey2), {
116
+ id: '1',
117
+ name: 'User'
118
+ });
119
+ var dependentQueries = dataManager.queryNormalizer.getDependentQueries({
120
+ id: '1',
121
+ name: 'Updated'
122
+ });
123
+ expect(dependentQueries.length).toBeGreaterThan(0);
124
+ });
125
+ it('getDependentQueriesByIds should be available', function () {
126
+ expect(dataManager.queryNormalizer).toBeDefined();
127
+
128
+ // getDependentQueriesByIds should be defined and available
129
+ expect(dataManager.queryNormalizer.getDependentQueriesByIds).toBeDefined();
130
+ expect(_typeof(dataManager.queryNormalizer.getDependentQueriesByIds)).toBe('function');
131
+
132
+ // Call with empty array should not throw
133
+ var result = dataManager.queryNormalizer.getDependentQueriesByIds([]);
134
+ expect(Array.isArray(result)).toBe(true);
135
+ });
136
+ it('should not create queryNormalizer when normalizerConfig is false', function () {
137
+ var dmWithoutNormalizer = new ClientDataManager({
138
+ normalizerConfig: false
139
+ });
140
+ expect(dmWithoutNormalizer.normalizer).toBeUndefined();
141
+ expect(dmWithoutNormalizer.queryNormalizer).toBeUndefined();
142
+ });
143
+ it('should not create queryNormalizer when normalizerConfig is undefined', function () {
144
+ var dmWithoutNormalizer = new ClientDataManager({});
145
+ expect(dmWithoutNormalizer.normalizer).toBeUndefined();
146
+ expect(dmWithoutNormalizer.queryNormalizer).toBeUndefined();
147
+ });
148
+ it('should create queryNormalizer when normalizerConfig is true', function () {
149
+ var dmWithNormalizer = new ClientDataManager({
150
+ normalizerConfig: true
151
+ });
152
+ expect(dmWithNormalizer.normalizer).toBeDefined();
153
+ expect(dmWithNormalizer.queryNormalizer).toBeDefined();
154
+ });
155
+ it('should work correctly with optimisticUpdate via setNormalizedData', function () {
156
+ expect(dataManager.normalizer).toBeDefined();
157
+ expect(dataManager.queryNormalizer).toBeDefined();
158
+ var queryKey = ['users'];
159
+ var initialData = [{
160
+ id: '1',
161
+ name: 'Old Name'
162
+ }];
163
+ dataManager.queryClient.setQueryData(queryKey, initialData);
164
+ dataManager.normalizer.setQuery(JSON.stringify(queryKey), initialData);
165
+ var mutationData = {
166
+ id: '1',
167
+ name: 'New Name'
168
+ };
169
+ dataManager.queryNormalizer.setNormalizedData(mutationData);
170
+ var updatedData = dataManager.queryClient.getQueryData(queryKey);
171
+ expect(updatedData[0].name).toBe('New Name');
172
+ });
173
+ });
174
+ // #sourceMappingURL=createQueryNormalizer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ClientDataManager","describe","dataManager","beforeEach","defaultOptions","queries","retry","mutations","normalizerConfig","devLogging","afterEach","queryClient","clear","it","_dataManager$queryNor","_dataManager$queryNor2","_dataManager$queryNor3","_dataManager$queryNor4","_dataManager$queryNor5","_dataManager$queryNor6","_dataManager$queryNor7","_dataManager$queryNor8","_dataManager$queryNor9","expect","queryNormalizer","toBeDefined","getNormalizedData","setNormalizedData","getObjectById","getQueryFragment","getDependentQueries","getDependentQueriesByIds","subscribe","unsubscribe","data","objects","normalizer","queryKey","setQueryData","id","name","setQuery","JSON","stringify","getQueryData","toBe","Object","keys","toHaveLength","userData","normalized","length","toBeGreaterThan","_typeof","queryKey1","queryKey2","dependentQueries","result","Array","isArray","dmWithoutNormalizer","toBeUndefined","dmWithNormalizer","initialData","mutationData","updatedData"],"sources":["createQueryNormalizer.test.tsx"],"sourcesContent":["import type {Data} from '@normy/core';\n\nimport {ClientDataManager} from '../ClientDataManager';\n\ndescribe('QueryNormalizer API', () => {\n let dataManager: ClientDataManager;\n\n beforeEach(() => {\n dataManager = new ClientDataManager({\n defaultOptions: {\n queries: {retry: false},\n mutations: {retry: false},\n },\n normalizerConfig: {\n devLogging: false,\n },\n });\n });\n\n afterEach(() => {\n dataManager.queryClient.clear();\n });\n\n it('should create queryNormalizer with required methods', () => {\n expect(dataManager.queryNormalizer).toBeDefined();\n expect(dataManager.queryNormalizer?.getNormalizedData).toBeDefined();\n expect(dataManager.queryNormalizer?.setNormalizedData).toBeDefined();\n expect(dataManager.queryNormalizer?.clear).toBeDefined();\n expect(dataManager.queryNormalizer?.getObjectById).toBeDefined();\n expect(dataManager.queryNormalizer?.getQueryFragment).toBeDefined();\n expect(dataManager.queryNormalizer?.getDependentQueries).toBeDefined();\n expect(dataManager.queryNormalizer?.getDependentQueriesByIds).toBeDefined();\n expect(dataManager.queryNormalizer?.subscribe).toBeDefined();\n expect(dataManager.queryNormalizer?.unsubscribe).toBeDefined();\n });\n\n it('getNormalizedData should return normalized data', () => {\n expect(dataManager.queryNormalizer).toBeDefined();\n\n const data = dataManager.queryNormalizer!.getNormalizedData();\n expect(data).toBeDefined();\n expect(data.objects).toBeDefined();\n expect(data.queries).toBeDefined();\n });\n\n it('setNormalizedData should update queries', () => {\n expect(dataManager.normalizer).toBeDefined();\n expect(dataManager.queryNormalizer).toBeDefined();\n\n const queryKey = ['users'];\n dataManager.queryClient.setQueryData(queryKey, [{id: '1', name: 'Old'}]);\n dataManager.normalizer!.setQuery(JSON.stringify(queryKey), [{id: '1', name: 'Old'}]);\n\n dataManager.queryNormalizer!.setNormalizedData({id: '1', name: 'New'});\n\n const data = dataManager.queryClient.getQueryData(queryKey) as Array<{\n id: string;\n name: string;\n }>;\n expect(data[0].name).toBe('New');\n });\n\n it('clear should clear normalized data', () => {\n expect(dataManager.normalizer).toBeDefined();\n expect(dataManager.queryNormalizer).toBeDefined();\n\n const queryKey = ['users'];\n dataManager.queryClient.setQueryData(queryKey, [{id: '1', name: 'User'}]);\n dataManager.normalizer!.setQuery(JSON.stringify(queryKey), [{id: '1', name: 'User'}]);\n\n dataManager.queryNormalizer!.clear();\n\n const data = dataManager.queryNormalizer!.getNormalizedData();\n expect(Object.keys(data.objects)).toHaveLength(0);\n });\n\n it('getObjectById should return object by ID', () => {\n expect(dataManager.normalizer).toBeDefined();\n expect(dataManager.queryNormalizer).toBeDefined();\n\n const queryKey = ['users'];\n const userData = [{id: '1', name: 'User 1'}];\n\n // Add to normalizer\n dataManager.normalizer!.setQuery(JSON.stringify(queryKey), userData);\n\n // Get normalized data\n const normalized = dataManager.queryNormalizer!.getNormalizedData();\n expect(Object.keys(normalized.objects).length).toBeGreaterThan(0);\n\n // getObjectById should be defined and available\n expect(dataManager.queryNormalizer!.getObjectById).toBeDefined();\n expect(typeof dataManager.queryNormalizer!.getObjectById).toBe('function');\n });\n\n it('getDependentQueries should return dependent queries', () => {\n expect(dataManager.normalizer).toBeDefined();\n expect(dataManager.queryNormalizer).toBeDefined();\n\n const queryKey1 = ['users'];\n const queryKey2 = ['user', '1'];\n\n dataManager.queryClient.setQueryData(queryKey1, [{id: '1', name: 'User'}]);\n dataManager.queryClient.setQueryData(queryKey2, {id: '1', name: 'User'});\n\n dataManager.normalizer!.setQuery(JSON.stringify(queryKey1), [{id: '1', name: 'User'}]);\n dataManager.normalizer!.setQuery(JSON.stringify(queryKey2), {id: '1', name: 'User'});\n\n const dependentQueries = dataManager.queryNormalizer!.getDependentQueries({\n id: '1',\n name: 'Updated',\n });\n expect(dependentQueries.length).toBeGreaterThan(0);\n });\n\n it('getDependentQueriesByIds should be available', () => {\n expect(dataManager.queryNormalizer).toBeDefined();\n\n // getDependentQueriesByIds should be defined and available\n expect(dataManager.queryNormalizer!.getDependentQueriesByIds).toBeDefined();\n expect(typeof dataManager.queryNormalizer!.getDependentQueriesByIds).toBe('function');\n\n // Call with empty array should not throw\n const result = dataManager.queryNormalizer!.getDependentQueriesByIds([]);\n expect(Array.isArray(result)).toBe(true);\n });\n\n it('should not create queryNormalizer when normalizerConfig is false', () => {\n const dmWithoutNormalizer = new ClientDataManager({\n normalizerConfig: false,\n });\n\n expect(dmWithoutNormalizer.normalizer).toBeUndefined();\n expect(dmWithoutNormalizer.queryNormalizer).toBeUndefined();\n });\n\n it('should not create queryNormalizer when normalizerConfig is undefined', () => {\n const dmWithoutNormalizer = new ClientDataManager({});\n\n expect(dmWithoutNormalizer.normalizer).toBeUndefined();\n expect(dmWithoutNormalizer.queryNormalizer).toBeUndefined();\n });\n\n it('should create queryNormalizer when normalizerConfig is true', () => {\n const dmWithNormalizer = new ClientDataManager({\n normalizerConfig: true,\n });\n\n expect(dmWithNormalizer.normalizer).toBeDefined();\n expect(dmWithNormalizer.queryNormalizer).toBeDefined();\n });\n\n it('should work correctly with optimisticUpdate via setNormalizedData', () => {\n expect(dataManager.normalizer).toBeDefined();\n expect(dataManager.queryNormalizer).toBeDefined();\n\n const queryKey = ['users'];\n const initialData = [{id: '1', name: 'Old Name'}];\n\n dataManager.queryClient.setQueryData(queryKey, initialData);\n dataManager.normalizer!.setQuery(JSON.stringify(queryKey), initialData);\n\n const mutationData: Data = {id: '1', name: 'New Name'};\n dataManager.queryNormalizer!.setNormalizedData(mutationData);\n\n const updatedData = dataManager.queryClient.getQueryData(queryKey) as Array<{\n id: string;\n name: string;\n }>;\n expect(updatedData[0].name).toBe('New Name');\n });\n});\n"],"mappings":"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","ignoreList":[]}