@bedrock-rbx/ocale 0.1.0-beta.2 → 0.1.0-beta.20

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 (81) hide show
  1. package/README.md +129 -0
  2. package/dist/badges.d.mts +33 -2
  3. package/dist/badges.d.mts.map +1 -1
  4. package/dist/badges.mjs +12 -4
  5. package/dist/badges.mjs.map +1 -1
  6. package/dist/{data.generated-BtkDGH8C.d.mts → data.generated-B2ceLfSn.d.mts} +9 -1
  7. package/dist/data.generated-B2ceLfSn.d.mts.map +1 -0
  8. package/dist/developer-products.d.mts +38 -2
  9. package/dist/developer-products.d.mts.map +1 -1
  10. package/dist/developer-products.mjs +22 -5
  11. package/dist/developer-products.mjs.map +1 -1
  12. package/dist/game-passes.d.mts +40 -2
  13. package/dist/game-passes.d.mts.map +1 -1
  14. package/dist/game-passes.mjs +22 -5
  15. package/dist/game-passes.mjs.map +1 -1
  16. package/dist/index.d.mts +110 -12
  17. package/dist/index.d.mts.map +1 -1
  18. package/dist/index.mjs +5 -3
  19. package/dist/locales.d.mts +1 -1
  20. package/dist/locales.mjs +2 -0
  21. package/dist/locales.mjs.map +1 -1
  22. package/dist/luau-execution.d.mts +112 -6
  23. package/dist/luau-execution.d.mts.map +1 -1
  24. package/dist/luau-execution.mjs +129 -4
  25. package/dist/luau-execution.mjs.map +1 -1
  26. package/dist/places.d.mts +64 -6
  27. package/dist/places.d.mts.map +1 -1
  28. package/dist/places.mjs +33 -61
  29. package/dist/places.mjs.map +1 -1
  30. package/dist/poll-timeout-C0nmJzOd.mjs +83 -0
  31. package/dist/poll-timeout-C0nmJzOd.mjs.map +1 -0
  32. package/dist/polling-helpers-Cb4j4cq7.mjs +787 -0
  33. package/dist/polling-helpers-Cb4j4cq7.mjs.map +1 -0
  34. package/dist/polling-rj0dGREg.d.mts +312 -0
  35. package/dist/polling-rj0dGREg.d.mts.map +1 -0
  36. package/dist/{price-information-s7DY0GV2.mjs → price-information-Bu87sPyh.mjs} +2 -2
  37. package/dist/{price-information-s7DY0GV2.mjs.map → price-information-Bu87sPyh.mjs.map} +1 -1
  38. package/dist/{rate-limit-CKfuhxT1.mjs → rate-limit-Co9i28qi.mjs} +24 -38
  39. package/dist/rate-limit-Co9i28qi.mjs.map +1 -0
  40. package/dist/{resource-client-Wi4Mwqy5.mjs → resource-client-lE7Tg3BK.mjs} +349 -241
  41. package/dist/resource-client-lE7Tg3BK.mjs.map +1 -0
  42. package/dist/retry-CbHBw60o.mjs +380 -0
  43. package/dist/retry-CbHBw60o.mjs.map +1 -0
  44. package/dist/retry-r1TXe5Zd.d.mts +189 -0
  45. package/dist/retry-r1TXe5Zd.d.mts.map +1 -0
  46. package/dist/signatures-JF-7Psce.mjs +59 -0
  47. package/dist/signatures-JF-7Psce.mjs.map +1 -0
  48. package/dist/storage.d.mts +322 -31
  49. package/dist/storage.d.mts.map +1 -1
  50. package/dist/storage.mjs +506 -18
  51. package/dist/storage.mjs.map +1 -1
  52. package/dist/testing.d.mts +727 -0
  53. package/dist/testing.d.mts.map +1 -0
  54. package/dist/testing.mjs +457 -0
  55. package/dist/testing.mjs.map +1 -0
  56. package/dist/{to-blob-1BtHsDGK.mjs → to-blob-RPqMBuft.mjs} +1 -1
  57. package/dist/{to-blob-1BtHsDGK.mjs.map → to-blob-RPqMBuft.mjs.map} +1 -1
  58. package/dist/{types-Cp8w8uwA.d.mts → types-CRiJg5EQ.d.mts} +46 -4
  59. package/dist/types-CRiJg5EQ.d.mts.map +1 -0
  60. package/dist/universes.d.mts +47 -10
  61. package/dist/universes.d.mts.map +1 -1
  62. package/dist/universes.mjs +7 -5
  63. package/dist/universes.mjs.map +1 -1
  64. package/dist/{validation-b7KAoEio.mjs → validation-9oU6qNNQ.mjs} +4 -2
  65. package/dist/validation-9oU6qNNQ.mjs.map +1 -0
  66. package/dist/wire-D3K-a-UP.d.mts +37 -0
  67. package/dist/wire-D3K-a-UP.d.mts.map +1 -0
  68. package/package.json +9 -7
  69. package/dist/data.generated-BtkDGH8C.d.mts.map +0 -1
  70. package/dist/is-date-time-string-Cuf1TaSC.mjs +0 -19
  71. package/dist/is-date-time-string-Cuf1TaSC.mjs.map +0 -1
  72. package/dist/rate-limit-CKfuhxT1.mjs.map +0 -1
  73. package/dist/rate-limit-DzHBFwps.d.mts +0 -92
  74. package/dist/rate-limit-DzHBFwps.d.mts.map +0 -1
  75. package/dist/resource-client-Wi4Mwqy5.mjs.map +0 -1
  76. package/dist/specs-Co6qYp_E.mjs +0 -309
  77. package/dist/specs-Co6qYp_E.mjs.map +0 -1
  78. package/dist/types-BZ0959rh.d.mts +0 -149
  79. package/dist/types-BZ0959rh.d.mts.map +0 -1
  80. package/dist/types-Cp8w8uwA.d.mts.map +0 -1
  81. 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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"}
@@ -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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"}
@@ -15,4 +15,4 @@ function toBlob(value) {
15
15
  //#endregion
16
16
  export { toBlob as t };
17
17
 
18
- //# sourceMappingURL=to-blob-1BtHsDGK.mjs.map
18
+ //# sourceMappingURL=to-blob-RPqMBuft.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-blob-1BtHsDGK.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;AACtD,KAAI,iBAAiB,KACpB,QAAO;AAGR,QAAO,IAAI,KAAK,CAAC,IAAI,WAAW,MAAM,CAAC,CAAC"}
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"}