@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.
- package/README.md +13 -1
- package/dist/cjs/api/redistributionstate.js +10 -0
- package/dist/cjs/api/stake.js +1 -1
- package/dist/cjs/manifest/manifest.js +1 -3
- package/dist/cjs/modules/chequebook.js +2 -2
- package/dist/cjs/modules/messaging.js +12 -2
- package/dist/cjs/modules/stake.js +13 -2
- package/dist/cjs/types/schema/stake.js +11 -1
- package/dist/cjs/utils/error.js +3 -0
- package/dist/cjs/utils/http.js +18 -6
- package/dist/cjs/utils/schema.js +8 -1
- package/dist/cjs/version.js +2 -2
- package/dist/codemod/transforms/v13.js +25 -16
- package/dist/index.browser.min.js +1 -1
- package/dist/index.browser.min.js.map +1 -1
- package/dist/mjs/api/redistributionstate.js +12 -1
- package/dist/mjs/api/stake.js +1 -1
- package/dist/mjs/manifest/manifest.js +1 -3
- package/dist/mjs/modules/chequebook.js +2 -2
- package/dist/mjs/modules/messaging.js +16 -3
- package/dist/mjs/modules/stake.js +17 -2
- package/dist/mjs/types/schema/stake.js +11 -2
- package/dist/mjs/utils/error.js +3 -0
- package/dist/mjs/utils/http.js +17 -8
- package/dist/mjs/utils/schema.js +4 -0
- package/dist/mjs/version.js +2 -2
- package/dist/types/api/chunk.d.ts +2 -2
- package/dist/types/api/redistributionstate.d.ts +1 -0
- package/dist/types/api/soc.d.ts +2 -2
- package/dist/types/api/stake.d.ts +4 -1
- package/dist/types/chunk/soc.d.ts +4 -4
- package/dist/types/modules/chunk.d.ts +2 -2
- package/dist/types/modules/messaging.d.ts +4 -3
- package/dist/types/modules/stake.d.ts +5 -1
- package/dist/types/types/debug.d.ts +3 -0
- package/dist/types/types/index.d.ts +14 -1
- package/dist/types/types/schema/stake.d.ts +7 -0
- package/dist/types/utils/schema.d.ts +12 -0
- package/dist/types/version.d.ts +2 -2
- 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`, `
|
|
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
|
+
}
|
package/dist/cjs/api/stake.js
CHANGED
|
@@ -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)
|
|
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
|
-
|
|
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)(
|
|
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)(
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
});
|
package/dist/cjs/utils/error.js
CHANGED
|
@@ -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
|
}
|
package/dist/cjs/utils/http.js
CHANGED
|
@@ -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
|
|
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
|
|
91
|
-
const
|
|
92
|
-
const bodyMsg = typeof
|
|
93
|
-
const message = bodyMsg
|
|
94
|
-
throw new index_1.BeeResponseError(method, url, message,
|
|
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') {
|
package/dist/cjs/utils/schema.js
CHANGED
|
@@ -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(),
|
package/dist/cjs/version.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
-
|
|
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.
|
|
179
|
-
return
|
|
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
|
|
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
|
|
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(),
|