@tileflow/search 0.1.0-alpha.2 → 0.1.0-alpha.4
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 +202 -86
- package/dist/{chunk-YMLUPVQH.js → chunk-QDEMNVJD.js} +100 -16
- package/dist/{chunk-EDYCZVXI.js → chunk-W66J2DAS.js} +147 -7
- package/dist/client.d.ts +8 -3
- package/dist/client.js +10 -4
- package/dist/contract.d.ts +759 -8
- package/dist/contract.js +47 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +55 -5
- package/package.json +1 -1
|
@@ -16,7 +16,10 @@ var geocodingLimits = Object.freeze({
|
|
|
16
16
|
maximumResponseBytes: 64 * 1024,
|
|
17
17
|
maximumSafeErrorBytes: 8 * 1024,
|
|
18
18
|
maximumSourceCharacters: 128,
|
|
19
|
-
maximumSuggestionTokenCharacters: 2048
|
|
19
|
+
maximumSuggestionTokenCharacters: 2048,
|
|
20
|
+
maximumDetailEntries: 100,
|
|
21
|
+
maximumOpeningHoursEntries: 20,
|
|
22
|
+
maximumOpeningHoursLines: 50
|
|
20
23
|
});
|
|
21
24
|
var boundedText = (maximum) => z.string().trim().min(1).max(maximum).refine((value) => !controlCharacterPattern.test(value), {
|
|
22
25
|
message: "Control characters are not allowed"
|
|
@@ -24,12 +27,18 @@ var boundedText = (maximum) => z.string().trim().min(1).max(maximum).refine((val
|
|
|
24
27
|
var longitude = z.number().finite().min(-180).max(180);
|
|
25
28
|
var latitude = z.number().finite().min(-90).max(90);
|
|
26
29
|
var geocodingPositionSchema = z.tuple([longitude, latitude]);
|
|
27
|
-
var geocodingRetentionModes = ["temporary"
|
|
28
|
-
var geocodingBoundsSchema = z.tuple([longitude, latitude, longitude, latitude]).refine(([west,
|
|
30
|
+
var geocodingRetentionModes = ["temporary"];
|
|
31
|
+
var geocodingBoundsSchema = z.tuple([longitude, latitude, longitude, latitude]).refine(([west, , east]) => west < east, { message: "West must be less than east" }).refine(([, south, , north]) => south < north, {
|
|
29
32
|
message: "South must be less than north"
|
|
30
33
|
});
|
|
34
|
+
var searchPlaceDetails = ["contacts", "openingHours", "timeZone", "accessPoints"];
|
|
35
|
+
var searchPlaceDetailSchema = z.enum(searchPlaceDetails);
|
|
36
|
+
var searchPlaceDetailsSchema = z.array(searchPlaceDetailSchema).min(1).max(searchPlaceDetails.length).refine((values) => new Set(values).size === values.length, {
|
|
37
|
+
message: "Place details must be unique"
|
|
38
|
+
});
|
|
31
39
|
var geocodingForwardRequestSchema = z.object({
|
|
32
40
|
bounds: geocodingBoundsSchema.optional(),
|
|
41
|
+
include: searchPlaceDetailsSchema.optional(),
|
|
33
42
|
language: z.string().max(geocodingLimits.maximumLanguageCharacters).regex(languagePattern).optional(),
|
|
34
43
|
limit: z.number().int().min(1).max(geocodingLimits.maximumLimit).optional(),
|
|
35
44
|
proximity: geocodingPositionSchema.optional(),
|
|
@@ -39,8 +48,10 @@ var geocodingForwardRequestSchema = z.object({
|
|
|
39
48
|
message: "Bounds and proximity are mutually exclusive",
|
|
40
49
|
path: ["proximity"]
|
|
41
50
|
});
|
|
51
|
+
var autocompleteIncludeSchema = z.tuple([z.literal("place")]);
|
|
42
52
|
var autocompleteRequestSchema = z.object({
|
|
43
53
|
bounds: geocodingBoundsSchema.optional(),
|
|
54
|
+
include: autocompleteIncludeSchema.optional(),
|
|
44
55
|
language: z.string().max(geocodingLimits.maximumLanguageCharacters).regex(languagePattern).optional(),
|
|
45
56
|
limit: z.number().int().min(1).max(geocodingLimits.maximumLimit).default(geocodingLimits.defaultLimit),
|
|
46
57
|
proximity: geocodingPositionSchema.optional(),
|
|
@@ -51,6 +62,7 @@ var autocompleteRequestSchema = z.object({
|
|
|
51
62
|
});
|
|
52
63
|
var reverseGeocodingKindSchema = z.enum(["address", "street", "locality", "place"]);
|
|
53
64
|
var geocodingReverseRequestSchema = z.object({
|
|
65
|
+
include: searchPlaceDetailsSchema.optional(),
|
|
54
66
|
kinds: z.array(reverseGeocodingKindSchema).min(1).max(4).optional(),
|
|
55
67
|
language: z.string().max(geocodingLimits.maximumLanguageCharacters).regex(languagePattern).optional(),
|
|
56
68
|
limit: z.number().int().min(1).max(geocodingLimits.maximumLimit).default(geocodingLimits.defaultReverseLimit),
|
|
@@ -82,7 +94,51 @@ var geocodingAddressSchema = z.object({
|
|
|
82
94
|
region: addressPart.optional(),
|
|
83
95
|
street: addressPart.optional()
|
|
84
96
|
}).strict();
|
|
97
|
+
var searchLiteralText = (maximum) => z.string().min(1).max(maximum).refine((value) => !/[\p{Cc}\p{Cs}]/u.test(value));
|
|
98
|
+
var searchCategoryIdSchema = searchLiteralText(100);
|
|
99
|
+
var searchCategorySchema = z.object({
|
|
100
|
+
id: searchCategoryIdSchema,
|
|
101
|
+
name: searchLiteralText(100),
|
|
102
|
+
localizedName: searchLiteralText(100).optional(),
|
|
103
|
+
primary: z.boolean().optional()
|
|
104
|
+
}).strict();
|
|
105
|
+
var searchPlaceMetadata = {
|
|
106
|
+
name: searchLiteralText(200).optional(),
|
|
107
|
+
categories: z.array(searchCategorySchema).min(1).max(100).optional(),
|
|
108
|
+
foodTypes: z.array(searchCategorySchema).min(1).max(100).optional(),
|
|
109
|
+
businessChains: z.array(z.object({ id: searchLiteralText(100), name: searchLiteralText(100) }).strict()).min(1).max(100).optional()
|
|
110
|
+
};
|
|
111
|
+
var contactListSchema = z.array(
|
|
112
|
+
z.object({
|
|
113
|
+
value: searchLiteralText(2048),
|
|
114
|
+
label: searchLiteralText(256).optional()
|
|
115
|
+
}).strict()
|
|
116
|
+
).min(1).max(geocodingLimits.maximumDetailEntries);
|
|
117
|
+
var searchContactsSchema = z.object({
|
|
118
|
+
phones: contactListSchema.optional(),
|
|
119
|
+
websites: contactListSchema.optional(),
|
|
120
|
+
emails: contactListSchema.optional()
|
|
121
|
+
}).strict();
|
|
122
|
+
var searchOpeningHoursSchema = z.array(
|
|
123
|
+
z.object({
|
|
124
|
+
display: z.array(searchLiteralText(256)).min(1).max(geocodingLimits.maximumOpeningHoursLines).optional(),
|
|
125
|
+
openNow: z.boolean().optional()
|
|
126
|
+
}).strict()
|
|
127
|
+
).min(1).max(geocodingLimits.maximumOpeningHoursEntries);
|
|
128
|
+
var searchTimeZoneSchema = z.object({
|
|
129
|
+
name: searchLiteralText(64),
|
|
130
|
+
utcOffsetSeconds: z.number().int().min(-86400).max(86400).optional()
|
|
131
|
+
}).strict();
|
|
132
|
+
var searchPlaceDetailFields = {
|
|
133
|
+
distanceMeters: z.number().finite().nonnegative().optional(),
|
|
134
|
+
contacts: searchContactsSchema.optional(),
|
|
135
|
+
openingHours: searchOpeningHoursSchema.optional(),
|
|
136
|
+
timeZone: searchTimeZoneSchema.optional(),
|
|
137
|
+
accessPoints: z.array(z.object({ position: geocodingPositionSchema }).strict()).min(1).max(geocodingLimits.maximumDetailEntries).optional()
|
|
138
|
+
};
|
|
85
139
|
var geocodingResultSchema = z.object({
|
|
140
|
+
...searchPlaceMetadata,
|
|
141
|
+
...searchPlaceDetailFields,
|
|
86
142
|
address: geocodingAddressSchema,
|
|
87
143
|
bounds: geocodingBoundsSchema.optional(),
|
|
88
144
|
kind: z.enum(geocodingResultKinds),
|
|
@@ -102,27 +158,32 @@ var geocodingAttributionSchema = z.object({
|
|
|
102
158
|
message: "Expected an HTTPS URL without credentials"
|
|
103
159
|
}).optional()
|
|
104
160
|
}).strict();
|
|
161
|
+
var placeOperationUnitsSchema = z.union([z.literal(25), z.literal(75)]);
|
|
105
162
|
var geocodingForwardResponseSchema = z.object({
|
|
106
163
|
attribution: z.array(geocodingAttributionSchema).min(1).max(geocodingLimits.maximumAttributionEntries),
|
|
107
164
|
queryId: z.string().regex(queryIdPattern),
|
|
108
165
|
results: z.array(geocodingResultSchema).max(geocodingLimits.maximumLimit),
|
|
109
166
|
schemaVersion: z.literal(1),
|
|
110
167
|
source: geocodingSourceSchema,
|
|
111
|
-
usage: z.object({ units:
|
|
168
|
+
usage: z.object({ units: placeOperationUnitsSchema }).strict()
|
|
112
169
|
}).strict();
|
|
113
170
|
var geocodingReverseResponseSchema = geocodingForwardResponseSchema;
|
|
114
171
|
var geocodingSuggestionSchema = z.object({
|
|
115
172
|
kind: z.enum(geocodingResultKinds),
|
|
116
173
|
label: boundedText(512),
|
|
174
|
+
addressLabel: boundedText(512).optional(),
|
|
175
|
+
place: geocodingResultSchema.optional(),
|
|
117
176
|
token: z.string().min(1).max(geocodingLimits.maximumSuggestionTokenCharacters).regex(/^[\x21-\x7e]+$/u)
|
|
118
177
|
}).strict();
|
|
119
178
|
var autocompleteResponseSchema = z.object({
|
|
120
179
|
attribution: z.array(geocodingAttributionSchema).min(1).max(geocodingLimits.maximumAttributionEntries),
|
|
121
180
|
schemaVersion: z.literal(1),
|
|
122
181
|
source: geocodingSourceSchema,
|
|
123
|
-
suggestions: z.array(geocodingSuggestionSchema).max(geocodingLimits.maximumLimit)
|
|
182
|
+
suggestions: z.array(geocodingSuggestionSchema).max(geocodingLimits.maximumLimit),
|
|
183
|
+
usage: z.object({ units: z.union([z.literal(10), z.literal(25)]) }).strict()
|
|
124
184
|
}).strict();
|
|
125
185
|
var resolveSuggestionRequestSchema = z.object({
|
|
186
|
+
include: searchPlaceDetailsSchema.optional(),
|
|
126
187
|
retention: z.enum(geocodingRetentionModes).default("temporary"),
|
|
127
188
|
token: z.string().min(1).max(geocodingLimits.maximumSuggestionTokenCharacters).regex(/^[\x21-\x7e]+$/u)
|
|
128
189
|
}).strict();
|
|
@@ -131,7 +192,7 @@ var resolveSuggestionResponseSchema = z.object({
|
|
|
131
192
|
result: geocodingResultSchema,
|
|
132
193
|
schemaVersion: z.literal(1),
|
|
133
194
|
source: geocodingSourceSchema,
|
|
134
|
-
usage: z.object({ units:
|
|
195
|
+
usage: z.object({ units: placeOperationUnitsSchema }).strict()
|
|
135
196
|
}).strict();
|
|
136
197
|
function isCredentialFreeHttpsUrl(value) {
|
|
137
198
|
try {
|
|
@@ -141,18 +202,87 @@ function isCredentialFreeHttpsUrl(value) {
|
|
|
141
202
|
return false;
|
|
142
203
|
}
|
|
143
204
|
}
|
|
205
|
+
var nearbyLimits = Object.freeze({
|
|
206
|
+
defaultLimit: 20,
|
|
207
|
+
maximumLimit: 100,
|
|
208
|
+
maximumRadiusMeters: 21e6,
|
|
209
|
+
maximumCategoryCharacters: 100,
|
|
210
|
+
maximumFilterCategories: 10,
|
|
211
|
+
maximumCountries: 100,
|
|
212
|
+
maximumCursorCharacters: 8192,
|
|
213
|
+
maximumRequestBytes: 32 * 1024,
|
|
214
|
+
maximumResponseBytes: 512 * 1024
|
|
215
|
+
});
|
|
216
|
+
var nearbyCursorSchema = z.string().min(1).max(nearbyLimits.maximumCursorCharacters).regex(/^[\x21-\x7e]+$/u);
|
|
217
|
+
var categoryFilter = z.array(searchCategoryIdSchema).min(1).max(nearbyLimits.maximumFilterCategories);
|
|
218
|
+
var nearbyRequestSchema = z.object({
|
|
219
|
+
position: geocodingPositionSchema,
|
|
220
|
+
radiusMeters: z.number().int().min(1).max(nearbyLimits.maximumRadiusMeters).optional(),
|
|
221
|
+
bounds: geocodingBoundsSchema.optional(),
|
|
222
|
+
includeCategories: categoryFilter.optional(),
|
|
223
|
+
excludeCategories: categoryFilter.optional(),
|
|
224
|
+
countries: z.array(z.string().regex(/^(?:[A-Z]{2}|[A-Z]{3})$/u)).min(1).max(nearbyLimits.maximumCountries).optional(),
|
|
225
|
+
language: geocodingForwardRequestSchema.shape.language,
|
|
226
|
+
include: searchPlaceDetailsSchema.optional(),
|
|
227
|
+
limit: z.number().int().min(1).max(nearbyLimits.maximumLimit).default(nearbyLimits.defaultLimit),
|
|
228
|
+
cursor: nearbyCursorSchema.optional()
|
|
229
|
+
}).strict();
|
|
230
|
+
var nearbyPlaceSchema = geocodingResultSchema.omit({ sourceRef: true }).extend({
|
|
231
|
+
kind: z.literal("place"),
|
|
232
|
+
token: geocodingSuggestionSchema.shape.token.optional()
|
|
233
|
+
}).strict();
|
|
234
|
+
var nearbyResponseSchema = z.object({
|
|
235
|
+
schemaVersion: z.literal(1),
|
|
236
|
+
provider: z.literal("aws"),
|
|
237
|
+
results: z.array(nearbyPlaceSchema).max(nearbyLimits.maximumLimit),
|
|
238
|
+
nextCursor: nearbyCursorSchema.optional(),
|
|
239
|
+
source: geocodingSourceSchema,
|
|
240
|
+
attribution: geocodingForwardResponseSchema.shape.attribution,
|
|
241
|
+
usage: z.object({ units: placeOperationUnitsSchema }).strict()
|
|
242
|
+
}).strict().refine(
|
|
243
|
+
(value) => new TextEncoder().encode(JSON.stringify(value)).byteLength <= nearbyLimits.maximumResponseBytes,
|
|
244
|
+
{ message: "Nearby response exceeds the encoded byte limit" }
|
|
245
|
+
);
|
|
246
|
+
var searchCategoriesResponseSchema = z.object({
|
|
247
|
+
schemaVersion: z.literal(1),
|
|
248
|
+
provider: z.literal("aws"),
|
|
249
|
+
categories: z.array(searchCategorySchema).min(1).max(2e3),
|
|
250
|
+
source: geocodingSourceSchema,
|
|
251
|
+
attribution: geocodingForwardResponseSchema.shape.attribution,
|
|
252
|
+
usage: z.object({ units: z.literal(0) }).strict()
|
|
253
|
+
}).strict();
|
|
254
|
+
var resolvePlaceRequestSchema = resolveSuggestionRequestSchema;
|
|
255
|
+
var resolvePlaceResponseSchema = resolveSuggestionResponseSchema;
|
|
256
|
+
var searchContactDetails = ["contacts", "openingHours"];
|
|
257
|
+
function searchOperationUnits(operation, include) {
|
|
258
|
+
if (operation === "categories") return 0;
|
|
259
|
+
if (operation === "autocomplete") return include?.length ? 25 : 10;
|
|
260
|
+
return include?.length ? 75 : 25;
|
|
261
|
+
}
|
|
144
262
|
|
|
145
263
|
export {
|
|
146
264
|
geocodingLimits,
|
|
147
265
|
geocodingPositionSchema,
|
|
148
266
|
geocodingRetentionModes,
|
|
149
267
|
geocodingBoundsSchema,
|
|
268
|
+
searchPlaceDetails,
|
|
269
|
+
searchPlaceDetailSchema,
|
|
270
|
+
searchPlaceDetailsSchema,
|
|
150
271
|
geocodingForwardRequestSchema,
|
|
272
|
+
autocompleteIncludeSchema,
|
|
151
273
|
autocompleteRequestSchema,
|
|
152
274
|
reverseGeocodingKindSchema,
|
|
153
275
|
geocodingReverseRequestSchema,
|
|
154
276
|
geocodingResultKinds,
|
|
155
277
|
geocodingAddressSchema,
|
|
278
|
+
searchLiteralText,
|
|
279
|
+
searchCategoryIdSchema,
|
|
280
|
+
searchCategorySchema,
|
|
281
|
+
searchPlaceMetadata,
|
|
282
|
+
searchContactsSchema,
|
|
283
|
+
searchOpeningHoursSchema,
|
|
284
|
+
searchTimeZoneSchema,
|
|
285
|
+
searchPlaceDetailFields,
|
|
156
286
|
geocodingResultSchema,
|
|
157
287
|
geocodingSourceSchema,
|
|
158
288
|
geocodingAttributionSchema,
|
|
@@ -161,5 +291,15 @@ export {
|
|
|
161
291
|
geocodingSuggestionSchema,
|
|
162
292
|
autocompleteResponseSchema,
|
|
163
293
|
resolveSuggestionRequestSchema,
|
|
164
|
-
resolveSuggestionResponseSchema
|
|
294
|
+
resolveSuggestionResponseSchema,
|
|
295
|
+
nearbyLimits,
|
|
296
|
+
nearbyCursorSchema,
|
|
297
|
+
nearbyRequestSchema,
|
|
298
|
+
nearbyPlaceSchema,
|
|
299
|
+
nearbyResponseSchema,
|
|
300
|
+
searchCategoriesResponseSchema,
|
|
301
|
+
resolvePlaceRequestSchema,
|
|
302
|
+
resolvePlaceResponseSchema,
|
|
303
|
+
searchContactDetails,
|
|
304
|
+
searchOperationUnits
|
|
165
305
|
};
|
package/dist/client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AutocompleteRequest, AutocompleteResponse, GeocodingForwardRequest, GeocodingForwardResponse, GeocodingReverseRequest, GeocodingReverseResponse, ResolveSuggestionRequest, ResolveSuggestionResponse } from './contract.js';
|
|
1
|
+
import { AutocompleteRequest, AutocompleteResponse, GeocodingForwardRequest, GeocodingForwardResponse, GeocodingReverseRequest, GeocodingReverseResponse, SearchCategoriesResponse, ResolveSuggestionRequest, ResolveSuggestionResponse, NearbyRequest, NearbyResponse } from './contract.js';
|
|
2
2
|
import 'zod';
|
|
3
3
|
|
|
4
|
-
declare const GEOCODING_ERROR_CODES: readonly ["GEOCODING_ABORTED", "GEOCODING_DISABLED", "GEOCODING_INVALID_REQUEST", "GEOCODING_INVALID_SUGGESTION", "GEOCODING_PICK_LIMIT_EXCEEDED", "GEOCODING_QUOTA_EXCEEDED", "GEOCODING_REQUEST_TOO_LARGE", "GEOCODING_SUGGESTION_EXPIRED", "
|
|
4
|
+
declare const GEOCODING_ERROR_CODES: readonly ["GEOCODING_FILTER_UNSUPPORTED", "GEOCODING_PLAN_UNAVAILABLE", "GEOCODING_EVALUATION_REQUIRED", "GEOCODING_EVALUATION_EXPIRED", "GEOCODING_EVALUATION_EXHAUSTED", "GEOCODING_INVALID_CURSOR", "GEOCODING_CURSOR_EXPIRED", "GEOCODING_ABORTED", "GEOCODING_DISABLED", "GEOCODING_INVALID_REQUEST", "GEOCODING_INVALID_SUGGESTION", "GEOCODING_PICK_LIMIT_EXCEEDED", "GEOCODING_QUOTA_EXCEEDED", "GEOCODING_REQUEST_TOO_LARGE", "GEOCODING_SUGGESTION_EXPIRED", "GEOCODING_UNAVAILABLE", "GEOCODING_UPSTREAM_INVALID", "GEOCODING_UPSTREAM_THROTTLED", "GEOCODING_UPSTREAM_TIMEOUT", "GEOCODING_UPSTREAM_UNAVAILABLE", "GEOCODING_USAGE_UNCONFIRMED"];
|
|
5
5
|
type GeocodingErrorCode = (typeof GEOCODING_ERROR_CODES)[number];
|
|
6
6
|
type GeocodeOptions = Readonly<{
|
|
7
7
|
apiKey: string;
|
|
@@ -13,15 +13,20 @@ declare class GeocodingError extends Error {
|
|
|
13
13
|
readonly code: GeocodingErrorCode | null;
|
|
14
14
|
readonly requestId: string | null;
|
|
15
15
|
readonly status: number;
|
|
16
|
+
readonly retryAfterSeconds: number | null;
|
|
16
17
|
constructor(message: string, input: {
|
|
17
18
|
code?: GeocodingErrorCode;
|
|
18
19
|
requestId?: string;
|
|
19
20
|
status: number;
|
|
21
|
+
retryAfterSeconds?: number | null;
|
|
20
22
|
});
|
|
21
23
|
}
|
|
22
24
|
declare function geocode(request: GeocodingForwardRequest, options: GeocodeOptions): Promise<GeocodingForwardResponse>;
|
|
23
25
|
declare function geocodeReverse(request: GeocodingReverseRequest, options: GeocodeOptions): Promise<GeocodingReverseResponse>;
|
|
24
26
|
declare function autocomplete(request: AutocompleteRequest, options: GeocodeOptions): Promise<AutocompleteResponse>;
|
|
25
27
|
declare function resolveSuggestion(request: ResolveSuggestionRequest, options: GeocodeOptions): Promise<ResolveSuggestionResponse>;
|
|
28
|
+
declare const resolvePlace: typeof resolveSuggestion;
|
|
29
|
+
declare function searchNearby(request: NearbyRequest, options: GeocodeOptions): Promise<NearbyResponse>;
|
|
30
|
+
declare function listCategories(options: GeocodeOptions): Promise<SearchCategoriesResponse>;
|
|
26
31
|
|
|
27
|
-
export { GEOCODING_ERROR_CODES, type GeocodeOptions, GeocodingError, type GeocodingErrorCode, autocomplete, geocode, geocodeReverse, resolveSuggestion };
|
|
32
|
+
export { GEOCODING_ERROR_CODES, type GeocodeOptions, GeocodingError, type GeocodingErrorCode, autocomplete, geocode, geocodeReverse, listCategories, resolvePlace, resolveSuggestion, searchNearby };
|
package/dist/client.js
CHANGED
|
@@ -4,14 +4,20 @@ import {
|
|
|
4
4
|
autocomplete,
|
|
5
5
|
geocode,
|
|
6
6
|
geocodeReverse,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
listCategories,
|
|
8
|
+
resolvePlace,
|
|
9
|
+
resolveSuggestion,
|
|
10
|
+
searchNearby
|
|
11
|
+
} from "./chunk-QDEMNVJD.js";
|
|
12
|
+
import "./chunk-W66J2DAS.js";
|
|
10
13
|
export {
|
|
11
14
|
GEOCODING_ERROR_CODES,
|
|
12
15
|
GeocodingError,
|
|
13
16
|
autocomplete,
|
|
14
17
|
geocode,
|
|
15
18
|
geocodeReverse,
|
|
16
|
-
|
|
19
|
+
listCategories,
|
|
20
|
+
resolvePlace,
|
|
21
|
+
resolveSuggestion,
|
|
22
|
+
searchNearby
|
|
17
23
|
};
|