Skip to content

chore: release v0.9.0 #329

chore: release v0.9.0

chore: release v0.9.0 #329

GitHub Actions / Jest Tests succeeded Apr 19, 2024 in 0s

237 passed, 0 failed and 1 skipped

Tests passed successfully

✅ junit.xml

238 tests were completed in 7s with 237 passed, 0 failed and 1 skipped.

Test suite Passed Failed Skipped Time
AllowedValuesRule 1✅ 74ms
Async resolver initialization 1✅ 184ms
Back-reference properties 3✅ 243ms
CalculateRule 14✅ 215ms
ConditionRule 2✅ 151ms
Entity 56✅ 5s
EventScope 6✅ 160ms
format 20✅ 5s
globalize 23✅ 169ms
ListLengthRule 3✅ 132ms
merge 4✅ 102ms
normalize 10✅ 162ms
ObservableArray 17✅ 188ms
Property 47✅ 1⚪ 5s
PropertyChain 1✅ 338ms
RangeRule 5✅ 188ms
RequiredRule 4✅ 157ms
StringFormatRule 2✅ 109ms
StringLengthRule 4✅ 143ms
Type 8✅ 232ms
validation-rule 6✅ 204ms

✅ AllowedValuesRule

AllowedValuesRule Prevent the setting of value if value is not in allowedValues list.
  ✅ AllowedValuesRule Prevent the setting of value if value is not in allowedValues list.

✅ Async resolver initialization

Async resolver initialization with nested objects can be established via property initializers
  ✅ Async resolver initialization with nested objects can be established via property initializers

✅ Back-reference properties

Back-reference properties from a reference property can be established via property initializers
  ✅ Back-reference properties from a reference property can be established via property initializers
Back-reference properties from a reference list property can be established via property initializers
  ✅ Back-reference properties from a reference list property can be established via property initializers
Back-reference properties with deeply nested objects can be established via property initializers
  ✅ Back-reference properties with deeply nested objects can be established via property initializers

✅ CalculateRule

CalculateRule Errors thrown in calculated rules are displayed to the user.
  ✅ CalculateRule Errors thrown in calculated rules are displayed to the user.
CalculateRule default value calculation on new instance can be based on other default value
  ✅ CalculateRule default value calculation on new instance can be based on other default value
CalculateRule default value calculation on new instance is overridden by non-null value provided during construction
  ✅ CalculateRule default value calculation on new instance is overridden by non-null value provided during construction
CalculateRule default value calculation on new instance is overridden by null value provided during construction
  ✅ CalculateRule default value calculation on new instance is overridden by null value provided during construction
CalculateRule default value calculation on new instance number property is defaulted
  ✅ CalculateRule default value calculation on new instance number property is defaulted
CalculateRule default value calculation on new instance number property is defaulted based on other defaulted property
  ✅ CalculateRule default value calculation on new instance number property is defaulted based on other defaulted property
CalculateRule default value calculation on existing instance can be based on other default value
  ✅ CalculateRule default value calculation on existing instance can be based on other default value
  ✅ CalculateRule default value calculation on existing instance can be based on other default value
CalculateRule default value calculation on existing instance is overridden by non-null value provided during construction
  ✅ CalculateRule default value calculation on existing instance is overridden by non-null value provided during construction
CalculateRule default value calculation on existing instance is overridden by null value provided during construction
  ✅ CalculateRule default value calculation on existing instance is overridden by null value provided during construction
CalculateRule default value calculation on existing instance updates when a dependent calculation changes
  ✅ CalculateRule default value calculation on existing instance updates when a dependent calculation changes
CalculateRule calculated list works
  ✅ CalculateRule calculated list works
CalculateRule calculated list does not publish change events for initial calculation
  ✅ CalculateRule calculated list does not publish change events for initial calculation
CalculateRule calculated list based on overridden property
  ✅ CalculateRule calculated list based on overridden property

✅ ConditionRule

ConditionRule Custom condition
  ✅ ConditionRule Custom condition
ConditionRule Nested Property- Error appears on referenced field
  ✅ ConditionRule Nested Property- Error appears on referenced field

✅ Entity

Entity construction can be extended and constructed
  ✅ Entity construction can be extended and constructed
Entity construction can be constructed with provided state
  ✅ Entity construction can be constructed with provided state
Entity construction can be constructed with prebuilt child entities
  ✅ Entity construction can be constructed with prebuilt child entities
Entity construction cannot initialize calculated properties
  ✅ Entity construction cannot initialize calculated properties
Entity construction cannot initialize constant properties
  ✅ Entity construction cannot initialize constant properties
Entity construction cannot initialize reference properties to undefined
  ✅ Entity construction cannot initialize reference properties to undefined
Entity construction can initialize reference properties to null
  ✅ Entity construction can initialize reference properties to null
Entity construction invalid data for reference properties is ignored
  ✅ Entity construction invalid data for reference properties is ignored
Entity construction provides a way to wait for initialization to complete
  ✅ Entity construction provides a way to wait for initialization to complete
Entity update can be used to update an entity
  ✅ Entity update can be used to update an entity
Entity update cannot be used to set calculated properties
  ✅ Entity update cannot be used to set calculated properties
Entity update cannot be used to set constant properties
  ✅ Entity update cannot be used to set constant properties
Entity update cannot be used to set a value deserialized to undefined
  ✅ Entity update cannot be used to set a value deserialized to undefined
Entity update cannot be used to set a value deserialized to undefined in a list
  ✅ Entity update cannot be used to set a value deserialized to undefined in a list
Entity update allows waiting for asynchronous values to be set
  ✅ Entity update allows waiting for asynchronous values to be set
Entity update asynchronous property is initialized before initExisting event published 
  ✅ Entity update asynchronous property is initialized before initExisting event published
Entity update should support circular async value resolution
  ✅ Entity update should support circular async value resolution
Entity events property change is not raised when initializing existing entity value property
  ✅ Entity events property change is not raised when initializing existing entity value property
Entity events property change is not raised when initializing existing entity value list property
  ✅ Entity events property change is not raised when initializing existing entity value list property
Entity events property change is raised when initializing new entity value property
  ✅ Entity events property change is raised when initializing new entity value property
Entity events property change is raised when initializing new entity value list property
  ✅ Entity events property change is raised when initializing new entity value list property
Entity events entity change event is called when value property is changed
  ✅ Entity events entity change event is called when value property is changed
Entity events entity change event is called with additional arguments when specified for a property change
  ✅ Entity events entity change event is called with additional arguments when specified for a property change
Entity events entity change event is called when value list property is changed
  ✅ Entity events entity change event is called when value list property is changed
Entity events entity change event is called with additional arguments when specified for a list change
  ✅ Entity events entity change event is called with additional arguments when specified for a list change
Entity serialize can be serialized
  ✅ Entity serialize can be serialized
Entity serialize can be serialized with aliases
  ✅ Entity serialize can be serialized with aliases
Entity serialize default values are run when serializing
  ✅ Entity serialize default values are run when serializing
Entity default value static does not overwrite provided state of new entity
  ✅ Entity default value static does not overwrite provided state of new entity
Entity default value static does not overwrite provided state of existing entity
  ✅ Entity default value static does not overwrite provided state of existing entity
Entity default value rule does not overwrite initial state of new entity
  ✅ Entity default value rule does not overwrite initial state of new entity
Entity default value rule does not overwrite initial state of existing entity
  ✅ Entity default value rule does not overwrite initial state of existing entity
Entity default value rule sets value correctly when validation rule also present
  ✅ Entity default value rule sets value correctly when validation rule also present
Entity list can add/remove primitive items
  ✅ Entity list can add/remove primitive items
Entity list can add/remove entity items
  ✅ Entity list can add/remove entity items
Entity list should not publish property change event for no list changes
  ✅ Entity list should not publish property change event for no list changes
Entity list can set an empty list
  ✅ Entity list can set an empty list
Entity list Updating a list with an array with less items does not leave extra items in the array
  ✅ Entity list Updating a list with an array with less items does not leave extra items in the array
Entity list runs default rule for list property for new instance with no property value in initial state
  ✅ Entity list runs default rule for list property for new instance with no property value in initial state
Entity list does not runs default rule for list property for new object with empty list in initial state
  ✅ Entity list does not runs default rule for list property for new object with empty list in initial state
Entity list runs default rule for list property for existing object with no property value in initial state
  ✅ Entity list runs default rule for list property for existing object with no property value in initial state
Entity list triggers property change when default calculation runs for list
  ✅ Entity list triggers property change when default calculation runs for list
Entity formatting supports tokens
  ✅ Entity formatting supports tokens
Entity formatting supports tokens with nested paths
  ✅ Entity formatting supports tokens with nested paths
Entity formatting supports token value post processing
  ✅ Entity formatting supports token value post processing
Entity formatting uses format of properties targeted by tokens
  ✅ Entity formatting uses format of properties targeted by tokens
Entity markPersisted() assigning identifier property of entity calls markPersisted
  ✅ Entity markPersisted() assigning identifier property of entity calls markPersisted
Entity markPersisted() nested entity is not considered new when assigned alongside identifier property
  ✅ Entity markPersisted() nested entity is not considered new when assigned alongside identifier property
Entity markPersisted() asynchronously resolved nested entity is not considered new when assigned alongside identifier property
  ✅ Entity markPersisted() asynchronously resolved nested entity is not considered new when assigned alongside identifier property
Entity markPersisted() does not affect non-identifying entity
  ✅ Entity markPersisted() does not affect non-identifying entity
Entity markPersisted() identifying entity with no id does nothing
  ✅ Entity markPersisted() identifying entity with no id does nothing
Entity markPersisted() identifying entity with no id does not affect nested entities
  ✅ Entity markPersisted() identifying entity with no id does not affect nested entities
Entity markPersisted() identifying entity with id marks nested, non-identifying entities as not new
  ✅ Entity markPersisted() identifying entity with id marks nested, non-identifying entities as not new
Entity markPersisted() identifying entity with id handles circular references
  ✅ Entity markPersisted() identifying entity with id handles circular references
Entity markPersisted() identifying entity with id does not affect nested, sovereign entities
  ✅ Entity markPersisted() identifying entity with id does not affect nested, sovereign entities
Entity isEntity returns true if the argument is an instance of an entity, otherwise false
  ✅ Entity isEntity returns true if the argument is an instance of an entity, otherwise false

✅ EventScope

EventScope creates a new scope when 'perform' is called
  ✅ EventScope creates a new scope when 'perform' is called
EventScope invokes the callback immediately if a scope was not already active
  ✅ EventScope invokes the callback immediately if a scope was not already active
EventScope invokes 'onExit' when the active scope exits
  ✅ EventScope invokes 'onExit' when the active scope exits
EventScope exits automatically when an error occurs
  ✅ EventScope exits automatically when an error occurs
EventScope aborts when the maximum scope nesting count is reached
  ✅ EventScope aborts when the maximum scope nesting count is reached
EventScope aborts when the maximum scope depth is reached
  ✅ EventScope aborts when the maximum scope depth is reached

✅ format

format format on type does not cause error when creating model
  ✅ format format on type does not cause error when creating model
format Format errors where the label has a token stay updated
  ✅ format Format errors where the label has a token stay updated
format list items are formatted using the list property format
  ✅ format list items are formatted using the list property format
format Date parses null or whitespace as null
  ✅ format Date parses null or whitespace as null
format Date can be formatted as a date and time
  ✅ format Date can be formatted as a date and time
format Date can be parsed as a date and time
  ✅ format Date can be parsed as a date and time
format Date can be formatted as a date
  ✅ format Date can be formatted as a date
format Date can be parsed as a date
  ✅ format Date can be parsed as a date
format Date can be formatted as a time
  ✅ format Date can be formatted as a time
format Date can be parsed as a time
  ✅ format Date can be parsed as a time
format Number parses null or whitespace as null
  ✅ format Number parses null or whitespace as null
format Number can be formatted as an integer
  ✅ format Number can be formatted as an integer
format Number can be parsed as an integer
  ✅ format Number can be parsed as an integer
format Number can be formatted as a decimal
  ✅ format Number can be formatted as a decimal
format Number can be parsed as a decimal
  ✅ format Number can be parsed as a decimal
format Number can be formatted as a percentage
  ✅ format Number can be formatted as a percentage
format Number can be parsed as a percentage
  ✅ format Number can be parsed as a percentage
format Boolean parses null or whitespace as null
  ✅ format Boolean parses null or whitespace as null
format Boolean values are formatted using a two-part boolean property format
  ✅ format Boolean values are formatted using a two-part boolean property format
format Boolean boolean values can be parsed using the two-part boolean property format
  ✅ format Boolean boolean values can be parsed using the two-part boolean property format

✅ globalize

globalize CultureInfo.setup()
  ✅ globalize CultureInfo.setup()
globalize formatDate formatDate(date, 'g', 'CurrentCulture')
  ✅ globalize formatDate formatDate(date, 'g', 'CurrentCulture')
globalize formatDate formatDate(date, 'd', 'CurrentCulture')
  ✅ globalize formatDate formatDate(date, 'd', 'CurrentCulture')
globalize formatDate formatDate(date, 't', 'CurrentCulture')
  ✅ globalize formatDate formatDate(date, 't', 'CurrentCulture')
globalize formatDate whitespace is preserved
  ✅ globalize formatDate whitespace is preserved
globalize parseDate parseDate('#/##/####', 'CurrentCulture')
  ✅ globalize parseDate parseDate('#/##/####', 'CurrentCulture')
globalize parseDate parseDate('####-##-##', 'CurrentCulture')
  ✅ globalize parseDate parseDate('####-##-##', 'CurrentCulture')
globalize parseDate parseDate('####-##-##', 'CurrentCulture', ['yyyy-MM-dd'])
  ✅ globalize parseDate parseDate('####-##-##', 'CurrentCulture', ['yyyy-MM-dd'])
  ✅ globalize parseDate parseDate('####-##-##', 'CurrentCulture', ['yyyy-MM-dd'])
globalize parseDate parseDate('M/dd/yyyy hh:mm AM', 'CurrentCulture', 'g')
  ✅ globalize parseDate parseDate('M/dd/yyyy hh:mm AM', 'CurrentCulture', 'g')
globalize parseDate parseDate('#/##/####', 'CurrentCulture', 'd')
  ✅ globalize parseDate parseDate('#/##/####', 'CurrentCulture', 'd')
globalize parseDate parseDate('hh:mm AM', 'CurrentCulture', 't')
  ✅ globalize parseDate parseDate('hh:mm AM', 'CurrentCulture', 't')
globalize formatNumber formatNumber(#, 'n'
  ✅ globalize formatNumber formatNumber(#, 'n'
globalize formatNumber formatNumber-n0
  ✅ globalize formatNumber formatNumber-n0
globalize formatNumber formatNumber-n1
  ✅ globalize formatNumber formatNumber-n1
globalize formatNumber returns null given null
  ✅ globalize formatNumber returns null given null
globalize formatNumber returns null given string
  ✅ globalize formatNumber returns null given string
globalize formatNumber returns null given object
  ✅ globalize formatNumber returns null given object
globalize formatNumber whitespace is preserved
  ✅ globalize formatNumber whitespace is preserved
globalize parseNumber parseNumber('#.##')
  ✅ globalize parseNumber parseNumber('#.##')
globalize parseNumber parseNumber('#.#')
  ✅ globalize parseNumber parseNumber('#.#')
globalize parseNumber parseNumber('#')
  ✅ globalize parseNumber parseNumber('#')
globalize parseNumber parseNumber(' # ')
  ✅ globalize parseNumber parseNumber(' # ')

✅ ListLengthRule

ListLengthRule Between
  ✅ ListLengthRule Between
ListLengthRule Min
  ✅ ListLengthRule Min
ListLengthRule Max
  ✅ ListLengthRule Max

✅ merge

merge merges two input objects into a single new object
  ✅ merge merges two input objects into a single new object
merge returns a copy of the input objects if only one object is provided
  ✅ merge returns a copy of the input objects if only one object is provided
merge merges as many objects as provided
  ✅ merge merges as many objects as provided
merge properties of left-most input objects are overridden by subsequent input objects
  ✅ merge properties of left-most input objects are overridden by subsequent input objects

✅ normalize

normalize returns the time portion of the given date if the format is 't'
  ✅ normalize returns the time portion of the given date if the format is 't'
normalize returns the day portion of the given date if the format is 'd'
  ✅ normalize returns the day portion of the given date if the format is 'd'
settings autogeneratePropertyLabels is enabled by default
  ✅ settings autogeneratePropertyLabels is enabled by default
settings autogeneratePropertyLabels enabled: causes property labels to be generated
  ✅ settings autogeneratePropertyLabels enabled: causes property labels to be generated
settings autogeneratePropertyLabels disabled: does not cause property labels to be generated
  ✅ settings autogeneratePropertyLabels disabled: does not cause property labels to be generated
Global Events afterPropertySet is called after a property set on any entity
  ✅ Global Events afterPropertySet is called after a property set on any entity
Global Events afterPropertySet is called with additional arguments when specified for a property change
  ✅ Global Events afterPropertySet is called with additional arguments when specified for a property change
Global Events entityRegistered is called when any entity is created and registered
  ✅ Global Events entityRegistered is called when any entity is created and registered
Global Events listChanged is called when a list property is changed on any entity
  ✅ Global Events listChanged is called when a list property is changed on any entity
Global Events listChanged is called with additional arguments when specified for a list change
  ✅ Global Events listChanged is called with additional arguments when specified for a list change

✅ ObservableArray

ObservableArray should not publish change event for no changes
  ✅ ObservableArray should not publish change event for no changes
ObservableArray copyWithin shallow copies part of an array to another location in the same array and returns it without modifying its length
  ✅ ObservableArray copyWithin shallow copies part of an array to another location in the same array and returns it without modifying its length
ObservableArray fill changes elements in an array to a static value
  ✅ ObservableArray fill changes elements in an array to a static value
ObservableArray pop removes the last element from an array and returns that element
  ✅ ObservableArray pop removes the last element from an array and returns that element
ObservableArray push adds the specified elements to the end of an array and returns the new length of the array
  ✅ ObservableArray push adds the specified elements to the end of an array and returns the new length of the array
ObservableArray reverse reverses an array in place and returns the reference to the same array
  ✅ ObservableArray reverse reverses an array in place and returns the reference to the same array
ObservableArray shift removes the first element from an array and returns that removed element
  ✅ ObservableArray shift removes the first element from an array and returns that removed element
ObservableArray sort sorts the elements of an array in place and returns the reference to the same array, now sorted
  ✅ ObservableArray sort sorts the elements of an array in place and returns the reference to the same array, now sorted
ObservableArray splice changes the contents of an array by removing or replacing existing elements and/or adding new elements in place
  ✅ ObservableArray splice changes the contents of an array by removing or replacing existing elements and/or adding new elements in place
ObservableArray unshift adds the specified elements to the beginning of an array and returns the new length of the array
  ✅ ObservableArray unshift adds the specified elements to the beginning of an array and returns the new length of the array
updateArray adds items to the array
  ✅ updateArray adds items to the array
updateArray removes items from the array
  ✅ updateArray removes items from the array
updateArray reverses the array
  ✅ updateArray reverses the array
updateArray changes order of items in the array
  ✅ updateArray changes order of items in the array
updateArray removes extra items
  ✅ updateArray removes extra items
updateArray adds new items
  ✅ updateArray adds new items
updateArray moves an item forward or back in the list
  ✅ updateArray moves an item forward or back in the list

✅ Property

Property can have a constant value
  ✅ Property can have a constant value
Property set function runs on property change
  ✅ Property set function runs on property change
Property set function runs on property init
  ✅ Property set function runs on property init
Property init value property initializes value property
  ✅ Property init value property initializes value property
Property init value property does nothing if value property already initialized
  ✅ Property init value property does nothing if value property already initialized
Property init value property sets pendingInit to false after initialization
  ✅ Property init value property sets pendingInit to false after initialization
Property init value property sets pendingInit to false after initialization the property's default value
  ✅ Property init value property sets pendingInit to false after initialization the property's default value
Property init value list property initializes
  ✅ Property init value list property initializes
Property init value list property does nothing if already initialized
  ✅ Property init value list property does nothing if already initialized
Property init reference property initializes
  ✅ Property init reference property initializes
Property init reference property does nothing if already initialized
  ✅ Property init reference property does nothing if already initialized
Property init reference list property initializes
  ✅ Property init reference list property initializes
Property init reference list property does nothing if already initialized
  ✅ Property init reference list property does nothing if already initialized
Property change event value property is raised when the property is changed
  ✅ Property change event value property is raised when the property is changed
Property change event value property passes additional arguments when the property is changed
  ✅ Property change event value property passes additional arguments when the property is changed
Property change event value list property is raised when the list is changed
  ✅ Property change event value list property is raised when the list is changed
Property change event value list property passes additional arguments when the list is changed
  ✅ Property change event value list property passes additional arguments when the list is changed
Property change event reference property is raised when the property is changed
  ✅ Property change event reference property is raised when the property is changed
Property change event reference property passes additional arguments when the property is changed
  ✅ Property change event reference property passes additional arguments when the property is changed
Property change event reference list property is raised when the list is changed
  ✅ Property change event reference list property is raised when the list is changed
Property change event reference list property passes additional arguments when a list is changed
  ✅ Property change event reference list property passes additional arguments when a list is changed
Property pendingInit value property is true for a new object without a provided value
  ✅ Property pendingInit value property is true for a new object without a provided value
Property pendingInit value property is false for a new object with a provided value
  ✅ Property pendingInit value property is false for a new object with a provided value
Property pendingInit value property is false for an existing object with a value
  ✅ Property pendingInit value property is false for an existing object with a value
Property pendingInit value property is true for an existing object without a value
  ✅ Property pendingInit value property is true for an existing object without a value
Property pendingInit value property is true for a new object without a provided boolean value
  ✅ Property pendingInit value property is true for a new object without a provided boolean value
Property pendingInit value property is false for a new object with a provided boolean value
  ✅ Property pendingInit value property is false for a new object with a provided boolean value
Property pendingInit value property is false for an existing object with a boolean value
  ✅ Property pendingInit value property is false for an existing object with a boolean value
Property pendingInit value property is true for an existing object without a boolean value
  ✅ Property pendingInit value property is true for an existing object without a boolean value
Property pendingInit list property is true for a new object without a provided value
  ✅ Property pendingInit list property is true for a new object without a provided value
Property pendingInit list property is false for a new object with a provided value
  ✅ Property pendingInit list property is false for a new object with a provided value
Property pendingInit list property is false for a new object with a provided value of an empty array
  ✅ Property pendingInit list property is false for a new object with a provided value of an empty array
Property pendingInit list property is false for an existing object with a value
  ✅ Property pendingInit list property is false for an existing object with a value
Property pendingInit list property is false for an existing object with a value of an empty array
  ✅ Property pendingInit list property is false for an existing object with a value of an empty array
Property pendingInit list property is true for an existing object without a value
  ✅ Property pendingInit list property is true for an existing object without a value
Property pendingInit calculated value property is true for a new object until it is accessed
  ⚪ Property pendingInit calculated value property is true for a new object until it is accessed
Property pendingInit calculated value property is false for a new object after it is accessed
  ✅ Property pendingInit calculated value property is false for a new object after it is accessed
Property pendingInit calculated value property is true for an existing object until it is accessed
  ✅ Property pendingInit calculated value property is true for an existing object until it is accessed
Property pendingInit defaulted value property is true for a new object without a provided value until accessed
  ✅ Property pendingInit defaulted value property is true for a new object without a provided value until accessed
Property pendingInit defaulted value property is false for a new object with a provided value
  ✅ Property pendingInit defaulted value property is false for a new object with a provided value
Property pendingInit defaulted value property is false for an existing object with a value
  ✅ Property pendingInit defaulted value property is false for an existing object with a value
Property pendingInit defaulted value property is true for an existing object without a value until accessed
  ✅ Property pendingInit defaulted value property is true for an existing object without a value until accessed
Property pendingInit defaulted list property is true for a new object without a provided value until accessed
  ✅ Property pendingInit defaulted list property is true for a new object without a provided value until accessed
Property pendingInit defaulted list property is false for a new object with a provided value
  ✅ Property pendingInit defaulted list property is false for a new object with a provided value
Property pendingInit defaulted list property is false for a new object with an empty array
  ✅ Property pendingInit defaulted list property is false for a new object with an empty array
Property pendingInit defaulted list property is false for an existing object with a value
  ✅ Property pendingInit defaulted list property is false for an existing object with a value
Property pendingInit defaulted list property is false for an existing object with an empty array
  ✅ Property pendingInit defaulted list property is false for an existing object with an empty array
Property pendingInit defaulted list property is true for an existing object without a value until accessed
  ✅ Property pendingInit defaulted list property is true for an existing object without a value until accessed

✅ PropertyChain

PropertyChain Doesn't call PropertyChain.testConnection() when not needed
  ✅ PropertyChain Doesn't call PropertyChain.testConnection() when not needed

✅ RangeRule

RangeRule can be configured with contant min and max values
  ✅ RangeRule can be configured with contant min and max values
RangeRule can be configured with a constant min value (no max value)
  ✅ RangeRule can be configured with a constant min value (no max value)
RangeRule can be configured with a constant max value (no min value)
  ✅ RangeRule can be configured with a constant max value (no min value)
RangeRule can be configured with function min and max values
  ✅ RangeRule can be configured with function min and max values
RangeRule can be configured with dynamic function min and max values
  ✅ RangeRule can be configured with dynamic function min and max values

✅ RequiredRule

RequiredRule Required boolean
  ✅ RequiredRule Required boolean
RequiredRule Required function
  ✅ RequiredRule Required function
RequiredRule Required message function
  ✅ RequiredRule Required message function
RequiredRule Required function with custom message
  ✅ RequiredRule Required function with custom message

✅ StringFormatRule

StringFormatRule format
  ✅ StringFormatRule format
StringFormatRule Description, reformat, expression
  ✅ StringFormatRule Description, reformat, expression

✅ StringLengthRule

StringLengthRule can be configured with contant min and max length
  ✅ StringLengthRule can be configured with contant min and max length
StringLengthRule can be configured with a constant min value (no max value)
  ✅ StringLengthRule can be configured with a constant min value (no max value)
StringLengthRule can be configured with a constant max value (no min value)
  ✅ StringLengthRule can be configured with a constant max value (no min value)
StringLengthRule can be configured with dynamic function min and max values
  ✅ StringLengthRule can be configured with dynamic function min and max values

✅ Type

Type identifier property is inherited from baseType
  ✅ Type identifier property is inherited from baseType
Type create should support multilevel async resolution
  ✅ Type create should support multilevel async resolution
Type create should support multilevel async resolution within list items
  ✅ Type create should support multilevel async resolution within list items
Type create should throw error when asked to create an entity which already exists
  ✅ Type create should throw error when asked to create an entity which already exists
Type create Extended properties have the correct type
  ✅ Type create Extended properties have the correct type
Type createIfNotExists should create new instance if id is not known
  ✅ Type createIfNotExists should create new instance if id is not known
Type createIfNotExists should create new instance if id is not provided
  ✅ Type createIfNotExists should create new instance if id is not provided
Type createIfNotExists should return known instance if id is known
  ✅ Type createIfNotExists should return known instance if id is known

✅ validation-rule

validation-rule functions which throw exceptions are considered valid
  ✅ validation-rule functions which throw exceptions are considered valid
validation-rule property label included in error message
  ✅ validation-rule property label included in error message
validation-rule property label included in error message can be dynamic
  ✅ validation-rule property label included in error message can be dynamic
validation-rule nested format paths are added as predicates to rule referencing property with dynamic label
  ✅ validation-rule nested format paths are added as predicates to rule referencing property with dynamic label
validation-rule property label included in error message can be dynamic and use a custom source
  ✅ validation-rule property label included in error message can be dynamic and use a custom source
validation-rule function may return a non-string value that can be coerced to a string
  ✅ validation-rule function may return a non-string value that can be coerced to a string