@bopen-io/wallet-toolbox 1.7.18

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 (390) hide show
  1. package/.claude/settings.local.json +10 -0
  2. package/.env.template +22 -0
  3. package/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  4. package/.github/ISSUE_TEMPLATE/discussion.md +24 -0
  5. package/.github/pull_request_template.md +22 -0
  6. package/.github/workflows/push.yaml +145 -0
  7. package/.prettierrc +10 -0
  8. package/CHANGELOG.md +280 -0
  9. package/CONTRIBUTING.md +89 -0
  10. package/README.md +43 -0
  11. package/docs/README.md +85 -0
  12. package/docs/client.md +19627 -0
  13. package/docs/monitor.md +953 -0
  14. package/docs/open-rpc/index.html +46 -0
  15. package/docs/services.md +6377 -0
  16. package/docs/setup.md +1268 -0
  17. package/docs/storage.md +5367 -0
  18. package/docs/wallet.md +19626 -0
  19. package/jest.config.ts +25 -0
  20. package/license.md +28 -0
  21. package/out/tsconfig.all.tsbuildinfo +1 -0
  22. package/package.json +63 -0
  23. package/src/CWIStyleWalletManager.ts +1999 -0
  24. package/src/Setup.ts +579 -0
  25. package/src/SetupClient.ts +322 -0
  26. package/src/SetupWallet.ts +108 -0
  27. package/src/SimpleWalletManager.ts +526 -0
  28. package/src/Wallet.ts +1169 -0
  29. package/src/WalletAuthenticationManager.ts +153 -0
  30. package/src/WalletLogger.ts +213 -0
  31. package/src/WalletPermissionsManager.ts +3660 -0
  32. package/src/WalletSettingsManager.ts +114 -0
  33. package/src/__tests/CWIStyleWalletManager.test.d.ts.map +1 -0
  34. package/src/__tests/CWIStyleWalletManager.test.js.map +1 -0
  35. package/src/__tests/CWIStyleWalletManager.test.ts +675 -0
  36. package/src/__tests/WalletPermissionsManager.callbacks.test.ts +323 -0
  37. package/src/__tests/WalletPermissionsManager.checks.test.ts +844 -0
  38. package/src/__tests/WalletPermissionsManager.encryption.test.ts +412 -0
  39. package/src/__tests/WalletPermissionsManager.fixtures.ts +307 -0
  40. package/src/__tests/WalletPermissionsManager.flows.test.ts +462 -0
  41. package/src/__tests/WalletPermissionsManager.initialization.test.ts +300 -0
  42. package/src/__tests/WalletPermissionsManager.pmodules.test.ts +798 -0
  43. package/src/__tests/WalletPermissionsManager.proxying.test.ts +724 -0
  44. package/src/__tests/WalletPermissionsManager.tokens.test.ts +503 -0
  45. package/src/index.all.ts +27 -0
  46. package/src/index.client.ts +25 -0
  47. package/src/index.mobile.ts +21 -0
  48. package/src/index.ts +1 -0
  49. package/src/monitor/Monitor.ts +412 -0
  50. package/src/monitor/MonitorDaemon.ts +188 -0
  51. package/src/monitor/README.md +3 -0
  52. package/src/monitor/__test/MonitorDaemon.man.test.ts +45 -0
  53. package/src/monitor/tasks/TaskCheckForProofs.ts +243 -0
  54. package/src/monitor/tasks/TaskCheckNoSends.ts +73 -0
  55. package/src/monitor/tasks/TaskClock.ts +33 -0
  56. package/src/monitor/tasks/TaskFailAbandoned.ts +54 -0
  57. package/src/monitor/tasks/TaskMonitorCallHistory.ts +26 -0
  58. package/src/monitor/tasks/TaskNewHeader.ts +93 -0
  59. package/src/monitor/tasks/TaskPurge.ts +68 -0
  60. package/src/monitor/tasks/TaskReorg.ts +89 -0
  61. package/src/monitor/tasks/TaskReviewStatus.ts +48 -0
  62. package/src/monitor/tasks/TaskSendWaiting.ts +122 -0
  63. package/src/monitor/tasks/TaskSyncWhenIdle.ts +26 -0
  64. package/src/monitor/tasks/TaskUnFail.ts +151 -0
  65. package/src/monitor/tasks/WalletMonitorTask.ts +47 -0
  66. package/src/sdk/CertOpsWallet.ts +18 -0
  67. package/src/sdk/PrivilegedKeyManager.ts +372 -0
  68. package/src/sdk/README.md +13 -0
  69. package/src/sdk/WERR_errors.ts +234 -0
  70. package/src/sdk/WalletError.ts +170 -0
  71. package/src/sdk/WalletErrorFromJson.ts +80 -0
  72. package/src/sdk/WalletServices.interfaces.ts +700 -0
  73. package/src/sdk/WalletSigner.interfaces.ts +11 -0
  74. package/src/sdk/WalletStorage.interfaces.ts +606 -0
  75. package/src/sdk/__test/CertificateLifeCycle.test.ts +131 -0
  76. package/src/sdk/__test/PrivilegedKeyManager.test.ts +738 -0
  77. package/src/sdk/__test/WalletError.test.ts +318 -0
  78. package/src/sdk/__test/validationHelpers.test.ts +21 -0
  79. package/src/sdk/index.ts +10 -0
  80. package/src/sdk/types.ts +226 -0
  81. package/src/services/README.md +11 -0
  82. package/src/services/ServiceCollection.ts +248 -0
  83. package/src/services/Services.ts +603 -0
  84. package/src/services/__tests/ARC.man.test.ts +123 -0
  85. package/src/services/__tests/ARC.timeout.man.test.ts +79 -0
  86. package/src/services/__tests/ArcGorillaPool.man.test.ts +108 -0
  87. package/src/services/__tests/arcServices.test.ts +8 -0
  88. package/src/services/__tests/bitrails.test.ts +56 -0
  89. package/src/services/__tests/getMerklePath.test.ts +15 -0
  90. package/src/services/__tests/getRawTx.test.ts +13 -0
  91. package/src/services/__tests/postBeef.test.ts +104 -0
  92. package/src/services/__tests/verifyBeef.test.ts +50 -0
  93. package/src/services/chaintracker/BHServiceClient.ts +212 -0
  94. package/src/services/chaintracker/ChaintracksChainTracker.ts +71 -0
  95. package/src/services/chaintracker/__tests/ChaintracksChainTracker.test.ts +33 -0
  96. package/src/services/chaintracker/__tests/ChaintracksServiceClient.test.ts +29 -0
  97. package/src/services/chaintracker/chaintracks/Api/BlockHeaderApi.ts +72 -0
  98. package/src/services/chaintracker/chaintracks/Api/BulkIngestorApi.ts +83 -0
  99. package/src/services/chaintracker/chaintracks/Api/BulkStorageApi.ts +92 -0
  100. package/src/services/chaintracker/chaintracks/Api/ChaintracksApi.ts +64 -0
  101. package/src/services/chaintracker/chaintracks/Api/ChaintracksClientApi.ts +189 -0
  102. package/src/services/chaintracker/chaintracks/Api/ChaintracksFetchApi.ts +18 -0
  103. package/src/services/chaintracker/chaintracks/Api/ChaintracksFsApi.ts +58 -0
  104. package/src/services/chaintracker/chaintracks/Api/ChaintracksStorageApi.ts +386 -0
  105. package/src/services/chaintracker/chaintracks/Api/LiveIngestorApi.ts +25 -0
  106. package/src/services/chaintracker/chaintracks/Chaintracks.ts +609 -0
  107. package/src/services/chaintracker/chaintracks/ChaintracksService.ts +199 -0
  108. package/src/services/chaintracker/chaintracks/ChaintracksServiceClient.ts +154 -0
  109. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorBase.ts +176 -0
  110. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDN.ts +174 -0
  111. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorCDNBabbage.ts +18 -0
  112. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainCdn.ts +113 -0
  113. package/src/services/chaintracker/chaintracks/Ingest/BulkIngestorWhatsOnChainWs.ts +81 -0
  114. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorBase.ts +86 -0
  115. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorTeranodeP2P.ts +59 -0
  116. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainPoll.ts +104 -0
  117. package/src/services/chaintracker/chaintracks/Ingest/LiveIngestorWhatsOnChainWs.ts +66 -0
  118. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainIngestorWs.ts +566 -0
  119. package/src/services/chaintracker/chaintracks/Ingest/WhatsOnChainServices.ts +219 -0
  120. package/src/services/chaintracker/chaintracks/Ingest/__tests/BulkIngestorCDNBabbage.test.ts +54 -0
  121. package/src/services/chaintracker/chaintracks/Ingest/__tests/LiveIngestorWhatsOnChainPoll.test.ts +33 -0
  122. package/src/services/chaintracker/chaintracks/Ingest/__tests/WhatsOnChainServices.test.ts +124 -0
  123. package/src/services/chaintracker/chaintracks/Storage/BulkStorageBase.ts +92 -0
  124. package/src/services/chaintracker/chaintracks/Storage/ChaintracksKnexMigrations.ts +104 -0
  125. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageBase.ts +382 -0
  126. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageIdb.ts +574 -0
  127. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageKnex.ts +438 -0
  128. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageMemory.ts +29 -0
  129. package/src/services/chaintracker/chaintracks/Storage/ChaintracksStorageNoDb.ts +304 -0
  130. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageIdb.test.ts +102 -0
  131. package/src/services/chaintracker/chaintracks/Storage/__tests/ChaintracksStorageKnex.test.ts +45 -0
  132. package/src/services/chaintracker/chaintracks/__tests/Chaintracks.test.ts +77 -0
  133. package/src/services/chaintracker/chaintracks/__tests/ChaintracksClientApi.test.ts +192 -0
  134. package/src/services/chaintracker/chaintracks/__tests/LocalCdnServer.ts +75 -0
  135. package/src/services/chaintracker/chaintracks/__tests/createIdbChaintracks.test.ts +62 -0
  136. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNetBlockHeaders.json +1 -0
  137. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_0.headers +0 -0
  138. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_1.headers +0 -0
  139. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_2.headers +0 -0
  140. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest349/mainNet_3.headers +0 -0
  141. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNetBlockHeaders.json +1 -0
  142. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_0.headers +0 -0
  143. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_1.headers +0 -0
  144. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_2.headers +0 -0
  145. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest379/mainNet_3.headers +0 -0
  146. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNetBlockHeaders.json +1 -0
  147. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_0.headers +0 -0
  148. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_1.headers +0 -0
  149. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_2.headers +0 -0
  150. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest399/mainNet_3.headers +0 -0
  151. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNetBlockHeaders.json +1 -0
  152. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_0.headers +0 -0
  153. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_1.headers +0 -0
  154. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_2.headers +0 -0
  155. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_3.headers +0 -0
  156. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest402/mainNet_4.headers +0 -0
  157. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNetBlockHeaders.json +1 -0
  158. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_0.headers +0 -0
  159. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_1.headers +0 -0
  160. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_2.headers +0 -0
  161. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_3.headers +0 -0
  162. package/src/services/chaintracker/chaintracks/__tests/data/cdnTest499/mainNet_4.headers +0 -0
  163. package/src/services/chaintracker/chaintracks/createDefaultIdbChaintracksOptions.ts +92 -0
  164. package/src/services/chaintracker/chaintracks/createDefaultKnexChaintracksOptions.ts +111 -0
  165. package/src/services/chaintracker/chaintracks/createDefaultNoDbChaintracksOptions.ts +91 -0
  166. package/src/services/chaintracker/chaintracks/createIdbChaintracks.ts +60 -0
  167. package/src/services/chaintracker/chaintracks/createKnexChaintracks.ts +65 -0
  168. package/src/services/chaintracker/chaintracks/createNoDbChaintracks.ts +60 -0
  169. package/src/services/chaintracker/chaintracks/index.all.ts +12 -0
  170. package/src/services/chaintracker/chaintracks/index.client.ts +4 -0
  171. package/src/services/chaintracker/chaintracks/index.mobile.ts +37 -0
  172. package/src/services/chaintracker/chaintracks/util/BulkFileDataManager.ts +975 -0
  173. package/src/services/chaintracker/chaintracks/util/BulkFileDataReader.ts +60 -0
  174. package/src/services/chaintracker/chaintracks/util/BulkFilesReader.ts +336 -0
  175. package/src/services/chaintracker/chaintracks/util/BulkHeaderFile.ts +247 -0
  176. package/src/services/chaintracker/chaintracks/util/ChaintracksFetch.ts +69 -0
  177. package/src/services/chaintracker/chaintracks/util/ChaintracksFs.ts +141 -0
  178. package/src/services/chaintracker/chaintracks/util/HeightRange.ts +153 -0
  179. package/src/services/chaintracker/chaintracks/util/SingleWriterMultiReaderLock.ts +76 -0
  180. package/src/services/chaintracker/chaintracks/util/__tests/BulkFileDataManager.test.ts +304 -0
  181. package/src/services/chaintracker/chaintracks/util/__tests/ChaintracksFetch.test.ts +60 -0
  182. package/src/services/chaintracker/chaintracks/util/__tests/HeightRange.test.ts +67 -0
  183. package/src/services/chaintracker/chaintracks/util/__tests/SingleWriterMultiReaderLock.test.ts +49 -0
  184. package/src/services/chaintracker/chaintracks/util/blockHeaderUtilities.ts +573 -0
  185. package/src/services/chaintracker/chaintracks/util/dirtyHashes.ts +29 -0
  186. package/src/services/chaintracker/chaintracks/util/validBulkHeaderFilesByFileHash.ts +432 -0
  187. package/src/services/chaintracker/index.all.ts +4 -0
  188. package/src/services/chaintracker/index.client.ts +4 -0
  189. package/src/services/chaintracker/index.mobile.ts +4 -0
  190. package/src/services/createDefaultWalletServicesOptions.ts +77 -0
  191. package/src/services/index.ts +1 -0
  192. package/src/services/processingErrors/arcSuccessError.json +76 -0
  193. package/src/services/providers/ARC.ts +350 -0
  194. package/src/services/providers/Bitails.ts +256 -0
  195. package/src/services/providers/SdkWhatsOnChain.ts +83 -0
  196. package/src/services/providers/WhatsOnChain.ts +883 -0
  197. package/src/services/providers/__tests/WhatsOnChain.test.ts +242 -0
  198. package/src/services/providers/__tests/exchangeRates.test.ts +18 -0
  199. package/src/services/providers/exchangeRates.ts +265 -0
  200. package/src/services/providers/getBeefForTxid.ts +369 -0
  201. package/src/signer/README.md +5 -0
  202. package/src/signer/WalletSigner.ts +17 -0
  203. package/src/signer/methods/acquireDirectCertificate.ts +52 -0
  204. package/src/signer/methods/buildSignableTransaction.ts +183 -0
  205. package/src/signer/methods/completeSignedTransaction.ts +117 -0
  206. package/src/signer/methods/createAction.ts +172 -0
  207. package/src/signer/methods/internalizeAction.ts +106 -0
  208. package/src/signer/methods/proveCertificate.ts +43 -0
  209. package/src/signer/methods/signAction.ts +54 -0
  210. package/src/storage/README.md +14 -0
  211. package/src/storage/StorageIdb.ts +2304 -0
  212. package/src/storage/StorageKnex.ts +1425 -0
  213. package/src/storage/StorageProvider.ts +810 -0
  214. package/src/storage/StorageReader.ts +194 -0
  215. package/src/storage/StorageReaderWriter.ts +432 -0
  216. package/src/storage/StorageSyncReader.ts +34 -0
  217. package/src/storage/WalletStorageManager.ts +943 -0
  218. package/src/storage/__test/StorageIdb.test.ts +43 -0
  219. package/src/storage/__test/WalletStorageManager.test.ts +275 -0
  220. package/src/storage/__test/adminStats.man.test.ts +89 -0
  221. package/src/storage/__test/getBeefForTransaction.test.ts +385 -0
  222. package/src/storage/index.all.ts +11 -0
  223. package/src/storage/index.client.ts +7 -0
  224. package/src/storage/index.mobile.ts +6 -0
  225. package/src/storage/methods/ListActionsSpecOp.ts +70 -0
  226. package/src/storage/methods/ListOutputsSpecOp.ts +129 -0
  227. package/src/storage/methods/__test/GenerateChange/generateChangeSdk.test.ts +1057 -0
  228. package/src/storage/methods/__test/GenerateChange/randomValsUsed1.ts +20 -0
  229. package/src/storage/methods/__test/offsetKey.test.ts +274 -0
  230. package/src/storage/methods/attemptToPostReqsToNetwork.ts +389 -0
  231. package/src/storage/methods/createAction.ts +947 -0
  232. package/src/storage/methods/generateChange.ts +556 -0
  233. package/src/storage/methods/getBeefForTransaction.ts +139 -0
  234. package/src/storage/methods/getSyncChunk.ts +293 -0
  235. package/src/storage/methods/internalizeAction.ts +562 -0
  236. package/src/storage/methods/listActionsIdb.ts +183 -0
  237. package/src/storage/methods/listActionsKnex.ts +226 -0
  238. package/src/storage/methods/listCertificates.ts +73 -0
  239. package/src/storage/methods/listOutputsIdb.ts +203 -0
  240. package/src/storage/methods/listOutputsKnex.ts +263 -0
  241. package/src/storage/methods/offsetKey.ts +89 -0
  242. package/src/storage/methods/processAction.ts +420 -0
  243. package/src/storage/methods/purgeData.ts +251 -0
  244. package/src/storage/methods/purgeDataIdb.ts +10 -0
  245. package/src/storage/methods/reviewStatus.ts +101 -0
  246. package/src/storage/methods/reviewStatusIdb.ts +43 -0
  247. package/src/storage/methods/utils.Buffer.ts +33 -0
  248. package/src/storage/methods/utils.ts +56 -0
  249. package/src/storage/remoting/StorageClient.ts +567 -0
  250. package/src/storage/remoting/StorageMobile.ts +544 -0
  251. package/src/storage/remoting/StorageServer.ts +291 -0
  252. package/src/storage/remoting/__test/StorageClient.test.ts +113 -0
  253. package/src/storage/schema/KnexMigrations.ts +489 -0
  254. package/src/storage/schema/StorageIdbSchema.ts +150 -0
  255. package/src/storage/schema/entities/EntityBase.ts +210 -0
  256. package/src/storage/schema/entities/EntityCertificate.ts +188 -0
  257. package/src/storage/schema/entities/EntityCertificateField.ts +136 -0
  258. package/src/storage/schema/entities/EntityCommission.ts +148 -0
  259. package/src/storage/schema/entities/EntityOutput.ts +290 -0
  260. package/src/storage/schema/entities/EntityOutputBasket.ts +153 -0
  261. package/src/storage/schema/entities/EntityOutputTag.ts +121 -0
  262. package/src/storage/schema/entities/EntityOutputTagMap.ts +123 -0
  263. package/src/storage/schema/entities/EntityProvenTx.ts +319 -0
  264. package/src/storage/schema/entities/EntityProvenTxReq.ts +580 -0
  265. package/src/storage/schema/entities/EntitySyncState.ts +389 -0
  266. package/src/storage/schema/entities/EntityTransaction.ts +306 -0
  267. package/src/storage/schema/entities/EntityTxLabel.ts +121 -0
  268. package/src/storage/schema/entities/EntityTxLabelMap.ts +123 -0
  269. package/src/storage/schema/entities/EntityUser.ts +112 -0
  270. package/src/storage/schema/entities/MergeEntity.ts +73 -0
  271. package/src/storage/schema/entities/__tests/CertificateFieldTests.test.ts +353 -0
  272. package/src/storage/schema/entities/__tests/CertificateTests.test.ts +354 -0
  273. package/src/storage/schema/entities/__tests/CommissionTests.test.ts +371 -0
  274. package/src/storage/schema/entities/__tests/OutputBasketTests.test.ts +278 -0
  275. package/src/storage/schema/entities/__tests/OutputTagMapTests.test.ts +242 -0
  276. package/src/storage/schema/entities/__tests/OutputTagTests.test.ts +288 -0
  277. package/src/storage/schema/entities/__tests/OutputTests.test.ts +464 -0
  278. package/src/storage/schema/entities/__tests/ProvenTxReqTests.test.ts +340 -0
  279. package/src/storage/schema/entities/__tests/ProvenTxTests.test.ts +504 -0
  280. package/src/storage/schema/entities/__tests/SyncStateTests.test.ts +288 -0
  281. package/src/storage/schema/entities/__tests/TransactionTests.test.ts +604 -0
  282. package/src/storage/schema/entities/__tests/TxLabelMapTests.test.ts +361 -0
  283. package/src/storage/schema/entities/__tests/TxLabelTests.test.ts +198 -0
  284. package/src/storage/schema/entities/__tests/stampLogTests.test.ts +90 -0
  285. package/src/storage/schema/entities/__tests/usersTests.test.ts +340 -0
  286. package/src/storage/schema/entities/index.ts +16 -0
  287. package/src/storage/schema/tables/TableCertificate.ts +21 -0
  288. package/src/storage/schema/tables/TableCertificateField.ts +12 -0
  289. package/src/storage/schema/tables/TableCommission.ts +13 -0
  290. package/src/storage/schema/tables/TableMonitorEvent.ts +9 -0
  291. package/src/storage/schema/tables/TableOutput.ts +64 -0
  292. package/src/storage/schema/tables/TableOutputBasket.ts +12 -0
  293. package/src/storage/schema/tables/TableOutputTag.ts +10 -0
  294. package/src/storage/schema/tables/TableOutputTagMap.ts +9 -0
  295. package/src/storage/schema/tables/TableProvenTx.ts +14 -0
  296. package/src/storage/schema/tables/TableProvenTxReq.ts +65 -0
  297. package/src/storage/schema/tables/TableSettings.ts +17 -0
  298. package/src/storage/schema/tables/TableSyncState.ts +18 -0
  299. package/src/storage/schema/tables/TableTransaction.ts +54 -0
  300. package/src/storage/schema/tables/TableTxLabel.ts +10 -0
  301. package/src/storage/schema/tables/TableTxLabelMap.ts +9 -0
  302. package/src/storage/schema/tables/TableUser.ts +16 -0
  303. package/src/storage/schema/tables/index.ts +16 -0
  304. package/src/storage/sync/StorageMySQLDojoReader.ts +696 -0
  305. package/src/storage/sync/index.ts +1 -0
  306. package/src/utility/Format.ts +133 -0
  307. package/src/utility/README.md +3 -0
  308. package/src/utility/ReaderUint8Array.ts +187 -0
  309. package/src/utility/ScriptTemplateBRC29.ts +73 -0
  310. package/src/utility/__tests/utilityHelpers.noBuffer.test.ts +109 -0
  311. package/src/utility/aggregateResults.ts +68 -0
  312. package/src/utility/identityUtils.ts +159 -0
  313. package/src/utility/index.all.ts +7 -0
  314. package/src/utility/index.client.ts +7 -0
  315. package/src/utility/parseTxScriptOffsets.ts +29 -0
  316. package/src/utility/stampLog.ts +69 -0
  317. package/src/utility/tscProofToMerklePath.ts +48 -0
  318. package/src/utility/utilityHelpers.buffer.ts +34 -0
  319. package/src/utility/utilityHelpers.noBuffer.ts +60 -0
  320. package/src/utility/utilityHelpers.ts +275 -0
  321. package/src/wab-client/WABClient.ts +94 -0
  322. package/src/wab-client/__tests/WABClient.man.test.ts +59 -0
  323. package/src/wab-client/auth-method-interactors/AuthMethodInteractor.ts +47 -0
  324. package/src/wab-client/auth-method-interactors/DevConsoleInteractor.ts +73 -0
  325. package/src/wab-client/auth-method-interactors/PersonaIDInteractor.ts +35 -0
  326. package/src/wab-client/auth-method-interactors/TwilioPhoneInteractor.ts +72 -0
  327. package/syncVersions.js +71 -0
  328. package/test/Wallet/StorageClient/storageClient.man.test.ts +75 -0
  329. package/test/Wallet/action/abortAction.test.ts +47 -0
  330. package/test/Wallet/action/createAction.test.ts +299 -0
  331. package/test/Wallet/action/createAction2.test.ts +1273 -0
  332. package/test/Wallet/action/createActionToGenerateBeefs.man.test.ts +293 -0
  333. package/test/Wallet/action/internalizeAction.a.test.ts +286 -0
  334. package/test/Wallet/action/internalizeAction.test.ts +682 -0
  335. package/test/Wallet/action/relinquishOutput.test.ts +37 -0
  336. package/test/Wallet/certificate/acquireCertificate.test.ts +298 -0
  337. package/test/Wallet/certificate/listCertificates.test.ts +346 -0
  338. package/test/Wallet/construct/Wallet.constructor.test.ts +57 -0
  339. package/test/Wallet/get/getHeaderForHeight.test.ts +82 -0
  340. package/test/Wallet/get/getHeight.test.ts +52 -0
  341. package/test/Wallet/get/getKnownTxids.test.ts +86 -0
  342. package/test/Wallet/get/getNetwork.test.ts +27 -0
  343. package/test/Wallet/get/getVersion.test.ts +27 -0
  344. package/test/Wallet/list/listActions.test.ts +279 -0
  345. package/test/Wallet/list/listActions2.test.ts +1381 -0
  346. package/test/Wallet/list/listCertificates.test.ts +118 -0
  347. package/test/Wallet/list/listOutputs.test.ts +447 -0
  348. package/test/Wallet/live/walletLive.man.test.ts +521 -0
  349. package/test/Wallet/local/localWallet.man.test.ts +93 -0
  350. package/test/Wallet/local/localWallet2.man.test.ts +277 -0
  351. package/test/Wallet/signAction/mountaintop.man.test.ts +130 -0
  352. package/test/Wallet/specOps/specOps.man.test.ts +220 -0
  353. package/test/Wallet/support/janitor.man.test.ts +40 -0
  354. package/test/Wallet/support/operations.man.test.ts +407 -0
  355. package/test/Wallet/support/reqErrorReview.2025.05.06.man.test.ts +347 -0
  356. package/test/Wallet/sync/Wallet.sync.test.ts +215 -0
  357. package/test/Wallet/sync/Wallet.updateWalletLegacyTestData.man.test.ts +203 -0
  358. package/test/Wallet/sync/setActive.test.ts +170 -0
  359. package/test/WalletClient/LocalKVStore.man.test.ts +114 -0
  360. package/test/WalletClient/WERR.man.test.ts +35 -0
  361. package/test/bsv-ts-sdk/LocalKVStore.test.ts +102 -0
  362. package/test/checkDB.ts +57 -0
  363. package/test/checkdb +0 -0
  364. package/test/examples/backup.man.test.ts +59 -0
  365. package/test/examples/pushdrop.test.ts +282 -0
  366. package/test/monitor/Monitor.test.ts +620 -0
  367. package/test/services/Services.test.ts +263 -0
  368. package/test/storage/KnexMigrations.test.ts +86 -0
  369. package/test/storage/StorageMySQLDojoReader.man.test.ts +60 -0
  370. package/test/storage/count.test.ts +177 -0
  371. package/test/storage/find.test.ts +195 -0
  372. package/test/storage/findLegacy.test.ts +67 -0
  373. package/test/storage/idb/allocateChange.test.ts +251 -0
  374. package/test/storage/idb/count.test.ts +158 -0
  375. package/test/storage/idb/find.test.ts +177 -0
  376. package/test/storage/idb/idbSpeed.test.ts +36 -0
  377. package/test/storage/idb/insert.test.ts +268 -0
  378. package/test/storage/idb/transactionAbort.test.ts +108 -0
  379. package/test/storage/idb/update.test.ts +999 -0
  380. package/test/storage/insert.test.ts +278 -0
  381. package/test/storage/update.test.ts +1021 -0
  382. package/test/storage/update2.test.ts +897 -0
  383. package/test/utils/TestUtilsWalletStorage.ts +2526 -0
  384. package/test/utils/localWalletMethods.ts +363 -0
  385. package/test/utils/removeFailedFromDatabase.sql +17 -0
  386. package/ts2md.json +44 -0
  387. package/tsconfig.all.json +31 -0
  388. package/tsconfig.client.json +29 -0
  389. package/tsconfig.json +17 -0
  390. package/tsconfig.mobile.json +28 -0
@@ -0,0 +1,242 @@
1
+ import * as bsv from '@bsv/sdk'
2
+ import { createSyncMap, sdk, SyncMap, TableOutputTagMap } from '../../../../../src'
3
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
4
+ import { EntityOutputTagMap } from '../EntityOutputTagMap'
5
+
6
+ describe('OutputTagMap class method tests', () => {
7
+ jest.setTimeout(99999999)
8
+
9
+ const env = _tu.getEnv('test')
10
+ const ctxs: TestWalletNoSetup[] = []
11
+ const ctxs2: TestWalletNoSetup[] = []
12
+
13
+ beforeAll(async () => {
14
+ if (env.runMySQL) {
15
+ ctxs.push(await _tu.createLegacyWalletMySQLCopy('OutputTagMapTests'))
16
+ ctxs2.push(await _tu.createLegacyWalletMySQLCopy('OutputTagMapTests2'))
17
+ }
18
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('OutputTagMapTests'))
19
+ ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('OutputTagMapTests2'))
20
+ })
21
+
22
+ afterAll(async () => {
23
+ for (const ctx of ctxs) {
24
+ await ctx.storage.destroy()
25
+ }
26
+ for (const ctx of ctxs2) {
27
+ await ctx.storage.destroy()
28
+ }
29
+ })
30
+
31
+ test('0_OutputTagMap getters and setters', async () => {
32
+ const now = new Date()
33
+ const initialData: TableOutputTagMap = {
34
+ created_at: now,
35
+ updated_at: now,
36
+ outputId: 1,
37
+ outputTagId: 2,
38
+ isDeleted: false
39
+ }
40
+
41
+ const outputTagMap = new EntityOutputTagMap(initialData)
42
+
43
+ // Test getters
44
+ expect(outputTagMap.outputTagId).toBe(2)
45
+ expect(outputTagMap.outputId).toBe(1)
46
+ expect(outputTagMap.created_at).toBe(now)
47
+ expect(outputTagMap.updated_at).toBe(now)
48
+ expect(outputTagMap.isDeleted).toBe(false)
49
+ expect(outputTagMap.entityName).toBe('outputTagMap')
50
+ expect(outputTagMap.entityTable).toBe('output_tags_map')
51
+
52
+ // Test setters
53
+ const newDate = new Date()
54
+ outputTagMap.outputTagId = 3
55
+ outputTagMap.outputId = 4
56
+ outputTagMap.created_at = newDate
57
+ outputTagMap.updated_at = newDate
58
+ outputTagMap.isDeleted = true
59
+
60
+ expect(outputTagMap.outputTagId).toBe(3)
61
+ expect(outputTagMap.outputId).toBe(4)
62
+ expect(outputTagMap.created_at).toBe(newDate)
63
+ expect(outputTagMap.updated_at).toBe(newDate)
64
+ expect(outputTagMap.isDeleted).toBe(true)
65
+
66
+ // Test id throws an error
67
+ expect(() => outputTagMap.id).toThrow(sdk.WERR_INVALID_OPERATION)
68
+ })
69
+
70
+ test('1_equals returns true for matching entities', async () => {
71
+ const ctx1 = ctxs[0]
72
+ const ctx2 = ctxs2[0]
73
+
74
+ // Insert matching OutputTagMap records into both databases
75
+ const outputTagMapData: TableOutputTagMap = {
76
+ created_at: new Date('2023-01-01'),
77
+ updated_at: new Date('2023-01-02'),
78
+ outputId: 1,
79
+ outputTagId: 8,
80
+ isDeleted: false
81
+ }
82
+
83
+ await ctx1.activeStorage.insertOutputTagMap(outputTagMapData)
84
+ await ctx2.activeStorage.insertOutputTagMap(outputTagMapData)
85
+
86
+ // Create entities from the records
87
+ const entity1 = new EntityOutputTagMap(outputTagMapData)
88
+ const entity2 = new EntityOutputTagMap(outputTagMapData)
89
+
90
+ const syncMap = createSyncMap()
91
+ syncMap.output.idMap[1] = 1
92
+ syncMap.outputTag.idMap[8] = 8
93
+
94
+ // Verify that equals returns true
95
+ expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true)
96
+ })
97
+
98
+ test('2_equals returns false for non-matching entities', async () => {
99
+ const ctx1 = ctxs[0]
100
+ const ctx2 = ctxs2[0]
101
+
102
+ // Insert mismatched OutputTagMap records into both databases
103
+ const outputTagMapData1: TableOutputTagMap = {
104
+ created_at: new Date('2023-01-01'),
105
+ updated_at: new Date('2023-01-02'),
106
+ outputId: 1,
107
+ outputTagId: 9,
108
+ isDeleted: false
109
+ }
110
+
111
+ const outputTagMapData2: TableOutputTagMap = {
112
+ created_at: new Date('2023-01-01'),
113
+ updated_at: new Date('2023-01-02'),
114
+ outputId: 1, // Mismatched outputId
115
+ outputTagId: 21, // Mismatched outputTagId
116
+ isDeleted: true // Mismatched isDeleted
117
+ }
118
+
119
+ await ctx1.activeStorage.insertOutputTagMap(outputTagMapData1)
120
+ await ctx2.activeStorage.insertOutputTagMap(outputTagMapData2)
121
+
122
+ // Create entities from the records
123
+ const entity1 = new EntityOutputTagMap(outputTagMapData1)
124
+ const entity2 = new EntityOutputTagMap(outputTagMapData2)
125
+
126
+ const syncMap = createSyncMap()
127
+ syncMap.output.idMap[101] = 101
128
+
129
+ // Verify that equals returns false due to mismatched properties
130
+ expect(entity1.equals(entity2.toApi(), syncMap)).toBe(false)
131
+
132
+ // Test without a sync map to hit another branch
133
+ expect(entity1.equals(entity2.toApi())).toBe(false)
134
+ })
135
+
136
+ test('3_mergeExisting merges and updates entity when ei.updated_at > this.updated_at', async () => {
137
+ const ctx = ctxs[0]
138
+
139
+ // Insert initial OutputTagMap record with valid foreign key IDs
140
+ const initialData: TableOutputTagMap = {
141
+ created_at: new Date('2023-01-01'),
142
+ updated_at: new Date('2023-01-02'),
143
+ outputId: 2,
144
+ outputTagId: 8,
145
+ isDeleted: false
146
+ }
147
+ await ctx.activeStorage.insertOutputTagMap(initialData)
148
+
149
+ // Create an OutputTagMap entity from the initial data
150
+ const entity = new EntityOutputTagMap(initialData)
151
+
152
+ // Create a new record to simulate the `ei` argument with a later `updated_at`
153
+ const updatedData: TableOutputTagMap = {
154
+ ...initialData,
155
+ updated_at: new Date('2023-01-03'), // Later timestamp
156
+ isDeleted: true // Simulate a change in `isDeleted`
157
+ }
158
+
159
+ const syncMap = createSyncMap()
160
+ syncMap.output.idMap[1] = 1
161
+
162
+ // Call mergeExisting
163
+ const wasMergedRaw = await entity.mergeExisting(
164
+ ctx.activeStorage,
165
+ undefined, // `since` is not used in this method
166
+ updatedData,
167
+ syncMap
168
+ )
169
+
170
+ const wasMerged = Boolean(wasMergedRaw)
171
+
172
+ // Verify that wasMerged is true
173
+ expect(wasMerged).toBe(true)
174
+
175
+ // Verify that the entity is updated
176
+ expect(entity.isDeleted).toBe(1)
177
+
178
+ // Debugging: Log the updated record query
179
+ const updatedRecord = await ctx.activeStorage.findOutputTagMaps({
180
+ partial: { outputId: 2, outputTagId: 8 }
181
+ })
182
+ //console.log('Updated Record:', updatedRecord)
183
+ //console.log('Updated Record isDeleted:', updatedRecord[0].isDeleted)
184
+ //console.log('Updted Redord length:', updatedRecord.length)
185
+
186
+ // Verify that the database is updated
187
+ expect(updatedRecord.length).toBe(1)
188
+ expect(updatedRecord[0]).toBeDefined()
189
+ expect(updatedRecord[0].isDeleted).toBe(true)
190
+ })
191
+
192
+ test('4_mergeExisting does not merge when ei.updated_at <= this.updated_at', async () => {
193
+ const ctx = ctxs[0]
194
+
195
+ // Insert initial OutputTagMap record
196
+ const initialData: TableOutputTagMap = {
197
+ created_at: new Date('2023-01-01'),
198
+ updated_at: new Date('2023-01-02'),
199
+ outputId: 2,
200
+ outputTagId: 11,
201
+ isDeleted: false
202
+ }
203
+ await ctx.activeStorage.insertOutputTagMap(initialData)
204
+
205
+ // Create an OutputTagMap entity from the initial data
206
+ const entity = new EntityOutputTagMap(initialData)
207
+
208
+ // Create a new record to simulate the `ei` argument with an earlier `updated_at`
209
+ const earlierData: TableOutputTagMap = {
210
+ ...initialData,
211
+ updated_at: new Date('2023-01-01'), // Earlier timestamp
212
+ isDeleted: true // Simulate a change in `isDeleted`
213
+ }
214
+
215
+ const syncMap = createSyncMap()
216
+ syncMap.output.idMap[101] = 101
217
+
218
+ // Call mergeExisting
219
+ const wasMergedRaw = await entity.mergeExisting(
220
+ ctx.activeStorage,
221
+ undefined, // `since` is not used in this method
222
+ earlierData,
223
+ syncMap
224
+ )
225
+
226
+ // Normalize the result
227
+ const wasMerged = Boolean(wasMergedRaw)
228
+
229
+ // Verify that wasMerged is false
230
+ expect(wasMerged).toBe(false)
231
+
232
+ // Verify that the entity is not updated
233
+ expect(entity.isDeleted).toBe(0)
234
+
235
+ // Verify that the database is not updated
236
+ const record = await ctx.activeStorage.findOutputTagMaps({
237
+ partial: { outputId: 2, outputTagId: 11 }
238
+ })
239
+ expect(record.length).toBe(1)
240
+ expect(record[0].isDeleted).toBe(false)
241
+ })
242
+ })
@@ -0,0 +1,288 @@
1
+ import { createSyncMap, sdk, SyncMap, TableOutputTag } from '../../../../../src'
2
+ import { TestUtilsWalletStorage as _tu, TestWalletNoSetup } from '../../../../../test/utils/TestUtilsWalletStorage'
3
+ import { EntityOutputTag } from '../EntityOutputTag'
4
+
5
+ describe('OutputTag class method tests', () => {
6
+ jest.setTimeout(99999999)
7
+
8
+ const env = _tu.getEnv('test')
9
+ const ctxs: TestWalletNoSetup[] = []
10
+ const ctxs2: TestWalletNoSetup[] = []
11
+
12
+ beforeAll(async () => {
13
+ if (env.runMySQL) {
14
+ ctxs.push(await _tu.createLegacyWalletMySQLCopy('OutputTagTests'))
15
+ ctxs2.push(await _tu.createLegacyWalletMySQLCopy('OutputTagTests2'))
16
+ }
17
+ ctxs.push(await _tu.createLegacyWalletSQLiteCopy('OutputTagTests'))
18
+ ctxs2.push(await _tu.createLegacyWalletSQLiteCopy('OutputTagTests2'))
19
+ })
20
+
21
+ afterAll(async () => {
22
+ for (const ctx of ctxs) {
23
+ await ctx.storage.destroy()
24
+ }
25
+ for (const ctx of ctxs2) {
26
+ await ctx.storage.destroy()
27
+ }
28
+ })
29
+
30
+ test('0_mergeExisting merges and updates entity when ei.updated_at > this.updated_at', async () => {
31
+ const ctx = ctxs[0]
32
+
33
+ // Insert initial OutputTag record with valid userId
34
+ const initialData: TableOutputTag = {
35
+ outputTagId: 401,
36
+ created_at: new Date('2023-01-01'),
37
+ updated_at: new Date('2023-01-02'),
38
+ tag: 'tag1',
39
+ userId: 1,
40
+ isDeleted: false
41
+ }
42
+ await ctx.activeStorage.insertOutputTag(initialData)
43
+
44
+ // Create an OutputTag entity from the initial data
45
+ const entity = new EntityOutputTag(initialData)
46
+
47
+ // Simulate the `ei` argument with a later `updated_at`
48
+ const updatedData: TableOutputTag = {
49
+ ...initialData,
50
+ updated_at: new Date('2023-01-03'), // Later timestamp
51
+ isDeleted: true // Simulate a change in `isDeleted`
52
+ }
53
+
54
+ const syncMap = createSyncMap()
55
+ syncMap.outputTag.idMap[401] = 401
56
+
57
+ // Call mergeExisting
58
+ const wasMergedRaw = await entity.mergeExisting(
59
+ ctx.activeStorage,
60
+ undefined, // `since` is not used in this method
61
+ updatedData,
62
+ syncMap,
63
+ undefined
64
+ )
65
+
66
+ const wasMerged = Boolean(wasMergedRaw)
67
+
68
+ // Verify that wasMerged is true
69
+ expect(wasMerged).toBe(true)
70
+
71
+ // Verify that the entity is updated
72
+ expect(entity.isDeleted).toBe(1)
73
+
74
+ // Verify that the database is updated
75
+ const updatedRecord = await ctx.activeStorage.findOutputTags({
76
+ partial: { outputTagId: 401 }
77
+ })
78
+ expect(updatedRecord.length).toBe(1)
79
+ expect(updatedRecord[0]).toBeDefined()
80
+ expect(updatedRecord[0].isDeleted).toBe(true)
81
+ })
82
+
83
+ test('1_mergeExisting does not merge when ei.updated_at <= this.updated_at', async () => {
84
+ const ctx = ctxs[0]
85
+
86
+ // Insert initial OutputTag record with valid userId
87
+ const initialData: TableOutputTag = {
88
+ outputTagId: 402,
89
+ created_at: new Date('2023-01-01'),
90
+ updated_at: new Date('2023-01-02'),
91
+ tag: 'tag2',
92
+ userId: 1, // Valid user ID
93
+ isDeleted: false
94
+ }
95
+ await ctx.activeStorage.insertOutputTag(initialData)
96
+
97
+ // Create an OutputTag entity from the initial data
98
+ const entity = new EntityOutputTag(initialData)
99
+
100
+ // Simulate the `ei` argument with an earlier or equal `updated_at`
101
+ const earlierData: TableOutputTag = {
102
+ ...initialData,
103
+ updated_at: new Date('2023-01-01'), // Earlier timestamp
104
+ isDeleted: true // Simulate a change in `isDeleted`
105
+ }
106
+
107
+ const syncMap = createSyncMap()
108
+ syncMap.outputTag.idMap[1] = 1
109
+
110
+ // Call mergeExisting
111
+ const wasMergedRaw = await entity.mergeExisting(
112
+ ctx.activeStorage,
113
+ undefined, // `since` is not used in this method
114
+ earlierData,
115
+ syncMap,
116
+ undefined
117
+ )
118
+
119
+ const wasMerged = Boolean(wasMergedRaw)
120
+
121
+ // Verify that wasMerged is false
122
+ expect(wasMerged).toBe(false)
123
+
124
+ // Verify that the entity is not updated
125
+ expect(entity.isDeleted).toBe(0)
126
+
127
+ // Verify that the database is not updated
128
+ const record = await ctx.activeStorage.findOutputTags({
129
+ partial: { outputTagId: 1 }
130
+ })
131
+ expect(record.length).toBe(1)
132
+ expect(record[0].isDeleted).toBe(false)
133
+ })
134
+
135
+ test('2_equals identifies matching entities without syncMap', async () => {
136
+ const ctx = ctxs[0]
137
+
138
+ // Insert matching OutputTag record into the database
139
+ const data: TableOutputTag = {
140
+ outputTagId: 403,
141
+ created_at: new Date('2023-01-01'),
142
+ updated_at: new Date('2023-01-02'),
143
+ tag: 'tag3',
144
+ userId: 1,
145
+ isDeleted: false
146
+ }
147
+ await ctx.activeStorage.insertOutputTag(data)
148
+
149
+ // Create OutputTag entities
150
+ const entity1 = new EntityOutputTag(data)
151
+ const entity2 = new EntityOutputTag(data)
152
+
153
+ // Verify that equals returns true for matching entities
154
+ expect(entity1.equals(entity2.toApi())).toBe(true)
155
+ })
156
+
157
+ test('3_equals identifies non-matching entities when tags differ', async () => {
158
+ const ctx = ctxs[0]
159
+
160
+ // Insert differing OutputTag records into the database
161
+ const data1: TableOutputTag = {
162
+ outputTagId: 404,
163
+ created_at: new Date('2023-01-01'),
164
+ updated_at: new Date('2023-01-02'),
165
+ tag: 'tag4',
166
+ userId: 1,
167
+ isDeleted: false
168
+ }
169
+ const data2 = { ...data1, tag: 'tag2' }
170
+
171
+ await ctx.activeStorage.insertOutputTag(data1)
172
+
173
+ // Create OutputTag entities
174
+ const entity1 = new EntityOutputTag(data1)
175
+ const entity2 = new EntityOutputTag(data2)
176
+
177
+ // Verify that equals returns false when tags differ
178
+ expect(entity1.equals(entity2.toApi())).toBe(false)
179
+ })
180
+
181
+ test('4_equals identifies non-matching entities when isDeleted differs', async () => {
182
+ const ctx = ctxs[0]
183
+
184
+ // Insert differing OutputTag records into the database
185
+ const data1: TableOutputTag = {
186
+ outputTagId: 405,
187
+ created_at: new Date('2023-01-01'),
188
+ updated_at: new Date('2023-01-02'),
189
+ tag: 'tag5',
190
+ userId: 1,
191
+ isDeleted: false
192
+ }
193
+ const data2 = { ...data1, isDeleted: true }
194
+
195
+ await ctx.activeStorage.insertOutputTag(data1)
196
+
197
+ // Create OutputTag entities
198
+ const entity1 = new EntityOutputTag(data1)
199
+ const entity2 = new EntityOutputTag(data2)
200
+
201
+ // Verify that equals returns false when isDeleted differs
202
+ expect(entity1.equals(entity2.toApi())).toBe(false)
203
+ })
204
+
205
+ test('5_equals identifies matching entities with syncMap', async () => {
206
+ const ctx = ctxs[0]
207
+
208
+ // Insert matching OutputTag record into the database
209
+ const data: TableOutputTag = {
210
+ outputTagId: 406,
211
+ created_at: new Date('2023-01-01'),
212
+ updated_at: new Date('2023-01-02'),
213
+ tag: 'tag6',
214
+ userId: 1,
215
+ isDeleted: false
216
+ }
217
+ await ctx.activeStorage.insertOutputTag(data)
218
+
219
+ // Create OutputTag entities
220
+ const entity1 = new EntityOutputTag(data)
221
+ const entity2 = new EntityOutputTag(data)
222
+
223
+ const syncMap = createSyncMap()
224
+ syncMap.outputTag.idMap[1] = 1
225
+
226
+ // Verify that equals returns true with syncMap
227
+ expect(entity1.equals(entity2.toApi(), syncMap)).toBe(true)
228
+ })
229
+
230
+ test('6_equals identifies non-matching entities when userIds differ and no syncMap is provided', async () => {
231
+ const ctx = ctxs[0]
232
+
233
+ // Insert differing OutputTag records into the database
234
+ const data1: TableOutputTag = {
235
+ outputTagId: 407,
236
+ created_at: new Date('2023-01-01'),
237
+ updated_at: new Date('2023-01-02'),
238
+ tag: 'tag7',
239
+ userId: 1,
240
+ isDeleted: false
241
+ }
242
+ const data2 = { ...data1, userId: 2 }
243
+
244
+ await ctx.activeStorage.insertOutputTag(data1)
245
+
246
+ // Create OutputTag entities
247
+ const entity1 = new EntityOutputTag(data1)
248
+ const entity2 = new EntityOutputTag(data2)
249
+
250
+ // Verify that equals returns false when userIds differ and no syncMap is provided
251
+ expect(entity1.equals(entity2.toApi())).toBe(false)
252
+ })
253
+
254
+ test('7_getters and setters work as expected for OutputTag', () => {
255
+ const now = new Date()
256
+ const later = new Date(now.getTime() + 1000)
257
+
258
+ // Create an OutputTag instance
259
+ const outputTag = new EntityOutputTag()
260
+
261
+ // Set values using setters
262
+ outputTag.outputTagId = 123
263
+ outputTag.created_at = now
264
+ outputTag.updated_at = later
265
+ outputTag.tag = 'Test Tag'
266
+ outputTag.userId = 456
267
+ outputTag.isDeleted = true
268
+
269
+ // Validate values using getters
270
+ expect(outputTag.outputTagId).toBe(123)
271
+ expect(outputTag.created_at).toBe(now)
272
+ expect(outputTag.updated_at).toBe(later)
273
+ expect(outputTag.tag).toBe('Test Tag')
274
+ expect(outputTag.userId).toBe(456)
275
+ expect(outputTag.isDeleted).toBe(true)
276
+
277
+ // Validate id, entityName, and entityTable
278
+ expect(outputTag.id).toBe(123)
279
+ expect(outputTag.entityName).toBe('outputTag')
280
+ expect(outputTag.entityTable).toBe('output_tags')
281
+
282
+ // Update id using override setter
283
+ outputTag.id = 789
284
+
285
+ // Validate id again
286
+ expect(outputTag.id).toBe(789)
287
+ })
288
+ })