googlemaps-kit 0.4.0 → 0.6.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 (661) hide show
  1. package/README.md +228 -27
  2. package/dist/advanced/http.d.ts +4 -4
  3. package/dist/advanced/http.d.ts.map +1 -1
  4. package/dist/advanced/http.js +4 -4
  5. package/dist/advanced/http.js.map +1 -1
  6. package/dist/advanced/parsers.d.ts +9 -4
  7. package/dist/advanced/parsers.d.ts.map +1 -1
  8. package/dist/advanced/parsers.js +6 -3
  9. package/dist/advanced/parsers.js.map +1 -1
  10. package/dist/advanced/rpc.d.ts +12 -12
  11. package/dist/advanced/rpc.d.ts.map +1 -1
  12. package/dist/advanced/rpc.js +10 -10
  13. package/dist/advanced/rpc.js.map +1 -1
  14. package/dist/advanced/services.d.ts +18 -7
  15. package/dist/advanced/services.d.ts.map +1 -1
  16. package/dist/advanced/services.js +18 -7
  17. package/dist/advanced/services.js.map +1 -1
  18. package/dist/advanced/utils.d.ts +3 -3
  19. package/dist/advanced/utils.d.ts.map +1 -1
  20. package/dist/advanced/utils.js +3 -3
  21. package/dist/advanced/utils.js.map +1 -1
  22. package/dist/advanced.d.ts +47 -10
  23. package/dist/advanced.d.ts.map +1 -1
  24. package/dist/advanced.js +13 -6
  25. package/dist/advanced.js.map +1 -1
  26. package/dist/auth/auth-status.js +2 -2
  27. package/dist/auth/auth-status.js.map +1 -1
  28. package/dist/auth/maps-tokens.js +1 -1
  29. package/dist/auth/session.d.ts.map +1 -1
  30. package/dist/auth/session.js +17 -2
  31. package/dist/auth/session.js.map +1 -1
  32. package/dist/cli/args.d.ts +1 -0
  33. package/dist/cli/args.d.ts.map +1 -1
  34. package/dist/cli/args.js +24 -0
  35. package/dist/cli/args.js.map +1 -1
  36. package/dist/cli/format.d.ts.map +1 -1
  37. package/dist/cli/format.js +18 -27
  38. package/dist/cli/format.js.map +1 -1
  39. package/dist/cli/output.d.ts +19 -0
  40. package/dist/cli/output.d.ts.map +1 -0
  41. package/dist/cli/output.js +82 -0
  42. package/dist/cli/output.js.map +1 -0
  43. package/dist/cli/run.d.ts +55 -3
  44. package/dist/cli/run.d.ts.map +1 -1
  45. package/dist/cli/run.js +239 -18
  46. package/dist/cli/run.js.map +1 -1
  47. package/dist/cli/tui/app.d.ts +7 -2
  48. package/dist/cli/tui/app.d.ts.map +1 -1
  49. package/dist/cli/tui/app.js +116 -31
  50. package/dist/cli/tui/app.js.map +1 -1
  51. package/dist/cli/tui/styles.d.ts.map +1 -1
  52. package/dist/cli/tui/styles.js +13 -10
  53. package/dist/cli/tui/styles.js.map +1 -1
  54. package/dist/cli.d.ts +1 -10
  55. package/dist/cli.d.ts.map +1 -1
  56. package/dist/cli.js +122 -36
  57. package/dist/cli.js.map +1 -1
  58. package/dist/client/gmaps-client.d.ts +14 -31
  59. package/dist/client/gmaps-client.d.ts.map +1 -1
  60. package/dist/client/gmaps-client.js +52 -130
  61. package/dist/client/gmaps-client.js.map +1 -1
  62. package/dist/client/http-client.d.ts.map +1 -1
  63. package/dist/client/http-client.js +11 -9
  64. package/dist/client/http-client.js.map +1 -1
  65. package/dist/client/intent.d.ts +2 -12
  66. package/dist/client/intent.d.ts.map +1 -1
  67. package/dist/client/intent.js +39 -18
  68. package/dist/client/intent.js.map +1 -1
  69. package/dist/client/maps-tools.d.ts +19 -3
  70. package/dist/client/maps-tools.d.ts.map +1 -1
  71. package/dist/client/maps-tools.js +57 -4
  72. package/dist/client/maps-tools.js.map +1 -1
  73. package/dist/client/namespaces.d.ts +125 -16
  74. package/dist/client/namespaces.d.ts.map +1 -1
  75. package/dist/client/namespaces.js +189 -23
  76. package/dist/client/namespaces.js.map +1 -1
  77. package/dist/client/place-enrichment.js +1 -1
  78. package/dist/client/place-enrichment.js.map +1 -1
  79. package/dist/client/place-workflows.d.ts +7 -0
  80. package/dist/client/place-workflows.d.ts.map +1 -0
  81. package/dist/client/place-workflows.js +113 -0
  82. package/dist/client/place-workflows.js.map +1 -0
  83. package/dist/index.d.ts +54 -19
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +8 -4
  86. package/dist/index.js.map +1 -1
  87. package/dist/known-surfaces.d.ts +173 -5
  88. package/dist/known-surfaces.d.ts.map +1 -1
  89. package/dist/known-surfaces.js +173 -5
  90. package/dist/known-surfaces.js.map +1 -1
  91. package/dist/parsers/batch-url.d.ts +10 -1
  92. package/dist/parsers/batch-url.d.ts.map +1 -1
  93. package/dist/parsers/batch-url.js +30 -2
  94. package/dist/parsers/batch-url.js.map +1 -1
  95. package/dist/parsers/boq-reviews.d.ts +8 -1
  96. package/dist/parsers/boq-reviews.d.ts.map +1 -1
  97. package/dist/parsers/boq-reviews.js +50 -8
  98. package/dist/parsers/boq-reviews.js.map +1 -1
  99. package/dist/parsers/categories.d.ts.map +1 -1
  100. package/dist/parsers/categories.js +13 -10
  101. package/dist/parsers/categories.js.map +1 -1
  102. package/dist/parsers/directions.d.ts +18 -2
  103. package/dist/parsers/directions.d.ts.map +1 -1
  104. package/dist/parsers/directions.js +232 -18
  105. package/dist/parsers/directions.js.map +1 -1
  106. package/dist/parsers/geocode.d.ts +20 -2
  107. package/dist/parsers/geocode.d.ts.map +1 -1
  108. package/dist/parsers/geocode.js +139 -6
  109. package/dist/parsers/geocode.js.map +1 -1
  110. package/dist/parsers/knowledge.js +1 -1
  111. package/dist/parsers/knowledge.js.map +1 -1
  112. package/dist/parsers/lists.d.ts.map +1 -1
  113. package/dist/parsers/lists.js +29 -12
  114. package/dist/parsers/lists.js.map +1 -1
  115. package/dist/parsers/local-posts.d.ts.map +1 -1
  116. package/dist/parsers/local-posts.js +97 -12
  117. package/dist/parsers/local-posts.js.map +1 -1
  118. package/dist/parsers/mobility.d.ts +42 -0
  119. package/dist/parsers/mobility.d.ts.map +1 -0
  120. package/dist/parsers/mobility.js +130 -0
  121. package/dist/parsers/mobility.js.map +1 -0
  122. package/dist/parsers/panorama.d.ts +0 -1
  123. package/dist/parsers/panorama.d.ts.map +1 -1
  124. package/dist/parsers/panorama.js +117 -14
  125. package/dist/parsers/panorama.js.map +1 -1
  126. package/dist/parsers/photos.d.ts.map +1 -1
  127. package/dist/parsers/photos.js +15 -8
  128. package/dist/parsers/photos.js.map +1 -1
  129. package/dist/parsers/place-attributes.d.ts +12 -3
  130. package/dist/parsers/place-attributes.d.ts.map +1 -1
  131. package/dist/parsers/place-attributes.js +48 -2
  132. package/dist/parsers/place-attributes.js.map +1 -1
  133. package/dist/parsers/place-extended.d.ts +163 -0
  134. package/dist/parsers/place-extended.d.ts.map +1 -0
  135. package/dist/parsers/place-extended.js +741 -0
  136. package/dist/parsers/place-extended.js.map +1 -0
  137. package/dist/parsers/place.d.ts +15 -1
  138. package/dist/parsers/place.d.ts.map +1 -1
  139. package/dist/parsers/place.js +16 -5
  140. package/dist/parsers/place.js.map +1 -1
  141. package/dist/parsers/popular-times.d.ts +35 -0
  142. package/dist/parsers/popular-times.d.ts.map +1 -0
  143. package/dist/parsers/popular-times.js +149 -0
  144. package/dist/parsers/popular-times.js.map +1 -0
  145. package/dist/parsers/reveal.d.ts +1 -1
  146. package/dist/parsers/reveal.d.ts.map +1 -1
  147. package/dist/parsers/reveal.js +3 -2
  148. package/dist/parsers/reveal.js.map +1 -1
  149. package/dist/parsers/reviews.d.ts +24 -2
  150. package/dist/parsers/reviews.d.ts.map +1 -1
  151. package/dist/parsers/reviews.js +110 -1
  152. package/dist/parsers/reviews.js.map +1 -1
  153. package/dist/parsers/search.d.ts +17 -2
  154. package/dist/parsers/search.d.ts.map +1 -1
  155. package/dist/parsers/search.js +125 -7
  156. package/dist/parsers/search.js.map +1 -1
  157. package/dist/parsers/shared.d.ts +4 -0
  158. package/dist/parsers/shared.d.ts.map +1 -1
  159. package/dist/parsers/shared.js +10 -2
  160. package/dist/parsers/shared.js.map +1 -1
  161. package/dist/parsers/suggest.d.ts.map +1 -1
  162. package/dist/parsers/suggest.js +45 -6
  163. package/dist/parsers/suggest.js.map +1 -1
  164. package/dist/parsers/tiles.d.ts +13 -0
  165. package/dist/parsers/tiles.d.ts.map +1 -1
  166. package/dist/parsers/tiles.js +64 -0
  167. package/dist/parsers/tiles.js.map +1 -1
  168. package/dist/parsers/traffic.d.ts +9 -1
  169. package/dist/parsers/traffic.d.ts.map +1 -1
  170. package/dist/parsers/traffic.js +129 -2
  171. package/dist/parsers/traffic.js.map +1 -1
  172. package/dist/parsers/transit.d.ts +4 -2
  173. package/dist/parsers/transit.d.ts.map +1 -1
  174. package/dist/parsers/transit.js +385 -3
  175. package/dist/parsers/transit.js.map +1 -1
  176. package/dist/parsers/viewport.d.ts +20 -0
  177. package/dist/parsers/viewport.d.ts.map +1 -0
  178. package/dist/parsers/viewport.js +139 -0
  179. package/dist/parsers/viewport.js.map +1 -0
  180. package/dist/platform/catalog.d.ts +18 -0
  181. package/dist/platform/catalog.d.ts.map +1 -0
  182. package/dist/platform/catalog.js +329 -0
  183. package/dist/platform/catalog.js.map +1 -0
  184. package/dist/platform/parity.d.ts +12 -0
  185. package/dist/platform/parity.d.ts.map +1 -0
  186. package/dist/platform/parity.js +25 -0
  187. package/dist/platform/parity.js.map +1 -0
  188. package/dist/rpc/batch-execute.js +3 -3
  189. package/dist/rpc/batch-execute.js.map +1 -1
  190. package/dist/rpc/batch-request-builders.d.ts +12 -14
  191. package/dist/rpc/batch-request-builders.d.ts.map +1 -1
  192. package/dist/rpc/batch-request-builders.js +49 -17
  193. package/dist/rpc/batch-request-builders.js.map +1 -1
  194. package/dist/rpc/batch-rpc.js +1 -1
  195. package/dist/rpc/batch-services.d.ts +2 -0
  196. package/dist/rpc/batch-services.d.ts.map +1 -1
  197. package/dist/rpc/batch-services.js +4 -0
  198. package/dist/rpc/batch-services.js.map +1 -1
  199. package/dist/rpc/{descriptor-registry.d.ts → descriptors.d.ts} +29 -4
  200. package/dist/rpc/descriptors.d.ts.map +1 -0
  201. package/dist/rpc/{app-options.js → descriptors.js} +89 -5
  202. package/dist/rpc/descriptors.js.map +1 -0
  203. package/dist/rpc/earth-rocktree.d.ts +174 -0
  204. package/dist/rpc/earth-rocktree.d.ts.map +1 -0
  205. package/dist/rpc/earth-rocktree.js +468 -0
  206. package/dist/rpc/earth-rocktree.js.map +1 -0
  207. package/dist/rpc/feature-pb.d.ts +86 -0
  208. package/dist/rpc/feature-pb.d.ts.map +1 -0
  209. package/dist/rpc/feature-pb.js +112 -0
  210. package/dist/rpc/feature-pb.js.map +1 -0
  211. package/dist/rpc/feature-rpc.d.ts +15 -0
  212. package/dist/rpc/feature-rpc.d.ts.map +1 -1
  213. package/dist/rpc/feature-rpc.js +44 -0
  214. package/dist/rpc/feature-rpc.js.map +1 -1
  215. package/dist/rpc/maps-runtime.js +1 -1
  216. package/dist/rpc/panorama-pb.d.ts +3 -0
  217. package/dist/rpc/panorama-pb.d.ts.map +1 -1
  218. package/dist/rpc/panorama-pb.js +35 -3
  219. package/dist/rpc/panorama-pb.js.map +1 -1
  220. package/dist/rpc/pb-builders.d.ts +21 -1
  221. package/dist/rpc/pb-builders.d.ts.map +1 -1
  222. package/dist/rpc/pb-builders.js +62 -4
  223. package/dist/rpc/pb-builders.js.map +1 -1
  224. package/dist/rpc/photos-pb.d.ts +28 -1
  225. package/dist/rpc/photos-pb.d.ts.map +1 -1
  226. package/dist/rpc/photos-pb.js +96 -0
  227. package/dist/rpc/photos-pb.js.map +1 -1
  228. package/dist/rpc/rpc-methods.d.ts +0 -2
  229. package/dist/rpc/rpc-methods.d.ts.map +1 -1
  230. package/dist/rpc/rpc-methods.js +0 -38
  231. package/dist/rpc/rpc-methods.js.map +1 -1
  232. package/dist/rpc/search-filters.d.ts +0 -12
  233. package/dist/rpc/search-filters.d.ts.map +1 -1
  234. package/dist/rpc/search-filters.js +1 -11
  235. package/dist/rpc/search-filters.js.map +1 -1
  236. package/dist/rpc/tile-builders.d.ts +136 -0
  237. package/dist/rpc/tile-builders.d.ts.map +1 -0
  238. package/dist/rpc/tile-builders.js +172 -0
  239. package/dist/rpc/tile-builders.js.map +1 -0
  240. package/dist/rpc/xsrf-bootstrap.d.ts +0 -2
  241. package/dist/rpc/xsrf-bootstrap.d.ts.map +1 -1
  242. package/dist/rpc/xsrf-bootstrap.js +2 -2
  243. package/dist/rpc/xsrf-bootstrap.js.map +1 -1
  244. package/dist/services/aerial-view.d.ts +22 -0
  245. package/dist/services/aerial-view.d.ts.map +1 -0
  246. package/dist/services/aerial-view.js +107 -0
  247. package/dist/services/aerial-view.js.map +1 -0
  248. package/dist/services/ask-maps.d.ts +45 -5
  249. package/dist/services/ask-maps.d.ts.map +1 -1
  250. package/dist/services/ask-maps.js +148 -21
  251. package/dist/services/ask-maps.js.map +1 -1
  252. package/dist/services/directions.d.ts +17 -1
  253. package/dist/services/directions.d.ts.map +1 -1
  254. package/dist/services/directions.js +32 -0
  255. package/dist/services/directions.js.map +1 -1
  256. package/dist/services/distance-matrix.d.ts +1 -1
  257. package/dist/services/distance-matrix.d.ts.map +1 -1
  258. package/dist/services/distance-matrix.js +1 -1
  259. package/dist/services/distance-matrix.js.map +1 -1
  260. package/dist/services/elevation.d.ts +7 -5
  261. package/dist/services/elevation.d.ts.map +1 -1
  262. package/dist/services/elevation.js +42 -6
  263. package/dist/services/elevation.js.map +1 -1
  264. package/dist/services/environment/air-quality.d.ts +39 -0
  265. package/dist/services/environment/air-quality.d.ts.map +1 -0
  266. package/dist/services/environment/air-quality.js +86 -0
  267. package/dist/services/environment/air-quality.js.map +1 -0
  268. package/dist/services/environment/weather.d.ts +39 -0
  269. package/dist/services/environment/weather.d.ts.map +1 -0
  270. package/dist/services/environment/weather.js +54 -0
  271. package/dist/services/environment/weather.js.map +1 -0
  272. package/dist/services/geocode.d.ts +21 -1
  273. package/dist/services/geocode.d.ts.map +1 -1
  274. package/dist/services/geocode.js +103 -0
  275. package/dist/services/geocode.js.map +1 -1
  276. package/dist/services/keyed.d.ts +80 -0
  277. package/dist/services/keyed.d.ts.map +1 -0
  278. package/dist/services/keyed.js +152 -0
  279. package/dist/services/keyed.js.map +1 -0
  280. package/dist/services/knowledge.d.ts +6 -2
  281. package/dist/services/knowledge.d.ts.map +1 -1
  282. package/dist/services/knowledge.js +30 -5
  283. package/dist/services/knowledge.js.map +1 -1
  284. package/dist/services/lists.d.ts +7 -1
  285. package/dist/services/lists.d.ts.map +1 -1
  286. package/dist/services/lists.js +45 -1
  287. package/dist/services/lists.js.map +1 -1
  288. package/dist/services/map-3d.d.ts +66 -0
  289. package/dist/services/map-3d.d.ts.map +1 -0
  290. package/dist/services/map-3d.js +658 -0
  291. package/dist/services/map-3d.js.map +1 -0
  292. package/dist/services/map-layers.d.ts +33 -0
  293. package/dist/services/map-layers.d.ts.map +1 -0
  294. package/dist/services/map-layers.js +207 -0
  295. package/dist/services/map-layers.js.map +1 -0
  296. package/dist/services/meta.d.ts +71 -0
  297. package/dist/services/meta.d.ts.map +1 -0
  298. package/dist/services/meta.js +132 -0
  299. package/dist/services/meta.js.map +1 -0
  300. package/dist/services/mobility.d.ts +79 -0
  301. package/dist/services/mobility.d.ts.map +1 -0
  302. package/dist/services/mobility.js +307 -0
  303. package/dist/services/mobility.js.map +1 -0
  304. package/dist/services/nearby-search.d.ts +32 -0
  305. package/dist/services/nearby-search.d.ts.map +1 -0
  306. package/dist/services/nearby-search.js +85 -0
  307. package/dist/services/nearby-search.js.map +1 -0
  308. package/dist/services/panorama.d.ts +19 -1
  309. package/dist/services/panorama.d.ts.map +1 -1
  310. package/dist/services/panorama.js +111 -3
  311. package/dist/services/panorama.js.map +1 -1
  312. package/dist/services/photos.d.ts.map +1 -1
  313. package/dist/services/photos.js +12 -6
  314. package/dist/services/photos.js.map +1 -1
  315. package/dist/services/place-attributes.d.ts +31 -0
  316. package/dist/services/place-attributes.d.ts.map +1 -0
  317. package/dist/services/place-attributes.js +48 -0
  318. package/dist/services/place-attributes.js.map +1 -0
  319. package/dist/services/places.d.ts +13 -0
  320. package/dist/services/places.d.ts.map +1 -1
  321. package/dist/services/places.js +7 -4
  322. package/dist/services/places.js.map +1 -1
  323. package/dist/services/reviews.d.ts +11 -1
  324. package/dist/services/reviews.d.ts.map +1 -1
  325. package/dist/services/reviews.js +36 -12
  326. package/dist/services/reviews.js.map +1 -1
  327. package/dist/services/search-along-route.d.ts +33 -0
  328. package/dist/services/search-along-route.d.ts.map +1 -0
  329. package/dist/services/search-along-route.js +200 -0
  330. package/dist/services/search-along-route.js.map +1 -0
  331. package/dist/services/search.d.ts +29 -2
  332. package/dist/services/search.d.ts.map +1 -1
  333. package/dist/services/search.js +169 -6
  334. package/dist/services/search.js.map +1 -1
  335. package/dist/services/static-map.js +1 -1
  336. package/dist/services/static-map.js.map +1 -1
  337. package/dist/services/tiles.d.ts +39 -2
  338. package/dist/services/tiles.d.ts.map +1 -1
  339. package/dist/services/tiles.js +172 -13
  340. package/dist/services/tiles.js.map +1 -1
  341. package/dist/services/traffic.d.ts +12 -1
  342. package/dist/services/traffic.d.ts.map +1 -1
  343. package/dist/services/traffic.js +25 -2
  344. package/dist/services/traffic.js.map +1 -1
  345. package/dist/services/transit.d.ts +20 -3
  346. package/dist/services/transit.d.ts.map +1 -1
  347. package/dist/services/transit.js +69 -1
  348. package/dist/services/transit.js.map +1 -1
  349. package/dist/services/viewport.d.ts +76 -0
  350. package/dist/services/viewport.d.ts.map +1 -0
  351. package/dist/services/viewport.js +180 -0
  352. package/dist/services/viewport.js.map +1 -0
  353. package/dist/services/waypoint-optimizer.d.ts +31 -0
  354. package/dist/services/waypoint-optimizer.d.ts.map +1 -0
  355. package/dist/services/waypoint-optimizer.js +235 -0
  356. package/dist/services/waypoint-optimizer.js.map +1 -0
  357. package/dist/types/aerial-view.d.ts +39 -0
  358. package/dist/types/aerial-view.d.ts.map +1 -0
  359. package/dist/types/aerial-view.js +2 -0
  360. package/dist/types/aerial-view.js.map +1 -0
  361. package/dist/types/batch-url.d.ts +31 -0
  362. package/dist/types/batch-url.d.ts.map +1 -1
  363. package/dist/types/categories.d.ts +20 -4
  364. package/dist/types/categories.d.ts.map +1 -1
  365. package/dist/types/common.d.ts +192 -24
  366. package/dist/types/common.d.ts.map +1 -1
  367. package/dist/types/common.js +1 -1
  368. package/dist/types/common.js.map +1 -1
  369. package/dist/types/directions.d.ts +217 -3
  370. package/dist/types/directions.d.ts.map +1 -1
  371. package/dist/types/dx.d.ts +69 -11
  372. package/dist/types/dx.d.ts.map +1 -1
  373. package/dist/types/geocode.d.ts +61 -3
  374. package/dist/types/geocode.d.ts.map +1 -1
  375. package/dist/types/grid-search.d.ts +66 -0
  376. package/dist/types/grid-search.d.ts.map +1 -0
  377. package/dist/types/grid-search.js +2 -0
  378. package/dist/types/grid-search.js.map +1 -0
  379. package/dist/types/hooks.d.ts +3 -3
  380. package/dist/types/hooks.d.ts.map +1 -1
  381. package/dist/types/links.d.ts +3 -6
  382. package/dist/types/links.d.ts.map +1 -1
  383. package/dist/types/lists.d.ts +68 -3
  384. package/dist/types/lists.d.ts.map +1 -1
  385. package/dist/types/map-3d.d.ts +126 -0
  386. package/dist/types/map-3d.d.ts.map +1 -0
  387. package/dist/types/map-3d.js +2 -0
  388. package/dist/types/map-3d.js.map +1 -0
  389. package/dist/types/map-earth.d.ts +34 -0
  390. package/dist/types/map-earth.d.ts.map +1 -0
  391. package/dist/types/map-earth.js +2 -0
  392. package/dist/types/map-earth.js.map +1 -0
  393. package/dist/types/map-layers.d.ts +63 -0
  394. package/dist/types/map-layers.d.ts.map +1 -0
  395. package/dist/types/map-layers.js +2 -0
  396. package/dist/types/map-layers.js.map +1 -0
  397. package/dist/types/mobility.d.ts +121 -0
  398. package/dist/types/mobility.d.ts.map +1 -0
  399. package/dist/types/mobility.js +3 -0
  400. package/dist/types/mobility.js.map +1 -0
  401. package/dist/types/panorama.d.ts +123 -0
  402. package/dist/types/panorama.d.ts.map +1 -1
  403. package/dist/types/photos.d.ts +12 -0
  404. package/dist/types/photos.d.ts.map +1 -1
  405. package/dist/types/photos.js +2 -1
  406. package/dist/types/photos.js.map +1 -1
  407. package/dist/types/place-attributes.d.ts +15 -0
  408. package/dist/types/place-attributes.d.ts.map +1 -0
  409. package/dist/types/place-attributes.js +2 -0
  410. package/dist/types/place-attributes.js.map +1 -0
  411. package/dist/types/place-extended.d.ts +406 -0
  412. package/dist/types/place-extended.d.ts.map +1 -0
  413. package/dist/types/place-extended.js +18 -0
  414. package/dist/types/place-extended.js.map +1 -0
  415. package/dist/types/protobuf.d.ts +1 -1
  416. package/dist/types/protobuf.js +1 -1
  417. package/dist/types/reviews.d.ts +28 -1
  418. package/dist/types/reviews.d.ts.map +1 -1
  419. package/dist/types/reviews.js.map +1 -1
  420. package/dist/types/route-optimization.d.ts +56 -0
  421. package/dist/types/route-optimization.d.ts.map +1 -0
  422. package/dist/types/route-optimization.js +2 -0
  423. package/dist/types/route-optimization.js.map +1 -0
  424. package/dist/types/search-along-route.d.ts +49 -0
  425. package/dist/types/search-along-route.d.ts.map +1 -0
  426. package/dist/types/search-along-route.js +2 -0
  427. package/dist/types/search-along-route.js.map +1 -0
  428. package/dist/types/search-filters.d.ts +1 -1
  429. package/dist/types/search-filters.js +1 -1
  430. package/dist/types/suggest.d.ts +23 -2
  431. package/dist/types/suggest.d.ts.map +1 -1
  432. package/dist/types/tiles.d.ts +40 -0
  433. package/dist/types/tiles.d.ts.map +1 -1
  434. package/dist/types/traffic.d.ts +58 -1
  435. package/dist/types/traffic.d.ts.map +1 -1
  436. package/dist/types/transit.d.ts +160 -1
  437. package/dist/types/transit.d.ts.map +1 -1
  438. package/dist/types/transit.js +0 -1
  439. package/dist/types/transit.js.map +1 -1
  440. package/dist/types/viewport.d.ts +159 -0
  441. package/dist/types/viewport.d.ts.map +1 -0
  442. package/dist/types/viewport.js +3 -0
  443. package/dist/types/viewport.js.map +1 -0
  444. package/dist/utils/async.d.ts +44 -0
  445. package/dist/utils/async.d.ts.map +1 -0
  446. package/dist/utils/async.js +132 -0
  447. package/dist/utils/async.js.map +1 -0
  448. package/dist/utils/encoded-polyline.d.ts +43 -0
  449. package/dist/utils/encoded-polyline.d.ts.map +1 -1
  450. package/dist/utils/encoded-polyline.js +71 -0
  451. package/dist/utils/encoded-polyline.js.map +1 -1
  452. package/dist/utils/env.d.ts +6 -0
  453. package/dist/utils/env.d.ts.map +1 -0
  454. package/dist/utils/{load-env.js → env.js} +32 -7
  455. package/dist/utils/env.js.map +1 -0
  456. package/dist/utils/geo.d.ts +12 -0
  457. package/dist/utils/geo.d.ts.map +1 -1
  458. package/dist/utils/geo.js +20 -0
  459. package/dist/utils/geo.js.map +1 -1
  460. package/dist/utils/hooks.d.ts +2 -3
  461. package/dist/utils/hooks.d.ts.map +1 -1
  462. package/dist/utils/hooks.js +1 -1
  463. package/dist/utils/hooks.js.map +1 -1
  464. package/dist/utils/ids.d.ts +1 -0
  465. package/dist/utils/ids.d.ts.map +1 -1
  466. package/dist/utils/ids.js +10 -0
  467. package/dist/utils/ids.js.map +1 -1
  468. package/dist/utils/net.d.ts +46 -0
  469. package/dist/utils/net.d.ts.map +1 -0
  470. package/dist/utils/net.js +150 -0
  471. package/dist/utils/net.js.map +1 -0
  472. package/dist/utils/payload.d.ts +22 -0
  473. package/dist/utils/payload.d.ts.map +1 -0
  474. package/dist/utils/{chunked-decoder.js → payload.js} +80 -2
  475. package/dist/utils/payload.js.map +1 -0
  476. package/dist/utils/place-ref.d.ts +40 -3
  477. package/dist/utils/place-ref.d.ts.map +1 -1
  478. package/dist/utils/place-ref.js +94 -2
  479. package/dist/utils/place-ref.js.map +1 -1
  480. package/package.json +8 -5
  481. package/dist/client/product-namespaces.d.ts +0 -30
  482. package/dist/client/product-namespaces.d.ts.map +0 -1
  483. package/dist/client/product-namespaces.js +0 -47
  484. package/dist/client/product-namespaces.js.map +0 -1
  485. package/dist/parsers/elevation-directions.d.ts +0 -18
  486. package/dist/parsers/elevation-directions.d.ts.map +0 -1
  487. package/dist/parsers/elevation-directions.js +0 -102
  488. package/dist/parsers/elevation-directions.js.map +0 -1
  489. package/dist/parsers/passiveassist.d.ts +0 -10
  490. package/dist/parsers/passiveassist.d.ts.map +0 -1
  491. package/dist/parsers/passiveassist.js +0 -61
  492. package/dist/parsers/passiveassist.js.map +0 -1
  493. package/dist/parsers/review-aggregates.d.ts +0 -7
  494. package/dist/parsers/review-aggregates.d.ts.map +0 -1
  495. package/dist/parsers/review-aggregates.js +0 -18
  496. package/dist/parsers/review-aggregates.js.map +0 -1
  497. package/dist/parsers/review-client-filters.d.ts +0 -8
  498. package/dist/parsers/review-client-filters.d.ts.map +0 -1
  499. package/dist/parsers/review-client-filters.js +0 -28
  500. package/dist/parsers/review-client-filters.js.map +0 -1
  501. package/dist/parsers/search-client-filters.d.ts +0 -7
  502. package/dist/parsers/search-client-filters.d.ts.map +0 -1
  503. package/dist/parsers/search-client-filters.js +0 -44
  504. package/dist/parsers/search-client-filters.js.map +0 -1
  505. package/dist/parsers/search-pagination.d.ts +0 -12
  506. package/dist/parsers/search-pagination.d.ts.map +0 -1
  507. package/dist/parsers/search-pagination.js +0 -34
  508. package/dist/parsers/search-pagination.js.map +0 -1
  509. package/dist/parsers/timezone-geocode.d.ts +0 -20
  510. package/dist/parsers/timezone-geocode.d.ts.map +0 -1
  511. package/dist/parsers/timezone-geocode.js +0 -96
  512. package/dist/parsers/timezone-geocode.js.map +0 -1
  513. package/dist/parsers/ugc-aggregates.d.ts +0 -9
  514. package/dist/parsers/ugc-aggregates.d.ts.map +0 -1
  515. package/dist/parsers/ugc-aggregates.js +0 -23
  516. package/dist/parsers/ugc-aggregates.js.map +0 -1
  517. package/dist/rpc/app-options.d.ts +0 -25
  518. package/dist/rpc/app-options.d.ts.map +0 -1
  519. package/dist/rpc/app-options.js.map +0 -1
  520. package/dist/rpc/batchexecute-args.d.ts +0 -30
  521. package/dist/rpc/batchexecute-args.d.ts.map +0 -1
  522. package/dist/rpc/batchexecute-args.js +0 -35
  523. package/dist/rpc/batchexecute-args.js.map +0 -1
  524. package/dist/rpc/boq-reviews.d.ts +0 -16
  525. package/dist/rpc/boq-reviews.d.ts.map +0 -1
  526. package/dist/rpc/boq-reviews.js +0 -45
  527. package/dist/rpc/boq-reviews.js.map +0 -1
  528. package/dist/rpc/descriptor-registry.d.ts.map +0 -1
  529. package/dist/rpc/descriptor-registry.js +0 -47
  530. package/dist/rpc/descriptor-registry.js.map +0 -1
  531. package/dist/rpc/lists-pb.d.ts +0 -20
  532. package/dist/rpc/lists-pb.d.ts.map +0 -1
  533. package/dist/rpc/lists-pb.js +0 -20
  534. package/dist/rpc/lists-pb.js.map +0 -1
  535. package/dist/rpc/nxa.d.ts +0 -13
  536. package/dist/rpc/nxa.d.ts.map +0 -1
  537. package/dist/rpc/nxa.js +0 -44
  538. package/dist/rpc/nxa.js.map +0 -1
  539. package/dist/rpc/passiveassist-pb.d.ts +0 -21
  540. package/dist/rpc/passiveassist-pb.d.ts.map +0 -1
  541. package/dist/rpc/passiveassist-pb.js +0 -24
  542. package/dist/rpc/passiveassist-pb.js.map +0 -1
  543. package/dist/rpc/photo-category-tokens.d.ts +0 -29
  544. package/dist/rpc/photo-category-tokens.d.ts.map +0 -1
  545. package/dist/rpc/photo-category-tokens.js +0 -97
  546. package/dist/rpc/photo-category-tokens.js.map +0 -1
  547. package/dist/rpc/reveal-pb.d.ts +0 -26
  548. package/dist/rpc/reveal-pb.d.ts.map +0 -1
  549. package/dist/rpc/reveal-pb.js +0 -32
  550. package/dist/rpc/reveal-pb.js.map +0 -1
  551. package/dist/rpc/suggest-pb.d.ts +0 -34
  552. package/dist/rpc/suggest-pb.d.ts.map +0 -1
  553. package/dist/rpc/suggest-pb.js +0 -42
  554. package/dist/rpc/suggest-pb.js.map +0 -1
  555. package/dist/rpc/tiles-pb.d.ts +0 -45
  556. package/dist/rpc/tiles-pb.d.ts.map +0 -1
  557. package/dist/rpc/tiles-pb.js +0 -71
  558. package/dist/rpc/tiles-pb.js.map +0 -1
  559. package/dist/services/batch-url.d.ts +0 -18
  560. package/dist/services/batch-url.d.ts.map +0 -1
  561. package/dist/services/batch-url.js +0 -30
  562. package/dist/services/batch-url.js.map +0 -1
  563. package/dist/services/categories.d.ts +0 -21
  564. package/dist/services/categories.d.ts.map +0 -1
  565. package/dist/services/categories.js +0 -43
  566. package/dist/services/categories.js.map +0 -1
  567. package/dist/services/passiveassist.d.ts +0 -21
  568. package/dist/services/passiveassist.d.ts.map +0 -1
  569. package/dist/services/passiveassist.js +0 -70
  570. package/dist/services/passiveassist.js.map +0 -1
  571. package/dist/services/reveal.d.ts +0 -15
  572. package/dist/services/reveal.d.ts.map +0 -1
  573. package/dist/services/reveal.js +0 -41
  574. package/dist/services/reveal.js.map +0 -1
  575. package/dist/services/suggest.d.ts +0 -12
  576. package/dist/services/suggest.d.ts.map +0 -1
  577. package/dist/services/suggest.js +0 -36
  578. package/dist/services/suggest.js.map +0 -1
  579. package/dist/services/timezone.d.ts +0 -19
  580. package/dist/services/timezone.d.ts.map +0 -1
  581. package/dist/services/timezone.js +0 -91
  582. package/dist/services/timezone.js.map +0 -1
  583. package/dist/services/ugc-aggregates.d.ts +0 -17
  584. package/dist/services/ugc-aggregates.d.ts.map +0 -1
  585. package/dist/services/ugc-aggregates.js +0 -30
  586. package/dist/services/ugc-aggregates.js.map +0 -1
  587. package/dist/types/distance-matrix.d.ts +0 -40
  588. package/dist/types/distance-matrix.d.ts.map +0 -1
  589. package/dist/types/distance-matrix.js +0 -2
  590. package/dist/types/distance-matrix.js.map +0 -1
  591. package/dist/types/elevation.d.ts +0 -59
  592. package/dist/types/elevation.d.ts.map +0 -1
  593. package/dist/types/elevation.js +0 -2
  594. package/dist/types/elevation.js.map +0 -1
  595. package/dist/types/passiveassist.d.ts +0 -50
  596. package/dist/types/passiveassist.d.ts.map +0 -1
  597. package/dist/types/passiveassist.js +0 -2
  598. package/dist/types/passiveassist.js.map +0 -1
  599. package/dist/types/reveal.d.ts +0 -46
  600. package/dist/types/reveal.d.ts.map +0 -1
  601. package/dist/types/reveal.js +0 -2
  602. package/dist/types/reveal.js.map +0 -1
  603. package/dist/types/timezone.d.ts +0 -36
  604. package/dist/types/timezone.d.ts.map +0 -1
  605. package/dist/types/timezone.js +0 -2
  606. package/dist/types/timezone.js.map +0 -1
  607. package/dist/types/ugc-aggregates.d.ts +0 -14
  608. package/dist/types/ugc-aggregates.d.ts.map +0 -1
  609. package/dist/types/ugc-aggregates.js +0 -2
  610. package/dist/types/ugc-aggregates.js.map +0 -1
  611. package/dist/utils/abort.d.ts +0 -7
  612. package/dist/utils/abort.d.ts.map +0 -1
  613. package/dist/utils/abort.js +0 -43
  614. package/dist/utils/abort.js.map +0 -1
  615. package/dist/utils/chunked-decoder.d.ts +0 -9
  616. package/dist/utils/chunked-decoder.d.ts.map +0 -1
  617. package/dist/utils/chunked-decoder.js.map +0 -1
  618. package/dist/utils/coords.d.ts +0 -24
  619. package/dist/utils/coords.d.ts.map +0 -1
  620. package/dist/utils/coords.js +0 -37
  621. package/dist/utils/coords.js.map +0 -1
  622. package/dist/utils/feature-id.d.ts +0 -2
  623. package/dist/utils/feature-id.d.ts.map +0 -1
  624. package/dist/utils/feature-id.js +0 -11
  625. package/dist/utils/feature-id.js.map +0 -1
  626. package/dist/utils/load-env.d.ts +0 -7
  627. package/dist/utils/load-env.d.ts.map +0 -1
  628. package/dist/utils/load-env.js.map +0 -1
  629. package/dist/utils/pooled.d.ts +0 -8
  630. package/dist/utils/pooled.d.ts.map +0 -1
  631. package/dist/utils/pooled.js +0 -27
  632. package/dist/utils/pooled.js.map +0 -1
  633. package/dist/utils/request-context.d.ts +0 -9
  634. package/dist/utils/request-context.d.ts.map +0 -1
  635. package/dist/utils/request-context.js +0 -12
  636. package/dist/utils/request-context.js.map +0 -1
  637. package/dist/utils/request-scheduler.d.ts +0 -28
  638. package/dist/utils/request-scheduler.d.ts.map +0 -1
  639. package/dist/utils/request-scheduler.js +0 -58
  640. package/dist/utils/request-scheduler.js.map +0 -1
  641. package/dist/utils/response-parser.d.ts +0 -7
  642. package/dist/utils/response-parser.d.ts.map +0 -1
  643. package/dist/utils/response-parser.js +0 -50
  644. package/dist/utils/response-parser.js.map +0 -1
  645. package/dist/utils/retry-backoff.d.ts +0 -5
  646. package/dist/utils/retry-backoff.d.ts.map +0 -1
  647. package/dist/utils/retry-backoff.js +0 -23
  648. package/dist/utils/retry-backoff.js.map +0 -1
  649. package/dist/utils/safe-get.d.ts +0 -6
  650. package/dist/utils/safe-get.d.ts.map +0 -1
  651. package/dist/utils/safe-get.js +0 -29
  652. package/dist/utils/safe-get.js.map +0 -1
  653. package/dist/utils/throttle-detection.d.ts +0 -17
  654. package/dist/utils/throttle-detection.d.ts.map +0 -1
  655. package/dist/utils/throttle-detection.js +0 -71
  656. package/dist/utils/throttle-detection.js.map +0 -1
  657. package/dist/utils/ttl-cache.d.ts +0 -17
  658. package/dist/utils/ttl-cache.d.ts.map +0 -1
  659. package/dist/utils/ttl-cache.js +0 -43
  660. package/dist/utils/ttl-cache.js.map +0 -1
  661. /package/{assets → .github/assets}/banner.png +0 -0
@@ -0,0 +1,741 @@
1
+ /**
2
+ * Extended place parser: extracts all data points from the place preview protobuf
3
+ * that are not covered by the base extractPlaceDetails() / extractPlaceAggregateAttributes().
4
+ *
5
+ * This parser is designed to be called once (no extra HTTP requests) on the same
6
+ * placeData node returned by the place preview endpoint. All fields are optional;
7
+ * missing nodes produce undefined rather than throwing.
8
+ *
9
+ * Performance: all extractions are O(n) over the protobuf tree with bounded depth.
10
+ * The combined parse time is <1 ms on a 130 KB payload.
11
+ */
12
+ import { safeGet } from '../utils/payload.js';
13
+ import { extractPopularTimes } from './popular-times.js';
14
+ import { asNumber as asNum, asString as asStr } from './shared.js';
15
+ function stripHtml(value) {
16
+ return value.replace(/<[^>]+>/g, '').replace(/&amp;/g, '&').replace(/&#39;/g, "'").replace(/&quot;/g, '"').replace(/&nbsp;/g, ' ').trim();
17
+ }
18
+ /**
19
+ * Extract cid (numeric content id) and kgmid (/g/… or /m/… knowledge entity id).
20
+ *
21
+ * Primary path: placeData[227][0] — the definitive ID block (verified against fixture).
22
+ * [227][0][0] = hexId
23
+ * [227][0][3] = kgmid (/g/… or /m/…)
24
+ * [227][0][4] = placeId (ChIJ…)
25
+ * [227][0][5] = cid (numeric string)
26
+ * [227][0][6] = ownerId
27
+ *
28
+ * Fallback paths used when [227] is absent (older response variants):
29
+ * kgmid: placeData[89] (ftid) or placeData[23]
30
+ * cid: placeData[181][5]
31
+ */
32
+ export function extractPlaceIdentifiers(placeData) {
33
+ // Primary: placeData[227][0] — most reliable block, verified from fixture
34
+ const idBlock = safeGet(placeData, 227, 0);
35
+ if (Array.isArray(idBlock)) {
36
+ const kgmid = asStr(idBlock[3]);
37
+ const cid = asStr(idBlock[5]);
38
+ const ownerId = asStr(idBlock[6]);
39
+ if (kgmid || cid || ownerId)
40
+ return { cid, kgmid, ownerId };
41
+ }
42
+ // Fallback: kgmid from placeData[89] (ftid — same value as kgmid in /g/ form)
43
+ let kgmid = asStr(safeGet(placeData, 89));
44
+ if (!kgmid?.startsWith('/')) {
45
+ kgmid = asStr(safeGet(placeData, 23));
46
+ if (!kgmid?.startsWith('/'))
47
+ kgmid = undefined;
48
+ }
49
+ // Fallback: cid from placeData[181][5]
50
+ const cidFallback = asStr(safeGet(placeData, 181, 5));
51
+ return { cid: cidFallback, kgmid };
52
+ }
53
+ /**
54
+ * Decompose address components from placeData[183] or placeData[2].
55
+ *
56
+ * placeData[183] is the structured address block; [183][0] = street number,
57
+ * [183][1] = street name, [183][2][2][0] = plus code address (locality), etc.
58
+ * Fallback: scan placeData[2] string array for city/state/postal heuristics.
59
+ */
60
+ export function extractStructuredAddress(placeData, formattedAddress) {
61
+ const result = {};
62
+ // Primary: placeData[183][1] — flat parts array (verified against fixture)
63
+ // [0] = neighborhood ("1st Sector, HSR Layout")
64
+ // [1] = street ("2330, 17th Cross, 24th Main Rd")
65
+ // [2] = street alt (duplicate/alt)
66
+ // [3] = city ("Bengaluru")
67
+ // [4] = postalCode ("560102")
68
+ // [5] = state ("Karnataka")
69
+ // [6] = countryCode ("IN")
70
+ const flatParts = safeGet(placeData, 183, 1);
71
+ if (Array.isArray(flatParts)) {
72
+ result.neighborhood = asStr(flatParts[0]);
73
+ result.street = asStr(flatParts[1]) ?? asStr(flatParts[2]);
74
+ result.city = asStr(flatParts[3]);
75
+ result.postalCode = asStr(flatParts[4]);
76
+ result.state = asStr(flatParts[5]);
77
+ // countryCode preferentially from placeData[243] (direct ISO 3166-1 string, verified)
78
+ result.countryCode = asStr(safeGet(placeData, 243)) ?? asStr(flatParts[6]);
79
+ }
80
+ // Fallback: parse from the formatted address string when [183][1] is absent
81
+ if (!result.city && formattedAddress) {
82
+ const parts = formattedAddress.split(',').map((s) => s.trim());
83
+ if (parts.length >= 3) {
84
+ const statePart = parts[parts.length - 2];
85
+ const cityPart = parts[parts.length - 3];
86
+ if (statePart) {
87
+ const statePostal = statePart.match(/^([A-Za-z\s]+)\s+(\d{4,6}(?:-\d{4})?)$/);
88
+ if (statePostal) {
89
+ result.state ??= statePostal[1]?.trim();
90
+ result.postalCode ??= statePostal[2];
91
+ }
92
+ else {
93
+ result.state ??= statePart;
94
+ }
95
+ }
96
+ if (cityPart && !cityPart.match(/^\d/))
97
+ result.city ??= cityPart;
98
+ }
99
+ if (!result.postalCode) {
100
+ const postalMatch = formattedAddress.match(/\b(\d{5,6}(?:-\d{4})?)\b/);
101
+ if (postalMatch)
102
+ result.postalCode = postalMatch[1];
103
+ }
104
+ }
105
+ // Always try placeData[243] for countryCode — it's a direct string (e.g. "IN")
106
+ if (!result.countryCode) {
107
+ result.countryCode = asStr(safeGet(placeData, 243));
108
+ }
109
+ if (Object.keys(result).length > 0) {
110
+ result.raw = safeGet(placeData, 183) ?? safeGet(placeData, 2);
111
+ }
112
+ return result;
113
+ }
114
+ /**
115
+ * Extract review keyword/topic frequency tags from placeData.
116
+ * These are the chips shown under the star histogram, e.g. "paneer dishes".
117
+ *
118
+ * Primary: placeData[153][0][i] — verified against fixture (Kake Di Hatti HSR).
119
+ * entry[0] = [topicId] array
120
+ * entry[1] = keyword string ("paneer dishes")
121
+ * entry[3] = counts array:
122
+ * [3][4] = positiveCount
123
+ * [3][5] = negativeCount
124
+ * [3][7] = totalMentions
125
+ * entry[4] = encodedId (base64)
126
+ *
127
+ * Fallback: placeData[175][1][*] for older response variants.
128
+ */
129
+ export function extractReviewTags(placeData) {
130
+ const tags = [];
131
+ // Primary: placeData[153][0][i]
132
+ const tagsBlock = safeGet(placeData, 153, 0);
133
+ if (Array.isArray(tagsBlock)) {
134
+ for (const entry of tagsBlock) {
135
+ if (!Array.isArray(entry))
136
+ continue;
137
+ const text = asStr(entry[1]);
138
+ if (!text)
139
+ continue;
140
+ const counts = entry[3];
141
+ let count;
142
+ let mentions;
143
+ let positiveCount;
144
+ let negativeCount;
145
+ if (Array.isArray(counts)) {
146
+ // positiveCount at [4], negativeCount at [5], totalMentions at [7]
147
+ positiveCount = asNum(counts[4]);
148
+ negativeCount = asNum(counts[5]);
149
+ count = asNum(counts[7]) ?? positiveCount;
150
+ }
151
+ if (count != null) {
152
+ mentions = `Mentioned in ${count} review${count === 1 ? '' : 's'}`;
153
+ }
154
+ tags.push({ text, count, mentions, positiveCount, negativeCount, raw: entry });
155
+ }
156
+ if (tags.length > 0)
157
+ return tags;
158
+ }
159
+ // Fallback: placeData[175][1][*] — older response variant
160
+ const fallbackBlock = safeGet(placeData, 175, 1);
161
+ if (Array.isArray(fallbackBlock)) {
162
+ for (const entry of fallbackBlock) {
163
+ if (!Array.isArray(entry))
164
+ continue;
165
+ const text = asStr(entry[0]);
166
+ if (!text)
167
+ continue;
168
+ const count = asNum(entry[1]) ?? asNum(entry[2]);
169
+ const mentions = asStr(entry[3]) ?? asStr(entry[2]);
170
+ tags.push({ text, count, mentions, raw: entry });
171
+ }
172
+ }
173
+ return tags;
174
+ }
175
+ /**
176
+ * Extract "People also search for" cards from the place panel.
177
+ * These are cross-sell recommendation cards shown at the bottom of the place card.
178
+ *
179
+ * Location candidates: placeData[127][*] or placeData[99][*] in various preview versions.
180
+ */
181
+ export function extractPeopleAlsoSearch(placeData) {
182
+ const results = [];
183
+ for (const idx of [127, 99, 126]) {
184
+ const block = safeGet(placeData, idx);
185
+ if (!Array.isArray(block) || block.length === 0)
186
+ continue;
187
+ for (const entry of block) {
188
+ if (!Array.isArray(entry))
189
+ continue;
190
+ const title = asStr(entry[0]) ?? asStr(safeGet(entry, 0, 0));
191
+ if (!title)
192
+ continue;
193
+ const hexId = asStr(safeGet(entry, 1)) ?? asStr(safeGet(entry, 10));
194
+ const rating = asNum(safeGet(entry, 4, 7)) ?? asNum(safeGet(entry, 2));
195
+ const reviewCount = asNum(safeGet(entry, 4, 8)) ?? asNum(safeGet(entry, 3));
196
+ const category = asStr(safeGet(entry, 13, 0)) ?? asStr(safeGet(entry, 5));
197
+ const thumbnailUrl = asStr(safeGet(entry, 157)) ?? asStr(safeGet(entry, 6, 0));
198
+ results.push({
199
+ title,
200
+ hexId,
201
+ rating,
202
+ reviewCount,
203
+ category,
204
+ thumbnailUrl: thumbnailUrl?.startsWith('http') ? thumbnailUrl : undefined,
205
+ raw: entry,
206
+ });
207
+ }
208
+ if (results.length > 0)
209
+ return results;
210
+ }
211
+ return results;
212
+ }
213
+ /**
214
+ * Extract owner-posted updates from placeData.
215
+ *
216
+ * Owner updates differ from local posts: they are "this business has updated X"
217
+ * style entries visible on the place card (e.g. "Updated hours" / "Added new photos").
218
+ *
219
+ * Location: placeData[175][3][*] or placeData[128][*] in various response variants.
220
+ */
221
+ export function extractOwnerUpdates(placeData) {
222
+ const updates = [];
223
+ for (const idx of [175, 128]) {
224
+ const block = safeGet(placeData, idx);
225
+ if (!Array.isArray(block))
226
+ continue;
227
+ // Try [idx][3] first (nested update array)
228
+ const subBlock = idx === 175 ? safeGet(block, 3) : block;
229
+ if (!Array.isArray(subBlock))
230
+ continue;
231
+ for (const entry of subBlock) {
232
+ if (!Array.isArray(entry))
233
+ continue;
234
+ const text = asStr(entry[1]) ?? asStr(entry[0]);
235
+ const date = asStr(entry[2]);
236
+ const imageUrl = findGoogleUserContentUrl(entry);
237
+ const ctaLabel = asStr(safeGet(entry, 4, 0));
238
+ const ctaUrl = asStr(safeGet(entry, 4, 1));
239
+ if (!text && !imageUrl)
240
+ continue;
241
+ updates.push({
242
+ updateId: asStr(entry[0]),
243
+ text,
244
+ date,
245
+ imageUrl,
246
+ ctaLabel,
247
+ ctaUrl: ctaUrl && !ctaUrl.includes('google') ? ctaUrl : undefined,
248
+ raw: entry,
249
+ });
250
+ }
251
+ if (updates.length > 0)
252
+ return updates;
253
+ }
254
+ return updates;
255
+ }
256
+ /**
257
+ * Extract gas station fuel prices from placeData.
258
+ *
259
+ * Location: placeData[150] in most response variants — an array of grade+price entries.
260
+ * Each entry: [grade_label, price_string, updated_at?]
261
+ */
262
+ export function extractGasPrices(placeData) {
263
+ const prices = [];
264
+ const block = safeGet(placeData, 150);
265
+ if (!Array.isArray(block))
266
+ return prices;
267
+ for (const entry of block) {
268
+ if (!Array.isArray(entry))
269
+ continue;
270
+ const grade = asStr(entry[0]);
271
+ const priceStr = asStr(entry[1]);
272
+ if (!grade || !priceStr)
273
+ continue;
274
+ const updatedAt = asStr(entry[2]);
275
+ // Parse numeric price value from string like "$3.45" or "₹95"
276
+ const priceMatch = priceStr.match(/[\d.]+/);
277
+ const priceValue = priceMatch ? Number.parseFloat(priceMatch[0]) : undefined;
278
+ // Currency: first non-digit/dot character(s)
279
+ const currencyMatch = priceStr.match(/^([^\d\s]+)/);
280
+ const currency = currencyMatch?.[1];
281
+ prices.push({
282
+ grade,
283
+ price: priceStr,
284
+ priceValue: Number.isFinite(priceValue) ? priceValue : undefined,
285
+ currency,
286
+ updatedAt,
287
+ raw: entry,
288
+ });
289
+ }
290
+ return prices;
291
+ }
292
+ /**
293
+ * Extract hotel-specific data from placeData.
294
+ *
295
+ * Hotel stars: placeData[89] or placeData[141] — string like "4-star hotel".
296
+ * Hotel description: placeData[32][*] (same as general description fallback).
297
+ * Booking offers: placeData[159][*] — provider name + price + url.
298
+ * Similar hotels: placeData[162][*] — name + rating + price.
299
+ */
300
+ export function extractHotelData(placeData) {
301
+ let stars = asStr(safeGet(placeData, 141));
302
+ if (!stars)
303
+ stars = asStr(safeGet(placeData, 89));
304
+ if (stars && !stars.toLowerCase().includes('star') && !/^\d$/.test(stars)) {
305
+ stars = undefined;
306
+ }
307
+ const starCount = stars ? (stars.match(/(\d)/) ? Number(stars.match(/(\d)/)?.[1]) : undefined) : undefined;
308
+ // Description from the same slot as general about
309
+ const aboutBlock = safeGet(placeData, 32);
310
+ let description;
311
+ if (Array.isArray(aboutBlock)) {
312
+ for (const item of aboutBlock) {
313
+ const text = Array.isArray(item) ? asStr(item[1]) : asStr(item);
314
+ if (text && text.length > 30) {
315
+ description = text;
316
+ break;
317
+ }
318
+ }
319
+ }
320
+ // Check-in / check-out dates: placeData[170][0] and [170][1] in some travel responses
321
+ const dateBlock = safeGet(placeData, 170);
322
+ const checkInDate = Array.isArray(dateBlock) ? asStr(dateBlock[0]) : undefined;
323
+ const checkOutDate = Array.isArray(dateBlock) ? asStr(dateBlock[1]) : undefined;
324
+ // Booking offers: placeData[159][*] → [provider, price, url, isOfficialSite?]
325
+ const offersBlock = safeGet(placeData, 159);
326
+ const bookingOffers = [];
327
+ if (Array.isArray(offersBlock)) {
328
+ for (const offer of offersBlock) {
329
+ if (!Array.isArray(offer))
330
+ continue;
331
+ const provider = asStr(offer[0]);
332
+ const price = asStr(offer[1]);
333
+ const url = asStr(offer[2]);
334
+ const googleUrl = asStr(offer[3]);
335
+ if (!provider)
336
+ continue;
337
+ bookingOffers.push({
338
+ provider,
339
+ price,
340
+ isOfficialSite: offer[4] === true || offer[4] === 1,
341
+ url,
342
+ googleUrl,
343
+ raw: offer,
344
+ });
345
+ }
346
+ }
347
+ // Similar hotels: placeData[162][*] → [name, rating, reviewCount, desc, price, hexId?]
348
+ const similarBlock = safeGet(placeData, 162);
349
+ const similarHotels = [];
350
+ if (Array.isArray(similarBlock)) {
351
+ for (const hotel of similarBlock) {
352
+ if (!Array.isArray(hotel))
353
+ continue;
354
+ const name = asStr(hotel[0]);
355
+ if (!name)
356
+ continue;
357
+ similarHotels.push({
358
+ name,
359
+ rating: asNum(hotel[1]),
360
+ reviewCount: asNum(hotel[2]),
361
+ description: asStr(hotel[3]),
362
+ price: asStr(hotel[4]),
363
+ hexId: asStr(hotel[5]),
364
+ raw: hotel,
365
+ });
366
+ }
367
+ }
368
+ if (!stars && !description && bookingOffers.length === 0 && similarHotels.length === 0) {
369
+ return undefined;
370
+ }
371
+ return {
372
+ stars,
373
+ starCount: starCount != null && starCount >= 1 && starCount <= 5 ? starCount : undefined,
374
+ description,
375
+ checkInDate,
376
+ checkOutDate,
377
+ bookingOffers: bookingOffers.length > 0 ? bookingOffers : undefined,
378
+ similarHotels: similarHotels.length > 0 ? similarHotels : undefined,
379
+ };
380
+ }
381
+ /**
382
+ * Extract restaurant-specific data (reservation provider, order/booking links).
383
+ *
384
+ * Reservation provider: placeData[25] or placeData[66][0] — [name, reserveUrl].
385
+ * Table reservation links: placeData[66][*] — [name, url].
386
+ * Order links: placeData[75][*] or placeData[71][*] — [provider, url].
387
+ */
388
+ export function extractRestaurantData(placeData) {
389
+ let reservationProvider;
390
+ const reserveBlock = safeGet(placeData, 25);
391
+ if (Array.isArray(reserveBlock)) {
392
+ const name = asStr(reserveBlock[0]);
393
+ const url = asStr(reserveBlock[1]);
394
+ if (name || url) {
395
+ reservationProvider = { name: name ?? 'Unknown', reserveTableUrl: url, raw: reserveBlock };
396
+ }
397
+ }
398
+ const tableLinksBlock = safeGet(placeData, 66);
399
+ const tableReservationLinks = [];
400
+ if (Array.isArray(tableLinksBlock)) {
401
+ for (const link of tableLinksBlock) {
402
+ if (!Array.isArray(link))
403
+ continue;
404
+ const name = asStr(link[0]);
405
+ const url = asStr(link[1]);
406
+ if (name && url)
407
+ tableReservationLinks.push({ name, url });
408
+ }
409
+ }
410
+ const orderLinksBlock = safeGet(placeData, 71);
411
+ const orderLinks = [];
412
+ if (Array.isArray(orderLinksBlock)) {
413
+ for (const link of orderLinksBlock) {
414
+ if (!Array.isArray(link))
415
+ continue;
416
+ const name = asStr(link[0]);
417
+ const url = asStr(link[1]);
418
+ if (name && url)
419
+ orderLinks.push({ name, url });
420
+ }
421
+ }
422
+ if (!reservationProvider && tableReservationLinks.length === 0 && orderLinks.length === 0) {
423
+ return undefined;
424
+ }
425
+ return {
426
+ reservationProvider,
427
+ tableReservationLinks: tableReservationLinks.length > 0 ? tableReservationLinks : undefined,
428
+ orderLinks: orderLinks.length > 0 ? orderLinks : undefined,
429
+ };
430
+ }
431
+ /**
432
+ * Extract inline structured menu from placeData.
433
+ *
434
+ * The inline menu (when Google serves it) lives at placeData[168] or placeData[117].
435
+ * Structure: sections array → each section: [title, items[]] → item: [name, price, desc, imageUrl].
436
+ *
437
+ * Many places only have a menuUrl (placeData[7][1] or placeData[46]) without inline items.
438
+ */
439
+ export function extractMenu(placeData, menuUrl) {
440
+ const allItems = [];
441
+ const sections = [];
442
+ // Primary: placeData[125][0][0][1] — verified against fixture (Kake Di Hatti HSR).
443
+ // Structure:
444
+ // placeData[125][0][0][1] = array of section entries
445
+ // section[0] = [sectionTitle, ""]
446
+ // section[1] = array of item groups
447
+ // itemGroup[0][0] = [itemName, itemDescription]
448
+ // itemGroup[1] = [priceString]
449
+ const sectionsRaw = safeGet(placeData, 125, 0, 0, 1);
450
+ if (Array.isArray(sectionsRaw)) {
451
+ for (const sectionEntry of sectionsRaw) {
452
+ if (!Array.isArray(sectionEntry))
453
+ continue;
454
+ const titleBlock = sectionEntry[0];
455
+ const sectionTitle = Array.isArray(titleBlock) ? asStr(titleBlock[0]) : asStr(titleBlock);
456
+ // section[1] = array of item-groups; each item-group = array of [namePart, pricePart] pairs
457
+ // Actual fixture structure:
458
+ // section[1] = itemGroupsArray (array of item arrays)
459
+ // itemGroupsArray[i] = [[name, desc], [price]] ← one item per entry
460
+ // OR
461
+ // section[1][i][0] = [[name, desc], [price]] ← grouped (wrapped one more level)
462
+ // We handle both by detecting whether the first inner element is a [string,…] pair.
463
+ const itemGroupsRaw = sectionEntry[1];
464
+ if (!Array.isArray(itemGroupsRaw))
465
+ continue;
466
+ const items = [];
467
+ const parseItemPair = (pair) => {
468
+ if (!Array.isArray(pair) || pair.length < 1)
469
+ return undefined;
470
+ // pair[0] = [name, description?]
471
+ const namePart = pair[0];
472
+ const name = Array.isArray(namePart) ? asStr(namePart[0]) : asStr(namePart);
473
+ if (!name)
474
+ return undefined;
475
+ const description = Array.isArray(namePart) ? asStr(namePart[1]) : undefined;
476
+ // pair[1] = [priceString]
477
+ const pricePart = pair[1];
478
+ const price = Array.isArray(pricePart) ? asStr(pricePart[0]) : asStr(pricePart);
479
+ const imageUrl = findGoogleUserContentUrl(pair);
480
+ return {
481
+ name,
482
+ price,
483
+ description: description ? stripHtml(description) : undefined,
484
+ imageUrl,
485
+ section: sectionTitle,
486
+ raw: pair,
487
+ };
488
+ };
489
+ for (const groupEntry of itemGroupsRaw) {
490
+ if (!Array.isArray(groupEntry))
491
+ continue;
492
+ // Check whether this is a direct item pair [[name, desc], [price]]
493
+ // (first element is an array of strings) or a group wrapping more items
494
+ const firstEl = groupEntry[0];
495
+ if (Array.isArray(firstEl) && typeof firstEl[0] === 'string') {
496
+ // Direct item: groupEntry = [[name, desc], [price]]
497
+ const item = parseItemPair(groupEntry);
498
+ if (item) {
499
+ items.push(item);
500
+ allItems.push(item);
501
+ }
502
+ }
503
+ else {
504
+ // Wrapped group: groupEntry = [[[name, desc], [price]], ...]
505
+ for (const subEntry of groupEntry) {
506
+ if (!Array.isArray(subEntry))
507
+ continue;
508
+ const item = parseItemPair(subEntry);
509
+ if (item) {
510
+ items.push(item);
511
+ allItems.push(item);
512
+ }
513
+ }
514
+ }
515
+ }
516
+ if (items.length > 0) {
517
+ sections.push({ title: sectionTitle, items, raw: sectionEntry });
518
+ }
519
+ }
520
+ }
521
+ if (!menuUrl && allItems.length === 0)
522
+ return undefined;
523
+ return {
524
+ menuUrl,
525
+ sections: sections.length > 0 ? sections : undefined,
526
+ allItems: allItems.length > 0 ? allItems : undefined,
527
+ };
528
+ }
529
+ /**
530
+ * Extract inline Q&A items embedded in place preview.
531
+ *
532
+ * Q&A data is embedded at placeData[311] (verified on some restaurant fixtures).
533
+ * Layout (inferred from structure):
534
+ * [311][0][*] — array of Q&A items
535
+ * item[0] — question id
536
+ * item[1] — question text
537
+ * item[2] — askedBy author name
538
+ * item[3] — askedBy author profile URL
539
+ * item[4] — date asked
540
+ * item[5] — upvote count
541
+ * item[6][*] — array of answers
542
+ * answer[0] — answer text
543
+ * answer[1] — author name
544
+ * answer[2] — author profile URL
545
+ * answer[3] — author avatar URL
546
+ * answer[4] — date
547
+ * answer[5] — upvote count
548
+ * answer[6] — is owner answer (1 = true)
549
+ *
550
+ * Also tries placeData[171] which may carry a different Q&A layout on some locales.
551
+ */
552
+ export function extractEmbeddedQA(placeData) {
553
+ // Primary path: placeData[311][0]
554
+ const root = safeGet(placeData, 311);
555
+ let itemsRaw;
556
+ if (Array.isArray(root)) {
557
+ const nested = safeGet(root, 0);
558
+ if (Array.isArray(nested) && nested.length > 0) {
559
+ itemsRaw = nested;
560
+ }
561
+ else if (Array.isArray(root[0])) {
562
+ itemsRaw = root;
563
+ }
564
+ }
565
+ if (!itemsRaw || itemsRaw.length === 0)
566
+ return undefined;
567
+ const items = [];
568
+ for (const item of itemsRaw) {
569
+ if (!Array.isArray(item))
570
+ continue;
571
+ const questionId = asStr(item[0]);
572
+ const questionText = asStr(item[1]);
573
+ if (!questionText)
574
+ continue;
575
+ const askedBy = asStr(item[2]);
576
+ const askedDate = asStr(item[4]);
577
+ const upvotes = asNum(item[5]);
578
+ const answersRaw = item[6];
579
+ const answers = [];
580
+ if (Array.isArray(answersRaw)) {
581
+ for (const answer of answersRaw) {
582
+ if (!Array.isArray(answer))
583
+ continue;
584
+ const text = asStr(answer[0]);
585
+ if (!text)
586
+ continue;
587
+ const authorName = asStr(answer[1]);
588
+ const answerAuthorProfileUrl = asStr(answer[2]);
589
+ const authorPhoto = asStr(answer[3]);
590
+ const date = asStr(answer[4]);
591
+ const answerUpvotes = asNum(answer[5]);
592
+ const isOwnerAnswer = answer[6] === 1 || answer[6] === true;
593
+ answers.push({
594
+ author: authorName,
595
+ authorPhoto,
596
+ authorProfileUrl: answerAuthorProfileUrl,
597
+ text,
598
+ date,
599
+ upvotes: answerUpvotes,
600
+ isOwnerAnswer: isOwnerAnswer || undefined,
601
+ raw: answer,
602
+ });
603
+ }
604
+ }
605
+ // item[3] is the question asker's profile URL
606
+ const askedByProfileUrl = asStr(item[3]);
607
+ items.push({
608
+ questionId,
609
+ question: questionText,
610
+ askedBy,
611
+ askedByProfileUrl,
612
+ askedDate,
613
+ upvotes,
614
+ answers,
615
+ raw: item,
616
+ });
617
+ }
618
+ if (items.length === 0)
619
+ return undefined;
620
+ const totalCount = asNum(safeGet(placeData, 311, 1)) ?? items.length;
621
+ return { items, totalCount, raw: root };
622
+ }
623
+ function findGoogleUserContentUrl(node) {
624
+ if (typeof node === 'string' && node.includes('googleusercontent.com')) {
625
+ return node.startsWith('//') ? `https:${node}` : node;
626
+ }
627
+ if (Array.isArray(node)) {
628
+ for (const item of node) {
629
+ const found = findGoogleUserContentUrl(item);
630
+ if (found)
631
+ return found;
632
+ }
633
+ }
634
+ return undefined;
635
+ }
636
+ /**
637
+ * Apply all extended field extractions to an already-parsed PlaceDetails object.
638
+ *
639
+ * This mutates `details` in-place and returns it, so callers can write:
640
+ * const details = extractPlaceDetails(data);
641
+ * applyExtendedFields(details, placeData, { raw: true, rawData: data });
642
+ *
643
+ * Passing `raw: true` attaches the full protobuf tree to `details.raw`.
644
+ * All sub-parsers are called unconditionally — they return empty/undefined
645
+ * internally rather than throwing, so the total overhead is negligible.
646
+ */
647
+ export function applyExtendedFields(details, placeData, options) {
648
+ const { cid, kgmid, ownerId } = extractPlaceIdentifiers(placeData);
649
+ if (cid)
650
+ details.cid = details.cid ?? cid;
651
+ if (kgmid)
652
+ details.kgmid = details.kgmid ?? kgmid;
653
+ if (ownerId)
654
+ details.ownerId = details.ownerId ?? ownerId;
655
+ const addr = extractStructuredAddress(placeData, details.address);
656
+ if (addr.street && !details.street)
657
+ details.street = addr.street;
658
+ if (addr.neighborhood && !details.neighborhood)
659
+ details.neighborhood = addr.neighborhood;
660
+ if (addr.city && !details.city)
661
+ details.city = addr.city;
662
+ if (addr.state && !details.state)
663
+ details.state = addr.state;
664
+ if (addr.postalCode && !details.postalCode)
665
+ details.postalCode = addr.postalCode;
666
+ if (addr.countryCode && !details.countryCode)
667
+ details.countryCode = addr.countryCode;
668
+ if (addr.country && !details.country)
669
+ details.country = addr.country;
670
+ // Closed flags (placeData[34][4][4] permanently closed, placeData[34][4][5] temporarily)
671
+ const closedBlock = safeGet(placeData, 34, 4);
672
+ if (Array.isArray(closedBlock)) {
673
+ if (closedBlock[4] === 1 || closedBlock[4] === true)
674
+ details.isPermanentlyClosed = true;
675
+ if (closedBlock[5] === 1 || closedBlock[5] === true)
676
+ details.isTemporarilyClosed = true;
677
+ }
678
+ // Also check a common alternate path
679
+ if (!details.isPermanentlyClosed) {
680
+ const perma = safeGet(placeData, 88);
681
+ if (perma === 1 || perma === true)
682
+ details.isPermanentlyClosed = true;
683
+ }
684
+ // Claimed status: placeData[211][0] === 1 in some response variants
685
+ const claimedBlock = safeGet(placeData, 211);
686
+ if (claimedBlock === 1 || claimedBlock === true || (Array.isArray(claimedBlock) && claimedBlock[0] === 1)) {
687
+ details.isClaimed = true;
688
+ }
689
+ const popularTimes = extractPopularTimes(placeData);
690
+ if (popularTimes)
691
+ details.popularTimes = popularTimes;
692
+ const reviewTags = extractReviewTags(placeData);
693
+ if (reviewTags.length > 0)
694
+ details.reviewTags = reviewTags;
695
+ const peopleAlsoSearch = extractPeopleAlsoSearch(placeData);
696
+ if (peopleAlsoSearch.length > 0)
697
+ details.peopleAlsoSearch = peopleAlsoSearch;
698
+ const ownerUpdates = extractOwnerUpdates(placeData);
699
+ if (ownerUpdates.length > 0)
700
+ details.ownerUpdates = ownerUpdates;
701
+ const gasPrices = extractGasPrices(placeData);
702
+ if (gasPrices.length > 0)
703
+ details.gasPrices = gasPrices;
704
+ const hotelData = extractHotelData(placeData);
705
+ if (hotelData)
706
+ details.hotelData = hotelData;
707
+ const restaurantData = extractRestaurantData(placeData);
708
+ if (restaurantData)
709
+ details.restaurantData = restaurantData;
710
+ // Menu (pass the menuUrl if already extracted from contact block)
711
+ const menuUrl = safeGet(placeData, 46) ?? details.website;
712
+ const menu = extractMenu(placeData, menuUrl);
713
+ if (menu) {
714
+ menu.raw = safeGet(placeData, 125) ?? safeGet(placeData, 168) ?? safeGet(placeData, 117);
715
+ details.menu = menu;
716
+ }
717
+ // Embedded Q&A (placeData[311])
718
+ const qa = extractEmbeddedQA(placeData);
719
+ if (qa)
720
+ details.qa = qa;
721
+ if (options?.raw && options.rawData !== undefined) {
722
+ details.raw = options.rawData;
723
+ }
724
+ return details;
725
+ }
726
+ /**
727
+ * Build a `reviewDetailedRating` map from a review's attribute array.
728
+ * Call this inside the boq review parser after attributes are extracted.
729
+ */
730
+ export function buildReviewDetailedRating(attributes) {
731
+ if (!attributes || attributes.length === 0)
732
+ return undefined;
733
+ const map = {};
734
+ for (const attr of attributes) {
735
+ if (attr.rating != null && attr.label) {
736
+ map[attr.label] = attr.rating;
737
+ }
738
+ }
739
+ return Object.keys(map).length > 0 ? map : undefined;
740
+ }
741
+ //# sourceMappingURL=place-extended.js.map