googleapis / nodejs-datastore

Node.js client for Google Cloud Datastore: a highly-scalable NoSQL database for your web and mobile applications.
https://cloud.google.com/datastore/
Apache License 2.0
214 stars 106 forks source link

Should not throw TypeError when saving `null` for a field with subproperty index-exclusion #1327

Open mrnagydavid opened 1 month ago

mrnagydavid commented 1 month ago

Environment details

Problem statement

save({ excludeFromIndexes: ['foo.bar'], entity: { sho: 1, foo: null })
// throws TypeError: Cannot read properties of undefined (reading 'properties')

save({ excludeFromIndexes: ['foo[].*'], entity: { sho: 1, foo: null })
// throws TypeError: Cannot read properties of undefined (reading 'values')

Considering the following 4 types of index exclusions:

  1. excludeFromindexes: ['foo.*']
  2. excludeFromindexes: ['foo.bar']
  3. excludeFromindexes: ['foo[].*']
  4. excludeFromindexes: ['foo[].bar']

Supplying { entity: { foo: null } } throws for 2 and 3, but not for 1 and 4.

It should either throw in all cases or in none. I think it should throw in none, and it is easily fixable.

Steps to reproduce

Easily reproducable via unit tests: repo with unit test showcasing error

Proposed solution

// entity.ts

function excludePathFromEntity(entity: EntityProto, path: string) {
  if (!entity) return; // <-- !! fixes 'foo.bar'
  // ...
  } else if (
    firstPathPartIsArray &&
    hasWildCard &&
    remainderPath === '*' &&
    isFirstPathPartDefined
  ) {
    const array = entity.properties![firstPathPart].arrayValue;
    if (!array) return; // <-- !! fixes 'foo[].*'
  // ...

This TypeError can be fixed with 2 lines of code and I am ready to open a PR.

danieljbruce commented 1 month ago

@mrnagydavid Instead of modifying the test, please add a new test that matches what you changed the old test to. After that it LGTM.

mrnagydavid commented 3 weeks ago

@danieljbruce PR is open with the suggested change.