@ethersphere/bee-js 13.1.1-upcoming.gebd4706 → 13.2.0-upcoming.g40a63fd

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 (40) hide show
  1. package/README.md +13 -1
  2. package/dist/cjs/api/redistributionstate.js +10 -0
  3. package/dist/cjs/api/stake.js +1 -1
  4. package/dist/cjs/manifest/manifest.js +1 -3
  5. package/dist/cjs/modules/chequebook.js +2 -2
  6. package/dist/cjs/modules/messaging.js +12 -2
  7. package/dist/cjs/modules/stake.js +13 -2
  8. package/dist/cjs/types/schema/stake.js +11 -1
  9. package/dist/cjs/utils/error.js +3 -0
  10. package/dist/cjs/utils/http.js +18 -6
  11. package/dist/cjs/utils/schema.js +8 -1
  12. package/dist/cjs/version.js +2 -2
  13. package/dist/codemod/transforms/v13.js +25 -16
  14. package/dist/index.browser.min.js +1 -1
  15. package/dist/index.browser.min.js.map +1 -1
  16. package/dist/mjs/api/redistributionstate.js +12 -1
  17. package/dist/mjs/api/stake.js +1 -1
  18. package/dist/mjs/manifest/manifest.js +1 -3
  19. package/dist/mjs/modules/chequebook.js +2 -2
  20. package/dist/mjs/modules/messaging.js +16 -3
  21. package/dist/mjs/modules/stake.js +17 -2
  22. package/dist/mjs/types/schema/stake.js +11 -2
  23. package/dist/mjs/utils/error.js +3 -0
  24. package/dist/mjs/utils/http.js +17 -8
  25. package/dist/mjs/utils/schema.js +4 -0
  26. package/dist/mjs/version.js +2 -2
  27. package/dist/types/api/chunk.d.ts +2 -2
  28. package/dist/types/api/redistributionstate.d.ts +1 -0
  29. package/dist/types/api/soc.d.ts +2 -2
  30. package/dist/types/api/stake.d.ts +4 -1
  31. package/dist/types/chunk/soc.d.ts +4 -4
  32. package/dist/types/modules/chunk.d.ts +2 -2
  33. package/dist/types/modules/messaging.d.ts +4 -3
  34. package/dist/types/modules/stake.d.ts +5 -1
  35. package/dist/types/types/debug.d.ts +3 -0
  36. package/dist/types/types/index.d.ts +14 -1
  37. package/dist/types/types/schema/stake.d.ts +7 -0
  38. package/dist/types/utils/schema.d.ts +12 -0
  39. package/dist/types/version.d.ts +2 -2
  40. package/package.json +4 -4
package/README.md CHANGED
@@ -59,6 +59,18 @@ Loading this module through a script tag will make the `BeeJs` object available
59
59
  <script src="https://unpkg.com/@ethersphere/bee-js/dist/index.browser.min.js"></script>
60
60
  ```
61
61
 
62
+ ### Browser apps and CORS
63
+
64
+ From Bee 2.8.3, a node rejects `POST`, `PUT`, `PATCH` and `DELETE` requests from a browser page on another origin with
65
+ `403 Forbidden`, unless that origin is listed in the node's `cors-allowed-origins` option. Uploads, stamp purchases and
66
+ other write calls from a web app therefore need the app's origin in that list:
67
+
68
+ ```sh
69
+ bee start --cors-allowed-origins="https://my-app.example"
70
+ ```
71
+
72
+ Node.js scripts are not affected, because they send no `Origin` header.
73
+
62
74
  ## Overview
63
75
 
64
76
  ### Type interfaces
@@ -69,7 +81,7 @@ types. Where `NumberString` is present, `number` is disallowed in order to avoid
69
81
  ### Byte primitives
70
82
 
71
83
  All the classes below extend `Bytes`, therefore the following methods are available on all of them: `toUint8Array`,
72
- `toHex`, `toBase64`, `toBase32`, `toUtf8`, `toJSON`, `static keccak256`, `static fromUtf8`.
84
+ `toHex`, `toBase64`, `toBase32`, `toUtf8`, `parsePayloadAsJson`, `static keccak256`, `static fromUtf8`.
73
85
 
74
86
  The `toString` method uses `toHex`.
75
87
 
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getRedistributionState = getRedistributionState;
4
+ exports.setRedistributionEnabled = setRedistributionEnabled;
4
5
  const stake_1 = require("../types/schema/stake");
5
6
  const http_1 = require("../utils/http");
6
7
  const redistributionStateEndpoint = 'redistributionstate';
@@ -15,3 +16,12 @@ async function getRedistributionState(requestOptions) {
15
16
  });
16
17
  return stake_1.GetRedistributionStateResponse.parse(response.data);
17
18
  }
19
+ async function setRedistributionEnabled(requestOptions, enabled) {
20
+ const response = await (0, http_1.http)(requestOptions, {
21
+ method: 'patch',
22
+ responseType: 'json',
23
+ url: redistributionStateEndpoint,
24
+ data: { enabled },
25
+ });
26
+ return stake_1.RedistributionToggleResponse.parse(response.data).enabled;
27
+ }
@@ -18,7 +18,7 @@ async function getStake(requestOptions) {
18
18
  responseType: 'json',
19
19
  url: STAKE_ENDPOINT,
20
20
  });
21
- return stake_1.GetStakeResponse.parse(response.data).stakedAmount;
21
+ return stake_1.GetStakeResponse.parse(response.data);
22
22
  }
23
23
  async function getWithdrawableStake(requestOptions) {
24
24
  const response = await (0, http_1.http)(requestOptions, {
@@ -43,9 +43,7 @@ async function loadRecursively(node, bee, options, requestOptions) {
43
43
  };
44
44
  }
45
45
  const data = (await bee.data.download(fork.node.selfAddress, downloadOptions, requestOptions)).toUint8Array();
46
- const loaded = core_sdk_1.MantarayNode.unmarshalFromData(data, fork.node.selfAddress);
47
- fork.node.targetAddress = loaded.targetAddress;
48
- fork.node.forks = loaded.forks;
46
+ fork.node.hydrate(data);
49
47
  fork.node.path = fork.prefix;
50
48
  fork.node.parent = node;
51
49
  await loadRecursively(fork.node, bee, options, requestOptions);
@@ -71,7 +71,7 @@ class Chequebook {
71
71
  */
72
72
  async deposit(amount, gasPrice, requestOptions) {
73
73
  const amountString = amount instanceof tokens_1.BZZ ? amount.toPLURString() : (0, type_1.asNumberString)(amount, { min: 1n, name: 'amount' });
74
- const gasPriceString = gasPrice ? (0, type_1.asNumberString)(amount, { min: 0n, name: 'gasPrice' }) : undefined;
74
+ const gasPriceString = gasPrice ? (0, type_1.asNumberString)(gasPrice, { min: 0n, name: 'gasPrice' }) : undefined;
75
75
  return api.depositTokens(this.context.getRequestOptionsForCall(requestOptions), amountString, gasPriceString);
76
76
  }
77
77
  /**
@@ -83,7 +83,7 @@ class Chequebook {
83
83
  */
84
84
  async withdraw(amount, gasPrice, requestOptions) {
85
85
  const amountString = amount instanceof tokens_1.BZZ ? amount.toPLURString() : (0, type_1.asNumberString)(amount, { min: 1n, name: 'amount' });
86
- const gasPriceString = gasPrice ? (0, type_1.asNumberString)(amount, { min: 0n, name: 'gasPrice' }) : undefined;
86
+ const gasPriceString = gasPrice ? (0, type_1.asNumberString)(gasPrice, { min: 0n, name: 'gasPrice' }) : undefined;
87
87
  return api.withdrawTokens(this.context.getRequestOptionsForCall(requestOptions), amountString, gasPriceString);
88
88
  }
89
89
  }
@@ -194,13 +194,23 @@ class Messaging {
194
194
  * @param address
195
195
  * @param identifier
196
196
  * @param handler
197
+ * @param options SOC fields to receive and whether to cache the wrapped chunk; requires Bee 2.8.3 or later
197
198
  */
198
- gsocSubscribe(address, identifier, handler) {
199
+ gsocSubscribe(address, identifier, handler, options) {
199
200
  const ethAddress = new core_sdk_1.EthAddress(address);
200
201
  const id = new core_sdk_1.Identifier(identifier);
201
202
  handler = schema_1.GsocMessageHandlerSchema.parse(handler);
203
+ const { fields, cacheWrappedChunk } = schema_1.GsocSubscribeOptionsSchema.parse(options ?? {});
204
+ const params = new URLSearchParams();
205
+ if (fields) {
206
+ params.set('swarm-soc-fields', fields.join(','));
207
+ }
208
+ if (cacheWrappedChunk !== undefined) {
209
+ params.set('swarm-cache-wrapped-chunk', String(cacheWrappedChunk));
210
+ }
202
211
  const socAddress = (0, soc_1.makeSOCAddress)(id, ethAddress);
203
- const ws = this.openWebSocket(`${GSOC_ENDPOINT}/subscribe/${socAddress.toHex()}`);
212
+ const query = params.toString() ? `?${params.toString()}` : '';
213
+ const ws = this.openWebSocket(`${GSOC_ENDPOINT}/subscribe/${socAddress.toHex()}${query}`);
204
214
  const cancel = this.makeCancel(ws);
205
215
  const subscription = { address: ethAddress, cancel };
206
216
  ws.onmessage = async (event) => {
@@ -34,6 +34,7 @@ var __importStar = (this && this.__importStar) || (function () {
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.Stake = void 0;
37
+ const zod_1 = require("zod");
37
38
  const schema_1 = require("../utils/schema");
38
39
  const tokens_1 = require("../utils/tokens");
39
40
  const type_1 = require("../utils/type");
@@ -54,7 +55,13 @@ class Stake {
54
55
  * @param requestOptions Options for making requests, such as timeouts, custom HTTP agents, headers, etc.
55
56
  */
56
57
  async get(requestOptions) {
57
- return stakeApi.getStake(this.context.getRequestOptionsForCall(requestOptions));
58
+ const { stakedAmount } = await stakeApi.getStake(this.context.getRequestOptionsForCall(requestOptions));
59
+ return stakedAmount;
60
+ }
61
+ /** Gets the minimum next deposit, or `null` when Bee cannot determine it (e.g. the price oracle is unavailable). */
62
+ async getMinimumDeposit(requestOptions) {
63
+ const { minimumDeposit } = await stakeApi.getStake(this.context.getRequestOptionsForCall(requestOptions));
64
+ return minimumDeposit;
58
65
  }
59
66
  /**
60
67
  * Gets the amount of withdrawable staked BZZ.
@@ -65,7 +72,7 @@ class Stake {
65
72
  return stakeApi.getWithdrawableStake(this.context.getRequestOptionsForCall(requestOptions));
66
73
  }
67
74
  /**
68
- * Stakes the given amount of BZZ. Initial deposit must be at least 10 BZZ.
75
+ * Stakes the given amount of BZZ. Must be at least {@link getMinimumDeposit}, otherwise Bee rejects it with 400.
69
76
  *
70
77
  * Be aware that staked BZZ tokens can **not** be withdrawn.
71
78
  *
@@ -106,5 +113,9 @@ class Stake {
106
113
  async getRedistributionState(requestOptions) {
107
114
  return redistributionApi.getRedistributionState(this.context.getRequestOptionsForCall(requestOptions));
108
115
  }
116
+ /** Enables or disables participation in new redistribution rounds; resets to enabled when the node restarts. */
117
+ async setRedistributionEnabled(enabled, requestOptions) {
118
+ return redistributionApi.setRedistributionEnabled(this.context.getRequestOptionsForCall(requestOptions), zod_1.z.boolean().parse(enabled));
119
+ }
109
120
  }
110
121
  exports.Stake = Stake;
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GetRedistributionStateResponse = exports.TxHashResponse = exports.GetWithdrawableStakeResponse = exports.GetStakeResponse = void 0;
3
+ exports.RedistributionToggleResponse = exports.GetRedistributionStateResponse = exports.TxHashResponse = exports.GetWithdrawableStakeResponse = exports.GetStakeResponse = void 0;
4
4
  const core_sdk_1 = require("@ethersphere/core-sdk");
5
5
  const zod_1 = require("zod");
6
6
  const tokens_1 = require("../../utils/tokens");
7
7
  const type_1 = require("../../utils/type");
8
8
  exports.GetStakeResponse = zod_1.z.object({
9
9
  stakedAmount: zod_1.z.string().transform(s => tokens_1.BZZ.fromPLUR((0, type_1.asNumberString)(s, { name: 'stakedAmount' }))),
10
+ minimumDeposit: zod_1.z
11
+ .string()
12
+ .nullish()
13
+ .transform(s => (s ? tokens_1.BZZ.fromPLUR((0, type_1.asNumberString)(s, { name: 'minimumDeposit' })) : null)),
10
14
  });
11
15
  exports.GetWithdrawableStakeResponse = zod_1.z.object({
12
16
  withdrawableAmount: zod_1.z.string().transform(s => tokens_1.BZZ.fromPLUR((0, type_1.asNumberString)(s, { name: 'withdrawableAmount' }))),
@@ -30,4 +34,10 @@ exports.GetRedistributionStateResponse = zod_1.z.object({
30
34
  reward: zod_1.z.string().transform(s => tokens_1.BZZ.fromPLUR((0, type_1.asNumberString)(s, { name: 'reward' }))),
31
35
  fees: zod_1.z.string().transform(s => tokens_1.DAI.fromWei((0, type_1.asNumberString)(s, { name: 'fees' }))),
32
36
  isHealthy: zod_1.z.boolean(),
37
+ enabled: zod_1.z.boolean(),
38
+ hasCommittedThisRound: zod_1.z.boolean(),
39
+ hasRevealedThisRound: zod_1.z.boolean(),
40
+ });
41
+ exports.RedistributionToggleResponse = zod_1.z.object({
42
+ enabled: zod_1.z.boolean(),
33
43
  });
@@ -4,6 +4,7 @@ exports.BeeResponseError = exports.BeeArgumentError = exports.BeeError = void 0;
4
4
  class BeeError extends Error {
5
5
  constructor(message) {
6
6
  super(message);
7
+ this.name = 'BeeError';
7
8
  }
8
9
  }
9
10
  exports.BeeError = BeeError;
@@ -11,6 +12,7 @@ class BeeArgumentError extends BeeError {
11
12
  constructor(message, value) {
12
13
  super(message);
13
14
  this.value = value;
15
+ this.name = 'BeeArgumentError';
14
16
  }
15
17
  }
16
18
  exports.BeeArgumentError = BeeArgumentError;
@@ -22,6 +24,7 @@ class BeeResponseError extends BeeError {
22
24
  this.responseBody = responseBody;
23
25
  this.status = status;
24
26
  this.statusText = statusText;
27
+ this.name = 'BeeResponseError';
25
28
  this.response = { status, data: responseBody, statusText };
26
29
  }
27
30
  }
@@ -53,7 +53,7 @@ async function http(options, config) {
53
53
  debug(`${method} ${url}`, { headers: requestConfig.headers, params: requestConfig.params });
54
54
  const res = await fetch(url, requestConfig);
55
55
  if (!res.ok)
56
- await throwHttpError(method, url, res, requestConfig.responseType);
56
+ await throwHttpError(method, url, res);
57
57
  return toBeeResponse(res, requestConfig.responseType);
58
58
  }
59
59
  catch (e) {
@@ -87,11 +87,23 @@ function attachBody(config) {
87
87
  config.headers = { 'content-type': ct, ...config.headers };
88
88
  }
89
89
  }
90
- async function throwHttpError(method, url, res, responseType) {
91
- const errBody = await toBeeResponse(res, responseType).catch(() => ({ data: undefined }));
92
- const bodyMsg = typeof errBody.data === 'string' ? errBody.data : JSON.stringify(errBody.data);
93
- const message = bodyMsg && bodyMsg !== 'undefined' ? `${res.statusText}: ${bodyMsg}` : res.statusText;
94
- throw new index_1.BeeResponseError(method, url, message, errBody.data, res.status, res.statusText);
90
+ async function throwHttpError(method, url, res) {
91
+ const data = await readErrorBody(res);
92
+ const bodyMsg = typeof data === 'string' ? data : JSON.stringify(data);
93
+ const message = bodyMsg ? `${res.statusText}: ${bodyMsg}` : res.statusText;
94
+ throw new index_1.BeeResponseError(method, url, message, data, res.status, res.statusText);
95
+ }
96
+ async function readErrorBody(res) {
97
+ const raw = await res.text().catch(() => '');
98
+ if (!raw) {
99
+ return undefined;
100
+ }
101
+ try {
102
+ return JSON.parse(raw);
103
+ }
104
+ catch {
105
+ return raw;
106
+ }
95
107
  }
96
108
  function toBeeError(err, method, url) {
97
109
  if (err.name === 'AbortError') {
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AllTagsOptionsSchema = exports.TransactionOptionsSchema = exports.PostageBatchOptionsSchema = exports.GsocMessageHandlerSchema = exports.PssMessageHandlerSchema = exports.TagUidSchema = exports.TagInputSchema = exports.CollectionUploadOptionsSchema = exports.FileUploadOptionsSchema = exports.RedundantUploadOptionsSchema = exports.UploadOptionsSchema = exports.DownloadOptionsSchema = exports.BeeRequestOptionsSchema = exports.HexStringSchema = void 0;
3
+ exports.AllTagsOptionsSchema = exports.TransactionOptionsSchema = exports.PostageBatchOptionsSchema = exports.GsocSubscribeOptionsSchema = exports.GsocMessageHandlerSchema = exports.PssMessageHandlerSchema = exports.TagUidSchema = exports.TagInputSchema = exports.CollectionUploadOptionsSchema = exports.FileUploadOptionsSchema = exports.RedundantUploadOptionsSchema = exports.UploadOptionsSchema = exports.DownloadOptionsSchema = exports.BeeRequestOptionsSchema = exports.HexStringSchema = void 0;
4
4
  const core_sdk_1 = require("@ethersphere/core-sdk");
5
5
  const zod_1 = require("zod");
6
6
  const types_1 = require("../types");
@@ -71,6 +71,13 @@ exports.GsocMessageHandlerSchema = zod_1.z.object({
71
71
  onError: fnField,
72
72
  onClose: fnField,
73
73
  });
74
+ exports.GsocSubscribeOptionsSchema = zod_1.z.object({
75
+ fields: zod_1.z
76
+ .array(zod_1.z.enum(['address', 'recoveredPubKey', 'identifier', 'signature', 'wrappedAddress', 'span', 'payload']))
77
+ .nonempty()
78
+ .optional(),
79
+ cacheWrappedChunk: zod_1.z.boolean().optional(),
80
+ });
74
81
  exports.PostageBatchOptionsSchema = zod_1.z.object({
75
82
  gasPrice: integerStringField.optional(),
76
83
  immutableFlag: zod_1.z.boolean().optional(),
@@ -4,8 +4,8 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.SUPPORTED_API_VERSION = exports.SUPPORTED_BEE_VERSION = exports.SUPPORTED_BEE_VERSION_EXACT = void 0;
6
6
  /** Exact supported Bee version, including the commit hash suffix. */
7
- exports.SUPPORTED_BEE_VERSION_EXACT = '2.8.1-7cf53193';
7
+ exports.SUPPORTED_BEE_VERSION_EXACT = '2.8.3';
8
8
  /** Supported Bee version without the commit hash suffix. */
9
9
  exports.SUPPORTED_BEE_VERSION = exports.SUPPORTED_BEE_VERSION_EXACT.split('-')[0];
10
10
  /** Supported Bee API version. */
11
- exports.SUPPORTED_API_VERSION = '8.1.0';
11
+ exports.SUPPORTED_API_VERSION = '8.2.0';
@@ -171,14 +171,19 @@ const METHOD_MAP = {
171
171
  function transform(sourceFile, checker) {
172
172
  const source = sourceFile.text;
173
173
  const isNewBee = (node) => !!node && ts.isNewExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'Bee';
174
- // Does the type annotation mention `Bee` (`Bee`, `Bee | null`, `Bee | undefined`, …)?
174
+ const typeNameText = (name) => (ts.isIdentifier(name) ? name.text : name.right.text);
175
+ // Does the type annotation mention `Bee`, plain or wrapped (`Bee | null`, `Mocked<Bee>`,
176
+ // `jest.Mocked<Bee> & Extra`, …)? Arrays and tuples are left out — they don't expose Bee's members.
175
177
  const typeMentionsBee = (type) => {
176
178
  if (!type)
177
179
  return false;
178
- if (ts.isTypeReferenceNode(type) && ts.isIdentifier(type.typeName) && type.typeName.text === 'Bee')
179
- return true;
180
- if (ts.isUnionTypeNode(type))
180
+ if (ts.isParenthesizedTypeNode(type))
181
+ return typeMentionsBee(type.type);
182
+ if (ts.isUnionTypeNode(type) || ts.isIntersectionTypeNode(type))
181
183
  return type.types.some(typeMentionsBee);
184
+ if (ts.isTypeReferenceNode(type)) {
185
+ return typeNameText(type.typeName) === 'Bee' || (type.typeArguments ?? []).some(typeMentionsBee);
186
+ }
182
187
  return false;
183
188
  };
184
189
  // Syntactic pass — identify Bee bindings from annotations and `new Bee(...)` alone, so
@@ -214,10 +219,17 @@ function transform(sourceFile, checker) {
214
219
  ts.forEachChild(node, collect);
215
220
  };
216
221
  collect(sourceFile);
222
+ const isBeeJsFile = (file) => /[/\\]bee-js[/\\]/.test(file) || /[/\\]bee\.(d\.)?ts$/.test(file);
223
+ // A wrapper type (`Mocked<Bee>`, `Partial<Bee>`, …) has no Bee symbol of its own, but the
224
+ // members it maps over still point back at the Bee class they came from.
225
+ const hasBeeMember = (type, memberName) => (type.getProperty(memberName)?.getDeclarations() ?? []).some(decl => {
226
+ const parent = decl.parent;
227
+ return (ts.isClassDeclaration(parent) && parent.name?.text === 'Bee' && isBeeJsFile(parent.getSourceFile().fileName));
228
+ });
217
229
  // A receiver is a Bee if identified syntactically (above) OR resolved by the type checker
218
230
  // to the `Bee` class declared by bee-js — the latter additionally catches imported/shared
219
- // instances and factory calls (`getBee()`) when the project's types resolve.
220
- const isBeeReceiver = (expr) => {
231
+ // instances, factory calls (`getBee()`) and mock wrappers when the project's types resolve.
232
+ const isBeeReceiver = (expr, memberName) => {
221
233
  if (ts.isIdentifier(expr) && beeNames.has(expr.text))
222
234
  return true;
223
235
  if (ts.isPropertyAccessExpression(expr) &&
@@ -225,17 +237,14 @@ function transform(sourceFile, checker) {
225
237
  beeFields.has(expr.name.text)) {
226
238
  return true;
227
239
  }
228
- const symbol = checker.getTypeAtLocation(expr).getSymbol();
240
+ const type = checker.getTypeAtLocation(expr);
241
+ if (memberName && hasBeeMember(type, memberName))
242
+ return true;
243
+ const symbol = type.getSymbol();
229
244
  if (!symbol || symbol.getName() !== 'Bee') {
230
245
  return false;
231
246
  }
232
- return (symbol.getDeclarations() ?? []).some(decl => {
233
- if (!ts.isClassDeclaration(decl)) {
234
- return false;
235
- }
236
- const file = decl.getSourceFile().fileName;
237
- return /[/\\]bee-js[/\\]/.test(file) || /[/\\]bee\.(d\.)?ts$/.test(file);
238
- });
247
+ return (symbol.getDeclarations() ?? []).some(decl => ts.isClassDeclaration(decl) && isBeeJsFile(decl.getSourceFile().fileName));
239
248
  };
240
249
  // ChunkBuilder.hash() now returns a Reference, not a raw Uint8Array.
241
250
  const isChunkBuilderReceiver = (expr) => {
@@ -434,7 +443,7 @@ function transform(sourceFile, checker) {
434
443
  // Any `<bee>.<method>` access — called or not — so bare method references migrate too.
435
444
  if (ts.isPropertyAccessExpression(node) && ts.isIdentifier(node.name)) {
436
445
  const mapping = METHOD_MAP[node.name.text];
437
- if (mapping && isBeeReceiver(node.expression)) {
446
+ if (mapping && isBeeReceiver(node.expression, node.name.text)) {
438
447
  // Preserve optional chaining on the receiver: `bee?.uploadData` → `bee?.data.upload`.
439
448
  const separator = node.questionDotToken ? '?.' : '.';
440
449
  replacements.push({
@@ -468,7 +477,7 @@ function transform(sourceFile, checker) {
468
477
  text: `${quote}${mapping.newName}${quote}`,
469
478
  });
470
479
  }
471
- else if (mapping && isBeeReceiver(receiverArg)) {
480
+ else if (mapping && isBeeReceiver(receiverArg, methodArg.text)) {
472
481
  replacements.push({
473
482
  start: receiverArg.getStart(sourceFile),
474
483
  end: receiverArg.getEnd(),