@originals/sdk 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/.eslintrc.json +33 -0
  2. package/.turbo/turbo-build.log +1 -0
  3. package/.turbo/turbo-test.log +68353 -0
  4. package/dist/adapters/FeeOracleMock.d.ts +6 -0
  5. package/dist/adapters/FeeOracleMock.js +8 -0
  6. package/dist/adapters/index.d.ts +4 -0
  7. package/dist/adapters/index.js +4 -0
  8. package/dist/adapters/providers/OrdHttpProvider.d.ts +56 -0
  9. package/dist/adapters/providers/OrdHttpProvider.js +110 -0
  10. package/dist/adapters/providers/OrdMockProvider.d.ts +70 -0
  11. package/dist/adapters/providers/OrdMockProvider.js +75 -0
  12. package/dist/adapters/types.d.ts +71 -0
  13. package/dist/adapters/types.js +1 -0
  14. package/dist/bitcoin/BitcoinManager.d.ts +15 -0
  15. package/dist/bitcoin/BitcoinManager.js +262 -0
  16. package/dist/bitcoin/BroadcastClient.d.ts +30 -0
  17. package/dist/bitcoin/BroadcastClient.js +35 -0
  18. package/dist/bitcoin/OrdinalsClient.d.ts +21 -0
  19. package/dist/bitcoin/OrdinalsClient.js +105 -0
  20. package/dist/bitcoin/PSBTBuilder.d.ts +24 -0
  21. package/dist/bitcoin/PSBTBuilder.js +80 -0
  22. package/dist/bitcoin/fee-calculation.d.ts +14 -0
  23. package/dist/bitcoin/fee-calculation.js +31 -0
  24. package/dist/bitcoin/providers/OrdNodeProvider.d.ts +38 -0
  25. package/dist/bitcoin/providers/OrdNodeProvider.js +67 -0
  26. package/dist/bitcoin/providers/OrdinalsProvider.d.ts +33 -0
  27. package/dist/bitcoin/providers/OrdinalsProvider.js +50 -0
  28. package/dist/bitcoin/providers/types.d.ts +63 -0
  29. package/dist/bitcoin/providers/types.js +1 -0
  30. package/dist/bitcoin/transactions/commit.d.ts +89 -0
  31. package/dist/bitcoin/transactions/commit.js +311 -0
  32. package/dist/bitcoin/transactions/index.d.ts +7 -0
  33. package/dist/bitcoin/transactions/index.js +8 -0
  34. package/dist/bitcoin/transfer.d.ts +9 -0
  35. package/dist/bitcoin/transfer.js +26 -0
  36. package/dist/bitcoin/utxo-selection.d.ts +78 -0
  37. package/dist/bitcoin/utxo-selection.js +237 -0
  38. package/dist/bitcoin/utxo.d.ts +26 -0
  39. package/dist/bitcoin/utxo.js +78 -0
  40. package/dist/contexts/credentials-v1.json +195 -0
  41. package/dist/contexts/credentials-v2-examples.json +5 -0
  42. package/dist/contexts/credentials-v2.json +301 -0
  43. package/dist/contexts/credentials.json +195 -0
  44. package/dist/contexts/data-integrity-v2.json +81 -0
  45. package/dist/contexts/dids.json +57 -0
  46. package/dist/contexts/ed255192020.json +93 -0
  47. package/dist/contexts/ordinals-plus.json +23 -0
  48. package/dist/contexts/originals.json +22 -0
  49. package/dist/core/OriginalsSDK.d.ts +158 -0
  50. package/dist/core/OriginalsSDK.js +274 -0
  51. package/dist/crypto/Multikey.d.ts +30 -0
  52. package/dist/crypto/Multikey.js +149 -0
  53. package/dist/crypto/Signer.d.ts +21 -0
  54. package/dist/crypto/Signer.js +196 -0
  55. package/dist/crypto/noble-init.d.ts +18 -0
  56. package/dist/crypto/noble-init.js +106 -0
  57. package/dist/did/BtcoDidResolver.d.ts +57 -0
  58. package/dist/did/BtcoDidResolver.js +166 -0
  59. package/dist/did/DIDManager.d.ts +101 -0
  60. package/dist/did/DIDManager.js +493 -0
  61. package/dist/did/Ed25519Verifier.d.ts +30 -0
  62. package/dist/did/Ed25519Verifier.js +59 -0
  63. package/dist/did/KeyManager.d.ts +17 -0
  64. package/dist/did/KeyManager.js +207 -0
  65. package/dist/did/WebVHManager.d.ts +100 -0
  66. package/dist/did/WebVHManager.js +304 -0
  67. package/dist/did/createBtcoDidDocument.d.ts +10 -0
  68. package/dist/did/createBtcoDidDocument.js +42 -0
  69. package/dist/did/providers/OrdinalsClientProviderAdapter.d.ts +23 -0
  70. package/dist/did/providers/OrdinalsClientProviderAdapter.js +51 -0
  71. package/dist/events/EventEmitter.d.ts +115 -0
  72. package/dist/events/EventEmitter.js +198 -0
  73. package/dist/events/index.d.ts +7 -0
  74. package/dist/events/index.js +6 -0
  75. package/dist/events/types.d.ts +286 -0
  76. package/dist/events/types.js +9 -0
  77. package/dist/examples/basic-usage.d.ts +3 -0
  78. package/dist/examples/basic-usage.js +62 -0
  79. package/dist/examples/run.d.ts +1 -0
  80. package/dist/examples/run.js +4 -0
  81. package/dist/index.d.ts +39 -0
  82. package/dist/index.js +47 -0
  83. package/dist/lifecycle/BatchOperations.d.ts +147 -0
  84. package/dist/lifecycle/BatchOperations.js +251 -0
  85. package/dist/lifecycle/LifecycleManager.d.ts +116 -0
  86. package/dist/lifecycle/LifecycleManager.js +971 -0
  87. package/dist/lifecycle/OriginalsAsset.d.ts +164 -0
  88. package/dist/lifecycle/OriginalsAsset.js +380 -0
  89. package/dist/lifecycle/ProvenanceQuery.d.ts +126 -0
  90. package/dist/lifecycle/ProvenanceQuery.js +220 -0
  91. package/dist/lifecycle/ResourceVersioning.d.ts +73 -0
  92. package/dist/lifecycle/ResourceVersioning.js +127 -0
  93. package/dist/migration/MigrationManager.d.ts +86 -0
  94. package/dist/migration/MigrationManager.js +412 -0
  95. package/dist/migration/audit/AuditLogger.d.ts +51 -0
  96. package/dist/migration/audit/AuditLogger.js +156 -0
  97. package/dist/migration/checkpoint/CheckpointManager.d.ts +31 -0
  98. package/dist/migration/checkpoint/CheckpointManager.js +96 -0
  99. package/dist/migration/checkpoint/CheckpointStorage.d.ts +26 -0
  100. package/dist/migration/checkpoint/CheckpointStorage.js +89 -0
  101. package/dist/migration/index.d.ts +22 -0
  102. package/dist/migration/index.js +27 -0
  103. package/dist/migration/operations/BaseMigration.d.ts +48 -0
  104. package/dist/migration/operations/BaseMigration.js +83 -0
  105. package/dist/migration/operations/PeerToBtcoMigration.d.ts +25 -0
  106. package/dist/migration/operations/PeerToBtcoMigration.js +67 -0
  107. package/dist/migration/operations/PeerToWebvhMigration.d.ts +19 -0
  108. package/dist/migration/operations/PeerToWebvhMigration.js +46 -0
  109. package/dist/migration/operations/WebvhToBtcoMigration.d.ts +25 -0
  110. package/dist/migration/operations/WebvhToBtcoMigration.js +67 -0
  111. package/dist/migration/rollback/RollbackManager.d.ts +29 -0
  112. package/dist/migration/rollback/RollbackManager.js +146 -0
  113. package/dist/migration/state/StateMachine.d.ts +25 -0
  114. package/dist/migration/state/StateMachine.js +76 -0
  115. package/dist/migration/state/StateTracker.d.ts +36 -0
  116. package/dist/migration/state/StateTracker.js +123 -0
  117. package/dist/migration/types.d.ts +306 -0
  118. package/dist/migration/types.js +33 -0
  119. package/dist/migration/validation/BitcoinValidator.d.ts +13 -0
  120. package/dist/migration/validation/BitcoinValidator.js +83 -0
  121. package/dist/migration/validation/CredentialValidator.d.ts +13 -0
  122. package/dist/migration/validation/CredentialValidator.js +46 -0
  123. package/dist/migration/validation/DIDCompatibilityValidator.d.ts +16 -0
  124. package/dist/migration/validation/DIDCompatibilityValidator.js +127 -0
  125. package/dist/migration/validation/LifecycleValidator.d.ts +10 -0
  126. package/dist/migration/validation/LifecycleValidator.js +52 -0
  127. package/dist/migration/validation/StorageValidator.d.ts +10 -0
  128. package/dist/migration/validation/StorageValidator.js +65 -0
  129. package/dist/migration/validation/ValidationPipeline.d.ts +29 -0
  130. package/dist/migration/validation/ValidationPipeline.js +180 -0
  131. package/dist/storage/LocalStorageAdapter.d.ts +11 -0
  132. package/dist/storage/LocalStorageAdapter.js +53 -0
  133. package/dist/storage/MemoryStorageAdapter.d.ts +6 -0
  134. package/dist/storage/MemoryStorageAdapter.js +21 -0
  135. package/dist/storage/StorageAdapter.d.ts +16 -0
  136. package/dist/storage/StorageAdapter.js +1 -0
  137. package/dist/storage/index.d.ts +2 -0
  138. package/dist/storage/index.js +2 -0
  139. package/dist/types/bitcoin.d.ts +84 -0
  140. package/dist/types/bitcoin.js +1 -0
  141. package/dist/types/common.d.ts +82 -0
  142. package/dist/types/common.js +1 -0
  143. package/dist/types/credentials.d.ts +75 -0
  144. package/dist/types/credentials.js +1 -0
  145. package/dist/types/did.d.ts +26 -0
  146. package/dist/types/did.js +1 -0
  147. package/dist/types/index.d.ts +5 -0
  148. package/dist/types/index.js +5 -0
  149. package/dist/types/network.d.ts +78 -0
  150. package/dist/types/network.js +145 -0
  151. package/dist/utils/EventLogger.d.ts +71 -0
  152. package/dist/utils/EventLogger.js +232 -0
  153. package/dist/utils/Logger.d.ts +106 -0
  154. package/dist/utils/Logger.js +257 -0
  155. package/dist/utils/MetricsCollector.d.ts +110 -0
  156. package/dist/utils/MetricsCollector.js +264 -0
  157. package/dist/utils/bitcoin-address.d.ts +38 -0
  158. package/dist/utils/bitcoin-address.js +113 -0
  159. package/dist/utils/cbor.d.ts +2 -0
  160. package/dist/utils/cbor.js +9 -0
  161. package/dist/utils/encoding.d.ts +37 -0
  162. package/dist/utils/encoding.js +120 -0
  163. package/dist/utils/hash.d.ts +1 -0
  164. package/dist/utils/hash.js +5 -0
  165. package/dist/utils/retry.d.ts +10 -0
  166. package/dist/utils/retry.js +35 -0
  167. package/dist/utils/satoshi-validation.d.ts +60 -0
  168. package/dist/utils/satoshi-validation.js +156 -0
  169. package/dist/utils/serialization.d.ts +14 -0
  170. package/dist/utils/serialization.js +76 -0
  171. package/dist/utils/telemetry.d.ts +17 -0
  172. package/dist/utils/telemetry.js +24 -0
  173. package/dist/utils/validation.d.ts +5 -0
  174. package/dist/utils/validation.js +98 -0
  175. package/dist/vc/CredentialManager.d.ts +22 -0
  176. package/dist/vc/CredentialManager.js +227 -0
  177. package/dist/vc/Issuer.d.ts +27 -0
  178. package/dist/vc/Issuer.js +70 -0
  179. package/dist/vc/Verifier.d.ts +16 -0
  180. package/dist/vc/Verifier.js +50 -0
  181. package/dist/vc/cryptosuites/bbs.d.ts +44 -0
  182. package/dist/vc/cryptosuites/bbs.js +213 -0
  183. package/dist/vc/cryptosuites/bbsSimple.d.ts +9 -0
  184. package/dist/vc/cryptosuites/bbsSimple.js +12 -0
  185. package/dist/vc/cryptosuites/eddsa.d.ts +30 -0
  186. package/dist/vc/cryptosuites/eddsa.js +81 -0
  187. package/dist/vc/documentLoader.d.ts +16 -0
  188. package/dist/vc/documentLoader.js +59 -0
  189. package/dist/vc/proofs/data-integrity.d.ts +21 -0
  190. package/dist/vc/proofs/data-integrity.js +15 -0
  191. package/dist/vc/utils/jsonld.d.ts +2 -0
  192. package/dist/vc/utils/jsonld.js +15 -0
  193. package/package.json +79 -0
  194. package/src/adapters/FeeOracleMock.ts +9 -0
  195. package/src/adapters/index.ts +5 -0
  196. package/src/adapters/providers/OrdHttpProvider.ts +126 -0
  197. package/src/adapters/providers/OrdMockProvider.ts +101 -0
  198. package/src/adapters/types.ts +66 -0
  199. package/src/bitcoin/BitcoinManager.ts +330 -0
  200. package/src/bitcoin/BroadcastClient.ts +54 -0
  201. package/src/bitcoin/OrdinalsClient.ts +119 -0
  202. package/src/bitcoin/PSBTBuilder.ts +106 -0
  203. package/src/bitcoin/fee-calculation.ts +38 -0
  204. package/src/bitcoin/providers/OrdNodeProvider.ts +92 -0
  205. package/src/bitcoin/providers/OrdinalsProvider.ts +56 -0
  206. package/src/bitcoin/providers/types.ts +59 -0
  207. package/src/bitcoin/transactions/commit.ts +465 -0
  208. package/src/bitcoin/transactions/index.ts +13 -0
  209. package/src/bitcoin/transfer.ts +43 -0
  210. package/src/bitcoin/utxo-selection.ts +322 -0
  211. package/src/bitcoin/utxo.ts +113 -0
  212. package/src/contexts/credentials-v1.json +237 -0
  213. package/src/contexts/credentials-v2-examples.json +5 -0
  214. package/src/contexts/credentials-v2.json +340 -0
  215. package/src/contexts/credentials.json +237 -0
  216. package/src/contexts/data-integrity-v2.json +81 -0
  217. package/src/contexts/dids.json +58 -0
  218. package/src/contexts/ed255192020.json +93 -0
  219. package/src/contexts/ordinals-plus.json +23 -0
  220. package/src/contexts/originals.json +22 -0
  221. package/src/core/OriginalsSDK.ts +416 -0
  222. package/src/crypto/Multikey.ts +194 -0
  223. package/src/crypto/Signer.ts +254 -0
  224. package/src/crypto/noble-init.ts +121 -0
  225. package/src/did/BtcoDidResolver.ts +227 -0
  226. package/src/did/DIDManager.ts +694 -0
  227. package/src/did/Ed25519Verifier.ts +68 -0
  228. package/src/did/KeyManager.ts +236 -0
  229. package/src/did/WebVHManager.ts +489 -0
  230. package/src/did/createBtcoDidDocument.ts +59 -0
  231. package/src/did/providers/OrdinalsClientProviderAdapter.ts +68 -0
  232. package/src/events/EventEmitter.ts +222 -0
  233. package/src/events/index.ts +19 -0
  234. package/src/events/types.ts +331 -0
  235. package/src/examples/basic-usage.ts +78 -0
  236. package/src/examples/run.ts +5 -0
  237. package/src/index.ts +84 -0
  238. package/src/lifecycle/BatchOperations.ts +373 -0
  239. package/src/lifecycle/LifecycleManager.ts +1218 -0
  240. package/src/lifecycle/OriginalsAsset.ts +524 -0
  241. package/src/lifecycle/ProvenanceQuery.ts +280 -0
  242. package/src/lifecycle/ResourceVersioning.ts +163 -0
  243. package/src/migration/MigrationManager.ts +527 -0
  244. package/src/migration/audit/AuditLogger.ts +176 -0
  245. package/src/migration/checkpoint/CheckpointManager.ts +112 -0
  246. package/src/migration/checkpoint/CheckpointStorage.ts +101 -0
  247. package/src/migration/index.ts +33 -0
  248. package/src/migration/operations/BaseMigration.ts +126 -0
  249. package/src/migration/operations/PeerToBtcoMigration.ts +105 -0
  250. package/src/migration/operations/PeerToWebvhMigration.ts +62 -0
  251. package/src/migration/operations/WebvhToBtcoMigration.ts +105 -0
  252. package/src/migration/rollback/RollbackManager.ts +170 -0
  253. package/src/migration/state/StateMachine.ts +92 -0
  254. package/src/migration/state/StateTracker.ts +156 -0
  255. package/src/migration/types.ts +344 -0
  256. package/src/migration/validation/BitcoinValidator.ts +107 -0
  257. package/src/migration/validation/CredentialValidator.ts +62 -0
  258. package/src/migration/validation/DIDCompatibilityValidator.ts +151 -0
  259. package/src/migration/validation/LifecycleValidator.ts +64 -0
  260. package/src/migration/validation/StorageValidator.ts +79 -0
  261. package/src/migration/validation/ValidationPipeline.ts +213 -0
  262. package/src/storage/LocalStorageAdapter.ts +61 -0
  263. package/src/storage/MemoryStorageAdapter.ts +29 -0
  264. package/src/storage/StorageAdapter.ts +25 -0
  265. package/src/storage/index.ts +3 -0
  266. package/src/types/bitcoin.ts +98 -0
  267. package/src/types/common.ts +92 -0
  268. package/src/types/credentials.ts +88 -0
  269. package/src/types/did.ts +31 -0
  270. package/src/types/external-shims.d.ts +53 -0
  271. package/src/types/index.ts +7 -0
  272. package/src/types/network.ts +175 -0
  273. package/src/utils/EventLogger.ts +298 -0
  274. package/src/utils/Logger.ts +322 -0
  275. package/src/utils/MetricsCollector.ts +358 -0
  276. package/src/utils/bitcoin-address.ts +130 -0
  277. package/src/utils/cbor.ts +12 -0
  278. package/src/utils/encoding.ts +127 -0
  279. package/src/utils/hash.ts +6 -0
  280. package/src/utils/retry.ts +46 -0
  281. package/src/utils/satoshi-validation.ts +196 -0
  282. package/src/utils/serialization.ts +96 -0
  283. package/src/utils/telemetry.ts +40 -0
  284. package/src/utils/validation.ts +119 -0
  285. package/src/vc/CredentialManager.ts +273 -0
  286. package/src/vc/Issuer.ts +100 -0
  287. package/src/vc/Verifier.ts +47 -0
  288. package/src/vc/cryptosuites/bbs.ts +253 -0
  289. package/src/vc/cryptosuites/bbsSimple.ts +21 -0
  290. package/src/vc/cryptosuites/eddsa.ts +99 -0
  291. package/src/vc/documentLoader.ts +67 -0
  292. package/src/vc/proofs/data-integrity.ts +33 -0
  293. package/src/vc/utils/jsonld.ts +18 -0
  294. package/test/logs/did_webvh_QmQsRNhXxPSCSeLjpbKYcNMZj8b1kBQAoC6cZmkFAgmpHt_example_com.jsonl +1 -0
  295. package/test/logs/did_webvh_QmSQkpD58qxcqMWHYcEmDUn3wk7hHvJwzYTrZmhh6zjPQ8_example_com_users_alice123_profile.jsonl +1 -0
  296. package/test/logs/did_webvh_QmTMda6VW3cUPdKk5Yc3onnv1vdgEumvWWdP2noAYFSjeG_example_com.jsonl +1 -0
  297. package/test/logs/did_webvh_QmTkb8KnCYcsnKKDCY4eUQuKQdKJLrCinvhw13v3zETxpE_example_com_users_etc_passwd.jsonl +1 -0
  298. package/test/logs/did_webvh_QmTn9FdCfpXFDrxHH52pwB4iNrDFVvNDjJ5FQTcDbmM3Fg_example_com.jsonl +1 -0
  299. package/test/logs/did_webvh_QmUCQUi1xjtJjnSQ1XJZgKqcWgErx1v7E2dz4DAPraAyJP_example_com_etc_passwd.jsonl +1 -0
  300. package/test/logs/did_webvh_QmUENQJCDKBJVRS5BkL6zjaUvcRjkb9xHmy7foCgRjmv3W_example_com.jsonl +1 -0
  301. package/test/logs/did_webvh_QmUPdGyjYBEnQ3aQUkmqyyBKTyjvCP5RZQGiaEDeTtf6dc_example_com.jsonl +1 -0
  302. package/test/logs/did_webvh_QmUoHTuHMWzQM29ZFrE9VLtMxkZ5u869yqee8LwcCLN39M_example_com.jsonl +1 -0
  303. package/test/logs/did_webvh_QmUrnms8G65ggVKsr9oQeWrLUBuGChwQPPb2LCFvaoNxaw_example_com_users_alice.jsonl +1 -0
  304. package/test/logs/did_webvh_QmUwiw3eSXdHG1hPvoAGu3cuK5jF4aXRYDLBAjPXfv1qzb_example_com_level1_level2.jsonl +1 -0
  305. package/test/logs/did_webvh_QmW7bzKh6yFEKNAtmVsrPGvvsMHTUQdzJSNsTZkbuGFpbj_example_com_secret.jsonl +1 -0
  306. package/test/logs/did_webvh_QmXbFTFBBJ8zpjdz9WE1DNN44A2wprFmdvAubjSffeyoAG_example_com.jsonl +1 -0
  307. package/test/logs/did_webvh_QmXyVXFPCTffGb2mTUFDeMCsScjnpLWkyUkVkB6q6QoeBf_example_com_C_Windows_System32.jsonl +1 -0
  308. package/test/logs/did_webvh_QmZK9B81gxZtvo5fYHYKDtKt8zZfZZPhmCMhbujBJuRRzE_example_com_etc_passwd.jsonl +1 -0
  309. package/test/logs/did_webvh_QmbNLCVSdXSVLrwFBvCBQPAabjtRb1SGHjkGVyw3QUbfBL_example_com_users_etc_passwd.jsonl +1 -0
  310. package/test/logs/did_webvh_QmbeaicmGW3Q7Yzbqmftc8a9jLBngokveb5A2KVKfVGZRb_example_com_my_org_user_name_test_123.jsonl +1 -0
  311. package/test/logs/did_webvh_Qmdv7c7AjUreUfoKyvkN2UpAWTozxKsv99srQetPJMJEnp_example_com_users_etc_passwd.jsonl +1 -0
  312. package/test/logs/did_webvh_QmeioWY3uypYLkYpCXe9eCYnn4xBVruP9C1d79azMrTEHG_example_com.jsonl +1 -0
  313. package/test/logs/did_webvh_Qmf4QH5dsA6Ecr5HJ6KaJL9uJRyY8RxrQdqoRCM25DzvPi_example_com_users_alice.jsonl +1 -0
  314. package/tests/__mocks__/bbs-signatures.js +17 -0
  315. package/tests/__mocks__/mf-base58.js +24 -0
  316. package/tests/e2e/README.md +97 -0
  317. package/tests/e2e/example.spec.ts +78 -0
  318. package/tests/fixtures/did-documents.ts +247 -0
  319. package/tests/index.test.ts +21 -0
  320. package/tests/integration/BatchOperations.test.ts +531 -0
  321. package/tests/integration/CompleteLifecycle.e2e.test.ts +735 -0
  322. package/tests/integration/CredentialManager.test.ts +42 -0
  323. package/tests/integration/DIDManager.test.ts +41 -0
  324. package/tests/integration/DidPeerToWebVhFlow.test.ts +351 -0
  325. package/tests/integration/Events.test.ts +435 -0
  326. package/tests/integration/Lifecycle.transfer.btco.integration.test.ts +25 -0
  327. package/tests/integration/LifecycleManager.test.ts +21 -0
  328. package/tests/integration/MultikeyFlow.test.ts +52 -0
  329. package/tests/integration/TelemetryIntegration.test.ts +395 -0
  330. package/tests/integration/WebVhPublish.test.ts +48 -0
  331. package/tests/integration/migration/peer-to-webvh.test.ts +172 -0
  332. package/tests/manual/test-commit-creation.ts +323 -0
  333. package/tests/mocks/MockKeyStore.ts +38 -0
  334. package/tests/mocks/adapters/MemoryStorageAdapter.ts +24 -0
  335. package/tests/mocks/adapters/MockFeeOracle.ts +11 -0
  336. package/tests/mocks/adapters/MockOrdinalsProvider.ts +76 -0
  337. package/tests/mocks/adapters/OrdMockProvider.test.ts +176 -0
  338. package/tests/mocks/adapters/index.ts +6 -0
  339. package/tests/performance/BatchOperations.perf.test.ts +403 -0
  340. package/tests/performance/logging.perf.test.ts +336 -0
  341. package/tests/sdk.test.ts +43 -0
  342. package/tests/security/bitcoin-penetration-tests.test.ts +622 -0
  343. package/tests/setup.bun.ts +69 -0
  344. package/tests/setup.jest.ts +23 -0
  345. package/tests/stress/batch-operations-stress.test.ts +571 -0
  346. package/tests/unit/adapters/FeeOracleMock.test.ts +40 -0
  347. package/tests/unit/bitcoin/BitcoinManager.test.ts +293 -0
  348. package/tests/unit/bitcoin/BroadcastClient.test.ts +52 -0
  349. package/tests/unit/bitcoin/OrdNodeProvider.test.ts +53 -0
  350. package/tests/unit/bitcoin/OrdinalsClient.test.ts +381 -0
  351. package/tests/unit/bitcoin/OrdinalsClientProvider.test.ts +102 -0
  352. package/tests/unit/bitcoin/PSBTBuilder.test.ts +84 -0
  353. package/tests/unit/bitcoin/fee-calculation.test.ts +261 -0
  354. package/tests/unit/bitcoin/transactions/commit.test.ts +649 -0
  355. package/tests/unit/bitcoin/transfer.test.ts +31 -0
  356. package/tests/unit/bitcoin/utxo-selection-new.test.ts +502 -0
  357. package/tests/unit/bitcoin/utxo.more.test.ts +39 -0
  358. package/tests/unit/bitcoin/utxo.selection.test.ts +38 -0
  359. package/tests/unit/core/OriginalsSDK.test.ts +152 -0
  360. package/tests/unit/crypto/Multikey.test.ts +206 -0
  361. package/tests/unit/crypto/Signer.test.ts +408 -0
  362. package/tests/unit/did/BtcoDidResolver.test.ts +611 -0
  363. package/tests/unit/did/DIDManager.more.test.ts +43 -0
  364. package/tests/unit/did/DIDManager.test.ts +185 -0
  365. package/tests/unit/did/Ed25519Verifier.test.ts +160 -0
  366. package/tests/unit/did/KeyManager.test.ts +452 -0
  367. package/tests/unit/did/OrdinalsClientProviderAdapter.test.ts +45 -0
  368. package/tests/unit/did/WebVHManager.test.ts +435 -0
  369. package/tests/unit/did/createBtcoDidDocument.test.ts +67 -0
  370. package/tests/unit/did/providers/OrdinalsClientProviderAdapter.test.ts +159 -0
  371. package/tests/unit/events/EventEmitter.test.ts +407 -0
  372. package/tests/unit/lifecycle/BatchOperations.test.ts +527 -0
  373. package/tests/unit/lifecycle/LifecycleManager.keymanagement.test.ts +312 -0
  374. package/tests/unit/lifecycle/LifecycleManager.prov.test.ts +18 -0
  375. package/tests/unit/lifecycle/LifecycleManager.test.ts +213 -0
  376. package/tests/unit/lifecycle/LifecycleManager.transfer.unit.test.ts +30 -0
  377. package/tests/unit/lifecycle/OriginalsAsset.test.ts +176 -0
  378. package/tests/unit/lifecycle/ProvenanceQuery.test.ts +577 -0
  379. package/tests/unit/lifecycle/ResourceVersioning.test.ts +651 -0
  380. package/tests/unit/storage/MemoryStorageAdapter.test.ts +93 -0
  381. package/tests/unit/types/network.test.ts +255 -0
  382. package/tests/unit/utils/EventIntegration.test.ts +384 -0
  383. package/tests/unit/utils/Logger.test.ts +473 -0
  384. package/tests/unit/utils/MetricsCollector.test.ts +358 -0
  385. package/tests/unit/utils/bitcoin-address.test.ts +250 -0
  386. package/tests/unit/utils/cbor.test.ts +35 -0
  387. package/tests/unit/utils/encoding.test.ts +318 -0
  388. package/tests/unit/utils/hash.test.ts +12 -0
  389. package/tests/unit/utils/retry.test.ts +100 -0
  390. package/tests/unit/utils/satoshi-validation.test.ts +354 -0
  391. package/tests/unit/utils/serialization.test.ts +124 -0
  392. package/tests/unit/utils/telemetry.test.ts +52 -0
  393. package/tests/unit/utils/validation.test.ts +141 -0
  394. package/tests/unit/vc/CredentialManager.test.ts +487 -0
  395. package/tests/unit/vc/Issuer.test.ts +107 -0
  396. package/tests/unit/vc/Verifier.test.ts +525 -0
  397. package/tests/unit/vc/bbs.test.ts +282 -0
  398. package/tests/unit/vc/cryptosuites/eddsa.test.ts +398 -0
  399. package/tests/unit/vc/documentLoader.test.ts +121 -0
  400. package/tests/unit/vc/proofs/data-integrity.test.ts +24 -0
  401. package/tsconfig.json +32 -0
  402. package/tsconfig.test.json +15 -0
  403. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,42 @@
1
+ /** Canonical test aggregator created by combine-tests script. */
2
+
3
+ /** Inlined from CredentialManager.integration.part.ts */
4
+ import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
5
+ import { OriginalsSDK } from '../../src';
6
+ import * as ed25519 from '@noble/ed25519';
7
+ import { multikey } from '../../src/crypto/Multikey';
8
+ import { registerVerificationMethod, verificationMethodRegistry } from '../../src/vc/documentLoader';
9
+
10
+ describe('Integration: CredentialManager issue/verify roundtrip', () => {
11
+ const sdk = OriginalsSDK.create({ defaultKeyType: 'Ed25519' });
12
+
13
+ beforeEach(() => {
14
+ verificationMethodRegistry.clear();
15
+ });
16
+
17
+ afterEach(() => {
18
+ verificationMethodRegistry.clear();
19
+ });
20
+
21
+ test('issue and verify using Issuer/Verifier wiring', async () => {
22
+ const did = 'did:peer:issuer1';
23
+ const sk = ed25519.utils.randomPrivateKey();
24
+ const pk = await (ed25519 as any).getPublicKeyAsync(sk);
25
+ const secretKeyMultibase = multikey.encodePrivateKey(sk, 'Ed25519');
26
+ const publicKeyMultibase = multikey.encodePublicKey(pk, 'Ed25519');
27
+ const vm = `${did}#keys-1`;
28
+ registerVerificationMethod({ id: vm, controller: did, type: 'Multikey', publicKeyMultibase });
29
+
30
+ const base = {
31
+ type: ['VerifiableCredential', 'Test'],
32
+ issuer: did,
33
+ issuanceDate: new Date().toISOString(),
34
+ credentialSubject: { id: 'did:peer:subject1' }
35
+ } as any;
36
+
37
+ const signed = await sdk.credentials.signCredential(base, secretKeyMultibase, vm);
38
+ expect(signed.proof).toBeDefined();
39
+ const verified = await sdk.credentials.verifyCredential(signed);
40
+ expect(verified).toBe(true);
41
+ });
42
+ });
@@ -0,0 +1,41 @@
1
+ /** Canonical test aggregator created by combine-tests script. */
2
+
3
+ /** Inlined from DIDManager.btco.integration.part.ts */
4
+ import { describe, test, expect, afterEach, spyOn } from 'bun:test';
5
+ import { OriginalsSDK } from '../../src';
6
+
7
+ describe('Integration: DIDManager btco resolve via OrdinalsClient adapter', () => {
8
+ const sdk = OriginalsSDK.create({ network: 'mainnet', bitcoinRpcUrl: 'http://ord' });
9
+
10
+ test('resolves did:btco using adapter with mocked fetch', async () => {
11
+ const sat = '123456';
12
+ const did = `did:btco:${sat}`;
13
+
14
+ const fetchMock = spyOn(global as any, 'fetch').mockImplementation(async (url: any) => {
15
+ if (url === 'http://ord/sat/' + sat) {
16
+ return new Response(JSON.stringify({ inscription_ids: ['i1', 'i2'] }), { status: 200 });
17
+ }
18
+ if (url === 'http://ord/inscription/i1') {
19
+ return new Response(JSON.stringify({ inscription_id: 'i1', content_type: 'text/plain', content_url: 'http://c/i1', sat }), { status: 200 });
20
+ }
21
+ if (url === 'http://ord/inscription/i2') {
22
+ return new Response(JSON.stringify({ inscription_id: 'i2', content_type: 'text/plain', content_url: 'http://c/i2', sat }), { status: 200 });
23
+ }
24
+ if (url === 'http://c/i1') {
25
+ return new Response(`BTCO DID: ${did}`, { status: 200 });
26
+ }
27
+ if (url === 'http://c/i2') {
28
+ return new Response('not a did doc', { status: 200 });
29
+ }
30
+ if (url === 'http://ord/r/metadata/i1') {
31
+ // Return DID Document JSON encoded as hex CBOR; for test simplicity return plain JSON string, adapter tolerates null metadata
32
+ return new Response('7b7d', { status: 200 });
33
+ }
34
+ return new Response('', { status: 404 });
35
+ });
36
+
37
+ const doc = await sdk.did.resolveDID(did);
38
+ expect(doc === null || typeof doc === 'object').toBe(true);
39
+ fetchMock.mockRestore();
40
+ });
41
+ });
@@ -0,0 +1,351 @@
1
+ import { describe, test, expect, beforeAll } from 'bun:test';
2
+ import { OriginalsSDK } from '../../src';
3
+ import { AssetResource } from '../../src/types';
4
+ import { MockKeyStore } from '../mocks/MockKeyStore';
5
+ import { KeyManager } from '../../src/did/KeyManager';
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import { tmpdir } from 'os';
9
+
10
+ describe('DID Peer to WebVH Publication Flow', () => {
11
+ const keyStore = new MockKeyStore();
12
+ const sdk = OriginalsSDK.create({
13
+ network: 'regtest',
14
+ keyStore,
15
+ defaultKeyType: 'Ed25519', // Use Ed25519 for did:webvh compatibility
16
+ enableLogging: true
17
+ });
18
+ const domain = 'localhost:5000';
19
+ const tempDir = path.join(tmpdir(), 'originals-test-webvh');
20
+
21
+ beforeAll(async () => {
22
+ // Ensure temp directory exists
23
+ await fs.promises.mkdir(tempDir, { recursive: true });
24
+
25
+ // Set up publisher DID keys for tests
26
+ const keyManager = new KeyManager();
27
+ const publisherKey = await keyManager.generateKeyPair('Ed25519');
28
+ await keyStore.setPrivateKey('did:webvh:localhost%3A5000:user#key-0', publisherKey.privateKey);
29
+ });
30
+
31
+ test('complete flow: createDIDPeer -> publishToWeb -> resolve resource URL', async () => {
32
+ // Step 1: Create a DID peer with resources
33
+ const resources: AssetResource[] = [
34
+ {
35
+ id: 'resource-1',
36
+ type: 'data',
37
+ contentType: 'text/plain',
38
+ hash: 'abc123def456',
39
+ content: 'Hello, World! This is test content.'
40
+ },
41
+ {
42
+ id: 'resource-2',
43
+ type: 'metadata',
44
+ contentType: 'application/json',
45
+ hash: 'aea789ab',
46
+ content: JSON.stringify({ title: 'Test Asset', version: '1.0' })
47
+ }
48
+ ];
49
+
50
+ console.log('\n🔧 Step 1: Creating DID peer...');
51
+ const { didDocument: peerDoc, keyPair } = await sdk.did.createDIDPeer(resources, true);
52
+
53
+ // Verify DID peer was created
54
+ expect(peerDoc).toBeDefined();
55
+ expect(peerDoc.id).toMatch(/^did:peer:/);
56
+ expect(keyPair).toBeDefined();
57
+ expect(keyPair.publicKey).toBeTruthy();
58
+ expect(keyPair.privateKey).toBeTruthy();
59
+
60
+ console.log(`✅ DID Peer created: ${peerDoc.id}`);
61
+ console.log(` Public Key: ${keyPair.publicKey.substring(0, 20)}...`);
62
+
63
+ // Step 2: Create an asset using the DID peer
64
+ console.log('\n🔧 Step 2: Creating asset with DID peer...');
65
+ const asset = await sdk.lifecycle.createAsset(resources);
66
+
67
+ expect(asset).toBeDefined();
68
+ expect(asset.id).toMatch(/^did:peer:/);
69
+ expect(asset.currentLayer).toBe('did:peer');
70
+ expect(asset.resources).toHaveLength(2);
71
+
72
+ console.log(`✅ Asset created: ${asset.id}`);
73
+ console.log(` Current Layer: ${asset.currentLayer}`);
74
+ console.log(` Resources: ${asset.resources.length}`);
75
+
76
+ // Step 3: Publish to web (migrate to did:webvh)
77
+ console.log('\n🔧 Step 3: Publishing to web (did:peer -> did:webvh)...');
78
+ const publishedAsset = await sdk.lifecycle.publishToWeb(asset, domain);
79
+
80
+ expect(publishedAsset).toBeDefined();
81
+ expect(publishedAsset.currentLayer).toBe('did:webvh');
82
+
83
+ // Get the webvh DID from bindings
84
+ const bindings = (publishedAsset as any).bindings;
85
+ expect(bindings).toBeDefined();
86
+ expect(bindings['did:webvh']).toBeDefined();
87
+ expect(bindings['did:webvh']).toMatch(new RegExp(`^did:webvh:${domain.replace(':', '%3A')}:`));
88
+
89
+ const webvhDid = bindings['did:webvh'];
90
+ console.log(`✅ Asset published to web!`);
91
+ console.log(` Original DID (peer): ${asset.id}`);
92
+ console.log(` New DID (webvh): ${webvhDid}`);
93
+ console.log(` Current Layer: ${publishedAsset.currentLayer}`);
94
+
95
+ // Step 4: Verify resources have URLs
96
+ console.log('\n🔧 Step 4: Verifying resource URLs...');
97
+ expect(publishedAsset.resources).toHaveLength(2);
98
+
99
+ for (const resource of publishedAsset.resources) {
100
+ expect(resource.url).toBeDefined();
101
+ expect(typeof resource.url).toBe('string');
102
+ expect((resource.url as string).includes('did:webvh:')).toBe(true);
103
+ expect((resource.url as string).includes('/resources/')).toBe(true);
104
+
105
+ console.log(`✅ Resource ${resource.id}:`);
106
+ console.log(` URL: ${resource.url}`);
107
+ console.log(` Content-Type: ${resource.contentType}`);
108
+ console.log(` Hash: ${resource.hash}`);
109
+ }
110
+
111
+ // Step 5: Verify provenance includes migration event
112
+ console.log('\n🔧 Step 5: Verifying provenance...');
113
+ const provenance = (publishedAsset as any).provenance;
114
+ expect(provenance).toBeDefined();
115
+ expect(provenance.migrations).toBeDefined();
116
+ expect(Array.isArray(provenance.migrations)).toBe(true);
117
+
118
+ const webvhMigration = provenance.migrations.find((m: any) => m.to === 'did:webvh');
119
+ expect(webvhMigration).toBeDefined();
120
+ expect(webvhMigration.from).toBe('did:peer');
121
+ expect(webvhMigration.to).toBe('did:webvh');
122
+ expect(webvhMigration.timestamp).toBeDefined();
123
+
124
+ console.log(`✅ Provenance verified:`);
125
+ console.log(` Migration from: ${webvhMigration.from}`);
126
+ console.log(` Migration to: ${webvhMigration.to}`);
127
+ console.log(` Timestamp: ${webvhMigration.timestamp}`);
128
+
129
+ // Step 6: Test DID resolution (if the webvh DID was created with proper log)
130
+ console.log('\n🔧 Step 6: Testing DID resolution...');
131
+ try {
132
+ const resolved = await sdk.did.resolveDID(webvhDid);
133
+ expect(resolved).toBeDefined();
134
+ expect(resolved?.id).toBe(webvhDid);
135
+
136
+ console.log(`✅ DID resolved successfully:`);
137
+ console.log(` Resolved ID: ${resolved?.id}`);
138
+ console.log(` Context: ${JSON.stringify(resolved?.['@context'])}`);
139
+ if (resolved?.verificationMethod) {
140
+ console.log(` Verification Methods: ${resolved.verificationMethod.length}`);
141
+ }
142
+ } catch (error) {
143
+ console.log(`⚠️ DID resolution skipped (expected for test environment)`);
144
+ console.log(` Reason: ${error instanceof Error ? error.message : String(error)}`);
145
+ }
146
+
147
+ // Step 7: Verify credentials were issued
148
+ console.log('\n🔧 Step 7: Verifying credentials...');
149
+ const credentials = (publishedAsset as any).credentials;
150
+ expect(Array.isArray(credentials)).toBe(true);
151
+ expect(credentials.length).toBeGreaterThan(0);
152
+
153
+ const hasPublicationCredential = credentials.some((c: any) =>
154
+ Array.isArray(c.type) &&
155
+ (c.type.includes('ResourceMigrated') ||
156
+ c.type.includes('ResourcePublished') ||
157
+ c.type.includes('ResourceCreated'))
158
+ );
159
+ expect(hasPublicationCredential).toBe(true);
160
+
161
+ console.log(`✅ Credentials verified:`);
162
+ console.log(` Total credentials: ${credentials.length}`);
163
+ console.log(` Has publication credential: ${hasPublicationCredential}`);
164
+ credentials.forEach((cred: any, idx: number) => {
165
+ console.log(` Credential ${idx + 1}: ${cred.type?.join(', ') || 'Unknown'}`);
166
+ });
167
+
168
+ // Final summary
169
+ console.log('\n' + '='.repeat(70));
170
+ console.log('✨ FLOW VERIFICATION COMPLETE ✨');
171
+ console.log('='.repeat(70));
172
+ console.log(`📋 Summary:`);
173
+ console.log(` ✓ DID Peer created successfully`);
174
+ console.log(` ✓ Asset created with resources`);
175
+ console.log(` ✓ Published to web (did:peer -> did:webvh)`);
176
+ console.log(` ✓ Resource URLs generated and accessible`);
177
+ console.log(` ✓ Provenance tracking verified`);
178
+ console.log(` ✓ Credentials issued`);
179
+ console.log(` ✓ DID bindings established`);
180
+ console.log('='.repeat(70) + '\n');
181
+ });
182
+
183
+ test('verify resource URL format and structure', async () => {
184
+ const resources: AssetResource[] = [
185
+ {
186
+ id: 'res-format-test',
187
+ type: 'data',
188
+ contentType: 'application/octet-stream',
189
+ hash: 'e5a1234560',
190
+ content: 'test data for URL format verification'
191
+ }
192
+ ];
193
+
194
+ const asset = await sdk.lifecycle.createAsset(resources);
195
+ const published = await sdk.lifecycle.publishToWeb(asset, domain);
196
+
197
+ // Verify resource URL structure
198
+ const resource = published.resources[0];
199
+ const url = resource.url as string;
200
+
201
+ expect(url).toBeDefined();
202
+ expect(url).toContain('did:webvh:');
203
+ expect(url).toContain('/resources/');
204
+
205
+ // URL should be in format: did:webvh:domain:path/resources/hash
206
+ expect(url).toMatch(/^did:webvh:[^\/]+\/resources\//);
207
+
208
+ // URL should end with a multibase-encoded hash
209
+ expect(url.split('/').pop()).toMatch(/^[A-Za-z0-9_-]+$/);
210
+
211
+ console.log(`\n✅ Resource URL format verified:`);
212
+ console.log(` Full URL: ${url}`);
213
+ console.log(` Format: DID-based URL`);
214
+ console.log(` Contains resources path: true`);
215
+ console.log(` Hash encoded: ${url.split('/').pop()}`);
216
+ });
217
+
218
+ test('verify bindings are preserved through migration', async () => {
219
+ const resources: AssetResource[] = [
220
+ {
221
+ id: 'binding-test',
222
+ type: 'data',
223
+ contentType: 'text/plain',
224
+ hash: 'b1d1234560',
225
+ content: 'binding test content'
226
+ }
227
+ ];
228
+
229
+ const asset = await sdk.lifecycle.createAsset(resources);
230
+ const originalId = asset.id;
231
+
232
+ const published = await sdk.lifecycle.publishToWeb(asset, domain);
233
+ const bindings = (published as any).bindings;
234
+
235
+ // Should have both peer and webvh bindings
236
+ expect(bindings['did:peer']).toBeDefined();
237
+ expect(bindings['did:webvh']).toBeDefined();
238
+
239
+ // Peer binding should match original asset ID
240
+ expect(bindings['did:peer']).toBe(originalId);
241
+
242
+ // WebVH binding should be a valid did:webvh
243
+ expect(bindings['did:webvh']).toMatch(/^did:webvh:/);
244
+
245
+ console.log(`\n✅ Bindings verified:`);
246
+ console.log(` did:peer: ${bindings['did:peer']}`);
247
+ console.log(` did:webvh: ${bindings['did:webvh']}`);
248
+ console.log(` Previous DID: ${(published as any).previousDid}`);
249
+ });
250
+
251
+ test('verify multiple resources all get URLs', async () => {
252
+ const resources: AssetResource[] = [
253
+ {
254
+ id: 'multi-1',
255
+ type: 'data',
256
+ contentType: 'text/plain',
257
+ hash: 'a51001',
258
+ content: 'content 1'
259
+ },
260
+ {
261
+ id: 'multi-2',
262
+ type: 'data',
263
+ contentType: 'application/json',
264
+ hash: 'a51002',
265
+ content: '{"key": "value"}'
266
+ },
267
+ {
268
+ id: 'multi-3',
269
+ type: 'metadata',
270
+ contentType: 'text/html',
271
+ hash: 'a51003',
272
+ content: '<html><body>test</body></html>'
273
+ },
274
+ {
275
+ id: 'multi-4',
276
+ type: 'data',
277
+ contentType: 'image/svg+xml',
278
+ hash: 'a51004',
279
+ content: '<svg></svg>'
280
+ }
281
+ ];
282
+
283
+ const asset = await sdk.lifecycle.createAsset(resources);
284
+ const published = await sdk.lifecycle.publishToWeb(asset, domain);
285
+
286
+ // All resources should have URLs
287
+ expect(published.resources).toHaveLength(4);
288
+
289
+ for (let i = 0; i < published.resources.length; i++) {
290
+ const resource = published.resources[i];
291
+ expect(resource.url).toBeDefined();
292
+ expect(typeof resource.url).toBe('string');
293
+ expect((resource.url as string).length).toBeGreaterThan(0);
294
+ expect((resource.url as string).includes('did:webvh:')).toBe(true);
295
+ expect((resource.url as string).includes('/resources/')).toBe(true);
296
+
297
+ console.log(`✅ Resource ${i + 1} (${resource.id}):`);
298
+ console.log(` URL: ${resource.url}`);
299
+ }
300
+ });
301
+
302
+ test('verify published asset maintains all original data', async () => {
303
+ const resources: AssetResource[] = [
304
+ {
305
+ id: 'preserve-test',
306
+ type: 'data',
307
+ contentType: 'text/markdown',
308
+ hash: 'e5e1ea00',
309
+ content: '# Test Document\nThis should be preserved.'
310
+ }
311
+ ];
312
+
313
+ const asset = await sdk.lifecycle.createAsset(resources);
314
+
315
+ // Capture original data
316
+ const originalId = asset.id;
317
+ const originalResources = asset.resources.map(r => ({ ...r }));
318
+ const originalLayer = asset.currentLayer;
319
+
320
+ const published = await sdk.lifecycle.publishToWeb(asset, domain);
321
+
322
+ // Verify resources are preserved (with added URL)
323
+ expect(published.resources).toHaveLength(originalResources.length);
324
+
325
+ for (let i = 0; i < published.resources.length; i++) {
326
+ const original = originalResources[i];
327
+ const current = published.resources[i];
328
+
329
+ expect(current.id).toBe(original.id);
330
+ expect(current.type).toBe(original.type);
331
+ expect(current.contentType).toBe(original.contentType);
332
+ expect(current.hash).toBe(original.hash);
333
+ expect(current.content).toBe(original.content);
334
+ expect(current.url).toBeDefined(); // New field added
335
+ }
336
+
337
+ // Verify layer changed
338
+ expect(published.currentLayer).toBe('did:webvh');
339
+ expect(originalLayer).toBe('did:peer');
340
+
341
+ // Verify bindings preserve original ID
342
+ const bindings = (published as any).bindings;
343
+ expect(bindings['did:peer']).toBe(originalId);
344
+
345
+ console.log(`\n✅ Data preservation verified:`);
346
+ console.log(` All resource fields preserved: true`);
347
+ console.log(` URLs added: true`);
348
+ console.log(` Layer updated: ${originalLayer} -> ${published.currentLayer}`);
349
+ console.log(` Original ID preserved in bindings: true`);
350
+ });
351
+ });