@bedrock-rbx/ocale 0.1.0-beta.2 → 0.1.0-beta.21
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 +129 -0
- package/dist/badges.d.mts +33 -2
- package/dist/badges.d.mts.map +1 -1
- package/dist/badges.mjs +12 -4
- package/dist/badges.mjs.map +1 -1
- package/dist/{data.generated-BtkDGH8C.d.mts → data.generated-B2ceLfSn.d.mts} +9 -1
- package/dist/data.generated-B2ceLfSn.d.mts.map +1 -0
- package/dist/developer-products.d.mts +38 -2
- package/dist/developer-products.d.mts.map +1 -1
- package/dist/developer-products.mjs +22 -5
- package/dist/developer-products.mjs.map +1 -1
- package/dist/game-passes.d.mts +40 -2
- package/dist/game-passes.d.mts.map +1 -1
- package/dist/game-passes.mjs +22 -5
- package/dist/game-passes.mjs.map +1 -1
- package/dist/index.d.mts +110 -12
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +5 -3
- package/dist/locales.d.mts +1 -1
- package/dist/locales.mjs +2 -0
- package/dist/locales.mjs.map +1 -1
- package/dist/luau-execution.d.mts +112 -6
- package/dist/luau-execution.d.mts.map +1 -1
- package/dist/luau-execution.mjs +129 -4
- package/dist/luau-execution.mjs.map +1 -1
- package/dist/places.d.mts +64 -6
- package/dist/places.d.mts.map +1 -1
- package/dist/places.mjs +33 -61
- package/dist/places.mjs.map +1 -1
- package/dist/poll-timeout-C0nmJzOd.mjs +83 -0
- package/dist/poll-timeout-C0nmJzOd.mjs.map +1 -0
- package/dist/polling-helpers-Cb4j4cq7.mjs +787 -0
- package/dist/polling-helpers-Cb4j4cq7.mjs.map +1 -0
- package/dist/polling-rj0dGREg.d.mts +312 -0
- package/dist/polling-rj0dGREg.d.mts.map +1 -0
- package/dist/{price-information-s7DY0GV2.mjs → price-information-Bu87sPyh.mjs} +2 -2
- package/dist/{price-information-s7DY0GV2.mjs.map → price-information-Bu87sPyh.mjs.map} +1 -1
- package/dist/{rate-limit-CKfuhxT1.mjs → rate-limit-Co9i28qi.mjs} +24 -38
- package/dist/rate-limit-Co9i28qi.mjs.map +1 -0
- package/dist/{resource-client-Wi4Mwqy5.mjs → resource-client-lE7Tg3BK.mjs} +349 -241
- package/dist/resource-client-lE7Tg3BK.mjs.map +1 -0
- package/dist/retry-CbHBw60o.mjs +380 -0
- package/dist/retry-CbHBw60o.mjs.map +1 -0
- package/dist/retry-r1TXe5Zd.d.mts +189 -0
- package/dist/retry-r1TXe5Zd.d.mts.map +1 -0
- package/dist/signatures-JF-7Psce.mjs +59 -0
- package/dist/signatures-JF-7Psce.mjs.map +1 -0
- package/dist/storage.d.mts +322 -31
- package/dist/storage.d.mts.map +1 -1
- package/dist/storage.mjs +506 -18
- package/dist/storage.mjs.map +1 -1
- package/dist/testing.d.mts +727 -0
- package/dist/testing.d.mts.map +1 -0
- package/dist/testing.mjs +457 -0
- package/dist/testing.mjs.map +1 -0
- package/dist/{to-blob-1BtHsDGK.mjs → to-blob-RPqMBuft.mjs} +1 -1
- package/dist/{to-blob-1BtHsDGK.mjs.map → to-blob-RPqMBuft.mjs.map} +1 -1
- package/dist/{types-Cp8w8uwA.d.mts → types-CRiJg5EQ.d.mts} +46 -4
- package/dist/types-CRiJg5EQ.d.mts.map +1 -0
- package/dist/universes.d.mts +47 -10
- package/dist/universes.d.mts.map +1 -1
- package/dist/universes.mjs +7 -5
- package/dist/universes.mjs.map +1 -1
- package/dist/{validation-b7KAoEio.mjs → validation-9oU6qNNQ.mjs} +4 -2
- package/dist/validation-9oU6qNNQ.mjs.map +1 -0
- package/dist/wire-D3K-a-UP.d.mts +37 -0
- package/dist/wire-D3K-a-UP.d.mts.map +1 -0
- package/package.json +9 -7
- package/dist/data.generated-BtkDGH8C.d.mts.map +0 -1
- package/dist/is-date-time-string-Cuf1TaSC.mjs +0 -19
- package/dist/is-date-time-string-Cuf1TaSC.mjs.map +0 -1
- package/dist/rate-limit-CKfuhxT1.mjs.map +0 -1
- package/dist/rate-limit-DzHBFwps.d.mts +0 -92
- package/dist/rate-limit-DzHBFwps.d.mts.map +0 -1
- package/dist/resource-client-Wi4Mwqy5.mjs.map +0 -1
- package/dist/specs-Co6qYp_E.mjs +0 -309
- package/dist/specs-Co6qYp_E.mjs.map +0 -1
- package/dist/types-BZ0959rh.d.mts +0 -149
- package/dist/types-BZ0959rh.d.mts.map +0 -1
- package/dist/types-Cp8w8uwA.d.mts.map +0 -1
- package/dist/validation-b7KAoEio.mjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.d.mts","names":[],"sources":["../src/domains/badges/badges/wire.ts","../tests/helpers/badges.ts","../src/internal/price-information.ts","../src/domains/developer-products/products/wire.ts","../tests/helpers/developer-products.ts","../tests/helpers/fake-http-client.ts","../tests/helpers/fake-send.ts","../tests/helpers/fake-sleep.ts","../tests/helpers/game-icon.ts","../src/domains/game-passes/game-passes/wire.ts","../tests/helpers/game-passes.ts","../src/domains/game-internationalization/game-thumbnails/wire.ts","../tests/helpers/game-thumbnails.ts","../src/domains/cloud-v2/luau-execution-task-binary-inputs/wire.ts","../tests/helpers/luau-execution-task-binary-inputs.ts","../src/domains/cloud-v2/luau-execution-task-logs/wire.ts","../tests/helpers/luau-execution-task-logs.ts","../src/domains/cloud-v2/luau-execution-tasks/wire.ts","../tests/helpers/luau-execution-tasks.ts","../src/domains/cloud-v2/memory-store-queues/wire.ts","../tests/helpers/memory-store-queues.ts","../src/domains/cloud-v2/places/wire.ts","../src/domains/universes/places/wire.ts","../tests/helpers/places.ts","../src/domains/cloud-v2/universes/wire.ts","../tests/helpers/universes.ts"],"mappings":"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"}
|
package/dist/testing.mjs
ADDED
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
import { n as NetworkError, r as ApiError, t as RateLimitError } from "./rate-limit-Co9i28qi.mjs";
|
|
2
|
+
import { n as RBXL_SIGNATURE, t as RBXLX_SIGNATURE } from "./signatures-JF-7Psce.mjs";
|
|
3
|
+
//#region tests/helpers/badges.ts
|
|
4
|
+
/**
|
|
5
|
+
* Builds a minimally-valid {@link BadgeResponseV2Wire} body. Pass an
|
|
6
|
+
* `overrides` object to tweak individual fields while keeping everything
|
|
7
|
+
* else schema-compliant; useful for parser and integration tests that
|
|
8
|
+
* only care about one field at a time.
|
|
9
|
+
*
|
|
10
|
+
* @param overrides - Fields to override on the default body.
|
|
11
|
+
* @returns A valid wire body with the overrides applied.
|
|
12
|
+
*/
|
|
13
|
+
function validBadgeBody(overrides = {}) {
|
|
14
|
+
return {
|
|
15
|
+
id: 12345,
|
|
16
|
+
name: "First Goal",
|
|
17
|
+
awarder: {
|
|
18
|
+
id: 222,
|
|
19
|
+
name: "Lobby",
|
|
20
|
+
type: 1
|
|
21
|
+
},
|
|
22
|
+
created: "2024-01-15T10:30:00.000Z",
|
|
23
|
+
description: "Awarded on first login.",
|
|
24
|
+
displayDescription: "Awarded on first login.",
|
|
25
|
+
displayIconImageId: 67890,
|
|
26
|
+
displayName: "First Goal",
|
|
27
|
+
enabled: true,
|
|
28
|
+
iconImageId: 67890,
|
|
29
|
+
statistics: {
|
|
30
|
+
awardedCount: 100,
|
|
31
|
+
pastDayAwardedCount: 5,
|
|
32
|
+
winRatePercentage: 42.5
|
|
33
|
+
},
|
|
34
|
+
updated: "2024-03-20T14:45:00.000Z",
|
|
35
|
+
...overrides
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region tests/helpers/developer-products.ts
|
|
40
|
+
/**
|
|
41
|
+
* Builds a minimally-valid {@link DeveloperProductConfigV2} wire body. Pass
|
|
42
|
+
* an `overrides` object to tweak individual fields while keeping everything
|
|
43
|
+
* else schema-compliant; useful for parser and integration tests that
|
|
44
|
+
* only care about one field at a time.
|
|
45
|
+
*
|
|
46
|
+
* @param overrides - Fields to override on the default body.
|
|
47
|
+
* @returns A valid wire body with the overrides applied.
|
|
48
|
+
*/
|
|
49
|
+
function validDeveloperProductBody(overrides = {}) {
|
|
50
|
+
return {
|
|
51
|
+
name: "Gem Pack",
|
|
52
|
+
createdTimestamp: "2024-01-15T10:30:00.000Z",
|
|
53
|
+
description: "A premium gem pack",
|
|
54
|
+
iconImageAssetId: 67890,
|
|
55
|
+
isForSale: true,
|
|
56
|
+
isImmutable: false,
|
|
57
|
+
priceInformation: {
|
|
58
|
+
defaultPriceInRobux: 100,
|
|
59
|
+
enabledFeatures: []
|
|
60
|
+
},
|
|
61
|
+
productId: 12345,
|
|
62
|
+
storePageEnabled: true,
|
|
63
|
+
universeId: 999,
|
|
64
|
+
updatedTimestamp: "2024-03-20T14:45:00.000Z",
|
|
65
|
+
...overrides
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
//#endregion
|
|
69
|
+
//#region tests/helpers/fake-http-client.ts
|
|
70
|
+
/**
|
|
71
|
+
* Thrown when {@link FakeHttpClient.request} is called but no mock has
|
|
72
|
+
* been queued. The message names the method, url, and consumed count to
|
|
73
|
+
* aid debugging of missing `.mockResponse`/`.mockError` setup.
|
|
74
|
+
*/
|
|
75
|
+
var FakeHttpClientError = class extends Error {
|
|
76
|
+
name = "FakeHttpClientError";
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Creates a fluent {@link FakeHttpClient} that sits at the
|
|
80
|
+
* {@link HttpClient} seam. Use for integration tests where you need to
|
|
81
|
+
* assert per-request config (apiKey, baseUrl) flows through to HTTP.
|
|
82
|
+
*
|
|
83
|
+
* @returns A fresh fake with an empty mock queue.
|
|
84
|
+
*/
|
|
85
|
+
function createFakeHttpClient() {
|
|
86
|
+
const state = {
|
|
87
|
+
captured: [],
|
|
88
|
+
consumed: 0,
|
|
89
|
+
queue: []
|
|
90
|
+
};
|
|
91
|
+
function enqueue(result) {
|
|
92
|
+
state.queue.push(result);
|
|
93
|
+
return fake;
|
|
94
|
+
}
|
|
95
|
+
const fake = {
|
|
96
|
+
mockApiError: (options) => enqueue(errorResult(buildApiError(options))),
|
|
97
|
+
mockError: (error) => enqueue(errorResult(error)),
|
|
98
|
+
mockNetworkError: (options) => enqueue(errorResult(buildNetworkError(options))),
|
|
99
|
+
mockRateLimit: (options) => enqueue(errorResult(buildRateLimitError(options))),
|
|
100
|
+
mockResponse: (options) => enqueue(successResult(options)),
|
|
101
|
+
get pendingMocks() {
|
|
102
|
+
return state.queue.length;
|
|
103
|
+
},
|
|
104
|
+
request: async (request, config) => handleRequest({
|
|
105
|
+
config,
|
|
106
|
+
request,
|
|
107
|
+
state
|
|
108
|
+
}),
|
|
109
|
+
get requests() {
|
|
110
|
+
return state.captured;
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
return fake;
|
|
114
|
+
}
|
|
115
|
+
function consumeNextMock(state, request) {
|
|
116
|
+
const next = state.queue.shift();
|
|
117
|
+
if (next === void 0) throw new FakeHttpClientError(`FakeHttpClient: no mock queued for ${request.method} ${request.url} (consumed ${String(state.consumed)}, pending 0)`);
|
|
118
|
+
state.consumed += 1;
|
|
119
|
+
return next;
|
|
120
|
+
}
|
|
121
|
+
async function handleRequest(options) {
|
|
122
|
+
const { config, request, state } = options;
|
|
123
|
+
state.captured.push({
|
|
124
|
+
config,
|
|
125
|
+
request
|
|
126
|
+
});
|
|
127
|
+
return consumeNextMock(state, request);
|
|
128
|
+
}
|
|
129
|
+
function successResult(options) {
|
|
130
|
+
return {
|
|
131
|
+
data: {
|
|
132
|
+
body: options.body ?? {},
|
|
133
|
+
headers: options.headers ?? {},
|
|
134
|
+
status: options.status
|
|
135
|
+
},
|
|
136
|
+
success: true
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function errorResult(err) {
|
|
140
|
+
return {
|
|
141
|
+
err,
|
|
142
|
+
success: false
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function buildApiError(options) {
|
|
146
|
+
const message = options.message ?? "API error";
|
|
147
|
+
if (options.code === void 0) return new ApiError(message, { statusCode: options.statusCode });
|
|
148
|
+
return new ApiError(message, {
|
|
149
|
+
code: options.code,
|
|
150
|
+
statusCode: options.statusCode
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function buildNetworkError(options) {
|
|
154
|
+
const message = options?.message ?? "Network error";
|
|
155
|
+
if (options?.cause === void 0) return new NetworkError(message);
|
|
156
|
+
return new NetworkError(message, { cause: options.cause });
|
|
157
|
+
}
|
|
158
|
+
function buildRateLimitError(options) {
|
|
159
|
+
return new RateLimitError(options.message ?? "Rate limited", { retryAfterSeconds: options.retryAfterSeconds });
|
|
160
|
+
}
|
|
161
|
+
//#endregion
|
|
162
|
+
//#region tests/helpers/fake-send.ts
|
|
163
|
+
/**
|
|
164
|
+
* Creates a scripted fake for the `send` callback. Each call returns the
|
|
165
|
+
* next queued response; exhausting the queue throws, which surfaces test
|
|
166
|
+
* setup mistakes instead of silently repeating the last response.
|
|
167
|
+
*
|
|
168
|
+
* @param options - The scripted responses to replay, in order.
|
|
169
|
+
* @returns A `send` callback plus a `requests` log.
|
|
170
|
+
* @rejects {Error} When a call is made after all scripted responses are consumed.
|
|
171
|
+
*/
|
|
172
|
+
function createFakeSend(options) {
|
|
173
|
+
const requests = [];
|
|
174
|
+
let index = 0;
|
|
175
|
+
async function send(request) {
|
|
176
|
+
requests.push(request);
|
|
177
|
+
const response = options.responses[index];
|
|
178
|
+
index += 1;
|
|
179
|
+
if (response === void 0) throw new Error(`createFakeSend exhausted: ${String(index)} calls made, only ${String(options.responses.length)} responses scripted`);
|
|
180
|
+
return response;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
requests,
|
|
184
|
+
send
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
//#endregion
|
|
188
|
+
//#region tests/helpers/fake-sleep.ts
|
|
189
|
+
/**
|
|
190
|
+
* Creates a {@link FakeSleep} that resolves immediately and records every
|
|
191
|
+
* `ms` value it was called with.
|
|
192
|
+
*
|
|
193
|
+
* @returns A callable sleep function with a `waits` log attached.
|
|
194
|
+
*/
|
|
195
|
+
function createFakeSleep() {
|
|
196
|
+
const waits = [];
|
|
197
|
+
async function sleep(ms) {
|
|
198
|
+
waits.push(ms);
|
|
199
|
+
}
|
|
200
|
+
return Object.assign(sleep, { get waits() {
|
|
201
|
+
return waits;
|
|
202
|
+
} });
|
|
203
|
+
}
|
|
204
|
+
//#endregion
|
|
205
|
+
//#region tests/helpers/game-icon.ts
|
|
206
|
+
/**
|
|
207
|
+
* Builds a minimally-valid {@link GetGameIconResponseWire} entry. Pass an
|
|
208
|
+
* `overrides` object to tweak individual fields while keeping everything
|
|
209
|
+
* else schema-compliant.
|
|
210
|
+
*
|
|
211
|
+
* @param overrides - Fields to override on the default entry.
|
|
212
|
+
* @returns A valid localized-icon entry with the overrides applied.
|
|
213
|
+
*/
|
|
214
|
+
function validLocalizedIcon(overrides = {}) {
|
|
215
|
+
return {
|
|
216
|
+
imageId: "12345",
|
|
217
|
+
imageUrl: "https://t1.rbxcdn.com/icon/12345",
|
|
218
|
+
languageCode: "en_us",
|
|
219
|
+
state: "Approved",
|
|
220
|
+
...overrides
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Builds a minimally-valid {@link GameIconListWire} body containing a single
|
|
225
|
+
* default localized icon.
|
|
226
|
+
*
|
|
227
|
+
* @param overrides - Fields to override on the default body.
|
|
228
|
+
* @returns A valid wire body with the overrides applied.
|
|
229
|
+
*/
|
|
230
|
+
function validIconListBody(overrides = {}) {
|
|
231
|
+
return {
|
|
232
|
+
data: [validLocalizedIcon()],
|
|
233
|
+
...overrides
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
//#endregion
|
|
237
|
+
//#region tests/helpers/game-passes.ts
|
|
238
|
+
/**
|
|
239
|
+
* Builds a minimally-valid {@link GamePassConfigV2} wire body. Pass an
|
|
240
|
+
* `overrides` object to tweak individual fields while keeping everything
|
|
241
|
+
* else schema-compliant — useful for parser and integration tests that
|
|
242
|
+
* only care about one field at a time.
|
|
243
|
+
*
|
|
244
|
+
* @param overrides - Fields to override on the default body.
|
|
245
|
+
* @returns A valid wire body with the overrides applied.
|
|
246
|
+
*/
|
|
247
|
+
function validGamePassBody(overrides = {}) {
|
|
248
|
+
return {
|
|
249
|
+
name: "Epic Pass",
|
|
250
|
+
createdTimestamp: "2024-01-15T10:30:00.000Z",
|
|
251
|
+
description: "Unlocks epic stuff",
|
|
252
|
+
gamePassId: 12345,
|
|
253
|
+
iconAssetId: 67890,
|
|
254
|
+
isForSale: true,
|
|
255
|
+
priceInformation: {
|
|
256
|
+
defaultPriceInRobux: 100,
|
|
257
|
+
enabledFeatures: []
|
|
258
|
+
},
|
|
259
|
+
updatedTimestamp: "2024-03-20T14:45:00.000Z",
|
|
260
|
+
...overrides
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
//#endregion
|
|
264
|
+
//#region tests/helpers/game-thumbnails.ts
|
|
265
|
+
/**
|
|
266
|
+
* Builds a minimally-valid {@link GameThumbnailUploadWire} body. Pass an
|
|
267
|
+
* `overrides` object to tweak individual fields while keeping everything
|
|
268
|
+
* else schema-compliant; useful for parser and integration tests that
|
|
269
|
+
* only care about one field at a time.
|
|
270
|
+
*
|
|
271
|
+
* @param overrides - Fields to override on the default body.
|
|
272
|
+
* @returns A valid wire body with the overrides applied.
|
|
273
|
+
*/
|
|
274
|
+
function validThumbnailUploadBody(overrides = {}) {
|
|
275
|
+
return {
|
|
276
|
+
mediaAssetId: "67890",
|
|
277
|
+
...overrides
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
//#endregion
|
|
281
|
+
//#region tests/helpers/luau-execution-task-binary-inputs.ts
|
|
282
|
+
/**
|
|
283
|
+
* Builds a minimally-valid {@link LuauExecutionTaskBinaryInputWire} body
|
|
284
|
+
* for tests. Pass an `overrides` object to tweak fields without re-stating
|
|
285
|
+
* the defaults.
|
|
286
|
+
*
|
|
287
|
+
* @param overrides - Fields to override on the default body.
|
|
288
|
+
* @returns A valid wire body with the overrides applied.
|
|
289
|
+
*/
|
|
290
|
+
function validBinaryInputBody(overrides = {}) {
|
|
291
|
+
return {
|
|
292
|
+
path: "universes/123/luau-execution-session-task-binary-inputs/abc",
|
|
293
|
+
uploadUri: "https://storage.example.com/upload?token=xyz",
|
|
294
|
+
...overrides
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
//#endregion
|
|
298
|
+
//#region tests/helpers/luau-execution-task-logs.ts
|
|
299
|
+
/**
|
|
300
|
+
* Builds a minimally-valid {@link ListLogsResponseWire} body containing
|
|
301
|
+
* one chunk with one structured message. Pass an `overrides` object to
|
|
302
|
+
* tweak fields without re-stating the defaults.
|
|
303
|
+
*
|
|
304
|
+
* @param overrides - Fields to override on the default body.
|
|
305
|
+
* @returns A valid wire body with the overrides applied.
|
|
306
|
+
*/
|
|
307
|
+
function validLogPageBody(overrides = {}) {
|
|
308
|
+
return {
|
|
309
|
+
luauExecutionSessionTaskLogs: [{ structuredMessages: [{
|
|
310
|
+
createTime: "2026-01-01T00:00:00Z",
|
|
311
|
+
message: "Hello from Luau",
|
|
312
|
+
messageType: "OUTPUT"
|
|
313
|
+
}] }],
|
|
314
|
+
...overrides
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
//#endregion
|
|
318
|
+
//#region tests/helpers/luau-execution-tasks.ts
|
|
319
|
+
/**
|
|
320
|
+
* Builds a minimally-valid {@link LuauExecutionTaskWire} body for an
|
|
321
|
+
* in-progress task. Pass an `overrides` object to tweak fields without
|
|
322
|
+
* re-stating the defaults.
|
|
323
|
+
*
|
|
324
|
+
* @param overrides - Fields to override on the default body.
|
|
325
|
+
* @returns A valid wire body with the overrides applied.
|
|
326
|
+
*/
|
|
327
|
+
function validInProgressTaskBody(overrides = {}) {
|
|
328
|
+
return {
|
|
329
|
+
createTime: "2026-01-01T00:00:00Z",
|
|
330
|
+
path: "universes/123/places/456/luau-execution-session-tasks/task-1",
|
|
331
|
+
state: "QUEUED",
|
|
332
|
+
updateTime: "2026-01-01T00:00:30Z",
|
|
333
|
+
user: "user-1",
|
|
334
|
+
...overrides
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
//#endregion
|
|
338
|
+
//#region tests/helpers/memory-store-queues.ts
|
|
339
|
+
/**
|
|
340
|
+
* Builds a minimally-valid {@link MemoryStoreQueueItemWire} body. Pass
|
|
341
|
+
* an `overrides` object to tweak fields without re-stating the defaults.
|
|
342
|
+
*
|
|
343
|
+
* @param overrides - Fields to override on the default body.
|
|
344
|
+
* @returns A valid wire body with the overrides applied.
|
|
345
|
+
*/
|
|
346
|
+
function validQueueItemBody(overrides = {}) {
|
|
347
|
+
return {
|
|
348
|
+
data: "hello",
|
|
349
|
+
expireTime: "2026-06-21T15:08:58.4806559Z",
|
|
350
|
+
path: "cloud/v2/universes/123/memory-store/queues/test-queue/items/abc123",
|
|
351
|
+
priority: 1,
|
|
352
|
+
...overrides
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Builds a minimally-valid {@link ReadQueueItemsResponseWire} body
|
|
357
|
+
* carrying a single default queue item. Pass an `overrides` object to
|
|
358
|
+
* change the read identifier or supply a different items array.
|
|
359
|
+
*
|
|
360
|
+
* @param overrides - Fields to override on the default body.
|
|
361
|
+
* @returns A valid dequeue response body with the overrides applied.
|
|
362
|
+
*/
|
|
363
|
+
function validDequeueBody(overrides = {}) {
|
|
364
|
+
return {
|
|
365
|
+
id: "1a354bd5b8fe457f8e51232f8dbfe6d0",
|
|
366
|
+
queueItems: [validQueueItemBody()],
|
|
367
|
+
...overrides
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
//#endregion
|
|
371
|
+
//#region tests/helpers/places.ts
|
|
372
|
+
/**
|
|
373
|
+
* Returns a fresh, minimal `.rbxl`-formatted body whose magic bytes
|
|
374
|
+
* match {@link RBXL_SIGNATURE}. Useful when integration tests don't
|
|
375
|
+
* care about the file's contents past the signature.
|
|
376
|
+
*
|
|
377
|
+
* @returns A 14-byte rbxl body matching the binary signature.
|
|
378
|
+
*/
|
|
379
|
+
function rbxlBody() {
|
|
380
|
+
return new Uint8Array(RBXL_SIGNATURE);
|
|
381
|
+
}
|
|
382
|
+
/**
|
|
383
|
+
* Returns a fresh, minimal `.rbxlx`-formatted body whose magic bytes
|
|
384
|
+
* match {@link RBXLX_SIGNATURE}. Useful when integration tests don't
|
|
385
|
+
* care about the file's contents past the signature.
|
|
386
|
+
*
|
|
387
|
+
* @returns An 8-byte rbxlx body matching the XML signature.
|
|
388
|
+
*/
|
|
389
|
+
function rbxlxBody() {
|
|
390
|
+
return new Uint8Array(RBXLX_SIGNATURE);
|
|
391
|
+
}
|
|
392
|
+
/**
|
|
393
|
+
* Builds a minimally-valid {@link PlaceVersionWire} body. Pass an
|
|
394
|
+
* `overrides` object to tweak fields without re-stating the defaults.
|
|
395
|
+
*
|
|
396
|
+
* @param overrides - Fields to override on the default body.
|
|
397
|
+
* @returns A valid wire body with the overrides applied.
|
|
398
|
+
*/
|
|
399
|
+
function validPublishResponseBody(overrides = {}) {
|
|
400
|
+
return {
|
|
401
|
+
versionNumber: 1,
|
|
402
|
+
...overrides
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Builds a minimally-valid {@link PlaceWire} body. Pass an `overrides`
|
|
407
|
+
* object to tweak fields without re-stating the defaults.
|
|
408
|
+
*
|
|
409
|
+
* @param overrides - Fields to override on the default body.
|
|
410
|
+
* @returns A valid wire body with the overrides applied.
|
|
411
|
+
*/
|
|
412
|
+
function validPlaceBody(overrides = {}) {
|
|
413
|
+
return {
|
|
414
|
+
createTime: "2024-01-15T10:30:00.000Z",
|
|
415
|
+
description: "A sample place.",
|
|
416
|
+
displayName: "Test Place",
|
|
417
|
+
path: "universes/123/places/456",
|
|
418
|
+
root: true,
|
|
419
|
+
serverSize: 30,
|
|
420
|
+
universeRuntimeCreation: false,
|
|
421
|
+
updateTime: "2024-11-02T17:08:21.500Z",
|
|
422
|
+
...overrides
|
|
423
|
+
};
|
|
424
|
+
}
|
|
425
|
+
//#endregion
|
|
426
|
+
//#region tests/helpers/universes.ts
|
|
427
|
+
/**
|
|
428
|
+
* Builds a minimally-valid {@link UniverseWire} body. Pass an
|
|
429
|
+
* `overrides` object to tweak fields without re-stating the defaults.
|
|
430
|
+
*
|
|
431
|
+
* @param overrides - Fields to override on the default body.
|
|
432
|
+
* @returns A valid wire body with the overrides applied.
|
|
433
|
+
*/
|
|
434
|
+
function validUniverseBody(overrides = {}) {
|
|
435
|
+
return {
|
|
436
|
+
ageRating: "AGE_RATING_13_PLUS",
|
|
437
|
+
consoleEnabled: false,
|
|
438
|
+
createTime: "2024-01-15T10:30:00.000Z",
|
|
439
|
+
description: "A sample universe for tests.",
|
|
440
|
+
desktopEnabled: true,
|
|
441
|
+
displayName: "Test Universe",
|
|
442
|
+
mobileEnabled: true,
|
|
443
|
+
path: "universes/12345",
|
|
444
|
+
rootPlace: "universes/12345/places/98765",
|
|
445
|
+
tabletEnabled: true,
|
|
446
|
+
updateTime: "2024-11-02T17:08:21.500Z",
|
|
447
|
+
user: "users/7777",
|
|
448
|
+
visibility: "PUBLIC",
|
|
449
|
+
voiceChatEnabled: false,
|
|
450
|
+
vrEnabled: false,
|
|
451
|
+
...overrides
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
//#endregion
|
|
455
|
+
export { FakeHttpClientError, createFakeHttpClient, createFakeSend, createFakeSleep, rbxlBody, rbxlxBody, validBadgeBody, validBinaryInputBody, validDequeueBody, validDeveloperProductBody, validGamePassBody, validIconListBody, validInProgressTaskBody, validLocalizedIcon, validLogPageBody, validPlaceBody, validPublishResponseBody, validQueueItemBody, validThumbnailUploadBody, validUniverseBody };
|
|
456
|
+
|
|
457
|
+
//# sourceMappingURL=testing.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testing.mjs","names":[],"sources":["../tests/helpers/badges.ts","../tests/helpers/developer-products.ts","../tests/helpers/fake-http-client.ts","../tests/helpers/fake-send.ts","../tests/helpers/fake-sleep.ts","../tests/helpers/game-icon.ts","../tests/helpers/game-passes.ts","../tests/helpers/game-thumbnails.ts","../tests/helpers/luau-execution-task-binary-inputs.ts","../tests/helpers/luau-execution-task-logs.ts","../tests/helpers/luau-execution-tasks.ts","../tests/helpers/memory-store-queues.ts","../tests/helpers/places.ts","../tests/helpers/universes.ts"],"sourcesContent":["import type { BadgeResponseV2Wire } from \"#src/domains/badges/badges/wire\";\n\n/**\n * Builds a minimally-valid {@link BadgeResponseV2Wire} body. Pass an\n * `overrides` object to tweak individual fields while keeping everything\n * else schema-compliant; useful for parser and integration tests that\n * only care about one field at a time.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validBadgeBody(overrides: Partial<BadgeResponseV2Wire> = {}): BadgeResponseV2Wire {\n\treturn {\n\t\tid: 12_345,\n\t\tname: \"First Goal\",\n\t\tawarder: { id: 222, name: \"Lobby\", type: 1 },\n\t\tcreated: \"2024-01-15T10:30:00.000Z\",\n\t\tdescription: \"Awarded on first login.\",\n\t\tdisplayDescription: \"Awarded on first login.\",\n\t\tdisplayIconImageId: 67_890,\n\t\tdisplayName: \"First Goal\",\n\t\tenabled: true,\n\t\ticonImageId: 67_890,\n\t\tstatistics: { awardedCount: 100, pastDayAwardedCount: 5, winRatePercentage: 42.5 },\n\t\tupdated: \"2024-03-20T14:45:00.000Z\",\n\t\t...overrides,\n\t};\n}\n","import type { DeveloperProductConfigV2 } from \"#src/domains/developer-products/products/wire\";\n\n/**\n * Builds a minimally-valid {@link DeveloperProductConfigV2} wire body. Pass\n * an `overrides` object to tweak individual fields while keeping everything\n * else schema-compliant; useful for parser and integration tests that\n * only care about one field at a time.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validDeveloperProductBody(\n\toverrides: Partial<DeveloperProductConfigV2> = {},\n): DeveloperProductConfigV2 {\n\treturn {\n\t\tname: \"Gem Pack\",\n\t\tcreatedTimestamp: \"2024-01-15T10:30:00.000Z\",\n\t\tdescription: \"A premium gem pack\",\n\t\ticonImageAssetId: 67_890,\n\t\tisForSale: true,\n\t\tisImmutable: false,\n\t\tpriceInformation: { defaultPriceInRobux: 100, enabledFeatures: [] },\n\t\tproductId: 12_345,\n\t\tstorePageEnabled: true,\n\t\tuniverseId: 999,\n\t\tupdatedTimestamp: \"2024-03-20T14:45:00.000Z\",\n\t\t...overrides,\n\t};\n}\n","import { ApiError } from \"#src/errors/api-error\";\nimport type { OpenCloudError } from \"#src/errors/base\";\nimport { NetworkError } from \"#src/errors/network-error\";\nimport { RateLimitError } from \"#src/errors/rate-limit\";\nimport type {\n\tHttpClient,\n\tHttpRequest,\n\tHttpResponse,\n\tRequestConfig,\n} from \"#src/internal/http/types\";\nimport type { Result } from \"#src/types\";\n\n/**\n * A request captured by {@link FakeHttpClient} for later assertion.\n */\nexport interface CapturedRequest {\n\t/** The per-request config passed alongside the request. */\n\treadonly config: RequestConfig;\n\t/** The request passed to {@link HttpClient.request}. */\n\treadonly request: HttpRequest;\n}\n\n/**\n * A fluent fake for the {@link HttpClient} boundary. Mocks are queued in\n * FIFO order and consumed by each `request()` call. Records every\n * request and config for later assertion. Throws\n * {@link FakeHttpClientError} if the queue is empty when `request()` is\n * called — surfaces missing mocks as test setup bugs instead of silently\n * repeating the last response.\n */\nexport interface FakeHttpClient extends HttpClient {\n\t/** Queues an {@link ApiError} with the given status code and optional message/code. */\n\tmockApiError(options: { code?: string; message?: string; statusCode: number }): this;\n\t/** Queues an error Result with the given error instance. */\n\tmockError(error: OpenCloudError): this;\n\t/** Queues a {@link NetworkError}. Preserves `cause` when provided. */\n\tmockNetworkError(options?: { cause?: unknown; message?: string }): this;\n\t/** Queues a {@link RateLimitError} with the given retry hint. */\n\tmockRateLimit(options: { message?: string; retryAfterSeconds: number }): this;\n\t/** Queues a successful {@link HttpResponse}. Body defaults to `{}`; headers default to `{}`. */\n\tmockResponse(options: {\n\t\tbody?: unknown;\n\t\theaders?: Readonly<Record<string, string>>;\n\t\tstatus: number;\n\t}): this;\n\t/** Number of queued mocks that have not yet been consumed. */\n\treadonly pendingMocks: number;\n\t/** Chronological log of every `(request, config)` pair the fake received. */\n\treadonly requests: ReadonlyArray<CapturedRequest>;\n}\n\ntype ErrorResult = Result<HttpResponse, OpenCloudError> & { success: false };\n\ninterface FakeState {\n\treadonly captured: Array<CapturedRequest>;\n\tconsumed: number;\n\treadonly queue: Array<Result<HttpResponse, OpenCloudError>>;\n}\n\n/**\n * Thrown when {@link FakeHttpClient.request} is called but no mock has\n * been queued. The message names the method, url, and consumed count to\n * aid debugging of missing `.mockResponse`/`.mockError` setup.\n */\nexport class FakeHttpClientError extends Error {\n\tpublic override readonly name: string = \"FakeHttpClientError\";\n}\n\n/**\n * Creates a fluent {@link FakeHttpClient} that sits at the\n * {@link HttpClient} seam. Use for integration tests where you need to\n * assert per-request config (apiKey, baseUrl) flows through to HTTP.\n *\n * @returns A fresh fake with an empty mock queue.\n */\nexport function createFakeHttpClient(): FakeHttpClient {\n\tconst state: FakeState = { captured: [], consumed: 0, queue: [] };\n\tfunction enqueue(result: Result<HttpResponse, OpenCloudError>): FakeHttpClient {\n\t\tstate.queue.push(result);\n\t\treturn fake;\n\t}\n\n\tconst fake: FakeHttpClient = {\n\t\tmockApiError: (options) => enqueue(errorResult(buildApiError(options))),\n\t\tmockError: (error) => enqueue(errorResult(error)),\n\t\tmockNetworkError: (options) => enqueue(errorResult(buildNetworkError(options))),\n\t\tmockRateLimit: (options) => enqueue(errorResult(buildRateLimitError(options))),\n\t\tmockResponse: (options) => enqueue(successResult(options)),\n\t\tget pendingMocks() {\n\t\t\treturn state.queue.length;\n\t\t},\n\t\trequest: async (request, config) => handleRequest({ config, request, state }),\n\t\tget requests() {\n\t\t\treturn state.captured;\n\t\t},\n\t};\n\n\treturn fake;\n}\n\nfunction consumeNextMock(\n\tstate: FakeState,\n\trequest: HttpRequest,\n): Result<HttpResponse, OpenCloudError> {\n\tconst next = state.queue.shift();\n\tif (next === undefined) {\n\t\tthrow new FakeHttpClientError(\n\t\t\t`FakeHttpClient: no mock queued for ${request.method} ${request.url} (consumed ${String(state.consumed)}, pending 0)`,\n\t\t);\n\t}\n\n\tstate.consumed += 1;\n\treturn next;\n}\n\nasync function handleRequest(options: {\n\treadonly config: RequestConfig;\n\treadonly request: HttpRequest;\n\treadonly state: FakeState;\n}): Promise<Result<HttpResponse, OpenCloudError>> {\n\tconst { config, request, state } = options;\n\tstate.captured.push({ config, request });\n\treturn consumeNextMock(state, request);\n}\n\nfunction successResult(options: {\n\tbody?: unknown;\n\theaders?: Readonly<Record<string, string>>;\n\tstatus: number;\n}): Result<HttpResponse, OpenCloudError> {\n\treturn {\n\t\tdata: {\n\t\t\tbody: options.body ?? {},\n\t\t\theaders: options.headers ?? {},\n\t\t\tstatus: options.status,\n\t\t},\n\t\tsuccess: true,\n\t};\n}\n\nfunction errorResult(err: OpenCloudError): ErrorResult {\n\treturn { err, success: false };\n}\n\nfunction buildApiError(options: { code?: string; message?: string; statusCode: number }): ApiError {\n\tconst message = options.message ?? \"API error\";\n\tif (options.code === undefined) {\n\t\treturn new ApiError(message, { statusCode: options.statusCode });\n\t}\n\n\treturn new ApiError(message, { code: options.code, statusCode: options.statusCode });\n}\n\nfunction buildNetworkError(\n\toptions: undefined | { cause?: unknown; message?: string },\n): NetworkError {\n\tconst message = options?.message ?? \"Network error\";\n\tif (options?.cause === undefined) {\n\t\treturn new NetworkError(message);\n\t}\n\n\treturn new NetworkError(message, { cause: options.cause });\n}\n\nfunction buildRateLimitError(options: {\n\tmessage?: string;\n\tretryAfterSeconds: number;\n}): RateLimitError {\n\treturn new RateLimitError(options.message ?? \"Rate limited\", {\n\t\tretryAfterSeconds: options.retryAfterSeconds,\n\t});\n}\n","import type { OpenCloudError } from \"#src/errors/base\";\nimport type { HttpRequest, HttpResponse } from \"#src/internal/http/types\";\nimport type { Result } from \"#src/types\";\n\n/**\n * The `send` callback shape consumed by `executeWithRetry`. A plain\n * transport function — no `RequestConfig`, no queueing, no retries.\n */\nexport type SendFunc = (request: HttpRequest) => Promise<Result<HttpResponse, OpenCloudError>>;\n\n/**\n * A scripted fake for the `send` callback. Replays responses in order\n * and records every request it receives.\n */\nexport interface FakeSend {\n\t/** Chronological log of every request the fake received. */\n\treadonly requests: ReadonlyArray<HttpRequest>;\n\t/** The scripted send callback. */\n\treadonly send: SendFunc;\n}\n\n/**\n * Creates a scripted fake for the `send` callback. Each call returns the\n * next queued response; exhausting the queue throws, which surfaces test\n * setup mistakes instead of silently repeating the last response.\n *\n * @param options - The scripted responses to replay, in order.\n * @returns A `send` callback plus a `requests` log.\n * @rejects {Error} When a call is made after all scripted responses are consumed.\n */\nexport function createFakeSend(options: {\n\treadonly responses: ReadonlyArray<Result<HttpResponse, OpenCloudError>>;\n}): FakeSend {\n\tconst requests: Array<HttpRequest> = [];\n\tlet index = 0;\n\n\tasync function send(request: HttpRequest): Promise<Result<HttpResponse, OpenCloudError>> {\n\t\trequests.push(request);\n\t\tconst response = options.responses[index];\n\t\tindex += 1;\n\n\t\tif (response === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`createFakeSend exhausted: ${String(index)} calls made, only ${String(options.responses.length)} responses scripted`,\n\t\t\t);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\treturn { requests, send };\n}\n","import type { SleepFunc } from \"#src/internal/utils/sleep\";\n\n/**\n * A directly-callable sleep double that records its wait arguments without\n * delaying. Assignable to {@link SleepFunc}.\n */\nexport interface FakeSleep extends SleepFunc {\n\t/** Chronological log of every `ms` value the fake was called with. */\n\treadonly waits: ReadonlyArray<number>;\n}\n\n/**\n * Creates a {@link FakeSleep} that resolves immediately and records every\n * `ms` value it was called with.\n *\n * @returns A callable sleep function with a `waits` log attached.\n */\nexport function createFakeSleep(): FakeSleep {\n\tconst waits: Array<number> = [];\n\n\tasync function sleep(ms: number): Promise<void> {\n\t\twaits.push(ms);\n\t}\n\n\tconst fake: FakeSleep = Object.assign(sleep, {\n\t\tget waits(): ReadonlyArray<number> {\n\t\t\treturn waits;\n\t\t},\n\t});\n\n\treturn fake;\n}\n","import type {\n\tGameIconListWire,\n\tGetGameIconResponseWire,\n} from \"#src/domains/game-internationalization/game-icon/wire\";\n\n/**\n * Builds a minimally-valid {@link GetGameIconResponseWire} entry. Pass an\n * `overrides` object to tweak individual fields while keeping everything\n * else schema-compliant.\n *\n * @param overrides - Fields to override on the default entry.\n * @returns A valid localized-icon entry with the overrides applied.\n */\nexport function validLocalizedIcon(\n\toverrides: Partial<GetGameIconResponseWire> = {},\n): GetGameIconResponseWire {\n\treturn {\n\t\timageId: \"12345\",\n\t\timageUrl: \"https://t1.rbxcdn.com/icon/12345\",\n\t\tlanguageCode: \"en_us\",\n\t\tstate: \"Approved\",\n\t\t...overrides,\n\t};\n}\n\n/**\n * Builds a minimally-valid {@link GameIconListWire} body containing a single\n * default localized icon.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validIconListBody(overrides: Partial<GameIconListWire> = {}): GameIconListWire {\n\treturn {\n\t\tdata: [validLocalizedIcon()],\n\t\t...overrides,\n\t};\n}\n","import type { GamePassConfigV2 } from \"#src/domains/game-passes/game-passes/wire\";\n\n/**\n * Test-only wire shape for the list response. Mirrors the OpenAPI\n * schema, which marks `nextPageToken` as required and nullable, so\n * fixtures can carry the literal JSON `null` the API sends on the last\n * page without leaking `null` into the production wire type (which\n * exposes a post-normalization view of `string | undefined`).\n */\ninterface ListGamePassesWireBody {\n\treadonly gamePasses: ReadonlyArray<GamePassConfigV2>;\n\n\treadonly nextPageToken: null | string;\n}\n\n/**\n * Builds a minimally-valid {@link GamePassConfigV2} wire body. Pass an\n * `overrides` object to tweak individual fields while keeping everything\n * else schema-compliant — useful for parser and integration tests that\n * only care about one field at a time.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validGamePassBody(overrides: Partial<GamePassConfigV2> = {}): GamePassConfigV2 {\n\treturn {\n\t\tname: \"Epic Pass\",\n\t\tcreatedTimestamp: \"2024-01-15T10:30:00.000Z\",\n\t\tdescription: \"Unlocks epic stuff\",\n\t\tgamePassId: 12_345,\n\t\ticonAssetId: 67_890,\n\t\tisForSale: true,\n\t\tpriceInformation: { defaultPriceInRobux: 100, enabledFeatures: [] },\n\t\tupdatedTimestamp: \"2024-03-20T14:45:00.000Z\",\n\t\t...overrides,\n\t};\n}\n\n/**\n * Builds a minimally-valid wire body for the \"list game passes\" endpoint.\n * By default the page contains one game pass and `nextPageToken` is the\n * literal JSON `null` the API sends on the last page; `overrides` let\n * parser and integration tests tweak the items array or the cursor\n * without rebuilding the whole shape.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied. `nextPageToken`\n * defaults to the wire's literal `null`, which the response parser\n * normalizes to `undefined` at the boundary.\n */\nexport function validListGamePassesBody(\n\toverrides: Partial<ListGamePassesWireBody> = {},\n): ListGamePassesWireBody {\n\treturn {\n\t\tgamePasses: [validGamePassBody()],\n\t\t// eslint-disable-next-line unicorn/no-null -- API sends null on the last page; parser normalizes to undefined.\n\t\tnextPageToken: null,\n\t\t...overrides,\n\t};\n}\n","import type { GameThumbnailUploadWire } from \"#src/domains/game-internationalization/game-thumbnails/wire\";\n\n/**\n * Builds a minimally-valid {@link GameThumbnailUploadWire} body. Pass an\n * `overrides` object to tweak individual fields while keeping everything\n * else schema-compliant; useful for parser and integration tests that\n * only care about one field at a time.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validThumbnailUploadBody(\n\toverrides: Partial<GameThumbnailUploadWire> = {},\n): GameThumbnailUploadWire {\n\treturn { mediaAssetId: \"67890\", ...overrides };\n}\n","import type { LuauExecutionTaskBinaryInputWire } from \"#src/domains/cloud-v2/luau-execution-task-binary-inputs/wire\";\n\n/**\n * Builds a minimally-valid {@link LuauExecutionTaskBinaryInputWire} body\n * for tests. Pass an `overrides` object to tweak fields without re-stating\n * the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validBinaryInputBody(\n\toverrides: Partial<LuauExecutionTaskBinaryInputWire> = {},\n): LuauExecutionTaskBinaryInputWire {\n\treturn {\n\t\tpath: \"universes/123/luau-execution-session-task-binary-inputs/abc\",\n\t\tuploadUri: \"https://storage.example.com/upload?token=xyz\",\n\t\t...overrides,\n\t};\n}\n","import type { ListLogsResponseWire } from \"#src/domains/cloud-v2/luau-execution-task-logs/wire\";\n\n/**\n * Builds a minimally-valid {@link ListLogsResponseWire} body containing\n * one chunk with one structured message. Pass an `overrides` object to\n * tweak fields without re-stating the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validLogPageBody(\n\toverrides: Partial<ListLogsResponseWire> = {},\n): ListLogsResponseWire {\n\treturn {\n\t\tluauExecutionSessionTaskLogs: [\n\t\t\t{\n\t\t\t\tstructuredMessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tcreateTime: \"2026-01-01T00:00:00Z\",\n\t\t\t\t\t\tmessage: \"Hello from Luau\",\n\t\t\t\t\t\tmessageType: \"OUTPUT\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t\t...overrides,\n\t};\n}\n","import type { LuauExecutionTaskWire } from \"#src/domains/cloud-v2/luau-execution-tasks/wire\";\n\n/**\n * Builds a minimally-valid {@link LuauExecutionTaskWire} body for an\n * in-progress task. Pass an `overrides` object to tweak fields without\n * re-stating the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validInProgressTaskBody(\n\toverrides: Partial<LuauExecutionTaskWire> = {},\n): LuauExecutionTaskWire {\n\treturn {\n\t\tcreateTime: \"2026-01-01T00:00:00Z\",\n\t\tpath: \"universes/123/places/456/luau-execution-session-tasks/task-1\",\n\t\tstate: \"QUEUED\",\n\t\tupdateTime: \"2026-01-01T00:00:30Z\",\n\t\tuser: \"user-1\",\n\t\t...overrides,\n\t};\n}\n","import type {\n\tMemoryStoreQueueItemWire,\n\tReadQueueItemsResponseWire,\n} from \"#src/domains/cloud-v2/memory-store-queues/wire\";\n\n/**\n * Builds a minimally-valid {@link MemoryStoreQueueItemWire} body. Pass\n * an `overrides` object to tweak fields without re-stating the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validQueueItemBody(\n\toverrides: Partial<MemoryStoreQueueItemWire> = {},\n): MemoryStoreQueueItemWire {\n\treturn {\n\t\tdata: \"hello\",\n\t\texpireTime: \"2026-06-21T15:08:58.4806559Z\",\n\t\tpath: \"cloud/v2/universes/123/memory-store/queues/test-queue/items/abc123\",\n\t\tpriority: 1,\n\t\t...overrides,\n\t};\n}\n\n/**\n * Builds a minimally-valid {@link ReadQueueItemsResponseWire} body\n * carrying a single default queue item. Pass an `overrides` object to\n * change the read identifier or supply a different items array.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid dequeue response body with the overrides applied.\n */\nexport function validDequeueBody(\n\toverrides: Partial<ReadQueueItemsResponseWire> = {},\n): ReadQueueItemsResponseWire {\n\treturn {\n\t\tid: \"1a354bd5b8fe457f8e51232f8dbfe6d0\",\n\t\tqueueItems: [validQueueItemBody()],\n\t\t...overrides,\n\t};\n}\n","import type { PlaceWire } from \"#src/domains/cloud-v2/places/wire\";\nimport { RBXL_SIGNATURE, RBXLX_SIGNATURE } from \"#src/domains/universes/places/signatures\";\nimport type { PlaceVersionWire } from \"#src/domains/universes/places/wire\";\n\n/**\n * Returns a fresh, minimal `.rbxl`-formatted body whose magic bytes\n * match {@link RBXL_SIGNATURE}. Useful when integration tests don't\n * care about the file's contents past the signature.\n *\n * @returns A 14-byte rbxl body matching the binary signature.\n */\nexport function rbxlBody(): Uint8Array<ArrayBuffer> {\n\treturn new Uint8Array(RBXL_SIGNATURE);\n}\n\n/**\n * Returns a fresh, minimal `.rbxlx`-formatted body whose magic bytes\n * match {@link RBXLX_SIGNATURE}. Useful when integration tests don't\n * care about the file's contents past the signature.\n *\n * @returns An 8-byte rbxlx body matching the XML signature.\n */\nexport function rbxlxBody(): Uint8Array<ArrayBuffer> {\n\treturn new Uint8Array(RBXLX_SIGNATURE);\n}\n\n/**\n * Builds a minimally-valid {@link PlaceVersionWire} body. Pass an\n * `overrides` object to tweak fields without re-stating the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validPublishResponseBody(\n\toverrides: Partial<PlaceVersionWire> = {},\n): PlaceVersionWire {\n\treturn {\n\t\tversionNumber: 1,\n\t\t...overrides,\n\t};\n}\n\n/**\n * Builds a minimally-valid {@link PlaceWire} body. Pass an `overrides`\n * object to tweak fields without re-stating the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validPlaceBody(overrides: Partial<PlaceWire> = {}): PlaceWire {\n\treturn {\n\t\tcreateTime: \"2024-01-15T10:30:00.000Z\",\n\t\tdescription: \"A sample place.\",\n\t\tdisplayName: \"Test Place\",\n\t\tpath: \"universes/123/places/456\",\n\t\troot: true,\n\t\tserverSize: 30,\n\t\tuniverseRuntimeCreation: false,\n\t\tupdateTime: \"2024-11-02T17:08:21.500Z\",\n\t\t...overrides,\n\t};\n}\n","import type { UniverseWire } from \"#src/domains/cloud-v2/universes/wire\";\n\n/**\n * Builds a minimally-valid {@link UniverseWire} body. Pass an\n * `overrides` object to tweak fields without re-stating the defaults.\n *\n * @param overrides - Fields to override on the default body.\n * @returns A valid wire body with the overrides applied.\n */\nexport function validUniverseBody(overrides: Partial<UniverseWire> = {}): UniverseWire {\n\treturn {\n\t\tageRating: \"AGE_RATING_13_PLUS\",\n\t\tconsoleEnabled: false,\n\t\tcreateTime: \"2024-01-15T10:30:00.000Z\",\n\t\tdescription: \"A sample universe for tests.\",\n\t\tdesktopEnabled: true,\n\t\tdisplayName: \"Test Universe\",\n\t\tmobileEnabled: true,\n\t\tpath: \"universes/12345\",\n\t\trootPlace: \"universes/12345/places/98765\",\n\t\ttabletEnabled: true,\n\t\tupdateTime: \"2024-11-02T17:08:21.500Z\",\n\t\tuser: \"users/7777\",\n\t\tvisibility: \"PUBLIC\",\n\t\tvoiceChatEnabled: false,\n\t\tvrEnabled: false,\n\t\t...overrides,\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"to-blob-
|
|
1
|
+
{"version":3,"file":"to-blob-RPqMBuft.mjs","names":[],"sources":["../src/internal/utils/to-blob.ts"],"sourcesContent":["/**\n * Wraps a binary value as a {@link Blob}, copying `Uint8Array` input into a\n * fresh `Blob` so the originating buffer cannot be mutated between request\n * build and send. `Blob` input is returned as-is so MIME-type metadata is\n * preserved.\n *\n * @param value - Binary data to convert.\n * @returns The supplied `Blob`, or a new `Blob` wrapping a defensive copy.\n */\nexport function toBlob(value: Blob | Uint8Array): Blob {\n\tif (value instanceof Blob) {\n\t\treturn value;\n\t}\n\n\treturn new Blob([new Uint8Array(value)]);\n}\n"],"mappings":";;;;;;;;;;AASA,SAAgB,OAAO,OAAgC;CACtD,IAAI,iBAAiB,MACpB,OAAO;CAGR,OAAO,IAAI,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,CAAC;AACxC"}
|