Skip to content

fix: don't crash serializing an explicit null/undefined param value - #1424

Open
SurajPatelPro wants to merge 1 commit into
googlemaps:masterfrom
SurajPatelPro:fix/serializer-null-undefined-crash
Open

fix: don't crash serializing an explicit null/undefined param value#1424
SurajPatelPro wants to merge 1 commit into
googlemaps:masterfrom
SurajPatelPro:fix/serializer-null-undefined-crash

Conversation

@SurajPatelPro

Copy link
Copy Markdown

Thank you for opening a Pull Request!


Before submitting your PR, there are a few things you can do to make sure it goes smoothly:

  • Make sure to open a GitHub issue as a bug/feature request before writing your code! That way we can discuss the change, evaluate designs, and agree on the general idea
  • Ensure the tests and linter pass
  • Code coverage does not decrease (if any source code was changed)
  • Appropriate docs were updated (if necessary) — no user-facing docs needed for this internal serialization fix

Fixes #1052 🦕

What & why

serializer() called each key's format function unconditionally whenever the key existed on the params object, so { location: undefined } — a common way to conditionally omit an optional field — reached latLngToString and threw Cannot use 'in' operator to search for 'lat' in undefined, instead of being treated as "not supplied". @usefulthink correctly identified the root cause in the issue thread.

What changed

src/serialize.ts — in serializer(), a key whose value is null/undefined is now deleted from serializedParams before the format step, rather than being passed through to the format function.

I initially tried leaving the nullish value in place and letting query-string's own stringify drop it, but that turned out to be inconsistent: query-string omits undefined from the output query string by default, but keeps null as a bare, value-less key (e.g. location with no =). Deleting the key outright avoids that mismatch and treats both the same way — as if the key were never supplied.

How it was verified

  • Added a test in src/serialize.test.ts covering both location: undefined and location: null against a formatted key, asserting the key is dropped entirely from the resulting query string.
  • npx jest src/ — 21/21 test suites, 70/70 tests passing.
  • npx tsc --noEmit — clean.
  • npx eslint src/serialize.ts src/serialize.test.ts — clean.
  • The repo's e2e/* suite requires a live Google Maps API key and network access, unavailable in my environment — confirmed those failures are unrelated to this change (same failure mode before and after, purely network/API-key dependent).

Note

I'll need to sign the Google Individual CLA before this can be merged, per CONTRIBUTING.md.

serializer() called each key's format function unconditionally once the
key existed on the params object, so { location: undefined } (a common
way to conditionally omit an optional field) reached latLngToString and
threw "Cannot use 'in' operator to search for 'lat' in undefined"
instead of being treated as "not supplied".

Deleting the key outright, rather than leaving the null/undefined value
in place for query-string to drop, also avoids a mismatch in how that
library serializes the two: undefined is omitted from the query string
by default, but null is kept as a bare, value-less key.

Fixes googlemaps#1052
@google-cla

google-cla Bot commented Sep 7, 2026

Copy link
Copy Markdown

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

PlacesAutocomplete call crashes if the optional location field is present but undefined

1 participant