@rosen-bridge/abstract-extractor 2.1.0 → 2.1.2-82c56984

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 (165) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/ergo/{AbstractErgoExtractor.d.ts → abstractErgoExtractor.d.ts} +3 -3
  3. package/dist/ergo/abstractErgoExtractor.d.ts.map +1 -0
  4. package/dist/ergo/{AbstractErgoExtractor.js → abstractErgoExtractor.js} +3 -3
  5. package/dist/ergo/{AbstractErgoExtractorAction.d.ts → abstractErgoExtractorAction.d.ts} +6 -4
  6. package/dist/ergo/abstractErgoExtractorAction.d.ts.map +1 -0
  7. package/dist/ergo/abstractErgoExtractorAction.js +219 -0
  8. package/dist/ergo/{AbstractErgoExtractorEntity.d.ts → abstractErgoExtractorEntity.d.ts} +1 -1
  9. package/dist/ergo/{AbstractErgoExtractorEntity.d.ts.map → abstractErgoExtractorEntity.d.ts.map} +1 -1
  10. package/dist/ergo/{AbstractErgoExtractorEntity.js → abstractErgoExtractorEntity.js} +1 -1
  11. package/dist/ergo/index.d.ts +6 -6
  12. package/dist/ergo/index.js +7 -7
  13. package/dist/ergo/initializable/{AbstractInitializable.d.ts → abstractInitializable.d.ts} +4 -4
  14. package/dist/ergo/initializable/{AbstractInitializable.d.ts.map → abstractInitializable.d.ts.map} +1 -1
  15. package/dist/ergo/initializable/abstractInitializable.js +162 -0
  16. package/dist/ergo/initializable/{AbstractInitializableAction.d.ts → abstractInitializableAction.d.ts} +4 -4
  17. package/dist/ergo/initializable/abstractInitializableAction.d.ts.map +1 -0
  18. package/dist/ergo/initializable/{AbstractInitializableAction.js → abstractInitializableAction.js} +2 -2
  19. package/dist/ergo/initializable/index.d.ts +2 -2
  20. package/dist/ergo/initializable/index.js +3 -3
  21. package/dist/{lib/ergo/network/AbstractNetwork.d.ts → ergo/network/abstractNetwork.d.ts} +1 -1
  22. package/dist/ergo/network/{AbstractNetwork.d.ts.map → abstractNetwork.d.ts.map} +1 -1
  23. package/dist/ergo/network/{AbstractNetwork.js → abstractNetwork.js} +1 -1
  24. package/dist/{lib/ergo/network/ExplorerNetwork.d.ts → ergo/network/explorerNetwork.d.ts} +2 -2
  25. package/dist/ergo/network/explorerNetwork.d.ts.map +1 -0
  26. package/dist/ergo/network/{ExplorerNetwork.js → explorerNetwork.js} +3 -3
  27. package/dist/ergo/network/{NodeNetwork.d.ts → nodeNetwork.d.ts} +2 -2
  28. package/dist/ergo/network/nodeNetwork.d.ts.map +1 -0
  29. package/dist/ergo/network/nodeNetwork.js +131 -0
  30. package/dist/ergo/utils.d.ts.map +1 -1
  31. package/dist/ergo/utils.js +1 -1
  32. package/package.json +24 -16
  33. package/.eslintignore +0 -1
  34. package/dist/ergo/AbstractErgoExtractor.d.ts.map +0 -1
  35. package/dist/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
  36. package/dist/ergo/AbstractErgoExtractorAction.js +0 -222
  37. package/dist/ergo/initializable/AbstractInitializable.js +0 -163
  38. package/dist/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
  39. package/dist/ergo/network/AbstractNetwork.d.ts +0 -26
  40. package/dist/ergo/network/ExplorerNetwork.d.ts +0 -74
  41. package/dist/ergo/network/ExplorerNetwork.d.ts.map +0 -1
  42. package/dist/ergo/network/NodeNetwork.d.ts.map +0 -1
  43. package/dist/ergo/network/NodeNetwork.js +0 -131
  44. package/dist/lib/abstractExtractor.d.ts +0 -25
  45. package/dist/lib/abstractExtractor.d.ts.map +0 -1
  46. package/dist/lib/abstractExtractor.js +0 -3
  47. package/dist/lib/constants.d.ts +0 -4
  48. package/dist/lib/constants.d.ts.map +0 -1
  49. package/dist/lib/constants.js +0 -4
  50. package/dist/lib/ergo/AbstractErgoExtractor.d.ts +0 -80
  51. package/dist/lib/ergo/AbstractErgoExtractor.d.ts.map +0 -1
  52. package/dist/lib/ergo/AbstractErgoExtractor.js +0 -142
  53. package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts +0 -92
  54. package/dist/lib/ergo/AbstractErgoExtractorAction.d.ts.map +0 -1
  55. package/dist/lib/ergo/AbstractErgoExtractorAction.js +0 -222
  56. package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts +0 -11
  57. package/dist/lib/ergo/AbstractErgoExtractorEntity.d.ts.map +0 -1
  58. package/dist/lib/ergo/AbstractErgoExtractorEntity.js +0 -57
  59. package/dist/lib/ergo/index.d.ts +0 -10
  60. package/dist/lib/ergo/index.d.ts.map +0 -1
  61. package/dist/lib/ergo/index.js +0 -10
  62. package/dist/lib/ergo/initializable/AbstractInitializable.d.ts +0 -48
  63. package/dist/lib/ergo/initializable/AbstractInitializable.d.ts.map +0 -1
  64. package/dist/lib/ergo/initializable/AbstractInitializable.js +0 -163
  65. package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts +0 -14
  66. package/dist/lib/ergo/initializable/AbstractInitializableAction.d.ts.map +0 -1
  67. package/dist/lib/ergo/initializable/AbstractInitializableAction.js +0 -16
  68. package/dist/lib/ergo/initializable/index.d.ts +0 -3
  69. package/dist/lib/ergo/initializable/index.d.ts.map +0 -1
  70. package/dist/lib/ergo/initializable/index.js +0 -3
  71. package/dist/lib/ergo/interfaces.d.ts +0 -47
  72. package/dist/lib/ergo/interfaces.d.ts.map +0 -1
  73. package/dist/lib/ergo/interfaces.js +0 -8
  74. package/dist/lib/ergo/network/AbstractNetwork.d.ts.map +0 -1
  75. package/dist/lib/ergo/network/AbstractNetwork.js +0 -3
  76. package/dist/lib/ergo/network/ExplorerNetwork.d.ts.map +0 -1
  77. package/dist/lib/ergo/network/ExplorerNetwork.js +0 -185
  78. package/dist/lib/ergo/network/NodeNetwork.d.ts +0 -60
  79. package/dist/lib/ergo/network/NodeNetwork.d.ts.map +0 -1
  80. package/dist/lib/ergo/network/NodeNetwork.js +0 -131
  81. package/dist/lib/ergo/utils.d.ts +0 -8
  82. package/dist/lib/ergo/utils.d.ts.map +0 -1
  83. package/dist/lib/ergo/utils.js +0 -16
  84. package/dist/lib/index.d.ts +0 -4
  85. package/dist/lib/index.d.ts.map +0 -1
  86. package/dist/lib/index.js +0 -4
  87. package/dist/tests/AbstractErgoExtractor.mock.d.ts +0 -11
  88. package/dist/tests/AbstractErgoExtractor.mock.d.ts.map +0 -1
  89. package/dist/tests/AbstractErgoExtractor.mock.js +0 -11
  90. package/dist/tests/AbstractErgoExtractor.spec.d.ts +0 -2
  91. package/dist/tests/AbstractErgoExtractor.spec.d.ts.map +0 -1
  92. package/dist/tests/AbstractErgoExtractor.spec.js +0 -240
  93. package/dist/tests/AbstractErgoExtractorAction.mock.d.ts +0 -15
  94. package/dist/tests/AbstractErgoExtractorAction.mock.d.ts.map +0 -1
  95. package/dist/tests/AbstractErgoExtractorAction.mock.js +0 -27
  96. package/dist/tests/AbstractErgoExtractorAction.spec.d.ts +0 -2
  97. package/dist/tests/AbstractErgoExtractorAction.spec.d.ts.map +0 -1
  98. package/dist/tests/AbstractErgoExtractorAction.spec.js +0 -221
  99. package/dist/tests/initializable/AbstractInitializable.mock.d.ts +0 -61
  100. package/dist/tests/initializable/AbstractInitializable.mock.d.ts.map +0 -1
  101. package/dist/tests/initializable/AbstractInitializable.mock.js +0 -18
  102. package/dist/tests/initializable/AbstractInitializable.spec.d.ts +0 -2
  103. package/dist/tests/initializable/AbstractInitializable.spec.d.ts.map +0 -1
  104. package/dist/tests/initializable/AbstractInitializable.spec.js +0 -299
  105. package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts +0 -15
  106. package/dist/tests/initializable/AbstractInitializableAction.mock.d.ts.map +0 -1
  107. package/dist/tests/initializable/AbstractInitializableAction.mock.js +0 -27
  108. package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts +0 -2
  109. package/dist/tests/initializable/AbstractInitializableAction.spec.d.ts.map +0 -1
  110. package/dist/tests/initializable/AbstractInitializableAction.spec.js +0 -54
  111. package/dist/tests/initializable/testData.d.ts +0 -94
  112. package/dist/tests/initializable/testData.d.ts.map +0 -1
  113. package/dist/tests/initializable/testData.js +0 -235
  114. package/dist/tests/network/ExplorerNetwork.spec.d.ts +0 -2
  115. package/dist/tests/network/ExplorerNetwork.spec.d.ts.map +0 -1
  116. package/dist/tests/network/ExplorerNetwork.spec.js +0 -61
  117. package/dist/tests/network/NodeNetwork.spec.d.ts +0 -2
  118. package/dist/tests/network/NodeNetwork.spec.d.ts.map +0 -1
  119. package/dist/tests/network/NodeNetwork.spec.js +0 -48
  120. package/dist/tests/network/testData.d.ts +0 -752
  121. package/dist/tests/network/testData.d.ts.map +0 -1
  122. package/dist/tests/network/testData.js +0 -1401
  123. package/dist/tests/testData.d.ts +0 -32
  124. package/dist/tests/testData.d.ts.map +0 -1
  125. package/dist/tests/testData.js +0 -121
  126. package/dist/tests/testUtils.d.ts +0 -9
  127. package/dist/tests/testUtils.d.ts.map +0 -1
  128. package/dist/tests/testUtils.js +0 -31
  129. package/dist/tsconfig.tsbuildinfo +0 -1
  130. package/dist/vitest.config.d.ts +0 -3
  131. package/dist/vitest.config.d.ts.map +0 -1
  132. package/dist/vitest.config.js +0 -18
  133. package/lib/abstractExtractor.ts +0 -31
  134. package/lib/constants.ts +0 -3
  135. package/lib/ergo/AbstractErgoExtractor.ts +0 -227
  136. package/lib/ergo/AbstractErgoExtractorAction.ts +0 -319
  137. package/lib/ergo/AbstractErgoExtractorEntity.ts +0 -32
  138. package/lib/ergo/index.ts +0 -9
  139. package/lib/ergo/initializable/AbstractInitializable.ts +0 -228
  140. package/lib/ergo/initializable/AbstractInitializableAction.ts +0 -33
  141. package/lib/ergo/initializable/index.ts +0 -2
  142. package/lib/ergo/interfaces.ts +0 -51
  143. package/lib/ergo/network/AbstractNetwork.ts +0 -29
  144. package/lib/ergo/network/ExplorerNetwork.ts +0 -237
  145. package/lib/ergo/network/NodeNetwork.ts +0 -169
  146. package/lib/ergo/utils.ts +0 -15
  147. package/lib/index.ts +0 -3
  148. package/tests/AbstractErgoExtractor.mock.ts +0 -33
  149. package/tests/AbstractErgoExtractor.spec.ts +0 -284
  150. package/tests/AbstractErgoExtractorAction.mock.ts +0 -45
  151. package/tests/AbstractErgoExtractorAction.spec.ts +0 -268
  152. package/tests/initializable/AbstractInitializable.mock.ts +0 -44
  153. package/tests/initializable/AbstractInitializable.spec.ts +0 -386
  154. package/tests/initializable/AbstractInitializableAction.mock.ts +0 -45
  155. package/tests/initializable/AbstractInitializableAction.spec.ts +0 -64
  156. package/tests/initializable/testData.ts +0 -283
  157. package/tests/network/ExplorerNetwork.spec.ts +0 -73
  158. package/tests/network/NodeNetwork.spec.ts +0 -56
  159. package/tests/network/testData.ts +0 -1708
  160. package/tests/testData.ts +0 -140
  161. package/tests/testUtils.ts +0 -22
  162. package/tsconfig.build.json +0 -9
  163. package/tsconfig.build.tsbuildinfo +0 -1
  164. package/tsconfig.json +0 -9
  165. package/vitest.config.ts +0 -18
@@ -1,61 +0,0 @@
1
- import { V1 } from '@rosen-clients/ergo-explorer';
2
- import { BlockInfo, OutputBox } from '@rosen-bridge/scanner-interfaces';
3
- import { AbstractInitializableErgoExtractor, AbstractInitializableErgoExtractorAction } from '../../lib/ergo/initializable';
4
- import { AbstractBoxData, AbstractErgoExtractorEntity } from '../../lib';
5
- export declare class MockedInitializableErgoExtractor extends AbstractInitializableErgoExtractor<AbstractBoxData, AbstractErgoExtractorEntity> {
6
- actions: AbstractInitializableErgoExtractorAction<AbstractBoxData, AbstractErgoExtractorEntity>;
7
- getId: () => string;
8
- hasData: (box: V1.OutputInfo | OutputBox) => boolean;
9
- getTxBlock: (txId: string) => Promise<BlockInfo>;
10
- getBoxesWithOffsetLimit: (offset: number, // eslint-disable-line @typescript-eslint/no-unused-vars
11
- limit: number) => Promise<{
12
- boxes: ({
13
- boxId: string;
14
- transactionId: string;
15
- blockId: string;
16
- value: bigint;
17
- index: number;
18
- creationHeight: number;
19
- inclusionHeight: number;
20
- ergoTree: string;
21
- address: string;
22
- assets: {
23
- tokenId: string;
24
- index: number;
25
- amount: bigint;
26
- name: string;
27
- decimals: number;
28
- }[];
29
- additionalRegisters: {};
30
- spentHeight?: undefined;
31
- spentBlockId?: undefined;
32
- spentTransactionId?: undefined;
33
- spentIndex?: undefined;
34
- } | {
35
- boxId: string;
36
- transactionId: string;
37
- blockId: string;
38
- value: bigint;
39
- index: number;
40
- creationHeight: number;
41
- inclusionHeight: number;
42
- ergoTree: string;
43
- address: string;
44
- assets: {
45
- tokenId: string;
46
- index: number;
47
- amount: bigint;
48
- name: string;
49
- decimals: number;
50
- }[];
51
- additionalRegisters: {};
52
- spentHeight: number;
53
- spentBlockId: string;
54
- spentTransactionId: string;
55
- spentIndex: number;
56
- })[];
57
- hasNextBatch: boolean;
58
- }>;
59
- extractBoxData: (box: V1.OutputInfo | OutputBox) => undefined;
60
- }
61
- //# sourceMappingURL=AbstractInitializable.mock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AbstractInitializable.mock.d.ts","sourceRoot":"","sources":["../../../tests/initializable/AbstractInitializable.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,8BAA8B,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAExE,OAAO,EACL,kCAAkC,EAClC,wCAAwC,EACzC,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AAGzE,qBAAa,gCAAiC,SAAQ,kCAAkC,CACtF,eAAe,EACf,2BAA2B,CAC5B;IACC,OAAO,EAAE,wCAAwC,CAC/C,eAAe,EACf,2BAA2B,CAC5B,CAAC;IAEF,KAAK,eAAgB;IAErB,OAAO,GACL,KAAK,EAAE,CAAC,UAAU,GAAG,SAAS,aACrB;IAEX,UAAU,GACR,MAAM,MAAM,KACX,OAAO,CAAC,SAAS,CAAC,CAEnB;IAEF,uBAAuB,GACrB,QAAQ,MAAM,EAAE,wDAAwD;IACxE,OAAO,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAGb;IAEF,cAAc,GACZ,KAAK,EAAE,CAAC,UAAU,GAAG,SAAS,eAG9B;CACH"}
@@ -1,18 +0,0 @@
1
- import { AbstractInitializableErgoExtractor, } from '../../lib/ergo/initializable';
2
- import { ergoBoxes } from './testData';
3
- export class MockedInitializableErgoExtractor extends AbstractInitializableErgoExtractor {
4
- actions;
5
- getId = () => 'Test';
6
- hasData = (box) => false;
7
- getTxBlock = async (txId) => {
8
- return { hash: 'hash', height: 100 };
9
- };
10
- getBoxesWithOffsetLimit = (offset, // eslint-disable-line @typescript-eslint/no-unused-vars
11
- limit) => {
12
- return Promise.resolve({ boxes: ergoBoxes, hasNextBatch: true });
13
- };
14
- extractBoxData = (box) => {
15
- return undefined;
16
- };
17
- }
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlLm1vY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZS5tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFDTCxrQ0FBa0MsR0FFbkMsTUFBTSw4QkFBOEIsQ0FBQztBQUV0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE1BQU0sT0FBTyxnQ0FBaUMsU0FBUSxrQ0FHckQ7SUFDQyxPQUFPLENBR0w7SUFFRixLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDO0lBRXJCLE9BQU8sR0FBRyxDQUNSLEdBQThCLEVBQzlCLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFFWCxVQUFVLEdBQUcsS0FBSyxFQUNoQixJQUFZLEVBQ1EsRUFBRTtRQUN0QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0lBRUYsdUJBQXVCLEdBQUcsQ0FDeEIsTUFBYyxFQUFFLHdEQUF3RDtJQUN4RSxLQUFhLEVBQ2IsRUFBRTtRQUNGLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQyxDQUFDO0lBRUYsY0FBYyxHQUFHLENBQ2YsR0FBOEIsRUFDOUIsRUFBRTtRQUNGLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVjEgfSBmcm9tICdAcm9zZW4tY2xpZW50cy9lcmdvLWV4cGxvcmVyJztcbmltcG9ydCB7IEJsb2NrSW5mbywgT3V0cHV0Qm94IH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yLFxuICBBYnN0cmFjdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uLFxufSBmcm9tICcuLi8uLi9saWIvZXJnby9pbml0aWFsaXphYmxlJztcbmltcG9ydCB7IEFic3RyYWN0Qm94RGF0YSwgQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5IH0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IGVyZ29Cb3hlcyB9IGZyb20gJy4vdGVzdERhdGEnO1xuXG5leHBvcnQgY2xhc3MgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IgZXh0ZW5kcyBBYnN0cmFjdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yPFxuICBBYnN0cmFjdEJveERhdGEsXG4gIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuPiB7XG4gIGFjdGlvbnM6IEFic3RyYWN0SW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3JBY3Rpb248XG4gICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuICA+O1xuXG4gIGdldElkID0gKCkgPT4gJ1Rlc3QnO1xuXG4gIGhhc0RhdGEgPSAoXG4gICAgYm94OiBWMS5PdXRwdXRJbmZvIHwgT3V0cHV0Qm94LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICApID0+IGZhbHNlO1xuXG4gIGdldFR4QmxvY2sgPSBhc3luYyAoXG4gICAgdHhJZDogc3RyaW5nLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICApOiBQcm9taXNlPEJsb2NrSW5mbz4gPT4ge1xuICAgIHJldHVybiB7IGhhc2g6ICdoYXNoJywgaGVpZ2h0OiAxMDAgfTtcbiAgfTtcblxuICBnZXRCb3hlc1dpdGhPZmZzZXRMaW1pdCA9IChcbiAgICBvZmZzZXQ6IG51bWJlciwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBsaW1pdDogbnVtYmVyLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICApID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgYm94ZXM6IGVyZ29Cb3hlcywgaGFzTmV4dEJhdGNoOiB0cnVlIH0pO1xuICB9O1xuXG4gIGV4dHJhY3RCb3hEYXRhID0gKFxuICAgIGJveDogVjEuT3V0cHV0SW5mbyB8IE91dHB1dEJveCwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgKSA9PiB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=AbstractInitializable.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AbstractInitializable.spec.d.ts","sourceRoot":"","sources":["../../../tests/initializable/AbstractInitializable.spec.ts"],"names":[],"mappings":""}
@@ -1,299 +0,0 @@
1
- import { ErgoNetworkType } from '@rosen-bridge/scanner-interfaces';
2
- import { MockedInitializableErgoExtractor } from './AbstractInitializable.mock';
3
- import { transactionBatch } from './testData';
4
- import { RETRIAL_COUNT } from '../../lib/constants';
5
- describe('AbstractInitializableErgoExtractor', () => {
6
- describe('getTotalTxCount', () => {
7
- /**
8
- * @target getTotalTxCount should return the total tx count
9
- * @dependencies
10
- * - explorer network
11
- * @scenario
12
- * - mock extractor
13
- * - mock `getAddressTransactionsWithOffsetLimit` in node network
14
- * - run test (call `getTotalTxCount`)
15
- * @expected
16
- * - return one total tx count
17
- */
18
- it('should return the total tx count', async () => {
19
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
20
- extractor['network'].getAddressTransactionsWithOffsetLimit = vitest.fn().mockResolvedValue({
21
- items: [],
22
- total: 196704,
23
- });
24
- const totalTxCount = await extractor['getTotalTxCount']();
25
- expect(totalTxCount).toEqual(196704);
26
- });
27
- });
28
- describe('processTransactionBatch', () => {
29
- /**
30
- * @target processTransactionBatch should group transactions and process them in correct order
31
- * @dependencies
32
- * @scenario
33
- * - mock extractor
34
- * - spy `processTransactions`
35
- * - run test (call `processTransactionBatch`)
36
- * @expected
37
- * - to group txs in two blocks
38
- * - to process each blocks transaction separately
39
- */
40
- it('should group transactions and process them in correct order', async () => {
41
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
42
- const processSpy = vitest.fn().mockResolvedValue(true);
43
- extractor.processTransactions = processSpy;
44
- await extractor['processTransactionBatch'](transactionBatch);
45
- expect(processSpy).toBeCalledTimes(2);
46
- expect(processSpy).toHaveBeenCalledWith([transactionBatch[2]], {
47
- hash: '92eaff11a4a1c29b8654473258f9d837e9ce99fc0a8a4f27c484d5871afcde64',
48
- height: 1320698,
49
- });
50
- expect(processSpy).toHaveBeenLastCalledWith(transactionBatch.slice(0, 2), {
51
- hash: 'b861e2134821fcf1fcdad7e6edd56c4e4495b42b2fd72762a4c79ed1db78b44b',
52
- height: 1320705,
53
- });
54
- });
55
- /**
56
- * @target processTransactionBatch should throw error when processing transactions fails for a block
57
- * @dependencies
58
- * @scenario
59
- * - mock extractor
60
- * - spy `processTransactions` to return false (always fails)
61
- * - run test (call `processTransactionBatch`)
62
- * @expected
63
- * - to throw error
64
- */
65
- it('should throw error when processing transactions fails for a block', async () => {
66
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
67
- extractor.processTransactions = vitest.fn().mockResolvedValue(false);
68
- await expect(() => extractor['processTransactionBatch'](transactionBatch)).rejects.toThrowError();
69
- });
70
- });
71
- describe('initWithRetrial', () => {
72
- /**
73
- * @target initWithRetrial should not run the init job when its not set
74
- * @dependencies
75
- * - database
76
- * @scenario
77
- * - mock extractor with false initialization
78
- * - mock `removeAllData` in database actions
79
- * - mock init job
80
- * - run test (call `initWithRetrial`)
81
- * @expected
82
- * - not to remove database old data
83
- * - not to run the init job
84
- */
85
- it('should not run the init job when its not set', async () => {
86
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address', undefined, false);
87
- const removeSpy = vitest.fn();
88
- extractor['actions'] = {
89
- removeAllData: removeSpy,
90
- };
91
- const initSpy = vitest.fn();
92
- await extractor['initWithRetrial'](initSpy);
93
- expect(removeSpy).not.toHaveBeenCalled();
94
- expect(initSpy).not.toHaveBeenCalled();
95
- });
96
- /**
97
- * @target initWithRetrial should call init job once
98
- * @dependencies
99
- * - database
100
- * @scenario
101
- * - mock extractor
102
- * - mock `removeAllData` in database actions
103
- * - mock init job
104
- * - run test (call `initWithRetrial`)
105
- * @expected
106
- * - to remove database old data once
107
- * - call init job once
108
- */
109
- it('should call init job once', async () => {
110
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
111
- const removeSpy = vitest.fn();
112
- extractor['actions'] = {
113
- removeAllData: removeSpy,
114
- };
115
- const initSpy = vitest.fn();
116
- await extractor['initWithRetrial'](initSpy);
117
- expect(removeSpy).toHaveBeenCalledOnce();
118
- expect(initSpy).toHaveBeenCalledOnce();
119
- });
120
- /**
121
- * @target initWithRetrial should call init job RETRIAL_COUNT number of times
122
- * @dependencies
123
- * - database
124
- * @scenario
125
- * - mock extractor
126
- * - mock `removeAllData` in database actions
127
- * - mock init job to throw error
128
- * - run test (call `initWithRetrial`)
129
- * @expected
130
- * - to remove database old data once
131
- * - call init job RETRIAL_COUNT number of times
132
- * - to throw error after trials
133
- */
134
- it('should call init job RETRIAL_COUNT number of times', async () => {
135
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
136
- const removeSpy = vitest.fn();
137
- extractor['actions'] = {
138
- removeAllData: removeSpy,
139
- };
140
- const initSpy = vitest.fn().mockRejectedValue(0);
141
- await expect(async () => await extractor['initWithRetrial'](initSpy)).rejects.toThrowError();
142
- expect(removeSpy).toHaveBeenCalledOnce();
143
- expect(initSpy).toHaveBeenCalledTimes(RETRIAL_COUNT);
144
- });
145
- });
146
- describe('initializeWithNode', () => {
147
- /**
148
- * @target initializeWithNode should process all transactions bellow the init height twice
149
- * @dependencies
150
- * - node network
151
- * @scenario
152
- * - mock extractor
153
- * - mock `getAddressTransactionsWithOffsetLimit` in node network
154
- * - mock `initWithRetrial` to run the job once
155
- * - mock `getTotalTxCount` to return 3
156
- * - run test (call `initializeWithNode`)
157
- * @expected
158
- * - to filter the transactions and process the txs bellow the init height
159
- * - to process all filtered transactions twice
160
- */
161
- it('should process all transactions bellow the init height twice', async () => {
162
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
163
- extractor['network'].getAddressTransactionsWithOffsetLimit = vitest.fn().mockResolvedValue({
164
- items: transactionBatch,
165
- total: 3,
166
- });
167
- extractor['initWithRetrial'] = async (job) => job();
168
- extractor['getTotalTxCount'] = async () => 3;
169
- const processSpy = vitest.fn();
170
- extractor['processTransactionBatch'] = processSpy;
171
- await extractor['initializeWithNode']({ hash: 'hash', height: 1320698 });
172
- expect(processSpy).toBeCalledTimes(2);
173
- expect(processSpy).toBeCalledWith([transactionBatch[2]]);
174
- });
175
- /**
176
- * @target initializeWithNode should throw error when total transaction count changes
177
- * @dependencies
178
- * - node network
179
- * @scenario
180
- * - mock extractor
181
- * - mock `getAddressTransactionsWithOffsetLimit` in node network
182
- * - mock `initWithRetrial` to run the job once
183
- * - mock `getTotalTxCount` to return 3 then 4
184
- * - run test (call `initializeWithNode`)
185
- * @expected
186
- * - to throw error when the number of transactions change during initialization
187
- */
188
- it('should throw error when total transaction count changes', async () => {
189
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Node, 'node_url', 'address');
190
- extractor['network'].getAddressTransactionsWithOffsetLimit = vitest.fn().mockResolvedValue({
191
- items: transactionBatch,
192
- total: 3,
193
- });
194
- extractor['initWithRetrial'] = async (job) => job();
195
- extractor['getTotalTxCount'] = vitest
196
- .fn()
197
- .mockResolvedValueOnce(3)
198
- .mockResolvedValue(4);
199
- extractor['processTransactionBatch'] = vitest.fn();
200
- expect(() => extractor['initializeWithNode']({ hash: 'hash', height: 1320698 })).rejects.toThrowError();
201
- });
202
- });
203
- describe('initializeWithExplorer', () => {
204
- /**
205
- * @target initializeWithExplorer should limit the height and process
206
- * transactions when they are less than the API_LIMIT
207
- * @dependencies
208
- * - explorer network
209
- * @scenario
210
- * - mock extractor
211
- * - mock `initWithRetrial` to run the job once
212
- * - mock `getAddressTransactionsWithHeight` in explorer network
213
- * return API_LIMIT transactions in first call (to limit the height range)
214
- * return 0 transactions in second call (to pass a range without process)
215
- * return transactionBatch in last call (to process the transactions when they are less than API_LIMIT)
216
- * - run test (call `initializeWithExplorer`)
217
- * @expected
218
- * - to limit the height when the transaction count is equal to API_LIMIT
219
- * - to cover all height ranges
220
- * - to process transactions when they are less than API_LIMIT
221
- */
222
- it(`should limit the height and process transactions when they are less than
223
- the API_LIMIT`, async () => {
224
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Explorer, 'explorer_url', 'address');
225
- extractor['initWithRetrial'] = async (job) => job();
226
- const addressTxSpy = vitest
227
- .fn()
228
- .mockResolvedValueOnce(new Array(100).fill(transactionBatch[0]))
229
- .mockResolvedValueOnce([])
230
- .mockResolvedValueOnce(transactionBatch);
231
- extractor['network'].getAddressTransactionsWithHeight = addressTxSpy;
232
- const processSpy = vitest.fn();
233
- extractor['processTransactionBatch'] = processSpy;
234
- await extractor['initializeWithExplorer']({
235
- hash: 'hash',
236
- height: 1320800,
237
- });
238
- expect(addressTxSpy).toHaveBeenCalledWith('address', 0, 1320800);
239
- expect(addressTxSpy).toHaveBeenCalledWith('address', 0, 660400);
240
- expect(addressTxSpy).toHaveBeenLastCalledWith('address', 660401, 1320800);
241
- expect(processSpy).toHaveBeenCalledTimes(1);
242
- expect(processSpy).toHaveBeenCalledWith(transactionBatch);
243
- });
244
- /**
245
- * @target initializeWithExplorer should process all block transactions when
246
- * the number of transactions in the block is more than API_LIMIT
247
- * @dependencies
248
- * - explorer network
249
- * @scenario
250
- * - mock extractor
251
- * - mock `initWithRetrial` to run the job once
252
- * - mock `getAddressTransactionsWithHeight` to return 100 transactions in one block
253
- * - spy all other functions to check the calls
254
- * - run test (call `initializeWithExplorer`)
255
- * @expected
256
- * - to process all transactions in block 1320000
257
- * - not to stuck at a large block and complete the process
258
- */
259
- it(`should process all block transactions when the number of transactions in
260
- the block is more than API_LIMIT`, async () => {
261
- // mock extractor
262
- const extractor = new MockedInitializableErgoExtractor(ErgoNetworkType.Explorer, 'explorer_url', 'address');
263
- // mock `initWithRetrial` to run the job once
264
- extractor['initWithRetrial'] = async (job) => job();
265
- // mock `getAddressTransactionsWithHeight` to return 100 transactions in one block
266
- const exNetwork = extractor['network'];
267
- const addressTxSpy = vitest
268
- .fn()
269
- .mockImplementation((address, fromHeight, toHeight) => {
270
- if (fromHeight <= 1320000 && toHeight >= 1320000)
271
- return new Array(100).fill(transactionBatch[0]);
272
- return [];
273
- });
274
- exNetwork.getAddressTransactionsWithHeight = addressTxSpy;
275
- // spy all other functions to check the calls
276
- const blockIdSpy = vi.fn().mockResolvedValue('blockId');
277
- const blockTxsSpy = vi.fn().mockResolvedValue([]);
278
- exNetwork.getBlockIdAtHeight = blockIdSpy;
279
- exNetwork.getBlockTxs = blockTxsSpy;
280
- const processSpy = vitest.fn();
281
- const processBatchSpy = vitest.fn();
282
- extractor.processTransactions = processSpy;
283
- extractor['processTransactionBatch'] = processBatchSpy;
284
- // run test (call `initializeWithExplorer`)
285
- await extractor['initializeWithExplorer']({
286
- hash: 'hash',
287
- height: 1320800,
288
- });
289
- expect(blockIdSpy).toHaveBeenCalledWith(1320000);
290
- expect(blockTxsSpy).toHaveBeenCalledWith('blockId');
291
- expect(processSpy).toHaveBeenCalledWith([], {
292
- hash: 'blockId',
293
- height: 1320000,
294
- });
295
- expect(processBatchSpy).not.toBeCalled();
296
- });
297
- });
298
- });
299
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZS5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQVFuRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDOUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBR3BELFFBQVEsQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLEVBQUU7SUFDbEQsUUFBUSxDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtRQUMvQjs7Ozs7Ozs7OztXQVVHO1FBQ0gsRUFBRSxDQUFDLGtDQUFrQyxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ2hELE1BQU0sU0FBUyxHQUFHLElBQUksZ0NBQWdDLENBQ3BELGVBQWUsQ0FBQyxJQUFJLEVBQ3BCLFVBQVUsRUFDVixTQUFTLENBQ1YsQ0FBQztZQUVBLFNBQVMsQ0FBQyxTQUFTLENBQ3BCLENBQUMscUNBQXFDLEdBQUcsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2dCQUN0RSxLQUFLLEVBQUUsRUFBRTtnQkFDVCxLQUFLLEVBQUUsTUFBTTthQUNkLENBQUMsQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sU0FBUyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUMxRCxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMseUJBQXlCLEVBQUUsR0FBRyxFQUFFO1FBQ3ZDOzs7Ozs7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QyxHQUFHLGVBQWUsQ0FBQztZQUN2RCwyQ0FBMkM7WUFDM0MsTUFBTSxTQUFTLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLE1BQU07Z0JBQ1osTUFBTSxFQUFFLE9BQU87YUFDaEIsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLEVBQUUsU0FBUztnQkFDZixNQUFNLEVBQUUsT0FBTzthQUNoQixDQUFDLENBQUM7WUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVyZ29OZXR3b3JrVHlwZSB9IGZyb20gJ0Byb3Nlbi1icmlkZ2Uvc2Nhbm5lci1pbnRlcmZhY2VzJztcblxuaW1wb3J0IHtcbiAgTm9kZU5ldHdvcmssXG4gIEFic3RyYWN0Qm94RGF0YSxcbiAgRXhwbG9yZXJOZXR3b3JrLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHksXG59IGZyb20gJy4uLy4uL2xpYic7XG5pbXBvcnQgeyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvciB9IGZyb20gJy4vQWJzdHJhY3RJbml0aWFsaXphYmxlLm1vY2snO1xuaW1wb3J0IHsgdHJhbnNhY3Rpb25CYXRjaCB9IGZyb20gJy4vdGVzdERhdGEnO1xuaW1wb3J0IHsgUkVUUklBTF9DT1VOVCB9IGZyb20gJy4uLy4uL2xpYi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbiB9IGZyb20gJy4uLy4uL2xpYi9lcmdvL2luaXRpYWxpemFibGUnO1xuXG5kZXNjcmliZSgnQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcicsICgpID0+IHtcbiAgZGVzY3JpYmUoJ2dldFRvdGFsVHhDb3VudCcsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGdldFRvdGFsVHhDb3VudCBzaG91bGQgcmV0dXJuIHRoZSB0b3RhbCB0eCBjb3VudFxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiAtIGV4cGxvcmVyIG5ldHdvcmtcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0YCBpbiBub2RlIG5ldHdvcmtcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBnZXRUb3RhbFR4Q291bnRgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gcmV0dXJuIG9uZSB0b3RhbCB0eCBjb3VudFxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcmV0dXJuIHRoZSB0b3RhbCB0eCBjb3VudCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICAoXG4gICAgICAgIGV4dHJhY3RvclsnbmV0d29yayddIGFzIE5vZGVOZXR3b3JrXG4gICAgICApLmdldEFkZHJlc3NUcmFuc2FjdGlvbnNXaXRoT2Zmc2V0TGltaXQgPSB2aXRlc3QuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgICAgIGl0ZW1zOiBbXSxcbiAgICAgICAgdG90YWw6IDE5NjcwNCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgdG90YWxUeENvdW50ID0gYXdhaXQgZXh0cmFjdG9yWydnZXRUb3RhbFR4Q291bnQnXSgpO1xuICAgICAgZXhwZWN0KHRvdGFsVHhDb3VudCkudG9FcXVhbCgxOTY3MDQpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgncHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2gnLCAoKSA9PiB7XG4gICAgLyoqXG4gICAgICogQHRhcmdldCBwcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCBzaG91bGQgZ3JvdXAgdHJhbnNhY3Rpb25zIGFuZCBwcm9jZXNzIHRoZW0gaW4gY29ycmVjdCBvcmRlclxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBzcHkgYHByb2Nlc3NUcmFuc2FjdGlvbnNgXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgcHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2hgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gZ3JvdXAgdHhzIGluIHR3byBibG9ja3NcbiAgICAgKiAtIHRvIHByb2Nlc3MgZWFjaCBibG9ja3MgdHJhbnNhY3Rpb24gc2VwYXJhdGVseVxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgZ3JvdXAgdHJhbnNhY3Rpb25zIGFuZCBwcm9jZXNzIHRoZW0gaW4gY29ycmVjdCBvcmRlcicsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBjb25zdCBwcm9jZXNzU3B5ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUodHJ1ZSk7XG4gICAgICBleHRyYWN0b3IucHJvY2Vzc1RyYW5zYWN0aW9ucyA9IHByb2Nlc3NTcHk7XG4gICAgICBhd2FpdCBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10odHJhbnNhY3Rpb25CYXRjaCk7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9CZUNhbGxlZFRpbWVzKDIpO1xuICAgICAgZXhwZWN0KHByb2Nlc3NTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFt0cmFuc2FjdGlvbkJhdGNoWzJdXSwge1xuICAgICAgICBoYXNoOiAnOTJlYWZmMTFhNGExYzI5Yjg2NTQ0NzMyNThmOWQ4MzdlOWNlOTlmYzBhOGE0ZjI3YzQ4NGQ1ODcxYWZjZGU2NCcsXG4gICAgICAgIGhlaWdodDogMTMyMDY5OCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KHByb2Nlc3NTcHkpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aChcbiAgICAgICAgdHJhbnNhY3Rpb25CYXRjaC5zbGljZSgwLCAyKSxcbiAgICAgICAge1xuICAgICAgICAgIGhhc2g6ICdiODYxZTIxMzQ4MjFmY2YxZmNkYWQ3ZTZlZGQ1NmM0ZTQ0OTViNDJiMmZkNzI3NjJhNGM3OWVkMWRiNzhiNDRiJyxcbiAgICAgICAgICBoZWlnaHQ6IDEzMjA3MDUsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBwcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCBzaG91bGQgdGhyb3cgZXJyb3Igd2hlbiBwcm9jZXNzaW5nIHRyYW5zYWN0aW9ucyBmYWlscyBmb3IgYSBibG9ja1xuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBzcHkgYHByb2Nlc3NUcmFuc2FjdGlvbnNgIHRvIHJldHVybiBmYWxzZSAoYWx3YXlzIGZhaWxzKVxuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYHByb2Nlc3NUcmFuc2FjdGlvbkJhdGNoYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIHRocm93IGVycm9yXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHByb2Nlc3NpbmcgdHJhbnNhY3Rpb25zIGZhaWxzIGZvciBhIGJsb2NrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yKFxuICAgICAgICBFcmdvTmV0d29ya1R5cGUuTm9kZSxcbiAgICAgICAgJ25vZGVfdXJsJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgKTtcbiAgICAgIGV4dHJhY3Rvci5wcm9jZXNzVHJhbnNhY3Rpb25zID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpO1xuICAgICAgYXdhaXQgZXhwZWN0KCgpID0+XG4gICAgICAgIGV4dHJhY3RvclsncHJvY2Vzc1RyYW5zYWN0aW9uQmF0Y2gnXSh0cmFuc2FjdGlvbkJhdGNoKSxcbiAgICAgICkucmVqZWN0cy50b1Rocm93RXJyb3IoKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2luaXRXaXRoUmV0cmlhbCcsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGluaXRXaXRoUmV0cmlhbCBzaG91bGQgbm90IHJ1biB0aGUgaW5pdCBqb2Igd2hlbiBpdHMgbm90IHNldFxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiAtIGRhdGFiYXNlXG4gICAgICogQHNjZW5hcmlvXG4gICAgICogLSBtb2NrIGV4dHJhY3RvciB3aXRoIGZhbHNlIGluaXRpYWxpemF0aW9uXG4gICAgICogLSBtb2NrIGByZW1vdmVBbGxEYXRhYCBpbiBkYXRhYmFzZSBhY3Rpb25zXG4gICAgICogLSBtb2NrIGluaXQgam9iXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdFdpdGhSZXRyaWFsYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIG5vdCB0byByZW1vdmUgZGF0YWJhc2Ugb2xkIGRhdGFcbiAgICAgKiAtIG5vdCB0byBydW4gdGhlIGluaXQgam9iXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCBub3QgcnVuIHRoZSBpbml0IGpvYiB3aGVuIGl0cyBub3Qgc2V0JywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yKFxuICAgICAgICBFcmdvTmV0d29ya1R5cGUuTm9kZSxcbiAgICAgICAgJ25vZGVfdXJsJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlbW92ZVNweSA9IHZpdGVzdC5mbigpO1xuICAgICAgZXh0cmFjdG9yWydhY3Rpb25zJ10gPSB7XG4gICAgICAgIHJlbW92ZUFsbERhdGE6IHJlbW92ZVNweSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBBYnN0cmFjdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uPFxuICAgICAgICBBYnN0cmFjdEJveERhdGEsXG4gICAgICAgIEFic3RyYWN0RXJnb0V4dHJhY3RvckVudGl0eVxuICAgICAgPjtcbiAgICAgIGNvbnN0IGluaXRTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGF3YWl0IGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10oaW5pdFNweSk7XG4gICAgICBleHBlY3QocmVtb3ZlU3B5KS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgICAgZXhwZWN0KGluaXRTcHkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGluaXRXaXRoUmV0cmlhbCBzaG91bGQgY2FsbCBpbml0IGpvYiBvbmNlXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIC0gZGF0YWJhc2VcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGByZW1vdmVBbGxEYXRhYCBpbiBkYXRhYmFzZSBhY3Rpb25zXG4gICAgICogLSBtb2NrIGluaXQgam9iXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdFdpdGhSZXRyaWFsYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIHJlbW92ZSBkYXRhYmFzZSBvbGQgZGF0YSBvbmNlXG4gICAgICogLSBjYWxsIGluaXQgam9iIG9uY2VcbiAgICAgKi9cbiAgICBpdCgnc2hvdWxkIGNhbGwgaW5pdCBqb2Igb25jZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBjb25zdCByZW1vdmVTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4dHJhY3RvclsnYWN0aW9ucyddID0ge1xuICAgICAgICByZW1vdmVBbGxEYXRhOiByZW1vdmVTcHksXG4gICAgICB9IGFzIHVua25vd24gYXMgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICAgICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgICAgICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCBpbml0U3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBhd2FpdCBleHRyYWN0b3JbJ2luaXRXaXRoUmV0cmlhbCddKGluaXRTcHkpO1xuICAgICAgZXhwZWN0KHJlbW92ZVNweSkudG9IYXZlQmVlbkNhbGxlZE9uY2UoKTtcbiAgICAgIGV4cGVjdChpbml0U3B5KS50b0hhdmVCZWVuQ2FsbGVkT25jZSgpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBpbml0V2l0aFJldHJpYWwgc2hvdWxkIGNhbGwgaW5pdCBqb2IgUkVUUklBTF9DT1VOVCBudW1iZXIgb2YgdGltZXNcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogLSBkYXRhYmFzZVxuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYHJlbW92ZUFsbERhdGFgIGluIGRhdGFiYXNlIGFjdGlvbnNcbiAgICAgKiAtIG1vY2sgaW5pdCBqb2IgdG8gdGhyb3cgZXJyb3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBpbml0V2l0aFJldHJpYWxgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gcmVtb3ZlIGRhdGFiYXNlIG9sZCBkYXRhIG9uY2VcbiAgICAgKiAtIGNhbGwgaW5pdCBqb2IgUkVUUklBTF9DT1VOVCBudW1iZXIgb2YgdGltZXNcbiAgICAgKiAtIHRvIHRocm93IGVycm9yIGFmdGVyIHRyaWFsc1xuICAgICAqL1xuICAgIGl0KCdzaG91bGQgY2FsbCBpbml0IGpvYiBSRVRSSUFMX0NPVU5UIG51bWJlciBvZiB0aW1lcycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGV4dHJhY3RvciA9IG5ldyBNb2NrZWRJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvcihcbiAgICAgICAgRXJnb05ldHdvcmtUeXBlLk5vZGUsXG4gICAgICAgICdub2RlX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBjb25zdCByZW1vdmVTcHkgPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4dHJhY3RvclsnYWN0aW9ucyddID0ge1xuICAgICAgICByZW1vdmVBbGxEYXRhOiByZW1vdmVTcHksXG4gICAgICB9IGFzIHVua25vd24gYXMgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgICAgICAgQWJzdHJhY3RCb3hEYXRhLFxuICAgICAgICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbiAgICAgID47XG4gICAgICBjb25zdCBpbml0U3B5ID0gdml0ZXN0LmZuKCkubW9ja1JlamVjdGVkVmFsdWUoMCk7XG4gICAgICBhd2FpdCBleHBlY3QoXG4gICAgICAgIGFzeW5jICgpID0+IGF3YWl0IGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10oaW5pdFNweSksXG4gICAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgICBleHBlY3QocmVtb3ZlU3B5KS50b0hhdmVCZWVuQ2FsbGVkT25jZSgpO1xuICAgICAgZXhwZWN0KGluaXRTcHkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcyhSRVRSSUFMX0NPVU5UKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ2luaXRpYWxpemVXaXRoTm9kZScsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IGluaXRpYWxpemVXaXRoTm9kZSBzaG91bGQgcHJvY2VzcyBhbGwgdHJhbnNhY3Rpb25zIGJlbGxvdyB0aGUgaW5pdCBoZWlnaHQgdHdpY2VcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogLSBub2RlIG5ldHdvcmtcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0YCBpbiBub2RlIG5ldHdvcmtcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0VG90YWxUeENvdW50YCB0byByZXR1cm4gM1xuICAgICAqIC0gcnVuIHRlc3QgKGNhbGwgYGluaXRpYWxpemVXaXRoTm9kZWApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBmaWx0ZXIgdGhlIHRyYW5zYWN0aW9ucyBhbmQgcHJvY2VzcyB0aGUgdHhzIGJlbGxvdyB0aGUgaW5pdCBoZWlnaHRcbiAgICAgKiAtIHRvIHByb2Nlc3MgYWxsIGZpbHRlcmVkIHRyYW5zYWN0aW9ucyB0d2ljZVxuICAgICAqL1xuICAgIGl0KCdzaG91bGQgcHJvY2VzcyBhbGwgdHJhbnNhY3Rpb25zIGJlbGxvdyB0aGUgaW5pdCBoZWlnaHQgdHdpY2UnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IoXG4gICAgICAgIEVyZ29OZXR3b3JrVHlwZS5Ob2RlLFxuICAgICAgICAnbm9kZV91cmwnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICApO1xuICAgICAgKFxuICAgICAgICBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBOb2RlTmV0d29ya1xuICAgICAgKS5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICBpdGVtczogdHJhbnNhY3Rpb25CYXRjaCxcbiAgICAgICAgdG90YWw6IDMsXG4gICAgICB9KTtcbiAgICAgIGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10gPSBhc3luYyAoam9iOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBqb2IoKTtcbiAgICAgIGV4dHJhY3RvclsnZ2V0VG90YWxUeENvdW50J10gPSBhc3luYyAoKSA9PiAzO1xuICAgICAgY29uc3QgcHJvY2Vzc1NweSA9IHZpdGVzdC5mbigpO1xuICAgICAgZXh0cmFjdG9yWydwcm9jZXNzVHJhbnNhY3Rpb25CYXRjaCddID0gcHJvY2Vzc1NweTtcbiAgICAgIGF3YWl0IGV4dHJhY3RvclsnaW5pdGlhbGl6ZVdpdGhOb2RlJ10oeyBoYXNoOiAnaGFzaCcsIGhlaWdodDogMTMyMDY5OCB9KTtcbiAgICAgIGV4cGVjdChwcm9jZXNzU3B5KS50b0JlQ2FsbGVkVGltZXMoMik7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9CZUNhbGxlZFdpdGgoW3RyYW5zYWN0aW9uQmF0Y2hbMl1dKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgaW5pdGlhbGl6ZVdpdGhOb2RlIHNob3VsZCB0aHJvdyBlcnJvciB3aGVuIHRvdGFsIHRyYW5zYWN0aW9uIGNvdW50IGNoYW5nZXNcbiAgICAgKiBAZGVwZW5kZW5jaWVzXG4gICAgICogLSBub2RlIG5ldHdvcmtcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIG1vY2sgZXh0cmFjdG9yXG4gICAgICogLSBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0YCBpbiBub2RlIG5ldHdvcmtcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0VG90YWxUeENvdW50YCB0byByZXR1cm4gMyB0aGVuIDRcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGBpbml0aWFsaXplV2l0aE5vZGVgKVxuICAgICAqIEBleHBlY3RlZFxuICAgICAqIC0gdG8gdGhyb3cgZXJyb3Igd2hlbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBjaGFuZ2UgZHVyaW5nIGluaXRpYWxpemF0aW9uXG4gICAgICovXG4gICAgaXQoJ3Nob3VsZCB0aHJvdyBlcnJvciB3aGVuIHRvdGFsIHRyYW5zYWN0aW9uIGNvdW50IGNoYW5nZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IoXG4gICAgICAgIEVyZ29OZXR3b3JrVHlwZS5Ob2RlLFxuICAgICAgICAnbm9kZV91cmwnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICApO1xuICAgICAgKFxuICAgICAgICBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBOb2RlTmV0d29ya1xuICAgICAgKS5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aE9mZnNldExpbWl0ID0gdml0ZXN0LmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoe1xuICAgICAgICBpdGVtczogdHJhbnNhY3Rpb25CYXRjaCxcbiAgICAgICAgdG90YWw6IDMsXG4gICAgICB9KTtcbiAgICAgIGV4dHJhY3RvclsnaW5pdFdpdGhSZXRyaWFsJ10gPSBhc3luYyAoam9iOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiBqb2IoKTtcbiAgICAgIGV4dHJhY3RvclsnZ2V0VG90YWxUeENvdW50J10gPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZSgzKVxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWUoNCk7XG4gICAgICBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10gPSB2aXRlc3QuZm4oKTtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICBleHRyYWN0b3JbJ2luaXRpYWxpemVXaXRoTm9kZSddKHsgaGFzaDogJ2hhc2gnLCBoZWlnaHQ6IDEzMjA2OTggfSksXG4gICAgICApLnJlamVjdHMudG9UaHJvd0Vycm9yKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdpbml0aWFsaXplV2l0aEV4cGxvcmVyJywgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIEB0YXJnZXQgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlciBzaG91bGQgbGltaXQgdGhlIGhlaWdodCBhbmQgcHJvY2Vzc1xuICAgICAqIHRyYW5zYWN0aW9ucyB3aGVuIHRoZXkgYXJlIGxlc3MgdGhhbiB0aGUgQVBJX0xJTUlUXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIC0gZXhwbG9yZXIgbmV0d29ya1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0QWRkcmVzc1RyYW5zYWN0aW9uc1dpdGhIZWlnaHRgIGluIGV4cGxvcmVyIG5ldHdvcmtcbiAgICAgKiAgICByZXR1cm4gQVBJX0xJTUlUIHRyYW5zYWN0aW9ucyBpbiBmaXJzdCBjYWxsICh0byBsaW1pdCB0aGUgaGVpZ2h0IHJhbmdlKVxuICAgICAqICAgIHJldHVybiAwIHRyYW5zYWN0aW9ucyBpbiBzZWNvbmQgY2FsbCAodG8gcGFzcyBhIHJhbmdlIHdpdGhvdXQgcHJvY2VzcylcbiAgICAgKiAgICByZXR1cm4gdHJhbnNhY3Rpb25CYXRjaCBpbiBsYXN0IGNhbGwgKHRvIHByb2Nlc3MgdGhlIHRyYW5zYWN0aW9ucyB3aGVuIHRoZXkgYXJlIGxlc3MgdGhhbiBBUElfTElNSVQpXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlcmApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBsaW1pdCB0aGUgaGVpZ2h0IHdoZW4gdGhlIHRyYW5zYWN0aW9uIGNvdW50IGlzIGVxdWFsIHRvIEFQSV9MSU1JVFxuICAgICAqIC0gdG8gY292ZXIgYWxsIGhlaWdodCByYW5nZXNcbiAgICAgKiAtIHRvIHByb2Nlc3MgdHJhbnNhY3Rpb25zIHdoZW4gdGhleSBhcmUgbGVzcyB0aGFuIEFQSV9MSU1JVFxuICAgICAqL1xuICAgIGl0KGBzaG91bGQgbGltaXQgdGhlIGhlaWdodCBhbmQgcHJvY2VzcyB0cmFuc2FjdGlvbnMgd2hlbiB0aGV5IGFyZSBsZXNzIHRoYW5cbiAgICAgIHRoZSBBUElfTElNSVRgLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBleHRyYWN0b3IgPSBuZXcgTW9ja2VkSW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3IoXG4gICAgICAgIEVyZ29OZXR3b3JrVHlwZS5FeHBsb3JlcixcbiAgICAgICAgJ2V4cGxvcmVyX3VybCcsXG4gICAgICAgICdhZGRyZXNzJyxcbiAgICAgICk7XG4gICAgICBleHRyYWN0b3JbJ2luaXRXaXRoUmV0cmlhbCddID0gYXN5bmMgKGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gam9iKCk7XG4gICAgICBjb25zdCBhZGRyZXNzVHhTcHkgPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlT25jZShuZXcgQXJyYXkoMTAwKS5maWxsKHRyYW5zYWN0aW9uQmF0Y2hbMF0pKVxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKFtdKVxuICAgICAgICAubW9ja1Jlc29sdmVkVmFsdWVPbmNlKHRyYW5zYWN0aW9uQmF0Y2gpO1xuICAgICAgKFxuICAgICAgICBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBFeHBsb3Jlck5ldHdvcmtcbiAgICAgICkuZ2V0QWRkcmVzc1RyYW5zYWN0aW9uc1dpdGhIZWlnaHQgPSBhZGRyZXNzVHhTcHk7XG4gICAgICBjb25zdCBwcm9jZXNzU3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10gPSBwcm9jZXNzU3B5O1xuICAgICAgYXdhaXQgZXh0cmFjdG9yWydpbml0aWFsaXplV2l0aEV4cGxvcmVyJ10oe1xuICAgICAgICBoYXNoOiAnaGFzaCcsXG4gICAgICAgIGhlaWdodDogMTMyMDgwMCxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGFkZHJlc3NUeFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoJ2FkZHJlc3MnLCAwLCAxMzIwODAwKTtcbiAgICAgIGV4cGVjdChhZGRyZXNzVHhTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdhZGRyZXNzJywgMCwgNjYwNDAwKTtcbiAgICAgIGV4cGVjdChhZGRyZXNzVHhTcHkpLnRvSGF2ZUJlZW5MYXN0Q2FsbGVkV2l0aCgnYWRkcmVzcycsIDY2MDQwMSwgMTMyMDgwMCk7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuICAgICAgZXhwZWN0KHByb2Nlc3NTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHRyYW5zYWN0aW9uQmF0Y2gpO1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogQHRhcmdldCBpbml0aWFsaXplV2l0aEV4cGxvcmVyIHNob3VsZCBwcm9jZXNzIGFsbCBibG9jayB0cmFuc2FjdGlvbnMgd2hlblxuICAgICAqIHRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGluIHRoZSBibG9jayBpcyBtb3JlIHRoYW4gQVBJX0xJTUlUXG4gICAgICogQGRlcGVuZGVuY2llc1xuICAgICAqIC0gZXhwbG9yZXIgbmV0d29ya1xuICAgICAqIEBzY2VuYXJpb1xuICAgICAqIC0gbW9jayBleHRyYWN0b3JcbiAgICAgKiAtIG1vY2sgYGluaXRXaXRoUmV0cmlhbGAgdG8gcnVuIHRoZSBqb2Igb25jZVxuICAgICAqIC0gbW9jayBgZ2V0QWRkcmVzc1RyYW5zYWN0aW9uc1dpdGhIZWlnaHRgIHRvIHJldHVybiAxMDAgdHJhbnNhY3Rpb25zIGluIG9uZSBibG9ja1xuICAgICAqIC0gc3B5IGFsbCBvdGhlciBmdW5jdGlvbnMgdG8gY2hlY2sgdGhlIGNhbGxzXG4gICAgICogLSBydW4gdGVzdCAoY2FsbCBgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlcmApXG4gICAgICogQGV4cGVjdGVkXG4gICAgICogLSB0byBwcm9jZXNzIGFsbCB0cmFuc2FjdGlvbnMgaW4gYmxvY2sgMTMyMDAwMFxuICAgICAqIC0gbm90IHRvIHN0dWNrIGF0IGEgbGFyZ2UgYmxvY2sgYW5kIGNvbXBsZXRlIHRoZSBwcm9jZXNzXG4gICAgICovXG4gICAgaXQoYHNob3VsZCBwcm9jZXNzIGFsbCBibG9jayB0cmFuc2FjdGlvbnMgd2hlbiB0aGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpblxuICAgICAgdGhlIGJsb2NrIGlzIG1vcmUgdGhhbiBBUElfTElNSVRgLCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBtb2NrIGV4dHJhY3RvclxuICAgICAgY29uc3QgZXh0cmFjdG9yID0gbmV3IE1vY2tlZEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yKFxuICAgICAgICBFcmdvTmV0d29ya1R5cGUuRXhwbG9yZXIsXG4gICAgICAgICdleHBsb3Jlcl91cmwnLFxuICAgICAgICAnYWRkcmVzcycsXG4gICAgICApO1xuICAgICAgLy8gbW9jayBgaW5pdFdpdGhSZXRyaWFsYCB0byBydW4gdGhlIGpvYiBvbmNlXG4gICAgICBleHRyYWN0b3JbJ2luaXRXaXRoUmV0cmlhbCddID0gYXN5bmMgKGpvYjogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4gam9iKCk7XG4gICAgICAvLyBtb2NrIGBnZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aEhlaWdodGAgdG8gcmV0dXJuIDEwMCB0cmFuc2FjdGlvbnMgaW4gb25lIGJsb2NrXG4gICAgICBjb25zdCBleE5ldHdvcmsgPSBleHRyYWN0b3JbJ25ldHdvcmsnXSBhcyBFeHBsb3Jlck5ldHdvcms7XG4gICAgICBjb25zdCBhZGRyZXNzVHhTcHkgPSB2aXRlc3RcbiAgICAgICAgLmZuKClcbiAgICAgICAgLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgICAgICAoYWRkcmVzczogc3RyaW5nLCBmcm9tSGVpZ2h0OiBudW1iZXIsIHRvSGVpZ2h0OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGlmIChmcm9tSGVpZ2h0IDw9IDEzMjAwMDAgJiYgdG9IZWlnaHQgPj0gMTMyMDAwMClcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheSgxMDApLmZpbGwodHJhbnNhY3Rpb25CYXRjaFswXSk7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIGV4TmV0d29yay5nZXRBZGRyZXNzVHJhbnNhY3Rpb25zV2l0aEhlaWdodCA9IGFkZHJlc3NUeFNweTtcbiAgICAgIC8vIHNweSBhbGwgb3RoZXIgZnVuY3Rpb25zIHRvIGNoZWNrIHRoZSBjYWxsc1xuICAgICAgY29uc3QgYmxvY2tJZFNweSA9IHZpLmZuKCkubW9ja1Jlc29sdmVkVmFsdWUoJ2Jsb2NrSWQnKTtcbiAgICAgIGNvbnN0IGJsb2NrVHhzU3B5ID0gdmkuZm4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSk7XG4gICAgICBleE5ldHdvcmsuZ2V0QmxvY2tJZEF0SGVpZ2h0ID0gYmxvY2tJZFNweTtcbiAgICAgIGV4TmV0d29yay5nZXRCbG9ja1R4cyA9IGJsb2NrVHhzU3B5O1xuICAgICAgY29uc3QgcHJvY2Vzc1NweSA9IHZpdGVzdC5mbigpO1xuICAgICAgY29uc3QgcHJvY2Vzc0JhdGNoU3B5ID0gdml0ZXN0LmZuKCk7XG4gICAgICBleHRyYWN0b3IucHJvY2Vzc1RyYW5zYWN0aW9ucyA9IHByb2Nlc3NTcHk7XG4gICAgICBleHRyYWN0b3JbJ3Byb2Nlc3NUcmFuc2FjdGlvbkJhdGNoJ10gPSBwcm9jZXNzQmF0Y2hTcHk7XG4gICAgICAvLyBydW4gdGVzdCAoY2FsbCBgaW5pdGlhbGl6ZVdpdGhFeHBsb3JlcmApXG4gICAgICBhd2FpdCBleHRyYWN0b3JbJ2luaXRpYWxpemVXaXRoRXhwbG9yZXInXSh7XG4gICAgICAgIGhhc2g6ICdoYXNoJyxcbiAgICAgICAgaGVpZ2h0OiAxMzIwODAwLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoYmxvY2tJZFNweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoMTMyMDAwMCk7XG4gICAgICBleHBlY3QoYmxvY2tUeHNTcHkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKCdibG9ja0lkJyk7XG4gICAgICBleHBlY3QocHJvY2Vzc1NweSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoW10sIHtcbiAgICAgICAgaGFzaDogJ2Jsb2NrSWQnLFxuICAgICAgICBoZWlnaHQ6IDEzMjAwMDAsXG4gICAgICB9KTtcbiAgICAgIGV4cGVjdChwcm9jZXNzQmF0Y2hTcHkpLm5vdC50b0JlQ2FsbGVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,15 +0,0 @@
1
- import { DataSource } from '@rosen-bridge/extended-typeorm';
2
- import { BlockInfo } from '@rosen-bridge/scanner-interfaces';
3
- import { AbstractErgoExtractorEntity, AbstractBoxData, AbstractInitializableErgoExtractorAction } from '../../lib';
4
- export declare class TestInitializableErgoExtractorAction extends AbstractInitializableErgoExtractorAction<AbstractBoxData, AbstractErgoExtractorEntity> {
5
- constructor(dataSource: DataSource);
6
- /**
7
- * create the test database entity from data and block information
8
- */
9
- createEntity: (boxes: AbstractBoxData[], block: BlockInfo, extractor: string) => Omit<AbstractErgoExtractorEntity, "id">[];
10
- /**
11
- * convert the database entity back to raw data
12
- */
13
- convertEntityToData: (entities: AbstractErgoExtractorEntity[]) => AbstractBoxData[];
14
- }
15
- //# sourceMappingURL=AbstractInitializableAction.mock.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AbstractInitializableAction.mock.d.ts","sourceRoot":"","sources":["../../../tests/initializable/AbstractInitializableAction.mock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAE7D,OAAO,EACL,2BAA2B,EAC3B,eAAe,EACf,wCAAwC,EACzC,MAAM,WAAW,CAAC;AAGnB,qBAAa,oCAAqC,SAAQ,wCAAwC,CAChG,eAAe,EACf,2BAA2B,CAC5B;gBACa,UAAU,EAAE,UAAU;IAIlC;;OAEG;IACH,YAAY,GACV,OAAO,eAAe,EAAE,EACxB,OAAO,SAAS,EAChB,WAAW,MAAM,KAChB,IAAI,CAAC,2BAA2B,EAAE,IAAI,CAAC,EAAE,CAQ1C;IAEF;;OAEG;IACH,mBAAmB,GACjB,UAAU,2BAA2B,EAAE,KACtC,eAAe,EAAE,CAElB;CACH"}
@@ -1,27 +0,0 @@
1
- import { pick } from 'lodash-es';
2
- import { AbstractInitializableErgoExtractorAction, } from '../../lib';
3
- import { TestEntity } from '../testUtils';
4
- export class TestInitializableErgoExtractorAction extends AbstractInitializableErgoExtractorAction {
5
- constructor(dataSource) {
6
- super(dataSource, TestEntity);
7
- }
8
- /**
9
- * create the test database entity from data and block information
10
- */
11
- createEntity = (boxes, block, extractor) => {
12
- return boxes.map((box) => ({
13
- boxId: box.boxId,
14
- block: block.hash,
15
- height: block.height,
16
- serialized: box.serialized,
17
- extractor: extractor,
18
- }));
19
- };
20
- /**
21
- * convert the database entity back to raw data
22
- */
23
- convertEntityToData = (entities) => {
24
- return entities.map((data) => pick(data, ['boxId', 'serialized']));
25
- };
26
- }
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlQWN0aW9uLm1vY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbi5tb2NrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHakMsT0FBTyxFQUdMLHdDQUF3QyxHQUN6QyxNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTFDLE1BQU0sT0FBTyxvQ0FBcUMsU0FBUSx3Q0FHekQ7SUFDQyxZQUFZLFVBQXNCO1FBQ2hDLEtBQUssQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWSxHQUFHLENBQ2IsS0FBd0IsRUFDeEIsS0FBZ0IsRUFDaEIsU0FBaUIsRUFDMEIsRUFBRTtRQUM3QyxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDekIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNqQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07WUFDcEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxVQUFVO1lBQzFCLFNBQVMsRUFBRSxTQUFTO1NBQ3JCLENBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDO0lBRUY7O09BRUc7SUFDSCxtQkFBbUIsR0FBRyxDQUNwQixRQUF1QyxFQUNwQixFQUFFO1FBQ3JCLE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDO0NBQ0giLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9leHRlbmRlZC10eXBlb3JtJztcbmltcG9ydCB7IHBpY2sgfSBmcm9tICdsb2Rhc2gtZXMnO1xuaW1wb3J0IHsgQmxvY2tJbmZvIH0gZnJvbSAnQHJvc2VuLWJyaWRnZS9zY2FubmVyLWludGVyZmFjZXMnO1xuXG5pbXBvcnQge1xuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHksXG4gIEFic3RyYWN0Qm94RGF0YSxcbiAgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbixcbn0gZnJvbSAnLi4vLi4vbGliJztcbmltcG9ydCB7IFRlc3RFbnRpdHkgfSBmcm9tICcuLi90ZXN0VXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgVGVzdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbjxcbiAgQWJzdHJhY3RCb3hEYXRhLFxuICBBYnN0cmFjdEVyZ29FeHRyYWN0b3JFbnRpdHlcbj4ge1xuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlOiBEYXRhU291cmNlKSB7XG4gICAgc3VwZXIoZGF0YVNvdXJjZSwgVGVzdEVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICogY3JlYXRlIHRoZSB0ZXN0IGRhdGFiYXNlIGVudGl0eSBmcm9tIGRhdGEgYW5kIGJsb2NrIGluZm9ybWF0aW9uXG4gICAqL1xuICBjcmVhdGVFbnRpdHkgPSAoXG4gICAgYm94ZXM6IEFic3RyYWN0Qm94RGF0YVtdLFxuICAgIGJsb2NrOiBCbG9ja0luZm8sXG4gICAgZXh0cmFjdG9yOiBzdHJpbmcsXG4gICk6IE9taXQ8QWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5LCAnaWQnPltdID0+IHtcbiAgICByZXR1cm4gYm94ZXMubWFwKChib3gpID0+ICh7XG4gICAgICBib3hJZDogYm94LmJveElkLFxuICAgICAgYmxvY2s6IGJsb2NrLmhhc2gsXG4gICAgICBoZWlnaHQ6IGJsb2NrLmhlaWdodCxcbiAgICAgIHNlcmlhbGl6ZWQ6IGJveC5zZXJpYWxpemVkLFxuICAgICAgZXh0cmFjdG9yOiBleHRyYWN0b3IsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0IHRoZSBkYXRhYmFzZSBlbnRpdHkgYmFjayB0byByYXcgZGF0YVxuICAgKi9cbiAgY29udmVydEVudGl0eVRvRGF0YSA9IChcbiAgICBlbnRpdGllczogQWJzdHJhY3RFcmdvRXh0cmFjdG9yRW50aXR5W10sXG4gICk6IEFic3RyYWN0Qm94RGF0YVtdID0+IHtcbiAgICByZXR1cm4gZW50aXRpZXMubWFwKChkYXRhKSA9PiBwaWNrKGRhdGEsIFsnYm94SWQnLCAnc2VyaWFsaXplZCddKSk7XG4gIH07XG59XG4iXX0=
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=AbstractInitializableAction.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AbstractInitializableAction.spec.d.ts","sourceRoot":"","sources":["../../../tests/initializable/AbstractInitializableAction.spec.ts"],"names":[],"mappings":""}
@@ -1,54 +0,0 @@
1
- import { TestInitializableErgoExtractorAction } from './AbstractInitializableAction.mock';
2
- import { createDatabase, TestEntity } from '../testUtils';
3
- import { sampleEntities } from '../testData';
4
- describe('AbstractErgoExtractorAction', () => {
5
- let dataSource;
6
- let action;
7
- let repository;
8
- beforeEach(async () => {
9
- dataSource = await createDatabase();
10
- action = new TestInitializableErgoExtractorAction(dataSource);
11
- repository = dataSource.getRepository(TestEntity);
12
- });
13
- describe('removeAllData', () => {
14
- /**
15
- * @target removeAllData should remove all available data related to this extractor
16
- * @dependencies
17
- * @scenario
18
- * - insert 4 entities related to this extractor
19
- * - run test (call `removeAllData`)
20
- * @expected
21
- * - to have 4 entities before removing
22
- * - to have no remaining entities after remove
23
- */
24
- it(`should remove all available data related to this extractor`, async () => {
25
- await dataSource.getRepository(TestEntity).insert(sampleEntities);
26
- const countBefore = await repository.count();
27
- await action.removeAllData('extractor');
28
- const countAfter = await repository.count();
29
- expect(countBefore).toEqual(4);
30
- expect(countAfter).toEqual(0);
31
- });
32
- /**
33
- * @target removeAllData should not remove any data related to another extractor
34
- * @dependencies
35
- * @scenario
36
- * - insert 4 entities related to another extractor
37
- * - run test (call `removeAllData`)
38
- * @expected
39
- * - to have 4 entities after removing
40
- */
41
- it(`should not remove any data related to another extractor`, async () => {
42
- await dataSource.getRepository(TestEntity).insert(sampleEntities.map((entity) => ({
43
- ...entity,
44
- extractor: 'extractor-new',
45
- })));
46
- const countBefore = await repository.count();
47
- await action.removeAllData('extractor');
48
- const countAfter = await repository.count();
49
- expect(countBefore).toEqual(4);
50
- expect(countAfter).toEqual(4);
51
- });
52
- });
53
- });
54
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RJbml0aWFsaXphYmxlQWN0aW9uLnNwZWMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0cy9pbml0aWFsaXphYmxlL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbi5zcGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzFGLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0MsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtJQUMzQyxJQUFJLFVBQXNCLENBQUM7SUFDM0IsSUFBSSxNQUE0QyxDQUFDO0lBQ2pELElBQUksVUFBa0MsQ0FBQztJQUN2QyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUU7UUFDcEIsVUFBVSxHQUFHLE1BQU0sY0FBYyxFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLElBQUksb0NBQW9DLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDOUQsVUFBVSxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTtRQUM3Qjs7Ozs7Ozs7O1dBU0c7UUFDSCxFQUFFLENBQUMsNERBQTRELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDMUUsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsRSxNQUFNLFdBQVcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUU3QyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUg7Ozs7Ozs7O1dBUUc7UUFDSCxFQUFFLENBQUMseURBQXlELEVBQUUsS0FBSyxJQUFJLEVBQUU7WUFDdkUsTUFBTSxVQUFVLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FDL0MsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDOUIsR0FBRyxNQUFNO2dCQUNULFNBQVMsRUFBRSxlQUFlO2FBQzNCLENBQUMsQ0FBQyxDQUNKLENBQUM7WUFDRixNQUFNLFdBQVcsR0FBRyxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUU3QyxNQUFNLE1BQU0sQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7WUFFNUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UsIFJlcG9zaXRvcnkgfSBmcm9tICdAcm9zZW4tYnJpZGdlL2V4dGVuZGVkLXR5cGVvcm0nO1xuXG5pbXBvcnQgeyBUZXN0SW5pdGlhbGl6YWJsZUVyZ29FeHRyYWN0b3JBY3Rpb24gfSBmcm9tICcuL0Fic3RyYWN0SW5pdGlhbGl6YWJsZUFjdGlvbi5tb2NrJztcbmltcG9ydCB7IGNyZWF0ZURhdGFiYXNlLCBUZXN0RW50aXR5IH0gZnJvbSAnLi4vdGVzdFV0aWxzJztcbmltcG9ydCB7IHNhbXBsZUVudGl0aWVzIH0gZnJvbSAnLi4vdGVzdERhdGEnO1xuXG5kZXNjcmliZSgnQWJzdHJhY3RFcmdvRXh0cmFjdG9yQWN0aW9uJywgKCkgPT4ge1xuICBsZXQgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbiAgbGV0IGFjdGlvbjogVGVzdEluaXRpYWxpemFibGVFcmdvRXh0cmFjdG9yQWN0aW9uO1xuICBsZXQgcmVwb3NpdG9yeTogUmVwb3NpdG9yeTxUZXN0RW50aXR5PjtcbiAgYmVmb3JlRWFjaChhc3luYyAoKSA9PiB7XG4gICAgZGF0YVNvdXJjZSA9IGF3YWl0IGNyZWF0ZURhdGFiYXNlKCk7XG4gICAgYWN0aW9uID0gbmV3IFRlc3RJbml0aWFsaXphYmxlRXJnb0V4dHJhY3RvckFjdGlvbihkYXRhU291cmNlKTtcbiAgICByZXBvc2l0b3J5ID0gZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFRlc3RFbnRpdHkpO1xuICB9KTtcblxuICBkZXNjcmliZSgncmVtb3ZlQWxsRGF0YScsICgpID0+IHtcbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHJlbW92ZUFsbERhdGEgc2hvdWxkIHJlbW92ZSBhbGwgYXZhaWxhYmxlIGRhdGEgcmVsYXRlZCB0byB0aGlzIGV4dHJhY3RvclxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCA0IGVudGl0aWVzIHJlbGF0ZWQgdG8gdGhpcyBleHRyYWN0b3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGByZW1vdmVBbGxEYXRhYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIGhhdmUgNCBlbnRpdGllcyBiZWZvcmUgcmVtb3ZpbmdcbiAgICAgKiAtIHRvIGhhdmUgbm8gcmVtYWluaW5nIGVudGl0aWVzIGFmdGVyIHJlbW92ZVxuICAgICAqL1xuICAgIGl0KGBzaG91bGQgcmVtb3ZlIGFsbCBhdmFpbGFibGUgZGF0YSByZWxhdGVkIHRvIHRoaXMgZXh0cmFjdG9yYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFRlc3RFbnRpdHkpLmluc2VydChzYW1wbGVFbnRpdGllcyk7XG4gICAgICBjb25zdCBjb3VudEJlZm9yZSA9IGF3YWl0IHJlcG9zaXRvcnkuY291bnQoKTtcblxuICAgICAgYXdhaXQgYWN0aW9uLnJlbW92ZUFsbERhdGEoJ2V4dHJhY3RvcicpO1xuICAgICAgY29uc3QgY291bnRBZnRlciA9IGF3YWl0IHJlcG9zaXRvcnkuY291bnQoKTtcblxuICAgICAgZXhwZWN0KGNvdW50QmVmb3JlKS50b0VxdWFsKDQpO1xuICAgICAgZXhwZWN0KGNvdW50QWZ0ZXIpLnRvRXF1YWwoMCk7XG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiBAdGFyZ2V0IHJlbW92ZUFsbERhdGEgc2hvdWxkIG5vdCByZW1vdmUgYW55IGRhdGEgcmVsYXRlZCB0byBhbm90aGVyIGV4dHJhY3RvclxuICAgICAqIEBkZXBlbmRlbmNpZXNcbiAgICAgKiBAc2NlbmFyaW9cbiAgICAgKiAtIGluc2VydCA0IGVudGl0aWVzIHJlbGF0ZWQgdG8gYW5vdGhlciBleHRyYWN0b3JcbiAgICAgKiAtIHJ1biB0ZXN0IChjYWxsIGByZW1vdmVBbGxEYXRhYClcbiAgICAgKiBAZXhwZWN0ZWRcbiAgICAgKiAtIHRvIGhhdmUgNCBlbnRpdGllcyBhZnRlciByZW1vdmluZ1xuICAgICAqL1xuICAgIGl0KGBzaG91bGQgbm90IHJlbW92ZSBhbnkgZGF0YSByZWxhdGVkIHRvIGFub3RoZXIgZXh0cmFjdG9yYCwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFRlc3RFbnRpdHkpLmluc2VydChcbiAgICAgICAgc2FtcGxlRW50aXRpZXMubWFwKChlbnRpdHkpID0+ICh7XG4gICAgICAgICAgLi4uZW50aXR5LFxuICAgICAgICAgIGV4dHJhY3RvcjogJ2V4dHJhY3Rvci1uZXcnLFxuICAgICAgICB9KSksXG4gICAgICApO1xuICAgICAgY29uc3QgY291bnRCZWZvcmUgPSBhd2FpdCByZXBvc2l0b3J5LmNvdW50KCk7XG5cbiAgICAgIGF3YWl0IGFjdGlvbi5yZW1vdmVBbGxEYXRhKCdleHRyYWN0b3InKTtcbiAgICAgIGNvbnN0IGNvdW50QWZ0ZXIgPSBhd2FpdCByZXBvc2l0b3J5LmNvdW50KCk7XG5cbiAgICAgIGV4cGVjdChjb3VudEJlZm9yZSkudG9FcXVhbCg0KTtcbiAgICAgIGV4cGVjdChjb3VudEFmdGVyKS50b0VxdWFsKDQpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19