@v-office/website-sdk 1.0.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.
- package/README.md +263 -0
- package/dist/cli.d.mts +1 -0
- package/dist/cli.mjs +337 -0
- package/dist/client-BbAfk-qa.mjs +33672 -0
- package/dist/custom-attribute-ChCbJKf_.mjs +54 -0
- package/dist/errors-2cuUGSvi.mjs +5 -0
- package/dist/index.d.mts +16130 -0
- package/dist/index.mjs +3 -0
- package/dist/operations-BanW36PK.mjs +12616 -0
- package/dist/operations-CHxEQ3jG.mjs +904 -0
- package/dist/parser-D6UAf8Ld.mjs +65 -0
- package/dist/quote-C3HZsFua.mjs +313 -0
- package/dist/quote-Vl6Nutaa.mjs +513 -0
- package/dist/rentals-BFmmp26v.mjs +323 -0
- package/dist/rentals-cQAg5TTW.mjs +403 -0
- package/dist/search-JqA3v_Fx.mjs +342 -0
- package/dist/search-filter-metadata-DZP0-Udc.mjs +4294 -0
- package/dist/to-rental-highlights-BcRa9Odv.mjs +402 -0
- package/dist/translations/shared/de-DE/availability.json +15 -0
- package/dist/translations/shared/de-DE/booking.json +15 -0
- package/dist/translations/shared/de-DE/insurance.json +18 -0
- package/dist/translations/shared/de-DE/quote.json +8 -0
- package/dist/translations/shared/de-DE/reviews.json +11 -0
- package/dist/translations/shared/en-US/availability.json +15 -0
- package/dist/translations/shared/en-US/booking.json +15 -0
- package/dist/translations/shared/en-US/insurance.json +18 -0
- package/dist/translations/shared/en-US/quote.json +8 -0
- package/dist/translations/shared/en-US/reviews.json +11 -0
- package/dist/translations/v10/de-DE/core.json +7027 -0
- package/dist/translations/v10/en-US/core.json +7027 -0
- package/dist/translations/v9/de-DE/core.json +4 -0
- package/dist/translations/v9/de-DE/filter.json +25 -0
- package/dist/translations/v9/de-DE/rental-attribute-categories.json +19 -0
- package/dist/translations/v9/de-DE/rental-attributes.json +451 -0
- package/dist/translations/v9/en-US/core.json +4 -0
- package/dist/translations/v9/en-US/filter.json +25 -0
- package/dist/translations/v9/en-US/rental-attribute-categories.json +19 -0
- package/dist/translations/v9/en-US/rental-attributes.json +451 -0
- package/package.json +90 -0
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
import { S as toAddress, _ as GENERATED_RENTAL_METADATA_CATALOG, b as toLocation, g as toRentalHighlights, h as toRentalType, m as toScope, v as toProperty, x as toImages, y as toDescription } from "./client-BbAfk-qa.mjs";
|
|
2
|
+
import "./errors-2cuUGSvi.mjs";
|
|
3
|
+
import { c as localeToLanguage, s as makeTranslate } from "./parser-D6UAf8Ld.mjs";
|
|
4
|
+
import { t as renderCustomAttributeHighlight } from "./custom-attribute-ChCbJKf_.mjs";
|
|
5
|
+
import { Effect } from "effect";
|
|
6
|
+
//#region src/adapters/v10/parser/rentals/to-rental-attributes.ts
|
|
7
|
+
const RENTAL_ATTRIBUTE_DEFINITIONS = GENERATED_RENTAL_METADATA_CATALOG.attributes;
|
|
8
|
+
const OTHER_CATEGORY = {
|
|
9
|
+
key: "OTHER",
|
|
10
|
+
labelKey: "RentalAttributesCategory.OTHER.label"
|
|
11
|
+
};
|
|
12
|
+
const getSubCategoryMapKey = (categoryKey, subCategoryKey) => `${categoryKey}:${subCategoryKey}`;
|
|
13
|
+
const toRentalAttributes = ({ locale, translations, attributes, customAttributeFilterDefinitions, customAttributes }) => Effect.gen(function* () {
|
|
14
|
+
const language = localeToLanguage(locale);
|
|
15
|
+
const attributesByKey = attributes ?? {};
|
|
16
|
+
const result = [];
|
|
17
|
+
const categoriesByKey = /* @__PURE__ */ new Map();
|
|
18
|
+
const subCategoriesByKey = /* @__PURE__ */ new Map();
|
|
19
|
+
const translate = makeTranslate(translations, locale);
|
|
20
|
+
const getOtherSubCategory = () => Effect.gen(function* () {
|
|
21
|
+
let category = categoriesByKey.get(OTHER_CATEGORY.key);
|
|
22
|
+
if (category == null) {
|
|
23
|
+
category = {
|
|
24
|
+
label: yield* translate(OTHER_CATEGORY.labelKey, OTHER_CATEGORY.key),
|
|
25
|
+
subCategories: []
|
|
26
|
+
};
|
|
27
|
+
categoriesByKey.set(OTHER_CATEGORY.key, category);
|
|
28
|
+
result.push(category);
|
|
29
|
+
}
|
|
30
|
+
const subCategoryMapKey = getSubCategoryMapKey(OTHER_CATEGORY.key, OTHER_CATEGORY.key);
|
|
31
|
+
let subCategory = subCategoriesByKey.get(subCategoryMapKey);
|
|
32
|
+
if (subCategory == null) {
|
|
33
|
+
subCategory = {
|
|
34
|
+
label: category.label,
|
|
35
|
+
items: []
|
|
36
|
+
};
|
|
37
|
+
subCategoriesByKey.set(subCategoryMapKey, subCategory);
|
|
38
|
+
category.subCategories.push(subCategory);
|
|
39
|
+
}
|
|
40
|
+
return subCategory;
|
|
41
|
+
});
|
|
42
|
+
const readValue = (value) => {
|
|
43
|
+
if (typeof value === "string") return value.length > 0 ? value : void 0;
|
|
44
|
+
if (typeof value === "number") return String(value);
|
|
45
|
+
if (typeof value === "object" && value !== null) {
|
|
46
|
+
const localizedValue = value[language];
|
|
47
|
+
return typeof localizedValue === "string" && localizedValue.length > 0 ? localizedValue : void 0;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const readTranslatedValue = (definition, value) => Effect.gen(function* () {
|
|
51
|
+
const displayValue = readValue(value);
|
|
52
|
+
if (displayValue == null) return void 0;
|
|
53
|
+
const option = definition.options?.find((entry) => entry.value === displayValue);
|
|
54
|
+
const translatedValue = option?.labelKey != null ? yield* translate(option.labelKey, option.value) : displayValue;
|
|
55
|
+
return definition.valueSuffix != null ? `${translatedValue} ${definition.valueSuffix}` : translatedValue;
|
|
56
|
+
});
|
|
57
|
+
const renderAttribute = (definition, value) => Effect.gen(function* () {
|
|
58
|
+
const label = definition.labelKey ? yield* translate(definition.labelKey, definition.key) : definition.key;
|
|
59
|
+
if (definition.display === "label_only") return value === true ? label : void 0;
|
|
60
|
+
const displayValue = yield* readTranslatedValue(definition, value);
|
|
61
|
+
if (displayValue == null) return void 0;
|
|
62
|
+
if (definition.display === "label_value") return `${label}: ${displayValue}`;
|
|
63
|
+
if (definition.display === "value_label") return `${displayValue} ${label}`;
|
|
64
|
+
if (definition.display === "value_suffix") return displayValue;
|
|
65
|
+
return definition.formattedKey ? yield* translate(definition.formattedKey, displayValue) : displayValue;
|
|
66
|
+
});
|
|
67
|
+
for (const definition of RENTAL_ATTRIBUTE_DEFINITIONS) {
|
|
68
|
+
const attribute = yield* renderAttribute(definition, attributesByKey[definition.key]);
|
|
69
|
+
if (attribute == null) continue;
|
|
70
|
+
let category = categoriesByKey.get(definition.category.key);
|
|
71
|
+
if (category == null) {
|
|
72
|
+
category = {
|
|
73
|
+
label: yield* translate(definition.category.labelKey, definition.category.key),
|
|
74
|
+
subCategories: []
|
|
75
|
+
};
|
|
76
|
+
categoriesByKey.set(definition.category.key, category);
|
|
77
|
+
result.push(category);
|
|
78
|
+
}
|
|
79
|
+
const subCategoryKey = definition.subCategory?.key ?? definition.category.key;
|
|
80
|
+
const subCategoryMapKey = getSubCategoryMapKey(definition.category.key, subCategoryKey);
|
|
81
|
+
let subCategory = subCategoriesByKey.get(subCategoryMapKey);
|
|
82
|
+
if (subCategory == null) {
|
|
83
|
+
subCategory = {
|
|
84
|
+
label: definition.subCategory != null ? yield* translate(definition.subCategory.labelKey, definition.subCategory.key) : category.label,
|
|
85
|
+
items: []
|
|
86
|
+
};
|
|
87
|
+
subCategoriesByKey.set(subCategoryMapKey, subCategory);
|
|
88
|
+
category.subCategories.push(subCategory);
|
|
89
|
+
}
|
|
90
|
+
subCategory.items.push(attribute);
|
|
91
|
+
}
|
|
92
|
+
if (customAttributes != null) {
|
|
93
|
+
const customAttributeItems = [];
|
|
94
|
+
for (const definition of customAttributeFilterDefinitions) {
|
|
95
|
+
const attribute = renderCustomAttributeHighlight({
|
|
96
|
+
definitions: customAttributeFilterDefinitions,
|
|
97
|
+
key: definition.key,
|
|
98
|
+
locale,
|
|
99
|
+
value: customAttributes[definition.key]
|
|
100
|
+
});
|
|
101
|
+
if (attribute != null) customAttributeItems.push(attribute);
|
|
102
|
+
}
|
|
103
|
+
if (customAttributeItems.length > 0) (yield* getOtherSubCategory()).items.push(...customAttributeItems);
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
});
|
|
107
|
+
//#endregion
|
|
108
|
+
//#region src/adapters/v10/parser/rentals/to-rental-vicinity.ts
|
|
109
|
+
const RENTAL_VICINITY_DEFINITIONS = GENERATED_RENTAL_METADATA_CATALOG.vicinity;
|
|
110
|
+
const toRentalVicinity = ({ locale, translations, vicinity }) => Effect.gen(function* () {
|
|
111
|
+
const vicinityByKey = vicinity;
|
|
112
|
+
const result = [];
|
|
113
|
+
const categoriesByKey = /* @__PURE__ */ new Map();
|
|
114
|
+
const translate = makeTranslate(translations, locale);
|
|
115
|
+
const readValue = (value) => {
|
|
116
|
+
if (typeof value === "string") return value.length > 0 ? {
|
|
117
|
+
value,
|
|
118
|
+
isNumber: false
|
|
119
|
+
} : void 0;
|
|
120
|
+
if (typeof value === "number") return {
|
|
121
|
+
value: String(value),
|
|
122
|
+
isNumber: true
|
|
123
|
+
};
|
|
124
|
+
};
|
|
125
|
+
const readTranslatedValue = (definition, value) => Effect.gen(function* () {
|
|
126
|
+
const displayValue = readValue(value);
|
|
127
|
+
if (displayValue == null) return void 0;
|
|
128
|
+
const option = definition.options?.find((entry) => entry.value === displayValue.value);
|
|
129
|
+
const translatedValue = option?.labelKey != null ? yield* translate(option.labelKey, option.value) : displayValue.value;
|
|
130
|
+
return definition.valueSuffix != null && displayValue.isNumber ? `${translatedValue}${definition.valueSuffix}` : translatedValue;
|
|
131
|
+
});
|
|
132
|
+
const renderItem = (definition, value) => Effect.gen(function* () {
|
|
133
|
+
const label = definition.labelKey ? yield* translate(definition.labelKey, definition.key) : definition.key;
|
|
134
|
+
if (definition.display === "label_only") return value === true ? label : void 0;
|
|
135
|
+
const displayValue = yield* readTranslatedValue(definition, value);
|
|
136
|
+
if (displayValue == null) return void 0;
|
|
137
|
+
if (definition.display === "label_value") return `${label}: ${displayValue}`;
|
|
138
|
+
if (definition.display === "value_label") return `${displayValue} ${label}`;
|
|
139
|
+
if (definition.display === "value_suffix") return displayValue;
|
|
140
|
+
return definition.formattedKey ? yield* translate(definition.formattedKey, displayValue) : displayValue;
|
|
141
|
+
});
|
|
142
|
+
for (const definition of RENTAL_VICINITY_DEFINITIONS) {
|
|
143
|
+
const item = yield* renderItem(definition, vicinityByKey[definition.key]);
|
|
144
|
+
if (item == null) continue;
|
|
145
|
+
let category = categoriesByKey.get(definition.category.key);
|
|
146
|
+
if (category == null) {
|
|
147
|
+
category = {
|
|
148
|
+
label: yield* translate(definition.category.labelKey, definition.category.key),
|
|
149
|
+
items: []
|
|
150
|
+
};
|
|
151
|
+
categoriesByKey.set(definition.category.key, category);
|
|
152
|
+
result.push(category);
|
|
153
|
+
}
|
|
154
|
+
category.items.push(item);
|
|
155
|
+
}
|
|
156
|
+
return result;
|
|
157
|
+
});
|
|
158
|
+
//#endregion
|
|
159
|
+
//#region src/adapters/v10/parser/rentals/to-room-summary.ts
|
|
160
|
+
const ROOM_SUMMARY_DEFINITIONS = GENERATED_RENTAL_METADATA_CATALOG.roomSummary;
|
|
161
|
+
const toRoomSummary = ({ locale, translations, roomSummary }) => Effect.gen(function* () {
|
|
162
|
+
const translate = makeTranslate(translations, locale);
|
|
163
|
+
const roomSummaryByKey = roomSummary;
|
|
164
|
+
const readValue = (value) => {
|
|
165
|
+
if (typeof value !== "number" || value === 0) return void 0;
|
|
166
|
+
return String(value);
|
|
167
|
+
};
|
|
168
|
+
const renderItem = (definition) => Effect.gen(function* () {
|
|
169
|
+
const value = readValue(roomSummaryByKey[definition.key]);
|
|
170
|
+
if (value == null) return void 0;
|
|
171
|
+
const label = definition.labelKey ? yield* translate(definition.labelKey, definition.key) : definition.key;
|
|
172
|
+
if (definition.display === "label_value") return `${label}: ${value}`;
|
|
173
|
+
if (definition.display === "value_label") return `${value} ${label}`;
|
|
174
|
+
if (definition.display === "value_suffix") return definition.valueSuffix != null ? `${value}${definition.valueSuffix}` : value;
|
|
175
|
+
return value;
|
|
176
|
+
});
|
|
177
|
+
const result = [];
|
|
178
|
+
for (const definition of ROOM_SUMMARY_DEFINITIONS) {
|
|
179
|
+
const item = yield* renderItem(definition);
|
|
180
|
+
if (item != null) result.push(item);
|
|
181
|
+
}
|
|
182
|
+
return result;
|
|
183
|
+
});
|
|
184
|
+
//#endregion
|
|
185
|
+
//#region src/adapters/v10/parser/rentals/to-rooms.ts
|
|
186
|
+
const ROOM_TYPE_KEY_PREFIX = "Room.type.option";
|
|
187
|
+
const ROOM_ATTRIBUTE_KEY_PREFIX = "RoomAttributes";
|
|
188
|
+
const BED_TYPE_KEY_PREFIX = "Bed.type.option";
|
|
189
|
+
const BED_KIND_KEY_PREFIX = "Bed.kind.option";
|
|
190
|
+
const BED_ATTRIBUTE_LABEL_KEYS = {
|
|
191
|
+
childrenOnly: "Bed.childrenOnly.label",
|
|
192
|
+
extraLongBeds: "Bed.extraLongBeds.label",
|
|
193
|
+
openFootsection: "Bed.openFootsection.label",
|
|
194
|
+
raisedBeds: "Bed.raisedBeds.label"
|
|
195
|
+
};
|
|
196
|
+
const toRooms = ({ locale, translations, imageBaseUrl: _imageBaseUrl, rooms }) => Effect.gen(function* () {
|
|
197
|
+
const language = localeToLanguage(locale);
|
|
198
|
+
const result = [];
|
|
199
|
+
const translate = makeTranslate(translations, locale);
|
|
200
|
+
const readLocalizedString = (value) => {
|
|
201
|
+
const localizedValue = value?.[language];
|
|
202
|
+
return localizedValue != null && localizedValue.length > 0 ? localizedValue : void 0;
|
|
203
|
+
};
|
|
204
|
+
const translateOption = (keyPrefix, value) => translate(`${keyPrefix}.${value}`, value);
|
|
205
|
+
const renderRoomAttribute = (key, value) => Effect.gen(function* () {
|
|
206
|
+
const label = yield* translate(`${ROOM_ATTRIBUTE_KEY_PREFIX}.${key}.label`, key);
|
|
207
|
+
if (value === true) return label;
|
|
208
|
+
if (value === false || value == null) return void 0;
|
|
209
|
+
if (typeof value === "number") return key === "squareMeters" ? `${label}: ${value} m²` : `${label}: ${value}`;
|
|
210
|
+
if (typeof value === "string" && value.length > 0) return `${label}: ${yield* translate(`${ROOM_ATTRIBUTE_KEY_PREFIX}.${key}.option.${value}`, value)}`;
|
|
211
|
+
});
|
|
212
|
+
const renderBedAttribute = (key, value) => Effect.gen(function* () {
|
|
213
|
+
if (value !== true) return void 0;
|
|
214
|
+
return yield* translate(BED_ATTRIBUTE_LABEL_KEYS[key], key);
|
|
215
|
+
});
|
|
216
|
+
for (const room of rooms) {
|
|
217
|
+
if (room.type == null) continue;
|
|
218
|
+
const attributes = [];
|
|
219
|
+
if (room.attributes != null) for (const [key, value] of Object.entries(room.attributes)) {
|
|
220
|
+
const item = yield* renderRoomAttribute(key, value);
|
|
221
|
+
if (item != null) attributes.push(item);
|
|
222
|
+
}
|
|
223
|
+
const beds = [];
|
|
224
|
+
for (const bed of room.beds ?? []) {
|
|
225
|
+
const type = bed.type != null ? yield* translateOption(BED_TYPE_KEY_PREFIX, bed.type) : void 0;
|
|
226
|
+
if (type == null) continue;
|
|
227
|
+
const bedValue = { type };
|
|
228
|
+
if (bed.kind != null) bedValue.kind = yield* translateOption(BED_KIND_KEY_PREFIX, bed.kind);
|
|
229
|
+
const bedAttributes = [];
|
|
230
|
+
for (const [key] of Object.entries(BED_ATTRIBUTE_LABEL_KEYS)) {
|
|
231
|
+
const item = yield* renderBedAttribute(key, bed[key]);
|
|
232
|
+
if (item != null) bedAttributes.push(item);
|
|
233
|
+
}
|
|
234
|
+
if (bedAttributes.length > 0) bedValue.attributes = bedAttributes;
|
|
235
|
+
beds.push(bedValue);
|
|
236
|
+
}
|
|
237
|
+
const roomValue = { type: yield* translateOption(ROOM_TYPE_KEY_PREFIX, room.type) };
|
|
238
|
+
const description = readLocalizedString(room.description);
|
|
239
|
+
if (description != null) roomValue.description = description;
|
|
240
|
+
if (attributes.length > 0) roomValue.attributes = attributes;
|
|
241
|
+
if (beds.length > 0) roomValue.beds = beds;
|
|
242
|
+
result.push(roomValue);
|
|
243
|
+
}
|
|
244
|
+
return result;
|
|
245
|
+
});
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/adapters/v10/parser/rentals/to-rental-list-item.ts
|
|
248
|
+
const toRentalRentalsOutput = ({ rental, locale, translations, imageBaseUrl, rentalHighlightPrioritization, rentalPropertyHighlightPrioritization, customAttributeFilterDefinitions, customAttributes }) => Effect.gen(function* () {
|
|
249
|
+
const location = rental.location != null ? toLocation(rental.location) : void 0;
|
|
250
|
+
const images = rental.images != null ? toImages(imageBaseUrl, rental.images, locale) : void 0;
|
|
251
|
+
const address = rental.address != null ? toAddress(rental.address, locale) : void 0;
|
|
252
|
+
const descriptions = rental.descriptions != null ? toDescription(rental.descriptions, locale) : void 0;
|
|
253
|
+
const rentalType = rental.rentalType != null ? yield* toRentalType({
|
|
254
|
+
locale,
|
|
255
|
+
translations,
|
|
256
|
+
rentalType: rental.rentalType
|
|
257
|
+
}) : void 0;
|
|
258
|
+
const scope = rental.scope != null ? yield* toScope({
|
|
259
|
+
locale,
|
|
260
|
+
translations,
|
|
261
|
+
scope: rental.scope
|
|
262
|
+
}) : void 0;
|
|
263
|
+
const rooms = rental.rooms != null ? yield* toRooms({
|
|
264
|
+
locale,
|
|
265
|
+
translations,
|
|
266
|
+
imageBaseUrl,
|
|
267
|
+
rooms: rental.rooms
|
|
268
|
+
}) : void 0;
|
|
269
|
+
const property = rental.property != null ? yield* toProperty({
|
|
270
|
+
locale,
|
|
271
|
+
translations,
|
|
272
|
+
imageBaseUrl,
|
|
273
|
+
propertyHighlightPrioritization: rentalPropertyHighlightPrioritization,
|
|
274
|
+
property: rental.property
|
|
275
|
+
}) : void 0;
|
|
276
|
+
const roomSummary = rental.roomSummary != null ? yield* toRoomSummary({
|
|
277
|
+
locale,
|
|
278
|
+
translations,
|
|
279
|
+
roomSummary: rental.roomSummary
|
|
280
|
+
}) : void 0;
|
|
281
|
+
const attributes = rental.attributes != null || customAttributes != null ? yield* toRentalAttributes({
|
|
282
|
+
locale,
|
|
283
|
+
translations,
|
|
284
|
+
attributes: rental.attributes != null ? rental.attributes : void 0,
|
|
285
|
+
customAttributeFilterDefinitions,
|
|
286
|
+
customAttributes
|
|
287
|
+
}) : void 0;
|
|
288
|
+
const vicinity = rental.vicinity != null ? yield* toRentalVicinity({
|
|
289
|
+
locale,
|
|
290
|
+
translations,
|
|
291
|
+
vicinity: rental.vicinity
|
|
292
|
+
}) : void 0;
|
|
293
|
+
const highlights = rental.attributes != null || rental.roomSummary != null || rental.vicinity != null || customAttributes != null ? yield* toRentalHighlights({
|
|
294
|
+
locale,
|
|
295
|
+
translations,
|
|
296
|
+
highlightPrioritization: rentalHighlightPrioritization,
|
|
297
|
+
customAttributeFilterDefinitions,
|
|
298
|
+
customAttributes,
|
|
299
|
+
attributes: rental.attributes != null ? rental.attributes : void 0,
|
|
300
|
+
roomSummary: rental.roomSummary != null ? rental.roomSummary : void 0,
|
|
301
|
+
vicinity: rental.vicinity != null ? rental.vicinity : void 0
|
|
302
|
+
}) : void 0;
|
|
303
|
+
const item = {
|
|
304
|
+
id: rental.id,
|
|
305
|
+
nameOrLabel: rental.name ?? rental.label,
|
|
306
|
+
timeZone: rental.timezone
|
|
307
|
+
};
|
|
308
|
+
if (rentalType != null) item.rentalType = rentalType;
|
|
309
|
+
if (scope != null) item.scope = scope;
|
|
310
|
+
if (location != null) item.location = location;
|
|
311
|
+
if (images != null) item.images = images;
|
|
312
|
+
if (address != null) item.address = address;
|
|
313
|
+
if (descriptions != null) item.description = descriptions;
|
|
314
|
+
if (rooms != null) item.rooms = rooms;
|
|
315
|
+
if (property != null) item.property = property;
|
|
316
|
+
if (roomSummary != null) item.roomSummary = roomSummary;
|
|
317
|
+
if (attributes != null) item.attributes = attributes;
|
|
318
|
+
if (vicinity != null) item.vicinity = vicinity;
|
|
319
|
+
if (highlights != null) item.highlights = highlights;
|
|
320
|
+
return item;
|
|
321
|
+
});
|
|
322
|
+
//#endregion
|
|
323
|
+
export { toRentalRentalsOutput };
|