tywalch / electrodb

A DynamoDB library to ease the use of modeling complex hierarchical relationships and implementing a Single Table Design while keeping your query code readable.
MIT License
1.03k stars 66 forks source link

`map` attributes should allow arbitrary properties #450

Open solaris007 opened 3 days ago

solaris007 commented 3 days ago

Describe the bug When wanting to specify an attribute of type map, a full map-schema via the properties setting is required, effectively locking down what kind of maps can be stored for that attribute. There are use-cases however, where an attribute is desired to be a map, yet the contents of that map may vary. Similar to OpenAPI specs, we could envision to allow setting additionalProperties: true, in which case the value would be validated as a valid object but not enforce a schema within the object.

Currently this needs to be worked around like this with custom validation:

    data: {
      type: 'any',
      required: false,
      validate: (value) => !value || isNonEmptyObject(value),
    },

ElectroDB Version 3.0.1

tywalch commented 2 days ago

Hi @solaris007 :wave:

This sounds like a good job for the CustomAttributeType function. It allows you to have fine-grain typing for an attribute; here is a playground example.

A lot of people then pair this with a validation library like zod or jsonschema to accomplish the validation side of things :+1:

solaris007 commented 2 days ago

Hi @tywalch :) Thank you for your answer!

Certainly, the CustomAttributeType would be a great choice for more complex validations / types, but seems counter-intuitive / over-engineered for the simple case where we want to accept just any map?

tywalch commented 1 day ago

I suppose this was mainly to demonstrate that any type could be used, even something simple like Record<string, string> or { [key: string]: unknown }, which sounds like what you're trying to accomplish. Does this fall short of what you might be expecting?