@bedrock-rbx/ocale 0.1.0-beta.8 → 0.1.0

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 +182 -0
  2. package/dist/badges.d.mts +33 -2
  3. package/dist/badges.d.mts.map +1 -1
  4. package/dist/badges.mjs +16 -4
  5. package/dist/badges.mjs.map +1 -1
  6. package/dist/{data.generated-Cb6g6asv.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 +32 -8
  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 +30 -6
  15. package/dist/game-passes.mjs.map +1 -1
  16. package/dist/index.d.mts +21 -12
  17. package/dist/index.d.mts.map +1 -1
  18. package/dist/index.mjs +5 -5
  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 +22 -3
  23. package/dist/luau-execution.d.mts.map +1 -1
  24. package/dist/luau-execution.mjs +29 -13
  25. package/dist/luau-execution.mjs.map +1 -1
  26. package/dist/places.d.mts +20 -2
  27. package/dist/places.d.mts.map +1 -1
  28. package/dist/places.mjs +34 -14
  29. package/dist/places.mjs.map +1 -1
  30. package/dist/{poll-timeout-Dg_QFEqi.mjs → poll-timeout-C0nmJzOd.mjs} +6 -2
  31. package/dist/poll-timeout-C0nmJzOd.mjs.map +1 -0
  32. package/dist/{polling-helpers-CS00apdU.mjs → polling-helpers-BcycDhDm.mjs} +225 -78
  33. package/dist/polling-helpers-BcycDhDm.mjs.map +1 -0
  34. package/dist/{polling-BMrYajok.d.mts → polling-rj0dGREg.d.mts} +73 -14
  35. package/dist/polling-rj0dGREg.d.mts.map +1 -0
  36. package/dist/{price-information-DIrvwCmd.mjs → price-information-DK83Wul1.mjs} +2 -2
  37. package/dist/{price-information-DIrvwCmd.mjs.map → price-information-DK83Wul1.mjs.map} +1 -1
  38. package/dist/{rate-limit-D1q2Js-z.mjs → rate-limit-Co9i28qi.mjs} +30 -2
  39. package/dist/rate-limit-Co9i28qi.mjs.map +1 -0
  40. package/dist/{resource-client-D6Efj9fU.mjs → resource-client-C_D--PYX.mjs} +328 -243
  41. package/dist/resource-client-C_D--PYX.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-B5Fojgn0.mjs → signatures-JF-7Psce.mjs} +1 -1
  47. package/dist/{signatures-B5Fojgn0.mjs.map → signatures-JF-7Psce.mjs.map} +1 -1
  48. package/dist/storage.d.mts +316 -31
  49. package/dist/storage.d.mts.map +1 -1
  50. package/dist/storage.mjs +525 -24
  51. package/dist/storage.mjs.map +1 -1
  52. package/dist/testing.d.mts +24 -9
  53. package/dist/testing.d.mts.map +1 -1
  54. package/dist/testing.mjs +2 -2
  55. package/dist/testing.mjs.map +1 -1
  56. package/dist/{to-blob-B27VhoRp.mjs → to-blob-RPqMBuft.mjs} +1 -1
  57. package/dist/{to-blob-B27VhoRp.mjs.map → to-blob-RPqMBuft.mjs.map} +1 -1
  58. package/dist/{types-CwtZT1ek.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 -5
  61. package/dist/universes.d.mts.map +1 -1
  62. package/dist/universes.mjs +31 -15
  63. package/dist/universes.mjs.map +1 -1
  64. package/dist/{validation-DkL5KQqz.mjs → validation-9oU6qNNQ.mjs} +4 -2
  65. package/dist/validation-9oU6qNNQ.mjs.map +1 -0
  66. package/dist/{wire-CeL6W_V7.d.mts → wire-D3K-a-UP.d.mts} +3 -1
  67. package/dist/wire-D3K-a-UP.d.mts.map +1 -0
  68. package/package.json +7 -6
  69. package/dist/data.generated-Cb6g6asv.d.mts.map +0 -1
  70. package/dist/permission-error-DOVtNq3A.mjs +0 -46
  71. package/dist/permission-error-DOVtNq3A.mjs.map +0 -1
  72. package/dist/poll-timeout-Dg_QFEqi.mjs.map +0 -1
  73. package/dist/polling-BMrYajok.d.mts.map +0 -1
  74. package/dist/polling-helpers-CS00apdU.mjs.map +0 -1
  75. package/dist/rate-limit-BYuizHoD.d.mts +0 -92
  76. package/dist/rate-limit-BYuizHoD.d.mts.map +0 -1
  77. package/dist/rate-limit-D1q2Js-z.mjs.map +0 -1
  78. package/dist/resource-client-D6Efj9fU.mjs.map +0 -1
  79. package/dist/types-CwtZT1ek.d.mts.map +0 -1
  80. package/dist/validation-DkL5KQqz.mjs.map +0 -1
  81. package/dist/wire-CeL6W_V7.d.mts.map +0 -1
@@ -1,10 +1,12 @@
1
- import { d as OpenCloudError, i as OpenCloudClientOptions, l as Result, s as RequestOptions } from "./types-CwtZT1ek.mjs";
2
- import { i as RobloxLocale, r as RobloxLanguageCode } from "./data.generated-Cb6g6asv.mjs";
3
- import { n as GameIconState } from "./wire-CeL6W_V7.mjs";
1
+ import { d as OpenCloudError, i as OpenCloudClientOptions, l as Result, s as RequestOptions } from "./types-CRiJg5EQ.mjs";
2
+ import { i as RobloxLocale, r as RobloxLanguageCode } from "./data.generated-B2ceLfSn.mjs";
3
+ import { n as GameIconState } from "./wire-D3K-a-UP.mjs";
4
4
 
5
5
  //#region src/domains/cloud-v2/universes/types.d.ts
6
6
  /**
7
7
  * Caller-supplied input for the `get` method on `UniversesClient`.
8
+ *
9
+ * @since 0.1.0
8
10
  */
9
11
  interface GetUniverseParameters {
10
12
  /** Stringified ID of the universe to fetch. */
@@ -12,6 +14,8 @@ interface GetUniverseParameters {
12
14
  }
13
15
  /**
14
16
  * A social link that may be associated with a universe.
17
+ *
18
+ * @since 0.1.0
15
19
  */
16
20
  interface SocialLink {
17
21
  /** Display title of the link. */
@@ -19,7 +23,11 @@ interface SocialLink {
19
23
  /** Destination URI. */
20
24
  readonly uri: string;
21
25
  }
22
- /** Public visibility classification. */
26
+ /**
27
+ * Public visibility classification.
28
+ *
29
+ * @since 0.1.0
30
+ */
23
31
  type UniverseVisibility = "private" | "public" | "unspecified";
24
32
  /**
25
33
  * Caller-supplied input for the `update` method on `UniversesClient`.
@@ -29,6 +37,8 @@ type UniverseVisibility = "private" | "public" | "unspecified";
29
37
  * Setting a key to `undefined` clears the corresponding server-side
30
38
  * value (applicable to `privateServerPriceRobux` and each optional
31
39
  * social link).
40
+ *
41
+ * @since 0.1.0
32
42
  */
33
43
  interface UpdateUniverseParameters {
34
44
  /** Whether console players can join. */
@@ -64,6 +74,8 @@ interface UpdateUniverseParameters {
64
74
  }
65
75
  /**
66
76
  * Discriminated-union representation of a universe's owner.
77
+ *
78
+ * @since 0.1.0
67
79
  */
68
80
  interface UniverseOwner {
69
81
  /**
@@ -74,10 +86,16 @@ interface UniverseOwner {
74
86
  /** Whether the owner is a user or a group. */
75
87
  readonly kind: "group" | "user";
76
88
  }
77
- /** Public age-rating classification. */
89
+ /**
90
+ * Public age-rating classification.
91
+ *
92
+ * @since 0.1.0
93
+ */
78
94
  type UniverseAgeRating = "9Plus" | "13Plus" | "17Plus" | "all" | "unspecified";
79
95
  /**
80
96
  * Parsed representation of a Roblox universe's configuration.
97
+ *
98
+ * @since 0.1.0
81
99
  */
82
100
  interface Universe {
83
101
  /** Stringified universe ID, extracted from the wire `path`. */
@@ -131,6 +149,8 @@ interface Universe {
131
149
  //#region src/domains/game-internationalization/game-icon/types.d.ts
132
150
  /**
133
151
  * A localized icon entry returned by listing icons for an experience.
152
+ *
153
+ * @since 0.1.0
134
154
  */
135
155
  interface ExperienceIcon {
136
156
  /** Stringified ID of the uploaded icon image. */
@@ -150,6 +170,8 @@ interface ExperienceIcon {
150
170
  * Parameters for uploading or replacing a localized experience icon. A
151
171
  * subsequent upload for the same `(universeId, languageCode)` pair replaces
152
172
  * the existing icon for that locale.
173
+ *
174
+ * @since 0.1.0
153
175
  */
154
176
  interface UploadExperienceIconParameters {
155
177
  /** Image bytes to upload. PNG and JPEG are accepted by the server. */
@@ -166,6 +188,8 @@ interface UploadExperienceIconParameters {
166
188
  /**
167
189
  * Parameters for deleting the localized icon registered against a universe
168
190
  * for a given language.
191
+ *
192
+ * @since 0.1.0
169
193
  */
170
194
  interface DeleteExperienceIconParameters {
171
195
  /**
@@ -179,6 +203,8 @@ interface DeleteExperienceIconParameters {
179
203
  }
180
204
  /**
181
205
  * Parameters for listing every localized icon registered against a universe.
206
+ *
207
+ * @since 0.1.0
182
208
  */
183
209
  interface ListExperienceIconsParameters {
184
210
  /** Stringified ID of the universe whose icons are being listed. */
@@ -188,6 +214,8 @@ interface ListExperienceIconsParameters {
188
214
  //#region src/domains/game-internationalization/game-thumbnails/types.d.ts
189
215
  /**
190
216
  * Result of uploading a localized experience thumbnail.
217
+ *
218
+ * @since 0.1.0
191
219
  */
192
220
  interface UploadedExperienceThumbnail {
193
221
  /** Stringified media asset ID of the uploaded thumbnail. */
@@ -197,6 +225,8 @@ interface UploadedExperienceThumbnail {
197
225
  * Parameters for uploading a new localized experience thumbnail. Each upload
198
226
  * appends a new entry to the carousel; reorder via {@link ReorderExperienceThumbnailsParameters}
199
227
  * after multiple uploads to set the display order.
228
+ *
229
+ * @since 0.1.0
200
230
  */
201
231
  interface UploadExperienceThumbnailParameters {
202
232
  /** Image bytes to upload. PNG and JPEG are accepted by the server. */
@@ -212,6 +242,8 @@ interface UploadExperienceThumbnailParameters {
212
242
  }
213
243
  /**
214
244
  * Parameters for deleting a single thumbnail by media asset ID.
245
+ *
246
+ * @since 0.1.0
215
247
  */
216
248
  interface DeleteExperienceThumbnailParameters {
217
249
  /** Stringified media asset ID of the thumbnail to delete. */
@@ -228,6 +260,8 @@ interface DeleteExperienceThumbnailParameters {
228
260
  /**
229
261
  * Parameters for reordering the localized thumbnail carousel. The supplied
230
262
  * `orderedImageIds` describes the new display order from first to last.
263
+ *
264
+ * @since 0.1.0
231
265
  */
232
266
  interface ReorderExperienceThumbnailsParameters {
233
267
  /**
@@ -273,6 +307,9 @@ interface UniverseIconHandle {
273
307
  * subsequent upload for the same `(universeId, languageCode)` pair
274
308
  * replaces the existing icon for that locale.
275
309
  *
310
+ * No default request timeout applies to this upload; pass `options.timeout`
311
+ * to set a per-call deadline.
312
+ *
276
313
  * @param parameters - Universe and language identifiers plus the image
277
314
  * bytes to upload.
278
315
  * @param options - Optional per-request overrides (e.g. A different
@@ -312,6 +349,9 @@ interface UniverseThumbnailsHandle {
312
349
  * {@link UniverseThumbnailsHandle.reorder} after multiple uploads to
313
350
  * set the display order.
314
351
  *
352
+ * No default request timeout applies to this upload; pass `options.timeout`
353
+ * to set a per-call deadline.
354
+ *
315
355
  * @param parameters - Universe and language identifiers plus the image
316
356
  * bytes to upload.
317
357
  * @param options - Optional per-request overrides (e.g. A different
@@ -341,6 +381,8 @@ interface UniverseThumbnailsHandle {
341
381
  * {@link UniversesClient.thumbnails} Operation Groups so callers reach
342
382
  * for one client per universe.
343
383
  *
384
+ * @since 0.1.0
385
+ *
344
386
  * @example
345
387
  *
346
388
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"universes.d.mts","names":[],"sources":["../src/domains/cloud-v2/universes/types.ts","../src/domains/game-internationalization/game-icon/types.ts","../src/domains/game-internationalization/game-thumbnails/types.ts","../src/resources/universes/client.ts"],"mappings":"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"}
1
+ {"version":3,"file":"universes.d.mts","names":[],"sources":["../src/domains/cloud-v2/universes/types.ts","../src/domains/game-internationalization/game-icon/types.ts","../src/domains/game-internationalization/game-thumbnails/types.ts","../src/resources/universes/client.ts"],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { r as ApiError } from "./rate-limit-D1q2Js-z.mjs";
2
- import { t as ValidationError } from "./validation-DkL5KQqz.mjs";
3
- import { t as toBlob } from "./to-blob-B27VhoRp.mjs";
4
- import { a as IDEMPOTENT_METHOD_DEFAULTS, c as isDateTimeString, i as CREATE_METHOD_DEFAULTS, n as okRequest, r as parseEmptyResponse, s as isRecord, t as ResourceClient } from "./resource-client-D6Efj9fU.mjs";
1
+ import { r as ApiError } from "./rate-limit-Co9i28qi.mjs";
2
+ import { n as IDEMPOTENT_METHOD_DEFAULTS, t as CREATE_METHOD_DEFAULTS } from "./retry-CbHBw60o.mjs";
3
+ import { t as ValidationError } from "./validation-9oU6qNNQ.mjs";
4
+ import { t as toBlob } from "./to-blob-RPqMBuft.mjs";
5
+ import { a as isDateTimeString, i as isRecord, n as okRequest, r as parseEmptyResponse, t as ResourceClient } from "./resource-client-C_D--PYX.mjs";
5
6
  //#region src/domains/cloud-v2/universes/builders.ts
6
7
  /**
7
8
  * Dodges `unicorn/no-null` while still emitting a literal `null` onto
@@ -106,6 +107,9 @@ const AGE_RATING_MAP = {
106
107
  AGE_RATING_UNSPECIFIED: "unspecified"
107
108
  };
108
109
  const MALFORMED_MESSAGE = "Malformed universe response";
110
+ const UNIVERSE_PATH_PATTERN = /^universes\/(\d+)$/;
111
+ const ROOT_PLACE_PATH_PATTERN = /\/places\/(\d+)$/;
112
+ const OWNER_PATH_PATTERN = /^(?:users|groups)\/(\d+)$/;
109
113
  /**
110
114
  * Parses a successful Open Cloud `Universe` response body into the
111
115
  * public {@link Universe} shape.
@@ -116,11 +120,11 @@ const MALFORMED_MESSAGE = "Malformed universe response";
116
120
  */
117
121
  function parseUniverseResponse(response) {
118
122
  const { body, status: statusCode } = response;
119
- if (!isUniverseWire(body)) return malformed(statusCode);
123
+ if (!isUniverseWire(body)) return malformed(statusCode, body);
120
124
  const ownerResult = resolveOwner(body);
121
- if (!ownerResult.success) return malformed(statusCode);
122
- const id = /^universes\/(\d+)$/.exec(body.path)?.[1];
123
- if (id === void 0) return malformed(statusCode);
125
+ if (!ownerResult.success) return malformed(statusCode, body);
126
+ const id = UNIVERSE_PATH_PATTERN.exec(body.path)?.[1];
127
+ if (id === void 0) return malformed(statusCode, body);
124
128
  return {
125
129
  data: toUniverse({
126
130
  id,
@@ -130,15 +134,18 @@ function parseUniverseResponse(response) {
130
134
  success: true
131
135
  };
132
136
  }
133
- function malformed(statusCode) {
137
+ function malformed(statusCode, body) {
134
138
  return {
135
- err: new ApiError(MALFORMED_MESSAGE, { statusCode }),
139
+ err: new ApiError(MALFORMED_MESSAGE, {
140
+ details: body,
141
+ statusCode
142
+ }),
136
143
  success: false
137
144
  };
138
145
  }
139
146
  function extractRootPlaceId(rootPlace) {
140
147
  if (rootPlace === void 0) return;
141
- return /\/places\/(\d+)$/.exec(rootPlace)?.[1];
148
+ return ROOT_PLACE_PATH_PATTERN.exec(rootPlace)?.[1];
142
149
  }
143
150
  function toSocialLink(wire) {
144
151
  if (wire === void 0) return;
@@ -206,7 +213,7 @@ function isUniverseWire(body) {
206
213
  return hasValidRequiredFields(body) && hasValidOptionalFields(body);
207
214
  }
208
215
  function extractOwnerId(resourcePath) {
209
- return /^(?:users|groups)\/(\d+)$/.exec(resourcePath)?.[1];
216
+ return OWNER_PATH_PATTERN.exec(resourcePath)?.[1];
210
217
  }
211
218
  function resolveOwner(body) {
212
219
  if (typeof body.user === "string") {
@@ -315,7 +322,10 @@ const ICON_REQUIRED_SCOPES = Object.freeze(["legacy-universe:manage"]);
315
322
  function parseIconListResponse(response) {
316
323
  const { body, status: statusCode } = response;
317
324
  if (!isGameIconListWire(body)) return {
318
- err: new ApiError("Malformed icon list response", { statusCode }),
325
+ err: new ApiError("Malformed icon list response", {
326
+ details: body,
327
+ statusCode
328
+ }),
319
329
  success: false
320
330
  };
321
331
  return {
@@ -346,6 +356,7 @@ function toExperienceIcon(wire) {
346
356
  }
347
357
  //#endregion
348
358
  //#region src/domains/game-internationalization/game-thumbnails/builders.ts
359
+ const POSITIVE_INTEGER_PATTERN = /^[1-9]\d*$/;
349
360
  /**
350
361
  * Builds a `POST` request for the localized "upload experience thumbnail"
351
362
  * endpoint. Each successful upload appends a new entry to the carousel.
@@ -400,7 +411,7 @@ function buildReorderThumbnailsRequest(parameters) {
400
411
  };
401
412
  }
402
413
  function parseImageId(value) {
403
- if (!/^[1-9]\d*$/.test(value)) return;
414
+ if (!POSITIVE_INTEGER_PATTERN.test(value)) return;
404
415
  const parsed = Number(value);
405
416
  if (!Number.isSafeInteger(parsed)) return;
406
417
  return parsed;
@@ -461,7 +472,10 @@ const THUMBNAILS_REQUIRED_SCOPES = Object.freeze(["legacy-universe:manage"]);
461
472
  function parseThumbnailUploadResponse(response) {
462
473
  const { body, status: statusCode } = response;
463
474
  if (!isGameThumbnailUploadWire(body)) return {
464
- err: new ApiError("Malformed thumbnail upload response", { statusCode }),
475
+ err: new ApiError("Malformed thumbnail upload response", {
476
+ details: body,
477
+ statusCode
478
+ }),
465
479
  success: false
466
480
  };
467
481
  return {
@@ -572,6 +586,8 @@ const THUMBNAIL_REORDER_SPEC = Object.freeze({
572
586
  * {@link UniversesClient.thumbnails} Operation Groups so callers reach
573
587
  * for one client per universe.
574
588
  *
589
+ * @since 0.1.0
590
+ *
575
591
  * @example
576
592
  *
577
593
  * ```ts
@@ -1 +1 @@
1
- {"version":3,"file":"universes.mjs","names":["#inner"],"sources":["../src/domains/cloud-v2/universes/builders.ts","../src/domains/cloud-v2/universes/operations.ts","../src/domains/cloud-v2/universes/parsers.ts","../src/domains/game-internationalization/game-icon/builders.ts","../src/domains/game-internationalization/game-icon/operations.ts","../src/domains/game-internationalization/game-icon/parsers.ts","../src/domains/game-internationalization/game-thumbnails/builders.ts","../src/domains/game-internationalization/game-thumbnails/operations.ts","../src/domains/game-internationalization/game-thumbnails/parsers.ts","../src/resources/universes/client.ts"],"sourcesContent":["import type { HttpRequest } from \"../../../client/types.ts\";\nimport type { OpenCloudError } from \"../../../errors/base.ts\";\nimport { ValidationError } from \"../../../errors/validation.ts\";\nimport { okRequest } from \"../../../internal/resource-client.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type { GetUniverseParameters, UpdateUniverseParameters } from \"./types.ts\";\n\n/**\n * Dodges `unicorn/no-null` while still emitting a literal `null` onto\n * the wire, which the Open Cloud `Cloud_UpdateUniverse` endpoint\n * requires to clear a nullable field (for example disabling private\n * servers or removing a social link).\n */\nconst NULL_SENTINEL = JSON.parse(\"null\");\n\n/**\n * Builds a `GET` request for the Open Cloud \"get universe\" endpoint.\n *\n * @param parameters - The universe identifier.\n * @returns A success result wrapping the request; the builder cannot fail.\n */\nexport function buildGetRequest(\n\tparameters: GetUniverseParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest({\n\t\tmethod: \"GET\",\n\t\turl: `/cloud/v2/universes/${parameters.universeId}`,\n\t});\n}\n\n/**\n * Builds a `PATCH` request for the Open Cloud \"update universe\"\n * endpoint. Derives the `updateMask` query string from the keys\n * present on `parameters` and emits a JSON body containing those same\n * fields, translating `undefined` values to JSON `null` so Roblox\n * clears the corresponding server-side value.\n *\n * @param parameters - The universe identifier plus the fields to update.\n * @returns A success result wrapping the request, or a\n * {@link ValidationError} when no updatable fields were supplied.\n */\nexport function buildUpdateRequest(\n\tparameters: UpdateUniverseParameters,\n): Result<HttpRequest, ValidationError> {\n\tconst fieldKeys = extractUpdateFieldKeys(parameters);\n\n\tif (fieldKeys.length === 0) {\n\t\treturn {\n\t\t\terr: new ValidationError(\"Update must include at least one field\", {\n\t\t\t\tcode: \"empty_update\",\n\t\t\t}),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\tconst body: Record<string, unknown> = {};\n\tfor (const key of fieldKeys) {\n\t\tbody[key] = bodyValueFor(parameters, key);\n\t}\n\n\tconst updateMask = fieldKeys.join(\",\");\n\treturn {\n\t\tdata: {\n\t\t\tbody,\n\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\tmethod: \"PATCH\",\n\t\t\turl: `/cloud/v2/universes/${parameters.universeId}?updateMask=${updateMask}`,\n\t\t},\n\t\tsuccess: true,\n\t};\n}\n\nfunction extractUpdateFieldKeys(parameters: UpdateUniverseParameters): ReadonlyArray<string> {\n\treturn Object.keys(parameters).filter((key) => key !== \"universeId\");\n}\n\nfunction bodyValueFor(parameters: UpdateUniverseParameters, key: string): unknown {\n\tconst value = Reflect.get(parameters, key);\n\treturn value === undefined ? NULL_SENTINEL : value;\n}\n","import type { OperationLimit } from \"../../../internal/http/rate-limit-queue.ts\";\n\nconst PER_MINUTE = 100;\nconst SECONDS_PER_MINUTE = 60;\n\n/**\n * Per-second request ceiling for reading a universe, from the Open\n * Cloud OpenAPI schema (100 requests per minute per API key owner).\n */\nexport const GET_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: PER_MINUTE / SECONDS_PER_MINUTE,\n\toperationKey: \"universes.get\",\n});\n\n/**\n * Per-second request ceiling for updating a universe, from the Open\n * Cloud OpenAPI schema (100 requests per minute per API key owner).\n * Keyed independently from {@link GET_OPERATION_LIMIT} so reads and\n * updates do not share a queue; upstream quota accounting is not\n * documented as shared and the conservative default is fewer\n * cross-method contention surprises.\n */\nexport const UPDATE_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: PER_MINUTE / SECONDS_PER_MINUTE,\n\toperationKey: \"universes.update\",\n});\n\n/**\n * Scopes required to update a universe, sourced from `x-roblox-scopes`\n * on the `Cloud_UpdateUniverse` operation in the vendored OpenAPI schema.\n * `Cloud_GetUniverse` declares no scope, so the GET method intentionally\n * does not declare `requiredScopes` and a 401/403 there surfaces as a\n * generic ApiError.\n */\nexport const UPDATE_REQUIRED_SCOPES: ReadonlyArray<string> = Object.freeze([\"universe:write\"]);\n","import type { HttpResponse } from \"../../../client/types.ts\";\nimport { ApiError } from \"../../../errors/api-error.ts\";\nimport { isDateTimeString } from \"../../../internal/utils/is-date-time-string.ts\";\nimport { isRecord } from \"../../../internal/utils/is-record.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type {\n\tSocialLink,\n\tUniverse,\n\tUniverseAgeRating,\n\tUniverseOwner,\n\tUniverseVisibility,\n} from \"./types.ts\";\nimport type { AgeRatingWire, SocialLinkWire, UniverseWire, VisibilityWire } from \"./wire.ts\";\n\nconst VISIBILITY_MAP: Readonly<Record<VisibilityWire, UniverseVisibility>> = {\n\tPRIVATE: \"private\",\n\tPUBLIC: \"public\",\n\tVISIBILITY_UNSPECIFIED: \"unspecified\",\n};\n\nconst AGE_RATING_MAP: Readonly<Record<AgeRatingWire, UniverseAgeRating>> = {\n\tAGE_RATING_9_PLUS: \"9Plus\",\n\tAGE_RATING_13_PLUS: \"13Plus\",\n\tAGE_RATING_17_PLUS: \"17Plus\",\n\tAGE_RATING_ALL: \"all\",\n\tAGE_RATING_UNSPECIFIED: \"unspecified\",\n};\n\nconst MALFORMED_MESSAGE = \"Malformed universe response\";\n\ninterface ToUniverseArgs {\n\treadonly id: string;\n\treadonly body: UniverseWire;\n\treadonly owner: UniverseOwner;\n}\n\n/**\n * Parses a successful Open Cloud `Universe` response body into the\n * public {@link Universe} shape.\n *\n * @param response - The full {@link HttpResponse} from the Open Cloud API.\n * @returns A success result wrapping the parsed {@link Universe}, or\n * an {@link ApiError} when the body does not match the wire schema.\n */\nexport function parseUniverseResponse(response: HttpResponse): Result<Universe, ApiError> {\n\tconst { body, status: statusCode } = response;\n\n\tif (!isUniverseWire(body)) {\n\t\treturn malformed(statusCode);\n\t}\n\n\tconst ownerResult = resolveOwner(body);\n\tif (!ownerResult.success) {\n\t\treturn malformed(statusCode);\n\t}\n\n\tconst idMatch = /^universes\\/(\\d+)$/.exec(body.path);\n\tconst id = idMatch?.[1];\n\tif (id === undefined) {\n\t\treturn malformed(statusCode);\n\t}\n\n\treturn { data: toUniverse({ id, body, owner: ownerResult.data }), success: true };\n}\n\nfunction malformed(statusCode: number): Result<Universe, ApiError> {\n\treturn {\n\t\terr: new ApiError(MALFORMED_MESSAGE, { statusCode }),\n\t\tsuccess: false,\n\t};\n}\n\nfunction extractRootPlaceId(rootPlace: string | undefined): string | undefined {\n\tif (rootPlace === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst match = /\\/places\\/(\\d+)$/.exec(rootPlace);\n\treturn match?.[1];\n}\n\nfunction toSocialLink(wire: SocialLinkWire | undefined): SocialLink | undefined {\n\tif (wire === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn { title: wire.title, uri: wire.uri };\n}\n\nfunction toUniverse(args: ToUniverseArgs): Universe {\n\tconst { id, body, owner } = args;\n\treturn {\n\t\tid,\n\t\tageRating: AGE_RATING_MAP[body.ageRating],\n\t\tconsoleEnabled: body.consoleEnabled ?? false,\n\t\tcreatedAt: new Date(body.createTime),\n\t\tdescription: body.description,\n\t\tdesktopEnabled: body.desktopEnabled ?? false,\n\t\tdiscordSocialLink: toSocialLink(body.discordSocialLink),\n\t\tdisplayName: body.displayName,\n\t\tfacebookSocialLink: toSocialLink(body.facebookSocialLink),\n\t\tguildedSocialLink: toSocialLink(body.guildedSocialLink),\n\t\tmobileEnabled: body.mobileEnabled ?? false,\n\t\towner,\n\t\tprivateServerPriceRobux: body.privateServerPriceRobux ?? undefined,\n\t\trobloxGroupSocialLink: toSocialLink(body.robloxGroupSocialLink),\n\t\trootPlaceId: extractRootPlaceId(body.rootPlace),\n\t\ttabletEnabled: body.tabletEnabled ?? false,\n\t\ttwitchSocialLink: toSocialLink(body.twitchSocialLink),\n\t\ttwitterSocialLink: toSocialLink(body.twitterSocialLink),\n\t\tupdatedAt: new Date(body.updateTime),\n\t\tvisibility: VISIBILITY_MAP[body.visibility],\n\t\tvoiceChatEnabled: body.voiceChatEnabled ?? false,\n\t\tvrEnabled: body.vrEnabled ?? false,\n\t\tyoutubeSocialLink: toSocialLink(body.youtubeSocialLink),\n\t};\n}\n\nfunction isVisibilityWire(value: unknown): value is VisibilityWire {\n\treturn value === \"PRIVATE\" || value === \"PUBLIC\" || value === \"VISIBILITY_UNSPECIFIED\";\n}\n\nfunction isAgeRatingWire(value: unknown): value is AgeRatingWire {\n\treturn (\n\t\tvalue === \"AGE_RATING_13_PLUS\" ||\n\t\tvalue === \"AGE_RATING_17_PLUS\" ||\n\t\tvalue === \"AGE_RATING_9_PLUS\" ||\n\t\tvalue === \"AGE_RATING_ALL\" ||\n\t\tvalue === \"AGE_RATING_UNSPECIFIED\"\n\t);\n}\n\nfunction hasValidRequiredFields(body: Record<string, unknown>): boolean {\n\treturn (\n\t\ttypeof body[\"path\"] === \"string\" &&\n\t\tisDateTimeString(body[\"createTime\"]) &&\n\t\tisDateTimeString(body[\"updateTime\"]) &&\n\t\ttypeof body[\"displayName\"] === \"string\" &&\n\t\ttypeof body[\"description\"] === \"string\" &&\n\t\tisVisibilityWire(body[\"visibility\"]) &&\n\t\tisAgeRatingWire(body[\"ageRating\"])\n\t);\n}\n\nfunction isSocialLinkWire(value: unknown): value is SocialLinkWire {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\treturn typeof value[\"title\"] === \"string\" && typeof value[\"uri\"] === \"string\";\n}\n\nfunction isOptionalSocialLink(value: unknown): boolean {\n\treturn value === undefined || value === null || isSocialLinkWire(value);\n}\n\nfunction isOptionalBoolean(value: unknown): boolean {\n\treturn value === undefined || value === null || typeof value === \"boolean\";\n}\n\nfunction hasValidOptionalFields(body: Record<string, unknown>): boolean {\n\tconst priceField = body[\"privateServerPriceRobux\"] ?? undefined;\n\tif (priceField !== undefined && typeof priceField !== \"number\") {\n\t\treturn false;\n\t}\n\n\tconst rootPlace = body[\"rootPlace\"] ?? undefined;\n\tif (rootPlace !== undefined && typeof rootPlace !== \"string\") {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\tisOptionalBoolean(body[\"voiceChatEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"desktopEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"mobileEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"tabletEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"consoleEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"vrEnabled\"]) &&\n\t\tisOptionalSocialLink(body[\"facebookSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"twitterSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"youtubeSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"twitchSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"discordSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"robloxGroupSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"guildedSocialLink\"])\n\t);\n}\n\nfunction isUniverseWire(body: unknown): body is UniverseWire {\n\tif (!isRecord(body)) {\n\t\treturn false;\n\t}\n\n\treturn hasValidRequiredFields(body) && hasValidOptionalFields(body);\n}\n\nfunction extractOwnerId(resourcePath: string): string | undefined {\n\tconst match = /^(?:users|groups)\\/(\\d+)$/.exec(resourcePath);\n\treturn match?.[1];\n}\n\nfunction resolveOwner(body: UniverseWire): Result<UniverseOwner, undefined> {\n\tif (typeof body.user === \"string\") {\n\t\tconst id = extractOwnerId(body.user);\n\t\tif (id !== undefined) {\n\t\t\treturn { data: { id, kind: \"user\" }, success: true };\n\t\t}\n\t}\n\n\tif (typeof body.group === \"string\") {\n\t\tconst id = extractOwnerId(body.group);\n\t\tif (id !== undefined) {\n\t\t\treturn { data: { id, kind: \"group\" }, success: true };\n\t\t}\n\t}\n\n\treturn { err: undefined, success: false };\n}\n","// The legacy `{gameId}` URL segment is in fact the universe ID; the public API\n// takes `universeId` and substitutes it into the path.\n\nimport type { HttpRequest } from \"../../../internal/http/types.ts\";\nimport { toBlob } from \"../../../internal/utils/to-blob.ts\";\nimport type {\n\tDeleteExperienceIconParameters,\n\tListExperienceIconsParameters,\n\tUploadExperienceIconParameters,\n} from \"./types.ts\";\n\n/**\n * Builds a `POST` request for the localized \"upload experience icon\"\n * endpoint. A successful upload replaces any existing icon for the same\n * `(universeId, languageCode)` pair.\n *\n * @param parameters - Universe and language identifiers plus the image\n * bytes to upload.\n * @returns A pure {@link HttpRequest} describing the upload call.\n */\nexport function buildUploadIconRequest(parameters: UploadExperienceIconParameters): HttpRequest {\n\tconst body = new FormData();\n\t// The legacy game-icon endpoint reads the upload from `request.files`.\n\tbody.append(\"request.files\", toBlob(parameters.image));\n\n\treturn {\n\t\tbody,\n\t\tmethod: \"POST\",\n\t\turl: `/legacy-game-internationalization/v1/game-icon/games/${parameters.universeId}/language-codes/${parameters.languageCode}`,\n\t};\n}\n\n/**\n * Builds a `DELETE` request for the localized \"delete experience icon\"\n * endpoint. Removing the source-language icon is rejected server-side;\n * deleting the icon for a non-source language clears that translation.\n *\n * @param parameters - Universe and language identifiers of the icon to\n * delete.\n * @returns A pure {@link HttpRequest} describing the delete call.\n */\nexport function buildDeleteIconRequest(parameters: DeleteExperienceIconParameters): HttpRequest {\n\treturn {\n\t\tmethod: \"DELETE\",\n\t\turl: `/legacy-game-internationalization/v1/game-icon/games/${parameters.universeId}/language-codes/${parameters.languageCode}`,\n\t};\n}\n\n/**\n * Builds a `GET` request for the \"list experience icons\" endpoint. The\n * server returns one entry per locale that has an icon registered.\n *\n * @param parameters - Universe identifier whose icons to list.\n * @returns A pure {@link HttpRequest} describing the list call.\n */\nexport function buildListIconsRequest(parameters: ListExperienceIconsParameters): HttpRequest {\n\treturn {\n\t\tmethod: \"GET\",\n\t\turl: `/legacy-game-internationalization/v1/game-icon/games/${parameters.universeId}`,\n\t};\n}\n","import type { OperationLimit } from \"../../../internal/http/rate-limit-queue.ts\";\n\n/**\n * Per-second request ceiling for every game-icon Operation bound on\n * `UniversesClient.icon`. The legacy `gameinternationalization` service caps\n * each API key at 100 requests per minute *shared across the entire service*\n * (see the `x-roblox-rate-limits` extension on every operation in the\n * vendored Open Cloud spec), so all methods queue against the same operation\n * key.\n */\nexport const ICON_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: 100 / 60,\n\toperationKey: \"experience-icon\",\n});\n\n/**\n * Scopes required for every game-icon operation, sourced from\n * `x-roblox-scopes` on the legacy `gameinternationalization` icon\n * endpoints in the vendored OpenAPI schema.\n */\nexport const ICON_REQUIRED_SCOPES: ReadonlyArray<string> = Object.freeze([\n\t\"legacy-universe:manage\",\n]);\n","import type { HttpResponse } from \"../../../client/types.ts\";\nimport { ApiError } from \"../../../errors/api-error.ts\";\nimport { isRecord } from \"../../../internal/utils/is-record.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type { ExperienceIcon } from \"./types.ts\";\nimport type { GameIconListWire, GameIconState, GetGameIconResponseWire } from \"./wire.ts\";\n\n/**\n * Parses a successful icon-list response into a public array of\n * {@link ExperienceIcon} entries.\n *\n * @param response - The full {@link HttpResponse} from the Open Cloud API.\n * @returns A success result wrapping the converted icon list, or an\n * `ApiError` when the body does not match the wire schema.\n */\nexport function parseIconListResponse(\n\tresponse: HttpResponse,\n): Result<ReadonlyArray<ExperienceIcon>, ApiError> {\n\tconst { body, status: statusCode } = response;\n\n\tif (!isGameIconListWire(body)) {\n\t\treturn {\n\t\t\terr: new ApiError(\"Malformed icon list response\", { statusCode }),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tdata: body.data.map(toExperienceIcon),\n\t\tsuccess: true,\n\t};\n}\n\nfunction isGameIconState(value: unknown): value is GameIconState {\n\treturn (\n\t\tvalue === \"Approved\" ||\n\t\tvalue === \"Error\" ||\n\t\tvalue === \"PendingReview\" ||\n\t\tvalue === \"Rejected\" ||\n\t\tvalue === \"UnAvailable\"\n\t);\n}\n\nfunction isGetGameIconResponseWire(value: unknown): value is GetGameIconResponseWire {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\ttypeof value[\"imageId\"] === \"string\" &&\n\t\ttypeof value[\"imageUrl\"] === \"string\" &&\n\t\ttypeof value[\"languageCode\"] === \"string\" &&\n\t\tisGameIconState(value[\"state\"])\n\t);\n}\n\nfunction isGameIconListWire(body: unknown): body is GameIconListWire {\n\tif (!isRecord(body)) {\n\t\treturn false;\n\t}\n\n\tconst { data } = body;\n\tif (!Array.isArray(data)) {\n\t\treturn false;\n\t}\n\n\treturn data.every(isGetGameIconResponseWire);\n}\n\nfunction toExperienceIcon(wire: GetGameIconResponseWire): ExperienceIcon {\n\treturn {\n\t\timageId: wire.imageId,\n\t\timageUrl: wire.imageUrl,\n\t\tlanguageCode: wire.languageCode,\n\t\tstate: wire.state,\n\t};\n}\n","import { ValidationError } from \"../../../errors/validation.ts\";\nimport type { HttpRequest } from \"../../../internal/http/types.ts\";\nimport { toBlob } from \"../../../internal/utils/to-blob.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type {\n\tDeleteExperienceThumbnailParameters,\n\tReorderExperienceThumbnailsParameters,\n\tUploadExperienceThumbnailParameters,\n} from \"./types.ts\";\n\ntype ParsedIdsResult = Result<ReadonlyArray<number>, ValidationError>;\n\n/**\n * Builds a `POST` request for the localized \"upload experience thumbnail\"\n * endpoint. Each successful upload appends a new entry to the carousel.\n *\n * @param parameters - Universe and language identifiers plus the image\n * bytes to upload.\n * @returns A pure {@link HttpRequest} describing the upload call.\n */\nexport function buildUploadThumbnailRequest(\n\tparameters: UploadExperienceThumbnailParameters,\n): HttpRequest {\n\tconst body = new FormData();\n\t// The legacy game-thumbnails endpoint reads the upload from\n\t// `gameThumbnailRequest.files`, distinct from game-icon's `request.files`.\n\tbody.append(\"gameThumbnailRequest.files\", toBlob(parameters.image));\n\n\treturn {\n\t\tbody,\n\t\tmethod: \"POST\",\n\t\t// The `{gameId}` URL segment in this legacy path is in fact the\n\t\t// universe ID; the package surfaces only `universeId`.\n\t\turl: `/legacy-game-internationalization/v1/game-thumbnails/games/${parameters.universeId}/language-codes/${parameters.languageCode}/image`,\n\t};\n}\n\n/**\n * Builds a `DELETE` request for the \"delete experience thumbnail\" endpoint.\n *\n * @param parameters - Universe, language, and image identifiers of the\n * thumbnail to delete.\n * @returns A pure {@link HttpRequest} describing the delete call.\n */\nexport function buildDeleteThumbnailRequest(\n\tparameters: DeleteExperienceThumbnailParameters,\n): HttpRequest {\n\treturn {\n\t\tmethod: \"DELETE\",\n\t\turl: `/legacy-game-internationalization/v1/game-thumbnails/games/${parameters.universeId}/language-codes/${parameters.languageCode}/images/${parameters.imageId}`,\n\t};\n}\n\n/**\n * Builds a `POST` request for the \"reorder experience thumbnails\" endpoint.\n * Validates each supplied image ID at the wire boundary so a typo cannot\n * silently serialize as JSON `null` and corrupt the request.\n *\n * @param parameters - Universe, language, and the desired display order.\n * @returns A success result wrapping the request, or a\n * {@link ValidationError} when `orderedImageIds` is empty or any ID is not\n * a positive integer within the safe-integer range.\n */\nexport function buildReorderThumbnailsRequest(\n\tparameters: ReorderExperienceThumbnailsParameters,\n): Result<HttpRequest, ValidationError> {\n\tconst { languageCode, orderedImageIds, universeId } = parameters;\n\n\tconst idsResult = parseOrderedImageIds(orderedImageIds);\n\tif (!idsResult.success) {\n\t\treturn idsResult;\n\t}\n\n\treturn {\n\t\tdata: {\n\t\t\tbody: { mediaAssetIds: idsResult.data },\n\t\t\tmethod: \"POST\",\n\t\t\turl: `/legacy-game-internationalization/v1/game-thumbnails/games/${universeId}/language-codes/${languageCode}/images/order`,\n\t\t},\n\t\tsuccess: true,\n\t};\n}\n\nfunction parseImageId(value: string): number | undefined {\n\tif (!/^[1-9]\\d*$/.test(value)) {\n\t\treturn undefined;\n\t}\n\n\tconst parsed = Number(value);\n\tif (!Number.isSafeInteger(parsed)) {\n\t\treturn undefined;\n\t}\n\n\treturn parsed;\n}\n\nfunction appendParsedId(accumulator: ParsedIdsResult, id: string): ParsedIdsResult {\n\tif (!accumulator.success) {\n\t\treturn accumulator;\n\t}\n\n\tconst parsed = parseImageId(id);\n\tif (parsed === undefined) {\n\t\treturn {\n\t\t\terr: new ValidationError(\n\t\t\t\t`orderedImageIds entry ${JSON.stringify(id)} is not a positive integer ID`,\n\t\t\t\t{ code: \"invalid_image_id\" },\n\t\t\t),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn { data: [...accumulator.data, parsed], success: true };\n}\n\nfunction parseOrderedImageIds(orderedImageIds: ReadonlyArray<string>): ParsedIdsResult {\n\tif (orderedImageIds.length === 0) {\n\t\treturn {\n\t\t\terr: new ValidationError(\"orderedImageIds must contain at least one image ID\", {\n\t\t\t\tcode: \"empty_image_ids\",\n\t\t\t}),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn orderedImageIds.reduce<ParsedIdsResult>(appendParsedId, { data: [], success: true });\n}\n","import type { OperationLimit } from \"../../../internal/http/rate-limit-queue.ts\";\n\n/**\n * Per-second request ceiling for every game-thumbnails Operation bound on\n * `UniversesClient.thumbnails`. The legacy `gameinternationalization`\n * service caps each API key at 100 requests per minute *shared across the\n * entire service* (see the `x-roblox-rate-limits` extension on every\n * operation in the vendored Open Cloud spec), so all methods queue against\n * the same operation key.\n */\nexport const THUMBNAILS_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: 100 / 60,\n\toperationKey: \"experience-thumbnails\",\n});\n\n/**\n * Scopes required for every game-thumbnails operation, sourced from\n * `x-roblox-scopes` on the legacy `gameinternationalization` thumbnail\n * endpoints in the vendored OpenAPI schema.\n */\nexport const THUMBNAILS_REQUIRED_SCOPES: ReadonlyArray<string> = Object.freeze([\n\t\"legacy-universe:manage\",\n]);\n","import type { HttpResponse } from \"../../../client/types.ts\";\nimport { ApiError } from \"../../../errors/api-error.ts\";\nimport { isRecord } from \"../../../internal/utils/is-record.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type { UploadedExperienceThumbnail } from \"./types.ts\";\nimport type { GameThumbnailUploadWire } from \"./wire.ts\";\n\n/**\n * Parses a successful thumbnail-upload response into the public\n * {@link UploadedExperienceThumbnail} shape, returning a {@link Result}\n * so callers can handle malformed payloads without exceptions.\n *\n * @param response - The full {@link HttpResponse} from the Open Cloud API.\n * @returns A success result wrapping the converted upload, or an\n * `ApiError` when the body does not match the wire schema.\n */\nexport function parseThumbnailUploadResponse(\n\tresponse: HttpResponse,\n): Result<UploadedExperienceThumbnail, ApiError> {\n\tconst { body, status: statusCode } = response;\n\n\tif (!isGameThumbnailUploadWire(body)) {\n\t\treturn {\n\t\t\terr: new ApiError(\"Malformed thumbnail upload response\", { statusCode }),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tdata: { mediaAssetId: body.mediaAssetId },\n\t\tsuccess: true,\n\t};\n}\n\nfunction isGameThumbnailUploadWire(body: unknown): body is GameThumbnailUploadWire {\n\tif (!isRecord(body)) {\n\t\treturn false;\n\t}\n\n\treturn typeof body[\"mediaAssetId\"] === \"string\";\n}\n","import type { OpenCloudClientOptions, RequestOptions } from \"../../client/types.ts\";\nimport { buildGetRequest, buildUpdateRequest } from \"../../domains/cloud-v2/universes/builders.ts\";\nimport {\n\tGET_OPERATION_LIMIT,\n\tUPDATE_OPERATION_LIMIT,\n\tUPDATE_REQUIRED_SCOPES,\n} from \"../../domains/cloud-v2/universes/operations.ts\";\nimport { parseUniverseResponse } from \"../../domains/cloud-v2/universes/parsers.ts\";\nimport type {\n\tGetUniverseParameters,\n\tUniverse,\n\tUpdateUniverseParameters,\n} from \"../../domains/cloud-v2/universes/types.ts\";\nimport {\n\tbuildDeleteIconRequest,\n\tbuildListIconsRequest,\n\tbuildUploadIconRequest,\n} from \"../../domains/game-internationalization/game-icon/builders.ts\";\nimport {\n\tICON_OPERATION_LIMIT,\n\tICON_REQUIRED_SCOPES,\n} from \"../../domains/game-internationalization/game-icon/operations.ts\";\nimport { parseIconListResponse } from \"../../domains/game-internationalization/game-icon/parsers.ts\";\nimport type {\n\tDeleteExperienceIconParameters,\n\tExperienceIcon,\n\tListExperienceIconsParameters,\n\tUploadExperienceIconParameters,\n} from \"../../domains/game-internationalization/game-icon/types.ts\";\nimport {\n\tbuildDeleteThumbnailRequest,\n\tbuildReorderThumbnailsRequest,\n\tbuildUploadThumbnailRequest,\n} from \"../../domains/game-internationalization/game-thumbnails/builders.ts\";\nimport {\n\tTHUMBNAILS_OPERATION_LIMIT,\n\tTHUMBNAILS_REQUIRED_SCOPES,\n} from \"../../domains/game-internationalization/game-thumbnails/operations.ts\";\nimport { parseThumbnailUploadResponse } from \"../../domains/game-internationalization/game-thumbnails/parsers.ts\";\nimport type {\n\tDeleteExperienceThumbnailParameters,\n\tReorderExperienceThumbnailsParameters,\n\tUploadedExperienceThumbnail,\n\tUploadExperienceThumbnailParameters,\n} from \"../../domains/game-internationalization/game-thumbnails/types.ts\";\nimport type { OpenCloudError } from \"../../errors/base.ts\";\nimport { CREATE_METHOD_DEFAULTS, IDEMPOTENT_METHOD_DEFAULTS } from \"../../internal/http/retry.ts\";\nimport type { HttpRequest } from \"../../internal/http/types.ts\";\nimport {\n\tokRequest,\n\tparseEmptyResponse,\n\tResourceClient,\n\ttype ResourceMethodSpec,\n} from \"../../internal/resource-client.ts\";\nimport type { Result } from \"../../types.ts\";\n\nconst GET_SPEC: ResourceMethodSpec<GetUniverseParameters, Universe> = Object.freeze({\n\tbuildRequest: buildGetRequest,\n\tmethodDefaults: {},\n\tmethodKind: \"idempotent\",\n\toperationLimit: GET_OPERATION_LIMIT,\n\tparse: parseUniverseResponse,\n});\n\nconst UPDATE_SPEC: ResourceMethodSpec<UpdateUniverseParameters, Universe> = Object.freeze({\n\tbuildRequest: buildUpdateRequest,\n\tmethodDefaults: {},\n\tmethodKind: \"idempotent\",\n\toperationLimit: UPDATE_OPERATION_LIMIT,\n\tparse: parseUniverseResponse,\n\trequiredScopes: UPDATE_REQUIRED_SCOPES,\n});\n\nfunction buildIconUploadOkRequest(\n\tparameters: UploadExperienceIconParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildUploadIconRequest(parameters));\n}\n\nfunction buildIconDeleteOkRequest(\n\tparameters: DeleteExperienceIconParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildDeleteIconRequest(parameters));\n}\n\nfunction buildIconListOkRequest(\n\tparameters: ListExperienceIconsParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildListIconsRequest(parameters));\n}\n\nconst ICON_UPLOAD_SPEC: ResourceMethodSpec<UploadExperienceIconParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildIconUploadOkRequest,\n\t\tmethodDefaults: CREATE_METHOD_DEFAULTS,\n\t\tmethodKind: \"create\",\n\t\toperationLimit: ICON_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: ICON_REQUIRED_SCOPES,\n\t});\n\nconst ICON_DELETE_SPEC: ResourceMethodSpec<DeleteExperienceIconParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildIconDeleteOkRequest,\n\t\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\t\tmethodKind: \"idempotent\",\n\t\toperationLimit: ICON_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: ICON_REQUIRED_SCOPES,\n\t});\n\nconst ICON_LIST_SPEC: ResourceMethodSpec<\n\tListExperienceIconsParameters,\n\tReadonlyArray<ExperienceIcon>\n> = Object.freeze({\n\tbuildRequest: buildIconListOkRequest,\n\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\tmethodKind: \"idempotent\",\n\toperationLimit: ICON_OPERATION_LIMIT,\n\tparse: parseIconListResponse,\n\trequiredScopes: ICON_REQUIRED_SCOPES,\n});\n\nfunction buildThumbnailUploadOkRequest(\n\tparameters: UploadExperienceThumbnailParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildUploadThumbnailRequest(parameters));\n}\n\nfunction buildThumbnailDeleteOkRequest(\n\tparameters: DeleteExperienceThumbnailParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildDeleteThumbnailRequest(parameters));\n}\n\nconst THUMBNAIL_UPLOAD_SPEC: ResourceMethodSpec<\n\tUploadExperienceThumbnailParameters,\n\tUploadedExperienceThumbnail\n> = Object.freeze({\n\tbuildRequest: buildThumbnailUploadOkRequest,\n\tmethodDefaults: CREATE_METHOD_DEFAULTS,\n\tmethodKind: \"create\",\n\toperationLimit: THUMBNAILS_OPERATION_LIMIT,\n\tparse: parseThumbnailUploadResponse,\n\trequiredScopes: THUMBNAILS_REQUIRED_SCOPES,\n});\n\nconst THUMBNAIL_DELETE_SPEC: ResourceMethodSpec<DeleteExperienceThumbnailParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildThumbnailDeleteOkRequest,\n\t\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\t\tmethodKind: \"idempotent\",\n\t\toperationLimit: THUMBNAILS_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: THUMBNAILS_REQUIRED_SCOPES,\n\t});\n\nconst THUMBNAIL_REORDER_SPEC: ResourceMethodSpec<ReorderExperienceThumbnailsParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildReorderThumbnailsRequest,\n\t\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\t\tmethodKind: \"idempotent\",\n\t\toperationLimit: THUMBNAILS_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: THUMBNAILS_REQUIRED_SCOPES,\n\t});\n\ninterface UniverseIconHandle {\n\t/**\n\t * Deletes the localized icon registered against a universe for a given\n\t * language. Removing the source-language icon is rejected server-side;\n\t * consumers must replace it via {@link UniverseIconHandle.upload}\n\t * instead.\n\t *\n\t * @param parameters - Universe and language identifiers of the icon to\n\t * delete.\n\t * @param options - Optional per-request overrides.\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\tdelete: (\n\t\tparameters: DeleteExperienceIconParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n\t/**\n\t * Lists every localized icon registered against an experience. The\n\t * server returns one entry per locale that has an icon registered.\n\t *\n\t * @param parameters - Universe identifier whose icons to list.\n\t * @param options - Optional per-request overrides.\n\t * @returns A {@link Result} wrapping the parsed array of\n\t * {@link ExperienceIcon} entries or the {@link OpenCloudError} that\n\t * caused the request to fail.\n\t */\n\tlist: (\n\t\tparameters: ListExperienceIconsParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<ReadonlyArray<ExperienceIcon>, OpenCloudError>>;\n\t/**\n\t * Uploads or replaces the localized icon for an experience. A\n\t * subsequent upload for the same `(universeId, languageCode)` pair\n\t * replaces the existing icon for that locale.\n\t *\n\t * @param parameters - Universe and language identifiers plus the image\n\t * bytes to upload.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\tupload: (\n\t\tparameters: UploadExperienceIconParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n}\n\ninterface UniverseThumbnailsHandle {\n\t/**\n\t * Deletes a single thumbnail by media asset ID. Idempotent: deleting an\n\t * already-removed thumbnail surfaces the server's 404 unchanged.\n\t *\n\t * @param parameters - Universe, language, and image identifiers of the\n\t * thumbnail to delete.\n\t * @param options - Optional per-request overrides.\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\tdelete: (\n\t\tparameters: DeleteExperienceThumbnailParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n\t/**\n\t * Reorders the localized thumbnail carousel. The supplied\n\t * `orderedImageIds` describes the desired display order from first to\n\t * last. Image IDs must be positive integers within the safe-integer\n\t * range; invalid input is rejected with a {@link OpenCloudError} of\n\t * kind `ValidationError` before any HTTP round-trip.\n\t *\n\t * @param parameters - Universe, language, and the desired display order.\n\t * @param options - Optional per-request overrides.\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\treorder: (\n\t\tparameters: ReorderExperienceThumbnailsParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n\t/**\n\t * Uploads a new thumbnail and appends it to the localized carousel. Use\n\t * {@link UniverseThumbnailsHandle.reorder} after multiple uploads to\n\t * set the display order.\n\t *\n\t * @param parameters - Universe and language identifiers plus the image\n\t * bytes to upload.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A {@link Result} wrapping the parsed\n\t * {@link UploadedExperienceThumbnail} or the {@link OpenCloudError}\n\t * that caused the request to fail.\n\t */\n\tupload: (\n\t\tparameters: UploadExperienceThumbnailParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<UploadedExperienceThumbnail, OpenCloudError>>;\n}\n\n/**\n * Public client for the Roblox Open Cloud `Universe` resource. Wires\n * the request builders, the injected\n * {@link OpenCloudClientOptions.httpClient}, and the response parser\n * into a single ergonomic surface. Every method returns a\n * {@link Result} so callers handle failure explicitly; no thrown\n * {@link OpenCloudError} ever escapes the client.\n *\n * Partial updates use a Google-style `updateMask` query string derived\n * from the keys present on the update parameters. Setting a clearable\n * field (`privateServerPriceRobux` or any social link) to `undefined`\n * sends JSON `null` for that field so the server clears the\n * corresponding value.\n *\n * Localized experience-icon and experience-thumbnail Operations are\n * bound on the {@link UniversesClient.icon} and\n * {@link UniversesClient.thumbnails} Operation Groups so callers reach\n * for one client per universe.\n *\n * @example\n *\n * ```ts\n * import { UniversesClient } from \"@bedrock-rbx/ocale/universes\";\n *\n * const client = new UniversesClient({ apiKey: \"your-key\" });\n * expect(client).toBeInstanceOf(UniversesClient);\n * ```\n */\nexport class UniversesClient {\n\treadonly #inner: ResourceClient;\n\n\t/**\n\t * Operation Group exposing the localized experience-icon\n\t * Operations (`upload`, `delete`, `list`) backed by the\n\t * `legacy-game-internationalization` domain. Shares the parent\n\t * client's HTTP, rate-limit, and retry plumbing.\n\t */\n\tpublic readonly icon: UniverseIconHandle;\n\t/**\n\t * Operation Group exposing the localized experience-thumbnail\n\t * Operations (`upload`, `delete`, `reorder`) backed by the\n\t * `legacy-game-internationalization` domain. No list-thumbnails\n\t * endpoint is bridged; consumers must track uploaded\n\t * `mediaAssetId`s in their own state store to reconcile against\n\t * the existing carousel. Shares the parent client's HTTP,\n\t * rate-limit, and retry plumbing.\n\t */\n\tpublic readonly thumbnails: UniverseThumbnailsHandle;\n\n\t/**\n\t * Creates a new {@link UniversesClient}. Configuration is frozen\n\t * on construction; per-request overrides are accepted on each\n\t * method.\n\t *\n\t * @param options - Client-level configuration including the API key.\n\t */\n\tconstructor(options: OpenCloudClientOptions) {\n\t\tthis.#inner = new ResourceClient(options);\n\t\tthis.icon = createIconHandle(this.#inner);\n\t\tthis.thumbnails = createThumbnailsHandle(this.#inner);\n\t}\n\n\t/**\n\t * Fetches the current configuration of a universe.\n\t *\n\t * @param parameters - The universe identifier.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A {@link Result} wrapping the parsed {@link Universe}\n\t * or the {@link OpenCloudError} that caused the request to fail.\n\t */\n\tpublic async get(\n\t\tparameters: GetUniverseParameters,\n\t\toptions?: RequestOptions,\n\t): Promise<Result<Universe, OpenCloudError>> {\n\t\treturn this.#inner.execute({ options, parameters, spec: GET_SPEC });\n\t}\n\n\t/**\n\t * Partially updates a universe's configuration. The fields\n\t * supplied on `parameters` (excluding `universeId`) are forwarded\n\t * to the server via a Google-style `updateMask`; unmentioned\n\t * fields are left untouched.\n\t *\n\t * @param parameters - The universe identifier and the fields to\n\t * update. At least one updatable field must be supplied.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A {@link Result} wrapping the parsed {@link Universe}\n\t * or the {@link OpenCloudError} that caused the request to fail.\n\t */\n\tpublic async update(\n\t\tparameters: UpdateUniverseParameters,\n\t\toptions?: RequestOptions,\n\t): Promise<Result<Universe, OpenCloudError>> {\n\t\treturn this.#inner.execute({ options, parameters, spec: UPDATE_SPEC });\n\t}\n}\n\nfunction createIconHandle(inner: ResourceClient): UniverseIconHandle {\n\treturn {\n\t\tasync delete(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: ICON_DELETE_SPEC });\n\t\t},\n\t\tasync list(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: ICON_LIST_SPEC });\n\t\t},\n\t\tasync upload(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: ICON_UPLOAD_SPEC });\n\t\t},\n\t};\n}\n\nfunction createThumbnailsHandle(inner: ResourceClient): UniverseThumbnailsHandle {\n\treturn {\n\t\tasync delete(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: THUMBNAIL_DELETE_SPEC });\n\t\t},\n\t\tasync reorder(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: THUMBNAIL_REORDER_SPEC });\n\t\t},\n\t\tasync upload(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: THUMBNAIL_UPLOAD_SPEC });\n\t\t},\n\t};\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"universes.mjs","names":["#inner"],"sources":["../src/domains/cloud-v2/universes/builders.ts","../src/domains/cloud-v2/universes/operations.ts","../src/domains/cloud-v2/universes/parsers.ts","../src/domains/game-internationalization/game-icon/builders.ts","../src/domains/game-internationalization/game-icon/operations.ts","../src/domains/game-internationalization/game-icon/parsers.ts","../src/domains/game-internationalization/game-thumbnails/builders.ts","../src/domains/game-internationalization/game-thumbnails/operations.ts","../src/domains/game-internationalization/game-thumbnails/parsers.ts","../src/resources/universes/client.ts"],"sourcesContent":["import type { HttpRequest } from \"../../../client/types.ts\";\nimport type { OpenCloudError } from \"../../../errors/base.ts\";\nimport { ValidationError } from \"../../../errors/validation.ts\";\nimport { okRequest } from \"../../../internal/resource-client.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type { GetUniverseParameters, UpdateUniverseParameters } from \"./types.ts\";\n\n/**\n * Dodges `unicorn/no-null` while still emitting a literal `null` onto\n * the wire, which the Open Cloud `Cloud_UpdateUniverse` endpoint\n * requires to clear a nullable field (for example disabling private\n * servers or removing a social link).\n */\nconst NULL_SENTINEL = JSON.parse(\"null\");\n\n/**\n * Builds a `GET` request for the Open Cloud \"get universe\" endpoint.\n *\n * @param parameters - The universe identifier.\n * @returns A success result wrapping the request; the builder cannot fail.\n */\nexport function buildGetRequest(\n\tparameters: GetUniverseParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest({\n\t\tmethod: \"GET\",\n\t\turl: `/cloud/v2/universes/${parameters.universeId}`,\n\t});\n}\n\n/**\n * Builds a `PATCH` request for the Open Cloud \"update universe\"\n * endpoint. Derives the `updateMask` query string from the keys\n * present on `parameters` and emits a JSON body containing those same\n * fields, translating `undefined` values to JSON `null` so Roblox\n * clears the corresponding server-side value.\n *\n * @param parameters - The universe identifier plus the fields to update.\n * @returns A success result wrapping the request, or a\n * {@link ValidationError} when no updatable fields were supplied.\n */\nexport function buildUpdateRequest(\n\tparameters: UpdateUniverseParameters,\n): Result<HttpRequest, ValidationError> {\n\tconst fieldKeys = extractUpdateFieldKeys(parameters);\n\n\tif (fieldKeys.length === 0) {\n\t\treturn {\n\t\t\terr: new ValidationError(\"Update must include at least one field\", {\n\t\t\t\tcode: \"empty_update\",\n\t\t\t}),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\tconst body: Record<string, unknown> = {};\n\tfor (const key of fieldKeys) {\n\t\tbody[key] = bodyValueFor(parameters, key);\n\t}\n\n\tconst updateMask = fieldKeys.join(\",\");\n\treturn {\n\t\tdata: {\n\t\t\tbody,\n\t\t\theaders: { \"content-type\": \"application/json\" },\n\t\t\tmethod: \"PATCH\",\n\t\t\turl: `/cloud/v2/universes/${parameters.universeId}?updateMask=${updateMask}`,\n\t\t},\n\t\tsuccess: true,\n\t};\n}\n\nfunction extractUpdateFieldKeys(parameters: UpdateUniverseParameters): ReadonlyArray<string> {\n\treturn Object.keys(parameters).filter((key) => key !== \"universeId\");\n}\n\nfunction bodyValueFor(parameters: UpdateUniverseParameters, key: string): unknown {\n\tconst value = Reflect.get(parameters, key);\n\treturn value === undefined ? NULL_SENTINEL : value;\n}\n","import type { OperationLimit } from \"../../../internal/http/rate-limit-queue.ts\";\n\nconst PER_MINUTE = 100;\nconst SECONDS_PER_MINUTE = 60;\n\n/**\n * Per-second request ceiling for reading a universe, from the Open\n * Cloud OpenAPI schema (100 requests per minute per API key owner).\n */\nexport const GET_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: PER_MINUTE / SECONDS_PER_MINUTE,\n\toperationKey: \"universes.get\",\n});\n\n/**\n * Per-second request ceiling for updating a universe, from the Open\n * Cloud OpenAPI schema (100 requests per minute per API key owner).\n * Keyed independently from {@link GET_OPERATION_LIMIT} so reads and\n * updates do not share a queue; upstream quota accounting is not\n * documented as shared and the conservative default is fewer\n * cross-method contention surprises.\n */\nexport const UPDATE_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: PER_MINUTE / SECONDS_PER_MINUTE,\n\toperationKey: \"universes.update\",\n});\n\n/**\n * Scopes required to update a universe, sourced from `x-roblox-scopes`\n * on the `Cloud_UpdateUniverse` operation in the vendored OpenAPI schema.\n * `Cloud_GetUniverse` declares no scope, so the GET method intentionally\n * does not declare `requiredScopes` and a 401/403 there surfaces as a\n * generic ApiError.\n */\nexport const UPDATE_REQUIRED_SCOPES: ReadonlyArray<string> = Object.freeze([\"universe:write\"]);\n","import type { HttpResponse } from \"../../../client/types.ts\";\nimport { ApiError } from \"../../../errors/api-error.ts\";\nimport { isDateTimeString } from \"../../../internal/utils/is-date-time-string.ts\";\nimport { isRecord } from \"../../../internal/utils/is-record.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type {\n\tSocialLink,\n\tUniverse,\n\tUniverseAgeRating,\n\tUniverseOwner,\n\tUniverseVisibility,\n} from \"./types.ts\";\nimport type { AgeRatingWire, SocialLinkWire, UniverseWire, VisibilityWire } from \"./wire.ts\";\n\nconst VISIBILITY_MAP: Readonly<Record<VisibilityWire, UniverseVisibility>> = {\n\tPRIVATE: \"private\",\n\tPUBLIC: \"public\",\n\tVISIBILITY_UNSPECIFIED: \"unspecified\",\n};\n\nconst AGE_RATING_MAP: Readonly<Record<AgeRatingWire, UniverseAgeRating>> = {\n\tAGE_RATING_9_PLUS: \"9Plus\",\n\tAGE_RATING_13_PLUS: \"13Plus\",\n\tAGE_RATING_17_PLUS: \"17Plus\",\n\tAGE_RATING_ALL: \"all\",\n\tAGE_RATING_UNSPECIFIED: \"unspecified\",\n};\n\nconst MALFORMED_MESSAGE = \"Malformed universe response\";\n\nconst UNIVERSE_PATH_PATTERN = /^universes\\/(\\d+)$/;\n\nconst ROOT_PLACE_PATH_PATTERN = /\\/places\\/(\\d+)$/;\n\nconst OWNER_PATH_PATTERN = /^(?:users|groups)\\/(\\d+)$/;\n\ninterface ToUniverseArgs {\n\treadonly id: string;\n\treadonly body: UniverseWire;\n\treadonly owner: UniverseOwner;\n}\n\n/**\n * Parses a successful Open Cloud `Universe` response body into the\n * public {@link Universe} shape.\n *\n * @param response - The full {@link HttpResponse} from the Open Cloud API.\n * @returns A success result wrapping the parsed {@link Universe}, or\n * an {@link ApiError} when the body does not match the wire schema.\n */\nexport function parseUniverseResponse(response: HttpResponse): Result<Universe, ApiError> {\n\tconst { body, status: statusCode } = response;\n\n\tif (!isUniverseWire(body)) {\n\t\treturn malformed(statusCode, body);\n\t}\n\n\tconst ownerResult = resolveOwner(body);\n\tif (!ownerResult.success) {\n\t\treturn malformed(statusCode, body);\n\t}\n\n\tconst idMatch = UNIVERSE_PATH_PATTERN.exec(body.path);\n\tconst id = idMatch?.[1];\n\tif (id === undefined) {\n\t\treturn malformed(statusCode, body);\n\t}\n\n\treturn { data: toUniverse({ id, body, owner: ownerResult.data }), success: true };\n}\n\nfunction malformed(statusCode: number, body: unknown): Result<Universe, ApiError> {\n\treturn {\n\t\terr: new ApiError(MALFORMED_MESSAGE, {\n\t\t\tdetails: body as JSONValue | undefined,\n\t\t\tstatusCode,\n\t\t}),\n\t\tsuccess: false,\n\t};\n}\n\nfunction extractRootPlaceId(rootPlace: string | undefined): string | undefined {\n\tif (rootPlace === undefined) {\n\t\treturn undefined;\n\t}\n\n\tconst match = ROOT_PLACE_PATH_PATTERN.exec(rootPlace);\n\treturn match?.[1];\n}\n\nfunction toSocialLink(wire: SocialLinkWire | undefined): SocialLink | undefined {\n\tif (wire === undefined) {\n\t\treturn undefined;\n\t}\n\n\treturn { title: wire.title, uri: wire.uri };\n}\n\nfunction toUniverse(args: ToUniverseArgs): Universe {\n\tconst { id, body, owner } = args;\n\treturn {\n\t\tid,\n\t\tageRating: AGE_RATING_MAP[body.ageRating],\n\t\tconsoleEnabled: body.consoleEnabled ?? false,\n\t\tcreatedAt: new Date(body.createTime),\n\t\tdescription: body.description,\n\t\tdesktopEnabled: body.desktopEnabled ?? false,\n\t\tdiscordSocialLink: toSocialLink(body.discordSocialLink),\n\t\tdisplayName: body.displayName,\n\t\tfacebookSocialLink: toSocialLink(body.facebookSocialLink),\n\t\tguildedSocialLink: toSocialLink(body.guildedSocialLink),\n\t\tmobileEnabled: body.mobileEnabled ?? false,\n\t\towner,\n\t\tprivateServerPriceRobux: body.privateServerPriceRobux ?? undefined,\n\t\trobloxGroupSocialLink: toSocialLink(body.robloxGroupSocialLink),\n\t\trootPlaceId: extractRootPlaceId(body.rootPlace),\n\t\ttabletEnabled: body.tabletEnabled ?? false,\n\t\ttwitchSocialLink: toSocialLink(body.twitchSocialLink),\n\t\ttwitterSocialLink: toSocialLink(body.twitterSocialLink),\n\t\tupdatedAt: new Date(body.updateTime),\n\t\tvisibility: VISIBILITY_MAP[body.visibility],\n\t\tvoiceChatEnabled: body.voiceChatEnabled ?? false,\n\t\tvrEnabled: body.vrEnabled ?? false,\n\t\tyoutubeSocialLink: toSocialLink(body.youtubeSocialLink),\n\t};\n}\n\nfunction isVisibilityWire(value: unknown): value is VisibilityWire {\n\treturn value === \"PRIVATE\" || value === \"PUBLIC\" || value === \"VISIBILITY_UNSPECIFIED\";\n}\n\nfunction isAgeRatingWire(value: unknown): value is AgeRatingWire {\n\treturn (\n\t\tvalue === \"AGE_RATING_13_PLUS\" ||\n\t\tvalue === \"AGE_RATING_17_PLUS\" ||\n\t\tvalue === \"AGE_RATING_9_PLUS\" ||\n\t\tvalue === \"AGE_RATING_ALL\" ||\n\t\tvalue === \"AGE_RATING_UNSPECIFIED\"\n\t);\n}\n\nfunction hasValidRequiredFields(body: Record<string, unknown>): boolean {\n\treturn (\n\t\ttypeof body[\"path\"] === \"string\" &&\n\t\tisDateTimeString(body[\"createTime\"]) &&\n\t\tisDateTimeString(body[\"updateTime\"]) &&\n\t\ttypeof body[\"displayName\"] === \"string\" &&\n\t\ttypeof body[\"description\"] === \"string\" &&\n\t\tisVisibilityWire(body[\"visibility\"]) &&\n\t\tisAgeRatingWire(body[\"ageRating\"])\n\t);\n}\n\nfunction isSocialLinkWire(value: unknown): value is SocialLinkWire {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\treturn typeof value[\"title\"] === \"string\" && typeof value[\"uri\"] === \"string\";\n}\n\nfunction isOptionalSocialLink(value: unknown): boolean {\n\treturn value === undefined || value === null || isSocialLinkWire(value);\n}\n\nfunction isOptionalBoolean(value: unknown): boolean {\n\treturn value === undefined || value === null || typeof value === \"boolean\";\n}\n\nfunction hasValidOptionalFields(body: Record<string, unknown>): boolean {\n\tconst priceField = body[\"privateServerPriceRobux\"] ?? undefined;\n\tif (priceField !== undefined && typeof priceField !== \"number\") {\n\t\treturn false;\n\t}\n\n\tconst rootPlace = body[\"rootPlace\"] ?? undefined;\n\tif (rootPlace !== undefined && typeof rootPlace !== \"string\") {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\tisOptionalBoolean(body[\"voiceChatEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"desktopEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"mobileEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"tabletEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"consoleEnabled\"]) &&\n\t\tisOptionalBoolean(body[\"vrEnabled\"]) &&\n\t\tisOptionalSocialLink(body[\"facebookSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"twitterSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"youtubeSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"twitchSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"discordSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"robloxGroupSocialLink\"]) &&\n\t\tisOptionalSocialLink(body[\"guildedSocialLink\"])\n\t);\n}\n\nfunction isUniverseWire(body: unknown): body is UniverseWire {\n\tif (!isRecord(body)) {\n\t\treturn false;\n\t}\n\n\treturn hasValidRequiredFields(body) && hasValidOptionalFields(body);\n}\n\nfunction extractOwnerId(resourcePath: string): string | undefined {\n\tconst match = OWNER_PATH_PATTERN.exec(resourcePath);\n\treturn match?.[1];\n}\n\nfunction resolveOwner(body: UniverseWire): Result<UniverseOwner, undefined> {\n\tif (typeof body.user === \"string\") {\n\t\tconst id = extractOwnerId(body.user);\n\t\tif (id !== undefined) {\n\t\t\treturn { data: { id, kind: \"user\" }, success: true };\n\t\t}\n\t}\n\n\tif (typeof body.group === \"string\") {\n\t\tconst id = extractOwnerId(body.group);\n\t\tif (id !== undefined) {\n\t\t\treturn { data: { id, kind: \"group\" }, success: true };\n\t\t}\n\t}\n\n\treturn { err: undefined, success: false };\n}\n","// The legacy `{gameId}` URL segment is in fact the universe ID; the public API\n// takes `universeId` and substitutes it into the path.\n\nimport type { HttpRequest } from \"../../../internal/http/types.ts\";\nimport { toBlob } from \"../../../internal/utils/to-blob.ts\";\nimport type {\n\tDeleteExperienceIconParameters,\n\tListExperienceIconsParameters,\n\tUploadExperienceIconParameters,\n} from \"./types.ts\";\n\n/**\n * Builds a `POST` request for the localized \"upload experience icon\"\n * endpoint. A successful upload replaces any existing icon for the same\n * `(universeId, languageCode)` pair.\n *\n * @param parameters - Universe and language identifiers plus the image\n * bytes to upload.\n * @returns A pure {@link HttpRequest} describing the upload call.\n */\nexport function buildUploadIconRequest(parameters: UploadExperienceIconParameters): HttpRequest {\n\tconst body = new FormData();\n\t// The legacy game-icon endpoint reads the upload from `request.files`.\n\tbody.append(\"request.files\", toBlob(parameters.image));\n\n\treturn {\n\t\tbody,\n\t\tmethod: \"POST\",\n\t\turl: `/legacy-game-internationalization/v1/game-icon/games/${parameters.universeId}/language-codes/${parameters.languageCode}`,\n\t};\n}\n\n/**\n * Builds a `DELETE` request for the localized \"delete experience icon\"\n * endpoint. Removing the source-language icon is rejected server-side;\n * deleting the icon for a non-source language clears that translation.\n *\n * @param parameters - Universe and language identifiers of the icon to\n * delete.\n * @returns A pure {@link HttpRequest} describing the delete call.\n */\nexport function buildDeleteIconRequest(parameters: DeleteExperienceIconParameters): HttpRequest {\n\treturn {\n\t\tmethod: \"DELETE\",\n\t\turl: `/legacy-game-internationalization/v1/game-icon/games/${parameters.universeId}/language-codes/${parameters.languageCode}`,\n\t};\n}\n\n/**\n * Builds a `GET` request for the \"list experience icons\" endpoint. The\n * server returns one entry per locale that has an icon registered.\n *\n * @param parameters - Universe identifier whose icons to list.\n * @returns A pure {@link HttpRequest} describing the list call.\n */\nexport function buildListIconsRequest(parameters: ListExperienceIconsParameters): HttpRequest {\n\treturn {\n\t\tmethod: \"GET\",\n\t\turl: `/legacy-game-internationalization/v1/game-icon/games/${parameters.universeId}`,\n\t};\n}\n","import type { OperationLimit } from \"../../../internal/http/rate-limit-queue.ts\";\n\n/**\n * Per-second request ceiling for every game-icon Operation bound on\n * `UniversesClient.icon`. The legacy `gameinternationalization` service caps\n * each API key at 100 requests per minute *shared across the entire service*\n * (see the `x-roblox-rate-limits` extension on every operation in the\n * vendored Open Cloud spec), so all methods queue against the same operation\n * key.\n */\nexport const ICON_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: 100 / 60,\n\toperationKey: \"experience-icon\",\n});\n\n/**\n * Scopes required for every game-icon operation, sourced from\n * `x-roblox-scopes` on the legacy `gameinternationalization` icon\n * endpoints in the vendored OpenAPI schema.\n */\nexport const ICON_REQUIRED_SCOPES: ReadonlyArray<string> = Object.freeze([\n\t\"legacy-universe:manage\",\n]);\n","import type { HttpResponse } from \"../../../client/types.ts\";\nimport { ApiError } from \"../../../errors/api-error.ts\";\nimport { isRecord } from \"../../../internal/utils/is-record.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type { ExperienceIcon } from \"./types.ts\";\nimport type { GameIconListWire, GameIconState, GetGameIconResponseWire } from \"./wire.ts\";\n\n/**\n * Parses a successful icon-list response into a public array of\n * {@link ExperienceIcon} entries.\n *\n * @param response - The full {@link HttpResponse} from the Open Cloud API.\n * @returns A success result wrapping the converted icon list, or an\n * `ApiError` when the body does not match the wire schema.\n */\nexport function parseIconListResponse(\n\tresponse: HttpResponse,\n): Result<ReadonlyArray<ExperienceIcon>, ApiError> {\n\tconst { body, status: statusCode } = response;\n\n\tif (!isGameIconListWire(body)) {\n\t\treturn {\n\t\t\terr: new ApiError(\"Malformed icon list response\", {\n\t\t\t\tdetails: body as JSONValue | undefined,\n\t\t\t\tstatusCode,\n\t\t\t}),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tdata: body.data.map(toExperienceIcon),\n\t\tsuccess: true,\n\t};\n}\n\nfunction isGameIconState(value: unknown): value is GameIconState {\n\treturn (\n\t\tvalue === \"Approved\" ||\n\t\tvalue === \"Error\" ||\n\t\tvalue === \"PendingReview\" ||\n\t\tvalue === \"Rejected\" ||\n\t\tvalue === \"UnAvailable\"\n\t);\n}\n\nfunction isGetGameIconResponseWire(value: unknown): value is GetGameIconResponseWire {\n\tif (!isRecord(value)) {\n\t\treturn false;\n\t}\n\n\treturn (\n\t\ttypeof value[\"imageId\"] === \"string\" &&\n\t\ttypeof value[\"imageUrl\"] === \"string\" &&\n\t\ttypeof value[\"languageCode\"] === \"string\" &&\n\t\tisGameIconState(value[\"state\"])\n\t);\n}\n\nfunction isGameIconListWire(body: unknown): body is GameIconListWire {\n\tif (!isRecord(body)) {\n\t\treturn false;\n\t}\n\n\tconst { data } = body;\n\tif (!Array.isArray(data)) {\n\t\treturn false;\n\t}\n\n\treturn data.every(isGetGameIconResponseWire);\n}\n\nfunction toExperienceIcon(wire: GetGameIconResponseWire): ExperienceIcon {\n\treturn {\n\t\timageId: wire.imageId,\n\t\timageUrl: wire.imageUrl,\n\t\tlanguageCode: wire.languageCode,\n\t\tstate: wire.state,\n\t};\n}\n","import { ValidationError } from \"../../../errors/validation.ts\";\nimport type { HttpRequest } from \"../../../internal/http/types.ts\";\nimport { toBlob } from \"../../../internal/utils/to-blob.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type {\n\tDeleteExperienceThumbnailParameters,\n\tReorderExperienceThumbnailsParameters,\n\tUploadExperienceThumbnailParameters,\n} from \"./types.ts\";\n\ntype ParsedIdsResult = Result<ReadonlyArray<number>, ValidationError>;\n\nconst POSITIVE_INTEGER_PATTERN = /^[1-9]\\d*$/;\n\n/**\n * Builds a `POST` request for the localized \"upload experience thumbnail\"\n * endpoint. Each successful upload appends a new entry to the carousel.\n *\n * @param parameters - Universe and language identifiers plus the image\n * bytes to upload.\n * @returns A pure {@link HttpRequest} describing the upload call.\n */\nexport function buildUploadThumbnailRequest(\n\tparameters: UploadExperienceThumbnailParameters,\n): HttpRequest {\n\tconst body = new FormData();\n\t// The legacy game-thumbnails endpoint reads the upload from\n\t// `gameThumbnailRequest.files`, distinct from game-icon's `request.files`.\n\tbody.append(\"gameThumbnailRequest.files\", toBlob(parameters.image));\n\n\treturn {\n\t\tbody,\n\t\tmethod: \"POST\",\n\t\t// The `{gameId}` URL segment in this legacy path is in fact the\n\t\t// universe ID; the package surfaces only `universeId`.\n\t\turl: `/legacy-game-internationalization/v1/game-thumbnails/games/${parameters.universeId}/language-codes/${parameters.languageCode}/image`,\n\t};\n}\n\n/**\n * Builds a `DELETE` request for the \"delete experience thumbnail\" endpoint.\n *\n * @param parameters - Universe, language, and image identifiers of the\n * thumbnail to delete.\n * @returns A pure {@link HttpRequest} describing the delete call.\n */\nexport function buildDeleteThumbnailRequest(\n\tparameters: DeleteExperienceThumbnailParameters,\n): HttpRequest {\n\treturn {\n\t\tmethod: \"DELETE\",\n\t\turl: `/legacy-game-internationalization/v1/game-thumbnails/games/${parameters.universeId}/language-codes/${parameters.languageCode}/images/${parameters.imageId}`,\n\t};\n}\n\n/**\n * Builds a `POST` request for the \"reorder experience thumbnails\" endpoint.\n * Validates each supplied image ID at the wire boundary so a typo cannot\n * silently serialize as JSON `null` and corrupt the request.\n *\n * @param parameters - Universe, language, and the desired display order.\n * @returns A success result wrapping the request, or a\n * {@link ValidationError} when `orderedImageIds` is empty or any ID is not\n * a positive integer within the safe-integer range.\n */\nexport function buildReorderThumbnailsRequest(\n\tparameters: ReorderExperienceThumbnailsParameters,\n): Result<HttpRequest, ValidationError> {\n\tconst { languageCode, orderedImageIds, universeId } = parameters;\n\n\tconst idsResult = parseOrderedImageIds(orderedImageIds);\n\tif (!idsResult.success) {\n\t\treturn idsResult;\n\t}\n\n\treturn {\n\t\tdata: {\n\t\t\tbody: { mediaAssetIds: idsResult.data },\n\t\t\tmethod: \"POST\",\n\t\t\turl: `/legacy-game-internationalization/v1/game-thumbnails/games/${universeId}/language-codes/${languageCode}/images/order`,\n\t\t},\n\t\tsuccess: true,\n\t};\n}\n\nfunction parseImageId(value: string): number | undefined {\n\tif (!POSITIVE_INTEGER_PATTERN.test(value)) {\n\t\treturn undefined;\n\t}\n\n\tconst parsed = Number(value);\n\tif (!Number.isSafeInteger(parsed)) {\n\t\treturn undefined;\n\t}\n\n\treturn parsed;\n}\n\nfunction appendParsedId(accumulator: ParsedIdsResult, id: string): ParsedIdsResult {\n\tif (!accumulator.success) {\n\t\treturn accumulator;\n\t}\n\n\tconst parsed = parseImageId(id);\n\tif (parsed === undefined) {\n\t\treturn {\n\t\t\terr: new ValidationError(\n\t\t\t\t`orderedImageIds entry ${JSON.stringify(id)} is not a positive integer ID`,\n\t\t\t\t{ code: \"invalid_image_id\" },\n\t\t\t),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn { data: [...accumulator.data, parsed], success: true };\n}\n\nfunction parseOrderedImageIds(orderedImageIds: ReadonlyArray<string>): ParsedIdsResult {\n\tif (orderedImageIds.length === 0) {\n\t\treturn {\n\t\t\terr: new ValidationError(\"orderedImageIds must contain at least one image ID\", {\n\t\t\t\tcode: \"empty_image_ids\",\n\t\t\t}),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn orderedImageIds.reduce<ParsedIdsResult>(appendParsedId, { data: [], success: true });\n}\n","import type { OperationLimit } from \"../../../internal/http/rate-limit-queue.ts\";\n\n/**\n * Per-second request ceiling for every game-thumbnails Operation bound on\n * `UniversesClient.thumbnails`. The legacy `gameinternationalization`\n * service caps each API key at 100 requests per minute *shared across the\n * entire service* (see the `x-roblox-rate-limits` extension on every\n * operation in the vendored Open Cloud spec), so all methods queue against\n * the same operation key.\n */\nexport const THUMBNAILS_OPERATION_LIMIT: OperationLimit = Object.freeze({\n\tmaxPerSecond: 100 / 60,\n\toperationKey: \"experience-thumbnails\",\n});\n\n/**\n * Scopes required for every game-thumbnails operation, sourced from\n * `x-roblox-scopes` on the legacy `gameinternationalization` thumbnail\n * endpoints in the vendored OpenAPI schema.\n */\nexport const THUMBNAILS_REQUIRED_SCOPES: ReadonlyArray<string> = Object.freeze([\n\t\"legacy-universe:manage\",\n]);\n","import type { HttpResponse } from \"../../../client/types.ts\";\nimport { ApiError } from \"../../../errors/api-error.ts\";\nimport { isRecord } from \"../../../internal/utils/is-record.ts\";\nimport type { Result } from \"../../../types.ts\";\nimport type { UploadedExperienceThumbnail } from \"./types.ts\";\nimport type { GameThumbnailUploadWire } from \"./wire.ts\";\n\n/**\n * Parses a successful thumbnail-upload response into the public\n * {@link UploadedExperienceThumbnail} shape, returning a {@link Result}\n * so callers can handle malformed payloads without exceptions.\n *\n * @param response - The full {@link HttpResponse} from the Open Cloud API.\n * @returns A success result wrapping the converted upload, or an\n * `ApiError` when the body does not match the wire schema.\n */\nexport function parseThumbnailUploadResponse(\n\tresponse: HttpResponse,\n): Result<UploadedExperienceThumbnail, ApiError> {\n\tconst { body, status: statusCode } = response;\n\n\tif (!isGameThumbnailUploadWire(body)) {\n\t\treturn {\n\t\t\terr: new ApiError(\"Malformed thumbnail upload response\", {\n\t\t\t\tdetails: body as JSONValue | undefined,\n\t\t\t\tstatusCode,\n\t\t\t}),\n\t\t\tsuccess: false,\n\t\t};\n\t}\n\n\treturn {\n\t\tdata: { mediaAssetId: body.mediaAssetId },\n\t\tsuccess: true,\n\t};\n}\n\nfunction isGameThumbnailUploadWire(body: unknown): body is GameThumbnailUploadWire {\n\tif (!isRecord(body)) {\n\t\treturn false;\n\t}\n\n\treturn typeof body[\"mediaAssetId\"] === \"string\";\n}\n","import type { OpenCloudClientOptions, RequestOptions } from \"../../client/types.ts\";\nimport { buildGetRequest, buildUpdateRequest } from \"../../domains/cloud-v2/universes/builders.ts\";\nimport {\n\tGET_OPERATION_LIMIT,\n\tUPDATE_OPERATION_LIMIT,\n\tUPDATE_REQUIRED_SCOPES,\n} from \"../../domains/cloud-v2/universes/operations.ts\";\nimport { parseUniverseResponse } from \"../../domains/cloud-v2/universes/parsers.ts\";\nimport type {\n\tGetUniverseParameters,\n\tUniverse,\n\tUpdateUniverseParameters,\n} from \"../../domains/cloud-v2/universes/types.ts\";\nimport {\n\tbuildDeleteIconRequest,\n\tbuildListIconsRequest,\n\tbuildUploadIconRequest,\n} from \"../../domains/game-internationalization/game-icon/builders.ts\";\nimport {\n\tICON_OPERATION_LIMIT,\n\tICON_REQUIRED_SCOPES,\n} from \"../../domains/game-internationalization/game-icon/operations.ts\";\nimport { parseIconListResponse } from \"../../domains/game-internationalization/game-icon/parsers.ts\";\nimport type {\n\tDeleteExperienceIconParameters,\n\tExperienceIcon,\n\tListExperienceIconsParameters,\n\tUploadExperienceIconParameters,\n} from \"../../domains/game-internationalization/game-icon/types.ts\";\nimport {\n\tbuildDeleteThumbnailRequest,\n\tbuildReorderThumbnailsRequest,\n\tbuildUploadThumbnailRequest,\n} from \"../../domains/game-internationalization/game-thumbnails/builders.ts\";\nimport {\n\tTHUMBNAILS_OPERATION_LIMIT,\n\tTHUMBNAILS_REQUIRED_SCOPES,\n} from \"../../domains/game-internationalization/game-thumbnails/operations.ts\";\nimport { parseThumbnailUploadResponse } from \"../../domains/game-internationalization/game-thumbnails/parsers.ts\";\nimport type {\n\tDeleteExperienceThumbnailParameters,\n\tReorderExperienceThumbnailsParameters,\n\tUploadedExperienceThumbnail,\n\tUploadExperienceThumbnailParameters,\n} from \"../../domains/game-internationalization/game-thumbnails/types.ts\";\nimport type { OpenCloudError } from \"../../errors/base.ts\";\nimport { CREATE_METHOD_DEFAULTS, IDEMPOTENT_METHOD_DEFAULTS } from \"../../internal/http/retry.ts\";\nimport type { HttpRequest } from \"../../internal/http/types.ts\";\nimport {\n\tokRequest,\n\tparseEmptyResponse,\n\tResourceClient,\n\ttype ResourceMethodSpec,\n} from \"../../internal/resource-client.ts\";\nimport type { Result } from \"../../types.ts\";\n\nconst GET_SPEC: ResourceMethodSpec<GetUniverseParameters, Universe> = Object.freeze({\n\tbuildRequest: buildGetRequest,\n\tmethodDefaults: {},\n\tmethodKind: \"idempotent\",\n\toperationLimit: GET_OPERATION_LIMIT,\n\tparse: parseUniverseResponse,\n});\n\nconst UPDATE_SPEC: ResourceMethodSpec<UpdateUniverseParameters, Universe> = Object.freeze({\n\tbuildRequest: buildUpdateRequest,\n\tmethodDefaults: {},\n\tmethodKind: \"idempotent\",\n\toperationLimit: UPDATE_OPERATION_LIMIT,\n\tparse: parseUniverseResponse,\n\trequiredScopes: UPDATE_REQUIRED_SCOPES,\n});\n\nfunction buildIconUploadOkRequest(\n\tparameters: UploadExperienceIconParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildUploadIconRequest(parameters));\n}\n\nfunction buildIconDeleteOkRequest(\n\tparameters: DeleteExperienceIconParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildDeleteIconRequest(parameters));\n}\n\nfunction buildIconListOkRequest(\n\tparameters: ListExperienceIconsParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildListIconsRequest(parameters));\n}\n\nconst ICON_UPLOAD_SPEC: ResourceMethodSpec<UploadExperienceIconParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildIconUploadOkRequest,\n\t\tmethodDefaults: CREATE_METHOD_DEFAULTS,\n\t\tmethodKind: \"create\",\n\t\toperationLimit: ICON_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: ICON_REQUIRED_SCOPES,\n\t});\n\nconst ICON_DELETE_SPEC: ResourceMethodSpec<DeleteExperienceIconParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildIconDeleteOkRequest,\n\t\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\t\tmethodKind: \"idempotent\",\n\t\toperationLimit: ICON_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: ICON_REQUIRED_SCOPES,\n\t});\n\nconst ICON_LIST_SPEC: ResourceMethodSpec<\n\tListExperienceIconsParameters,\n\tReadonlyArray<ExperienceIcon>\n> = Object.freeze({\n\tbuildRequest: buildIconListOkRequest,\n\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\tmethodKind: \"idempotent\",\n\toperationLimit: ICON_OPERATION_LIMIT,\n\tparse: parseIconListResponse,\n\trequiredScopes: ICON_REQUIRED_SCOPES,\n});\n\nfunction buildThumbnailUploadOkRequest(\n\tparameters: UploadExperienceThumbnailParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildUploadThumbnailRequest(parameters));\n}\n\nfunction buildThumbnailDeleteOkRequest(\n\tparameters: DeleteExperienceThumbnailParameters,\n): Result<HttpRequest, OpenCloudError> {\n\treturn okRequest(buildDeleteThumbnailRequest(parameters));\n}\n\nconst THUMBNAIL_UPLOAD_SPEC: ResourceMethodSpec<\n\tUploadExperienceThumbnailParameters,\n\tUploadedExperienceThumbnail\n> = Object.freeze({\n\tbuildRequest: buildThumbnailUploadOkRequest,\n\tmethodDefaults: CREATE_METHOD_DEFAULTS,\n\tmethodKind: \"create\",\n\toperationLimit: THUMBNAILS_OPERATION_LIMIT,\n\tparse: parseThumbnailUploadResponse,\n\trequiredScopes: THUMBNAILS_REQUIRED_SCOPES,\n});\n\nconst THUMBNAIL_DELETE_SPEC: ResourceMethodSpec<DeleteExperienceThumbnailParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildThumbnailDeleteOkRequest,\n\t\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\t\tmethodKind: \"idempotent\",\n\t\toperationLimit: THUMBNAILS_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: THUMBNAILS_REQUIRED_SCOPES,\n\t});\n\nconst THUMBNAIL_REORDER_SPEC: ResourceMethodSpec<ReorderExperienceThumbnailsParameters, undefined> =\n\tObject.freeze({\n\t\tbuildRequest: buildReorderThumbnailsRequest,\n\t\tmethodDefaults: IDEMPOTENT_METHOD_DEFAULTS,\n\t\tmethodKind: \"idempotent\",\n\t\toperationLimit: THUMBNAILS_OPERATION_LIMIT,\n\t\tparse: parseEmptyResponse,\n\t\trequiredScopes: THUMBNAILS_REQUIRED_SCOPES,\n\t});\n\ninterface UniverseIconHandle {\n\t/**\n\t * Deletes the localized icon registered against a universe for a given\n\t * language. Removing the source-language icon is rejected server-side;\n\t * consumers must replace it via {@link UniverseIconHandle.upload}\n\t * instead.\n\t *\n\t * @param parameters - Universe and language identifiers of the icon to\n\t * delete.\n\t * @param options - Optional per-request overrides.\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\tdelete: (\n\t\tparameters: DeleteExperienceIconParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n\t/**\n\t * Lists every localized icon registered against an experience. The\n\t * server returns one entry per locale that has an icon registered.\n\t *\n\t * @param parameters - Universe identifier whose icons to list.\n\t * @param options - Optional per-request overrides.\n\t * @returns A {@link Result} wrapping the parsed array of\n\t * {@link ExperienceIcon} entries or the {@link OpenCloudError} that\n\t * caused the request to fail.\n\t */\n\tlist: (\n\t\tparameters: ListExperienceIconsParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<ReadonlyArray<ExperienceIcon>, OpenCloudError>>;\n\t/**\n\t * Uploads or replaces the localized icon for an experience. A\n\t * subsequent upload for the same `(universeId, languageCode)` pair\n\t * replaces the existing icon for that locale.\n\t *\n\t * No default request timeout applies to this upload; pass `options.timeout`\n\t * to set a per-call deadline.\n\t *\n\t * @param parameters - Universe and language identifiers plus the image\n\t * bytes to upload.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\tupload: (\n\t\tparameters: UploadExperienceIconParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n}\n\ninterface UniverseThumbnailsHandle {\n\t/**\n\t * Deletes a single thumbnail by media asset ID. Idempotent: deleting an\n\t * already-removed thumbnail surfaces the server's 404 unchanged.\n\t *\n\t * @param parameters - Universe, language, and image identifiers of the\n\t * thumbnail to delete.\n\t * @param options - Optional per-request overrides.\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\tdelete: (\n\t\tparameters: DeleteExperienceThumbnailParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n\t/**\n\t * Reorders the localized thumbnail carousel. The supplied\n\t * `orderedImageIds` describes the desired display order from first to\n\t * last. Image IDs must be positive integers within the safe-integer\n\t * range; invalid input is rejected with a {@link OpenCloudError} of\n\t * kind `ValidationError` before any HTTP round-trip.\n\t *\n\t * @param parameters - Universe, language, and the desired display order.\n\t * @param options - Optional per-request overrides.\n\t * @returns A success {@link Result} with no payload, or the\n\t * {@link OpenCloudError} that caused the request to fail.\n\t */\n\treorder: (\n\t\tparameters: ReorderExperienceThumbnailsParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<undefined, OpenCloudError>>;\n\t/**\n\t * Uploads a new thumbnail and appends it to the localized carousel. Use\n\t * {@link UniverseThumbnailsHandle.reorder} after multiple uploads to\n\t * set the display order.\n\t *\n\t * No default request timeout applies to this upload; pass `options.timeout`\n\t * to set a per-call deadline.\n\t *\n\t * @param parameters - Universe and language identifiers plus the image\n\t * bytes to upload.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A {@link Result} wrapping the parsed\n\t * {@link UploadedExperienceThumbnail} or the {@link OpenCloudError}\n\t * that caused the request to fail.\n\t */\n\tupload: (\n\t\tparameters: UploadExperienceThumbnailParameters,\n\t\toptions?: RequestOptions,\n\t) => Promise<Result<UploadedExperienceThumbnail, OpenCloudError>>;\n}\n\n/**\n * Public client for the Roblox Open Cloud `Universe` resource. Wires\n * the request builders, the injected\n * {@link OpenCloudClientOptions.httpClient}, and the response parser\n * into a single ergonomic surface. Every method returns a\n * {@link Result} so callers handle failure explicitly; no thrown\n * {@link OpenCloudError} ever escapes the client.\n *\n * Partial updates use a Google-style `updateMask` query string derived\n * from the keys present on the update parameters. Setting a clearable\n * field (`privateServerPriceRobux` or any social link) to `undefined`\n * sends JSON `null` for that field so the server clears the\n * corresponding value.\n *\n * Localized experience-icon and experience-thumbnail Operations are\n * bound on the {@link UniversesClient.icon} and\n * {@link UniversesClient.thumbnails} Operation Groups so callers reach\n * for one client per universe.\n *\n * @since 0.1.0\n *\n * @example\n *\n * ```ts\n * import { UniversesClient } from \"@bedrock-rbx/ocale/universes\";\n *\n * const client = new UniversesClient({ apiKey: \"your-key\" });\n * expect(client).toBeInstanceOf(UniversesClient);\n * ```\n */\nexport class UniversesClient {\n\treadonly #inner: ResourceClient;\n\n\t/**\n\t * Operation Group exposing the localized experience-icon\n\t * Operations (`upload`, `delete`, `list`) backed by the\n\t * `legacy-game-internationalization` domain. Shares the parent\n\t * client's HTTP, rate-limit, and retry plumbing.\n\t */\n\tpublic readonly icon: UniverseIconHandle;\n\t/**\n\t * Operation Group exposing the localized experience-thumbnail\n\t * Operations (`upload`, `delete`, `reorder`) backed by the\n\t * `legacy-game-internationalization` domain. No list-thumbnails\n\t * endpoint is bridged; consumers must track uploaded\n\t * `mediaAssetId`s in their own state store to reconcile against\n\t * the existing carousel. Shares the parent client's HTTP,\n\t * rate-limit, and retry plumbing.\n\t */\n\tpublic readonly thumbnails: UniverseThumbnailsHandle;\n\n\t/**\n\t * Creates a new {@link UniversesClient}. Configuration is frozen\n\t * on construction; per-request overrides are accepted on each\n\t * method.\n\t *\n\t * @param options - Client-level configuration including the API key.\n\t */\n\tconstructor(options: OpenCloudClientOptions) {\n\t\tthis.#inner = new ResourceClient(options);\n\t\tthis.icon = createIconHandle(this.#inner);\n\t\tthis.thumbnails = createThumbnailsHandle(this.#inner);\n\t}\n\n\t/**\n\t * Fetches the current configuration of a universe.\n\t *\n\t * @param parameters - The universe identifier.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A {@link Result} wrapping the parsed {@link Universe}\n\t * or the {@link OpenCloudError} that caused the request to fail.\n\t */\n\tpublic async get(\n\t\tparameters: GetUniverseParameters,\n\t\toptions?: RequestOptions,\n\t): Promise<Result<Universe, OpenCloudError>> {\n\t\treturn this.#inner.execute({ options, parameters, spec: GET_SPEC });\n\t}\n\n\t/**\n\t * Partially updates a universe's configuration. The fields\n\t * supplied on `parameters` (excluding `universeId`) are forwarded\n\t * to the server via a Google-style `updateMask`; unmentioned\n\t * fields are left untouched.\n\t *\n\t * @param parameters - The universe identifier and the fields to\n\t * update. At least one updatable field must be supplied.\n\t * @param options - Optional per-request overrides (e.g. A different\n\t * {@link OpenCloudClientOptions.apiKey} for this call only).\n\t * @returns A {@link Result} wrapping the parsed {@link Universe}\n\t * or the {@link OpenCloudError} that caused the request to fail.\n\t */\n\tpublic async update(\n\t\tparameters: UpdateUniverseParameters,\n\t\toptions?: RequestOptions,\n\t): Promise<Result<Universe, OpenCloudError>> {\n\t\treturn this.#inner.execute({ options, parameters, spec: UPDATE_SPEC });\n\t}\n}\n\nfunction createIconHandle(inner: ResourceClient): UniverseIconHandle {\n\treturn {\n\t\tasync delete(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: ICON_DELETE_SPEC });\n\t\t},\n\t\tasync list(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: ICON_LIST_SPEC });\n\t\t},\n\t\tasync upload(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: ICON_UPLOAD_SPEC });\n\t\t},\n\t};\n}\n\nfunction createThumbnailsHandle(inner: ResourceClient): UniverseThumbnailsHandle {\n\treturn {\n\t\tasync delete(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: THUMBNAIL_DELETE_SPEC });\n\t\t},\n\t\tasync reorder(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: THUMBNAIL_REORDER_SPEC });\n\t\t},\n\t\tasync upload(parameters, options) {\n\t\t\treturn inner.execute({ options, parameters, spec: THUMBNAIL_UPLOAD_SPEC });\n\t\t},\n\t};\n}\n"],"mappings":"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"}
@@ -1,10 +1,12 @@
1
- import { i as OpenCloudError } from "./rate-limit-D1q2Js-z.mjs";
1
+ import { i as OpenCloudError } from "./rate-limit-Co9i28qi.mjs";
2
2
  //#region src/errors/validation.ts
3
3
  /**
4
4
  * Thrown locally when caller-supplied input is rejected before any HTTP
5
5
  * round-trip. The `code` discriminator lets consumers branch on local-input
6
6
  * errors separately from server-side errors.
7
7
  *
8
+ * @since 0.1.0
9
+ *
8
10
  * @example
9
11
  *
10
12
  * ```ts
@@ -35,4 +37,4 @@ var ValidationError = class extends OpenCloudError {
35
37
  //#endregion
36
38
  export { ValidationError as t };
37
39
 
38
- //# sourceMappingURL=validation-DkL5KQqz.mjs.map
40
+ //# sourceMappingURL=validation-9oU6qNNQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-9oU6qNNQ.mjs","names":[],"sources":["../src/errors/validation.ts"],"sourcesContent":["import { OpenCloudError } from \"./base.ts\";\n\n/**\n * Closed discriminator for a {@link ValidationError}. Consumers can\n * exhaustively `switch` over this union so TypeScript will refuse to compile\n * if a new variant is added without a handler.\n *\n * @since 0.1.0\n */\nexport type ValidationErrorCode =\n\t| \"empty_body\"\n\t| \"empty_image_ids\"\n\t| \"empty_update\"\n\t| \"format_mismatch\"\n\t| \"incomplete_ref\"\n\t| \"invalid_image_id\";\n\n/**\n * Options for constructing a {@link ValidationError}.\n *\n * @since 0.1.0\n */\nexport interface ValidationErrorOptions extends ErrorOptions {\n\t/** Machine-readable discriminator identifying the validation failure. */\n\tcode: ValidationErrorCode;\n}\n\n/**\n * Thrown locally when caller-supplied input is rejected before any HTTP\n * round-trip. The `code` discriminator lets consumers branch on local-input\n * errors separately from server-side errors.\n *\n * @since 0.1.0\n *\n * @example\n *\n * ```ts\n * import { ValidationError } from \"@bedrock-rbx/ocale\";\n *\n * const error = new ValidationError(\"Place body is empty\", {\n * code: \"empty_body\",\n * });\n *\n * expect(error).toBeInstanceOf(ValidationError);\n * expect(error.code).toBe(\"empty_body\");\n * ```\n */\nexport class ValidationError extends OpenCloudError {\n\tpublic readonly code: ValidationErrorCode;\n\tpublic override readonly name: string = \"ValidationError\";\n\n\t/**\n\t * Creates a new ValidationError.\n\t *\n\t * @param message - Human-readable error description.\n\t * @param options - Error options including the validation failure code.\n\t */\n\tconstructor(message: string, options: ValidationErrorOptions) {\n\t\tsuper(message, options);\n\t\tthis.code = options.code;\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA+CA,IAAa,kBAAb,cAAqC,eAAe;CACnD;CACA,OAAwC;;;;;;;CAQxC,YAAY,SAAiB,SAAiC;EAC7D,MAAM,SAAS,OAAO;EACtB,KAAK,OAAO,QAAQ;CACrB;AACD"}
@@ -1,6 +1,8 @@
1
1
  //#region src/domains/game-internationalization/game-icon/wire.d.ts
2
2
  /**
3
3
  * Image moderation state returned alongside each localized icon.
4
+ *
5
+ * @since 0.1.0
4
6
  */
5
7
  type GameIconState = "Approved" | "Error" | "PendingReview" | "Rejected" | "UnAvailable";
6
8
  /**
@@ -32,4 +34,4 @@ interface GameIconListWire {
32
34
  }
33
35
  //#endregion
34
36
  export { GameIconState as n, GetGameIconResponseWire as r, GameIconListWire as t };
35
- //# sourceMappingURL=wire-CeL6W_V7.d.mts.map
37
+ //# sourceMappingURL=wire-D3K-a-UP.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire-D3K-a-UP.d.mts","names":[],"sources":["../src/domains/game-internationalization/game-icon/wire.ts"],"mappings":";;AAKA;;;;KAAY,aAAA;AAOZ;;;;;AAAA,UAAiB,uBAAA;;WAEP,OAAA;;WAEA,QAAA;EAQO;AAOjB;;;;EAPiB,SAFP,YAAA;;WAEA,KAAA,EAAO,aAAA;AAAA;AASa;;;;AAAA,UAFb,gBAAA;;WAEP,IAAA,EAAM,aAAA,CAAc,uBAAA;AAAA"}