googlemaps-kit 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 (525) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +249 -0
  3. package/dist/auth/auth-status.d.ts +30 -0
  4. package/dist/auth/auth-status.d.ts.map +1 -0
  5. package/dist/auth/auth-status.js +169 -0
  6. package/dist/auth/auth-status.js.map +1 -0
  7. package/dist/auth/google-auth.d.ts +9 -0
  8. package/dist/auth/google-auth.d.ts.map +1 -0
  9. package/dist/auth/google-auth.js +40 -0
  10. package/dist/auth/google-auth.js.map +1 -0
  11. package/dist/auth/maps-tokens.d.ts +6 -0
  12. package/dist/auth/maps-tokens.d.ts.map +1 -0
  13. package/dist/auth/maps-tokens.js +18 -0
  14. package/dist/auth/maps-tokens.js.map +1 -0
  15. package/dist/auth/session.d.ts +28 -0
  16. package/dist/auth/session.d.ts.map +1 -0
  17. package/dist/auth/session.js +104 -0
  18. package/dist/auth/session.js.map +1 -0
  19. package/dist/client/gmaps-client.d.ts +92 -0
  20. package/dist/client/gmaps-client.d.ts.map +1 -0
  21. package/dist/client/gmaps-client.js +254 -0
  22. package/dist/client/gmaps-client.js.map +1 -0
  23. package/dist/client/http-client.d.ts +91 -0
  24. package/dist/client/http-client.d.ts.map +1 -0
  25. package/dist/client/http-client.js +393 -0
  26. package/dist/client/http-client.js.map +1 -0
  27. package/dist/index.d.ts +64 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +36 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/internal.d.ts +140 -0
  32. package/dist/internal.d.ts.map +1 -0
  33. package/dist/internal.js +97 -0
  34. package/dist/internal.js.map +1 -0
  35. package/dist/known-surfaces.d.ts +280 -0
  36. package/dist/known-surfaces.d.ts.map +1 -0
  37. package/dist/known-surfaces.js +276 -0
  38. package/dist/known-surfaces.js.map +1 -0
  39. package/dist/parsers/batch-url.d.ts +13 -0
  40. package/dist/parsers/batch-url.d.ts.map +1 -0
  41. package/dist/parsers/batch-url.js +42 -0
  42. package/dist/parsers/batch-url.js.map +1 -0
  43. package/dist/parsers/boq-reviews.d.ts +8 -0
  44. package/dist/parsers/boq-reviews.d.ts.map +1 -0
  45. package/dist/parsers/boq-reviews.js +254 -0
  46. package/dist/parsers/boq-reviews.js.map +1 -0
  47. package/dist/parsers/categories.d.ts +14 -0
  48. package/dist/parsers/categories.d.ts.map +1 -0
  49. package/dist/parsers/categories.js +128 -0
  50. package/dist/parsers/categories.js.map +1 -0
  51. package/dist/parsers/directions.d.ts +6 -0
  52. package/dist/parsers/directions.d.ts.map +1 -0
  53. package/dist/parsers/directions.js +388 -0
  54. package/dist/parsers/directions.js.map +1 -0
  55. package/dist/parsers/elevation-directions.d.ts +18 -0
  56. package/dist/parsers/elevation-directions.d.ts.map +1 -0
  57. package/dist/parsers/elevation-directions.js +102 -0
  58. package/dist/parsers/elevation-directions.js.map +1 -0
  59. package/dist/parsers/geocode.d.ts +11 -0
  60. package/dist/parsers/geocode.d.ts.map +1 -0
  61. package/dist/parsers/geocode.js +104 -0
  62. package/dist/parsers/geocode.js.map +1 -0
  63. package/dist/parsers/knowledge.d.ts +13 -0
  64. package/dist/parsers/knowledge.d.ts.map +1 -0
  65. package/dist/parsers/knowledge.js +93 -0
  66. package/dist/parsers/knowledge.js.map +1 -0
  67. package/dist/parsers/lists.d.ts +23 -0
  68. package/dist/parsers/lists.d.ts.map +1 -0
  69. package/dist/parsers/lists.js +219 -0
  70. package/dist/parsers/lists.js.map +1 -0
  71. package/dist/parsers/local-posts.d.ts +12 -0
  72. package/dist/parsers/local-posts.d.ts.map +1 -0
  73. package/dist/parsers/local-posts.js +112 -0
  74. package/dist/parsers/local-posts.js.map +1 -0
  75. package/dist/parsers/maps-url.d.ts +15 -0
  76. package/dist/parsers/maps-url.d.ts.map +1 -0
  77. package/dist/parsers/maps-url.js +326 -0
  78. package/dist/parsers/maps-url.js.map +1 -0
  79. package/dist/parsers/panorama.d.ts +24 -0
  80. package/dist/parsers/panorama.d.ts.map +1 -0
  81. package/dist/parsers/panorama.js +161 -0
  82. package/dist/parsers/panorama.js.map +1 -0
  83. package/dist/parsers/passiveassist.d.ts +10 -0
  84. package/dist/parsers/passiveassist.d.ts.map +1 -0
  85. package/dist/parsers/passiveassist.js +61 -0
  86. package/dist/parsers/passiveassist.js.map +1 -0
  87. package/dist/parsers/photos.d.ts +21 -0
  88. package/dist/parsers/photos.d.ts.map +1 -0
  89. package/dist/parsers/photos.js +287 -0
  90. package/dist/parsers/photos.js.map +1 -0
  91. package/dist/parsers/place-attributes.d.ts +25 -0
  92. package/dist/parsers/place-attributes.d.ts.map +1 -0
  93. package/dist/parsers/place-attributes.js +266 -0
  94. package/dist/parsers/place-attributes.js.map +1 -0
  95. package/dist/parsers/place.d.ts +9 -0
  96. package/dist/parsers/place.d.ts.map +1 -0
  97. package/dist/parsers/place.js +291 -0
  98. package/dist/parsers/place.js.map +1 -0
  99. package/dist/parsers/reveal.d.ts +5 -0
  100. package/dist/parsers/reveal.d.ts.map +1 -0
  101. package/dist/parsers/reveal.js +99 -0
  102. package/dist/parsers/reveal.js.map +1 -0
  103. package/dist/parsers/review-aggregates.d.ts +7 -0
  104. package/dist/parsers/review-aggregates.d.ts.map +1 -0
  105. package/dist/parsers/review-aggregates.js +18 -0
  106. package/dist/parsers/review-aggregates.js.map +1 -0
  107. package/dist/parsers/review-client-filters.d.ts +8 -0
  108. package/dist/parsers/review-client-filters.d.ts.map +1 -0
  109. package/dist/parsers/review-client-filters.js +28 -0
  110. package/dist/parsers/review-client-filters.js.map +1 -0
  111. package/dist/parsers/reviews.d.ts +8 -0
  112. package/dist/parsers/reviews.d.ts.map +1 -0
  113. package/dist/parsers/reviews.js +55 -0
  114. package/dist/parsers/reviews.js.map +1 -0
  115. package/dist/parsers/search-client-filters.d.ts +7 -0
  116. package/dist/parsers/search-client-filters.d.ts.map +1 -0
  117. package/dist/parsers/search-client-filters.js +44 -0
  118. package/dist/parsers/search-client-filters.js.map +1 -0
  119. package/dist/parsers/search-pagination.d.ts +12 -0
  120. package/dist/parsers/search-pagination.d.ts.map +1 -0
  121. package/dist/parsers/search-pagination.js +34 -0
  122. package/dist/parsers/search-pagination.js.map +1 -0
  123. package/dist/parsers/search.d.ts +5 -0
  124. package/dist/parsers/search.d.ts.map +1 -0
  125. package/dist/parsers/search.js +187 -0
  126. package/dist/parsers/search.js.map +1 -0
  127. package/dist/parsers/shared.d.ts +24 -0
  128. package/dist/parsers/shared.d.ts.map +1 -0
  129. package/dist/parsers/shared.js +147 -0
  130. package/dist/parsers/shared.js.map +1 -0
  131. package/dist/parsers/suggest.d.ts +10 -0
  132. package/dist/parsers/suggest.d.ts.map +1 -0
  133. package/dist/parsers/suggest.js +153 -0
  134. package/dist/parsers/suggest.js.map +1 -0
  135. package/dist/parsers/tiles.d.ts +22 -0
  136. package/dist/parsers/tiles.d.ts.map +1 -0
  137. package/dist/parsers/tiles.js +70 -0
  138. package/dist/parsers/tiles.js.map +1 -0
  139. package/dist/parsers/timezone-geocode.d.ts +20 -0
  140. package/dist/parsers/timezone-geocode.d.ts.map +1 -0
  141. package/dist/parsers/timezone-geocode.js +96 -0
  142. package/dist/parsers/timezone-geocode.js.map +1 -0
  143. package/dist/parsers/traffic.d.ts +10 -0
  144. package/dist/parsers/traffic.d.ts.map +1 -0
  145. package/dist/parsers/traffic.js +38 -0
  146. package/dist/parsers/traffic.js.map +1 -0
  147. package/dist/parsers/transit.d.ts +12 -0
  148. package/dist/parsers/transit.d.ts.map +1 -0
  149. package/dist/parsers/transit.js +77 -0
  150. package/dist/parsers/transit.js.map +1 -0
  151. package/dist/parsers/ugc-aggregates.d.ts +9 -0
  152. package/dist/parsers/ugc-aggregates.d.ts.map +1 -0
  153. package/dist/parsers/ugc-aggregates.js +23 -0
  154. package/dist/parsers/ugc-aggregates.js.map +1 -0
  155. package/dist/rpc/app-options.d.ts +25 -0
  156. package/dist/rpc/app-options.d.ts.map +1 -0
  157. package/dist/rpc/app-options.js +147 -0
  158. package/dist/rpc/app-options.js.map +1 -0
  159. package/dist/rpc/batch-execute.d.ts +30 -0
  160. package/dist/rpc/batch-execute.d.ts.map +1 -0
  161. package/dist/rpc/batch-execute.js +217 -0
  162. package/dist/rpc/batch-execute.js.map +1 -0
  163. package/dist/rpc/batch-request-builders.d.ts +65 -0
  164. package/dist/rpc/batch-request-builders.d.ts.map +1 -0
  165. package/dist/rpc/batch-request-builders.js +174 -0
  166. package/dist/rpc/batch-request-builders.js.map +1 -0
  167. package/dist/rpc/batch-rpc.d.ts +34 -0
  168. package/dist/rpc/batch-rpc.d.ts.map +1 -0
  169. package/dist/rpc/batch-rpc.js +70 -0
  170. package/dist/rpc/batch-rpc.js.map +1 -0
  171. package/dist/rpc/batch-services.d.ts +38 -0
  172. package/dist/rpc/batch-services.d.ts.map +1 -0
  173. package/dist/rpc/batch-services.js +69 -0
  174. package/dist/rpc/batch-services.js.map +1 -0
  175. package/dist/rpc/batchexecute-args.d.ts +30 -0
  176. package/dist/rpc/batchexecute-args.d.ts.map +1 -0
  177. package/dist/rpc/batchexecute-args.js +35 -0
  178. package/dist/rpc/batchexecute-args.js.map +1 -0
  179. package/dist/rpc/boq-reviews.d.ts +16 -0
  180. package/dist/rpc/boq-reviews.d.ts.map +1 -0
  181. package/dist/rpc/boq-reviews.js +45 -0
  182. package/dist/rpc/boq-reviews.js.map +1 -0
  183. package/dist/rpc/descriptor-registry.d.ts +61 -0
  184. package/dist/rpc/descriptor-registry.d.ts.map +1 -0
  185. package/dist/rpc/descriptor-registry.js +47 -0
  186. package/dist/rpc/descriptor-registry.js.map +1 -0
  187. package/dist/rpc/feature-rpc.d.ts +27 -0
  188. package/dist/rpc/feature-rpc.d.ts.map +1 -0
  189. package/dist/rpc/feature-rpc.js +44 -0
  190. package/dist/rpc/feature-rpc.js.map +1 -0
  191. package/dist/rpc/lists-pb.d.ts +20 -0
  192. package/dist/rpc/lists-pb.d.ts.map +1 -0
  193. package/dist/rpc/lists-pb.js +20 -0
  194. package/dist/rpc/lists-pb.js.map +1 -0
  195. package/dist/rpc/maps-endpoint-registry.json +185 -0
  196. package/dist/rpc/maps-runtime.d.ts +42 -0
  197. package/dist/rpc/maps-runtime.d.ts.map +1 -0
  198. package/dist/rpc/maps-runtime.js +140 -0
  199. package/dist/rpc/maps-runtime.js.map +1 -0
  200. package/dist/rpc/maps-url-builders.d.ts +35 -0
  201. package/dist/rpc/maps-url-builders.d.ts.map +1 -0
  202. package/dist/rpc/maps-url-builders.js +266 -0
  203. package/dist/rpc/maps-url-builders.js.map +1 -0
  204. package/dist/rpc/nxa.d.ts +13 -0
  205. package/dist/rpc/nxa.d.ts.map +1 -0
  206. package/dist/rpc/nxa.js +44 -0
  207. package/dist/rpc/nxa.js.map +1 -0
  208. package/dist/rpc/panorama-pb.d.ts +60 -0
  209. package/dist/rpc/panorama-pb.d.ts.map +1 -0
  210. package/dist/rpc/panorama-pb.js +71 -0
  211. package/dist/rpc/panorama-pb.js.map +1 -0
  212. package/dist/rpc/passiveassist-pb.d.ts +21 -0
  213. package/dist/rpc/passiveassist-pb.d.ts.map +1 -0
  214. package/dist/rpc/passiveassist-pb.js +24 -0
  215. package/dist/rpc/passiveassist-pb.js.map +1 -0
  216. package/dist/rpc/pb-builders.d.ts +136 -0
  217. package/dist/rpc/pb-builders.d.ts.map +1 -0
  218. package/dist/rpc/pb-builders.js +290 -0
  219. package/dist/rpc/pb-builders.js.map +1 -0
  220. package/dist/rpc/photo-category-tokens.d.ts +29 -0
  221. package/dist/rpc/photo-category-tokens.d.ts.map +1 -0
  222. package/dist/rpc/photo-category-tokens.js +97 -0
  223. package/dist/rpc/photo-category-tokens.js.map +1 -0
  224. package/dist/rpc/photos-pb.d.ts +29 -0
  225. package/dist/rpc/photos-pb.d.ts.map +1 -0
  226. package/dist/rpc/photos-pb.js +73 -0
  227. package/dist/rpc/photos-pb.js.map +1 -0
  228. package/dist/rpc/reveal-pb.d.ts +26 -0
  229. package/dist/rpc/reveal-pb.d.ts.map +1 -0
  230. package/dist/rpc/reveal-pb.js +32 -0
  231. package/dist/rpc/reveal-pb.js.map +1 -0
  232. package/dist/rpc/rpc-client.d.ts +50 -0
  233. package/dist/rpc/rpc-client.d.ts.map +1 -0
  234. package/dist/rpc/rpc-client.js +136 -0
  235. package/dist/rpc/rpc-client.js.map +1 -0
  236. package/dist/rpc/rpc-descriptor-registry.json +776 -0
  237. package/dist/rpc/rpc-methods.d.ts +75 -0
  238. package/dist/rpc/rpc-methods.d.ts.map +1 -0
  239. package/dist/rpc/rpc-methods.js +130 -0
  240. package/dist/rpc/rpc-methods.js.map +1 -0
  241. package/dist/rpc/search-filters.d.ts +43 -0
  242. package/dist/rpc/search-filters.d.ts.map +1 -0
  243. package/dist/rpc/search-filters.js +92 -0
  244. package/dist/rpc/search-filters.js.map +1 -0
  245. package/dist/rpc/suggest-pb.d.ts +34 -0
  246. package/dist/rpc/suggest-pb.d.ts.map +1 -0
  247. package/dist/rpc/suggest-pb.js +42 -0
  248. package/dist/rpc/suggest-pb.js.map +1 -0
  249. package/dist/rpc/tiles-pb.d.ts +45 -0
  250. package/dist/rpc/tiles-pb.d.ts.map +1 -0
  251. package/dist/rpc/tiles-pb.js +71 -0
  252. package/dist/rpc/tiles-pb.js.map +1 -0
  253. package/dist/rpc/xsrf-bootstrap.d.ts +24 -0
  254. package/dist/rpc/xsrf-bootstrap.d.ts.map +1 -0
  255. package/dist/rpc/xsrf-bootstrap.js +63 -0
  256. package/dist/rpc/xsrf-bootstrap.js.map +1 -0
  257. package/dist/server/api-server.d.ts +9 -0
  258. package/dist/server/api-server.d.ts.map +1 -0
  259. package/dist/server/api-server.js +293 -0
  260. package/dist/server/api-server.js.map +1 -0
  261. package/dist/services/ask-maps.d.ts +91 -0
  262. package/dist/services/ask-maps.d.ts.map +1 -0
  263. package/dist/services/ask-maps.js +221 -0
  264. package/dist/services/ask-maps.js.map +1 -0
  265. package/dist/services/batch-url.d.ts +18 -0
  266. package/dist/services/batch-url.d.ts.map +1 -0
  267. package/dist/services/batch-url.js +30 -0
  268. package/dist/services/batch-url.js.map +1 -0
  269. package/dist/services/categories.d.ts +21 -0
  270. package/dist/services/categories.d.ts.map +1 -0
  271. package/dist/services/categories.js +43 -0
  272. package/dist/services/categories.js.map +1 -0
  273. package/dist/services/directions.d.ts +26 -0
  274. package/dist/services/directions.d.ts.map +1 -0
  275. package/dist/services/directions.js +104 -0
  276. package/dist/services/directions.js.map +1 -0
  277. package/dist/services/distance-matrix.d.ts +17 -0
  278. package/dist/services/distance-matrix.d.ts.map +1 -0
  279. package/dist/services/distance-matrix.js +144 -0
  280. package/dist/services/distance-matrix.js.map +1 -0
  281. package/dist/services/elevation.d.ts +30 -0
  282. package/dist/services/elevation.d.ts.map +1 -0
  283. package/dist/services/elevation.js +149 -0
  284. package/dist/services/elevation.js.map +1 -0
  285. package/dist/services/geocode.d.ts +20 -0
  286. package/dist/services/geocode.d.ts.map +1 -0
  287. package/dist/services/geocode.js +63 -0
  288. package/dist/services/geocode.js.map +1 -0
  289. package/dist/services/knowledge.d.ts +25 -0
  290. package/dist/services/knowledge.d.ts.map +1 -0
  291. package/dist/services/knowledge.js +58 -0
  292. package/dist/services/knowledge.js.map +1 -0
  293. package/dist/services/links.d.ts +22 -0
  294. package/dist/services/links.d.ts.map +1 -0
  295. package/dist/services/links.js +145 -0
  296. package/dist/services/links.js.map +1 -0
  297. package/dist/services/lists.d.ts +20 -0
  298. package/dist/services/lists.d.ts.map +1 -0
  299. package/dist/services/lists.js +74 -0
  300. package/dist/services/lists.js.map +1 -0
  301. package/dist/services/local-posts.d.ts +14 -0
  302. package/dist/services/local-posts.d.ts.map +1 -0
  303. package/dist/services/local-posts.js +32 -0
  304. package/dist/services/local-posts.js.map +1 -0
  305. package/dist/services/panorama.d.ts +39 -0
  306. package/dist/services/panorama.d.ts.map +1 -0
  307. package/dist/services/panorama.js +175 -0
  308. package/dist/services/panorama.js.map +1 -0
  309. package/dist/services/passiveassist.d.ts +21 -0
  310. package/dist/services/passiveassist.d.ts.map +1 -0
  311. package/dist/services/passiveassist.js +70 -0
  312. package/dist/services/passiveassist.js.map +1 -0
  313. package/dist/services/photos.d.ts +46 -0
  314. package/dist/services/photos.d.ts.map +1 -0
  315. package/dist/services/photos.js +341 -0
  316. package/dist/services/photos.js.map +1 -0
  317. package/dist/services/places.d.ts +58 -0
  318. package/dist/services/places.d.ts.map +1 -0
  319. package/dist/services/places.js +240 -0
  320. package/dist/services/places.js.map +1 -0
  321. package/dist/services/reveal.d.ts +15 -0
  322. package/dist/services/reveal.d.ts.map +1 -0
  323. package/dist/services/reveal.js +41 -0
  324. package/dist/services/reveal.js.map +1 -0
  325. package/dist/services/reviews.d.ts +70 -0
  326. package/dist/services/reviews.d.ts.map +1 -0
  327. package/dist/services/reviews.js +245 -0
  328. package/dist/services/reviews.js.map +1 -0
  329. package/dist/services/search.d.ts +25 -0
  330. package/dist/services/search.d.ts.map +1 -0
  331. package/dist/services/search.js +130 -0
  332. package/dist/services/search.js.map +1 -0
  333. package/dist/services/static-map.d.ts +14 -0
  334. package/dist/services/static-map.d.ts.map +1 -0
  335. package/dist/services/static-map.js +182 -0
  336. package/dist/services/static-map.js.map +1 -0
  337. package/dist/services/suggest.d.ts +12 -0
  338. package/dist/services/suggest.d.ts.map +1 -0
  339. package/dist/services/suggest.js +36 -0
  340. package/dist/services/suggest.js.map +1 -0
  341. package/dist/services/tiles.d.ts +19 -0
  342. package/dist/services/tiles.d.ts.map +1 -0
  343. package/dist/services/tiles.js +77 -0
  344. package/dist/services/tiles.js.map +1 -0
  345. package/dist/services/timezone.d.ts +19 -0
  346. package/dist/services/timezone.d.ts.map +1 -0
  347. package/dist/services/timezone.js +91 -0
  348. package/dist/services/timezone.js.map +1 -0
  349. package/dist/services/traffic.d.ts +12 -0
  350. package/dist/services/traffic.d.ts.map +1 -0
  351. package/dist/services/traffic.js +40 -0
  352. package/dist/services/traffic.js.map +1 -0
  353. package/dist/services/transit.d.ts +22 -0
  354. package/dist/services/transit.d.ts.map +1 -0
  355. package/dist/services/transit.js +62 -0
  356. package/dist/services/transit.js.map +1 -0
  357. package/dist/services/ugc-aggregates.d.ts +17 -0
  358. package/dist/services/ugc-aggregates.d.ts.map +1 -0
  359. package/dist/services/ugc-aggregates.js +46 -0
  360. package/dist/services/ugc-aggregates.js.map +1 -0
  361. package/dist/types/batch-url.d.ts +21 -0
  362. package/dist/types/batch-url.d.ts.map +1 -0
  363. package/dist/types/batch-url.js +2 -0
  364. package/dist/types/batch-url.js.map +1 -0
  365. package/dist/types/categories.d.ts +43 -0
  366. package/dist/types/categories.d.ts.map +1 -0
  367. package/dist/types/categories.js +2 -0
  368. package/dist/types/categories.js.map +1 -0
  369. package/dist/types/common.d.ts +538 -0
  370. package/dist/types/common.d.ts.map +1 -0
  371. package/dist/types/common.js +77 -0
  372. package/dist/types/common.js.map +1 -0
  373. package/dist/types/directions.d.ts +88 -0
  374. package/dist/types/directions.d.ts.map +1 -0
  375. package/dist/types/directions.js +2 -0
  376. package/dist/types/directions.js.map +1 -0
  377. package/dist/types/distance-matrix.d.ts +40 -0
  378. package/dist/types/distance-matrix.d.ts.map +1 -0
  379. package/dist/types/distance-matrix.js +2 -0
  380. package/dist/types/distance-matrix.js.map +1 -0
  381. package/dist/types/elevation.d.ts +59 -0
  382. package/dist/types/elevation.d.ts.map +1 -0
  383. package/dist/types/elevation.js +2 -0
  384. package/dist/types/elevation.js.map +1 -0
  385. package/dist/types/geocode.d.ts +60 -0
  386. package/dist/types/geocode.d.ts.map +1 -0
  387. package/dist/types/geocode.js +2 -0
  388. package/dist/types/geocode.js.map +1 -0
  389. package/dist/types/links.d.ts +74 -0
  390. package/dist/types/links.d.ts.map +1 -0
  391. package/dist/types/links.js +2 -0
  392. package/dist/types/links.js.map +1 -0
  393. package/dist/types/lists.d.ts +41 -0
  394. package/dist/types/lists.d.ts.map +1 -0
  395. package/dist/types/lists.js +2 -0
  396. package/dist/types/lists.js.map +1 -0
  397. package/dist/types/maps-urls.d.ts +78 -0
  398. package/dist/types/maps-urls.d.ts.map +1 -0
  399. package/dist/types/maps-urls.js +2 -0
  400. package/dist/types/maps-urls.js.map +1 -0
  401. package/dist/types/panorama.d.ts +74 -0
  402. package/dist/types/panorama.d.ts.map +1 -0
  403. package/dist/types/panorama.js +2 -0
  404. package/dist/types/panorama.js.map +1 -0
  405. package/dist/types/passiveassist.d.ts +50 -0
  406. package/dist/types/passiveassist.d.ts.map +1 -0
  407. package/dist/types/passiveassist.js +2 -0
  408. package/dist/types/passiveassist.js.map +1 -0
  409. package/dist/types/photos.d.ts +101 -0
  410. package/dist/types/photos.d.ts.map +1 -0
  411. package/dist/types/photos.js +75 -0
  412. package/dist/types/photos.js.map +1 -0
  413. package/dist/types/protobuf.d.ts +33 -0
  414. package/dist/types/protobuf.d.ts.map +1 -0
  415. package/dist/types/protobuf.js +25 -0
  416. package/dist/types/protobuf.js.map +1 -0
  417. package/dist/types/reveal.d.ts +46 -0
  418. package/dist/types/reveal.d.ts.map +1 -0
  419. package/dist/types/reveal.js +2 -0
  420. package/dist/types/reveal.js.map +1 -0
  421. package/dist/types/reviews.d.ts +79 -0
  422. package/dist/types/reviews.d.ts.map +1 -0
  423. package/dist/types/reviews.js +5 -0
  424. package/dist/types/reviews.js.map +1 -0
  425. package/dist/types/search-filters.d.ts +59 -0
  426. package/dist/types/search-filters.d.ts.map +1 -0
  427. package/dist/types/search-filters.js +35 -0
  428. package/dist/types/search-filters.js.map +1 -0
  429. package/dist/types/static-map.d.ts +61 -0
  430. package/dist/types/static-map.d.ts.map +1 -0
  431. package/dist/types/static-map.js +2 -0
  432. package/dist/types/static-map.js.map +1 -0
  433. package/dist/types/suggest.d.ts +57 -0
  434. package/dist/types/suggest.d.ts.map +1 -0
  435. package/dist/types/suggest.js +2 -0
  436. package/dist/types/suggest.js.map +1 -0
  437. package/dist/types/tiles.d.ts +65 -0
  438. package/dist/types/tiles.d.ts.map +1 -0
  439. package/dist/types/tiles.js +2 -0
  440. package/dist/types/tiles.js.map +1 -0
  441. package/dist/types/timezone.d.ts +36 -0
  442. package/dist/types/timezone.d.ts.map +1 -0
  443. package/dist/types/timezone.js +2 -0
  444. package/dist/types/timezone.js.map +1 -0
  445. package/dist/types/traffic.d.ts +22 -0
  446. package/dist/types/traffic.d.ts.map +1 -0
  447. package/dist/types/traffic.js +2 -0
  448. package/dist/types/traffic.js.map +1 -0
  449. package/dist/types/transit.d.ts +46 -0
  450. package/dist/types/transit.d.ts.map +1 -0
  451. package/dist/types/transit.js +3 -0
  452. package/dist/types/transit.js.map +1 -0
  453. package/dist/types/ugc-aggregates.d.ts +14 -0
  454. package/dist/types/ugc-aggregates.d.ts.map +1 -0
  455. package/dist/types/ugc-aggregates.js +2 -0
  456. package/dist/types/ugc-aggregates.js.map +1 -0
  457. package/dist/utils/chunked-decoder.d.ts +9 -0
  458. package/dist/utils/chunked-decoder.d.ts.map +1 -0
  459. package/dist/utils/chunked-decoder.js +175 -0
  460. package/dist/utils/chunked-decoder.js.map +1 -0
  461. package/dist/utils/directions-metrics.d.ts +5 -0
  462. package/dist/utils/directions-metrics.d.ts.map +1 -0
  463. package/dist/utils/directions-metrics.js +62 -0
  464. package/dist/utils/directions-metrics.js.map +1 -0
  465. package/dist/utils/encoded-polyline.d.ts +9 -0
  466. package/dist/utils/encoded-polyline.d.ts.map +1 -0
  467. package/dist/utils/encoded-polyline.js +67 -0
  468. package/dist/utils/encoded-polyline.js.map +1 -0
  469. package/dist/utils/feature-id.d.ts +2 -0
  470. package/dist/utils/feature-id.d.ts.map +1 -0
  471. package/dist/utils/feature-id.js +11 -0
  472. package/dist/utils/feature-id.js.map +1 -0
  473. package/dist/utils/geo.d.ts +18 -0
  474. package/dist/utils/geo.d.ts.map +1 -0
  475. package/dist/utils/geo.js +40 -0
  476. package/dist/utils/geo.js.map +1 -0
  477. package/dist/utils/ids.d.ts +23 -0
  478. package/dist/utils/ids.d.ts.map +1 -0
  479. package/dist/utils/ids.js +81 -0
  480. package/dist/utils/ids.js.map +1 -0
  481. package/dist/utils/load-env.d.ts +7 -0
  482. package/dist/utils/load-env.d.ts.map +1 -0
  483. package/dist/utils/load-env.js +49 -0
  484. package/dist/utils/load-env.js.map +1 -0
  485. package/dist/utils/photo-url.d.ts +4 -0
  486. package/dist/utils/photo-url.d.ts.map +1 -0
  487. package/dist/utils/photo-url.js +35 -0
  488. package/dist/utils/photo-url.js.map +1 -0
  489. package/dist/utils/plus-code.d.ts +11 -0
  490. package/dist/utils/plus-code.d.ts.map +1 -0
  491. package/dist/utils/plus-code.js +83 -0
  492. package/dist/utils/plus-code.js.map +1 -0
  493. package/dist/utils/png.d.ts +25 -0
  494. package/dist/utils/png.d.ts.map +1 -0
  495. package/dist/utils/png.js +314 -0
  496. package/dist/utils/png.js.map +1 -0
  497. package/dist/utils/pooled.d.ts +6 -0
  498. package/dist/utils/pooled.d.ts.map +1 -0
  499. package/dist/utils/pooled.js +19 -0
  500. package/dist/utils/pooled.js.map +1 -0
  501. package/dist/utils/request-scheduler.d.ts +28 -0
  502. package/dist/utils/request-scheduler.d.ts.map +1 -0
  503. package/dist/utils/request-scheduler.js +58 -0
  504. package/dist/utils/request-scheduler.js.map +1 -0
  505. package/dist/utils/response-parser.d.ts +7 -0
  506. package/dist/utils/response-parser.d.ts.map +1 -0
  507. package/dist/utils/response-parser.js +50 -0
  508. package/dist/utils/response-parser.js.map +1 -0
  509. package/dist/utils/retry-backoff.d.ts +5 -0
  510. package/dist/utils/retry-backoff.d.ts.map +1 -0
  511. package/dist/utils/retry-backoff.js +23 -0
  512. package/dist/utils/retry-backoff.js.map +1 -0
  513. package/dist/utils/safe-get.d.ts +6 -0
  514. package/dist/utils/safe-get.d.ts.map +1 -0
  515. package/dist/utils/safe-get.js +29 -0
  516. package/dist/utils/safe-get.js.map +1 -0
  517. package/dist/utils/static-map-grid.d.ts +71 -0
  518. package/dist/utils/static-map-grid.d.ts.map +1 -0
  519. package/dist/utils/static-map-grid.js +103 -0
  520. package/dist/utils/static-map-grid.js.map +1 -0
  521. package/dist/utils/throttle-detection.d.ts +17 -0
  522. package/dist/utils/throttle-detection.d.ts.map +1 -0
  523. package/dist/utils/throttle-detection.js +71 -0
  524. package/dist/utils/throttle-detection.js.map +1 -0
  525. package/package.json +85 -0
@@ -0,0 +1,145 @@
1
+ import { isShortMapsLink, parseMapsUrl } from '../parsers/maps-url.js';
2
+ import { bootstrapSession, buildBrowserHeaders, cookiesToHeader, } from '../auth/session.js';
3
+ import { GMapsError } from '../types/common.js';
4
+ const MAPS_URL_RE = /^https:\/\/(www\.)?google\.[a-z.]+\/maps(\/|$|\?)/i;
5
+ /**
6
+ * Resolve short links and parse Maps URLs into structured identifiers.
7
+ *
8
+ * Short-link expansion uses browser document headers and `?_imcp=1` because
9
+ * maps.app.goo.gl otherwise serves an interstitial instead of redirecting.
10
+ */
11
+ export class LinksService {
12
+ http;
13
+ hl;
14
+ gl;
15
+ constructor(http, config) {
16
+ this.http = http;
17
+ this.hl = config.hl ?? 'en';
18
+ this.gl = config.gl ?? 'us';
19
+ }
20
+ /**
21
+ * Follow redirect chains (and HTML canonical URLs) until a full google.com/maps URL is reached.
22
+ */
23
+ async expand(shortUrl) {
24
+ const fetchUrl = normalizeShortLinkUrl(shortUrl.trim());
25
+ const session = await bootstrapSession();
26
+ const headers = buildBrowserHeaders({
27
+ userAgent: session.userAgent,
28
+ cookies: session.cookies,
29
+ mode: 'document',
30
+ });
31
+ let current = fetchUrl;
32
+ for (let hop = 0; hop < 12; hop++) {
33
+ const response = await fetch(current, {
34
+ headers: { ...headers, Cookie: cookiesToHeader(session.cookies) },
35
+ redirect: 'manual',
36
+ });
37
+ if (response.status >= 300 && response.status < 400) {
38
+ const location = response.headers.get('location');
39
+ if (!location)
40
+ break;
41
+ current = new URL(location, current).toString();
42
+ if (isResolvedMapsUrl(current)) {
43
+ return stripTrackingParams(current);
44
+ }
45
+ continue;
46
+ }
47
+ const finalFromResponse = response.url;
48
+ if (isResolvedMapsUrl(finalFromResponse)) {
49
+ return stripTrackingParams(finalFromResponse);
50
+ }
51
+ const html = await response.text();
52
+ const fromHtml = extractMapsUrlFromHtml(html, current);
53
+ if (fromHtml) {
54
+ return stripTrackingParams(fromHtml);
55
+ }
56
+ if (isResolvedMapsUrl(current)) {
57
+ return stripTrackingParams(current);
58
+ }
59
+ break;
60
+ }
61
+ throw new GMapsError(`Could not expand short link to a Maps URL: ${shortUrl}`);
62
+ }
63
+ /** Expand short links when needed, then parse into a {@link ParsedMapsUrl}. */
64
+ async resolve(url) {
65
+ const trimmed = url.trim();
66
+ if (isShortMapsLink(trimmed)) {
67
+ const expanded = await this.expand(trimmed);
68
+ return parseMapsUrl(expanded);
69
+ }
70
+ return parseMapsUrl(trimmed);
71
+ }
72
+ }
73
+ function normalizeShortLinkUrl(input) {
74
+ let url = input;
75
+ if (!/^https?:\/\//i.test(url)) {
76
+ url = `https://${url}`;
77
+ }
78
+ const parsed = new URL(url);
79
+ if (!parsed.searchParams.has('_imcp')) {
80
+ parsed.searchParams.set('_imcp', '1');
81
+ }
82
+ return parsed.toString();
83
+ }
84
+ function isResolvedMapsUrl(url) {
85
+ if (!MAPS_URL_RE.test(url))
86
+ return false;
87
+ try {
88
+ const parsed = parseMapsUrl(url);
89
+ return parsed.kind !== 'shortLink' && parsed.kind !== 'unknown';
90
+ }
91
+ catch {
92
+ return MAPS_URL_RE.test(url);
93
+ }
94
+ }
95
+ function stripTrackingParams(url) {
96
+ try {
97
+ const parsed = new URL(url);
98
+ for (const key of ['_imcp', '_iipp', 'entry', 'g_st']) {
99
+ parsed.searchParams.delete(key);
100
+ }
101
+ return parsed.toString();
102
+ }
103
+ catch {
104
+ return url;
105
+ }
106
+ }
107
+ function extractMapsUrlFromHtml(html, baseUrl) {
108
+ const patterns = [
109
+ /data-desktop-link="([^"]+)"/,
110
+ /<link[^>]+rel="canonical"[^>]+href="([^"]+)"/,
111
+ /<link[^>]+href="([^"]+)"[^>]+rel="canonical"/,
112
+ /property="og:url"\s+content="([^"]+)"/,
113
+ /content="([^"]+)"\s+property="og:url"/,
114
+ /"(https:\/\/www\.google\.[^"]+\/maps[^"]+)"/,
115
+ /"(https:\/\/maps\.google\.[^"]+\/maps[^"]+)"/,
116
+ /href="(\/maps\/[^"]+)"/,
117
+ ];
118
+ for (const pattern of patterns) {
119
+ const match = html.match(pattern);
120
+ if (!match?.[1])
121
+ continue;
122
+ let candidate = match[1].replace(/&amp;/g, '&');
123
+ if (candidate.startsWith('/')) {
124
+ candidate = new URL(candidate, 'https://www.google.com').toString();
125
+ }
126
+ if (MAPS_URL_RE.test(candidate) || candidate.includes('/maps/place/') || candidate.includes('/maps/placelists/')) {
127
+ try {
128
+ return new URL(candidate, baseUrl).toString();
129
+ }
130
+ catch {
131
+ continue;
132
+ }
133
+ }
134
+ }
135
+ const placeMatch = html.match(/\/maps\/place\/[^"'\\]+/);
136
+ if (placeMatch) {
137
+ return `https://www.google.com${placeMatch[0]}`;
138
+ }
139
+ const listMatch = html.match(/\/maps\/placelists\/list\/[a-zA-Z0-9_-]+/);
140
+ if (listMatch) {
141
+ return `https://www.google.com${listMatch[0]}`;
142
+ }
143
+ return null;
144
+ }
145
+ //# sourceMappingURL=links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/services/links.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { HttpClient } from '../client/http-client.js';
2
+ import { type GMapsConfig } from '../types/common.js';
3
+ import type { GetListOptions, PlaceList } from '../types/lists.js';
4
+ export declare class ListsService {
5
+ private http;
6
+ private hl;
7
+ private gl;
8
+ constructor(http: HttpClient, config: GMapsConfig);
9
+ /**
10
+ * Fetch and parse a public/shared place list.
11
+ * Accepts `listId` or `url` in options — resolves short links automatically.
12
+ */
13
+ get(options: GetListOptions): Promise<PlaceList>;
14
+ /**
15
+ * Resolve a raw list id, placelists URL, or maps.app.goo.gl short link to a list id.
16
+ * Short links are fetched with `?_imcp=1` so Google redirects to the list page.
17
+ */
18
+ resolveListId(urlOrId: string): Promise<string>;
19
+ }
20
+ //# sourceMappingURL=lists.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists.d.ts","sourceRoot":"","sources":["../../src/services/lists.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAQtD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnE,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAMjD;;;OAGG;IACG,GAAG,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC;IAsBtD;;;OAGG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAuBtD"}
@@ -0,0 +1,74 @@
1
+ import { assertListNotErrorEnvelope, extractListIdFromPageHtml, extractPlaceList, parseListIdFromInput, } from '../parsers/lists.js';
2
+ import { buildGetListUrl } from '../rpc/lists-pb.js';
3
+ import { GMapsError } from '../types/common.js';
4
+ export class ListsService {
5
+ http;
6
+ hl;
7
+ gl;
8
+ constructor(http, config) {
9
+ this.http = http;
10
+ this.hl = config.hl ?? 'en';
11
+ this.gl = config.gl ?? 'us';
12
+ }
13
+ /**
14
+ * Fetch and parse a public/shared place list.
15
+ * Accepts `listId` or `url` in options — resolves short links automatically.
16
+ */
17
+ async get(options) {
18
+ const listId = await this.resolveListId(options.listId ?? options.url ?? '');
19
+ const hl = options.hl ?? this.hl;
20
+ const gl = options.gl ?? this.gl;
21
+ const url = buildGetListUrl({
22
+ listId,
23
+ pageSize: options.pageSize,
24
+ hl,
25
+ gl,
26
+ });
27
+ const data = await this.http.get(url, {
28
+ referer: shareUrlReferer(listId),
29
+ includeOrigin: true,
30
+ allowShortBody: true,
31
+ });
32
+ assertListNotErrorEnvelope(data);
33
+ return extractPlaceList(data, { raw: options.raw });
34
+ }
35
+ /**
36
+ * Resolve a raw list id, placelists URL, or maps.app.goo.gl short link to a list id.
37
+ * Short links are fetched with `?_imcp=1` so Google redirects to the list page.
38
+ */
39
+ async resolveListId(urlOrId) {
40
+ const trimmed = urlOrId.trim();
41
+ if (!trimmed) {
42
+ throw new GMapsError('List id or URL is required');
43
+ }
44
+ const direct = parseListIdFromInput(trimmed);
45
+ if (direct)
46
+ return direct;
47
+ const fetchUrl = normalizeShortLinkUrl(trimmed);
48
+ const html = await this.http.get(fetchUrl, {
49
+ referer: 'https://www.google.com/maps/',
50
+ raw: true,
51
+ allowShortBody: true,
52
+ });
53
+ const listId = extractListIdFromPageHtml(html, fetchUrl);
54
+ if (!listId) {
55
+ throw new GMapsError(`Could not resolve place list id from: ${trimmed}`);
56
+ }
57
+ return listId;
58
+ }
59
+ }
60
+ function shareUrlReferer(listId) {
61
+ return `https://www.google.com/maps/placelists/list/${listId}`;
62
+ }
63
+ function normalizeShortLinkUrl(input) {
64
+ let url = input;
65
+ if (!/^https?:\/\//i.test(url)) {
66
+ url = `https://${url}`;
67
+ }
68
+ const parsed = new URL(url);
69
+ if (!parsed.searchParams.has('_imcp')) {
70
+ parsed.searchParams.set('_imcp', '1');
71
+ }
72
+ return parsed.toString();
73
+ }
74
+ //# sourceMappingURL=lists.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lists.js","sourceRoot":"","sources":["../../src/services/lists.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { HttpClient } from '../client/http-client.js';
2
+ import type { GMapsConfig, LocalPost } from '../types/common.js';
3
+ export interface GetLocalPostsOptions {
4
+ hexId: string;
5
+ ftid?: string;
6
+ }
7
+ export declare class LocalPostsService {
8
+ private http;
9
+ private hl;
10
+ private gl;
11
+ constructor(http: HttpClient, config: GMapsConfig);
12
+ list(options: GetLocalPostsOptions): Promise<LocalPost[]>;
13
+ }
14
+ //# sourceMappingURL=local-posts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-posts.d.ts","sourceRoot":"","sources":["../../src/services/local-posts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAM3C,IAAI,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;CAmBhE"}
@@ -0,0 +1,32 @@
1
+ import { extractLocalPosts } from '../parsers/local-posts.js';
2
+ import { buildLocalPostsUrl } from '../rpc/pb-builders.js';
3
+ export class LocalPostsService {
4
+ http;
5
+ hl;
6
+ gl;
7
+ constructor(http, config) {
8
+ this.http = http;
9
+ this.hl = config.hl ?? 'en';
10
+ this.gl = config.gl ?? 'us';
11
+ }
12
+ async list(options) {
13
+ const url = buildLocalPostsUrl({
14
+ hexId: options.hexId,
15
+ ftid: options.ftid,
16
+ hl: this.hl,
17
+ gl: this.gl,
18
+ });
19
+ try {
20
+ const data = await this.http.get(url, {
21
+ referer: 'https://www.google.com/maps/',
22
+ includeOrigin: true,
23
+ allowShortBody: true,
24
+ });
25
+ return extractLocalPosts(data);
26
+ }
27
+ catch {
28
+ return [];
29
+ }
30
+ }
31
+ }
32
+ //# sourceMappingURL=local-posts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"local-posts.js","sourceRoot":"","sources":["../../src/services/local-posts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAQ3D,MAAM,OAAO,iBAAiB;IACpB,IAAI,CAAa;IACjB,EAAE,CAAS;IACX,EAAE,CAAS;IAEnB,YAAY,IAAgB,EAAE,MAAmB;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA6B;QACtC,MAAM,GAAG,GAAG,kBAAkB,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,EAAE,EAAE,IAAI,CAAC,EAAE;SACZ,CAAC,CAAC;QAEH,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE;gBACpC,OAAO,EAAE,8BAA8B;gBACvC,aAAa,EAAE,IAAI;gBACnB,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;YACH,OAAO,iBAAiB,CAAC,IAA6C,CAAC,CAAC;QAC1E,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ import { HttpClient } from '../client/http-client.js';
2
+ import type { GMapsConfig } from '../types/common.js';
3
+ import type { PanoramaGetOptions, PanoramaImageOptions, PanoramaLocationOptions, PanoramaMetadata, PanoramaRef, PanoramaSearchOptions } from '../types/panorama.js';
4
+ export declare class PanoramaService {
5
+ private http;
6
+ private hl;
7
+ private gl;
8
+ constructor(http: HttpClient, config: GMapsConfig);
9
+ /**
10
+ * Find Street View panoramas near a point, closest first.
11
+ *
12
+ * Coverage tiles are tried first: `listentityphotos` is abuse throttled (sustained use
13
+ * earns HTML 403s) and pads its results with user photos and session tokens, while a
14
+ * coverage tile returns only official panoramas with coordinates. listentityphotos is
15
+ * kept as a fallback because it is the only source of Google-hosted thumbnails.
16
+ */
17
+ findNearby(options: PanoramaSearchOptions): Promise<PanoramaRef[]>;
18
+ /** Coverage-tile lookup, expanding to the 3×3 tile block when the centre is empty. */
19
+ private findViaCoverage;
20
+ /** Fallback lookup that also yields Google-hosted thumbnails. */
21
+ private findViaEntityPhotos;
22
+ /**
23
+ * Order candidates by proximity, keeping those without coordinates as a last resort.
24
+ *
25
+ * A tile covers more ground than the requested radius, so unfiltered results can sit
26
+ * hundreds of metres away; but discarding every out-of-radius hit would return nothing
27
+ * in sparsely covered areas, so they are kept behind the in-radius ones.
28
+ */
29
+ private rankByDistance;
30
+ /** Fetch full metadata for a panorama id; null when Google returns the stub response. */
31
+ get(panoId: string, options?: PanoramaGetOptions): Promise<PanoramaMetadata | null>;
32
+ /** Resolve the closest panorama near a point, then fetch its full metadata. */
33
+ getByLocation(lat: number, lng: number, options?: PanoramaLocationOptions): Promise<PanoramaMetadata | null>;
34
+ /** Build a Street View thumbnail URL (no network I/O). */
35
+ buildThumbnailUrl(options: PanoramaImageOptions): string;
36
+ /** Build a Street View tile URL (no network I/O). */
37
+ buildTileUrl(options: PanoramaImageOptions): string;
38
+ }
39
+ //# sourceMappingURL=panorama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panorama.d.ts","sourceRoot":"","sources":["../../src/services/panorama.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAatD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,gBAAgB,EAChB,WAAW,EACX,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAkB9B,qBAAa,eAAe;IAC1B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAMjD;;;;;;;OAOG;IACG,UAAU,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAWxE,sFAAsF;YACxE,eAAe;IAgD7B,iEAAiE;YACnD,mBAAmB;IAgCjC;;;;;;OAMG;IACH,OAAO,CAAC,cAAc;IAoBtB,yFAAyF;IACnF,GAAG,CACP,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAenC,+EAA+E;IACzE,aAAa,CACjB,GAAG,EAAE,MAAM,EACX,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAuBnC,0DAA0D;IAC1D,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM;IAUxD,qDAAqD;IACrD,YAAY,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM;CAQpD"}
@@ -0,0 +1,175 @@
1
+ import { extractCoveragePanoramas, extractNearbyPanoramas, extractPanoramaMetadata, } from '../parsers/panorama.js';
2
+ import { buildCoverageTileUrl, buildListEntityPhotosUrl, buildPhotometaUrl, buildThumbnailUrl, buildTileUrl, } from '../rpc/panorama-pb.js';
3
+ import { GMapsNetworkError, GMapsPhotosBlockedError } from '../types/common.js';
4
+ import { haversineMeters, webMercatorTile } from '../utils/geo.js';
5
+ const DEFAULT_RADIUS_METERS = 300;
6
+ /** Coverage tiles only answer at zoom 17 — zoom 18 returns HTTP 400. */
7
+ const COVERAGE_ZOOM = 17;
8
+ /** A z17 tile spans roughly this far, so wider searches need the neighbouring tiles. */
9
+ const COVERAGE_TILE_SPAN_METERS = 305;
10
+ /** Street View pano ids from listentityphotos — excludes session tokens and numeric photo ids. */
11
+ function isLikelyStreetViewPanoId(panoId) {
12
+ if (panoId.startsWith('0ahUKE'))
13
+ return false;
14
+ if (/^\d+$/.test(panoId))
15
+ return false;
16
+ return /^[A-Za-z0-9_-]{16,44}$/.test(panoId);
17
+ }
18
+ export class PanoramaService {
19
+ http;
20
+ hl;
21
+ gl;
22
+ constructor(http, config) {
23
+ this.http = http;
24
+ this.hl = config.hl ?? 'en';
25
+ this.gl = config.gl ?? 'us';
26
+ }
27
+ /**
28
+ * Find Street View panoramas near a point, closest first.
29
+ *
30
+ * Coverage tiles are tried first: `listentityphotos` is abuse throttled (sustained use
31
+ * earns HTML 403s) and pads its results with user photos and session tokens, while a
32
+ * coverage tile returns only official panoramas with coordinates. listentityphotos is
33
+ * kept as a fallback because it is the only source of Google-hosted thumbnails.
34
+ */
35
+ async findNearby(options) {
36
+ const hl = options.hl ?? this.hl;
37
+ const gl = options.gl ?? this.gl;
38
+ const radiusMeters = options.radiusMeters ?? DEFAULT_RADIUS_METERS;
39
+ const fromCoverage = await this.findViaCoverage(options.lat, options.lng, radiusMeters, hl, gl);
40
+ if (fromCoverage.length > 0)
41
+ return fromCoverage;
42
+ return this.findViaEntityPhotos(options.lat, options.lng, radiusMeters, hl, gl);
43
+ }
44
+ /** Coverage-tile lookup, expanding to the 3×3 tile block when the centre is empty. */
45
+ async findViaCoverage(lat, lng, radiusMeters, hl, gl) {
46
+ const centre = webMercatorTile(lat, lng, COVERAGE_ZOOM);
47
+ const offsets = radiusMeters > COVERAGE_TILE_SPAN_METERS / 2
48
+ ? [
49
+ [0, 0],
50
+ [-1, 0],
51
+ [1, 0],
52
+ [0, -1],
53
+ [0, 1],
54
+ [-1, -1],
55
+ [-1, 1],
56
+ [1, -1],
57
+ [1, 1],
58
+ ]
59
+ : [[0, 0]];
60
+ const seen = new Set();
61
+ const collected = [];
62
+ for (const [dx, dy] of offsets) {
63
+ let refs;
64
+ try {
65
+ const data = await this.http.get(buildCoverageTileUrl({ tileX: centre.x + dx, tileY: centre.y + dy, hl, gl }), { referer: 'https://www.google.com/maps/', includeOrigin: true, allowShortBody: true });
66
+ refs = extractCoveragePanoramas(data);
67
+ }
68
+ catch {
69
+ continue;
70
+ }
71
+ for (const ref of refs) {
72
+ if (seen.has(ref.panoId))
73
+ continue;
74
+ seen.add(ref.panoId);
75
+ collected.push(ref);
76
+ }
77
+ }
78
+ return this.rankByDistance(collected, lat, lng, radiusMeters);
79
+ }
80
+ /** Fallback lookup that also yields Google-hosted thumbnails. */
81
+ async findViaEntityPhotos(lat, lng, radiusMeters, hl, gl) {
82
+ const url = buildListEntityPhotosUrl({ lat, lng, radiusMeters, hl, gl });
83
+ const requestOpts = {
84
+ referer: 'https://www.google.com/maps/',
85
+ includeOrigin: true,
86
+ noRetry: true,
87
+ };
88
+ let data;
89
+ try {
90
+ data = await this.http.get(url, requestOpts);
91
+ }
92
+ catch (error) {
93
+ if (error instanceof GMapsPhotosBlockedError)
94
+ throw error;
95
+ if (error instanceof GMapsNetworkError && error.message.includes('403')) {
96
+ throw new GMapsPhotosBlockedError(undefined, error.message);
97
+ }
98
+ throw error;
99
+ }
100
+ const refs = extractNearbyPanoramas(data).filter((ref) => isLikelyStreetViewPanoId(ref.panoId));
101
+ return this.rankByDistance(refs, lat, lng, radiusMeters);
102
+ }
103
+ /**
104
+ * Order candidates by proximity, keeping those without coordinates as a last resort.
105
+ *
106
+ * A tile covers more ground than the requested radius, so unfiltered results can sit
107
+ * hundreds of metres away; but discarding every out-of-radius hit would return nothing
108
+ * in sparsely covered areas, so they are kept behind the in-radius ones.
109
+ */
110
+ rankByDistance(refs, lat, lng, radiusMeters) {
111
+ const scored = refs.map((ref) => ({
112
+ ref,
113
+ distance: ref.lat != null && ref.lng != null
114
+ ? haversineMeters(lat, lng, ref.lat, ref.lng)
115
+ : Number.POSITIVE_INFINITY,
116
+ }));
117
+ scored.sort((a, b) => a.distance - b.distance);
118
+ const withinRadius = scored.filter((entry) => entry.distance <= radiusMeters);
119
+ return (withinRadius.length > 0 ? withinRadius : scored).map((entry) => entry.ref);
120
+ }
121
+ /** Fetch full metadata for a panorama id; null when Google returns the stub response. */
122
+ async get(panoId, options) {
123
+ const hl = options?.hl ?? this.hl;
124
+ const gl = options?.gl ?? this.gl;
125
+ const url = buildPhotometaUrl({ panoId, hl, gl });
126
+ const data = await this.http.get(url, {
127
+ referer: 'https://www.google.com/maps/',
128
+ includeOrigin: true,
129
+ allowShortBody: true,
130
+ });
131
+ return extractPanoramaMetadata(data, { raw: options?.raw });
132
+ }
133
+ /** Resolve the closest panorama near a point, then fetch its full metadata. */
134
+ async getByLocation(lat, lng, options) {
135
+ const nearby = await this.findNearby({
136
+ lat,
137
+ lng,
138
+ radiusMeters: options?.radiusMeters,
139
+ hl: options?.hl,
140
+ gl: options?.gl,
141
+ });
142
+ const candidates = nearby.filter((ref) => isLikelyStreetViewPanoId(ref.panoId));
143
+ for (const ref of candidates.slice(0, 10)) {
144
+ try {
145
+ const meta = await this.get(ref.panoId, options);
146
+ if (meta)
147
+ return meta;
148
+ }
149
+ catch {
150
+ // Not every discovered id resolves on photometa — try the next closest.
151
+ }
152
+ }
153
+ return null;
154
+ }
155
+ /** Build a Street View thumbnail URL (no network I/O). */
156
+ buildThumbnailUrl(options) {
157
+ return buildThumbnailUrl({
158
+ panoId: options.panoId,
159
+ width: options.width,
160
+ height: options.height,
161
+ pitch: options.pitch,
162
+ yaw: options.yaw,
163
+ });
164
+ }
165
+ /** Build a Street View tile URL (no network I/O). */
166
+ buildTileUrl(options) {
167
+ return buildTileUrl({
168
+ panoId: options.panoId,
169
+ x: options.x,
170
+ y: options.y,
171
+ zoom: options.zoom,
172
+ });
173
+ }
174
+ }
175
+ //# sourceMappingURL=panorama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panorama.js","sourceRoot":"","sources":["../../src/services/panorama.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { HttpClient } from '../client/http-client.js';
2
+ import { type GMapsConfig } from '../types/common.js';
3
+ import type { PassiveAssistOptions, PassiveAssistResult } from '../types/passiveassist.js';
4
+ export declare class PassiveAssistService {
5
+ private http;
6
+ private hl;
7
+ private gl;
8
+ constructor(http: HttpClient, config: GMapsConfig);
9
+ /**
10
+ * Viewport POI chips for the map camera (weather, events, neighbourhood labels).
11
+ *
12
+ * Needs an in-page viewport psi: bootstrap kEI / fetchSessionPsi tokens return
13
+ * the ~212 B cache-metadata stub, and only a token from a live viewport
14
+ * passiveassist request yields chips. Such a token is portable — it replays over
15
+ * plain Node fetch and stays valid for at least a few minutes — but minting one
16
+ * requires a browser, so pass `psi` yourself or supply a `psiProvider`. This
17
+ * service will not start a browser on your behalf.
18
+ */
19
+ getViewportChips(options: PassiveAssistOptions): Promise<PassiveAssistResult>;
20
+ }
21
+ //# sourceMappingURL=passiveassist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passiveassist.d.ts","sourceRoot":"","sources":["../../src/services/passiveassist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAG3F,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,EAAE,CAAS;IACnB,OAAO,CAAC,EAAE,CAAS;gBAEP,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW;IAMjD;;;;;;;;;OASG;IACG,gBAAgB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAoDpF"}
@@ -0,0 +1,70 @@
1
+ import { extractPassiveAssistChips } from '../parsers/passiveassist.js';
2
+ import { buildPassiveAssistUrl } from '../rpc/passiveassist-pb.js';
3
+ import { GMapsError } from '../types/common.js';
4
+ export class PassiveAssistService {
5
+ http;
6
+ hl;
7
+ gl;
8
+ constructor(http, config) {
9
+ this.http = http;
10
+ this.hl = config.hl ?? 'en';
11
+ this.gl = config.gl ?? 'us';
12
+ }
13
+ /**
14
+ * Viewport POI chips for the map camera (weather, events, neighbourhood labels).
15
+ *
16
+ * Needs an in-page viewport psi: bootstrap kEI / fetchSessionPsi tokens return
17
+ * the ~212 B cache-metadata stub, and only a token from a live viewport
18
+ * passiveassist request yields chips. Such a token is portable — it replays over
19
+ * plain Node fetch and stays valid for at least a few minutes — but minting one
20
+ * requires a browser, so pass `psi` yourself or supply a `psiProvider`. This
21
+ * service will not start a browser on your behalf.
22
+ */
23
+ async getViewportChips(options) {
24
+ const hl = options.hl ?? this.hl;
25
+ const gl = options.gl ?? this.gl;
26
+ let psi = options.psi;
27
+ let url;
28
+ if (!psi && options.psiProvider) {
29
+ const minted = await options.psiProvider({
30
+ lat: options.lat,
31
+ lng: options.lng,
32
+ zoom: options.zoom,
33
+ hl,
34
+ gl,
35
+ });
36
+ if (typeof minted === 'string') {
37
+ psi = minted;
38
+ }
39
+ else {
40
+ psi = minted.psi;
41
+ url = minted.passiveAssistUrl;
42
+ }
43
+ }
44
+ if (!psi) {
45
+ throw new GMapsError('passiveassist needs an in-page viewport psi: pass `psi`, or a `psiProvider` ' +
46
+ '(see mintViewportPsi in scripts/lib/mint-viewport-psi.ts, which uses a headless browser). ' +
47
+ 'Bootstrap tokens only return the cache-metadata stub.');
48
+ }
49
+ if (!url) {
50
+ url = buildPassiveAssistUrl({
51
+ lat: options.lat,
52
+ lng: options.lng,
53
+ zoom: options.zoom,
54
+ psi,
55
+ width: options.width,
56
+ height: options.height,
57
+ chipLimit: options.chipLimit,
58
+ hl,
59
+ gl,
60
+ });
61
+ }
62
+ const data = await this.http.get(url, {
63
+ referer: 'https://www.google.com/maps/',
64
+ includeOrigin: true,
65
+ allowShortBody: true,
66
+ });
67
+ return extractPassiveAssistChips(data);
68
+ }
69
+ }
70
+ //# sourceMappingURL=passiveassist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passiveassist.js","sourceRoot":"","sources":["../../src/services/passiveassist.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,UAAU,EAAoB,MAAM,oBAAoB,CAAC;AAIlE,MAAM,OAAO,oBAAoB;IACvB,IAAI,CAAa;IACjB,EAAE,CAAS;IACX,EAAE,CAAS;IAEnB,YAAY,IAAgB,EAAE,MAAmB;QAC/C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC;QAC5B,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,EAAE,IAAI,IAAI,CAAC;IAC9B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,gBAAgB,CAAC,OAA6B;QAClD,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACjC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,CAAC;QACjC,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACtB,IAAI,GAAuB,CAAC;QAE5B,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC;gBACvC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,EAAE;gBACF,EAAE;aACH,CAAC,CAAC;YACH,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC/B,GAAG,GAAG,MAAM,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;gBACjB,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC;YAChC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,UAAU,CAClB,8EAA8E;gBAC5E,4FAA4F;gBAC5F,uDAAuD,CAC1D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,qBAAqB,CAAC;gBAC1B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,GAAG;gBACH,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,EAAE;gBACF,EAAE;aACH,CAAC,CAAC;QACL,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,GAAG,EAAE;YAC5C,OAAO,EAAE,8BAA8B;YACvC,aAAa,EAAE,IAAI;YACnB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;QAEH,OAAO,yBAAyB,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;CACF"}