@exodus/headless 5.0.0-rc.66 → 5.0.0-rc.67

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.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [5.0.0-rc.67](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/headless@5.0.0-rc.65...@exodus/headless@5.0.0-rc.67) (2025-06-03)
7
+
8
+ ### Features
9
+
10
+ - feat: export Safe Reports when locked (#12670)
11
+
12
+ - feat: support Zod Nullable safe parsing (#12280)
13
+
14
+ - feat: switch headless to ESM (#12553)
15
+
16
+ ### Bug Fixes
17
+
18
+ - fix: clear reporting race timeout on finish in headless (#12480)
19
+
20
+ - fix: update @exodus/errors (#12627)
21
+
6
22
  ## [5.0.0-rc.66](https://github.com/ExodusMovement/exodus-hydra/compare/@exodus/headless@5.0.0-rc.65...@exodus/headless@5.0.0-rc.66) (2025-05-09)
7
23
 
8
24
  ### Features
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@exodus/headless",
3
- "version": "5.0.0-rc.66",
3
+ "version": "5.0.0-rc.67",
4
4
  "description": "The platform-agnostic Exodus wallet SDK",
5
5
  "author": "Exodus Movement, Inc.",
6
+ "type": "module",
6
7
  "main": "src/index.js",
7
8
  "repository": {
8
9
  "type": "git",
@@ -24,10 +25,10 @@
24
25
  "scripts": {
25
26
  "lint": "run -T eslint .",
26
27
  "lint:fix": "yarn lint --fix",
27
- "test": "yarn test:types && yarn test:single-process **/*.test.js && yarn test:multi-process **/*.test.js",
28
- "test:integration": "run test:single-process jest **/*.integration-test.js && run test:multi-process jest **/*.integration-test.js",
29
- "test:single-process": "NODE_OPTIONS=--max-old-space-size=4096 run -T jest",
30
- "test:multi-process": "MULTI_PROCESS=1 NODE_OPTIONS=--max-old-space-size=4096 run -T jest",
28
+ "test": "yarn test:types && yarn test:single-process && yarn test:multi-process",
29
+ "test:integration": "RUN_TESTS=integration run test",
30
+ "test:single-process": "run -T exodus-test --jest",
31
+ "test:multi-process": "MULTI_PROCESS=1 run test:single-process",
31
32
  "test:types": "run -T tsc --noEmit"
32
33
  },
33
34
  "dependencies": {
@@ -43,8 +44,8 @@
43
44
  "@exodus/blockchain-metadata": "^15.9.2",
44
45
  "@exodus/cached-sodium-encryptor": "^1.0.0",
45
46
  "@exodus/enabled-assets": "^10.9.1",
46
- "@exodus/error-tracking": "^1.5.1",
47
- "@exodus/errors": "^2.0.1",
47
+ "@exodus/error-tracking": "^2.0.0",
48
+ "@exodus/errors": "^3.0.0",
48
49
  "@exodus/feature-flags": "^6.1.0",
49
50
  "@exodus/fee-data-monitors": "^5.0.3",
50
51
  "@exodus/filesystem": "^1.2.1",
@@ -72,41 +73,41 @@
72
73
  "devDependencies": {
73
74
  "@exodus/ab-testing": "^7.7.1",
74
75
  "@exodus/algorand-lib": "^2.0.1",
75
- "@exodus/algorand-meta": "^1.1.4",
76
- "@exodus/analytics": "^15.2.1",
76
+ "@exodus/algorand-meta": "^2.0.0",
77
+ "@exodus/analytics": "^15.3.0",
77
78
  "@exodus/announcements": "^3.0.0",
78
79
  "@exodus/app-process-mobile": "^3.8.0",
79
- "@exodus/apy-rates": "^3.5.0",
80
+ "@exodus/apy-rates": "^3.6.0",
80
81
  "@exodus/bip32": "^4.0.2",
81
82
  "@exodus/bitcoin-plugin": "^1.0.14",
82
83
  "@exodus/connected-origins": "^4.3.0",
83
- "@exodus/crypto-news-monitor": "^5.0.2",
84
+ "@exodus/crypto": "^1.0.0-rc.22",
85
+ "@exodus/crypto-news-monitor": "^5.1.1",
84
86
  "@exodus/deferring-storage": "^1.0.2",
85
87
  "@exodus/dependency-types": "^2.1.1",
86
- "@exodus/domain-serialization": "^1.5.1",
88
+ "@exodus/domain-serialization": "^1.6.0",
87
89
  "@exodus/ethereum-lib": "^5.0.0",
88
90
  "@exodus/ethereum-meta": "^2.4.1",
89
91
  "@exodus/event-log": "^2.7.0",
90
92
  "@exodus/fetch": "^1.2.1",
91
- "@exodus/fetch-factory": "^2.2.6",
92
- "@exodus/fiat-ramp": "^12.7.2",
93
+ "@exodus/fetch-factory": "^2.3.0",
94
+ "@exodus/fiat-ramp": "^13.0.0",
93
95
  "@exodus/key-identifier": "^1.2.1",
94
96
  "@exodus/kyc": "^7.0.0",
95
97
  "@exodus/logger": "^1.2.3",
96
- "@exodus/market-history": "^10.2.0",
97
- "@exodus/models": "^12.8.2",
98
+ "@exodus/market-history": "^10.2.2",
99
+ "@exodus/models": "^12.13.0",
98
100
  "@exodus/nfts": "^9.5.1",
99
101
  "@exodus/personal-notes": "^3.8.0",
100
102
  "@exodus/referrals": "^8.9.7",
101
103
  "@exodus/sdk-rpc": "^1.0.0",
102
- "@exodus/sodium-crypto": "^3.2.0",
103
104
  "@exodus/solana-lib": "^3.6.0",
104
- "@exodus/solana-meta": "^1.0.2",
105
- "@exodus/storage-encrypted": "^1.4.2",
105
+ "@exodus/solana-meta": "^2.0.0",
106
+ "@exodus/storage-encrypted": "^1.5.0",
106
107
  "@exodus/storage-memory": "^2.2.2",
107
- "@exodus/top-movers-monitor": "^4.3.0",
108
+ "@exodus/top-movers-monitor": "^4.4.0",
108
109
  "@exodus/ui-config": "^3.13.0",
109
- "@exodus/wallet-sdk": "^1.2.1",
110
+ "@exodus/wallet-sdk": "^1.3.0",
110
111
  "@exodus/wild-emitter": "^1.0.0",
111
112
  "@exodus/zod": "^3.24.3",
112
113
  "bip39": "^2.6.0",
@@ -135,5 +136,5 @@
135
136
  "publishConfig": {
136
137
  "access": "public"
137
138
  },
138
- "gitHead": "6dd6fa84c06fe7713c382328cc5f04db71b3baf7"
139
+ "gitHead": "e422ec2394dd97cc93f19a9a541755fe684ebc79"
139
140
  }
package/redux/index.js CHANGED
@@ -1,20 +1,20 @@
1
1
  import applicationRedux from '@exodus/application/redux'
2
- import createReduxIOC from '@exodus/argo/redux'
3
- import assetsRedux from '@exodus/assets-feature/redux'
4
- import availableAssetsRedux from '@exodus/available-assets/redux'
5
- import balancesRedux from '@exodus/balances/redux'
6
- import accountStatesRedux from '@exodus/blockchain-metadata/redux/account-states'
7
- import txLogsRedux from '@exodus/blockchain-metadata/redux/tx-logs'
8
- import enabledAssetsRedux from '@exodus/enabled-assets/redux'
9
- import featureflagsRedux from '@exodus/feature-flags/redux'
10
- import feeDataRedux from '@exodus/fee-data-monitors/redux'
11
- import geolocationRedux from '@exodus/geolocation/redux'
12
- import localeRedux from '@exodus/locale/redux'
13
- import ratesRedux from '@exodus/rates-monitor/redux'
14
- import remoteConfigRedux from '@exodus/remote-config/lib/redux'
15
- import restoreProgressRedux from '@exodus/restore-progress-tracker/redux'
16
- import startupCounterRedux from '@exodus/startup-counter/redux'
17
- import createWalletAccountsRedux from '@exodus/wallet-accounts/redux'
2
+ import createReduxIOC from '@exodus/argo/redux/index.js'
3
+ import assetsRedux from '@exodus/assets-feature/redux/index.js'
4
+ import availableAssetsRedux from '@exodus/available-assets/redux/index.js'
5
+ import balancesRedux from '@exodus/balances/redux/index.js'
6
+ import accountStatesRedux from '@exodus/blockchain-metadata/redux/account-states/index.js'
7
+ import txLogsRedux from '@exodus/blockchain-metadata/redux/tx-logs/index.js'
8
+ import enabledAssetsRedux from '@exodus/enabled-assets/redux/index.js'
9
+ import featureflagsRedux from '@exodus/feature-flags/redux/index.js'
10
+ import feeDataRedux from '@exodus/fee-data-monitors/redux/index.js'
11
+ import geolocationRedux from '@exodus/geolocation/redux/index.js'
12
+ import localeRedux from '@exodus/locale/redux/index.js'
13
+ import ratesRedux from '@exodus/rates-monitor/redux/index.js'
14
+ import remoteConfigRedux from '@exodus/remote-config/lib/redux/index.js'
15
+ import restoreProgressRedux from '@exodus/restore-progress-tracker/redux/index.js'
16
+ import startupCounterRedux from '@exodus/startup-counter/redux/index.js'
17
+ import createWalletAccountsRedux from '@exodus/wallet-accounts/redux/index.js'
18
18
 
19
19
  function createExodusRedux({ createLogger, enhancer, reducers, actionCreators }) {
20
20
  const ioc = createReduxIOC({ createLogger, enhancer, reducers, actionCreators })
package/src/api/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import assert from 'minimalistic-assert'
2
2
 
3
- import createDebug from './debug'
4
- import createReporting from './reporting'
3
+ import createDebug from './debug.js'
4
+ import createReporting from './reporting.js'
5
5
  import { mapValues } from '@exodus/basic-utils'
6
6
 
7
7
  const asyncify = (fn) => {
@@ -27,9 +27,6 @@ const createReporting = ({ ioc, config: { exportTimeout = 5000 } = {} }) => {
27
27
 
28
28
  const getReports = async () => {
29
29
  const [exists, locked] = await Promise.all([wallet.exists(), lockedAtom.get()])
30
- if (exists && locked) {
31
- throw new Error('Unable to export when locked')
32
- }
33
30
 
34
31
  const reports = Object.values(nodes)
35
32
 
@@ -40,7 +37,7 @@ const createReporting = ({ ioc, config: { exportTimeout = 5000 } = {} }) => {
40
37
 
41
38
  const exportReport = async (report) => {
42
39
  const start = performance.now()
43
- const unvalidatedExport = await report.export({ walletExists: exists })
40
+ const unvalidatedExport = await report.export({ walletExists: exists, isLocked: locked })
44
41
  const schema = report.getSchema?.()
45
42
  if (!schema) {
46
43
  throw new Error(`Validation schema is missing for ${report.namespace}.`)
@@ -53,9 +50,11 @@ const createReporting = ({ ioc, config: { exportTimeout = 5000 } = {} }) => {
53
50
  }
54
51
 
55
52
  const resolvedReports = await Promise.allSettled(
56
- reports.map((report) => Promise.race([exportReport(report), timeoutPromise]))
53
+ reports.map((report) => Promise.race([exportReport(report), timeoutPromise.promise]))
57
54
  )
58
55
 
56
+ timeoutPromise.clear()
57
+
59
58
  const namespaces = reports.map((report) => report.namespace)
60
59
  const data = resolvedReports.map((outcome) =>
61
60
  outcome.status === 'fulfilled' ? outcome.value : { error: SafeError.from(outcome.reason) }
@@ -1,4 +1,4 @@
1
- import { wrapConstant } from './utils'
1
+ import { wrapConstant } from './utils.js'
2
2
 
3
3
  const createAdapterDependencies = ({ adapters }) =>
4
4
  Object.entries(adapters).map(([id, value]) => wrapConstant({ id, type: 'adapter', value }))
@@ -1,4 +1,4 @@
1
- import baseAssetNamesToMonitorAtomDefinition from '../atoms/base-asset-names-to-monitor'
1
+ import baseAssetNamesToMonitorAtomDefinition from '../atoms/base-asset-names-to-monitor.js'
2
2
 
3
3
  const createAtomDependencies = ({ config }) => [
4
4
  {
@@ -1,4 +1,4 @@
1
- import { withType } from './utils'
1
+ import { withType } from './utils.js'
2
2
 
3
3
  const createConfigDependencies = ({ config }) => {
4
4
  return [
@@ -3,12 +3,12 @@
3
3
 
4
4
  import assert from 'minimalistic-assert'
5
5
 
6
- import createAdapterDependencies from './adapters'
7
- import createAtomDependencies from './atoms'
8
- import createConfigDependencies from './configs'
9
- import createModuleDependencies from './modules'
10
- import createPluginDependencies from './plugins'
11
- import { wrapConstant } from './utils'
6
+ import createAdapterDependencies from './adapters.js'
7
+ import createAtomDependencies from './atoms.js'
8
+ import createConfigDependencies from './configs.js'
9
+ import createModuleDependencies from './modules.js'
10
+ import createPluginDependencies from './plugins.js'
11
+ import { wrapConstant } from './utils.js'
12
12
 
13
13
  const adapterKeys = ['createLogger', 'legacyPrivToPub', 'unsafeStorage', 'fetch', 'freeze']
14
14
 
@@ -1,5 +1,5 @@
1
- import unlockEncryptedStorageDefinition from '../unlock-encrypted-storage'
2
- import { withType } from './utils'
1
+ import unlockEncryptedStorageDefinition from '../unlock-encrypted-storage.js'
2
+ import { withType } from './utils.js'
3
3
 
4
4
  const createModuleDependencies = () =>
5
5
  [{ definition: unlockEncryptedStorageDefinition }].map(withType('module'))
@@ -1,6 +1,6 @@
1
- import headlessAnalyticsPluginDefinition from '../plugins/analytics'
2
- import headlessUiLifecyclePluginDefinition from '../plugins/headless-ui'
3
- import logLifecyclePluginDefinition from '../plugins/log-lifecycle'
1
+ import headlessAnalyticsPluginDefinition from '../plugins/analytics.js'
2
+ import headlessUiLifecyclePluginDefinition from '../plugins/headless-ui.js'
3
+ import logLifecyclePluginDefinition from '../plugins/log-lifecycle.js'
4
4
 
5
5
  const createPluginDependencies = () => [
6
6
  { definition: logLifecyclePluginDefinition },
@@ -1,4 +1,4 @@
1
- import { createRpcFeature } from '../../utils/ioc'
1
+ import { createRpcFeature } from '../../utils/ioc.js'
2
2
 
3
3
  const cachedSodiumEncryptorRpc = (api) => createRpcFeature('cachedSodiumEncryptor', api)
4
4
 
@@ -1,4 +1,4 @@
1
- import { createRpcFeature } from '../../utils/ioc'
1
+ import { createRpcFeature } from '../../utils/ioc.js'
2
2
 
3
3
  const keychainRpc = (api) => createRpcFeature('keychain', api)
4
4
 
@@ -1,7 +1,10 @@
1
1
  export const rejectAfter = (ms, reason) => {
2
- return new Promise((resolve, reject) =>
3
- setTimeout(() => {
2
+ let timeout
3
+ const promise = new Promise((_resolve, reject) => {
4
+ timeout = setTimeout(() => {
4
5
  reject(new Error(reason))
5
6
  }, ms)
6
- )
7
+ })
8
+
9
+ return { promise, clear: () => clearTimeout(timeout) }
7
10
  }