Comments (4)
Hey @simplygreatwork, good question!
Do you have an example of the struct your are validating with? And what the data looks like?
from superstruct.
In the superstruct docs, the age type example had bounds embedded inside the type function. I would like to be able to validate bounds from a schema.
YAML schema
---
type: Person
properties:
age:
type: 'number?'
range: [18, 120]
To do this currently, I am using struct.intersection to compose the number type with struct.function to do the bounds checking. I think this is the correct approach for now even if struct.function is an escape hatch.
var config = {};
var properties = schema.properties;
for (var key in properties) {
var object = properties[key];
config[key] = object.type;
if (object.range) {
config[key] = struct.intersection([config[key], struct.function(function(value) {
return (value >= object.range[0]) && (value <= object.range[1]);
})]);
}
}
var Person = struct(config);
But an alternative could be for type functions to be passed a second argument, the key of the property being validated.
types : {
age : function(value, key) {
if (this.properties[key].range) {
var range = this.properties[key].range;
return (value >= range[0]) && (value <= range[1]);
}
}.bind(schema) // binding a schema definition to become "this" above
}
Let me know if you want me to express this in more detail. I'm mainly observing that values are passed into type functions - without any other context. But maybe they would no longer be type functions - they would be validation functions.
from superstruct.
@simplygreatwork I'm not sure what the this.properties
piece is there? Or how the range
itself is being passed in? Could you try writing up the struct definition with the current API but with your tweak applied? I think bridging the gap from YAML to JS is confusing me.
What I'd recommend though is actually treating "age" as a type itself, where it has a fixed range of 18–120
or whatever makes sense for your application's problem space.
from superstruct.
You don't need to change anything in superstruct. It is super rad as it is. I'm OK with using struct.function. Above, this.properties
is actually schema.properties
because I used the bind
keyword to bind schema
to this
. schema.properties
is just an associative array of objects defining properties of my schema.
In superstruct, I do love that I can create new high-level types. That works great when superstruct and JavaScript are the single source of truth for my system. But if a YAML document is my single source of truth across multiple programming languages, then implementing number bounds checking is more low level or portable than validating an age type in multiple programming languages.
I was mainly proposing that you consider passing a second argument to each type function: the key of the property being validated.
from superstruct.
Related Issues (20)
- Type-tests do not check for strict types
- Example coercion does not work. Have I done it right ? HOT 2
- [Question|Feature] Add functions to an interface
- [Feature] Support for `Required` HOT 1
- Please provide security reporting information or enable advisories
- `intersection` flattens unions too much HOT 1
- [Feature] `one of` or `or` type HOT 2
- [Feature] Discriminated unions (fast lookup) HOT 1
- `size` on `array` uses a permissive type
- Defaulted optional to undefined does not fill field with default value
- Never type creates a typescript issue
- Dynamic context property access
- Unexpected behaviour when combining `assign` + `refine`
- pattern (regex) does not return consistent output when using the global modifier
- Source maps seem broken HOT 4
- `instance` causes a TypeScript error with abstract classes
- Unions of instances produce unhelpful error message
- Fix compatibility with Node16/NodeNext moduleResolution HOT 4
- Mask fails on `interface aaa { foo: string; [key: string]: any }` interface with any key.
- Move tests to Vitest
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from superstruct.