diff --git a/.gitignore b/.gitignore index 929b7e8..eb63b7b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ /node_modules /_output /typings +/.vscode diff --git a/build/tasks/compile.js b/build/tasks/compile.js index 3b785d9..6b7bd52 100644 --- a/build/tasks/compile.js +++ b/build/tasks/compile.js @@ -3,8 +3,8 @@ var ts = require('gulp-typescript'); var merge = require('merge2'); var paths = require("../paths"); -var compileFor = function(moduleType, withTypings) { - var target = moduleType === "commonjs" || moduleType === "amd" ? "es5" : "es2017"; +var compileFor = function(moduleType, withTypings = false, target = "es2015") { + console.log(`Compiling for ${moduleType} - targetting ${target}`); var tsProject = ts.createProject('tsconfig.json', { declaration: withTypings || false, module: moduleType, @@ -25,8 +25,7 @@ var compileFor = function(moduleType, withTypings) { gulp.task('compile', ["clean", "generate-exports"], function() { return merge([ - compileFor("commonjs", true), - compileFor("amd"), - compileFor("es6") + compileFor("commonjs", true, "es5"), + compileFor("es2015") ]); }); \ No newline at end of file diff --git a/dist/amd/builders/reactive-validation-group-builder.js b/dist/amd/builders/reactive-validation-group-builder.js deleted file mode 100644 index e1669f1..0000000 --- a/dist/amd/builders/reactive-validation-group-builder.js +++ /dev/null @@ -1,43 +0,0 @@ -define(["require", "exports", "../validation-groups/reactive-validation-group", "../factories/model-watcher-factory", "../factories/model-resolver-factory"], function (require, exports, reactive_validation_group_1, model_watcher_factory_1, model_resolver_factory_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ReactiveValidationGroupBuilder = (function () { - function ReactiveValidationGroupBuilder(fieldErrorProcessor, ruleResolver) { - var _this = this; - this.fieldErrorProcessor = fieldErrorProcessor; - this.ruleResolver = ruleResolver; - this.create = function () { - _this.refreshRate = 500; - _this.validateOnStart = false; - _this.modelWatcherFactory = new model_watcher_factory_1.ModelWatcherFactory(); - _this.modelResolverFactory = new model_resolver_factory_1.ModelResolverFactory(); - return _this; - }; - this.withRefreshRate = function (refreshRate) { - _this.refreshRate = refreshRate; - return _this; - }; - this.withModelResolverFactory = function (modelResolverFactory) { - _this.modelResolverFactory = modelResolverFactory; - return _this; - }; - this.withModelWatcherFactory = function (modelWatcherFactory) { - _this.modelWatcherFactory = modelWatcherFactory; - return _this; - }; - this.andValidateOnStart = function () { - _this.validateOnStart = true; - return _this; - }; - this.build = function (model, ruleset) { - var validationGroup = new reactive_validation_group_1.ReactiveValidationGroup(_this.fieldErrorProcessor, _this.ruleResolver, _this.modelResolverFactory, _this.modelWatcherFactory, model, ruleset, _this.refreshRate); - if (_this.validateOnStart) { - validationGroup.validate(); - } - return validationGroup; - }; - } - return ReactiveValidationGroupBuilder; - }()); - exports.ReactiveValidationGroupBuilder = ReactiveValidationGroupBuilder; -}); diff --git a/dist/amd/builders/ruleset-builder.js b/dist/amd/builders/ruleset-builder.js deleted file mode 100644 index d27c445..0000000 --- a/dist/amd/builders/ruleset-builder.js +++ /dev/null @@ -1,98 +0,0 @@ -define(["require", "exports", "../rulesets/ruleset", "../rulesets/rule-link", "../rulesets/for-each-rule", "../helpers/type-helper", "../rules/composite/dynamic-composite-validation-rule"], function (require, exports, ruleset_1, rule_link_1, for_each_rule_1, type_helper_1, dynamic_composite_validation_rule_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var RulesetBuilder = (function () { - function RulesetBuilder(ruleRegistry) { - var _this = this; - this.ruleRegistry = ruleRegistry; - this.verifyExistingProperty = function () { - if (!_this.currentProperty) { - throw new Error("A property must precede any rule calls in the chain"); - } - }; - this.verifyRuleNameIsValid = function (rule) { - if (rule == null || typeof (rule) == "undefined" || rule.length == 0) { - throw new Error("A rule name is required"); - } - if (_this.ruleRegistry && !_this.ruleRegistry.hasRuleNamed(rule)) { - throw new Error("The rule [" + rule + "] has not been registered"); - } - }; - this.create = function () { - _this.internalRuleset = new ruleset_1.Ruleset(); - _this.currentProperty = null; - return _this; - }; - this.forProperty = function (propertyNameOrPredicate) { - var endProperty = propertyNameOrPredicate; - if (type_helper_1.TypeHelper.isFunctionType(endProperty)) { - endProperty = _this.extractPropertyName(propertyNameOrPredicate); - if (!endProperty) { - throw new Error("cannot resolve property from: " + propertyNameOrPredicate); - } - } - _this.currentProperty = endProperty; - _this.currentRule = null; - return _this; - }; - this.addRule = function (rule, ruleOptions) { - _this.verifyRuleNameIsValid(rule); - _this.verifyExistingProperty(); - _this.internalRuleset.addRule(_this.currentProperty, _this.currentRule = new rule_link_1.RuleLink(rule, ruleOptions)); - return _this; - }; - this.addCompositeRule = function (compositeRule) { - _this.internalRuleset.compositeRules[compositeRule.virtualPropertyName] = compositeRule; - return _this; - }; - this.withDisplayName = function (displayName) { - _this.verifyExistingProperty(); - _this.internalRuleset.propertyDisplayNames[_this.currentProperty] = displayName; - return _this; - }; - this.addDynamicRule = function (virtualPropertyName, validate, getMessage) { - var compositeRule = new dynamic_composite_validation_rule_1.DynamicCompositeValidationRule(virtualPropertyName, validate, getMessage); - _this.internalRuleset.compositeRules[virtualPropertyName] = compositeRule; - return _this; - }; - this.withMessage = function (messageOverride) { - _this.verifyExistingProperty(); - _this.currentRule.messageOverride = messageOverride; - return _this; - }; - this.appliesIf = function (appliesFunction) { - _this.verifyExistingProperty(); - _this.currentRule.appliesIf = appliesFunction; - return _this; - }; - this.addRuleForEach = function (rule, ruleOptions) { - _this.verifyRuleNameIsValid(rule); - _this.verifyExistingProperty(); - var ruleLink = new rule_link_1.RuleLink(rule, ruleOptions); - _this.currentRule = ruleLink; - _this.internalRuleset.addRule(_this.currentProperty, new for_each_rule_1.ForEachRule(ruleLink)); - return _this; - }; - this.addRuleset = function (ruleset) { - _this.verifyExistingProperty(); - _this.internalRuleset.addRuleset(_this.currentProperty, ruleset); - return _this; - }; - this.addRulesetForEach = function (ruleset) { - _this.verifyExistingProperty(); - _this.internalRuleset.addRuleset(_this.currentProperty, new for_each_rule_1.ForEachRule(ruleset)); - return _this; - }; - this.build = function () { - return _this.internalRuleset; - }; - } - RulesetBuilder.prototype.extractPropertyName = function (predicate) { - var regex = /.*\.([\w]*);/; - var predicateString = predicate.toString(); - return regex.exec(predicateString)[1]; - }; - return RulesetBuilder; - }()); - exports.RulesetBuilder = RulesetBuilder; -}); diff --git a/dist/amd/builders/validation-group-builder.js b/dist/amd/builders/validation-group-builder.js deleted file mode 100644 index b46329e..0000000 --- a/dist/amd/builders/validation-group-builder.js +++ /dev/null @@ -1,39 +0,0 @@ -define(["require", "exports", "../validation-groups/validation-group", "./reactive-validation-group-builder", "../factories/model-resolver-factory"], function (require, exports, validation_group_1, reactive_validation_group_builder_1, model_resolver_factory_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ValidationGroupBuilder = (function () { - function ValidationGroupBuilder(fieldErrorProcessor, ruleResolver) { - var _this = this; - this.fieldErrorProcessor = fieldErrorProcessor; - this.ruleResolver = ruleResolver; - this.create = function () { - _this.modelResolverFactory = new model_resolver_factory_1.ModelResolverFactory(); - _this.validateOnStart = false; - return _this; - }; - this.asReactiveGroup = function () { - var reactiveBuilder = new reactive_validation_group_builder_1.ReactiveValidationGroupBuilder(_this.fieldErrorProcessor, _this.ruleResolver) - .create() - .withModelResolverFactory(_this.modelResolverFactory); - return reactiveBuilder; - }; - this.withModelResolverFactory = function (modelResolverFactory) { - _this.modelResolverFactory = modelResolverFactory; - return _this; - }; - this.andValidateOnStart = function () { - _this.validateOnStart = true; - return _this; - }; - this.build = function (model, ruleset) { - var validationGroup = new validation_group_1.ValidationGroup(_this.fieldErrorProcessor, _this.ruleResolver, _this.modelResolverFactory, model, ruleset); - if (_this.validateOnStart) { - validationGroup.validate(); - } - return validationGroup; - }; - } - return ValidationGroupBuilder; - }()); - exports.ValidationGroupBuilder = ValidationGroupBuilder; -}); diff --git a/dist/amd/events/model-state-changed-event.js b/dist/amd/events/model-state-changed-event.js deleted file mode 100644 index 5c8c010..0000000 --- a/dist/amd/events/model-state-changed-event.js +++ /dev/null @@ -1,11 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ModelStateChangedEvent = (function () { - function ModelStateChangedEvent(isValid) { - this.isValid = isValid; - } - return ModelStateChangedEvent; - }()); - exports.ModelStateChangedEvent = ModelStateChangedEvent; -}); diff --git a/dist/amd/events/property-changed-event.js b/dist/amd/events/property-changed-event.js deleted file mode 100644 index e560152..0000000 --- a/dist/amd/events/property-changed-event.js +++ /dev/null @@ -1,13 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var PropertyChangedEvent = (function () { - function PropertyChangedEvent(propertyPath, newValue, oldValue) { - this.propertyPath = propertyPath; - this.newValue = newValue; - this.oldValue = oldValue; - } - return PropertyChangedEvent; - }()); - exports.PropertyChangedEvent = PropertyChangedEvent; -}); diff --git a/dist/amd/events/property-state-changed-event.js b/dist/amd/events/property-state-changed-event.js deleted file mode 100644 index d52a0eb..0000000 --- a/dist/amd/events/property-state-changed-event.js +++ /dev/null @@ -1,13 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var PropertyStateChangedEvent = (function () { - function PropertyStateChangedEvent(property, isValid, error) { - this.property = property; - this.isValid = isValid; - this.error = error; - } - return PropertyStateChangedEvent; - }()); - exports.PropertyStateChangedEvent = PropertyStateChangedEvent; -}); diff --git a/dist/amd/exposer.js b/dist/amd/exposer.js deleted file mode 100644 index d45b005..0000000 --- a/dist/amd/exposer.js +++ /dev/null @@ -1,16 +0,0 @@ -define(["require", "exports", "./processors/field-error-processor", "./rulesets/rule-resolver", "./builders/validation-group-builder", "./rule-registry-setup", "./builders/ruleset-builder"], function (require, exports, field_error_processor_1, rule_resolver_1, validation_group_builder_1, rule_registry_setup_1, ruleset_builder_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var fieldErrorProcessor = new field_error_processor_1.FieldErrorProcessor(rule_registry_setup_1.ruleRegistry); - var ruleResolver = new rule_resolver_1.RuleResolver(); - function createRuleset(withRuleVerification) { - if (withRuleVerification === void 0) { withRuleVerification = false; } - var rulesetBuilder = withRuleVerification ? new ruleset_builder_1.RulesetBuilder(rule_registry_setup_1.ruleRegistry) : new ruleset_builder_1.RulesetBuilder(); - return rulesetBuilder.create(); - } - exports.createRuleset = createRuleset; - function createGroup() { - return new validation_group_builder_1.ValidationGroupBuilder(fieldErrorProcessor, ruleResolver).create(); - } - exports.createGroup = createGroup; -}); diff --git a/dist/amd/factories/imodel-resolver-factory.js b/dist/amd/factories/imodel-resolver-factory.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/factories/imodel-resolver-factory.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/factories/imodel-watcher-factory.js b/dist/amd/factories/imodel-watcher-factory.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/factories/imodel-watcher-factory.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/factories/model-resolver-factory.js b/dist/amd/factories/model-resolver-factory.js deleted file mode 100644 index 407a1ed..0000000 --- a/dist/amd/factories/model-resolver-factory.js +++ /dev/null @@ -1,16 +0,0 @@ -define(["require", "exports", "../resolvers/model-resolver", "property-resolver"], function (require, exports, model_resolver_1, property_resolver_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ModelResolverFactory = (function () { - function ModelResolverFactory(propertyResolver) { - if (propertyResolver === void 0) { propertyResolver = new property_resolver_1.PropertyResolver(); } - var _this = this; - this.propertyResolver = propertyResolver; - this.createModelResolver = function (model) { - return new model_resolver_1.ModelResolver(_this.propertyResolver, model); - }; - } - return ModelResolverFactory; - }()); - exports.ModelResolverFactory = ModelResolverFactory; -}); diff --git a/dist/amd/factories/model-watcher-factory.js b/dist/amd/factories/model-watcher-factory.js deleted file mode 100644 index cd5f529..0000000 --- a/dist/amd/factories/model-watcher-factory.js +++ /dev/null @@ -1,13 +0,0 @@ -define(["require", "exports", "../watcher/model-watcher"], function (require, exports, model_watcher_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ModelWatcherFactory = (function () { - function ModelWatcherFactory() { - this.createModelWatcher = function () { - return new model_watcher_1.ModelWatcher(); - }; - } - return ModelWatcherFactory; - }()); - exports.ModelWatcherFactory = ModelWatcherFactory; -}); diff --git a/dist/amd/helpers/comparer-helper.js b/dist/amd/helpers/comparer-helper.js deleted file mode 100644 index 4526257..0000000 --- a/dist/amd/helpers/comparer-helper.js +++ /dev/null @@ -1,17 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ComparerHelper = (function () { - function ComparerHelper() { - } - ComparerHelper.simpleTypeComparer = function (value1, value2, isWeak) { - if (isWeak) { - return (value1 == value2); - } - return (value1 === value2); - }; - ComparerHelper.dateTimeCompararer = function (value1, value2) { return (value1.getTime() == value2.getTime()); }; - return ComparerHelper; - }()); - exports.ComparerHelper = ComparerHelper; -}); diff --git a/dist/amd/helpers/type-helper.js b/dist/amd/helpers/type-helper.js deleted file mode 100644 index 14c73b7..0000000 --- a/dist/amd/helpers/type-helper.js +++ /dev/null @@ -1,22 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var TypeHelper = (function () { - function TypeHelper() { - } - TypeHelper.isDateType = function (value) { - return (typeof value.getMonth === 'function'); - }; - TypeHelper.isFunctionType = function (value) { - return (typeof value === 'function'); - }; - TypeHelper.isSimpleType = function (value) { - return (typeof value == "string" || typeof value == "number"); - }; - TypeHelper.isArrayType = function (value) { - return Object.prototype.toString.call(value) === '[object Array]'; - }; - return TypeHelper; - }()); - exports.TypeHelper = TypeHelper; -}); diff --git a/dist/amd/index.js b/dist/amd/index.js deleted file mode 100644 index 0178b76..0000000 --- a/dist/amd/index.js +++ /dev/null @@ -1,47 +0,0 @@ -define(["require", "exports", "tslib", "./exposer", "./rule-registry-setup", "./builders/reactive-validation-group-builder", "./builders/ruleset-builder", "./builders/validation-group-builder", "./factories/model-resolver-factory", "./factories/model-watcher-factory", "./events/model-state-changed-event", "./events/property-changed-event", "./events/property-state-changed-event", "./helpers/comparer-helper", "./helpers/type-helper", "./processors/field-error-processor", "./processors/field-has-error", "./processors/validation-error", "./resolvers/model-resolver", "./promises/promise-counter", "./rulesets/for-each-rule", "./rulesets/rule-link", "./rulesets/rule-resolver", "./rulesets/ruleset", "./rules/advanced-regex-rule", "./rules/date-validation-rule", "./rules/decimal-validation-rule", "./rules/email-validation-rule", "./rules/equal-validation-rule", "./rules/iso-date-validation-rule", "./rules/matches-validation-rule", "./rules/max-length-validation-rule", "./rules/max-value-validation-rule", "./rules/min-length-validation-rule", "./rules/min-value-validation-rule", "./rules/not-equal-validation-rule", "./rules/number-validation-rule", "./rules/regex-validation-rule", "./rules/required-validation-rule", "./rules/rule-registry", "./rules/step-validation-rule", "./watcher/model-watcher", "./watcher/property-watcher", "./validation-groups/reactive-validation-group", "./validation-groups/validation-group", "./rules/composite/dynamic-composite-validation-rule"], function (require, exports, tslib_1, exposer_1, rule_registry_setup_1, reactive_validation_group_builder_1, ruleset_builder_1, validation_group_builder_1, model_resolver_factory_1, model_watcher_factory_1, model_state_changed_event_1, property_changed_event_1, property_state_changed_event_1, comparer_helper_1, type_helper_1, field_error_processor_1, field_has_error_1, validation_error_1, model_resolver_1, promise_counter_1, for_each_rule_1, rule_link_1, rule_resolver_1, ruleset_1, advanced_regex_rule_1, date_validation_rule_1, decimal_validation_rule_1, email_validation_rule_1, equal_validation_rule_1, iso_date_validation_rule_1, matches_validation_rule_1, max_length_validation_rule_1, max_value_validation_rule_1, min_length_validation_rule_1, min_value_validation_rule_1, not_equal_validation_rule_1, number_validation_rule_1, regex_validation_rule_1, required_validation_rule_1, rule_registry_1, step_validation_rule_1, model_watcher_1, property_watcher_1, reactive_validation_group_1, validation_group_1, dynamic_composite_validation_rule_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - tslib_1.__exportStar(exposer_1, exports); - tslib_1.__exportStar(rule_registry_setup_1, exports); - tslib_1.__exportStar(reactive_validation_group_builder_1, exports); - tslib_1.__exportStar(ruleset_builder_1, exports); - tslib_1.__exportStar(validation_group_builder_1, exports); - tslib_1.__exportStar(model_resolver_factory_1, exports); - tslib_1.__exportStar(model_watcher_factory_1, exports); - tslib_1.__exportStar(model_state_changed_event_1, exports); - tslib_1.__exportStar(property_changed_event_1, exports); - tslib_1.__exportStar(property_state_changed_event_1, exports); - tslib_1.__exportStar(comparer_helper_1, exports); - tslib_1.__exportStar(type_helper_1, exports); - tslib_1.__exportStar(field_error_processor_1, exports); - tslib_1.__exportStar(field_has_error_1, exports); - tslib_1.__exportStar(validation_error_1, exports); - tslib_1.__exportStar(model_resolver_1, exports); - tslib_1.__exportStar(promise_counter_1, exports); - tslib_1.__exportStar(for_each_rule_1, exports); - tslib_1.__exportStar(rule_link_1, exports); - tslib_1.__exportStar(rule_resolver_1, exports); - tslib_1.__exportStar(ruleset_1, exports); - tslib_1.__exportStar(advanced_regex_rule_1, exports); - tslib_1.__exportStar(date_validation_rule_1, exports); - tslib_1.__exportStar(decimal_validation_rule_1, exports); - tslib_1.__exportStar(email_validation_rule_1, exports); - tslib_1.__exportStar(equal_validation_rule_1, exports); - tslib_1.__exportStar(iso_date_validation_rule_1, exports); - tslib_1.__exportStar(matches_validation_rule_1, exports); - tslib_1.__exportStar(max_length_validation_rule_1, exports); - tslib_1.__exportStar(max_value_validation_rule_1, exports); - tslib_1.__exportStar(min_length_validation_rule_1, exports); - tslib_1.__exportStar(min_value_validation_rule_1, exports); - tslib_1.__exportStar(not_equal_validation_rule_1, exports); - tslib_1.__exportStar(number_validation_rule_1, exports); - tslib_1.__exportStar(regex_validation_rule_1, exports); - tslib_1.__exportStar(required_validation_rule_1, exports); - tslib_1.__exportStar(rule_registry_1, exports); - tslib_1.__exportStar(step_validation_rule_1, exports); - tslib_1.__exportStar(model_watcher_1, exports); - tslib_1.__exportStar(property_watcher_1, exports); - tslib_1.__exportStar(reactive_validation_group_1, exports); - tslib_1.__exportStar(validation_group_1, exports); - tslib_1.__exportStar(dynamic_composite_validation_rule_1, exports); -}); diff --git a/dist/amd/processors/field-error-processor.js b/dist/amd/processors/field-error-processor.js deleted file mode 100644 index c5f243e..0000000 --- a/dist/amd/processors/field-error-processor.js +++ /dev/null @@ -1,75 +0,0 @@ -define(["require", "exports", "tslib", "./field-has-error"], function (require, exports, tslib_1, field_has_error_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var FieldErrorProcessor = (function () { - function FieldErrorProcessor(ruleRegistry) { - this.ruleRegistry = ruleRegistry; - } - // Validates a single property against a model - FieldErrorProcessor.prototype.processRuleLink = function (modelResolver, propertyName, ruleLink) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var shouldRuleApply, validator, options, isValid, error; - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - shouldRuleApply = ruleLink.appliesIf === true - || ((typeof (ruleLink.appliesIf) === "function") - ? (ruleLink.appliesIf)(modelResolver, propertyName, ruleLink.ruleOptions) - : false); - if (!shouldRuleApply) { - return [2 /*return*/]; - } - validator = this.ruleRegistry.getRuleNamed(ruleLink.ruleName); - options = (typeof ruleLink.ruleOptions == "function") ? ruleLink.ruleOptions() : ruleLink.ruleOptions; - return [4 /*yield*/, validator.validate(modelResolver, propertyName, options)]; - case 1: - isValid = _a.sent(); - if (isValid) { - return [2 /*return*/]; - } - if (ruleLink.messageOverride) { - if (typeof (ruleLink.messageOverride) === "function") { - error = (ruleLink.messageOverride)(modelResolver, propertyName, ruleLink.ruleOptions); - } - else { - error = ruleLink.messageOverride; - } - } - else { - error = validator.getMessage(modelResolver, propertyName, ruleLink.ruleOptions); - } - throw new field_has_error_1.FieldHasError(error); - } - }); - }); - }; - // Loops through each rule on a property, adds it to a chain, then calls Promise.all - // Probably not correct, as they won't fire sequentially? Promises need to be chained - FieldErrorProcessor.prototype.checkFieldForErrors = function (modelResolver, propertyName, rules) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var _this = this; - var ruleCheck, checkEachRule; - return tslib_1.__generator(this, function (_a) { - ruleCheck = function (ruleLinkOrSet) { - return _this.processRuleLink(modelResolver, propertyName, ruleLinkOrSet); - }; - checkEachRule = function (rules) { - var promises = []; - rules.forEach(function (rule) { - promises.push(ruleCheck(rule)); - }); - return Promise.all(promises); - }; - return [2 /*return*/, Promise.resolve(rules) - .then(checkEachRule) - .then(function () { return null; }) - .catch(function (validationError) { - return validationError.message; - })]; - }); - }); - }; - return FieldErrorProcessor; - }()); - exports.FieldErrorProcessor = FieldErrorProcessor; -}); diff --git a/dist/amd/processors/field-has-error.js b/dist/amd/processors/field-has-error.js deleted file mode 100644 index a3f2411..0000000 --- a/dist/amd/processors/field-has-error.js +++ /dev/null @@ -1,14 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var FieldHasError = (function (_super) { - tslib_1.__extends(FieldHasError, _super); - function FieldHasError(message) { - var _this = _super.call(this, message) || this; - _this.message = message; - return _this; - } - return FieldHasError; - }(Error)); - exports.FieldHasError = FieldHasError; -}); diff --git a/dist/amd/processors/ifield-error-processor.js b/dist/amd/processors/ifield-error-processor.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/processors/ifield-error-processor.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/processors/validation-error.js b/dist/amd/processors/validation-error.js deleted file mode 100644 index b8551cd..0000000 --- a/dist/amd/processors/validation-error.js +++ /dev/null @@ -1,12 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ValidationError = (function () { - function ValidationError(propertyName, message) { - this.propertyName = propertyName; - this.message = message; - } - return ValidationError; - }()); - exports.ValidationError = ValidationError; -}); diff --git a/dist/amd/promises/promise-counter.js b/dist/amd/promises/promise-counter.js deleted file mode 100644 index 4f4b03c..0000000 --- a/dist/amd/promises/promise-counter.js +++ /dev/null @@ -1,56 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var PromiseCounter = (function () { - function PromiseCounter() { - var _this = this; - this.promiseCallbacks = []; - this.validationCounter = 0; - this.waitForCompletion = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var _this = this; - var resolver; - return tslib_1.__generator(this, function (_a) { - if (!this.validationCounter) { - return [2 /*return*/]; - } - resolver = function (resolve) { - _this.promiseCallbacks.push(function () { return resolve(); }); - }; - return [2 /*return*/, new Promise(resolver)]; - }); - }); }; - this.countPromise = function (promise) { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var result; - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!promise) { - return [2 /*return*/]; - } - if (!promise.then) { - throw new Error("Non-Promise pass in: " + promise); - } - this.incrementCounter(); - return [4 /*yield*/, promise]; - case 1: - result = _a.sent(); - this.decrementCounter(); - return [2 /*return*/, result]; - } - }); - }); }; - this.decrementCounter = function () { - _this.validationCounter--; - if (_this.validationCounter) { - return; - } - while (_this.promiseCallbacks.length) { - _this.promiseCallbacks.shift()(); - } - }; - this.incrementCounter = function () { _this.validationCounter++; }; - } - return PromiseCounter; - }()); - exports.PromiseCounter = PromiseCounter; -}); diff --git a/dist/amd/resolvers/imodel-resolver.js b/dist/amd/resolvers/imodel-resolver.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/resolvers/imodel-resolver.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/resolvers/iproperty-resolver.js b/dist/amd/resolvers/iproperty-resolver.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/resolvers/iproperty-resolver.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/resolvers/model-resolver.js b/dist/amd/resolvers/model-resolver.js deleted file mode 100644 index 3d0a348..0000000 --- a/dist/amd/resolvers/model-resolver.js +++ /dev/null @@ -1,16 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ModelResolver = (function () { - function ModelResolver(propertyResolver, model) { - this.propertyResolver = propertyResolver; - this.model = model; - } - ModelResolver.prototype.resolve = function (propertyName) { - return this.propertyResolver.resolveProperty(this.model, propertyName); - }; - ; - return ModelResolver; - }()); - exports.ModelResolver = ModelResolver; -}); diff --git a/dist/amd/rule-registry-setup.js b/dist/amd/rule-registry-setup.js deleted file mode 100644 index 2573379..0000000 --- a/dist/amd/rule-registry-setup.js +++ /dev/null @@ -1,22 +0,0 @@ -define(["require", "exports", "./rules/rule-registry", "./rules/date-validation-rule", "./rules/decimal-validation-rule", "./rules/email-validation-rule", "./rules/equal-validation-rule", "./rules/iso-date-validation-rule", "./rules/max-length-validation-rule", "./rules/max-value-validation-rule", "./rules/min-length-validation-rule", "./rules/min-value-validation-rule", "./rules/not-equal-validation-rule", "./rules/number-validation-rule", "./rules/regex-validation-rule", "./rules/required-validation-rule", "./rules/step-validation-rule", "./rules/matches-validation-rule"], function (require, exports, rule_registry_1, date_validation_rule_1, decimal_validation_rule_1, email_validation_rule_1, equal_validation_rule_1, iso_date_validation_rule_1, max_length_validation_rule_1, max_value_validation_rule_1, min_length_validation_rule_1, min_value_validation_rule_1, not_equal_validation_rule_1, number_validation_rule_1, regex_validation_rule_1, required_validation_rule_1, step_validation_rule_1, matches_validation_rule_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - if (!exports.ruleRegistry) { - exports.ruleRegistry = new rule_registry_1.RuleRegistry(); - exports.ruleRegistry.registerRule(new date_validation_rule_1.DateValidationRule()); - exports.ruleRegistry.registerRule(new decimal_validation_rule_1.DecimalValidationRule()); - exports.ruleRegistry.registerRule(new email_validation_rule_1.EmailValidationRule()); - exports.ruleRegistry.registerRule(new equal_validation_rule_1.EqualValidationRule()); - exports.ruleRegistry.registerRule(new iso_date_validation_rule_1.ISODateValidationRule()); - exports.ruleRegistry.registerRule(new max_length_validation_rule_1.MaxLengthValidationRule()); - exports.ruleRegistry.registerRule(new max_value_validation_rule_1.MaxValueValidationRule()); - exports.ruleRegistry.registerRule(new min_length_validation_rule_1.MinLengthValidationRule()); - exports.ruleRegistry.registerRule(new min_value_validation_rule_1.MinValueValidationRule()); - exports.ruleRegistry.registerRule(new not_equal_validation_rule_1.NotEqualValidationRule()); - exports.ruleRegistry.registerRule(new number_validation_rule_1.NumberValidationRule()); - exports.ruleRegistry.registerRule(new regex_validation_rule_1.RegexValidationRule()); - exports.ruleRegistry.registerRule(new required_validation_rule_1.RequiredValidationRule()); - exports.ruleRegistry.registerRule(new step_validation_rule_1.StepValidationRule()); - exports.ruleRegistry.registerRule(new matches_validation_rule_1.MatchesValidationRule()); - } -}); diff --git a/dist/amd/rules/advanced-regex-rule.js b/dist/amd/rules/advanced-regex-rule.js deleted file mode 100644 index 4d7659d..0000000 --- a/dist/amd/rules/advanced-regex-rule.js +++ /dev/null @@ -1,35 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var AdvancedRegexValidationRule = (function () { - function AdvancedRegexValidationRule(ruleName, expression, message) { - if (!ruleName || ruleName.length == 0) { - throw new Error("ruleName is required, an empty rule name is invalid"); - } - if (!expression || expression.length == 0) { - throw new Error("expression is required, an empty regex expression is invalid"); - } - this.ruleName = ruleName; - this.expression = expression; - this.message = (typeof message === "function") ? message : function () { return message; }; - } - AdvancedRegexValidationRule.prototype.validate = function (modelResolver, propertyName, regexPattern) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return [2 /*return*/, true]; - } - return [2 /*return*/, value.toString().match(this.expression) !== null]; - }); - }); - }; - AdvancedRegexValidationRule.prototype.getMessage = function (modelResolver, propertyName, regexPattern) { - var value = modelResolver.resolve(propertyName); - return this.message(value); - }; - return AdvancedRegexValidationRule; - }()); - exports.AdvancedRegexValidationRule = AdvancedRegexValidationRule; -}); diff --git a/dist/amd/rules/composite/dynamic-composite-validation-rule.js b/dist/amd/rules/composite/dynamic-composite-validation-rule.js deleted file mode 100644 index 5d15c23..0000000 --- a/dist/amd/rules/composite/dynamic-composite-validation-rule.js +++ /dev/null @@ -1,21 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var DynamicCompositeValidationRule = (function () { - function DynamicCompositeValidationRule(virtualPropertyName, validate, message) { - this.virtualPropertyName = virtualPropertyName; - this.validate = validate; - this.message = message; - } - DynamicCompositeValidationRule.prototype.getMessage = function (modelResolver) { - if (typeof (this.message) === "function") { - return this.message(modelResolver); - } - else { - return this.message; - } - }; - return DynamicCompositeValidationRule; - }()); - exports.DynamicCompositeValidationRule = DynamicCompositeValidationRule; -}); diff --git a/dist/amd/rules/composite/icomposite-validation-rule.js b/dist/amd/rules/composite/icomposite-validation-rule.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/rules/composite/icomposite-validation-rule.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/rules/date-validation-rule.js b/dist/amd/rules/date-validation-rule.js deleted file mode 100644 index 1c8e18b..0000000 --- a/dist/amd/rules/date-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var DateValidationRule = (function () { - function DateValidationRule() { - this.ruleName = "date"; - this.invalidObjectRegex = /Invalid|NaN/; - } - DateValidationRule.prototype.validate = function (modelResolver, propertyName) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, true]; - } - return [2 /*return*/, !this.invalidObjectRegex.test(new Date(value))]; - }); - }); - }; - DateValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains \"" + value + "\" which is not a valid date"; - }; - return DateValidationRule; - }()); - exports.DateValidationRule = DateValidationRule; -}); diff --git a/dist/amd/rules/decimal-validation-rule.js b/dist/amd/rules/decimal-validation-rule.js deleted file mode 100644 index 11918ee..0000000 --- a/dist/amd/rules/decimal-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var DecimalValidationRule = (function () { - function DecimalValidationRule() { - this.ruleName = "decimal"; - this.decimalRegex = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/; - } - DecimalValidationRule.prototype.validate = function (modelResolver, propertyName) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, true]; - } - return [2 /*return*/, this.decimalRegex.test(value)]; - }); - }); - }; - DecimalValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains " + value + " which is not a decimal value"; - }; - return DecimalValidationRule; - }()); - exports.DecimalValidationRule = DecimalValidationRule; -}); diff --git a/dist/amd/rules/email-validation-rule.js b/dist/amd/rules/email-validation-rule.js deleted file mode 100644 index 5e97aef..0000000 --- a/dist/amd/rules/email-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var EmailValidationRule = (function () { - function EmailValidationRule() { - this.ruleName = "email"; - this.emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/; - } - EmailValidationRule.prototype.validate = function (modelResolver, propertyName) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value === "") { - return [2 /*return*/, true]; - } - return [2 /*return*/, this.emailRegex.test(value)]; - }); - }); - }; - EmailValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains \"" + value + "\" which is not a valid email address"; - }; - return EmailValidationRule; - }()); - exports.EmailValidationRule = EmailValidationRule; -}); diff --git a/dist/amd/rules/equal-validation-rule.js b/dist/amd/rules/equal-validation-rule.js deleted file mode 100644 index e27c8bf..0000000 --- a/dist/amd/rules/equal-validation-rule.js +++ /dev/null @@ -1,38 +0,0 @@ -define(["require", "exports", "tslib", "../helpers/type-helper", "../helpers/comparer-helper"], function (require, exports, tslib_1, type_helper_1, comparer_helper_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var EqualValidationRule = (function () { - function EqualValidationRule() { - this.ruleName = "equal"; - } - EqualValidationRule.prototype.validate = function (modelResolver, propertyName, optionsOrValue) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value, comparison, weakEquality; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, true]; - } - comparison = optionsOrValue.value || optionsOrValue; - weakEquality = optionsOrValue.weakEquality || false; - if (type_helper_1.TypeHelper.isFunctionType(comparison)) { - comparison = comparison(); - } - if (type_helper_1.TypeHelper.isDateType(comparison)) { - return [2 /*return*/, comparer_helper_1.ComparerHelper.dateTimeCompararer(value, comparison)]; - } - else { - return [2 /*return*/, comparer_helper_1.ComparerHelper.simpleTypeComparer(value, comparison, weakEquality)]; - } - return [2 /*return*/]; - }); - }); - }; - EqualValidationRule.prototype.getMessage = function (modelResolver, propertyName, optionsOrValue) { - var value = modelResolver.resolve(propertyName); - return "This field is " + value + " but should be equal to " + (optionsOrValue.value || optionsOrValue); - }; - return EqualValidationRule; - }()); - exports.EqualValidationRule = EqualValidationRule; -}); diff --git a/dist/amd/rules/iso-date-validation-rule.js b/dist/amd/rules/iso-date-validation-rule.js deleted file mode 100644 index 0492919..0000000 --- a/dist/amd/rules/iso-date-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ISODateValidationRule = (function () { - function ISODateValidationRule() { - this.ruleName = "isoDate"; - this.isoDateRegex = /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/; - } - ISODateValidationRule.prototype.validate = function (modelResolver, propertyName) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, true]; - } - return [2 /*return*/, this.isoDateRegex.test(value)]; - }); - }); - }; - ISODateValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains \"" + value + "\" which is not a valid ISO date"; - }; - return ISODateValidationRule; - }()); - exports.ISODateValidationRule = ISODateValidationRule; -}); diff --git a/dist/amd/rules/ivalidation-rule.js b/dist/amd/rules/ivalidation-rule.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/rules/ivalidation-rule.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/rules/matches-validation-rule.js b/dist/amd/rules/matches-validation-rule.js deleted file mode 100644 index 9a31756..0000000 --- a/dist/amd/rules/matches-validation-rule.js +++ /dev/null @@ -1,38 +0,0 @@ -define(["require", "exports", "tslib", "../helpers/type-helper", "../helpers/comparer-helper"], function (require, exports, tslib_1, type_helper_1, comparer_helper_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var MatchesValidationRule = (function () { - function MatchesValidationRule() { - this.ruleName = "matches"; - } - MatchesValidationRule.prototype.validate = function (modelResolver, propertyName, optionsOrProperty) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var fieldToMatch, weakEquality, value, matchingFieldValue; - return tslib_1.__generator(this, function (_a) { - fieldToMatch = optionsOrProperty.property || optionsOrProperty; - weakEquality = optionsOrProperty.weakEquality || false; - value = modelResolver.resolve(propertyName); - matchingFieldValue = modelResolver.resolve(fieldToMatch); - if (value === undefined || value === null) { - return [2 /*return*/, (matchingFieldValue === undefined || matchingFieldValue === null)]; - } - else if (type_helper_1.TypeHelper.isDateType(value)) { - return [2 /*return*/, comparer_helper_1.ComparerHelper.dateTimeCompararer(value, matchingFieldValue)]; - } - else { - return [2 /*return*/, comparer_helper_1.ComparerHelper.simpleTypeComparer(value, matchingFieldValue, weakEquality)]; - } - return [2 /*return*/]; - }); - }); - }; - MatchesValidationRule.prototype.getMessage = function (modelResolver, propertyName, optionsOrProperty) { - var value = modelResolver.resolve(propertyName); - var fieldToMatch = optionsOrProperty.property || optionsOrProperty; - var matchingFieldValue = modelResolver.resolve(fieldToMatch); - return "This field is " + value + " but should match " + matchingFieldValue; - }; - return MatchesValidationRule; - }()); - exports.MatchesValidationRule = MatchesValidationRule; -}); diff --git a/dist/amd/rules/max-length-validation-rule.js b/dist/amd/rules/max-length-validation-rule.js deleted file mode 100644 index 723de14..0000000 --- a/dist/amd/rules/max-length-validation-rule.js +++ /dev/null @@ -1,27 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var MaxLengthValidationRule = (function () { - function MaxLengthValidationRule() { - this.ruleName = "maxLength"; - } - MaxLengthValidationRule.prototype.validate = function (modelResolver, propertyName, maxLength) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return [2 /*return*/, true]; - } - return [2 /*return*/, value.length <= maxLength]; - }); - }); - }; - MaxLengthValidationRule.prototype.getMessage = function (modelResolver, propertyName, maxLength) { - var value = modelResolver.resolve(propertyName); - return "This field has a length of " + value.length + " but should contain no more than " + maxLength; - }; - return MaxLengthValidationRule; - }()); - exports.MaxLengthValidationRule = MaxLengthValidationRule; -}); diff --git a/dist/amd/rules/max-value-validation-rule.js b/dist/amd/rules/max-value-validation-rule.js deleted file mode 100644 index 187e287..0000000 --- a/dist/amd/rules/max-value-validation-rule.js +++ /dev/null @@ -1,27 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var MaxValueValidationRule = (function () { - function MaxValueValidationRule() { - this.ruleName = "maxValue"; - } - MaxValueValidationRule.prototype.validate = function (modelResolver, propertyName, maxValue) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return [2 /*return*/, true]; - } - return [2 /*return*/, value <= maxValue]; - }); - }); - }; - MaxValueValidationRule.prototype.getMessage = function (modelResolver, propertyName, maxValue) { - var value = modelResolver.resolve(propertyName); - return "This field has a value of " + value + " but should be less than or equal to " + maxValue; - }; - return MaxValueValidationRule; - }()); - exports.MaxValueValidationRule = MaxValueValidationRule; -}); diff --git a/dist/amd/rules/min-length-validation-rule.js b/dist/amd/rules/min-length-validation-rule.js deleted file mode 100644 index b0e03e8..0000000 --- a/dist/amd/rules/min-length-validation-rule.js +++ /dev/null @@ -1,27 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var MinLengthValidationRule = (function () { - function MinLengthValidationRule() { - this.ruleName = "minLength"; - } - MinLengthValidationRule.prototype.validate = function (modelResolver, propertyName, minLength) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return [2 /*return*/, true]; - } - return [2 /*return*/, value.length >= minLength]; - }); - }); - }; - MinLengthValidationRule.prototype.getMessage = function (modelResolver, propertyName, minLength) { - var value = modelResolver.resolve(propertyName); - return "This field has a length of " + value.length + " but should more than " + minLength; - }; - return MinLengthValidationRule; - }()); - exports.MinLengthValidationRule = MinLengthValidationRule; -}); diff --git a/dist/amd/rules/min-value-validation-rule.js b/dist/amd/rules/min-value-validation-rule.js deleted file mode 100644 index 6c0d77d..0000000 --- a/dist/amd/rules/min-value-validation-rule.js +++ /dev/null @@ -1,27 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var MinValueValidationRule = (function () { - function MinValueValidationRule() { - this.ruleName = "minValue"; - } - MinValueValidationRule.prototype.validate = function (modelResolver, propertyName, minValue) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return [2 /*return*/, true]; - } - return [2 /*return*/, value >= minValue]; - }); - }); - }; - MinValueValidationRule.prototype.getMessage = function (modelResolver, propertyName, minValue) { - var value = modelResolver.resolve(propertyName); - return "This field has a value of " + value + " but should be greater than or equal to " + minValue; - }; - return MinValueValidationRule; - }()); - exports.MinValueValidationRule = MinValueValidationRule; -}); diff --git a/dist/amd/rules/not-equal-validation-rule.js b/dist/amd/rules/not-equal-validation-rule.js deleted file mode 100644 index f452268..0000000 --- a/dist/amd/rules/not-equal-validation-rule.js +++ /dev/null @@ -1,38 +0,0 @@ -define(["require", "exports", "tslib", "../helpers/type-helper", "../helpers/comparer-helper"], function (require, exports, tslib_1, type_helper_1, comparer_helper_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var NotEqualValidationRule = (function () { - function NotEqualValidationRule() { - this.ruleName = "notEqual"; - } - NotEqualValidationRule.prototype.validate = function (modelResolver, propertyName, optionsOrValue) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value, comparison, weakEquality; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, true]; - } - comparison = optionsOrValue.value || optionsOrValue; - weakEquality = optionsOrValue.weakEquality || false; - if (type_helper_1.TypeHelper.isFunctionType(comparison)) { - comparison = comparison(); - } - if (type_helper_1.TypeHelper.isDateType(comparison)) { - return [2 /*return*/, !comparer_helper_1.ComparerHelper.dateTimeCompararer(value, comparison)]; - } - else { - return [2 /*return*/, !comparer_helper_1.ComparerHelper.simpleTypeComparer(value, comparison, weakEquality)]; - } - return [2 /*return*/]; - }); - }); - }; - NotEqualValidationRule.prototype.getMessage = function (modelResolver, propertyName, optionsOrValue) { - var value = modelResolver.resolve(propertyName); - return "This field is " + value + " but should not be equal to " + (optionsOrValue.value || optionsOrValue); - }; - return NotEqualValidationRule; - }()); - exports.NotEqualValidationRule = NotEqualValidationRule; -}); diff --git a/dist/amd/rules/number-validation-rule.js b/dist/amd/rules/number-validation-rule.js deleted file mode 100644 index 221ab02..0000000 --- a/dist/amd/rules/number-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var NumberValidationRule = (function () { - function NumberValidationRule() { - this.ruleName = "number"; - this.numberRegex = /^\d+$/; - } - NumberValidationRule.prototype.validate = function (modelResolver, propertyName) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, true]; - } - return [2 /*return*/, this.numberRegex.test(value)]; - }); - }); - }; - NumberValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains " + value + " which is not a numeric value"; - }; - return NumberValidationRule; - }()); - exports.NumberValidationRule = NumberValidationRule; -}); diff --git a/dist/amd/rules/regex-validation-rule.js b/dist/amd/rules/regex-validation-rule.js deleted file mode 100644 index 69846af..0000000 --- a/dist/amd/rules/regex-validation-rule.js +++ /dev/null @@ -1,26 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var RegexValidationRule = (function () { - function RegexValidationRule() { - this.ruleName = "regex"; - } - RegexValidationRule.prototype.validate = function (modelResolver, propertyName, regexPattern) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return [2 /*return*/, true]; - } - return [2 /*return*/, value.toString().match(regexPattern) !== null]; - }); - }); - }; - RegexValidationRule.prototype.getMessage = function (modelResolver, propertyName, regexPattern) { - return "This field does not match the expected format"; - }; - return RegexValidationRule; - }()); - exports.RegexValidationRule = RegexValidationRule; -}); diff --git a/dist/amd/rules/required-validation-rule.js b/dist/amd/rules/required-validation-rule.js deleted file mode 100644 index 948413a..0000000 --- a/dist/amd/rules/required-validation-rule.js +++ /dev/null @@ -1,39 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var RequiredValidationRule = (function () { - function RequiredValidationRule() { - this.ruleName = "required"; - } - RequiredValidationRule.prototype.validate = function (modelResolver, propertyName, isRequired) { - if (isRequired === void 0) { isRequired = true; } - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value, testValue; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, !isRequired]; - } - testValue = value; - if (typeof (testValue) === 'string') { - if (String.prototype.trim) { - testValue = value.trim(); - } - else { - testValue = value.replace(/^\s+|\s+$/g, ''); - } - } - if (!isRequired) { - return [2 /*return*/, true]; - } - return [2 /*return*/, (testValue + '').length > 0]; - }); - }); - }; - RequiredValidationRule.prototype.getMessage = function (modelResolver, propertyName, isRequired) { - return "This field is required"; - }; - return RequiredValidationRule; - }()); - exports.RequiredValidationRule = RequiredValidationRule; -}); diff --git a/dist/amd/rules/rule-registry.js b/dist/amd/rules/rule-registry.js deleted file mode 100644 index af0177a..0000000 --- a/dist/amd/rules/rule-registry.js +++ /dev/null @@ -1,24 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var RuleRegistry = (function () { - function RuleRegistry() { - var _this = this; - this.rules = {}; - this.registerRule = function (validationRule) { - _this.rules[validationRule.ruleName] = validationRule; - }; - this.unregisterRule = function (validationRule) { - delete _this.rules[validationRule.ruleName]; - }; - this.getRuleNamed = function (ruleName) { - return _this.rules[ruleName] || null; - }; - this.hasRuleNamed = function (ruleName) { - return _this.getRuleNamed(ruleName) != null; - }; - } - return RuleRegistry; - }()); - exports.RuleRegistry = RuleRegistry; -}); diff --git a/dist/amd/rules/step-validation-rule.js b/dist/amd/rules/step-validation-rule.js deleted file mode 100644 index 6eca842..0000000 --- a/dist/amd/rules/step-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -define(["require", "exports", "tslib"], function (require, exports, tslib_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var StepValidationRule = (function () { - function StepValidationRule() { - this.ruleName = "step"; - } - StepValidationRule.prototype.validate = function (modelResolver, propertyName, step) { - return tslib_1.__awaiter(this, void 0, void 0, function () { - var value, dif; - return tslib_1.__generator(this, function (_a) { - value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return [2 /*return*/, Promise.resolve(true)]; - } - dif = (value * 100) % (step * 100); - return [2 /*return*/, Math.abs(dif) < 0.00001 || Math.abs(1 - dif) < 0.00001]; - }); - }); - }; - StepValidationRule.prototype.getMessage = function (modelResolver, propertyName, step) { - var value = modelResolver.resolve(propertyName); - return "This field has a value of " + value + " and should be an increment of " + step; - }; - return StepValidationRule; - }()); - exports.StepValidationRule = StepValidationRule; -}); diff --git a/dist/amd/rulesets/for-each-rule.js b/dist/amd/rulesets/for-each-rule.js deleted file mode 100644 index acdd31e..0000000 --- a/dist/amd/rulesets/for-each-rule.js +++ /dev/null @@ -1,12 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ForEachRule = (function () { - function ForEachRule(internalRule) { - this.internalRule = internalRule; - this.isForEach = true; - } - return ForEachRule; - }()); - exports.ForEachRule = ForEachRule; -}); diff --git a/dist/amd/rulesets/irule-resolver.js b/dist/amd/rulesets/irule-resolver.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/rulesets/irule-resolver.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/rulesets/rule-link.js b/dist/amd/rulesets/rule-link.js deleted file mode 100644 index c8da47f..0000000 --- a/dist/amd/rulesets/rule-link.js +++ /dev/null @@ -1,13 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var RuleLink = (function () { - function RuleLink(ruleName, ruleOptions) { - this.ruleName = ruleName; - this.ruleOptions = ruleOptions; - this.appliesIf = true; - } - return RuleLink; - }()); - exports.RuleLink = RuleLink; -}); diff --git a/dist/amd/rulesets/rule-resolver.js b/dist/amd/rulesets/rule-resolver.js deleted file mode 100644 index d54bf9b..0000000 --- a/dist/amd/rulesets/rule-resolver.js +++ /dev/null @@ -1,92 +0,0 @@ -define(["require", "exports", "property-resolver"], function (require, exports, property_resolver_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var RuleResolver = (function () { - function RuleResolver(propertyResolver) { - if (propertyResolver === void 0) { propertyResolver = new property_resolver_1.PropertyResolver(); } - var _this = this; - this.propertyResolver = propertyResolver; - this.isPropertyRoute = function (possiblePropertyRoute) { - return possiblePropertyRoute.indexOf(".") >= 0; - }; - this.isIndexRoute = function (possibleIndexRoute) { - return possibleIndexRoute.indexOf("[") >= 0; - }; - this.resolvePropertyRules = function (propertyRoute, ruleset) { - var propertyRouteSections = _this.propertyResolver.decomposePropertyRoute(propertyRoute); - var finalProperty = propertyRouteSections[propertyRouteSections.length - 1]; - var matchingRules = _this.traverseRulesForRoutes(propertyRouteSections, ruleset); - if (!matchingRules) { - return null; - } - if (matchingRules.getRulesForProperty) { - return matchingRules.getRulesForProperty(finalProperty); - } - return matchingRules; - }; - this.getMatchingRuleForProperty = function (property, rules) { - var currentRule; - for (var i = 0; i < rules.length; i++) { - currentRule = rules[i]; - if (currentRule.isForEach) { - currentRule = currentRule.internalRule; - } - if (!currentRule.getRulesForProperty) { - continue; - } - if (currentRule.rules[property]) { - return currentRule; - } - } - }; - this.traverseRulesForRoutes = function (propertyRouteSections, ruleset) { - var currentProperty = propertyRouteSections.shift(); - var childRules = ruleset; - if (ruleset.rules) { - childRules = childRules.rules[currentProperty]; - } - if (!childRules) { - return null; - } - if (propertyRouteSections.length == 0) { - return childRules; - } - var nextProperty = propertyRouteSections[0]; - if (!nextProperty) { - return ruleset; - } - if (_this.isIndexRoute(nextProperty)) { - propertyRouteSections.shift(); - var applicableRules_1 = []; - childRules.forEach(function (internalRules) { - if (internalRules.isForEach) { - applicableRules_1.push(internalRules.internalRule); - } - }); - if (propertyRouteSections.length > 0) { - var totalRules_1 = []; - applicableRules_1.forEach(function (applicableRule) { - var currentRouteSection = propertyRouteSections.slice(); - var outputRules = _this.traverseRulesForRoutes(currentRouteSection, applicableRule); - outputRules.forEach(function (outputRule) { - totalRules_1.push(outputRule); - }); - }); - return totalRules_1; - } - return applicableRules_1; - } - if (propertyRouteSections.length == 0) { - return childRules; - } - var nextChildRule = _this.getMatchingRuleForProperty(nextProperty, childRules); - if (propertyRouteSections.length > 0) { - return _this.traverseRulesForRoutes(propertyRouteSections, nextChildRule); - } - return nextChildRule; - }; - } - return RuleResolver; - }()); - exports.RuleResolver = RuleResolver; -}); diff --git a/dist/amd/rulesets/ruleset.js b/dist/amd/rulesets/ruleset.js deleted file mode 100644 index c1c369e..0000000 --- a/dist/amd/rulesets/ruleset.js +++ /dev/null @@ -1,32 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var Ruleset = (function () { - function Ruleset() { - var _this = this; - this.rules = {}; - this.compositeRules = {}; - this.propertyDisplayNames = {}; - this.createPropertyEntryIfNeeded = function (property) { - if (!_this.rules[property]) { - _this.rules[property] = []; - } - }; - this.addRule = function (property, ruleLink) { - _this.createPropertyEntryIfNeeded(property); - _this.rules[property].push(ruleLink); - }; - this.addRuleset = function (property, ruleset) { - _this.createPropertyEntryIfNeeded(property); - _this.rules[property].push(ruleset); - }; - this.addCompositeRule = function (compositeRule) { _this.compositeRules[compositeRule.virtualPropertyName] = compositeRule; }; - this.addPropertyDisplayName = function (propertyName, displayName) { return _this.propertyDisplayNames[propertyName] = displayName; }; - this.getRulesForProperty = function (property) { return _this.rules[property]; }; - this.getCompositeRulesRulesForProperty = function (propertyName) { return _this.compositeRules[propertyName]; }; - this.getPropertyDisplayName = function (propertyName) { return _this.propertyDisplayNames[propertyName] || propertyName; }; - } - return Ruleset; - }()); - exports.Ruleset = Ruleset; -}); diff --git a/dist/amd/validation-groups/ireactive-validation-group.js b/dist/amd/validation-groups/ireactive-validation-group.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/validation-groups/ireactive-validation-group.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/validation-groups/ivalidation-group.js b/dist/amd/validation-groups/ivalidation-group.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/validation-groups/ivalidation-group.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/validation-groups/reactive-validation-group.js b/dist/amd/validation-groups/reactive-validation-group.js deleted file mode 100644 index cd49112..0000000 --- a/dist/amd/validation-groups/reactive-validation-group.js +++ /dev/null @@ -1,27 +0,0 @@ -define(["require", "exports", "tslib", "../rulesets/rule-resolver", "./validation-group"], function (require, exports, tslib_1, rule_resolver_1, validation_group_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ReactiveValidationGroup = (function (_super) { - tslib_1.__extends(ReactiveValidationGroup, _super); - function ReactiveValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, modelWatcherFactory, model, ruleset, refreshRate) { - if (ruleResolver === void 0) { ruleResolver = new rule_resolver_1.RuleResolver(); } - if (refreshRate === void 0) { refreshRate = 500; } - var _this = _super.call(this, fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset) || this; - _this.modelWatcherFactory = modelWatcherFactory; - _this.refreshRate = refreshRate; - _this.onModelChanged = function (eventArgs) { - _this.startValidateProperty(eventArgs.propertyPath); - }; - _this.release = function () { - if (_this.modelWatcher) - _this.modelWatcher.stopWatching(); - }; - _this.modelWatcher = _this.modelWatcherFactory.createModelWatcher(); - _this.modelWatcher.setupWatcher(model, ruleset, refreshRate); - _this.modelWatcher.onPropertyChanged.subscribe(_this.onModelChanged); - return _this; - } - return ReactiveValidationGroup; - }(validation_group_1.ValidationGroup)); - exports.ReactiveValidationGroup = ReactiveValidationGroup; -}); diff --git a/dist/amd/validation-groups/validation-group.js b/dist/amd/validation-groups/validation-group.js deleted file mode 100644 index db38f20..0000000 --- a/dist/amd/validation-groups/validation-group.js +++ /dev/null @@ -1,260 +0,0 @@ -define(["require", "exports", "tslib", "../rulesets/rule-resolver", "../helpers/type-helper", "../promises/promise-counter", "../events/property-state-changed-event", "../events/model-state-changed-event", "event-js"], function (require, exports, tslib_1, rule_resolver_1, type_helper_1, promise_counter_1, property_state_changed_event_1, model_state_changed_event_1, event_js_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - // TODO: This class could be simplified - var ValidationGroup = (function () { - function ValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset) { - if (ruleResolver === void 0) { ruleResolver = new rule_resolver_1.RuleResolver(); } - var _this = this; - this.fieldErrorProcessor = fieldErrorProcessor; - this.ruleResolver = ruleResolver; - this.modelResolverFactory = modelResolverFactory; - this.ruleset = ruleset; - this.propertyErrors = {}; - this.validatePropertyWithRuleLinks = function (propertyName, propertyRules) { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var activePromise, possibleErrors, hadErrors, eventArgs, stillHasErrors, previousError, eventArgs; - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - activePromise = this.fieldErrorProcessor.checkFieldForErrors(this.modelResolver, propertyName, propertyRules); - return [4 /*yield*/, this.promiseCounter.countPromise(activePromise)]; - case 1: - possibleErrors = _a.sent(); - hadErrors = this.hasErrors(); - if (!possibleErrors) { - if (this.propertyErrors[propertyName]) { - delete this.propertyErrors[propertyName]; - eventArgs = new property_state_changed_event_1.PropertyStateChangedEvent(propertyName, true); - this.propertyStateChangedEvent.publish(eventArgs); - stillHasErrors = hadErrors && this.hasErrors(); - if (!stillHasErrors) { - this.modelStateChangedEvent.publish(new model_state_changed_event_1.ModelStateChangedEvent(true)); - } - } - return [2 /*return*/, this.promiseCounter.waitForCompletion()]; - } - previousError = this.propertyErrors[propertyName]; - this.propertyErrors[propertyName] = possibleErrors; - if (possibleErrors != previousError) { - eventArgs = new property_state_changed_event_1.PropertyStateChangedEvent(propertyName, false, possibleErrors); - this.propertyStateChangedEvent.publish(eventArgs); - if (!hadErrors) { - this.modelStateChangedEvent.publish(new model_state_changed_event_1.ModelStateChangedEvent(false)); - } - } - return [2 /*return*/, this.promiseCounter.waitForCompletion()]; - } - }); - }); }; - this.validatePropertyWithRuleSet = function (propertyRoute, ruleset) { - var transformedPropertyName; - for (var childPropertyName in ruleset.rules) { - transformedPropertyName = propertyRoute + "." + childPropertyName; - _this.validatePropertyWithRules(transformedPropertyName, ruleset.getRulesForProperty(childPropertyName)); - } - }; - this.validatePropertyWithRules = function (propertyRoute, rules) { - var ruleLinks = []; - var ruleSets = []; - var currentValue; - try { - currentValue = _this.modelResolver.resolve(propertyRoute); - } - catch (ex) { - console.warn("Failed to resolve property " + propertyRoute + " during validation. Does it exist in your model?"); - throw (ex); - } - var routeEachRule = function (ruleLinkOrSet) { - if (ValidationGroup.isForEach(ruleLinkOrSet)) { - var isCurrentlyAnArray = type_helper_1.TypeHelper.isArrayType(currentValue); - if (isCurrentlyAnArray) { - currentValue.forEach(function (element, index) { - var childPropertyName = propertyRoute + "[" + index + "]"; - _this.validatePropertyWithRules(childPropertyName, [ruleLinkOrSet.internalRule]); - }); - } - else { - if (ValidationGroup.isRuleset(ruleLinkOrSet.internalRule)) { - ruleSets.push(ruleLinkOrSet.internalRule); - } - else { - ruleLinks.push(ruleLinkOrSet.internalRule); - } - } - } - else if (ValidationGroup.isRuleset(ruleLinkOrSet)) { - ruleSets.push(ruleLinkOrSet); - } - else { - ruleLinks.push(ruleLinkOrSet); - } - }; - rules.forEach(routeEachRule); - _this.validatePropertyWithRuleLinks(propertyRoute, ruleLinks); - ruleSets.forEach(function (ruleSet) { - _this.validatePropertyWithRuleSet(propertyRoute, ruleSet); - }); - }; - this.startValidateProperty = function (propertyRoute) { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var rulesForProperty; - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!(this.ruleset.compositeRules !== {})) return [3 /*break*/, 2]; - return [4 /*yield*/, this.validateCompositeRules()]; - case 1: - _a.sent(); - _a.label = 2; - case 2: - if (this.ruleset.compositeRules[propertyRoute] !== undefined) { - return [2 /*return*/]; - } - rulesForProperty = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); - if (!rulesForProperty) { - return [2 /*return*/]; - } - return [2 /*return*/, this.validatePropertyWithRules(propertyRoute, rulesForProperty)]; - } - }); - }); }; - this.validateCompositeRule = function (compositeRule) { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var hadErrors, isValid, eventArgs, stillHasErrors, previousError, currentError, eventArgs; - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - hadErrors = this.hasErrors(); - return [4 /*yield*/, compositeRule.validate(this.modelResolver)]; - case 1: - isValid = _a.sent(); - if (isValid) { - if (this.propertyErrors[compositeRule.virtualPropertyName]) { - delete this.propertyErrors[compositeRule.virtualPropertyName]; - eventArgs = new property_state_changed_event_1.PropertyStateChangedEvent(compositeRule.virtualPropertyName, true); - this.propertyStateChangedEvent.publish(eventArgs); - } - stillHasErrors = hadErrors && this.hasErrors(); - if (!stillHasErrors) { - this.modelStateChangedEvent.publish(new model_state_changed_event_1.ModelStateChangedEvent(true)); - } - return [2 /*return*/]; - } - previousError = this.propertyErrors[compositeRule.virtualPropertyName]; - currentError = compositeRule.getMessage(this.modelResolver); - this.propertyErrors[compositeRule.virtualPropertyName] = currentError; - if (currentError != previousError) { - eventArgs = new property_state_changed_event_1.PropertyStateChangedEvent(compositeRule.virtualPropertyName, false, currentError); - this.propertyStateChangedEvent.publish(eventArgs); - if (!hadErrors) { - this.modelStateChangedEvent.publish(new model_state_changed_event_1.ModelStateChangedEvent(false)); - } - } - return [2 /*return*/, this.propertyErrors[compositeRule.virtualPropertyName]]; - } - }); - }); }; - this.validateCompositeRules = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var propertyName, compositeRule; - return tslib_1.__generator(this, function (_a) { - for (propertyName in this.ruleset.compositeRules) { - compositeRule = this.ruleset.compositeRules[propertyName]; - this.validateCompositeRule(compositeRule); - } - return [2 /*return*/]; - }); - }); }; - this.startValidateModel = function () { - for (var parameterName in _this.ruleset.rules) { - _this.startValidateProperty(parameterName); - } - }; - this.changeValidationTarget = function (model) { - _this.modelResolver = _this.modelResolverFactory.createModelResolver(model); - }; - this.validateProperty = function (propertyRoute) { return tslib_1.__awaiter(_this, void 0, void 0, function () { - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.startValidateProperty(propertyRoute)]; - case 1: - _a.sent(); - return [4 /*yield*/, this.promiseCounter.waitForCompletion()]; - case 2: - _a.sent(); - return [2 /*return*/, !this.propertyErrors[propertyRoute]]; - } - }); - }); }; - this.validate = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.startValidateModel()]; - case 1: - _a.sent(); - return [4 /*yield*/, this.promiseCounter.waitForCompletion()]; - case 2: - _a.sent(); - return [2 /*return*/, !this.hasErrors()]; - } - }); - }); }; - this.getModelErrors = function (revalidate) { - if (revalidate === void 0) { revalidate = false; } - return tslib_1.__awaiter(_this, void 0, void 0, function () { - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!revalidate) return [3 /*break*/, 2]; - return [4 /*yield*/, this.startValidateModel()]; - case 1: - _a.sent(); - _a.label = 2; - case 2: return [4 /*yield*/, this.promiseCounter.waitForCompletion()]; - case 3: - _a.sent(); - return [2 /*return*/, this.propertyErrors]; - } - }); - }); - }; - this.getPropertyError = function (propertyRoute, revalidate) { - if (revalidate === void 0) { revalidate = false; } - return tslib_1.__awaiter(_this, void 0, void 0, function () { - return tslib_1.__generator(this, function (_a) { - switch (_a.label) { - case 0: - if (revalidate) { - this.startValidateProperty(propertyRoute); - } - return [4 /*yield*/, this.promiseCounter.waitForCompletion()]; - case 1: - _a.sent(); - return [2 /*return*/, this.propertyErrors[propertyRoute]]; - } - }); - }); - }; - this.getPropertyDisplayName = function (propertyRoute) { - return _this.ruleset.getPropertyDisplayName(propertyRoute); - }; - this.isPropertyInGroup = function (propertyRoute) { - var applicableRules = _this.ruleResolver.resolvePropertyRules(propertyRoute, _this.ruleset); - return (applicableRules != null); - }; - this.release = function () { }; - this.propertyStateChangedEvent = new event_js_1.EventHandler(this); - this.modelStateChangedEvent = new event_js_1.EventHandler(this); - this.promiseCounter = new promise_counter_1.PromiseCounter(); - this.modelResolver = this.modelResolverFactory.createModelResolver(model); - } - ValidationGroup.isRuleset = function (possibleRuleset) { - return (typeof (possibleRuleset.addRule) == "function"); - }; - ValidationGroup.isForEach = function (possibleForEach) { - return possibleForEach.isForEach; - }; - ValidationGroup.prototype.hasErrors = function () { - return (Object.keys(this.propertyErrors).length > 0); - }; - return ValidationGroup; - }()); - exports.ValidationGroup = ValidationGroup; -}); diff --git a/dist/amd/watcher/imodel-watcher.js b/dist/amd/watcher/imodel-watcher.js deleted file mode 100644 index 2ae92b6..0000000 --- a/dist/amd/watcher/imodel-watcher.js +++ /dev/null @@ -1,4 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); -}); diff --git a/dist/amd/watcher/model-watcher.js b/dist/amd/watcher/model-watcher.js deleted file mode 100644 index 87e5c4b..0000000 --- a/dist/amd/watcher/model-watcher.js +++ /dev/null @@ -1,182 +0,0 @@ -define(["require", "exports", "property-resolver", "event-js", "../helpers/type-helper", "./property-watcher", "../events/property-changed-event"], function (require, exports, property_resolver_1, event_js_1, type_helper_1, property_watcher_1, property_changed_event_1) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var ModelWatcher = (function () { - function ModelWatcher(propertyResolver) { - if (propertyResolver === void 0) { propertyResolver = new property_resolver_1.PropertyResolver(); } - var _this = this; - this.propertyResolver = propertyResolver; - this.watchCache = []; - this.watchCacheKeys = []; - this.watcherInterval = null; - this.setupWatcher = function (model, ruleset, scanInterval) { - if (scanInterval === void 0) { scanInterval = 500; } - _this.model = model; - _this.ruleset = ruleset; - _this.scanInterval = scanInterval; - _this.watchCache = []; - _this.watchCacheKeys = []; - _this.cacheWatchTargets("", _this.ruleset); - _this.scanProperties(); - _this.startWatching(); - }; - this.changeWatcherTarget = function (model) { - _this.model = model; - _this.scanProperties(); - }; - this.startWatching = function () { - _this.stopWatching(); - _this.watcherInterval = setInterval(_this.scanProperties, _this.scanInterval); - }; - this.stopWatching = function () { - if (_this.watcherInterval) { - clearInterval(_this.watcherInterval); - } - }; - this.updateAndNotifyDifferences = function () { - var previousKeyCache = _this.watchCacheKeys; - var previousWatchCache = _this.watchCache; - _this.watchCache = []; - _this.watchCacheKeys = []; - _this.cacheWatchTargets("", _this.ruleset); - _this.watchCacheKeys.forEach(function (key, index) { - var previousValue; - if (previousKeyCache.indexOf(key) == -1) { - previousValue = _this.watchCache[index].previousValue; - var propertyChangedArgs_1 = new property_changed_event_1.PropertyChangedEvent(key, previousValue, null); - setTimeout(function () { _this.onPropertyChanged.publish(propertyChangedArgs_1); }, 1); - } - else if (previousWatchCache[index].previousValue && previousWatchCache[index].previousValue.isArray) { - if (previousWatchCache[index].previousValue.length != _this.watchCache[index].previousValue.length) { - var newValue = _this.watchCache[index].previousValue; - previousValue = previousWatchCache[index].previousValue; - var propertyChangedArgs_2 = new property_changed_event_1.PropertyChangedEvent(key, newValue, previousValue); - setTimeout(function () { _this.onPropertyChanged.publish(propertyChangedArgs_2); }, 1); - } - } - }); - }; - this.watchProperty = function (watchRoute, previousData) { - if (_this.watchCacheKeys.indexOf(watchRoute) == -1) { - var propertyWatcher = new property_watcher_1.PropertyWatcher(watchRoute, previousData); - _this.watchCache.push(propertyWatcher); - _this.watchCacheKeys.push(watchRoute); - } - }; - this.cacheWatchTargets = function (propertyStack, ruleset) { - var paramRoute, parameterRules; - var anyRulesAreForEach, anyRulesAreSets; - var hasValue, currentValue; - var _loop_1 = function (param) { - paramRoute = propertyStack ? propertyStack + "." + param : param; - parameterRules = ruleset.rules[param]; - anyRulesAreForEach = false; - anyRulesAreSets = false; - parameterRules.forEach(function (rule) { - if (rule.isForEach) { - anyRulesAreForEach = true; - } - if (rule.getRulesForProperty) { - anyRulesAreSets = true; - } - }); - hasValue = false; - try { - currentValue = _this.propertyResolver.resolveProperty(_this.model, paramRoute); - hasValue = true; - } - catch (ex) { } - if (currentValue == null && (anyRulesAreForEach || anyRulesAreSets)) { - if (anyRulesAreForEach) { - currentValue = []; - } - else if (anyRulesAreSets) { - currentValue = {}; - } - else { - currentValue = null; - } - } - parameterRules.forEach(function (rule) { - var isArray = type_helper_1.TypeHelper.isArrayType(currentValue); - if (isArray) { - var cachedArrayInfo = { length: currentValue.length, isArray: true }; - _this.watchProperty(paramRoute, cachedArrayInfo); - } - if (rule.isForEach && hasValue) { - // ruleset - if (rule.internalRule.getRulesForProperty) { - if (_this.model[param]) { - _this.model[param].forEach(function (element, index) { - _this.cacheWatchTargets(paramRoute + "[" + index + "]", rule.internalRule); - }); - } - } - else { - if (_this.model[param]) { - _this.model[param].forEach(function (element, index) { - _this.watchProperty(paramRoute + "[" + index + "]", _this.model[param][index]); - }); - } - } - } - else { - // ruleset - if (rule.getRulesForProperty) { - _this.cacheWatchTargets(paramRoute, rule); - } - else { - if (!isArray) { - _this.watchProperty(paramRoute, currentValue); - } - } - } - }); - }; - for (var param in ruleset.rules) { - _loop_1(param); - } - }; - this.scanProperties = function () { - if (_this.onPropertyChanged.getSubscriptionCount() == 0) { - return; - } - if (_this.watchCache.length == 0) { - return; - } - var refreshOnNextCycle = false; - _this.watchCache.forEach(function (propertyWatcher) { - var currentValue; - var hasChanged = false; - try { - currentValue = _this.propertyResolver.resolveProperty(_this.model, propertyWatcher.propertyPath); - } - catch (ex) { } - if (typeof (currentValue) == "undefined") { - currentValue = propertyWatcher.previousValue; - } - if (propertyWatcher.previousValue && propertyWatcher.previousValue.isArray) { - var currentLength = currentValue.length || 0; - if (currentLength != propertyWatcher.previousValue.length) { - hasChanged = true; - } - } - else if (currentValue !== propertyWatcher.previousValue) { - var propertyChangedArgs_3 = new property_changed_event_1.PropertyChangedEvent(propertyWatcher.propertyPath, currentValue, propertyWatcher.previousValue); - setTimeout(function () { _this.onPropertyChanged.publish(propertyChangedArgs_3); }, 1); - propertyWatcher.previousValue = currentValue; - } - if (hasChanged) { - refreshOnNextCycle = true; - } - }); - if (refreshOnNextCycle) { - setTimeout(_this.updateAndNotifyDifferences, 1); - } - }; - this.onPropertyChanged = new event_js_1.EventHandler(this); - } - return ModelWatcher; - }()); - exports.ModelWatcher = ModelWatcher; -}); diff --git a/dist/amd/watcher/property-watcher.js b/dist/amd/watcher/property-watcher.js deleted file mode 100644 index a33864d..0000000 --- a/dist/amd/watcher/property-watcher.js +++ /dev/null @@ -1,12 +0,0 @@ -define(["require", "exports"], function (require, exports) { - "use strict"; - Object.defineProperty(exports, "__esModule", { value: true }); - var PropertyWatcher = (function () { - function PropertyWatcher(propertyPath, previousValue) { - this.propertyPath = propertyPath; - this.previousValue = previousValue; - } - return PropertyWatcher; - }()); - exports.PropertyWatcher = PropertyWatcher; -}); diff --git a/dist/commonjs/builders/reactive-validation-group-builder.js b/dist/commonjs/builders/reactive-validation-group-builder.js index 2a9b888..9b1464d 100644 --- a/dist/commonjs/builders/reactive-validation-group-builder.js +++ b/dist/commonjs/builders/reactive-validation-group-builder.js @@ -3,11 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true }); var reactive_validation_group_1 = require("../validation-groups/reactive-validation-group"); var model_watcher_factory_1 = require("../factories/model-watcher-factory"); var model_resolver_factory_1 = require("../factories/model-resolver-factory"); -var ReactiveValidationGroupBuilder = (function () { - function ReactiveValidationGroupBuilder(fieldErrorProcessor, ruleResolver) { +var ReactiveValidationGroupBuilder = /** @class */ (function () { + function ReactiveValidationGroupBuilder(fieldErrorProcessor, ruleResolver, localeHandler) { var _this = this; this.fieldErrorProcessor = fieldErrorProcessor; this.ruleResolver = ruleResolver; + this.localeHandler = localeHandler; this.create = function () { _this.refreshRate = 500; _this.validateOnStart = false; @@ -32,7 +33,7 @@ var ReactiveValidationGroupBuilder = (function () { return _this; }; this.build = function (model, ruleset) { - var validationGroup = new reactive_validation_group_1.ReactiveValidationGroup(_this.fieldErrorProcessor, _this.ruleResolver, _this.modelResolverFactory, _this.modelWatcherFactory, model, ruleset, _this.refreshRate); + var validationGroup = new reactive_validation_group_1.ReactiveValidationGroup(_this.fieldErrorProcessor, _this.ruleResolver, _this.modelResolverFactory, _this.modelWatcherFactory, _this.localeHandler, model, ruleset, _this.refreshRate); if (_this.validateOnStart) { validationGroup.validate(); } diff --git a/dist/commonjs/builders/ruleset-builder.js b/dist/commonjs/builders/ruleset-builder.js index 4b11ac8..cfa9c18 100644 --- a/dist/commonjs/builders/ruleset-builder.js +++ b/dist/commonjs/builders/ruleset-builder.js @@ -5,7 +5,7 @@ var rule_link_1 = require("../rulesets/rule-link"); var for_each_rule_1 = require("../rulesets/for-each-rule"); var type_helper_1 = require("../helpers/type-helper"); var dynamic_composite_validation_rule_1 = require("../rules/composite/dynamic-composite-validation-rule"); -var RulesetBuilder = (function () { +var RulesetBuilder = /** @class */ (function () { function RulesetBuilder(ruleRegistry) { var _this = this; this.ruleRegistry = ruleRegistry; @@ -54,8 +54,8 @@ var RulesetBuilder = (function () { _this.internalRuleset.propertyDisplayNames[_this.currentProperty] = displayName; return _this; }; - this.addDynamicRule = function (virtualPropertyName, validate, getMessage) { - var compositeRule = new dynamic_composite_validation_rule_1.DynamicCompositeValidationRule(virtualPropertyName, validate, getMessage); + this.addDynamicRule = function (virtualPropertyName, validate) { + var compositeRule = new dynamic_composite_validation_rule_1.DynamicCompositeValidationRule(virtualPropertyName, validate); _this.internalRuleset.compositeRules[virtualPropertyName] = compositeRule; return _this; }; diff --git a/dist/commonjs/builders/validation-group-builder.js b/dist/commonjs/builders/validation-group-builder.js index 35705d4..522359b 100644 --- a/dist/commonjs/builders/validation-group-builder.js +++ b/dist/commonjs/builders/validation-group-builder.js @@ -3,18 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true }); var validation_group_1 = require("../validation-groups/validation-group"); var reactive_validation_group_builder_1 = require("./reactive-validation-group-builder"); var model_resolver_factory_1 = require("../factories/model-resolver-factory"); -var ValidationGroupBuilder = (function () { - function ValidationGroupBuilder(fieldErrorProcessor, ruleResolver) { +var ValidationGroupBuilder = /** @class */ (function () { + function ValidationGroupBuilder(fieldErrorProcessor, ruleResolver, localeHandler) { var _this = this; this.fieldErrorProcessor = fieldErrorProcessor; this.ruleResolver = ruleResolver; + this.localeHandler = localeHandler; this.create = function () { _this.modelResolverFactory = new model_resolver_factory_1.ModelResolverFactory(); _this.validateOnStart = false; return _this; }; this.asReactiveGroup = function () { - var reactiveBuilder = new reactive_validation_group_builder_1.ReactiveValidationGroupBuilder(_this.fieldErrorProcessor, _this.ruleResolver) + var reactiveBuilder = new reactive_validation_group_builder_1.ReactiveValidationGroupBuilder(_this.fieldErrorProcessor, _this.ruleResolver, _this.localeHandler) .create() .withModelResolverFactory(_this.modelResolverFactory); return reactiveBuilder; @@ -28,7 +29,7 @@ var ValidationGroupBuilder = (function () { return _this; }; this.build = function (model, ruleset) { - var validationGroup = new validation_group_1.ValidationGroup(_this.fieldErrorProcessor, _this.ruleResolver, _this.modelResolverFactory, model, ruleset); + var validationGroup = new validation_group_1.ValidationGroup(_this.fieldErrorProcessor, _this.ruleResolver, _this.modelResolverFactory, _this.localeHandler, model, ruleset); if (_this.validateOnStart) { validationGroup.validate(); } diff --git a/dist/commonjs/events/model-state-changed-event.js b/dist/commonjs/events/model-state-changed-event.js index d51fefe..6e60ad4 100644 --- a/dist/commonjs/events/model-state-changed-event.js +++ b/dist/commonjs/events/model-state-changed-event.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var ModelStateChangedEvent = (function () { +var ModelStateChangedEvent = /** @class */ (function () { function ModelStateChangedEvent(isValid) { this.isValid = isValid; } diff --git a/dist/commonjs/events/property-changed-event.js b/dist/commonjs/events/property-changed-event.js index 837bad4..61dda55 100644 --- a/dist/commonjs/events/property-changed-event.js +++ b/dist/commonjs/events/property-changed-event.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var PropertyChangedEvent = (function () { +var PropertyChangedEvent = /** @class */ (function () { function PropertyChangedEvent(propertyPath, newValue, oldValue) { this.propertyPath = propertyPath; this.newValue = newValue; diff --git a/dist/commonjs/events/property-state-changed-event.js b/dist/commonjs/events/property-state-changed-event.js index 61f4b26..f1439ab 100644 --- a/dist/commonjs/events/property-state-changed-event.js +++ b/dist/commonjs/events/property-state-changed-event.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var PropertyStateChangedEvent = (function () { +var PropertyStateChangedEvent = /** @class */ (function () { function PropertyStateChangedEvent(property, isValid, error) { this.property = property; this.isValid = isValid; diff --git a/dist/commonjs/exposer.js b/dist/commonjs/exposer.js index 1d4083e..a3c6eb4 100644 --- a/dist/commonjs/exposer.js +++ b/dist/commonjs/exposer.js @@ -5,7 +5,13 @@ var rule_resolver_1 = require("./rulesets/rule-resolver"); var validation_group_builder_1 = require("./builders/validation-group-builder"); var rule_registry_setup_1 = require("./rule-registry-setup"); var ruleset_builder_1 = require("./builders/ruleset-builder"); -var fieldErrorProcessor = new field_error_processor_1.FieldErrorProcessor(rule_registry_setup_1.ruleRegistry); +var default_locale_handler_1 = require("./localization/default-locale-handler"); +var en_us_1 = require("./locales/en-us"); +var defaultLocaleCode = "en-us"; +var defaultLocaleHandler = new default_locale_handler_1.DefaultLocaleHandler(); +defaultLocaleHandler.registerLocale(defaultLocaleCode, en_us_1.locale); +defaultLocaleHandler.useLocale(defaultLocaleCode); +var fieldErrorProcessor = new field_error_processor_1.FieldErrorProcessor(rule_registry_setup_1.ruleRegistry, defaultLocaleHandler); var ruleResolver = new rule_resolver_1.RuleResolver(); function createRuleset(withRuleVerification) { if (withRuleVerification === void 0) { withRuleVerification = false; } @@ -13,7 +19,10 @@ function createRuleset(withRuleVerification) { return rulesetBuilder.create(); } exports.createRuleset = createRuleset; -function createGroup() { - return new validation_group_builder_1.ValidationGroupBuilder(fieldErrorProcessor, ruleResolver).create(); -} +function createGroup() { return new validation_group_builder_1.ValidationGroupBuilder(fieldErrorProcessor, ruleResolver, defaultLocaleHandler).create(); } exports.createGroup = createGroup; +exports.localeHandler = defaultLocaleHandler; +function supplementLocale(localeCode, localeResource) { + defaultLocaleHandler.supplementLocaleFrom(localeCode, localeResource); +} +exports.supplementLocale = supplementLocale; diff --git a/dist/commonjs/factories/model-resolver-factory.js b/dist/commonjs/factories/model-resolver-factory.js index d39ca01..d166b4f 100644 --- a/dist/commonjs/factories/model-resolver-factory.js +++ b/dist/commonjs/factories/model-resolver-factory.js @@ -2,7 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var model_resolver_1 = require("../resolvers/model-resolver"); var property_resolver_1 = require("property-resolver"); -var ModelResolverFactory = (function () { +var ModelResolverFactory = /** @class */ (function () { function ModelResolverFactory(propertyResolver) { if (propertyResolver === void 0) { propertyResolver = new property_resolver_1.PropertyResolver(); } var _this = this; diff --git a/dist/commonjs/factories/model-watcher-factory.js b/dist/commonjs/factories/model-watcher-factory.js index be1c058..deed12a 100644 --- a/dist/commonjs/factories/model-watcher-factory.js +++ b/dist/commonjs/factories/model-watcher-factory.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var model_watcher_1 = require("../watcher/model-watcher"); -var ModelWatcherFactory = (function () { +var ModelWatcherFactory = /** @class */ (function () { function ModelWatcherFactory() { this.createModelWatcher = function () { return new model_watcher_1.ModelWatcher(); diff --git a/dist/commonjs/helpers/comparer-helper.js b/dist/commonjs/helpers/comparer-helper.js index 6a9e7ae..8ceafd3 100644 --- a/dist/commonjs/helpers/comparer-helper.js +++ b/dist/commonjs/helpers/comparer-helper.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var ComparerHelper = (function () { +var ComparerHelper = /** @class */ (function () { function ComparerHelper() { } ComparerHelper.simpleTypeComparer = function (value1, value2, isWeak) { diff --git a/dist/commonjs/helpers/type-helper.js b/dist/commonjs/helpers/type-helper.js index 84f34e3..c1eb78b 100644 --- a/dist/commonjs/helpers/type-helper.js +++ b/dist/commonjs/helpers/type-helper.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var TypeHelper = (function () { +var TypeHelper = /** @class */ (function () { function TypeHelper() { } TypeHelper.isDateType = function (value) { diff --git a/dist/commonjs/index.js b/dist/commonjs/index.js index 761da39..a2d0567 100644 --- a/dist/commonjs/index.js +++ b/dist/commonjs/index.js @@ -6,22 +6,20 @@ tslib_1.__exportStar(require("./rule-registry-setup"), exports); tslib_1.__exportStar(require("./builders/reactive-validation-group-builder"), exports); tslib_1.__exportStar(require("./builders/ruleset-builder"), exports); tslib_1.__exportStar(require("./builders/validation-group-builder"), exports); -tslib_1.__exportStar(require("./factories/model-resolver-factory"), exports); -tslib_1.__exportStar(require("./factories/model-watcher-factory"), exports); tslib_1.__exportStar(require("./events/model-state-changed-event"), exports); tslib_1.__exportStar(require("./events/property-changed-event"), exports); tslib_1.__exportStar(require("./events/property-state-changed-event"), exports); +tslib_1.__exportStar(require("./factories/model-resolver-factory"), exports); +tslib_1.__exportStar(require("./factories/model-watcher-factory"), exports); tslib_1.__exportStar(require("./helpers/comparer-helper"), exports); tslib_1.__exportStar(require("./helpers/type-helper"), exports); +tslib_1.__exportStar(require("./locales/en-us"), exports); +tslib_1.__exportStar(require("./localization/default-locale-handler"), exports); tslib_1.__exportStar(require("./processors/field-error-processor"), exports); tslib_1.__exportStar(require("./processors/field-has-error"), exports); tslib_1.__exportStar(require("./processors/validation-error"), exports); -tslib_1.__exportStar(require("./resolvers/model-resolver"), exports); tslib_1.__exportStar(require("./promises/promise-counter"), exports); -tslib_1.__exportStar(require("./rulesets/for-each-rule"), exports); -tslib_1.__exportStar(require("./rulesets/rule-link"), exports); -tslib_1.__exportStar(require("./rulesets/rule-resolver"), exports); -tslib_1.__exportStar(require("./rulesets/ruleset"), exports); +tslib_1.__exportStar(require("./resolvers/model-resolver"), exports); tslib_1.__exportStar(require("./rules/advanced-regex-rule"), exports); tslib_1.__exportStar(require("./rules/date-validation-rule"), exports); tslib_1.__exportStar(require("./rules/decimal-validation-rule"), exports); @@ -39,8 +37,12 @@ tslib_1.__exportStar(require("./rules/regex-validation-rule"), exports); tslib_1.__exportStar(require("./rules/required-validation-rule"), exports); tslib_1.__exportStar(require("./rules/rule-registry"), exports); tslib_1.__exportStar(require("./rules/step-validation-rule"), exports); -tslib_1.__exportStar(require("./watcher/model-watcher"), exports); -tslib_1.__exportStar(require("./watcher/property-watcher"), exports); +tslib_1.__exportStar(require("./rulesets/for-each-rule"), exports); +tslib_1.__exportStar(require("./rulesets/rule-link"), exports); +tslib_1.__exportStar(require("./rulesets/rule-resolver"), exports); +tslib_1.__exportStar(require("./rulesets/ruleset"), exports); tslib_1.__exportStar(require("./validation-groups/reactive-validation-group"), exports); tslib_1.__exportStar(require("./validation-groups/validation-group"), exports); +tslib_1.__exportStar(require("./watcher/model-watcher"), exports); +tslib_1.__exportStar(require("./watcher/property-watcher"), exports); tslib_1.__exportStar(require("./rules/composite/dynamic-composite-validation-rule"), exports); diff --git a/dist/commonjs/locales/en-us.js b/dist/commonjs/locales/en-us.js new file mode 100644 index 0000000..ac564ba --- /dev/null +++ b/dist/commonjs/locales/en-us.js @@ -0,0 +1,24 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.locale = { + "default": "This field is invalid", + "required": "This field is required", + "date": function (value) { return "This field contains \"" + value + "\" which is not a valid date"; }, + "decimal": function (value) { return "This field contains " + value + " which is not a decimal value"; }, + "equal": function (value, optionsOrValue) { return "This field is " + value + " but should be equal to " + (optionsOrValue.value || optionsOrValue); }, + "notEqual": function (value, optionsOrValue) { return "This field is " + value + " but should not be equal to " + (optionsOrValue.value || optionsOrValue); }, + "isoDate": function (value) { return "This field contains \"" + value + "\" which is not a valid ISO date"; }, + "maxLength": function (value, maxLength) { return "This field has a length of " + value.length + " but should contain no more than " + maxLength; }, + "minLength": function (value, minLength) { return "This field has a length of " + value.length + " but should more than " + minLength; }, + "maxValue": function (value, maxValue) { return "This field has a value of " + value + " but should be less than or equal to " + maxValue; }, + "minValue": function (value, minValue) { return "This field has a value of " + value + " but should be greater than or equal to " + minValue; }, + "number": function (value) { return "This field contains " + value + " which is not a numeric value"; }, + "regex": "This field does not match the expected format", + "step": function (value, step) { return "This field has a value of " + value + " and should be an increment of " + step; }, + "matches": function (modelResolver, propertyName, optionsOrProperty) { + var value = modelResolver.resolve(propertyName); + var fieldToMatch = optionsOrProperty.property || optionsOrProperty; + var matchingFieldValue = modelResolver.resolve(fieldToMatch); + return "This field is " + value + " but should match " + matchingFieldValue; + }, +}; diff --git a/dist/commonjs/localization/default-locale-handler.js b/dist/commonjs/localization/default-locale-handler.js new file mode 100644 index 0000000..7eb9a5d --- /dev/null +++ b/dist/commonjs/localization/default-locale-handler.js @@ -0,0 +1,55 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var tslib_1 = require("tslib"); +var DefaultLocaleHandler = /** @class */ (function () { + function DefaultLocaleHandler() { + var _this = this; + this.localeResources = {}; + this.getCurrentLocale = function () { return _this.localeCode; }; + this.registerLocale = function (localeCode, localeResource) { return tslib_1.__awaiter(_this, void 0, void 0, function () { + return tslib_1.__generator(this, function (_a) { + this.localeCode = localeCode; + this.localeResources[this.localeCode] = localeResource; + return [2 /*return*/]; + }); + }); }; + this.useLocale = function (localeCode) { return tslib_1.__awaiter(_this, void 0, void 0, function () { + return tslib_1.__generator(this, function (_a) { + if (!this.localeResources[localeCode]) { + throw "Unable to find registered locale for [" + localeCode + "]"; + } + this.localeCode = localeCode; + return [2 /*return*/]; + }); + }); }; + this.supplementLocaleFrom = function (localeCode, localeModule) { return tslib_1.__awaiter(_this, void 0, void 0, function () { + var propertyName; + return tslib_1.__generator(this, function (_a) { + if (!this.localeResources[localeCode]) { + this.localeResources[localeCode] = {}; + } + for (propertyName in localeModule) { + this.localeResources[localeCode][propertyName] = localeModule[propertyName]; + } + return [2 /*return*/]; + }); + }); }; + this.getMessage = function (ruleName, ruleOptions, modelResolver, propertyName) { return tslib_1.__awaiter(_this, void 0, void 0, function () { + var currentLocale, ruleResource, propertyValue; + return tslib_1.__generator(this, function (_a) { + currentLocale = this.localeResources[this.localeCode]; + ruleResource = currentLocale[ruleName] || currentLocale["default"] || "Cannot find rule for " + ruleName; + if (typeof ruleResource === "string") { + return [2 /*return*/, ruleResource]; + } + if (ruleResource.length === 3 || propertyName == null) { + return [2 /*return*/, ruleResource(modelResolver, propertyName, ruleOptions)]; + } + propertyValue = modelResolver.resolve(propertyName); + return [2 /*return*/, ruleResource(propertyValue, ruleOptions)]; + }); + }); }; + } + return DefaultLocaleHandler; +}()); +exports.DefaultLocaleHandler = DefaultLocaleHandler; diff --git a/dist/commonjs/localization/ilocale-handler.js b/dist/commonjs/localization/ilocale-handler.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/commonjs/localization/ilocale-handler.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/commonjs/localization/locale-string.js b/dist/commonjs/localization/locale-string.js new file mode 100644 index 0000000..c8ad2e5 --- /dev/null +++ b/dist/commonjs/localization/locale-string.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/commonjs/processors/field-error-processor.js b/dist/commonjs/processors/field-error-processor.js index fe91cd1..1f9ce33 100644 --- a/dist/commonjs/processors/field-error-processor.js +++ b/dist/commonjs/processors/field-error-processor.js @@ -2,11 +2,11 @@ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var field_has_error_1 = require("./field-has-error"); -var FieldErrorProcessor = (function () { - function FieldErrorProcessor(ruleRegistry) { +var FieldErrorProcessor = /** @class */ (function () { + function FieldErrorProcessor(ruleRegistry, localeHandler) { this.ruleRegistry = ruleRegistry; + this.localeHandler = localeHandler; } - // Validates a single property against a model FieldErrorProcessor.prototype.processRuleLink = function (modelResolver, propertyName, ruleLink) { return tslib_1.__awaiter(this, void 0, void 0, function () { var shouldRuleApply, validator, options, isValid, error; @@ -28,24 +28,23 @@ var FieldErrorProcessor = (function () { if (isValid) { return [2 /*return*/]; } - if (ruleLink.messageOverride) { - if (typeof (ruleLink.messageOverride) === "function") { - error = (ruleLink.messageOverride)(modelResolver, propertyName, ruleLink.ruleOptions); - } - else { - error = ruleLink.messageOverride; - } + if (!ruleLink.messageOverride) return [3 /*break*/, 2]; + if (typeof (ruleLink.messageOverride) === "function") { + error = (ruleLink.messageOverride)(modelResolver, propertyName, ruleLink.ruleOptions); } else { - error = validator.getMessage(modelResolver, propertyName, ruleLink.ruleOptions); + error = ruleLink.messageOverride; } - throw new field_has_error_1.FieldHasError(error); + return [3 /*break*/, 4]; + case 2: return [4 /*yield*/, this.localeHandler.getMessage(ruleLink.ruleName, ruleLink.ruleOptions, modelResolver, propertyName)]; + case 3: + error = _a.sent(); + _a.label = 4; + case 4: throw new field_has_error_1.FieldHasError(error); } }); }); }; - // Loops through each rule on a property, adds it to a chain, then calls Promise.all - // Probably not correct, as they won't fire sequentially? Promises need to be chained FieldErrorProcessor.prototype.checkFieldForErrors = function (modelResolver, propertyName, rules) { return tslib_1.__awaiter(this, void 0, void 0, function () { var _this = this; diff --git a/dist/commonjs/processors/field-has-error.js b/dist/commonjs/processors/field-has-error.js index 0ba1377..f6cf905 100644 --- a/dist/commonjs/processors/field-has-error.js +++ b/dist/commonjs/processors/field-has-error.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var FieldHasError = (function (_super) { +var FieldHasError = /** @class */ (function (_super) { tslib_1.__extends(FieldHasError, _super); function FieldHasError(message) { var _this = _super.call(this, message) || this; diff --git a/dist/commonjs/processors/validation-error.js b/dist/commonjs/processors/validation-error.js index 485c65e..f31b3f9 100644 --- a/dist/commonjs/processors/validation-error.js +++ b/dist/commonjs/processors/validation-error.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var ValidationError = (function () { +var ValidationError = /** @class */ (function () { function ValidationError(propertyName, message) { this.propertyName = propertyName; this.message = message; diff --git a/dist/commonjs/promises/promise-counter.js b/dist/commonjs/promises/promise-counter.js index bd9a528..936fb5d 100644 --- a/dist/commonjs/promises/promise-counter.js +++ b/dist/commonjs/promises/promise-counter.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var PromiseCounter = (function () { +var PromiseCounter = /** @class */ (function () { function PromiseCounter() { var _this = this; this.promiseCallbacks = []; diff --git a/dist/commonjs/resolvers/model-resolver.js b/dist/commonjs/resolvers/model-resolver.js index 5352c74..8e2471f 100644 --- a/dist/commonjs/resolvers/model-resolver.js +++ b/dist/commonjs/resolvers/model-resolver.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var ModelResolver = (function () { +var ModelResolver = /** @class */ (function () { function ModelResolver(propertyResolver, model) { this.propertyResolver = propertyResolver; this.model = model; @@ -8,7 +8,6 @@ var ModelResolver = (function () { ModelResolver.prototype.resolve = function (propertyName) { return this.propertyResolver.resolveProperty(this.model, propertyName); }; - ; return ModelResolver; }()); exports.ModelResolver = ModelResolver; diff --git a/dist/commonjs/rules/advanced-regex-rule.js b/dist/commonjs/rules/advanced-regex-rule.js index d0a78cf..080a723 100644 --- a/dist/commonjs/rules/advanced-regex-rule.js +++ b/dist/commonjs/rules/advanced-regex-rule.js @@ -1,8 +1,8 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var AdvancedRegexValidationRule = (function () { - function AdvancedRegexValidationRule(ruleName, expression, message) { +var AdvancedRegexValidationRule = /** @class */ (function () { + function AdvancedRegexValidationRule(ruleName, expression) { if (!ruleName || ruleName.length == 0) { throw new Error("ruleName is required, an empty rule name is invalid"); } @@ -11,7 +11,6 @@ var AdvancedRegexValidationRule = (function () { } this.ruleName = ruleName; this.expression = expression; - this.message = (typeof message === "function") ? message : function () { return message; }; } AdvancedRegexValidationRule.prototype.validate = function (modelResolver, propertyName, regexPattern) { return tslib_1.__awaiter(this, void 0, void 0, function () { @@ -25,10 +24,6 @@ var AdvancedRegexValidationRule = (function () { }); }); }; - AdvancedRegexValidationRule.prototype.getMessage = function (modelResolver, propertyName, regexPattern) { - var value = modelResolver.resolve(propertyName); - return this.message(value); - }; return AdvancedRegexValidationRule; }()); exports.AdvancedRegexValidationRule = AdvancedRegexValidationRule; diff --git a/dist/commonjs/rules/composite/dynamic-composite-validation-rule.js b/dist/commonjs/rules/composite/dynamic-composite-validation-rule.js index ad056ca..bfee564 100644 --- a/dist/commonjs/rules/composite/dynamic-composite-validation-rule.js +++ b/dist/commonjs/rules/composite/dynamic-composite-validation-rule.js @@ -1,19 +1,10 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var DynamicCompositeValidationRule = (function () { - function DynamicCompositeValidationRule(virtualPropertyName, validate, message) { +var DynamicCompositeValidationRule = /** @class */ (function () { + function DynamicCompositeValidationRule(virtualPropertyName, validate) { this.virtualPropertyName = virtualPropertyName; this.validate = validate; - this.message = message; } - DynamicCompositeValidationRule.prototype.getMessage = function (modelResolver) { - if (typeof (this.message) === "function") { - return this.message(modelResolver); - } - else { - return this.message; - } - }; return DynamicCompositeValidationRule; }()); exports.DynamicCompositeValidationRule = DynamicCompositeValidationRule; diff --git a/dist/commonjs/rules/date-validation-rule.js b/dist/commonjs/rules/date-validation-rule.js index c9c703e..949d6bb 100644 --- a/dist/commonjs/rules/date-validation-rule.js +++ b/dist/commonjs/rules/date-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var DateValidationRule = (function () { +var DateValidationRule = /** @class */ (function () { function DateValidationRule() { this.ruleName = "date"; this.invalidObjectRegex = /Invalid|NaN/; @@ -18,10 +18,6 @@ var DateValidationRule = (function () { }); }); }; - DateValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains \"" + value + "\" which is not a valid date"; - }; return DateValidationRule; }()); exports.DateValidationRule = DateValidationRule; diff --git a/dist/commonjs/rules/decimal-validation-rule.js b/dist/commonjs/rules/decimal-validation-rule.js index f0b0c19..b2de681 100644 --- a/dist/commonjs/rules/decimal-validation-rule.js +++ b/dist/commonjs/rules/decimal-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var DecimalValidationRule = (function () { +var DecimalValidationRule = /** @class */ (function () { function DecimalValidationRule() { this.ruleName = "decimal"; this.decimalRegex = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/; @@ -18,10 +18,6 @@ var DecimalValidationRule = (function () { }); }); }; - DecimalValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains " + value + " which is not a decimal value"; - }; return DecimalValidationRule; }()); exports.DecimalValidationRule = DecimalValidationRule; diff --git a/dist/commonjs/rules/email-validation-rule.js b/dist/commonjs/rules/email-validation-rule.js index aea20f8..22ff8bf 100644 --- a/dist/commonjs/rules/email-validation-rule.js +++ b/dist/commonjs/rules/email-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var EmailValidationRule = (function () { +var EmailValidationRule = /** @class */ (function () { function EmailValidationRule() { this.ruleName = "email"; this.emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/; @@ -18,10 +18,6 @@ var EmailValidationRule = (function () { }); }); }; - EmailValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains \"" + value + "\" which is not a valid email address"; - }; return EmailValidationRule; }()); exports.EmailValidationRule = EmailValidationRule; diff --git a/dist/commonjs/rules/equal-validation-rule.js b/dist/commonjs/rules/equal-validation-rule.js index 4da7fe2..e70e395 100644 --- a/dist/commonjs/rules/equal-validation-rule.js +++ b/dist/commonjs/rules/equal-validation-rule.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var type_helper_1 = require("../helpers/type-helper"); var comparer_helper_1 = require("../helpers/comparer-helper"); -var EqualValidationRule = (function () { +var EqualValidationRule = /** @class */ (function () { function EqualValidationRule() { this.ruleName = "equal"; } @@ -30,10 +30,6 @@ var EqualValidationRule = (function () { }); }); }; - EqualValidationRule.prototype.getMessage = function (modelResolver, propertyName, optionsOrValue) { - var value = modelResolver.resolve(propertyName); - return "This field is " + value + " but should be equal to " + (optionsOrValue.value || optionsOrValue); - }; return EqualValidationRule; }()); exports.EqualValidationRule = EqualValidationRule; diff --git a/dist/commonjs/rules/iso-date-validation-rule.js b/dist/commonjs/rules/iso-date-validation-rule.js index 1b659cd..428f972 100644 --- a/dist/commonjs/rules/iso-date-validation-rule.js +++ b/dist/commonjs/rules/iso-date-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var ISODateValidationRule = (function () { +var ISODateValidationRule = /** @class */ (function () { function ISODateValidationRule() { this.ruleName = "isoDate"; this.isoDateRegex = /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/; @@ -18,10 +18,6 @@ var ISODateValidationRule = (function () { }); }); }; - ISODateValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains \"" + value + "\" which is not a valid ISO date"; - }; return ISODateValidationRule; }()); exports.ISODateValidationRule = ISODateValidationRule; diff --git a/dist/commonjs/rules/matches-validation-rule.js b/dist/commonjs/rules/matches-validation-rule.js index bc5be25..2fb25d6 100644 --- a/dist/commonjs/rules/matches-validation-rule.js +++ b/dist/commonjs/rules/matches-validation-rule.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var type_helper_1 = require("../helpers/type-helper"); var comparer_helper_1 = require("../helpers/comparer-helper"); -var MatchesValidationRule = (function () { +var MatchesValidationRule = /** @class */ (function () { function MatchesValidationRule() { this.ruleName = "matches"; } @@ -28,12 +28,6 @@ var MatchesValidationRule = (function () { }); }); }; - MatchesValidationRule.prototype.getMessage = function (modelResolver, propertyName, optionsOrProperty) { - var value = modelResolver.resolve(propertyName); - var fieldToMatch = optionsOrProperty.property || optionsOrProperty; - var matchingFieldValue = modelResolver.resolve(fieldToMatch); - return "This field is " + value + " but should match " + matchingFieldValue; - }; return MatchesValidationRule; }()); exports.MatchesValidationRule = MatchesValidationRule; diff --git a/dist/commonjs/rules/max-length-validation-rule.js b/dist/commonjs/rules/max-length-validation-rule.js index 551b237..8af630b 100644 --- a/dist/commonjs/rules/max-length-validation-rule.js +++ b/dist/commonjs/rules/max-length-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var MaxLengthValidationRule = (function () { +var MaxLengthValidationRule = /** @class */ (function () { function MaxLengthValidationRule() { this.ruleName = "maxLength"; } @@ -17,10 +17,6 @@ var MaxLengthValidationRule = (function () { }); }); }; - MaxLengthValidationRule.prototype.getMessage = function (modelResolver, propertyName, maxLength) { - var value = modelResolver.resolve(propertyName); - return "This field has a length of " + value.length + " but should contain no more than " + maxLength; - }; return MaxLengthValidationRule; }()); exports.MaxLengthValidationRule = MaxLengthValidationRule; diff --git a/dist/commonjs/rules/max-value-validation-rule.js b/dist/commonjs/rules/max-value-validation-rule.js index f21e30c..3009df9 100644 --- a/dist/commonjs/rules/max-value-validation-rule.js +++ b/dist/commonjs/rules/max-value-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var MaxValueValidationRule = (function () { +var MaxValueValidationRule = /** @class */ (function () { function MaxValueValidationRule() { this.ruleName = "maxValue"; } @@ -17,10 +17,6 @@ var MaxValueValidationRule = (function () { }); }); }; - MaxValueValidationRule.prototype.getMessage = function (modelResolver, propertyName, maxValue) { - var value = modelResolver.resolve(propertyName); - return "This field has a value of " + value + " but should be less than or equal to " + maxValue; - }; return MaxValueValidationRule; }()); exports.MaxValueValidationRule = MaxValueValidationRule; diff --git a/dist/commonjs/rules/min-length-validation-rule.js b/dist/commonjs/rules/min-length-validation-rule.js index e59f0ba..fa93f5f 100644 --- a/dist/commonjs/rules/min-length-validation-rule.js +++ b/dist/commonjs/rules/min-length-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var MinLengthValidationRule = (function () { +var MinLengthValidationRule = /** @class */ (function () { function MinLengthValidationRule() { this.ruleName = "minLength"; } @@ -17,10 +17,6 @@ var MinLengthValidationRule = (function () { }); }); }; - MinLengthValidationRule.prototype.getMessage = function (modelResolver, propertyName, minLength) { - var value = modelResolver.resolve(propertyName); - return "This field has a length of " + value.length + " but should more than " + minLength; - }; return MinLengthValidationRule; }()); exports.MinLengthValidationRule = MinLengthValidationRule; diff --git a/dist/commonjs/rules/min-value-validation-rule.js b/dist/commonjs/rules/min-value-validation-rule.js index ee3e42c..9df6a6a 100644 --- a/dist/commonjs/rules/min-value-validation-rule.js +++ b/dist/commonjs/rules/min-value-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var MinValueValidationRule = (function () { +var MinValueValidationRule = /** @class */ (function () { function MinValueValidationRule() { this.ruleName = "minValue"; } @@ -17,10 +17,6 @@ var MinValueValidationRule = (function () { }); }); }; - MinValueValidationRule.prototype.getMessage = function (modelResolver, propertyName, minValue) { - var value = modelResolver.resolve(propertyName); - return "This field has a value of " + value + " but should be greater than or equal to " + minValue; - }; return MinValueValidationRule; }()); exports.MinValueValidationRule = MinValueValidationRule; diff --git a/dist/commonjs/rules/not-equal-validation-rule.js b/dist/commonjs/rules/not-equal-validation-rule.js index d623c64..e9b1e92 100644 --- a/dist/commonjs/rules/not-equal-validation-rule.js +++ b/dist/commonjs/rules/not-equal-validation-rule.js @@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var type_helper_1 = require("../helpers/type-helper"); var comparer_helper_1 = require("../helpers/comparer-helper"); -var NotEqualValidationRule = (function () { +var NotEqualValidationRule = /** @class */ (function () { function NotEqualValidationRule() { this.ruleName = "notEqual"; } @@ -30,10 +30,6 @@ var NotEqualValidationRule = (function () { }); }); }; - NotEqualValidationRule.prototype.getMessage = function (modelResolver, propertyName, optionsOrValue) { - var value = modelResolver.resolve(propertyName); - return "This field is " + value + " but should not be equal to " + (optionsOrValue.value || optionsOrValue); - }; return NotEqualValidationRule; }()); exports.NotEqualValidationRule = NotEqualValidationRule; diff --git a/dist/commonjs/rules/number-validation-rule.js b/dist/commonjs/rules/number-validation-rule.js index 9d9706e..38d1679 100644 --- a/dist/commonjs/rules/number-validation-rule.js +++ b/dist/commonjs/rules/number-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var NumberValidationRule = (function () { +var NumberValidationRule = /** @class */ (function () { function NumberValidationRule() { this.ruleName = "number"; this.numberRegex = /^\d+$/; @@ -18,10 +18,6 @@ var NumberValidationRule = (function () { }); }); }; - NumberValidationRule.prototype.getMessage = function (modelResolver, propertyName) { - var value = modelResolver.resolve(propertyName); - return "This field contains " + value + " which is not a numeric value"; - }; return NumberValidationRule; }()); exports.NumberValidationRule = NumberValidationRule; diff --git a/dist/commonjs/rules/regex-validation-rule.js b/dist/commonjs/rules/regex-validation-rule.js index 6448aa3..de0f70a 100644 --- a/dist/commonjs/rules/regex-validation-rule.js +++ b/dist/commonjs/rules/regex-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var RegexValidationRule = (function () { +var RegexValidationRule = /** @class */ (function () { function RegexValidationRule() { this.ruleName = "regex"; } @@ -17,9 +17,6 @@ var RegexValidationRule = (function () { }); }); }; - RegexValidationRule.prototype.getMessage = function (modelResolver, propertyName, regexPattern) { - return "This field does not match the expected format"; - }; return RegexValidationRule; }()); exports.RegexValidationRule = RegexValidationRule; diff --git a/dist/commonjs/rules/required-validation-rule.js b/dist/commonjs/rules/required-validation-rule.js index 73c329a..f81d155 100644 --- a/dist/commonjs/rules/required-validation-rule.js +++ b/dist/commonjs/rules/required-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var RequiredValidationRule = (function () { +var RequiredValidationRule = /** @class */ (function () { function RequiredValidationRule() { this.ruleName = "required"; } @@ -30,9 +30,6 @@ var RequiredValidationRule = (function () { }); }); }; - RequiredValidationRule.prototype.getMessage = function (modelResolver, propertyName, isRequired) { - return "This field is required"; - }; return RequiredValidationRule; }()); exports.RequiredValidationRule = RequiredValidationRule; diff --git a/dist/commonjs/rules/rule-registry.js b/dist/commonjs/rules/rule-registry.js index df7233e..b7a2b4a 100644 --- a/dist/commonjs/rules/rule-registry.js +++ b/dist/commonjs/rules/rule-registry.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var RuleRegistry = (function () { +var RuleRegistry = /** @class */ (function () { function RuleRegistry() { var _this = this; this.rules = {}; diff --git a/dist/commonjs/rules/step-validation-rule.js b/dist/commonjs/rules/step-validation-rule.js index 73cb7e6..5f419db 100644 --- a/dist/commonjs/rules/step-validation-rule.js +++ b/dist/commonjs/rules/step-validation-rule.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); -var StepValidationRule = (function () { +var StepValidationRule = /** @class */ (function () { function StepValidationRule() { this.ruleName = "step"; } @@ -18,10 +18,6 @@ var StepValidationRule = (function () { }); }); }; - StepValidationRule.prototype.getMessage = function (modelResolver, propertyName, step) { - var value = modelResolver.resolve(propertyName); - return "This field has a value of " + value + " and should be an increment of " + step; - }; return StepValidationRule; }()); exports.StepValidationRule = StepValidationRule; diff --git a/dist/commonjs/rulesets/for-each-rule.js b/dist/commonjs/rulesets/for-each-rule.js index 08525f9..061931e 100644 --- a/dist/commonjs/rulesets/for-each-rule.js +++ b/dist/commonjs/rulesets/for-each-rule.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var ForEachRule = (function () { +var ForEachRule = /** @class */ (function () { function ForEachRule(internalRule) { this.internalRule = internalRule; this.isForEach = true; diff --git a/dist/commonjs/rulesets/rule-link.js b/dist/commonjs/rulesets/rule-link.js index 9c8ac86..33220d9 100644 --- a/dist/commonjs/rulesets/rule-link.js +++ b/dist/commonjs/rulesets/rule-link.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var RuleLink = (function () { +var RuleLink = /** @class */ (function () { function RuleLink(ruleName, ruleOptions) { this.ruleName = ruleName; this.ruleOptions = ruleOptions; diff --git a/dist/commonjs/rulesets/rule-resolver.js b/dist/commonjs/rulesets/rule-resolver.js index 25eb2e6..0b718b6 100644 --- a/dist/commonjs/rulesets/rule-resolver.js +++ b/dist/commonjs/rulesets/rule-resolver.js @@ -1,7 +1,7 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var property_resolver_1 = require("property-resolver"); -var RuleResolver = (function () { +var RuleResolver = /** @class */ (function () { function RuleResolver(propertyResolver) { if (propertyResolver === void 0) { propertyResolver = new property_resolver_1.PropertyResolver(); } var _this = this; diff --git a/dist/commonjs/rulesets/ruleset.js b/dist/commonjs/rulesets/ruleset.js index e777a60..eb9f636 100644 --- a/dist/commonjs/rulesets/ruleset.js +++ b/dist/commonjs/rulesets/ruleset.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var Ruleset = (function () { +var Ruleset = /** @class */ (function () { function Ruleset() { var _this = this; this.rules = {}; diff --git a/dist/commonjs/validation-groups/reactive-validation-group.js b/dist/commonjs/validation-groups/reactive-validation-group.js index 5622ef2..78a36eb 100644 --- a/dist/commonjs/validation-groups/reactive-validation-group.js +++ b/dist/commonjs/validation-groups/reactive-validation-group.js @@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var rule_resolver_1 = require("../rulesets/rule-resolver"); var validation_group_1 = require("./validation-group"); -var ReactiveValidationGroup = (function (_super) { +var ReactiveValidationGroup = /** @class */ (function (_super) { tslib_1.__extends(ReactiveValidationGroup, _super); - function ReactiveValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, modelWatcherFactory, model, ruleset, refreshRate) { + function ReactiveValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, modelWatcherFactory, localeHandler, model, ruleset, refreshRate) { if (ruleResolver === void 0) { ruleResolver = new rule_resolver_1.RuleResolver(); } if (refreshRate === void 0) { refreshRate = 500; } - var _this = _super.call(this, fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset) || this; + var _this = _super.call(this, fieldErrorProcessor, ruleResolver, modelResolverFactory, localeHandler, model, ruleset) || this; _this.modelWatcherFactory = modelWatcherFactory; + _this.localeHandler = localeHandler; _this.refreshRate = refreshRate; _this.onModelChanged = function (eventArgs) { _this.startValidateProperty(eventArgs.propertyPath); diff --git a/dist/commonjs/validation-groups/validation-group.js b/dist/commonjs/validation-groups/validation-group.js index 7fabce7..28e73be 100644 --- a/dist/commonjs/validation-groups/validation-group.js +++ b/dist/commonjs/validation-groups/validation-group.js @@ -7,14 +7,15 @@ var promise_counter_1 = require("../promises/promise-counter"); var property_state_changed_event_1 = require("../events/property-state-changed-event"); var model_state_changed_event_1 = require("../events/model-state-changed-event"); var event_js_1 = require("event-js"); -// TODO: This class could be simplified -var ValidationGroup = (function () { - function ValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset) { +// TODO: This class should be simplified further if possible +var ValidationGroup = /** @class */ (function () { + function ValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, localeHandler, model, ruleset) { if (ruleResolver === void 0) { ruleResolver = new rule_resolver_1.RuleResolver(); } var _this = this; this.fieldErrorProcessor = fieldErrorProcessor; this.ruleResolver = ruleResolver; this.modelResolverFactory = modelResolverFactory; + this.localeHandler = localeHandler; this.ruleset = ruleset; this.propertyErrors = {}; this.validatePropertyWithRuleLinks = function (propertyName, propertyRules) { return tslib_1.__awaiter(_this, void 0, void 0, function () { @@ -106,7 +107,7 @@ var ValidationGroup = (function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: - if (!(this.ruleset.compositeRules !== {})) return [3 /*break*/, 2]; + if (!(Object.keys(this.ruleset.compositeRules).length > 0)) return [3 /*break*/, 2]; return [4 /*yield*/, this.validateCompositeRules()]; case 1: _a.sent(); @@ -145,7 +146,9 @@ var ValidationGroup = (function () { return [2 /*return*/]; } previousError = this.propertyErrors[compositeRule.virtualPropertyName]; - currentError = compositeRule.getMessage(this.modelResolver); + return [4 /*yield*/, this.localeHandler.getMessage(compositeRule.virtualPropertyName, compositeRule, this.modelResolver, null)]; + case 2: + currentError = _a.sent(); this.propertyErrors[compositeRule.virtualPropertyName] = currentError; if (currentError != previousError) { eventArgs = new property_state_changed_event_1.PropertyStateChangedEvent(compositeRule.virtualPropertyName, false, currentError); @@ -159,20 +162,54 @@ var ValidationGroup = (function () { }); }); }; this.validateCompositeRules = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { - var propertyName, compositeRule; - return tslib_1.__generator(this, function (_a) { - for (propertyName in this.ruleset.compositeRules) { - compositeRule = this.ruleset.compositeRules[propertyName]; - this.validateCompositeRule(compositeRule); + var _a, _b, _i, propertyName, compositeRule; + return tslib_1.__generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = []; + for (_b in this.ruleset.compositeRules) + _a.push(_b); + _i = 0; + _c.label = 1; + case 1: + if (!(_i < _a.length)) return [3 /*break*/, 4]; + propertyName = _a[_i]; + compositeRule = this.ruleset.compositeRules[propertyName]; + return [4 /*yield*/, this.validateCompositeRule(compositeRule)]; + case 2: + _c.sent(); + _c.label = 3; + case 3: + _i++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; + } + }); + }); }; + this.startValidateModel = function () { return tslib_1.__awaiter(_this, void 0, void 0, function () { + var _a, _b, _i, parameterName; + return tslib_1.__generator(this, function (_c) { + switch (_c.label) { + case 0: + _a = []; + for (_b in this.ruleset.rules) + _a.push(_b); + _i = 0; + _c.label = 1; + case 1: + if (!(_i < _a.length)) return [3 /*break*/, 4]; + parameterName = _a[_i]; + return [4 /*yield*/, this.startValidateProperty(parameterName)]; + case 2: + _c.sent(); + _c.label = 3; + case 3: + _i++; + return [3 /*break*/, 1]; + case 4: return [2 /*return*/]; } - return [2 /*return*/]; }); }); }; - this.startValidateModel = function () { - for (var parameterName in _this.ruleset.rules) { - _this.startValidateProperty(parameterName); - } - }; this.changeValidationTarget = function (model) { _this.modelResolver = _this.modelResolverFactory.createModelResolver(model); }; @@ -227,11 +264,13 @@ var ValidationGroup = (function () { return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: - if (revalidate) { - this.startValidateProperty(propertyRoute); - } - return [4 /*yield*/, this.promiseCounter.waitForCompletion()]; + if (!revalidate) return [3 /*break*/, 2]; + return [4 /*yield*/, this.startValidateProperty(propertyRoute)]; case 1: + _a.sent(); + _a.label = 2; + case 2: return [4 /*yield*/, this.promiseCounter.waitForCompletion()]; + case 3: _a.sent(); return [2 /*return*/, this.propertyErrors[propertyRoute]]; } diff --git a/dist/commonjs/watcher/model-watcher.js b/dist/commonjs/watcher/model-watcher.js index 555c604..de9ded8 100644 --- a/dist/commonjs/watcher/model-watcher.js +++ b/dist/commonjs/watcher/model-watcher.js @@ -5,7 +5,7 @@ var event_js_1 = require("event-js"); var type_helper_1 = require("../helpers/type-helper"); var property_watcher_1 = require("./property-watcher"); var property_changed_event_1 = require("../events/property-changed-event"); -var ModelWatcher = (function () { +var ModelWatcher = /** @class */ (function () { function ModelWatcher(propertyResolver) { if (propertyResolver === void 0) { propertyResolver = new property_resolver_1.PropertyResolver(); } var _this = this; diff --git a/dist/commonjs/watcher/property-watcher.js b/dist/commonjs/watcher/property-watcher.js index 45e39b9..1869930 100644 --- a/dist/commonjs/watcher/property-watcher.js +++ b/dist/commonjs/watcher/property-watcher.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -var PropertyWatcher = (function () { +var PropertyWatcher = /** @class */ (function () { function PropertyWatcher(propertyPath, previousValue) { this.propertyPath = propertyPath; this.previousValue = previousValue; diff --git a/dist/definitions/builders/reactive-validation-group-builder.d.ts b/dist/definitions/builders/reactive-validation-group-builder.d.ts index 8efa672..b175082 100644 --- a/dist/definitions/builders/reactive-validation-group-builder.d.ts +++ b/dist/definitions/builders/reactive-validation-group-builder.d.ts @@ -4,14 +4,16 @@ import { RuleResolver } from "../rulesets/rule-resolver"; import { IReactiveValidationGroup } from "../validation-groups/ireactive-validation-group"; import { IModelResolverFactory } from "../factories/imodel-resolver-factory"; import { IModelWatcherFactory } from "../factories/imodel-watcher-factory"; +import { ILocaleHandler } from "../localization/ilocale-handler"; export declare class ReactiveValidationGroupBuilder { private fieldErrorProcessor; private ruleResolver; + private localeHandler; private refreshRate; private validateOnStart; private modelWatcherFactory; private modelResolverFactory; - constructor(fieldErrorProcessor: FieldErrorProcessor, ruleResolver: RuleResolver); + constructor(fieldErrorProcessor: FieldErrorProcessor, ruleResolver: RuleResolver, localeHandler: ILocaleHandler); create: () => ReactiveValidationGroupBuilder; withRefreshRate: (refreshRate: number) => ReactiveValidationGroupBuilder; withModelResolverFactory: (modelResolverFactory: IModelResolverFactory) => ReactiveValidationGroupBuilder; diff --git a/dist/definitions/builders/ruleset-builder.d.ts b/dist/definitions/builders/ruleset-builder.d.ts index 66d7f5a..fab3f87 100644 --- a/dist/definitions/builders/ruleset-builder.d.ts +++ b/dist/definitions/builders/ruleset-builder.d.ts @@ -17,7 +17,7 @@ export declare class RulesetBuilder { addRule: (rule: string, ruleOptions?: any) => RulesetBuilder; addCompositeRule: (compositeRule: ICompositeValidationRule) => RulesetBuilder; withDisplayName: (displayName: string) => RulesetBuilder; - addDynamicRule: (virtualPropertyName: string, validate: (modelResolver: IModelResolver) => Promise, getMessage: string | ((modelResolver: IModelResolver) => string)) => this; + addDynamicRule: (virtualPropertyName: string, validate: (modelResolver: IModelResolver) => Promise) => this; withMessage: (messageOverride: string | ((value: any, ruleOptions?: any) => string)) => RulesetBuilder; appliesIf: (appliesFunction: boolean | ((modelResolver: IModelResolver, value: any, ruleOptions?: any) => boolean)) => RulesetBuilder; addRuleForEach: (rule: string, ruleOptions?: any) => RulesetBuilder; diff --git a/dist/definitions/builders/validation-group-builder.d.ts b/dist/definitions/builders/validation-group-builder.d.ts index caaaff6..4987363 100644 --- a/dist/definitions/builders/validation-group-builder.d.ts +++ b/dist/definitions/builders/validation-group-builder.d.ts @@ -4,12 +4,14 @@ import { RuleResolver } from "../rulesets/rule-resolver"; import { IValidationGroup } from "../validation-groups/ivalidation-group"; import { ReactiveValidationGroupBuilder } from "./reactive-validation-group-builder"; import { IModelResolverFactory } from "../factories/imodel-resolver-factory"; +import { ILocaleHandler } from "../localization/ilocale-handler"; export declare class ValidationGroupBuilder { private fieldErrorProcessor; private ruleResolver; + private localeHandler; private modelResolverFactory; private validateOnStart; - constructor(fieldErrorProcessor: FieldErrorProcessor, ruleResolver: RuleResolver); + constructor(fieldErrorProcessor: FieldErrorProcessor, ruleResolver: RuleResolver, localeHandler: ILocaleHandler); create: () => ValidationGroupBuilder; asReactiveGroup: () => ReactiveValidationGroupBuilder; withModelResolverFactory: (modelResolverFactory: IModelResolverFactory) => ValidationGroupBuilder; diff --git a/dist/definitions/exposer.d.ts b/dist/definitions/exposer.d.ts index a98244c..0b5260a 100644 --- a/dist/definitions/exposer.d.ts +++ b/dist/definitions/exposer.d.ts @@ -1,4 +1,7 @@ import { ValidationGroupBuilder } from "./builders/validation-group-builder"; import { RulesetBuilder } from "./builders/ruleset-builder"; +import { ILocaleHandler } from "./localization/ilocale-handler"; export declare function createRuleset(withRuleVerification?: boolean): RulesetBuilder; export declare function createGroup(): ValidationGroupBuilder; +export declare const localeHandler: ILocaleHandler; +export declare function supplementLocale(localeCode: string, localeResource: any): void; diff --git a/dist/definitions/index.d.ts b/dist/definitions/index.d.ts index 2b09ab7..40c67c1 100644 --- a/dist/definitions/index.d.ts +++ b/dist/definitions/index.d.ts @@ -3,28 +3,27 @@ export * from "./rule-registry-setup"; export * from "./builders/reactive-validation-group-builder"; export * from "./builders/ruleset-builder"; export * from "./builders/validation-group-builder"; +export * from "./events/model-state-changed-event"; +export * from "./events/property-changed-event"; +export * from "./events/property-state-changed-event"; export * from "./factories/imodel-resolver-factory"; export * from "./factories/imodel-watcher-factory"; export * from "./factories/model-resolver-factory"; export * from "./factories/model-watcher-factory"; -export * from "./events/model-state-changed-event"; -export * from "./events/property-changed-event"; -export * from "./events/property-state-changed-event"; export * from "./helpers/comparer-helper"; export * from "./helpers/type-helper"; +export * from "./locales/en-us"; +export * from "./localization/default-locale-handler"; +export * from "./localization/ilocale-handler"; +export * from "./localization/locale-string"; export * from "./processors/field-error-processor"; export * from "./processors/field-has-error"; export * from "./processors/ifield-error-processor"; export * from "./processors/validation-error"; +export * from "./promises/promise-counter"; export * from "./resolvers/imodel-resolver"; export * from "./resolvers/iproperty-resolver"; export * from "./resolvers/model-resolver"; -export * from "./promises/promise-counter"; -export * from "./rulesets/for-each-rule"; -export * from "./rulesets/irule-resolver"; -export * from "./rulesets/rule-link"; -export * from "./rulesets/rule-resolver"; -export * from "./rulesets/ruleset"; export * from "./rules/advanced-regex-rule"; export * from "./rules/date-validation-rule"; export * from "./rules/decimal-validation-rule"; @@ -43,12 +42,17 @@ export * from "./rules/regex-validation-rule"; export * from "./rules/required-validation-rule"; export * from "./rules/rule-registry"; export * from "./rules/step-validation-rule"; -export * from "./watcher/imodel-watcher"; -export * from "./watcher/model-watcher"; -export * from "./watcher/property-watcher"; +export * from "./rulesets/for-each-rule"; +export * from "./rulesets/irule-resolver"; +export * from "./rulesets/rule-link"; +export * from "./rulesets/rule-resolver"; +export * from "./rulesets/ruleset"; export * from "./validation-groups/ireactive-validation-group"; export * from "./validation-groups/ivalidation-group"; export * from "./validation-groups/reactive-validation-group"; export * from "./validation-groups/validation-group"; +export * from "./watcher/imodel-watcher"; +export * from "./watcher/model-watcher"; +export * from "./watcher/property-watcher"; export * from "./rules/composite/dynamic-composite-validation-rule"; export * from "./rules/composite/icomposite-validation-rule"; diff --git a/dist/definitions/locales/en-us.d.ts b/dist/definitions/locales/en-us.d.ts new file mode 100644 index 0000000..d6744c1 --- /dev/null +++ b/dist/definitions/locales/en-us.d.ts @@ -0,0 +1,18 @@ +import { IModelResolver } from "../resolvers/imodel-resolver"; +export declare const locale: { + "default": string; + "required": string; + "date": (value: any) => string; + "decimal": (value: any) => string; + "equal": (value: any, optionsOrValue: any) => string; + "notEqual": (value: any, optionsOrValue: any) => string; + "isoDate": (value: any) => string; + "maxLength": (value: any, maxLength: number) => string; + "minLength": (value: any, minLength: number) => string; + "maxValue": (value: any, maxValue: number) => string; + "minValue": (value: any, minValue: number) => string; + "number": (value: any) => string; + "regex": string; + "step": (value: any, step: number) => string; + "matches": (modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any) => string; +}; diff --git a/dist/definitions/localization/default-locale-handler.d.ts b/dist/definitions/localization/default-locale-handler.d.ts new file mode 100644 index 0000000..f953fee --- /dev/null +++ b/dist/definitions/localization/default-locale-handler.d.ts @@ -0,0 +1,11 @@ +import { ILocaleHandler } from "./ilocale-handler"; +import { IModelResolver } from "../resolvers/imodel-resolver"; +export declare class DefaultLocaleHandler implements ILocaleHandler { + private localeCode; + private localeResources; + getCurrentLocale: () => string; + registerLocale: (localeCode: string, localeResource: any) => Promise; + useLocale: (localeCode: string) => Promise; + supplementLocaleFrom: (localeCode: string, localeModule: any) => Promise; + getMessage: (ruleName: string, ruleOptions: any, modelResolver: IModelResolver, propertyName: string) => Promise; +} diff --git a/dist/definitions/localization/ilocale-handler.d.ts b/dist/definitions/localization/ilocale-handler.d.ts new file mode 100644 index 0000000..2989ccd --- /dev/null +++ b/dist/definitions/localization/ilocale-handler.d.ts @@ -0,0 +1,7 @@ +import { IModelResolver } from "../resolvers/imodel-resolver"; +export interface ILocaleHandler { + getCurrentLocale(): string; + registerLocale(localeCode: string, localeDataOrOptions: any): Promise; + useLocale(localeCode: string): Promise; + getMessage(ruleName: string, ruleOptions: any, modelResolver: IModelResolver, propertyName: string): Promise; +} diff --git a/dist/definitions/localization/locale-string.d.ts b/dist/definitions/localization/locale-string.d.ts new file mode 100644 index 0000000..4c46a62 --- /dev/null +++ b/dist/definitions/localization/locale-string.d.ts @@ -0,0 +1,4 @@ +import { IModelResolver } from "../resolvers/imodel-resolver"; +export declare type RawLocaleStringGetter = (modelResolver: IModelResolver, propertyName: string, options?: any) => string; +export declare type ProcessedLocaleStringGetter = (propertyValue: any, options?: any) => string; +export declare type LocaleString = string | RawLocaleStringGetter | ProcessedLocaleStringGetter; diff --git a/dist/definitions/processors/field-error-processor.d.ts b/dist/definitions/processors/field-error-processor.d.ts index 39607b4..c7cc9e5 100644 --- a/dist/definitions/processors/field-error-processor.d.ts +++ b/dist/definitions/processors/field-error-processor.d.ts @@ -1,10 +1,12 @@ +import { ILocaleHandler } from '../localization/ilocale-handler'; import { RuleRegistry } from "../rules/rule-registry"; import { RuleLink } from "../rulesets/rule-link"; import { IFieldErrorProcessor } from "./ifield-error-processor"; import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class FieldErrorProcessor implements IFieldErrorProcessor { ruleRegistry: RuleRegistry; - constructor(ruleRegistry: RuleRegistry); + localeHandler: ILocaleHandler; + constructor(ruleRegistry: RuleRegistry, localeHandler: ILocaleHandler); processRuleLink(modelResolver: IModelResolver, propertyName: any, ruleLink: RuleLink): Promise; checkFieldForErrors(modelResolver: IModelResolver, propertyName: any, rules: any): Promise; } diff --git a/dist/definitions/rule-registry-setup.d.ts b/dist/definitions/rule-registry-setup.d.ts index 5b0c1f5..ad8864b 100644 --- a/dist/definitions/rule-registry-setup.d.ts +++ b/dist/definitions/rule-registry-setup.d.ts @@ -1,2 +1,2 @@ import { RuleRegistry } from "./rules/rule-registry"; -export declare var ruleRegistry: RuleRegistry; +export declare let ruleRegistry: RuleRegistry; diff --git a/dist/definitions/rules/advanced-regex-rule.d.ts b/dist/definitions/rules/advanced-regex-rule.d.ts index 2e1e455..59053cc 100644 --- a/dist/definitions/rules/advanced-regex-rule.d.ts +++ b/dist/definitions/rules/advanced-regex-rule.d.ts @@ -4,7 +4,6 @@ export declare class AdvancedRegexValidationRule implements IValidationRule { ruleName: string; expression: string; message: (value: any) => string; - constructor(ruleName: string, expression: string, message: string | ((value: any) => string)); + constructor(ruleName: string, expression: string); validate(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp): string; } diff --git a/dist/definitions/rules/composite/dynamic-composite-validation-rule.d.ts b/dist/definitions/rules/composite/dynamic-composite-validation-rule.d.ts index c116906..46c19d3 100644 --- a/dist/definitions/rules/composite/dynamic-composite-validation-rule.d.ts +++ b/dist/definitions/rules/composite/dynamic-composite-validation-rule.d.ts @@ -1,9 +1,6 @@ import { ICompositeValidationRule } from "./icomposite-validation-rule"; -import { IModelResolver } from "../../resolvers/imodel-resolver"; export declare class DynamicCompositeValidationRule implements ICompositeValidationRule { virtualPropertyName: string; validate: ICompositeValidationRule["validate"]; - private message; - getMessage(modelResolver: IModelResolver): string; - constructor(virtualPropertyName: string, validate: ICompositeValidationRule["validate"], message: ICompositeValidationRule["getMessage"] | string); + constructor(virtualPropertyName: string, validate: ICompositeValidationRule["validate"]); } diff --git a/dist/definitions/rules/composite/icomposite-validation-rule.d.ts b/dist/definitions/rules/composite/icomposite-validation-rule.d.ts index ef6125f..c73386a 100644 --- a/dist/definitions/rules/composite/icomposite-validation-rule.d.ts +++ b/dist/definitions/rules/composite/icomposite-validation-rule.d.ts @@ -2,5 +2,4 @@ import { IModelResolver } from "../../resolvers/imodel-resolver"; export interface ICompositeValidationRule { virtualPropertyName: string; validate(modelResolver: IModelResolver): Promise; - getMessage(modelResolver: IModelResolver): string; } diff --git a/dist/definitions/rules/date-validation-rule.d.ts b/dist/definitions/rules/date-validation-rule.d.ts index 96408fc..a80506b 100644 --- a/dist/definitions/rules/date-validation-rule.d.ts +++ b/dist/definitions/rules/date-validation-rule.d.ts @@ -4,5 +4,4 @@ export declare class DateValidationRule implements IValidationRule { ruleName: string; private invalidObjectRegex; validate(modelResolver: IModelResolver, propertyName: string): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string): string; } diff --git a/dist/definitions/rules/decimal-validation-rule.d.ts b/dist/definitions/rules/decimal-validation-rule.d.ts index 72a681a..ad907dd 100644 --- a/dist/definitions/rules/decimal-validation-rule.d.ts +++ b/dist/definitions/rules/decimal-validation-rule.d.ts @@ -4,5 +4,4 @@ export declare class DecimalValidationRule implements IValidationRule { ruleName: string; private decimalRegex; validate(modelResolver: IModelResolver, propertyName: string): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string): string; } diff --git a/dist/definitions/rules/email-validation-rule.d.ts b/dist/definitions/rules/email-validation-rule.d.ts index 2d7bac0..32df679 100644 --- a/dist/definitions/rules/email-validation-rule.d.ts +++ b/dist/definitions/rules/email-validation-rule.d.ts @@ -4,5 +4,4 @@ export declare class EmailValidationRule implements IValidationRule { ruleName: string; private emailRegex; validate(modelResolver: IModelResolver, propertyName: string): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string): string; } diff --git a/dist/definitions/rules/equal-validation-rule.d.ts b/dist/definitions/rules/equal-validation-rule.d.ts index 4c68243..9047a5b 100644 --- a/dist/definitions/rules/equal-validation-rule.d.ts +++ b/dist/definitions/rules/equal-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class EqualValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any): string; } diff --git a/dist/definitions/rules/iso-date-validation-rule.d.ts b/dist/definitions/rules/iso-date-validation-rule.d.ts index f1c84ba..3426ef0 100644 --- a/dist/definitions/rules/iso-date-validation-rule.d.ts +++ b/dist/definitions/rules/iso-date-validation-rule.d.ts @@ -4,5 +4,4 @@ export declare class ISODateValidationRule implements IValidationRule { ruleName: string; private isoDateRegex; validate(modelResolver: IModelResolver, propertyName: string): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string): string; } diff --git a/dist/definitions/rules/ivalidation-rule.d.ts b/dist/definitions/rules/ivalidation-rule.d.ts index eea9b91..8157705 100644 --- a/dist/definitions/rules/ivalidation-rule.d.ts +++ b/dist/definitions/rules/ivalidation-rule.d.ts @@ -2,5 +2,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export interface IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, options?: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, options?: any): string; } diff --git a/dist/definitions/rules/matches-validation-rule.d.ts b/dist/definitions/rules/matches-validation-rule.d.ts index f44bd0d..81598b5 100644 --- a/dist/definitions/rules/matches-validation-rule.d.ts +++ b/dist/definitions/rules/matches-validation-rule.d.ts @@ -4,5 +4,4 @@ export declare class MatchesValidationRule implements IValidationRule { ruleName: string; constructor(); validate(modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any): string; } diff --git a/dist/definitions/rules/max-length-validation-rule.d.ts b/dist/definitions/rules/max-length-validation-rule.d.ts index 0f68b7c..d901be0 100644 --- a/dist/definitions/rules/max-length-validation-rule.d.ts +++ b/dist/definitions/rules/max-length-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class MaxLengthValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, maxLength: number): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, maxLength: number): string; } diff --git a/dist/definitions/rules/max-value-validation-rule.d.ts b/dist/definitions/rules/max-value-validation-rule.d.ts index af04057..ce5c2e1 100644 --- a/dist/definitions/rules/max-value-validation-rule.d.ts +++ b/dist/definitions/rules/max-value-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class MaxValueValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, maxValue: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, maxValue: any): string; } diff --git a/dist/definitions/rules/min-length-validation-rule.d.ts b/dist/definitions/rules/min-length-validation-rule.d.ts index 9127d28..bba07b0 100644 --- a/dist/definitions/rules/min-length-validation-rule.d.ts +++ b/dist/definitions/rules/min-length-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class MinLengthValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, minLength: number): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, minLength: number): string; } diff --git a/dist/definitions/rules/min-value-validation-rule.d.ts b/dist/definitions/rules/min-value-validation-rule.d.ts index 7e20004..334ffd3 100644 --- a/dist/definitions/rules/min-value-validation-rule.d.ts +++ b/dist/definitions/rules/min-value-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class MinValueValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, minValue: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, minValue: any): string; } diff --git a/dist/definitions/rules/not-equal-validation-rule.d.ts b/dist/definitions/rules/not-equal-validation-rule.d.ts index 5eb5e26..28252c8 100644 --- a/dist/definitions/rules/not-equal-validation-rule.d.ts +++ b/dist/definitions/rules/not-equal-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class NotEqualValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any): string; } diff --git a/dist/definitions/rules/number-validation-rule.d.ts b/dist/definitions/rules/number-validation-rule.d.ts index 0edee43..15bd1ac 100644 --- a/dist/definitions/rules/number-validation-rule.d.ts +++ b/dist/definitions/rules/number-validation-rule.d.ts @@ -4,5 +4,4 @@ export declare class NumberValidationRule implements IValidationRule { ruleName: string; private numberRegex; validate(modelResolver: IModelResolver, propertyName: string): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string): string; } diff --git a/dist/definitions/rules/regex-validation-rule.d.ts b/dist/definitions/rules/regex-validation-rule.d.ts index 44eb0d0..8314d41 100644 --- a/dist/definitions/rules/regex-validation-rule.d.ts +++ b/dist/definitions/rules/regex-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class RegexValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp): string; } diff --git a/dist/definitions/rules/required-validation-rule.d.ts b/dist/definitions/rules/required-validation-rule.d.ts index 1c958ec..29dabd6 100644 --- a/dist/definitions/rules/required-validation-rule.d.ts +++ b/dist/definitions/rules/required-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class RequiredValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, isRequired?: boolean): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, isRequired: boolean): string; } diff --git a/dist/definitions/rules/step-validation-rule.d.ts b/dist/definitions/rules/step-validation-rule.d.ts index f247a0c..c1727d0 100644 --- a/dist/definitions/rules/step-validation-rule.d.ts +++ b/dist/definitions/rules/step-validation-rule.d.ts @@ -3,5 +3,4 @@ import { IModelResolver } from "../resolvers/imodel-resolver"; export declare class StepValidationRule implements IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, step: number): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, step: number): string; } diff --git a/dist/definitions/validation-groups/reactive-validation-group.d.ts b/dist/definitions/validation-groups/reactive-validation-group.d.ts index 34b6180..20e5179 100644 --- a/dist/definitions/validation-groups/reactive-validation-group.d.ts +++ b/dist/definitions/validation-groups/reactive-validation-group.d.ts @@ -6,11 +6,13 @@ import { IReactiveValidationGroup } from "./ireactive-validation-group"; import { ValidationGroup } from "./validation-group"; import { IModelResolverFactory } from "../factories/imodel-resolver-factory"; import { IModelWatcherFactory } from "../factories/imodel-watcher-factory"; +import { ILocaleHandler } from "../localization/ilocale-handler"; export declare class ReactiveValidationGroup extends ValidationGroup implements IReactiveValidationGroup { private modelWatcherFactory; + protected localeHandler: ILocaleHandler; private refreshRate; modelWatcher: IModelWatcher; - constructor(fieldErrorProcessor: IFieldErrorProcessor, ruleResolver: IRuleResolver, modelResolverFactory: IModelResolverFactory, modelWatcherFactory: IModelWatcherFactory, model: any, ruleset: Ruleset, refreshRate?: number); + constructor(fieldErrorProcessor: IFieldErrorProcessor, ruleResolver: IRuleResolver, modelResolverFactory: IModelResolverFactory, modelWatcherFactory: IModelWatcherFactory, localeHandler: ILocaleHandler, model: any, ruleset: Ruleset, refreshRate?: number); private onModelChanged; release: () => void; } diff --git a/dist/definitions/validation-groups/validation-group.d.ts b/dist/definitions/validation-groups/validation-group.d.ts index 7911ab5..163e3ff 100644 --- a/dist/definitions/validation-groups/validation-group.d.ts +++ b/dist/definitions/validation-groups/validation-group.d.ts @@ -8,17 +8,19 @@ import { PromiseCounter } from "../promises/promise-counter"; import { IModelResolverFactory } from "../factories/imodel-resolver-factory"; import { EventHandler } from "event-js"; import { ICompositeValidationRule } from "../rules/composite/icomposite-validation-rule"; +import { ILocaleHandler } from "../localization/ilocale-handler"; export declare class ValidationGroup implements IValidationGroup { protected fieldErrorProcessor: IFieldErrorProcessor; protected ruleResolver: IRuleResolver; protected modelResolverFactory: IModelResolverFactory; + protected localeHandler: ILocaleHandler; protected ruleset: Ruleset; propertyStateChangedEvent: EventHandler; modelStateChangedEvent: EventHandler; protected propertyErrors: any; protected promiseCounter: PromiseCounter; protected modelResolver: IModelResolver; - constructor(fieldErrorProcessor: IFieldErrorProcessor, ruleResolver: IRuleResolver, modelResolverFactory: IModelResolverFactory, model: any, ruleset: Ruleset); + constructor(fieldErrorProcessor: IFieldErrorProcessor, ruleResolver: IRuleResolver, modelResolverFactory: IModelResolverFactory, localeHandler: ILocaleHandler, model: any, ruleset: Ruleset); protected static isRuleset(possibleRuleset: any): boolean; protected static isForEach(possibleForEach: any): boolean; protected validatePropertyWithRuleLinks: (propertyName: string, propertyRules: RuleLink[]) => Promise; @@ -27,7 +29,7 @@ export declare class ValidationGroup implements IValidationGroup { protected startValidateProperty: (propertyRoute: string) => Promise; protected validateCompositeRule: (compositeRule: ICompositeValidationRule) => Promise; protected validateCompositeRules: () => Promise; - protected startValidateModel: () => void; + protected startValidateModel: () => Promise; protected hasErrors(): boolean; changeValidationTarget: (model: any) => void; validateProperty: (propertyRoute: string) => Promise; diff --git a/dist/es6/builders/reactive-validation-group-builder.js b/dist/es2015/builders/reactive-validation-group-builder.js similarity index 81% rename from dist/es6/builders/reactive-validation-group-builder.js rename to dist/es2015/builders/reactive-validation-group-builder.js index 919aea5..93e7eb7 100644 --- a/dist/es6/builders/reactive-validation-group-builder.js +++ b/dist/es2015/builders/reactive-validation-group-builder.js @@ -2,9 +2,10 @@ import { ReactiveValidationGroup } from "../validation-groups/reactive-validatio import { ModelWatcherFactory } from "../factories/model-watcher-factory"; import { ModelResolverFactory } from "../factories/model-resolver-factory"; export class ReactiveValidationGroupBuilder { - constructor(fieldErrorProcessor, ruleResolver) { + constructor(fieldErrorProcessor, ruleResolver, localeHandler) { this.fieldErrorProcessor = fieldErrorProcessor; this.ruleResolver = ruleResolver; + this.localeHandler = localeHandler; this.create = () => { this.refreshRate = 500; this.validateOnStart = false; @@ -29,7 +30,7 @@ export class ReactiveValidationGroupBuilder { return this; }; this.build = (model, ruleset) => { - var validationGroup = new ReactiveValidationGroup(this.fieldErrorProcessor, this.ruleResolver, this.modelResolverFactory, this.modelWatcherFactory, model, ruleset, this.refreshRate); + const validationGroup = new ReactiveValidationGroup(this.fieldErrorProcessor, this.ruleResolver, this.modelResolverFactory, this.modelWatcherFactory, this.localeHandler, model, ruleset, this.refreshRate); if (this.validateOnStart) { validationGroup.validate(); } diff --git a/dist/es6/builders/ruleset-builder.js b/dist/es2015/builders/ruleset-builder.js similarity index 91% rename from dist/es6/builders/ruleset-builder.js rename to dist/es2015/builders/ruleset-builder.js index d0c3212..8cf57d9 100644 --- a/dist/es6/builders/ruleset-builder.js +++ b/dist/es2015/builders/ruleset-builder.js @@ -51,8 +51,8 @@ export class RulesetBuilder { this.internalRuleset.propertyDisplayNames[this.currentProperty] = displayName; return this; }; - this.addDynamicRule = (virtualPropertyName, validate, getMessage) => { - let compositeRule = new DynamicCompositeValidationRule(virtualPropertyName, validate, getMessage); + this.addDynamicRule = (virtualPropertyName, validate) => { + const compositeRule = new DynamicCompositeValidationRule(virtualPropertyName, validate); this.internalRuleset.compositeRules[virtualPropertyName] = compositeRule; return this; }; @@ -69,7 +69,7 @@ export class RulesetBuilder { this.addRuleForEach = (rule, ruleOptions) => { this.verifyRuleNameIsValid(rule); this.verifyExistingProperty(); - let ruleLink = new RuleLink(rule, ruleOptions); + const ruleLink = new RuleLink(rule, ruleOptions); this.currentRule = ruleLink; this.internalRuleset.addRule(this.currentProperty, new ForEachRule(ruleLink)); return this; @@ -89,8 +89,8 @@ export class RulesetBuilder { }; } extractPropertyName(predicate) { - let regex = /.*\.([\w]*);/; - let predicateString = predicate.toString(); + const regex = /.*\.([\w]*);/; + const predicateString = predicate.toString(); return regex.exec(predicateString)[1]; } } diff --git a/dist/es6/builders/validation-group-builder.js b/dist/es2015/builders/validation-group-builder.js similarity index 74% rename from dist/es6/builders/validation-group-builder.js rename to dist/es2015/builders/validation-group-builder.js index 235044c..ee90e7c 100644 --- a/dist/es6/builders/validation-group-builder.js +++ b/dist/es2015/builders/validation-group-builder.js @@ -2,16 +2,17 @@ import { ValidationGroup } from "../validation-groups/validation-group"; import { ReactiveValidationGroupBuilder } from "./reactive-validation-group-builder"; import { ModelResolverFactory } from "../factories/model-resolver-factory"; export class ValidationGroupBuilder { - constructor(fieldErrorProcessor, ruleResolver) { + constructor(fieldErrorProcessor, ruleResolver, localeHandler) { this.fieldErrorProcessor = fieldErrorProcessor; this.ruleResolver = ruleResolver; + this.localeHandler = localeHandler; this.create = () => { this.modelResolverFactory = new ModelResolverFactory(); this.validateOnStart = false; return this; }; this.asReactiveGroup = () => { - var reactiveBuilder = new ReactiveValidationGroupBuilder(this.fieldErrorProcessor, this.ruleResolver) + const reactiveBuilder = new ReactiveValidationGroupBuilder(this.fieldErrorProcessor, this.ruleResolver, this.localeHandler) .create() .withModelResolverFactory(this.modelResolverFactory); return reactiveBuilder; @@ -25,7 +26,7 @@ export class ValidationGroupBuilder { return this; }; this.build = (model, ruleset) => { - var validationGroup = new ValidationGroup(this.fieldErrorProcessor, this.ruleResolver, this.modelResolverFactory, model, ruleset); + const validationGroup = new ValidationGroup(this.fieldErrorProcessor, this.ruleResolver, this.modelResolverFactory, this.localeHandler, model, ruleset); if (this.validateOnStart) { validationGroup.validate(); } diff --git a/dist/es6/events/model-state-changed-event.js b/dist/es2015/events/model-state-changed-event.js similarity index 100% rename from dist/es6/events/model-state-changed-event.js rename to dist/es2015/events/model-state-changed-event.js diff --git a/dist/es6/events/property-changed-event.js b/dist/es2015/events/property-changed-event.js similarity index 100% rename from dist/es6/events/property-changed-event.js rename to dist/es2015/events/property-changed-event.js diff --git a/dist/es6/events/property-state-changed-event.js b/dist/es2015/events/property-state-changed-event.js similarity index 100% rename from dist/es6/events/property-state-changed-event.js rename to dist/es2015/events/property-state-changed-event.js diff --git a/dist/es2015/exposer.js b/dist/es2015/exposer.js new file mode 100644 index 0000000..2989930 --- /dev/null +++ b/dist/es2015/exposer.js @@ -0,0 +1,22 @@ +import { FieldErrorProcessor } from "./processors/field-error-processor"; +import { RuleResolver } from "./rulesets/rule-resolver"; +import { ValidationGroupBuilder } from "./builders/validation-group-builder"; +import { ruleRegistry } from "./rule-registry-setup"; +import { RulesetBuilder } from "./builders/ruleset-builder"; +import { DefaultLocaleHandler } from "./localization/default-locale-handler"; +import { locale as defaultLocale } from "./locales/en-us"; +const defaultLocaleCode = "en-us"; +const defaultLocaleHandler = new DefaultLocaleHandler(); +defaultLocaleHandler.registerLocale(defaultLocaleCode, defaultLocale); +defaultLocaleHandler.useLocale(defaultLocaleCode); +const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); +const ruleResolver = new RuleResolver(); +export function createRuleset(withRuleVerification = false) { + const rulesetBuilder = withRuleVerification ? new RulesetBuilder(ruleRegistry) : new RulesetBuilder(); + return rulesetBuilder.create(); +} +export function createGroup() { return new ValidationGroupBuilder(fieldErrorProcessor, ruleResolver, defaultLocaleHandler).create(); } +export const localeHandler = defaultLocaleHandler; +export function supplementLocale(localeCode, localeResource) { + defaultLocaleHandler.supplementLocaleFrom(localeCode, localeResource); +} diff --git a/dist/es6/factories/imodel-resolver-factory.js b/dist/es2015/factories/imodel-resolver-factory.js similarity index 100% rename from dist/es6/factories/imodel-resolver-factory.js rename to dist/es2015/factories/imodel-resolver-factory.js diff --git a/dist/es6/factories/imodel-watcher-factory.js b/dist/es2015/factories/imodel-watcher-factory.js similarity index 100% rename from dist/es6/factories/imodel-watcher-factory.js rename to dist/es2015/factories/imodel-watcher-factory.js diff --git a/dist/es6/factories/model-resolver-factory.js b/dist/es2015/factories/model-resolver-factory.js similarity index 100% rename from dist/es6/factories/model-resolver-factory.js rename to dist/es2015/factories/model-resolver-factory.js diff --git a/dist/es6/factories/model-watcher-factory.js b/dist/es2015/factories/model-watcher-factory.js similarity index 100% rename from dist/es6/factories/model-watcher-factory.js rename to dist/es2015/factories/model-watcher-factory.js diff --git a/dist/es6/helpers/comparer-helper.js b/dist/es2015/helpers/comparer-helper.js similarity index 100% rename from dist/es6/helpers/comparer-helper.js rename to dist/es2015/helpers/comparer-helper.js diff --git a/dist/es6/helpers/type-helper.js b/dist/es2015/helpers/type-helper.js similarity index 100% rename from dist/es6/helpers/type-helper.js rename to dist/es2015/helpers/type-helper.js diff --git a/dist/es6/index.js b/dist/es2015/index.js similarity index 95% rename from dist/es6/index.js rename to dist/es2015/index.js index 10ed890..d0c216c 100644 --- a/dist/es6/index.js +++ b/dist/es2015/index.js @@ -3,22 +3,20 @@ export * from "./rule-registry-setup"; export * from "./builders/reactive-validation-group-builder"; export * from "./builders/ruleset-builder"; export * from "./builders/validation-group-builder"; -export * from "./factories/model-resolver-factory"; -export * from "./factories/model-watcher-factory"; export * from "./events/model-state-changed-event"; export * from "./events/property-changed-event"; export * from "./events/property-state-changed-event"; +export * from "./factories/model-resolver-factory"; +export * from "./factories/model-watcher-factory"; export * from "./helpers/comparer-helper"; export * from "./helpers/type-helper"; +export * from "./locales/en-us"; +export * from "./localization/default-locale-handler"; export * from "./processors/field-error-processor"; export * from "./processors/field-has-error"; export * from "./processors/validation-error"; -export * from "./resolvers/model-resolver"; export * from "./promises/promise-counter"; -export * from "./rulesets/for-each-rule"; -export * from "./rulesets/rule-link"; -export * from "./rulesets/rule-resolver"; -export * from "./rulesets/ruleset"; +export * from "./resolvers/model-resolver"; export * from "./rules/advanced-regex-rule"; export * from "./rules/date-validation-rule"; export * from "./rules/decimal-validation-rule"; @@ -36,8 +34,12 @@ export * from "./rules/regex-validation-rule"; export * from "./rules/required-validation-rule"; export * from "./rules/rule-registry"; export * from "./rules/step-validation-rule"; -export * from "./watcher/model-watcher"; -export * from "./watcher/property-watcher"; +export * from "./rulesets/for-each-rule"; +export * from "./rulesets/rule-link"; +export * from "./rulesets/rule-resolver"; +export * from "./rulesets/ruleset"; export * from "./validation-groups/reactive-validation-group"; export * from "./validation-groups/validation-group"; +export * from "./watcher/model-watcher"; +export * from "./watcher/property-watcher"; export * from "./rules/composite/dynamic-composite-validation-rule"; diff --git a/dist/es2015/locales/en-us.js b/dist/es2015/locales/en-us.js new file mode 100644 index 0000000..fcd3756 --- /dev/null +++ b/dist/es2015/locales/en-us.js @@ -0,0 +1,22 @@ +export const locale = { + "default": "This field is invalid", + "required": "This field is required", + "date": (value) => `This field contains "${value}" which is not a valid date`, + "decimal": (value) => `This field contains ${value} which is not a decimal value`, + "equal": (value, optionsOrValue) => `This field is ${value} but should be equal to ${optionsOrValue.value || optionsOrValue}`, + "notEqual": (value, optionsOrValue) => `This field is ${value} but should not be equal to ${optionsOrValue.value || optionsOrValue}`, + "isoDate": (value) => `This field contains "${value}" which is not a valid ISO date`, + "maxLength": (value, maxLength) => `This field has a length of ${value.length} but should contain no more than ${maxLength}`, + "minLength": (value, minLength) => `This field has a length of ${value.length} but should more than ${minLength}`, + "maxValue": (value, maxValue) => `This field has a value of ${value} but should be less than or equal to ${maxValue}`, + "minValue": (value, minValue) => `This field has a value of ${value} but should be greater than or equal to ${minValue}`, + "number": (value) => `This field contains ${value} which is not a numeric value`, + "regex": "This field does not match the expected format", + "step": (value, step) => `This field has a value of ${value} and should be an increment of ${step}`, + "matches": (modelResolver, propertyName, optionsOrProperty) => { + const value = modelResolver.resolve(propertyName); + const fieldToMatch = optionsOrProperty.property || optionsOrProperty; + const matchingFieldValue = modelResolver.resolve(fieldToMatch); + return `This field is ${value} but should match ${matchingFieldValue}`; + }, +}; diff --git a/dist/es2015/localization/default-locale-handler.js b/dist/es2015/localization/default-locale-handler.js new file mode 100644 index 0000000..acfd178 --- /dev/null +++ b/dist/es2015/localization/default-locale-handler.js @@ -0,0 +1,37 @@ +import * as tslib_1 from "tslib"; +export class DefaultLocaleHandler { + constructor() { + this.localeResources = {}; + this.getCurrentLocale = () => { return this.localeCode; }; + this.registerLocale = (localeCode, localeResource) => tslib_1.__awaiter(this, void 0, void 0, function* () { + this.localeCode = localeCode; + this.localeResources[this.localeCode] = localeResource; + }); + this.useLocale = (localeCode) => tslib_1.__awaiter(this, void 0, void 0, function* () { + if (!this.localeResources[localeCode]) { + throw `Unable to find registered locale for [${localeCode}]`; + } + this.localeCode = localeCode; + }); + this.supplementLocaleFrom = (localeCode, localeModule) => tslib_1.__awaiter(this, void 0, void 0, function* () { + if (!this.localeResources[localeCode]) { + this.localeResources[localeCode] = {}; + } + for (const propertyName in localeModule) { + this.localeResources[localeCode][propertyName] = localeModule[propertyName]; + } + }); + this.getMessage = (ruleName, ruleOptions, modelResolver, propertyName) => tslib_1.__awaiter(this, void 0, void 0, function* () { + const currentLocale = this.localeResources[this.localeCode]; + const ruleResource = currentLocale[ruleName] || currentLocale["default"] || `Cannot find rule for ${ruleName}`; + if (typeof ruleResource === "string") { + return ruleResource; + } + if (ruleResource.length === 3 || propertyName == null) { + return ruleResource(modelResolver, propertyName, ruleOptions); + } + const propertyValue = modelResolver.resolve(propertyName); + return ruleResource(propertyValue, ruleOptions); + }); + } +} diff --git a/dist/es6/processors/ifield-error-processor.js b/dist/es2015/localization/ilocale-handler.js similarity index 100% rename from dist/es6/processors/ifield-error-processor.js rename to dist/es2015/localization/ilocale-handler.js diff --git a/dist/es6/resolvers/imodel-resolver.js b/dist/es2015/localization/locale-string.js similarity index 100% rename from dist/es6/resolvers/imodel-resolver.js rename to dist/es2015/localization/locale-string.js diff --git a/dist/es2015/processors/field-error-processor.js b/dist/es2015/processors/field-error-processor.js new file mode 100644 index 0000000..cbc5402 --- /dev/null +++ b/dist/es2015/processors/field-error-processor.js @@ -0,0 +1,58 @@ +import * as tslib_1 from "tslib"; +import { FieldHasError } from "./field-has-error"; +export class FieldErrorProcessor { + constructor(ruleRegistry, localeHandler) { + this.ruleRegistry = ruleRegistry; + this.localeHandler = localeHandler; + } + processRuleLink(modelResolver, propertyName, ruleLink) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const shouldRuleApply = ruleLink.appliesIf === true + || ((typeof (ruleLink.appliesIf) === "function") + ? (ruleLink.appliesIf)(modelResolver, propertyName, ruleLink.ruleOptions) + : false); + if (!shouldRuleApply) { + return; + } + const validator = this.ruleRegistry.getRuleNamed(ruleLink.ruleName); + const options = (typeof ruleLink.ruleOptions == "function") ? ruleLink.ruleOptions() : ruleLink.ruleOptions; + const isValid = yield validator.validate(modelResolver, propertyName, options); + if (isValid) { + return; + } + let error; + if (ruleLink.messageOverride) { + if (typeof (ruleLink.messageOverride) === "function") { + error = (ruleLink.messageOverride)(modelResolver, propertyName, ruleLink.ruleOptions); + } + else { + error = ruleLink.messageOverride; + } + } + else { + error = yield this.localeHandler.getMessage(ruleLink.ruleName, ruleLink.ruleOptions, modelResolver, propertyName); + } + throw new FieldHasError(error); + }); + } + checkFieldForErrors(modelResolver, propertyName, rules) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const ruleCheck = (ruleLinkOrSet) => { + return this.processRuleLink(modelResolver, propertyName, ruleLinkOrSet); + }; + const checkEachRule = (rules) => { + const promises = []; + rules.forEach((rule) => { + promises.push(ruleCheck(rule)); + }); + return Promise.all(promises); + }; + return Promise.resolve(rules) + .then(checkEachRule) + .then(function () { return null; }) + .catch((validationError) => { + return validationError.message; + }); + }); + } +} diff --git a/dist/es6/processors/field-has-error.js b/dist/es2015/processors/field-has-error.js similarity index 100% rename from dist/es6/processors/field-has-error.js rename to dist/es2015/processors/field-has-error.js diff --git a/dist/es6/resolvers/iproperty-resolver.js b/dist/es2015/processors/ifield-error-processor.js similarity index 100% rename from dist/es6/resolvers/iproperty-resolver.js rename to dist/es2015/processors/ifield-error-processor.js diff --git a/dist/es6/processors/validation-error.js b/dist/es2015/processors/validation-error.js similarity index 100% rename from dist/es6/processors/validation-error.js rename to dist/es2015/processors/validation-error.js diff --git a/dist/es6/promises/promise-counter.js b/dist/es2015/promises/promise-counter.js similarity index 74% rename from dist/es6/promises/promise-counter.js rename to dist/es2015/promises/promise-counter.js index a114d01..b51767c 100644 --- a/dist/es6/promises/promise-counter.js +++ b/dist/es2015/promises/promise-counter.js @@ -1,17 +1,18 @@ +import * as tslib_1 from "tslib"; export class PromiseCounter { constructor() { this.promiseCallbacks = []; this.validationCounter = 0; - this.waitForCompletion = async () => { + this.waitForCompletion = () => tslib_1.__awaiter(this, void 0, void 0, function* () { if (!this.validationCounter) { return; } - let resolver = (resolve) => { + const resolver = (resolve) => { this.promiseCallbacks.push(() => resolve()); }; return new Promise(resolver); - }; - this.countPromise = async (promise) => { + }); + this.countPromise = (promise) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (!promise) { return; } @@ -19,10 +20,10 @@ export class PromiseCounter { throw new Error("Non-Promise pass in: " + promise); } this.incrementCounter(); - let result = await promise; + const result = yield promise; this.decrementCounter(); return result; - }; + }); this.decrementCounter = () => { this.validationCounter--; if (this.validationCounter) { diff --git a/dist/es6/rules/composite/icomposite-validation-rule.js b/dist/es2015/resolvers/imodel-resolver.js similarity index 100% rename from dist/es6/rules/composite/icomposite-validation-rule.js rename to dist/es2015/resolvers/imodel-resolver.js diff --git a/dist/es6/rules/ivalidation-rule.js b/dist/es2015/resolvers/iproperty-resolver.js similarity index 100% rename from dist/es6/rules/ivalidation-rule.js rename to dist/es2015/resolvers/iproperty-resolver.js diff --git a/dist/es6/resolvers/model-resolver.js b/dist/es2015/resolvers/model-resolver.js similarity index 97% rename from dist/es6/resolvers/model-resolver.js rename to dist/es2015/resolvers/model-resolver.js index 2f08189..55ee4cd 100644 --- a/dist/es6/resolvers/model-resolver.js +++ b/dist/es2015/resolvers/model-resolver.js @@ -6,5 +6,4 @@ export class ModelResolver { resolve(propertyName) { return this.propertyResolver.resolveProperty(this.model, propertyName); } - ; } diff --git a/dist/es6/rule-registry-setup.js b/dist/es2015/rule-registry-setup.js similarity index 98% rename from dist/es6/rule-registry-setup.js rename to dist/es2015/rule-registry-setup.js index c1606fd..24d8c7f 100644 --- a/dist/es6/rule-registry-setup.js +++ b/dist/es2015/rule-registry-setup.js @@ -14,7 +14,7 @@ import { RegexValidationRule } from "./rules/regex-validation-rule"; import { RequiredValidationRule } from "./rules/required-validation-rule"; import { StepValidationRule } from "./rules/step-validation-rule"; import { MatchesValidationRule } from "./rules/matches-validation-rule"; -export var ruleRegistry; +export let ruleRegistry; if (!ruleRegistry) { ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new DateValidationRule()); diff --git a/dist/es2015/rules/advanced-regex-rule.js b/dist/es2015/rules/advanced-regex-rule.js new file mode 100644 index 0000000..6eda112 --- /dev/null +++ b/dist/es2015/rules/advanced-regex-rule.js @@ -0,0 +1,22 @@ +import * as tslib_1 from "tslib"; +export class AdvancedRegexValidationRule { + constructor(ruleName, expression) { + if (!ruleName || ruleName.length == 0) { + throw new Error("ruleName is required, an empty rule name is invalid"); + } + if (!expression || expression.length == 0) { + throw new Error("expression is required, an empty regex expression is invalid"); + } + this.ruleName = ruleName; + this.expression = expression; + } + validate(modelResolver, propertyName, regexPattern) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value.length == 0) { + return true; + } + return value.toString().match(this.expression) !== null; + }); + } +} diff --git a/dist/es2015/rules/composite/dynamic-composite-validation-rule.js b/dist/es2015/rules/composite/dynamic-composite-validation-rule.js new file mode 100644 index 0000000..2e879d3 --- /dev/null +++ b/dist/es2015/rules/composite/dynamic-composite-validation-rule.js @@ -0,0 +1,6 @@ +export class DynamicCompositeValidationRule { + constructor(virtualPropertyName, validate) { + this.virtualPropertyName = virtualPropertyName; + this.validate = validate; + } +} diff --git a/dist/es6/rulesets/irule-resolver.js b/dist/es2015/rules/composite/icomposite-validation-rule.js similarity index 100% rename from dist/es6/rulesets/irule-resolver.js rename to dist/es2015/rules/composite/icomposite-validation-rule.js diff --git a/dist/es2015/rules/date-validation-rule.js b/dist/es2015/rules/date-validation-rule.js new file mode 100644 index 0000000..8a2623d --- /dev/null +++ b/dist/es2015/rules/date-validation-rule.js @@ -0,0 +1,16 @@ +import * as tslib_1 from "tslib"; +export class DateValidationRule { + constructor() { + this.ruleName = "date"; + this.invalidObjectRegex = /Invalid|NaN/; + } + validate(modelResolver, propertyName) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return true; + } + return !this.invalidObjectRegex.test(new Date(value)); + }); + } +} diff --git a/dist/es2015/rules/decimal-validation-rule.js b/dist/es2015/rules/decimal-validation-rule.js new file mode 100644 index 0000000..12452b2 --- /dev/null +++ b/dist/es2015/rules/decimal-validation-rule.js @@ -0,0 +1,16 @@ +import * as tslib_1 from "tslib"; +export class DecimalValidationRule { + constructor() { + this.ruleName = "decimal"; + this.decimalRegex = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/; + } + validate(modelResolver, propertyName) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return true; + } + return this.decimalRegex.test(value); + }); + } +} diff --git a/dist/es6/rules/email-validation-rule.js b/dist/es2015/rules/email-validation-rule.js similarity index 69% rename from dist/es6/rules/email-validation-rule.js rename to dist/es2015/rules/email-validation-rule.js index b98effc..c449e5c 100644 --- a/dist/es6/rules/email-validation-rule.js +++ b/dist/es2015/rules/email-validation-rule.js @@ -1,17 +1,16 @@ +import * as tslib_1 from "tslib"; export class EmailValidationRule { constructor() { this.ruleName = "email"; this.emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/; } - async validate(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value === "") { - return true; - } - return this.emailRegex.test(value); - } - getMessage(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - return `This field contains "${value}" which is not a valid email address`; + validate(modelResolver, propertyName) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value === "") { + return true; + } + return this.emailRegex.test(value); + }); } } diff --git a/dist/es2015/rules/equal-validation-rule.js b/dist/es2015/rules/equal-validation-rule.js new file mode 100644 index 0000000..c0bd4f0 --- /dev/null +++ b/dist/es2015/rules/equal-validation-rule.js @@ -0,0 +1,27 @@ +import * as tslib_1 from "tslib"; +import { TypeHelper } from "../helpers/type-helper"; +import { ComparerHelper } from "../helpers/comparer-helper"; +export class EqualValidationRule { + constructor() { + this.ruleName = "equal"; + } + validate(modelResolver, propertyName, optionsOrValue) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return true; + } + let comparison = optionsOrValue.value || optionsOrValue; + const weakEquality = optionsOrValue.weakEquality || false; + if (TypeHelper.isFunctionType(comparison)) { + comparison = comparison(); + } + if (TypeHelper.isDateType(comparison)) { + return ComparerHelper.dateTimeCompararer(value, comparison); + } + else { + return ComparerHelper.simpleTypeComparer(value, comparison, weakEquality); + } + }); + } +} diff --git a/dist/es2015/rules/iso-date-validation-rule.js b/dist/es2015/rules/iso-date-validation-rule.js new file mode 100644 index 0000000..2b6acb2 --- /dev/null +++ b/dist/es2015/rules/iso-date-validation-rule.js @@ -0,0 +1,16 @@ +import * as tslib_1 from "tslib"; +export class ISODateValidationRule { + constructor() { + this.ruleName = "isoDate"; + this.isoDateRegex = /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/; + } + validate(modelResolver, propertyName) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return true; + } + return this.isoDateRegex.test(value); + }); + } +} diff --git a/dist/es6/validation-groups/ireactive-validation-group.js b/dist/es2015/rules/ivalidation-rule.js similarity index 100% rename from dist/es6/validation-groups/ireactive-validation-group.js rename to dist/es2015/rules/ivalidation-rule.js diff --git a/dist/es2015/rules/matches-validation-rule.js b/dist/es2015/rules/matches-validation-rule.js new file mode 100644 index 0000000..2c99c04 --- /dev/null +++ b/dist/es2015/rules/matches-validation-rule.js @@ -0,0 +1,25 @@ +import * as tslib_1 from "tslib"; +import { TypeHelper } from "../helpers/type-helper"; +import { ComparerHelper } from "../helpers/comparer-helper"; +export class MatchesValidationRule { + constructor() { + this.ruleName = "matches"; + } + validate(modelResolver, propertyName, optionsOrProperty) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const fieldToMatch = optionsOrProperty.property || optionsOrProperty; + const weakEquality = optionsOrProperty.weakEquality || false; + const value = modelResolver.resolve(propertyName); + const matchingFieldValue = modelResolver.resolve(fieldToMatch); + if (value === undefined || value === null) { + return (matchingFieldValue === undefined || matchingFieldValue === null); + } + else if (TypeHelper.isDateType(value)) { + return ComparerHelper.dateTimeCompararer(value, matchingFieldValue); + } + else { + return ComparerHelper.simpleTypeComparer(value, matchingFieldValue, weakEquality); + } + }); + } +} diff --git a/dist/es2015/rules/max-length-validation-rule.js b/dist/es2015/rules/max-length-validation-rule.js new file mode 100644 index 0000000..0b1f5d2 --- /dev/null +++ b/dist/es2015/rules/max-length-validation-rule.js @@ -0,0 +1,15 @@ +import * as tslib_1 from "tslib"; +export class MaxLengthValidationRule { + constructor() { + this.ruleName = "maxLength"; + } + validate(modelResolver, propertyName, maxLength) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value.length == 0) { + return true; + } + return value.length <= maxLength; + }); + } +} diff --git a/dist/es2015/rules/max-value-validation-rule.js b/dist/es2015/rules/max-value-validation-rule.js new file mode 100644 index 0000000..ee79b92 --- /dev/null +++ b/dist/es2015/rules/max-value-validation-rule.js @@ -0,0 +1,15 @@ +import * as tslib_1 from "tslib"; +export class MaxValueValidationRule { + constructor() { + this.ruleName = "maxValue"; + } + validate(modelResolver, propertyName, maxValue) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value.length == 0) { + return true; + } + return value <= maxValue; + }); + } +} diff --git a/dist/es2015/rules/min-length-validation-rule.js b/dist/es2015/rules/min-length-validation-rule.js new file mode 100644 index 0000000..cda0c2b --- /dev/null +++ b/dist/es2015/rules/min-length-validation-rule.js @@ -0,0 +1,15 @@ +import * as tslib_1 from "tslib"; +export class MinLengthValidationRule { + constructor() { + this.ruleName = "minLength"; + } + validate(modelResolver, propertyName, minLength) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value.length == 0) { + return true; + } + return value.length >= minLength; + }); + } +} diff --git a/dist/es2015/rules/min-value-validation-rule.js b/dist/es2015/rules/min-value-validation-rule.js new file mode 100644 index 0000000..a3b44aa --- /dev/null +++ b/dist/es2015/rules/min-value-validation-rule.js @@ -0,0 +1,15 @@ +import * as tslib_1 from "tslib"; +export class MinValueValidationRule { + constructor() { + this.ruleName = "minValue"; + } + validate(modelResolver, propertyName, minValue) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value.length == 0) { + return true; + } + return value >= minValue; + }); + } +} diff --git a/dist/es2015/rules/not-equal-validation-rule.js b/dist/es2015/rules/not-equal-validation-rule.js new file mode 100644 index 0000000..74b7e86 --- /dev/null +++ b/dist/es2015/rules/not-equal-validation-rule.js @@ -0,0 +1,27 @@ +import * as tslib_1 from "tslib"; +import { TypeHelper } from "../helpers/type-helper"; +import { ComparerHelper } from "../helpers/comparer-helper"; +export class NotEqualValidationRule { + constructor() { + this.ruleName = "notEqual"; + } + validate(modelResolver, propertyName, optionsOrValue) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return true; + } + let comparison = optionsOrValue.value || optionsOrValue; + const weakEquality = optionsOrValue.weakEquality || false; + if (TypeHelper.isFunctionType(comparison)) { + comparison = comparison(); + } + if (TypeHelper.isDateType(comparison)) { + return !ComparerHelper.dateTimeCompararer(value, comparison); + } + else { + return !ComparerHelper.simpleTypeComparer(value, comparison, weakEquality); + } + }); + } +} diff --git a/dist/es2015/rules/number-validation-rule.js b/dist/es2015/rules/number-validation-rule.js new file mode 100644 index 0000000..b66ada3 --- /dev/null +++ b/dist/es2015/rules/number-validation-rule.js @@ -0,0 +1,16 @@ +import * as tslib_1 from "tslib"; +export class NumberValidationRule { + constructor() { + this.ruleName = "number"; + this.numberRegex = /^\d+$/; + } + validate(modelResolver, propertyName) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return true; + } + return this.numberRegex.test(value); + }); + } +} diff --git a/dist/es2015/rules/regex-validation-rule.js b/dist/es2015/rules/regex-validation-rule.js new file mode 100644 index 0000000..414fa65 --- /dev/null +++ b/dist/es2015/rules/regex-validation-rule.js @@ -0,0 +1,15 @@ +import * as tslib_1 from "tslib"; +export class RegexValidationRule { + constructor() { + this.ruleName = "regex"; + } + validate(modelResolver, propertyName, regexPattern) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null || value.length == 0) { + return true; + } + return value.toString().match(regexPattern) !== null; + }); + } +} diff --git a/dist/es2015/rules/required-validation-rule.js b/dist/es2015/rules/required-validation-rule.js new file mode 100644 index 0000000..ec53a58 --- /dev/null +++ b/dist/es2015/rules/required-validation-rule.js @@ -0,0 +1,27 @@ +import * as tslib_1 from "tslib"; +export class RequiredValidationRule { + constructor() { + this.ruleName = "required"; + } + validate(modelResolver, propertyName, isRequired = true) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return !isRequired; + } + let testValue = value; + if (typeof (testValue) === 'string') { + if (String.prototype.trim) { + testValue = value.trim(); + } + else { + testValue = value.replace(/^\s+|\s+$/g, ''); + } + } + if (!isRequired) { + return true; + } + return (testValue + '').length > 0; + }); + } +} diff --git a/dist/es6/rules/rule-registry.js b/dist/es2015/rules/rule-registry.js similarity index 100% rename from dist/es6/rules/rule-registry.js rename to dist/es2015/rules/rule-registry.js diff --git a/dist/es2015/rules/step-validation-rule.js b/dist/es2015/rules/step-validation-rule.js new file mode 100644 index 0000000..d257e16 --- /dev/null +++ b/dist/es2015/rules/step-validation-rule.js @@ -0,0 +1,16 @@ +import * as tslib_1 from "tslib"; +export class StepValidationRule { + constructor() { + this.ruleName = "step"; + } + validate(modelResolver, propertyName, step) { + return tslib_1.__awaiter(this, void 0, void 0, function* () { + const value = modelResolver.resolve(propertyName); + if (value === undefined || value === null) { + return Promise.resolve(true); + } + const dif = (value * 100) % (step * 100); + return Math.abs(dif) < 0.00001 || Math.abs(1 - dif) < 0.00001; + }); + } +} diff --git a/dist/es6/rulesets/for-each-rule.js b/dist/es2015/rulesets/for-each-rule.js similarity index 100% rename from dist/es6/rulesets/for-each-rule.js rename to dist/es2015/rulesets/for-each-rule.js diff --git a/dist/es6/validation-groups/ivalidation-group.js b/dist/es2015/rulesets/irule-resolver.js similarity index 100% rename from dist/es6/validation-groups/ivalidation-group.js rename to dist/es2015/rulesets/irule-resolver.js diff --git a/dist/es6/rulesets/rule-link.js b/dist/es2015/rulesets/rule-link.js similarity index 100% rename from dist/es6/rulesets/rule-link.js rename to dist/es2015/rulesets/rule-link.js diff --git a/dist/es6/rulesets/rule-resolver.js b/dist/es2015/rulesets/rule-resolver.js similarity index 78% rename from dist/es6/rulesets/rule-resolver.js rename to dist/es2015/rulesets/rule-resolver.js index d42604c..948a629 100644 --- a/dist/es6/rulesets/rule-resolver.js +++ b/dist/es2015/rulesets/rule-resolver.js @@ -9,9 +9,9 @@ export class RuleResolver { return possibleIndexRoute.indexOf("[") >= 0; }; this.resolvePropertyRules = (propertyRoute, ruleset) => { - let propertyRouteSections = this.propertyResolver.decomposePropertyRoute(propertyRoute); - let finalProperty = propertyRouteSections[propertyRouteSections.length - 1]; - let matchingRules = this.traverseRulesForRoutes(propertyRouteSections, ruleset); + const propertyRouteSections = this.propertyResolver.decomposePropertyRoute(propertyRoute); + const finalProperty = propertyRouteSections[propertyRouteSections.length - 1]; + const matchingRules = this.traverseRulesForRoutes(propertyRouteSections, ruleset); if (!matchingRules) { return null; } @@ -36,7 +36,7 @@ export class RuleResolver { } }; this.traverseRulesForRoutes = (propertyRouteSections, ruleset) => { - let currentProperty = propertyRouteSections.shift(); + const currentProperty = propertyRouteSections.shift(); let childRules = ruleset; if (ruleset.rules) { childRules = childRules.rules[currentProperty]; @@ -47,23 +47,23 @@ export class RuleResolver { if (propertyRouteSections.length == 0) { return childRules; } - let nextProperty = propertyRouteSections[0]; + const nextProperty = propertyRouteSections[0]; if (!nextProperty) { return ruleset; } if (this.isIndexRoute(nextProperty)) { propertyRouteSections.shift(); - let applicableRules = []; + const applicableRules = []; childRules.forEach((internalRules) => { if (internalRules.isForEach) { applicableRules.push(internalRules.internalRule); } }); if (propertyRouteSections.length > 0) { - let totalRules = []; + const totalRules = []; applicableRules.forEach((applicableRule) => { - let currentRouteSection = propertyRouteSections.slice(); - let outputRules = this.traverseRulesForRoutes(currentRouteSection, applicableRule); + const currentRouteSection = propertyRouteSections.slice(); + const outputRules = this.traverseRulesForRoutes(currentRouteSection, applicableRule); outputRules.forEach((outputRule) => { totalRules.push(outputRule); }); @@ -75,7 +75,7 @@ export class RuleResolver { if (propertyRouteSections.length == 0) { return childRules; } - let nextChildRule = this.getMatchingRuleForProperty(nextProperty, childRules); + const nextChildRule = this.getMatchingRuleForProperty(nextProperty, childRules); if (propertyRouteSections.length > 0) { return this.traverseRulesForRoutes(propertyRouteSections, nextChildRule); } diff --git a/dist/es6/rulesets/ruleset.js b/dist/es2015/rulesets/ruleset.js similarity index 100% rename from dist/es6/rulesets/ruleset.js rename to dist/es2015/rulesets/ruleset.js diff --git a/dist/es6/watcher/imodel-watcher.js b/dist/es2015/validation-groups/ireactive-validation-group.js similarity index 100% rename from dist/es6/watcher/imodel-watcher.js rename to dist/es2015/validation-groups/ireactive-validation-group.js diff --git a/dist/es2015/validation-groups/ivalidation-group.js b/dist/es2015/validation-groups/ivalidation-group.js new file mode 100644 index 0000000..e69de29 diff --git a/dist/es6/validation-groups/reactive-validation-group.js b/dist/es2015/validation-groups/reactive-validation-group.js similarity index 82% rename from dist/es6/validation-groups/reactive-validation-group.js rename to dist/es2015/validation-groups/reactive-validation-group.js index c9c3949..bb4f090 100644 --- a/dist/es6/validation-groups/reactive-validation-group.js +++ b/dist/es2015/validation-groups/reactive-validation-group.js @@ -1,9 +1,10 @@ import { RuleResolver } from "../rulesets/rule-resolver"; import { ValidationGroup } from "./validation-group"; export class ReactiveValidationGroup extends ValidationGroup { - constructor(fieldErrorProcessor, ruleResolver = new RuleResolver(), modelResolverFactory, modelWatcherFactory, model, ruleset, refreshRate = 500) { - super(fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset); + constructor(fieldErrorProcessor, ruleResolver = new RuleResolver(), modelResolverFactory, modelWatcherFactory, localeHandler, model, ruleset, refreshRate = 500) { + super(fieldErrorProcessor, ruleResolver, modelResolverFactory, localeHandler, model, ruleset); this.modelWatcherFactory = modelWatcherFactory; + this.localeHandler = localeHandler; this.refreshRate = refreshRate; this.onModelChanged = (eventArgs) => { this.startValidateProperty(eventArgs.propertyPath); diff --git a/dist/es6/validation-groups/validation-group.js b/dist/es2015/validation-groups/validation-group.js similarity index 59% rename from dist/es6/validation-groups/validation-group.js rename to dist/es2015/validation-groups/validation-group.js index 8088e3a..e2d369b 100644 --- a/dist/es6/validation-groups/validation-group.js +++ b/dist/es2015/validation-groups/validation-group.js @@ -1,54 +1,56 @@ +import * as tslib_1 from "tslib"; import { RuleResolver } from "../rulesets/rule-resolver"; import { TypeHelper } from "../helpers/type-helper"; import { PromiseCounter } from "../promises/promise-counter"; import { PropertyStateChangedEvent } from "../events/property-state-changed-event"; import { ModelStateChangedEvent } from "../events/model-state-changed-event"; import { EventHandler } from "event-js"; -// TODO: This class could be simplified +// TODO: This class should be simplified further if possible export class ValidationGroup { - constructor(fieldErrorProcessor, ruleResolver = new RuleResolver(), modelResolverFactory, model, ruleset) { + constructor(fieldErrorProcessor, ruleResolver = new RuleResolver(), modelResolverFactory, localeHandler, model, ruleset) { this.fieldErrorProcessor = fieldErrorProcessor; this.ruleResolver = ruleResolver; this.modelResolverFactory = modelResolverFactory; + this.localeHandler = localeHandler; this.ruleset = ruleset; this.propertyErrors = {}; - this.validatePropertyWithRuleLinks = async (propertyName, propertyRules) => { - let activePromise = this.fieldErrorProcessor.checkFieldForErrors(this.modelResolver, propertyName, propertyRules); - let possibleErrors = await this.promiseCounter.countPromise(activePromise); - let hadErrors = this.hasErrors(); + this.validatePropertyWithRuleLinks = (propertyName, propertyRules) => tslib_1.__awaiter(this, void 0, void 0, function* () { + const activePromise = this.fieldErrorProcessor.checkFieldForErrors(this.modelResolver, propertyName, propertyRules); + const possibleErrors = yield this.promiseCounter.countPromise(activePromise); + const hadErrors = this.hasErrors(); if (!possibleErrors) { if (this.propertyErrors[propertyName]) { delete this.propertyErrors[propertyName]; - let eventArgs = new PropertyStateChangedEvent(propertyName, true); + const eventArgs = new PropertyStateChangedEvent(propertyName, true); this.propertyStateChangedEvent.publish(eventArgs); - let stillHasErrors = hadErrors && this.hasErrors(); + const stillHasErrors = hadErrors && this.hasErrors(); if (!stillHasErrors) { this.modelStateChangedEvent.publish(new ModelStateChangedEvent(true)); } } return this.promiseCounter.waitForCompletion(); } - let previousError = this.propertyErrors[propertyName]; + const previousError = this.propertyErrors[propertyName]; this.propertyErrors[propertyName] = possibleErrors; if (possibleErrors != previousError) { - let eventArgs = new PropertyStateChangedEvent(propertyName, false, possibleErrors); + const eventArgs = new PropertyStateChangedEvent(propertyName, false, possibleErrors); this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { this.modelStateChangedEvent.publish(new ModelStateChangedEvent(false)); } } return this.promiseCounter.waitForCompletion(); - }; + }); this.validatePropertyWithRuleSet = (propertyRoute, ruleset) => { let transformedPropertyName; - for (let childPropertyName in ruleset.rules) { + for (const childPropertyName in ruleset.rules) { transformedPropertyName = `${propertyRoute}.${childPropertyName}`; this.validatePropertyWithRules(transformedPropertyName, ruleset.getRulesForProperty(childPropertyName)); } }; this.validatePropertyWithRules = (propertyRoute, rules) => { - let ruleLinks = []; - let ruleSets = []; + const ruleLinks = []; + const ruleSets = []; let currentValue; try { currentValue = this.modelResolver.resolve(propertyRoute); @@ -57,12 +59,12 @@ export class ValidationGroup { console.warn(`Failed to resolve property ${propertyRoute} during validation. Does it exist in your model?`); throw (ex); } - let routeEachRule = (ruleLinkOrSet) => { + const routeEachRule = (ruleLinkOrSet) => { if (ValidationGroup.isForEach(ruleLinkOrSet)) { - let isCurrentlyAnArray = TypeHelper.isArrayType(currentValue); + const isCurrentlyAnArray = TypeHelper.isArrayType(currentValue); if (isCurrentlyAnArray) { currentValue.forEach((element, index) => { - let childPropertyName = `${propertyRoute}[${index}]`; + const childPropertyName = `${propertyRoute}[${index}]`; this.validatePropertyWithRules(childPropertyName, [ruleLinkOrSet.internalRule]); }); } @@ -88,89 +90,89 @@ export class ValidationGroup { this.validatePropertyWithRuleSet(propertyRoute, ruleSet); }); }; - this.startValidateProperty = async (propertyRoute) => { - if (this.ruleset.compositeRules !== {}) { - await this.validateCompositeRules(); + this.startValidateProperty = (propertyRoute) => tslib_1.__awaiter(this, void 0, void 0, function* () { + if (Object.keys(this.ruleset.compositeRules).length > 0) { + yield this.validateCompositeRules(); } if (this.ruleset.compositeRules[propertyRoute] !== undefined) { return; } - let rulesForProperty = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); + const rulesForProperty = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); if (!rulesForProperty) { return; } return this.validatePropertyWithRules(propertyRoute, rulesForProperty); - }; - this.validateCompositeRule = async (compositeRule) => { - let hadErrors = this.hasErrors(); - let isValid = await compositeRule.validate(this.modelResolver); + }); + this.validateCompositeRule = (compositeRule) => tslib_1.__awaiter(this, void 0, void 0, function* () { + const hadErrors = this.hasErrors(); + const isValid = yield compositeRule.validate(this.modelResolver); if (isValid) { if (this.propertyErrors[compositeRule.virtualPropertyName]) { delete this.propertyErrors[compositeRule.virtualPropertyName]; - let eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, true); + const eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, true); this.propertyStateChangedEvent.publish(eventArgs); } - let stillHasErrors = hadErrors && this.hasErrors(); + const stillHasErrors = hadErrors && this.hasErrors(); if (!stillHasErrors) { this.modelStateChangedEvent.publish(new ModelStateChangedEvent(true)); } return; } - let previousError = this.propertyErrors[compositeRule.virtualPropertyName]; - let currentError = compositeRule.getMessage(this.modelResolver); + const previousError = this.propertyErrors[compositeRule.virtualPropertyName]; + const currentError = yield this.localeHandler.getMessage(compositeRule.virtualPropertyName, compositeRule, this.modelResolver, null); this.propertyErrors[compositeRule.virtualPropertyName] = currentError; if (currentError != previousError) { - let eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, false, currentError); + const eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, false, currentError); this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) { this.modelStateChangedEvent.publish(new ModelStateChangedEvent(false)); } } return this.propertyErrors[compositeRule.virtualPropertyName]; - }; - this.validateCompositeRules = async () => { - for (let propertyName in this.ruleset.compositeRules) { - let compositeRule = this.ruleset.compositeRules[propertyName]; - this.validateCompositeRule(compositeRule); + }); + this.validateCompositeRules = () => tslib_1.__awaiter(this, void 0, void 0, function* () { + for (const propertyName in this.ruleset.compositeRules) { + const compositeRule = this.ruleset.compositeRules[propertyName]; + yield this.validateCompositeRule(compositeRule); } - }; - this.startValidateModel = () => { - for (let parameterName in this.ruleset.rules) { - this.startValidateProperty(parameterName); + }); + this.startValidateModel = () => tslib_1.__awaiter(this, void 0, void 0, function* () { + for (const parameterName in this.ruleset.rules) { + yield this.startValidateProperty(parameterName); } - }; + }); this.changeValidationTarget = (model) => { this.modelResolver = this.modelResolverFactory.createModelResolver(model); }; - this.validateProperty = async (propertyRoute) => { - await this.startValidateProperty(propertyRoute); - await this.promiseCounter.waitForCompletion(); + this.validateProperty = (propertyRoute) => tslib_1.__awaiter(this, void 0, void 0, function* () { + yield this.startValidateProperty(propertyRoute); + yield this.promiseCounter.waitForCompletion(); return !this.propertyErrors[propertyRoute]; - }; - this.validate = async () => { - await this.startValidateModel(); - await this.promiseCounter.waitForCompletion(); + }); + this.validate = () => tslib_1.__awaiter(this, void 0, void 0, function* () { + yield this.startValidateModel(); + yield this.promiseCounter.waitForCompletion(); return !this.hasErrors(); - }; - this.getModelErrors = async (revalidate = false) => { + }); + this.getModelErrors = (revalidate = false) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (revalidate) { - await this.startValidateModel(); + yield this.startValidateModel(); } - await this.promiseCounter.waitForCompletion(); + yield this.promiseCounter.waitForCompletion(); return this.propertyErrors; - }; - this.getPropertyError = async (propertyRoute, revalidate = false) => { + }); + this.getPropertyError = (propertyRoute, revalidate = false) => tslib_1.__awaiter(this, void 0, void 0, function* () { if (revalidate) { - this.startValidateProperty(propertyRoute); + yield this.startValidateProperty(propertyRoute); } - await this.promiseCounter.waitForCompletion(); + yield this.promiseCounter.waitForCompletion(); return this.propertyErrors[propertyRoute]; - }; + }); this.getPropertyDisplayName = (propertyRoute) => { return this.ruleset.getPropertyDisplayName(propertyRoute); }; this.isPropertyInGroup = (propertyRoute) => { - let applicableRules = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); + const applicableRules = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); return (applicableRules != null); }; this.release = () => { }; diff --git a/dist/es2015/watcher/imodel-watcher.js b/dist/es2015/watcher/imodel-watcher.js new file mode 100644 index 0000000..e69de29 diff --git a/dist/es6/watcher/model-watcher.js b/dist/es2015/watcher/model-watcher.js similarity index 88% rename from dist/es6/watcher/model-watcher.js rename to dist/es2015/watcher/model-watcher.js index b6c9f7a..f70c124 100644 --- a/dist/es6/watcher/model-watcher.js +++ b/dist/es2015/watcher/model-watcher.js @@ -33,8 +33,8 @@ export class ModelWatcher { } }; this.updateAndNotifyDifferences = () => { - let previousKeyCache = this.watchCacheKeys; - let previousWatchCache = this.watchCache; + const previousKeyCache = this.watchCacheKeys; + const previousWatchCache = this.watchCache; this.watchCache = []; this.watchCacheKeys = []; this.cacheWatchTargets("", this.ruleset); @@ -42,14 +42,14 @@ export class ModelWatcher { let previousValue; if (previousKeyCache.indexOf(key) == -1) { previousValue = this.watchCache[index].previousValue; - let propertyChangedArgs = new PropertyChangedEvent(key, previousValue, null); + const propertyChangedArgs = new PropertyChangedEvent(key, previousValue, null); setTimeout(() => { this.onPropertyChanged.publish(propertyChangedArgs); }, 1); } else if (previousWatchCache[index].previousValue && previousWatchCache[index].previousValue.isArray) { if (previousWatchCache[index].previousValue.length != this.watchCache[index].previousValue.length) { - let newValue = this.watchCache[index].previousValue; + const newValue = this.watchCache[index].previousValue; previousValue = previousWatchCache[index].previousValue; - let propertyChangedArgs = new PropertyChangedEvent(key, newValue, previousValue); + const propertyChangedArgs = new PropertyChangedEvent(key, newValue, previousValue); setTimeout(() => { this.onPropertyChanged.publish(propertyChangedArgs); }, 1); } } @@ -57,7 +57,7 @@ export class ModelWatcher { }; this.watchProperty = (watchRoute, previousData) => { if (this.watchCacheKeys.indexOf(watchRoute) == -1) { - let propertyWatcher = new PropertyWatcher(watchRoute, previousData); + const propertyWatcher = new PropertyWatcher(watchRoute, previousData); this.watchCache.push(propertyWatcher); this.watchCacheKeys.push(watchRoute); } @@ -66,7 +66,7 @@ export class ModelWatcher { let paramRoute, parameterRules; let anyRulesAreForEach, anyRulesAreSets; let hasValue, currentValue; - for (let param in ruleset.rules) { + for (const param in ruleset.rules) { paramRoute = propertyStack ? propertyStack + "." + param : param; parameterRules = ruleset.rules[param]; anyRulesAreForEach = false; @@ -97,9 +97,9 @@ export class ModelWatcher { } } parameterRules.forEach((rule) => { - let isArray = TypeHelper.isArrayType(currentValue); + const isArray = TypeHelper.isArrayType(currentValue); if (isArray) { - let cachedArrayInfo = { length: currentValue.length, isArray: true }; + const cachedArrayInfo = { length: currentValue.length, isArray: true }; this.watchProperty(paramRoute, cachedArrayInfo); } if (rule.isForEach && hasValue) { @@ -152,13 +152,13 @@ export class ModelWatcher { currentValue = propertyWatcher.previousValue; } if (propertyWatcher.previousValue && propertyWatcher.previousValue.isArray) { - let currentLength = currentValue.length || 0; + const currentLength = currentValue.length || 0; if (currentLength != propertyWatcher.previousValue.length) { hasChanged = true; } } else if (currentValue !== propertyWatcher.previousValue) { - let propertyChangedArgs = new PropertyChangedEvent(propertyWatcher.propertyPath, currentValue, propertyWatcher.previousValue); + const propertyChangedArgs = new PropertyChangedEvent(propertyWatcher.propertyPath, currentValue, propertyWatcher.previousValue); setTimeout(() => { this.onPropertyChanged.publish(propertyChangedArgs); }, 1); propertyWatcher.previousValue = currentValue; } diff --git a/dist/es6/watcher/property-watcher.js b/dist/es2015/watcher/property-watcher.js similarity index 100% rename from dist/es6/watcher/property-watcher.js rename to dist/es2015/watcher/property-watcher.js diff --git a/dist/es6/exposer.js b/dist/es6/exposer.js deleted file mode 100644 index 20f46ed..0000000 --- a/dist/es6/exposer.js +++ /dev/null @@ -1,14 +0,0 @@ -import { FieldErrorProcessor } from "./processors/field-error-processor"; -import { RuleResolver } from "./rulesets/rule-resolver"; -import { ValidationGroupBuilder } from "./builders/validation-group-builder"; -import { ruleRegistry } from "./rule-registry-setup"; -import { RulesetBuilder } from "./builders/ruleset-builder"; -var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); -var ruleResolver = new RuleResolver(); -export function createRuleset(withRuleVerification = false) { - var rulesetBuilder = withRuleVerification ? new RulesetBuilder(ruleRegistry) : new RulesetBuilder(); - return rulesetBuilder.create(); -} -export function createGroup() { - return new ValidationGroupBuilder(fieldErrorProcessor, ruleResolver).create(); -} diff --git a/dist/es6/processors/field-error-processor.js b/dist/es6/processors/field-error-processor.js deleted file mode 100644 index d530a92..0000000 --- a/dist/es6/processors/field-error-processor.js +++ /dev/null @@ -1,55 +0,0 @@ -import { FieldHasError } from "./field-has-error"; -export class FieldErrorProcessor { - constructor(ruleRegistry) { - this.ruleRegistry = ruleRegistry; - } - // Validates a single property against a model - async processRuleLink(modelResolver, propertyName, ruleLink) { - let shouldRuleApply = ruleLink.appliesIf === true - || ((typeof (ruleLink.appliesIf) === "function") - ? (ruleLink.appliesIf)(modelResolver, propertyName, ruleLink.ruleOptions) - : false); - if (!shouldRuleApply) { - return; - } - let validator = this.ruleRegistry.getRuleNamed(ruleLink.ruleName); - let options = (typeof ruleLink.ruleOptions == "function") ? ruleLink.ruleOptions() : ruleLink.ruleOptions; - let isValid = await validator.validate(modelResolver, propertyName, options); - if (isValid) { - return; - } - let error; - if (ruleLink.messageOverride) { - if (typeof (ruleLink.messageOverride) === "function") { - error = (ruleLink.messageOverride)(modelResolver, propertyName, ruleLink.ruleOptions); - } - else { - error = ruleLink.messageOverride; - } - } - else { - error = validator.getMessage(modelResolver, propertyName, ruleLink.ruleOptions); - } - throw new FieldHasError(error); - } - // Loops through each rule on a property, adds it to a chain, then calls Promise.all - // Probably not correct, as they won't fire sequentially? Promises need to be chained - async checkFieldForErrors(modelResolver, propertyName, rules) { - let ruleCheck = (ruleLinkOrSet) => { - return this.processRuleLink(modelResolver, propertyName, ruleLinkOrSet); - }; - let checkEachRule = (rules) => { - let promises = []; - rules.forEach((rule) => { - promises.push(ruleCheck(rule)); - }); - return Promise.all(promises); - }; - return Promise.resolve(rules) - .then(checkEachRule) - .then(function () { return null; }) - .catch((validationError) => { - return validationError.message; - }); - } -} diff --git a/dist/es6/rules/advanced-regex-rule.js b/dist/es6/rules/advanced-regex-rule.js deleted file mode 100644 index e143a9c..0000000 --- a/dist/es6/rules/advanced-regex-rule.js +++ /dev/null @@ -1,24 +0,0 @@ -export class AdvancedRegexValidationRule { - constructor(ruleName, expression, message) { - if (!ruleName || ruleName.length == 0) { - throw new Error("ruleName is required, an empty rule name is invalid"); - } - if (!expression || expression.length == 0) { - throw new Error("expression is required, an empty regex expression is invalid"); - } - this.ruleName = ruleName; - this.expression = expression; - this.message = (typeof message === "function") ? message : () => { return message; }; - } - async validate(modelResolver, propertyName, regexPattern) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return true; - } - return value.toString().match(this.expression) !== null; - } - getMessage(modelResolver, propertyName, regexPattern) { - let value = modelResolver.resolve(propertyName); - return this.message(value); - } -} diff --git a/dist/es6/rules/composite/dynamic-composite-validation-rule.js b/dist/es6/rules/composite/dynamic-composite-validation-rule.js deleted file mode 100644 index f36e4dd..0000000 --- a/dist/es6/rules/composite/dynamic-composite-validation-rule.js +++ /dev/null @@ -1,15 +0,0 @@ -export class DynamicCompositeValidationRule { - constructor(virtualPropertyName, validate, message) { - this.virtualPropertyName = virtualPropertyName; - this.validate = validate; - this.message = message; - } - getMessage(modelResolver) { - if (typeof (this.message) === "function") { - return this.message(modelResolver); - } - else { - return this.message; - } - } -} diff --git a/dist/es6/rules/date-validation-rule.js b/dist/es6/rules/date-validation-rule.js deleted file mode 100644 index f3b0244..0000000 --- a/dist/es6/rules/date-validation-rule.js +++ /dev/null @@ -1,17 +0,0 @@ -export class DateValidationRule { - constructor() { - this.ruleName = "date"; - this.invalidObjectRegex = /Invalid|NaN/; - } - async validate(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return true; - } - return !this.invalidObjectRegex.test(new Date(value)); - } - getMessage(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - return `This field contains "${value}" which is not a valid date`; - } -} diff --git a/dist/es6/rules/decimal-validation-rule.js b/dist/es6/rules/decimal-validation-rule.js deleted file mode 100644 index 979e685..0000000 --- a/dist/es6/rules/decimal-validation-rule.js +++ /dev/null @@ -1,17 +0,0 @@ -export class DecimalValidationRule { - constructor() { - this.ruleName = "decimal"; - this.decimalRegex = /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/; - } - async validate(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return true; - } - return this.decimalRegex.test(value); - } - getMessage(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - return `This field contains ${value} which is not a decimal value`; - } -} diff --git a/dist/es6/rules/equal-validation-rule.js b/dist/es6/rules/equal-validation-rule.js deleted file mode 100644 index 8828b38..0000000 --- a/dist/es6/rules/equal-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -import { TypeHelper } from "../helpers/type-helper"; -import { ComparerHelper } from "../helpers/comparer-helper"; -export class EqualValidationRule { - constructor() { - this.ruleName = "equal"; - } - async validate(modelResolver, propertyName, optionsOrValue) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return true; - } - let comparison = optionsOrValue.value || optionsOrValue; - let weakEquality = optionsOrValue.weakEquality || false; - if (TypeHelper.isFunctionType(comparison)) { - comparison = comparison(); - } - if (TypeHelper.isDateType(comparison)) { - return ComparerHelper.dateTimeCompararer(value, comparison); - } - else { - return ComparerHelper.simpleTypeComparer(value, comparison, weakEquality); - } - } - getMessage(modelResolver, propertyName, optionsOrValue) { - var value = modelResolver.resolve(propertyName); - return `This field is ${value} but should be equal to ${optionsOrValue.value || optionsOrValue}`; - } -} diff --git a/dist/es6/rules/iso-date-validation-rule.js b/dist/es6/rules/iso-date-validation-rule.js deleted file mode 100644 index 41fe1a4..0000000 --- a/dist/es6/rules/iso-date-validation-rule.js +++ /dev/null @@ -1,17 +0,0 @@ -export class ISODateValidationRule { - constructor() { - this.ruleName = "isoDate"; - this.isoDateRegex = /(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))/; - } - async validate(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return true; - } - return this.isoDateRegex.test(value); - } - getMessage(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - return `This field contains "${value}" which is not a valid ISO date`; - } -} diff --git a/dist/es6/rules/matches-validation-rule.js b/dist/es6/rules/matches-validation-rule.js deleted file mode 100644 index ca19ff4..0000000 --- a/dist/es6/rules/matches-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -import { TypeHelper } from "../helpers/type-helper"; -import { ComparerHelper } from "../helpers/comparer-helper"; -export class MatchesValidationRule { - constructor() { - this.ruleName = "matches"; - } - async validate(modelResolver, propertyName, optionsOrProperty) { - let fieldToMatch = optionsOrProperty.property || optionsOrProperty; - let weakEquality = optionsOrProperty.weakEquality || false; - let value = modelResolver.resolve(propertyName); - let matchingFieldValue = modelResolver.resolve(fieldToMatch); - if (value === undefined || value === null) { - return (matchingFieldValue === undefined || matchingFieldValue === null); - } - else if (TypeHelper.isDateType(value)) { - return ComparerHelper.dateTimeCompararer(value, matchingFieldValue); - } - else { - return ComparerHelper.simpleTypeComparer(value, matchingFieldValue, weakEquality); - } - } - getMessage(modelResolver, propertyName, optionsOrProperty) { - let value = modelResolver.resolve(propertyName); - let fieldToMatch = optionsOrProperty.property || optionsOrProperty; - let matchingFieldValue = modelResolver.resolve(fieldToMatch); - return `This field is ${value} but should match ${matchingFieldValue}`; - } -} diff --git a/dist/es6/rules/max-length-validation-rule.js b/dist/es6/rules/max-length-validation-rule.js deleted file mode 100644 index 474cabd..0000000 --- a/dist/es6/rules/max-length-validation-rule.js +++ /dev/null @@ -1,16 +0,0 @@ -export class MaxLengthValidationRule { - constructor() { - this.ruleName = "maxLength"; - } - async validate(modelResolver, propertyName, maxLength) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return true; - } - return value.length <= maxLength; - } - getMessage(modelResolver, propertyName, maxLength) { - let value = modelResolver.resolve(propertyName); - return `This field has a length of ${value.length} but should contain no more than ${maxLength}`; - } -} diff --git a/dist/es6/rules/max-value-validation-rule.js b/dist/es6/rules/max-value-validation-rule.js deleted file mode 100644 index 0668466..0000000 --- a/dist/es6/rules/max-value-validation-rule.js +++ /dev/null @@ -1,16 +0,0 @@ -export class MaxValueValidationRule { - constructor() { - this.ruleName = "maxValue"; - } - async validate(modelResolver, propertyName, maxValue) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return true; - } - return value <= maxValue; - } - getMessage(modelResolver, propertyName, maxValue) { - let value = modelResolver.resolve(propertyName); - return `This field has a value of ${value} but should be less than or equal to ${maxValue}`; - } -} diff --git a/dist/es6/rules/min-length-validation-rule.js b/dist/es6/rules/min-length-validation-rule.js deleted file mode 100644 index 909b4aa..0000000 --- a/dist/es6/rules/min-length-validation-rule.js +++ /dev/null @@ -1,16 +0,0 @@ -export class MinLengthValidationRule { - constructor() { - this.ruleName = "minLength"; - } - async validate(modelResolver, propertyName, minLength) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return true; - } - return value.length >= minLength; - } - getMessage(modelResolver, propertyName, minLength) { - let value = modelResolver.resolve(propertyName); - return `This field has a length of ${value.length} but should more than ${minLength}`; - } -} diff --git a/dist/es6/rules/min-value-validation-rule.js b/dist/es6/rules/min-value-validation-rule.js deleted file mode 100644 index 9599f5b..0000000 --- a/dist/es6/rules/min-value-validation-rule.js +++ /dev/null @@ -1,16 +0,0 @@ -export class MinValueValidationRule { - constructor() { - this.ruleName = "minValue"; - } - async validate(modelResolver, propertyName, minValue) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return true; - } - return value >= minValue; - } - getMessage(modelResolver, propertyName, minValue) { - let value = modelResolver.resolve(propertyName); - return `This field has a value of ${value} but should be greater than or equal to ${minValue}`; - } -} diff --git a/dist/es6/rules/not-equal-validation-rule.js b/dist/es6/rules/not-equal-validation-rule.js deleted file mode 100644 index d37e68d..0000000 --- a/dist/es6/rules/not-equal-validation-rule.js +++ /dev/null @@ -1,28 +0,0 @@ -import { TypeHelper } from "../helpers/type-helper"; -import { ComparerHelper } from "../helpers/comparer-helper"; -export class NotEqualValidationRule { - constructor() { - this.ruleName = "notEqual"; - } - async validate(modelResolver, propertyName, optionsOrValue) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return true; - } - let comparison = optionsOrValue.value || optionsOrValue; - let weakEquality = optionsOrValue.weakEquality || false; - if (TypeHelper.isFunctionType(comparison)) { - comparison = comparison(); - } - if (TypeHelper.isDateType(comparison)) { - return !ComparerHelper.dateTimeCompararer(value, comparison); - } - else { - return !ComparerHelper.simpleTypeComparer(value, comparison, weakEquality); - } - } - getMessage(modelResolver, propertyName, optionsOrValue) { - let value = modelResolver.resolve(propertyName); - return `This field is ${value} but should not be equal to ${optionsOrValue.value || optionsOrValue}`; - } -} diff --git a/dist/es6/rules/number-validation-rule.js b/dist/es6/rules/number-validation-rule.js deleted file mode 100644 index 20beaa6..0000000 --- a/dist/es6/rules/number-validation-rule.js +++ /dev/null @@ -1,17 +0,0 @@ -export class NumberValidationRule { - constructor() { - this.ruleName = "number"; - this.numberRegex = /^\d+$/; - } - async validate(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return true; - } - return this.numberRegex.test(value); - } - getMessage(modelResolver, propertyName) { - let value = modelResolver.resolve(propertyName); - return `This field contains ${value} which is not a numeric value`; - } -} diff --git a/dist/es6/rules/regex-validation-rule.js b/dist/es6/rules/regex-validation-rule.js deleted file mode 100644 index 1c3a8bb..0000000 --- a/dist/es6/rules/regex-validation-rule.js +++ /dev/null @@ -1,15 +0,0 @@ -export class RegexValidationRule { - constructor() { - this.ruleName = "regex"; - } - async validate(modelResolver, propertyName, regexPattern) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null || value.length == 0) { - return true; - } - return value.toString().match(regexPattern) !== null; - } - getMessage(modelResolver, propertyName, regexPattern) { - return `This field does not match the expected format`; - } -} diff --git a/dist/es6/rules/required-validation-rule.js b/dist/es6/rules/required-validation-rule.js deleted file mode 100644 index 47f9a36..0000000 --- a/dist/es6/rules/required-validation-rule.js +++ /dev/null @@ -1,27 +0,0 @@ -export class RequiredValidationRule { - constructor() { - this.ruleName = "required"; - } - async validate(modelResolver, propertyName, isRequired = true) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return !isRequired; - } - let testValue = value; - if (typeof (testValue) === 'string') { - if (String.prototype.trim) { - testValue = value.trim(); - } - else { - testValue = value.replace(/^\s+|\s+$/g, ''); - } - } - if (!isRequired) { - return true; - } - return (testValue + '').length > 0; - } - getMessage(modelResolver, propertyName, isRequired) { - return "This field is required"; - } -} diff --git a/dist/es6/rules/step-validation-rule.js b/dist/es6/rules/step-validation-rule.js deleted file mode 100644 index 5052cb0..0000000 --- a/dist/es6/rules/step-validation-rule.js +++ /dev/null @@ -1,17 +0,0 @@ -export class StepValidationRule { - constructor() { - this.ruleName = "step"; - } - async validate(modelResolver, propertyName, step) { - let value = modelResolver.resolve(propertyName); - if (value === undefined || value === null) { - return Promise.resolve(true); - } - let dif = (value * 100) % (step * 100); - return Math.abs(dif) < 0.00001 || Math.abs(1 - dif) < 0.00001; - } - getMessage(modelResolver, propertyName, step) { - let value = modelResolver.resolve(propertyName); - return `This field has a value of ${value} and should be an increment of ${step}`; - } -} diff --git a/docs/breaking-changes.md b/docs/breaking-changes.md index 0a22bf8..fb25b3f 100644 --- a/docs/breaking-changes.md +++ b/docs/breaking-changes.md @@ -2,6 +2,14 @@ Wherever possible breaking changes are avoided but in some cases its going to happen. +## 0.17.0 + +- Changed `IValidationRule` to separate the messages out +- Changed `ICompositeRule` to separate the messages out +- Made `ValidationGroup` dependent on `ILocaleHandler` +- Made `FieldErrorProcessor` dependent on `ILocaleHandler` +- Made `ReactiveValidationGroup` dependent on `ILocaleHandler` + ## 0.12.0 - Removed `IValidationSettings` diff --git a/docs/custom-rules.md b/docs/custom-rules.md index aad93c9..89c8a8d 100644 --- a/docs/custom-rules.md +++ b/docs/custom-rules.md @@ -26,12 +26,6 @@ export class HelloValidationRule implements IValidationRule var value = modelResolver.resolve(propertyName); return Promise.resolve(value == "hello"); } - - public getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any) - { - var value = modelResolver.resolve(propertyName); - return `This field is ${value} but should be hello`; - } } ``` @@ -46,24 +40,38 @@ function HelloValidationRule() var value = modelResolver.resolve(propertyName); return Promise.resolve(value == "hello"); } - - this.getMessage(value, optionsOrValue) - { - var value = modelResolver.resolve(propertyName); - return "This field is " + value + "but should be hello"; - } } ``` This rule now can be used within the Treacherous system by registering it within the `ruleRegistry`. +### Creating a custom error message + +Since `0.17.0` Treacherous has a localization handler which takes care of resolving messages for rules asynchronously. + +You can see the [doc on localization](./localization.md) for more information on how to set this up, but the simple use case is to supplement the current locale with your custom validation rule. This can be done like so: + +```ts +import {localeHandler, supplementLocale} from "treacherous" + +const currentLocale = localeHandler.getCurrentLocale(); // Incase you dont know what you are using, which is en-us by default +supplementLocale(currentLocale, { + "hello": (value: any) => `This field is ${value} but should be hello` +}); +``` + +This will get the current locale being used (its defaulted to `en-us`) and register a message for the `hello` rule. + +As mentioned if you view the [doc on localization](./localization.md) you can see more in depth options for custom messages, as well as registering messages in multiple languages or with other use cases where you would not be augmenting languages locally like with i18n systems with its own back end. + +--- + ### Extra Info To provide some more information on each property: * `ruleName` - The name of the rule to be used within the `addRule` statements * `validate` - The validation method where you should verify the value and return a promise with true/false -* `getMessage` - The getMessage method should return a string providing information related to the validation error (It is also worth mentioning that at some point the message will be pulled out when internationalisation occurs) @@ -103,15 +111,26 @@ export interface ICompositeValidationRule { virtualPropertyName: string; validate(modelResolver: IModelResolver): Promise; - getMessage(modelResolver: IModelResolver): string; } ``` -The `virtualPropertyName` is the property name you would provide on any calls to check validity of a property, it can be any value but should be unique per model. +The `virtualPropertyName` is the property name you would provide on any calls to check validity of a property, it can be any value but should be unique. The `validate` provides you a way to resolve properties on the model using the `modelResolver` and should return a promise containin a true or false depending on if it is valid or not. -The `getMessage` should output an error message which explains what is wrong and why it failed validation. +As with normal rules, you will need to register the error message with the localization handler, as this is not a regular rule with a name the `virtualPropertyName` should be used as the key for the message, you can have this as a raw string or a method which is passed the `modelResolver` for you to generate your message i.e: + +```ts +import {localeHandler, supplementLocale} from "treacherous" + +const currentLocale = localeHandler.getCurrentLocale(); // Incase you dont know what you are using, which is en-us by default +supplementLocale(currentLocale, { + "myVirtualPropertyName": "The model has some invalid details related to ...", + "someFancyVirtualPropertyName": (modelResolver: any, compositeRule: any) => { /*...*/ } +}); +``` + +As you can see you can use a simple string, or take in the model resolver and the composite rule being used (incase you need any configuration data on the composite rule). ### Using Composite Rules diff --git a/docs/localization.md b/docs/localization.md new file mode 100644 index 0000000..38f4814 --- /dev/null +++ b/docs/localization.md @@ -0,0 +1,294 @@ +# Localization + +Although there are a few different parts to it, the localization is actually quite simple under the hood, there is an `ILocaleHandler` which defines the contracts for handlers, be it the default one, a custom i18n one etc. + +Lets quickly go over the *DEFAULT* setup which is automatically done for you and can be supplemented via code and any other modules. + +## Default Locale Handler + +So by default treacherous will pre load the locale handler with an instance of `DefaultLocaleHandler` and will register `en-us` as the default language, and use that. + +### How it works + +The code which does this is run for you as part of the default setup ([found in exposer.ts](../src/exposer.ts)) + +```ts +import {ILocaleHandler} from "./localization/ilocale-handler"; +import {DefaultLocaleHandler} from "./localization/default-locale-handler"; +import {locale as defaultLocale} from "./locales/en-us" + +const defaultLocaleCode = "en-us"; + +const defaultLocaleHandler = new DefaultLocaleHandler(); +defaultLocaleHandler.registerLocale(defaultLocaleCode, defaultLocale); +defaultLocaleHandler.useLocale(defaultLocaleCode); +``` + +As mentioned this is all done for you, but you can see that it sets the default locale to `en-us` and then instantiates the locale handler (so it can be passed to other treacherous classes) and registers the `en-us` locale data and then uses that. + +Just to confirm here `registerLocale` does not select that locale as the current one, it just registers the locale within the handler. This is so that you can load multiple locales at once for SPAs and switch between them based upon the users selection. So the `useLocale` just tells the handler what locale to use when resolving messages. + +### How to create locales + +The default locale handler is quite simple and just expects you to pass it a module containing a `locale` export like so: + +```ts +import {IModelResolver} from "../resolvers/imodel-resolver"; + +export var locale = +{ + "default": "This field is invalid", + "required": "This field is required", + "date": (value: any) => `This field contains "${value}" which is not a valid date`, + // ... more rules here + "matches": (modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any) => { + const value = modelResolver.resolve(propertyName); + const fieldToMatch = optionsOrProperty.property || optionsOrProperty; + const matchingFieldValue = modelResolver.resolve(fieldToMatch); + return `This field is ${value} but should match ${matchingFieldValue}`; + }, +}; +``` + +So this is part of the [en-us locale](../src/locales/en-us.ts) module which is loaded for you, and this should be used as reference for other locales. + +(If you are a JS user then you dont need the typings but export the `locale` object in the same way so it can be grabbed from the module.) + +There are a few key bits to note here as to how the messages are resolved and how you can setup your messages, as a message can be a string or a method depending on the data needed for your message to be resolved. + +#### `default` key + +This is a fallback generic message incase you have a custom rule and have not provided it with a message. So for most cases this can be ignored, but the handler will try to find a message for your key, if it cant find one it looks for the default, if there is no default it tells you no rules could be found. So it is a good idea to provide a default fallback within your custom locales. + +#### Providing a string as a message + +This is the simplest example and your string will be passed through without any processing of any kind. + +The `default` and `required` keys are an example of this. + +#### Providing a message which requires a value + +This is the next logical step if you need more than just a static string, but only need the current value of the property being validated. + +In this scenario you make your message a function which will be passed the current value, which you then use to generate you string. + +`date` is an example of this. + +#### Providing a function which will manually resolve message + +This is the most complex scenario but this is where you want to be able to interrogate the model directly and create your message in a more complex way. + +In this scenario you make your message a function which takes an `IModelResolver`, the propertyName which is a string, and the rule options which can be anything based upon how you setup your rule. + +The `matches` rule is an example of this. + +#### Returning Promises + +You can return a promise from your messages if you want and the handler will automatically handle it for you, in the case of you having async code within your error message handler. + +If at all possible it is recommended you try to keep your messages lightweight, but in some cases you may need to asynchronously do something, and the support is there for you to do so if needed. + +### Adding your own Locales + +So once you have made your own locales such as `zh-cn` which adhere to the above pattern you can simply register it with the default locale handler like so: + +```ts +import {localeHandler} from "treacherous" +import {locale as chineseLocale} from "./my-locales/zh-cn` +localeHandler.registerLocale("zh-cn", chineseLocale); +``` + +That will tell the default locale handler that there is another language that it should support, so by default after that code is run you would have `en-us` and `zh-cn` available for use, **HOWEVER** it is still using `en-us` as we have only registered another locale, not actually told treacherous to use that as the current one, which can be achieved like so: + +```ts +localeHandler.useLocale("zh-cn"); +``` + +Then that's it, any time a validation rule would be resolved it would look for the chinese version of it rather than the english version of it. You can easily switch between the active locale by just calling `useLocale` with the registered locale you wish to use. + +(If you try to use a locale which has not been registered an exception will be thrown.) + +### Adding to existing locales + +So in this scenario you will probably be making custom rules and done want to create your own custom `en-us` but add to the existing one, and that use case is super simple too as the default handler has support for supplementing locales. + +So to do so you would create your own locale containing just the rules you want to add to the system, like so: + +``` +// Imagine you have a custom-rules.en-us +export var locale +{ + "myCustomRule1": "some message", + "myOtherCustomRule2": (value) => `some message with the ${value}` +} + +// Then you supplement en-us like so +import {supplementLocale} from "treacherous" +import {locale as supplementEnglishLocale} from "../my-locales/custom-rules.en-us" + +supplementLocale("en-us", supplementEnglishLocale); +``` + +This is the neatest way of doing it, but you can go rogue and just pass the `supplementLocale` call a JS object containing the keys rather than loading it from a separate file. + +## Custom Handlers + +You will need to provide your locale data in different ways depending on the implementation of `ILocaleHandler`, but generally the data will be a same. There being a key which ties the rule to the message, such as `required` or `maxValue` and the locale code itself, which by default would be `en-us`. + +So in a lot of real world scenarios you may be using one of the various i18n implementations with a backend/api/local files etc (there are that many varying implementations of it), or you may want to have a folder where you dynamically load modules on demand. + +Whatever your scenario, in almost all these cases the key parts are always the same, you have a locale code which identifies what language you want to use and a key that used to indicate what string you want from the locale data you have. + +### The default handler + +As you can see from the previous section the default handler delegates the fetching of the locale data to the consumer, and is quite simple in nature as all it really does is just cache the locales like a big dictionary and delegate the right data to the messages depending on their type. + +It does however show the basics required for creating a localization handler, so lets pretend we wanted to make a handler that did the loading of modules for you so you. + +### An imaginary path based handler + +As there are a myriad of i18n frameworks and plugins for view libraries it would be too difficult to create an out the box i18n handler, but as at least a stepping stone, I can provide an imaginary async loader that shows the basics in a way that can be adapted to various other scenarios. + +#### The implementation + +```ts +// Import interfaces and expected types +import {ILocaleHandler} from "./ilocale-handler"; +import {IModelResolver} from "../resolvers/imodel-resolver"; +import {LocaleString, RawLocaleStringGetter, ProcessedLocaleStringGetter} from './locale-string'; + +// Create a class which implements ILocaleHandler +export class DynamicLocaleHandler implements ILocaleHandler +{ + // Current locale code + private localeCode: string; + + // Container for cached locale resources + private localeResources: any = {}; + + // Promise to indicate if something is still loading + private waitUntilLoaded: Promise; + + // The default path where locales would be stored + constructor(private defaultLocalePath = "/locales"){} + + public getCurrentLocale = () => { return this.localeCode; } + + // The register here allows an optional url override to the default path, but could be passed in anything + public registerLocale = async (localeCode: string, localeModuleUrl?: string) => { + + // Make sure that any previous async tasks have finished + await this.waitUntilLoaded; + + // Check if we have already cached it, if so return it + if(this.localeResources[localeCode]) + { return this.localeResources[localeCode]; } + + // Get the url of the module + const moduleUrl = localeModuleUrl ? localeModuleUrl : `${this.defaultLocalePath}/${localeCode}`; + + // Set the new promise that is outstanding + this.waitUntilLoaded = this.loadLocaleFrom(moduleUrl) + .then((localeData:any) => { + // Cache the results + this.localeResources[localeCode] = localeData; + }); + + // Return current promise incase caller wants to wait + return this.waitUntilLoaded; + } + + public useLocale = async(localeCode: string) => + { + await this.waitUntilLoaded; + + if(!this.localeResources[localeCode]) + { throw `Unable to find registered locale for [${localeCode}]`; } + + this.localeCode = localeCode; + } + + // Manually update the cached locales with a partial locale + public supplementLocaleFrom = async (localeCode: string, localeModuleUrl: string) => { + await this.waitUntilLoaded; + + // Tell everything else here to wait for this to finish + this.waitUntilLoaded = this.loadLocaleFrom(localeModuleUrl) + .then((localeData:any) => { + // Merge objects together + this.localeResources[localeCode] = Object.assign({}, this.localeResources[localeCode], localeData); + }); + + return this.waitUntilLoaded; + } + + // This does the actual loading from external source + private loadLocaleFrom = async (localeUrl: string) => { + try + { + // Dynamically import the locale file and return it + const resourceContent = await import(localeUrl); + return resourceContent.locale; + } + catch(ex) + { throw `Cannot load locale: [${this.localeCode}] @ [${localeUrl}], error provided: ${ex}`; } + } + + // This is pretty much same as default implementation apart from wait for outstanding promises + public getMessage = async (ruleName: string, ruleOptions: any, modelResolver: IModelResolver, propertyName: string) => { + + await this.waitUntilLoaded; + + const localeResource = this.localeResources[this.localeCode]; + const ruleResource: LocaleString = localeResource[ruleName] || localeResource["default"] || `Cannot find rule for ${ruleName}`; + + if(typeof ruleResource === "string") + { return ruleResource; } + + if(ruleResource.length === 3 || propertyName == null) + { return (ruleResource)(modelResolver, propertyName, ruleOptions); } + + const propertyValue = modelResolver.resolve(propertyName); + return (ruleResource)(propertyValue, ruleOptions); + } +} +``` + +That is quite a bit of code there, but at a high level its basically resolving locales dynamically from a given path, which may seem a bit pointless but if you imagine an i18n scenario with a back end. You could change the `loadLocaleFrom` to do an async call to get you all related translations and cache them, or even just have `getMessage` do a realtime async call to the back end with the locale code and the tag (rulename), then you could optionally cache it etc. + +There are many different ways to implement this interface, but this rough example should give you some idea as to how you can implement your own async handlers which would hook up to whatever back end you need. + +#### Using it + +Currently treacherous loads a lot of stuff automatically, this may change going forward but right now if you want to use your own handler you would need to make your own entry points like so: + +```ts +import {FieldErrorProcessor, RuleResolver, ValidationGroupBuilder, ruleRegistry, RulesetBuilder, ILocaleHandler} from "treacherous"; +import {DynamicLocaleHandler} from "./my-handlers/dynamic-locale-handler"; + +const defaultLocaleCode = "en-us"; + +const dynamicLocaleHandler = new DynamicLocaleHandler(); +dynamicLocaleHandler.registerLocale(defaultLocaleCode); +dynamicLocaleHandler.useLocale(defaultLocaleCode); + +const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, dynamicLocaleHandler); +const ruleResolver = new RuleResolver(); + +export function createRuleset(withRuleVerification = false): RulesetBuilder +{ + const rulesetBuilder = withRuleVerification ? new RulesetBuilder(ruleRegistry) : new RulesetBuilder(); + return rulesetBuilder.create(); +} + +export function createGroup(): ValidationGroupBuilder +{ return new ValidationGroupBuilder(fieldErrorProcessor, ruleResolver, dynamicLocaleHandler).create(); } + +export const localeHandler: ILocaleHandler = dynamicLocaleHandler; + +export function supplementLocale(localeCode: string, localeResource: any) { + dynamicLocaleHandler.supplementLocaleFrom(localeCode, localeResource); +} +``` + +Then wherever you would normally do `import {createRuleset, createGroup} from "treacherous";` change it to `import {createRuleset, createGroup} from "my-custom-exposer";`. \ No newline at end of file diff --git a/docs/tips.md b/docs/tips.md index 277b03d..f4680e8 100644 --- a/docs/tips.md +++ b/docs/tips.md @@ -23,6 +23,4 @@ setup stuff or heavily customise any part of the system, just make your own entr make sure you adhere to the interfaces, you can make your own `IValidationGroup` or any other interface if you want. -The whole system was written in a very separated way making sure IoC was adhered to every step of the -way, so you can tear out chunks and put your own stuff in if you want, however in most cases you won't -need to, you will just want to do `createRuleset` and `createGroup` and be done with it. \ No newline at end of file +The whole system was written in a very separated way making sure IoC was adhered to every step of the way, so you can tear out chunks and put your own stuff in if you want, the defaults are there to have a low entry bar, however in most cases you won't need to, you will just want to do `createRuleset` and `createGroup` and be done with it. \ No newline at end of file diff --git a/docs/validation-process.md b/docs/validation-process.md index 07e711b..2c702bf 100644 --- a/docs/validation-process.md +++ b/docs/validation-process.md @@ -61,10 +61,10 @@ So inside the validation group there are a few components which do some importan - FieldErrorProcessor - PropertyResolver - RuleResolver -- ModelWatcher (Only in reactive groups) +- *ModelWatcher* (Only in reactive groups) As mentioned previously this is the *DEFAULT* ValidationGroup implementation, you are free to make your own, -however in most cases you can just swap out the dependent components and solve your problems. +however in most cases you can just swap out the dependent components and solve your problems (like how the knockout plugin works). ### FieldErrorProcessor diff --git a/docs/why-should-i-use-this.md b/docs/why-should-i-use-this.md index 09a2830..a699c25 100644 --- a/docs/why-should-i-use-this.md +++ b/docs/why-should-i-use-this.md @@ -1,26 +1,11 @@ # Why should I use it? -There are LOTS of validation frameworks out currently, some synchronous, some are async, -some work off the DOM some work off models. Some of them are tied to specific front end frameworks, -others are mainly for the node world. +There are LOTS of validation frameworks out currently, some synchronous, some are async, some work off the DOM, some work off models... Some of them are tied to specific front end frameworks, others are mainly for the node world. -However in most cases you will be hard pressed to find a easy to use async based one which is -agnostic of frameworks/platforms but can be plugged into them. This was the idea behind Treacherous, -a simple validation framework which could be shared between browser and server as well as -being able to expose MVVM style subscriptions for other frameworks to hook into. +However in most cases you will be hard pressed to find a easy to use async based one which is agnostic of frameworks/platforms but can be plugged into them. This was the idea behind Treacherous, a simple validation framework which could be shared between browser and server as well as being able to expose MVVM style subscriptions for other frameworks to hook into. -If you share code between multiple worlds (i.e nodejs, browser, mobile) then you may have had -issues before where you are tied into a specific framework for your front ends and want to -re-use your models in the back end as a contractual layer or something. In these cases -you often either end up maintaining 2 sets of validation which is ok, but it could be better, -and this is where Treacherous attempts to improve this approach. +If you share code between multiple worlds (i.e nodejs, browser, mobile, desktop) then you may have had issues before where you are tied into a specific framework for your front ends and want to re-use your models in the back end as a contractual layer or something. In these cases you often either end up maintaining 2 sets of validation which is ok, but it could be better, and this is where Treacherous attempts to improve this approach. -It is also useful for libraries which contain pure data concerns and have no notion -of front end frameworks, so you may have one central library and have one front end -using ng and one front end using aurelia or knockout for different devices etc. -In this case you can have validation as a pure data concern and just plug the validation -logic into your MVVM framework so it will automatically listen for the validation concerns -letting you re-use more of your code base in a more consistent way. +It is also useful for libraries which contain pure data concerns and have no notion of front end frameworks, so you may have one central library and have one front end using ng and one front end using aurelia or knockout for different devices etc. In this case you can have validation as a pure data concern and just plug the validation logic into your MVVM framework so it will automatically listen for the validation concerns letting you re-use more of your code base in a more consistent way. -Ultimately each framework tends to have it's own validation system, but with Treacherous you -can write your validation rules once, and consume them anywhere (that has a compatible binding layer, if there isn't one, just write your own or ask us to help you out in gitter). \ No newline at end of file +Ultimately each framework tends to have it's own validation system, but with Treacherous you can write your validation rules once, and consume them anywhere (that has a compatible binding layer, if there isn't one, just write your own or ask us to help you out in gitter). \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 96aff46..cfb78b0 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -10,6 +10,7 @@ module.exports = function(config) { }, webpack: { + devtool: "source-map", module: { loaders: [ { test: /\.tsx?$/, loader: 'ts-loader', exclude: /node_modules/} @@ -47,6 +48,13 @@ module.exports = function(config) { 'text/x-typescript': ['ts','tsx'] }, + customLaunchers: { + 'ChromeDebug': { + base: 'Chrome', + flags: [ '--remote-debugging-port=9333' ] + } + }, + phantomjsLauncher: { // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom) exitOnResourceError: true diff --git a/package-lock.json b/package-lock.json index e3999d0..b592781 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,54 +1,61 @@ { "name": "treacherous", - "version": "0.16.0", + "version": "0.16.2", "lockfileVersion": 1, + "requires": true, "dependencies": { "@types/bluebird": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.8.tgz", - "integrity": "sha512-rBfrD56OxaqVjghtVqp2EEX0ieHkRk6IefDVrQXIVGvlhDOEBTvZff4Q02uo84ukVkH4k5eB1cPKGDM2NlFL8A==", + "version": "3.5.18", + "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.18.tgz", + "integrity": "sha512-OTPWHmsyW18BhrnG5x8F7PzeZ2nFxmHGb42bZn79P9hl+GI5cMzyPgQTwNjbem0lJhoru/8vtjAFCUOu3+gE2w==", "dev": true }, "@types/chai": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.1.tgz", - "integrity": "sha512-DWrdkraJO+KvBB7+Jc6AuDd2+fwV6Z9iK8cqEEoYpcurYrH7GiUZmwjFuQIIWj5HhFz6NsSxdN72YMIHT7Fy2Q==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.6.tgz", + "integrity": "sha512-IzRWv/7IpaMm41KLLJcaaD/UKit/MrHu4rWs61oWiVjuk4aKWe2eopx3XyhAHhSnMyB5EeCMRr2AsJtuQ8COWA==", "dev": true }, "@types/chai-spies": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/@types/chai-spies/-/chai-spies-0.0.0.tgz", "integrity": "sha1-lFpi5CJj7qPEN2FPI+2WI1Sp8qQ=", - "dev": true + "dev": true, + "requires": { + "@types/chai": "4.0.6" + } }, "@types/fs-extra": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-4.0.0.tgz", "integrity": "sha512-PlKJw6ujJXLJjbvB3T0UCbY3jibKM6/Ya5cc9j1q+mYDeK3aR4Dp+20ZwxSuvJr9mIoPxp7+IL4aMOEvsscRTA==", - "dev": true + "dev": true, + "requires": { + "@types/node": "8.0.53" + } }, "@types/handlebars": { - "version": "4.0.35", - "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.35.tgz", - "integrity": "sha512-5Z+wbzPcyzLcnzqx9ADjVXEqQ/JBzA15rWNUgu2UWTqBbIf/uKN7/unVZhgfCg/fii8sjTo3FkHwMTywXIMNQQ==", + "version": "4.0.31", + "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.31.tgz", + "integrity": "sha1-p/umb6/kJxOu6I7sqNuRGS7+bnI=", "dev": true }, "@types/highlight.js": { - "version": "9.1.9", - "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.1.9.tgz", - "integrity": "sha1-7WM2lV6vIzt163kjubHzc9BF7wE=", + "version": "9.1.8", + "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.1.8.tgz", + "integrity": "sha1-0ifxi8uPPxh+FpZfJESFmgRol1g=", "dev": true }, "@types/lodash": { - "version": "4.14.71", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.71.tgz", - "integrity": "sha512-x9E8HYuhmcQJPjhTd+t0oRXiQCJXoRPSzCOgYKggxtvNb/kGw8RrbdZzCXrQ6i/i4o0TettxyouY7UdbqkS4AQ==", + "version": "4.14.74", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.74.tgz", + "integrity": "sha512-BZknw3E/z3JmCLqQVANcR17okqVTPZdlxvcIz0fJiJVLUCbSH1hK3zs9r634PVSmrzAxN+n/fxlVRiYoArdOIQ==", "dev": true }, "@types/marked": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.0.28.tgz", - "integrity": "sha1-RLp1Tp+lFDJYPo6zCnxN0km1L6o=", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.3.0.tgz", + "integrity": "sha512-CSf9YWJdX1DkTNu9zcNtdCcn6hkRtB5ILjbhRId4ZOQqx30fXmdecuaXhugQL6eyrhuXtaHJ7PHI+Vm7k9ZJjg==", "dev": true }, "@types/minimatch": { @@ -64,22 +71,29 @@ "dev": true }, "@types/node": { - "version": "8.0.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.17.tgz", - "integrity": "sha512-iq0LxqG6P9GV/2bVA2AQAQ58NvneLdVDVs9dJ+88Jk6gDK9opNC0SushdYqlAyvxo0dk0NJjTKCenq/l3AKtuA==", + "version": "8.0.53", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.53.tgz", + "integrity": "sha512-54Dm6NwYeiSQmRB1BLXKr5GELi0wFapR1npi8bnZhEcu84d/yQKqnwwXQ56hZ0RUbTG6L5nqDZaN3dgByQXQRQ==", "dev": true }, "@types/shelljs": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.7.2.tgz", - "integrity": "sha512-NanpA4ybcKXr32Zg7sgHvOfir/AeoOdN7+8TpnWueHkmPhVZLSPWU4LLl7y7d2FG08jaxE18HZjlATjttmjHCQ==", - "dev": true + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.7.0.tgz", + "integrity": "sha1-IpwVfGvB5n1rmQ5sXhjb0v9Yz/A=", + "dev": true, + "requires": { + "@types/node": "8.0.53" + } }, "accepts": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", - "dev": true + "dev": true, + "requires": { + "mime-types": "2.1.16", + "negotiator": "0.6.1" + } }, "acorn": { "version": "3.3.0", @@ -97,7 +111,12 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } }, "amdefine": { "version": "1.0.1", @@ -109,13 +128,19 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } }, "ansi-red": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } }, "ansi-regex": { "version": "2.1.1", @@ -139,7 +164,11 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } }, "archy": { "version": "1.0.0", @@ -151,7 +180,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } }, "arr-flatten": { "version": "1.1.0", @@ -193,7 +225,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } }, "array-uniq": { "version": "1.0.3", @@ -213,12 +248,6 @@ "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", "dev": true }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -229,7 +258,10 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true + "dev": true, + "requires": { + "util": "0.10.3" + } }, "assert-plus": { "version": "0.2.0", @@ -308,7 +340,10 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", "dev": true, - "optional": true + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } }, "beeper": { "version": "1.1.1", @@ -320,7 +355,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true + "dev": true, + "requires": { + "callsite": "1.0.0" + } }, "big.js": { "version": "3.1.3", @@ -341,34 +379,58 @@ "dev": true }, "bluebird": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", "dev": true }, "body-parser": { "version": "1.17.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", "integrity": "sha1-+IkqvI+eYn1Crtr7yma/WrmRBO4=", - "dev": true + "dev": true, + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.2", + "debug": "2.6.7", + "depd": "1.1.1", + "http-errors": "1.6.1", + "iconv-lite": "0.4.15", + "on-finished": "2.3.0", + "qs": "6.4.0", + "raw-body": "2.2.0", + "type-is": "1.6.15" + } }, "boom": { "version": "2.10.1", "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true + "dev": true, + "requires": { + "hoek": "2.16.3" + } }, "brace-expansion": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } }, "braces": { "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } }, "browser-stdout": { "version": "1.3.0", @@ -380,19 +442,30 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-0.4.0.tgz", "integrity": "sha1-BnFJtmjfMcS1hTPgLQHoBthgjiw=", - "dev": true + "dev": true, + "requires": { + "inherits": "2.0.3" + } }, "browserify-zlib": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true + "dev": true, + "requires": { + "pako": "0.2.9" + } }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -415,10 +488,14 @@ "dev": true }, "bump-regex": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/bump-regex/-/bump-regex-2.7.0.tgz", - "integrity": "sha1-SiHiU3ETR2wCa+WIuKfd3vGTRkE=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/bump-regex/-/bump-regex-2.8.0.tgz", + "integrity": "sha512-prjTDXzGEbTvCgDVEAKvOGpAqZnz5EmzJNiYi2L72TjNy+T91w3SbPgofnAsLXZZBqZigv+kN4oF5oEIyr6LPw==", "dev": true, + "requires": { + "semver": "5.4.1", + "xtend": "4.0.1" + }, "dependencies": { "semver": { "version": "5.4.1", @@ -450,7 +527,11 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } }, "caseless": { "version": "0.11.0", @@ -462,13 +543,25 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } }, "chai": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", - "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", - "dev": true + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.5" + } }, "chai-spies": { "version": "0.7.1", @@ -480,7 +573,14 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } }, "check-error": { "version": "1.0.2", @@ -492,13 +592,28 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } }, "cliui": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, "dependencies": { "wordwrap": { "version": "0.0.2", @@ -521,10 +636,13 @@ "dev": true }, "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } }, "color-name": { "version": "1.1.3", @@ -543,6 +661,9 @@ "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", "dev": true, + "requires": { + "lodash": "4.17.4" + }, "dependencies": { "lodash": { "version": "4.17.4", @@ -556,7 +677,10 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } }, "commander": { "version": "2.11.0", @@ -593,6 +717,11 @@ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.0.tgz", "integrity": "sha1-U/fUPFHF5D+ByP3QMyHGMb5o1hE=", "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.0.6", + "typedarray": "0.0.6" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -604,7 +733,15 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "0.10.31", + "util-deprecate": "1.0.2" + } } } }, @@ -612,13 +749,22 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz", "integrity": "sha1-aU6NIGgb/kkCgsiriGvpjwn0L+c=", - "dev": true + "dev": true, + "requires": { + "debug": "2.6.7", + "finalhandler": "1.0.3", + "parseurl": "1.3.1", + "utils-merge": "1.0.0" + } }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true + "dev": true, + "requires": { + "date-now": "0.1.4" + } }, "constants-browserify": { "version": "1.0.0", @@ -633,9 +779,9 @@ "dev": true }, "convert-source-map": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", "dev": true }, "cookie": { @@ -657,34 +803,55 @@ "dev": true }, "cross-env": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.0.1.tgz", - "integrity": "sha1-/05y6kO0faJIa0On8gQ7JgnkSRM=", - "dev": true + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.1.tgz", + "integrity": "sha512-Wtvr+z0Z06KO1JxjfRRsPC+df7biIOiuV4iZ73cThjFGkH+ULBZq1MkBdywEcJC4cTDbO6c8IjgRjfswx3YTBA==", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "is-windows": "1.0.1" + } }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true + "dev": true, + "requires": { + "boom": "2.10.1" + } }, "crypto-browserify": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.3.0.tgz", "integrity": "sha1-ufx1u0oO1h3PHNXa6W6zDJw+UGw=", - "dev": true + "dev": true, + "requires": { + "browserify-aes": "0.4.0", + "pbkdf2-compat": "2.0.1", + "ripemd160": "0.2.0", + "sha.js": "2.2.6" + } }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } }, "custom-event": { "version": "1.0.1", @@ -697,6 +864,9 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -722,7 +892,10 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz", "integrity": "sha1-krrR9tBbu2u6Isyoi80OyJTChh4=", - "dev": true + "dev": true, + "requires": { + "ms": "2.0.0" + } }, "decamelize": { "version": "1.2.0", @@ -731,30 +904,36 @@ "dev": true }, "deep-eql": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", - "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, - "dependencies": { - "type-detect": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", - "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", - "dev": true - } + "requires": { + "type-detect": "4.0.5" } }, "defaults": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dev": true + "dev": true, + "requires": { + "clone": "1.0.2" + } }, "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.1" + } }, "delayed-stream": { "version": "1.0.0", @@ -778,7 +957,10 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-0.1.0.tgz", "integrity": "sha1-STXe39lIhkjgBrASlWbpOGcR6mM=", - "dev": true + "dev": true, + "requires": { + "fs-exists-sync": "0.1.0" + } }, "di": { "version": "0.0.1", @@ -796,7 +978,13 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true + "dev": true, + "requires": { + "custom-event": "1.0.1", + "ent": "2.2.0", + "extend": "3.0.1", + "void-elements": "2.0.1" + } }, "dom-walk": { "version": "0.1.1", @@ -820,19 +1008,31 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } }, "duplexify": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", - "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.1.tgz", + "integrity": "sha512-j5goxHTwVED1Fpe5hh3q9R93Kip0Bg2KVAt4f8CEYM3UEwYcPSvWbXaUQOzdX/HtiNomipv+gU7ASQPDbV7pGQ==", "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" + }, "dependencies": { "end-of-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", - "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", - "dev": true + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.0" + } }, "isarray": { "version": "1.0.0", @@ -840,23 +1040,29 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true - }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -865,7 +1071,10 @@ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "dev": true, - "optional": true + "optional": true, + "requires": { + "jsbn": "0.1.1" + } }, "ee-first": { "version": "1.1.1", @@ -890,12 +1099,18 @@ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, + "requires": { + "once": "1.3.3" + }, "dependencies": { "once": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "dev": true + "dev": true, + "requires": { + "wrappy": "1.0.2" + } } } }, @@ -904,12 +1119,23 @@ "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", "integrity": "sha1-jef5eJXSDTm4X4ju7nd7K9QrE9Q=", "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "ws": "1.1.2" + }, "dependencies": { "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.2" + } }, "ms": { "version": "0.7.2", @@ -924,6 +1150,20 @@ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", "integrity": "sha1-F5jtk0USRkU9TG9jXXogH+lA1as=", "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.2", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, "dependencies": { "component-emitter": { "version": "1.2.1", @@ -935,7 +1175,10 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.2" + } }, "ms": { "version": "0.7.2", @@ -949,13 +1192,27 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", "integrity": "sha1-k3sHnwAH0Ik+xW1GyyILjLQ1Igo=", - "dev": true + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.7", + "wtf-8": "1.0.0" + } }, "enhanced-resolve": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -975,13 +1232,19 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true + "dev": true, + "requires": { + "prr": "0.0.0" + } }, "error-ex": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } }, "es6-promise": { "version": "4.0.5", @@ -1010,7 +1273,16 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + } }, "eventemitter3": { "version": "1.2.0", @@ -1029,6 +1301,11 @@ "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", "dev": true, + "requires": { + "array-slice": "0.2.3", + "array-unique": "0.2.1", + "braces": "0.1.5" + }, "dependencies": { "array-slice": { "version": "0.2.3", @@ -1040,13 +1317,20 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true + "dev": true, + "requires": { + "expand-range": "0.1.1" + } }, "expand-range": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true + "dev": true, + "requires": { + "is-number": "0.1.1", + "repeat-string": "0.2.2" + } }, "is-number": { "version": "0.1.1", @@ -1066,19 +1350,28 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } }, "expand-range": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true + "dev": true, + "requires": { + "fill-range": "2.2.3" + } }, "expand-tilde": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", "integrity": "sha1-C4HrqJflo9MdHD0QL48BRB5VlEk=", - "dev": true + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } }, "extend": { "version": "3.0.1", @@ -1091,6 +1384,9 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", "dev": true, + "requires": { + "kind-of": "1.1.0" + }, "dependencies": { "kind-of": { "version": "1.1.0", @@ -1104,13 +1400,22 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } }, "extract-zip": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.5.0.tgz", "integrity": "sha1-ksz22B73Cp+kwXRxFMzvbYaIpsQ=", "dev": true, + "requires": { + "concat-stream": "1.5.0", + "debug": "0.7.4", + "mkdirp": "0.5.0", + "yauzl": "2.4.1" + }, "dependencies": { "debug": { "version": "0.7.4", @@ -1128,7 +1433,10 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", - "dev": true + "dev": true, + "requires": { + "minimist": "0.0.8" + } } } }, @@ -1142,13 +1450,20 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", - "dev": true + "dev": true, + "requires": { + "chalk": "1.1.3", + "time-stamp": "1.1.0" + } }, "fd-slicer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", - "dev": true + "dev": true, + "requires": { + "pend": "1.2.0" + } }, "filename-regex": { "version": "2.0.1", @@ -1160,13 +1475,29 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } }, "finalhandler": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz", "integrity": "sha1-70fneVDpmXgOhgIqVg4yF+DQzIk=", - "dev": true + "dev": true, + "requires": { + "debug": "2.6.7", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.1", + "statuses": "1.3.1", + "unpipe": "1.0.0" + } }, "find-index": { "version": "0.1.1", @@ -1178,25 +1509,45 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } }, "findup-sync": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.4.3.tgz", "integrity": "sha1-QAQ5Kee8YK3wt/SCfExudaDeyhI=", - "dev": true + "dev": true, + "requires": { + "detect-file": "0.1.0", + "is-glob": "2.0.1", + "micromatch": "2.3.11", + "resolve-dir": "0.1.1" + } }, "fined": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.2.0", + "parse-filepath": "1.0.1" + }, "dependencies": { "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } } } }, @@ -1222,7 +1573,10 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true + "dev": true, + "requires": { + "for-in": "1.0.2" + } }, "forever-agent": { "version": "0.6.1", @@ -1234,7 +1588,12 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.16" + } }, "from": { "version": "0.1.7", @@ -1246,7 +1605,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true + "dev": true, + "requires": { + "null-check": "1.0.0" + } }, "fs-exists-sync": { "version": "0.1.0", @@ -1259,6 +1621,11 @@ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "2.4.0", + "klaw": "1.3.1" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -1274,669 +1641,15 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", "dev": true, - "optional": true, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } + "requires": { + "globule": "0.1.0" } }, - "gaze": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", - "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", - "dev": true - }, "generate-function": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", @@ -1947,7 +1660,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", - "dev": true + "dev": true, + "requires": { + "is-property": "1.0.2" + } }, "get-func-name": { "version": "2.0.0", @@ -1966,6 +1682,9 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -1979,49 +1698,91 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "glob-base": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } }, "glob-parent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true + "dev": true, + "requires": { + "is-glob": "2.0.1" + } }, "glob-stream": { "version": "3.1.18", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, "dependencies": { "glob": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", - "dev": true + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } }, "minimatch": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } } } }, @@ -2029,19 +1790,29 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", - "dev": true + "dev": true, + "requires": { + "gaze": "0.5.2" + } }, "glob2base": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", - "dev": true + "dev": true, + "requires": { + "find-index": "0.1.1" + } }, "global": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", "dev": true, + "requires": { + "min-document": "2.19.0", + "process": "0.5.2" + }, "dependencies": { "process": { "version": "0.5.2", @@ -2056,6 +1827,10 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", "integrity": "sha1-6lo77ULG1s6ZWk+KEmm12uIjgo0=", "dev": true, + "requires": { + "global-prefix": "0.1.5", + "is-windows": "0.2.0" + }, "dependencies": { "is-windows": { "version": "0.2.0", @@ -2070,6 +1845,12 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", "integrity": "sha1-jTvGuNo8qBEqFg2NSW/wRiv+948=", "dev": true, + "requires": { + "homedir-polyfill": "1.0.1", + "ini": "1.3.4", + "is-windows": "0.2.0", + "which": "1.3.0" + }, "dependencies": { "is-windows": { "version": "0.2.0", @@ -2080,22 +1861,47 @@ } }, "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", - "dev": true + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } }, "globule": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, "dependencies": { "glob": { "version": "3.1.21", "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } }, "graceful-fs": { "version": "1.2.3", @@ -2119,7 +1925,11 @@ "version": "0.2.14", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } } } }, @@ -2127,13 +1937,19 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", - "dev": true + "dev": true, + "requires": { + "sparkles": "1.0.0" + } }, "graceful-fs": { "version": "3.0.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "dev": true + "dev": true, + "requires": { + "natives": "1.1.0" + } }, "graceful-readlink": { "version": "1.0.1", @@ -2151,13 +1967,35 @@ "version": "3.9.1", "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", - "dev": true + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.0.3", + "liftoff": "2.3.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + } }, "gulp-bump": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/gulp-bump/-/gulp-bump-2.7.0.tgz", - "integrity": "sha1-TDdQvOk8XYFv6aFU5mGd1QmoUtg=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/gulp-bump/-/gulp-bump-2.8.0.tgz", + "integrity": "sha512-syvQLax2xQo1EDFJxanUqX1rv+YkVB4/cx/THN+uInmSjMGezT1/6WYLdXqkBAMQUw2KlyB2melz0DzrHdwkLA==", "dev": true, + "requires": { + "bump-regex": "2.8.0", + "plugin-error": "0.1.2", + "plugin-log": "0.1.0", + "semver": "5.4.1", + "through2": "2.0.3" + }, "dependencies": { "semver": { "version": "5.4.1", @@ -2172,18 +2010,32 @@ "resolved": "https://registry.npmjs.org/gulp-es6-exporter/-/gulp-es6-exporter-0.0.5.tgz", "integrity": "sha1-mGWdNeQDdj4kX2k4Uw6jIBPRF8c=", "dev": true, + "requires": { + "gulp-util": "3.0.8", + "through2": "0.6.5" + }, "dependencies": { "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } } } }, @@ -2198,6 +2050,13 @@ "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -2209,45 +2068,84 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } }, "vinyl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } } } }, "gulp-typedoc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/gulp-typedoc/-/gulp-typedoc-2.0.2.tgz", - "integrity": "sha1-XYA0z9O0b19OGz1Kb+3coVVWmVM=", - "dev": true + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/gulp-typedoc/-/gulp-typedoc-2.1.1.tgz", + "integrity": "sha512-3DW+ZgEUZpOHSySmVlksthS2W3t1Wn+/6HYq6QGAZdxoy9+8UHV5xYhl4aNAikISHbX8W4f4o2U7tLKS+f8jAw==", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "gulp-util": "3.0.8" + } }, "gulp-typescript": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.1.tgz", - "integrity": "sha1-Us136caETjuai93YjohM60al23k=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-3.2.3.tgz", + "integrity": "sha512-Np2sJXgtDUwIAoMtlJ9uXsVmpu1FWXlKZw164hLuo56uJa7qo5W2KZ0yAYiYH/HUsaz5L0O2toMOcLIokpFCPg==", "dev": true, + "requires": { + "gulp-util": "3.0.8", + "source-map": "0.5.6", + "through2": "2.0.3", + "vinyl-fs": "2.4.4" + }, "dependencies": { "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } }, "glob-stream": { "version": "5.3.5", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, "dependencies": { "isarray": { "version": "0.0.1", @@ -2259,7 +2157,13 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } }, "string_decoder": { "version": "0.10.31", @@ -2271,7 +2175,11 @@ "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } } } }, @@ -2291,7 +2199,10 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } }, "isarray": { "version": "1.0.0", @@ -2303,43 +2214,90 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", - "dev": true + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.3" + } }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } }, "unique-stream": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } }, "vinyl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } }, "vinyl-fs": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", - "dev": true + "dev": true, + "requires": { + "duplexify": "3.5.1", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } } } }, @@ -2348,6 +2306,15 @@ "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.0.tgz", "integrity": "sha1-DfAzHXKg0wLj434QlIXd3zPG0co=", "dev": true, + "requires": { + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash": "4.17.4", + "make-error-cause": "1.2.2", + "through2": "2.0.3", + "uglify-js": "3.0.27", + "vinyl-sourcemaps-apply": "0.2.1" + }, "dependencies": { "lodash": { "version": "4.17.4", @@ -2362,6 +2329,26 @@ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.0.0", + "fancy-log": "1.3.0", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, "dependencies": { "object-assign": { "version": "3.0.0", @@ -2375,13 +2362,22 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", - "dev": true + "dev": true, + "requires": { + "glogg": "1.0.0" + } }, "handlebars": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, "dependencies": { "async": { "version": "1.5.2", @@ -2393,7 +2389,10 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true + "dev": true, + "requires": { + "amdefine": "1.0.1" + } }, "uglify-js": { "version": "2.8.29", @@ -2401,11 +2400,16 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, "dependencies": { "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true, "optional": true } @@ -2417,19 +2421,31 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", - "dev": true + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.11.0", + "is-my-json-valid": "2.16.0", + "pinkie-promise": "2.0.1" + } }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } }, "has-binary": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", - "dev": true + "dev": true, + "requires": { + "isarray": "0.0.1" + } }, "has-cors": { "version": "1.1.0", @@ -2447,19 +2463,32 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true + "dev": true, + "requires": { + "sparkles": "1.0.0" + } }, "hasha": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", - "dev": true + "dev": true, + "requires": { + "is-stream": "1.1.0", + "pinkie-promise": "2.0.1" + } }, "hawk": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } }, "highlight.js": { "version": "9.12.0", @@ -2477,7 +2506,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } }, "hosted-git-info": { "version": "2.5.0", @@ -2490,6 +2522,12 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", "integrity": "sha1-X4uO2YrKVFZWv1cplzh/kEpyIlc=", "dev": true, + "requires": { + "depd": "1.1.0", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, "dependencies": { "depd": { "version": "1.1.0", @@ -2503,13 +2541,22 @@ "version": "1.16.2", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", - "dev": true + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } }, "http-signature": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.1" + } }, "https-browserify": { "version": "0.0.1", @@ -2533,7 +2580,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true + "dev": true, + "requires": { + "repeating": "2.0.1" + } }, "indexof": { "version": "0.0.1", @@ -2545,7 +2595,11 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } }, "inherits": { "version": "2.0.3", @@ -2570,6 +2624,10 @@ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.2.6.tgz", "integrity": "sha1-IN5p89uULvLYe5wto28XIjWxtes=", "dev": true, + "requires": { + "is-relative": "0.2.1", + "is-windows": "0.2.0" + }, "dependencies": { "is-windows": { "version": "0.2.0", @@ -2589,7 +2647,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true + "dev": true, + "requires": { + "binary-extensions": "1.9.0" + } }, "is-buffer": { "version": "1.1.5", @@ -2601,7 +2662,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } }, "is-dotfile": { "version": "1.0.3", @@ -2613,7 +2677,10 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } }, "is-extendable": { "version": "0.1.1", @@ -2631,25 +2698,40 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } }, "is-my-json-valid": { "version": "2.16.0", "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=", - "dev": true + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } }, "is-number": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true + "dev": true, + "requires": { + "kind-of": "3.2.2" + } }, "is-path-cwd": { "version": "1.0.0", @@ -2661,19 +2743,28 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", - "dev": true + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } }, "is-path-inside": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", - "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "requires": { + "isobject": "3.0.1" + }, "dependencies": { "isobject": { "version": "3.0.1", @@ -2705,7 +2796,10 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.2.1.tgz", "integrity": "sha1-0n9MfVFtF1+2ENuEu+7yPDvJeqU=", - "dev": true + "dev": true, + "requires": { + "is-unc-path": "0.1.2" + } }, "is-stream": { "version": "1.1.0", @@ -2723,7 +2817,10 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-0.1.2.tgz", "integrity": "sha1-arBTpyVzwQJQ/0FqOBTDUXivObk=", - "dev": true + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } }, "is-utf8": { "version": "0.2.1", @@ -2766,6 +2863,9 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", "dev": true, + "requires": { + "isarray": "1.0.0" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -2798,7 +2898,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true + "dev": true, + "requires": { + "jsonify": "0.0.0" + } }, "json-stringify-safe": { "version": "5.0.1", @@ -2823,6 +2926,9 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "dev": true, + "requires": { + "graceful-fs": "4.1.11" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -2850,6 +2956,12 @@ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -2864,6 +2976,35 @@ "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.0.tgz", "integrity": "sha1-b3oaQGRG+i4YfslTmGmPTO5HYmk=", "dev": true, + "requires": { + "bluebird": "3.5.1", + "body-parser": "1.17.2", + "chokidar": "1.7.0", + "colors": "1.1.2", + "combine-lists": "1.0.1", + "connect": "3.6.2", + "core-js": "2.4.1", + "di": "0.0.1", + "dom-serialize": "2.2.1", + "expand-braces": "0.1.2", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "http-proxy": "1.16.2", + "isbinaryfile": "3.0.2", + "lodash": "3.10.1", + "log4js": "0.6.38", + "mime": "1.3.6", + "minimatch": "3.0.4", + "optimist": "0.6.1", + "qjobs": "1.1.5", + "range-parser": "1.2.0", + "rimraf": "2.6.1", + "safe-buffer": "5.1.1", + "socket.io": "1.7.3", + "source-map": "0.5.6", + "tmp": "0.0.31", + "useragent": "2.2.1" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -2883,7 +3024,11 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true + "dev": true, + "requires": { + "fs-access": "1.0.1", + "which": "1.3.0" + } }, "karma-firefox-launcher": { "version": "1.0.1", @@ -2895,13 +3040,20 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", - "dev": true + "dev": true, + "requires": { + "minimist": "1.2.0" + } }, "karma-phantomjs-launcher": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz", "integrity": "sha1-0jyjSAG9qYY60xjju0vUBisTrNI=", "dev": true, + "requires": { + "lodash": "4.17.4", + "phantomjs-prebuilt": "2.1.14" + }, "dependencies": { "lodash": { "version": "4.17.4", @@ -2911,11 +3063,35 @@ } } }, + "karma-sourcemap-loader": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/karma-sourcemap-loader/-/karma-sourcemap-loader-0.3.7.tgz", + "integrity": "sha1-kTIsd/jxPUb+0GKwQuEAnUxFBdg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + } + } + }, "karma-webpack": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.4.tgz", "integrity": "sha1-Pi1PSLqUqHjhxmu44a5hKJh6F1s=", "dev": true, + "requires": { + "async": "0.9.2", + "loader-utils": "0.2.17", + "lodash": "3.10.1", + "source-map": "0.1.43", + "webpack-dev-middleware": "1.12.0" + }, "dependencies": { "lodash": { "version": "3.10.1", @@ -2927,7 +3103,10 @@ "version": "0.1.43", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true + "dev": true, + "requires": { + "amdefine": "1.0.1" + } } } }, @@ -2941,13 +3120,19 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } }, "klaw": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", "dev": true, + "requires": { + "graceful-fs": "4.1.11" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -2969,6 +3154,9 @@ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, + "requires": { + "readable-stream": "2.3.3" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -2980,13 +3168,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -2994,13 +3194,31 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.3.0.tgz", "integrity": "sha1-qY8v9nGD2Lp8+soQVIvX/wVQs4U=", - "dev": true + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "0.4.3", + "fined": "1.1.0", + "flagged-respawn": "0.3.2", + "lodash.isplainobject": "4.0.6", + "lodash.isstring": "4.0.1", + "lodash.mapvalues": "4.6.0", + "rechoir": "0.6.2", + "resolve": "1.4.0" + } }, "load-json-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -3008,11 +3226,20 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } } } }, @@ -3020,7 +3247,13 @@ "version": "0.2.17", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true + "dev": true, + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } }, "lodash": { "version": "1.0.2", @@ -3032,7 +3265,11 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } }, "lodash._basecopy": { "version": "3.0.1", @@ -3098,13 +3335,21 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", - "dev": true + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } }, "lodash.escape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } }, "lodash.isarguments": { "version": "3.1.0", @@ -3140,7 +3385,12 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } }, "lodash.mapvalues": { "version": "4.6.0", @@ -3158,25 +3408,50 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } }, "lodash.templatesettings": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } }, "log4js": { "version": "0.6.38", "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", "integrity": "sha1-LElBFmldb7JUgJQ9P8hy5mKlIv0=", "dev": true, + "requires": { + "readable-stream": "1.0.34", + "semver": "4.3.6" + }, "dependencies": { "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } } } }, @@ -3190,13 +3465,21 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } }, "lru-cache": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } }, "make-error": { "version": "1.3.0", @@ -3208,7 +3491,10 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", - "dev": true + "dev": true, + "requires": { + "make-error": "1.3.0" + } }, "map-cache": { "version": "0.2.2", @@ -3245,6 +3531,10 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -3256,13 +3546,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -3270,13 +3572,28 @@ "version": "3.7.0", "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, + "requires": { + "readable-stream": "2.3.3" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -3288,13 +3605,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -3308,7 +3637,22 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.3" + } }, "mime": { "version": "1.3.6", @@ -3326,19 +3670,28 @@ "version": "2.1.16", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.16.tgz", "integrity": "sha1-K4WKUuXs1RbbiXrCvodIeDBpjiM=", - "dev": true + "dev": true, + "requires": { + "mime-db": "1.29.0" + } }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true + "dev": true, + "requires": { + "dom-walk": "0.1.1" + } }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } }, "minimist": { "version": "1.2.0", @@ -3351,6 +3704,9 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, + "requires": { + "minimist": "0.0.8" + }, "dependencies": { "minimist": { "version": "0.0.8", @@ -3365,30 +3721,60 @@ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.0.tgz", "integrity": "sha512-pIU2PJjrPYvYRqVpjXzj76qltO9uBYI7woYAMoxbSefsa+vqAfptjoeevd6bUgwD0mPIO+hv9f7ltvsNreL2PA==", "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, "dependencies": { "commander": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } }, "debug": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true + "dev": true, + "requires": { + "ms": "2.0.0" + } }, "glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "dev": true + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } }, "supports-color": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", - "dev": true + "dev": true, + "requires": { + "has-flag": "1.0.0" + } } } }, @@ -3402,14 +3788,10 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true - }, - "nan": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", - "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", "dev": true, - "optional": true + "requires": { + "duplexer2": "0.0.2" + } }, "natives": { "version": "1.1.0", @@ -3428,6 +3810,31 @@ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-0.7.0.tgz", "integrity": "sha1-PicsCBnjCJNeJmdECNevDhSRuDs=", "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.3.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.3", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -3440,12 +3847,24 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + }, "dependencies": { "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } } @@ -3455,13 +3874,22 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "4.3.6", + "validate-npm-package-license": "3.0.1" + } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true + "dev": true, + "requires": { + "remove-trailing-separator": "1.0.2" + } }, "null-check": { "version": "1.0.0", @@ -3498,12 +3926,21 @@ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.0.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, "dependencies": { "for-own": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true + "dev": true, + "requires": { + "for-in": "1.0.2" + } }, "isobject": { "version": "3.0.1", @@ -3517,31 +3954,48 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } }, "object.pick": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", "integrity": "sha1-tTkr7peC2m2ft9avr1OXefEjTCs=", - "dev": true + "dev": true, + "requires": { + "isobject": "2.1.0" + } }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true + "dev": true, + "requires": { + "ee-first": "1.1.1" + } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true + "dev": true, + "requires": { + "wrappy": "1.0.2" + } }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, "dependencies": { "minimist": { "version": "0.0.10", @@ -3561,7 +4015,12 @@ "version": "0.3.8", "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", - "dev": true + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } }, "ordered-read-streams": { "version": "0.1.0", @@ -3587,6 +4046,12 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, "pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -3597,19 +4062,33 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.1.tgz", "integrity": "sha1-FZ1hVdQ5BNFsEO9piRHaHpGWm3M=", - "dev": true + "dev": true, + "requires": { + "is-absolute": "0.2.6", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true + "dev": true, + "requires": { + "error-ex": "1.3.1" + } }, "parse-passwd": { "version": "1.0.0", @@ -3621,19 +4100,28 @@ "version": "0.0.3", "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", - "dev": true + "dev": true, + "requires": { + "better-assert": "1.0.2" + } }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", - "dev": true + "dev": true, + "requires": { + "better-assert": "1.0.2" + } }, "parseuri": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", - "dev": true + "dev": true, + "requires": { + "better-assert": "1.0.2" + } }, "parseurl": { "version": "1.3.1", @@ -3657,7 +4145,10 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } }, "path-is-absolute": { "version": "1.0.1", @@ -3681,7 +4172,10 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } }, "path-root-regex": { "version": "0.1.2", @@ -3694,12 +4188,23 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true } } }, @@ -3713,7 +4218,10 @@ "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true + "dev": true, + "requires": { + "through": "2.3.8" + } }, "pbkdf2-compat": { "version": "2.0.1", @@ -3732,19 +4240,33 @@ "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.14.tgz", "integrity": "sha1-1T0xH8+30dCN2yQBRVjxGIxRbaA=", "dev": true, + "requires": { + "es6-promise": "4.0.5", + "extract-zip": "1.5.0", + "fs-extra": "1.0.0", + "hasha": "2.2.0", + "kew": "0.7.0", + "progress": "1.1.8", + "request": "2.79.0", + "request-progress": "2.0.1", + "which": "1.2.14" + }, "dependencies": { "which": { "version": "1.2.14", "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", - "dev": true + "dev": true, + "requires": { + "isexe": "2.0.0" + } } } }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true }, "pinkie": { @@ -3757,19 +4279,33 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true + "dev": true, + "requires": { + "pinkie": "2.0.4" + } }, "plugin-error": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, + "requires": { + "ansi-cyan": "0.1.1", + "ansi-red": "0.1.1", + "arr-diff": "1.1.0", + "arr-union": "2.1.0", + "extend-shallow": "1.1.4" + }, "dependencies": { "arr-diff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-slice": "0.2.3" + } }, "array-slice": { "version": "0.2.3", @@ -3784,12 +4320,20 @@ "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", "integrity": "sha1-hgSc9qsQgzOYqTHzaJy67nteEzM=", "dev": true, + "requires": { + "chalk": "1.1.3", + "dateformat": "1.0.12" + }, "dependencies": { "dateformat": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } } } }, @@ -3875,18 +4419,28 @@ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, "dependencies": { "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, + "requires": { + "kind-of": "3.2.2" + }, "dependencies": { "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } } } }, @@ -3894,7 +4448,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } } } }, @@ -3908,31 +4465,57 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", "integrity": "sha1-mUl2z2pQlqQRYoQEkvC9xdbn+5Y=", - "dev": true + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.15", + "unpipe": "1.0.0" + } }, "read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } }, "read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } }, "readable-stream": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } }, "readdirp": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -3950,13 +4533,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -3964,19 +4559,30 @@ "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true + "dev": true, + "requires": { + "resolve": "1.4.0" + } }, "redent": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } }, "regex-cache": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", - "dev": true + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3", + "is-primitive": "2.0.0" + } }, "remove-trailing-separator": { "version": "1.0.2", @@ -4000,7 +4606,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true + "dev": true, + "requires": { + "is-finite": "1.0.2" + } }, "replace-ext": { "version": "0.0.1", @@ -4013,6 +4622,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.16", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.4.3", + "uuid": "3.1.0" + }, "dependencies": { "qs": { "version": "6.3.2", @@ -4026,7 +4657,10 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", - "dev": true + "dev": true, + "requires": { + "throttleit": "1.0.0" + } }, "require-dir": { "version": "0.3.2", @@ -4044,25 +4678,38 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==", - "dev": true + "dev": true, + "requires": { + "path-parse": "1.0.5" + } }, "resolve-dir": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", "integrity": "sha1-shklmlYC+sXFxJatiUpujMQwJh4=", - "dev": true + "dev": true, + "requires": { + "expand-tilde": "1.2.2", + "global-modules": "0.2.3" + } }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true + "dev": true, + "requires": { + "align-text": "0.1.4" + } }, "rimraf": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true + "dev": true, + "requires": { + "glob": "7.1.2" + } }, "ripemd160": { "version": "0.2.0", @@ -4116,7 +4763,10 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } }, "shebang-regex": { "version": "1.0.0", @@ -4128,7 +4778,12 @@ "version": "0.7.8", "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", - "dev": true + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.3", + "rechoir": "0.6.2" + } }, "sigmund": { "version": "1.0.1", @@ -4146,19 +4801,34 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true + "dev": true, + "requires": { + "hoek": "2.16.3" + } }, "socket.io": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", "integrity": "sha1-uK+cq6AJSeVo42nxMn6pvp6iRhs=", "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.3", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.7.3", + "socket.io-parser": "2.3.1" + }, "dependencies": { "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.2" + } }, "ms": { "version": "0.7.2", @@ -4179,12 +4849,19 @@ "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, "dependencies": { "debug": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.2" + } }, "ms": { "version": "0.7.2", @@ -4199,6 +4876,19 @@ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", "integrity": "sha1-sw6GqhDV7zVGYBwJzeR2Xjgdo3c=", "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.3", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, "dependencies": { "component-emitter": { "version": "1.2.1", @@ -4210,7 +4900,10 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.2" + } }, "ms": { "version": "0.7.2", @@ -4225,12 +4918,21 @@ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, "dependencies": { "debug": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", - "dev": true + "dev": true, + "requires": { + "ms": "0.7.1" + } }, "ms": { "version": "0.7.1", @@ -4262,7 +4964,10 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } }, "spdx-expression-parse": { "version": "1.0.4", @@ -4280,13 +4985,26 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true + "dev": true, + "requires": { + "through": "2.3.8" + } }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, "dependencies": { "assert-plus": { "version": "1.0.0", @@ -4307,6 +5025,10 @@ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -4318,13 +5040,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -4332,7 +5066,10 @@ "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true + "dev": true, + "requires": { + "duplexer": "0.1.1" + } }, "stream-consume": { "version": "0.1.0", @@ -4345,6 +5082,13 @@ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -4356,13 +5100,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -4388,25 +5144,39 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } }, "strip-bom": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", - "dev": true + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } }, "strip-bom-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" + }, "dependencies": { "strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } } } }, @@ -4414,7 +5184,10 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } }, "supports-color": { "version": "2.0.0", @@ -4423,9 +5196,9 @@ "dev": true }, "tapable": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.7.tgz", - "integrity": "sha1-5GwNqsuyuKmLmwzqD0BSEFgX7Vw=", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, "throttleit": { @@ -4445,6 +5218,10 @@ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + }, "dependencies": { "isarray": { "version": "1.0.0", @@ -4456,13 +5233,25 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } } } }, @@ -4470,13 +5259,20 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", - "dev": true + "dev": true, + "requires": { + "through2": "2.0.3", + "xtend": "4.0.1" + } }, "tildify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", - "dev": true + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } }, "time-stamp": { "version": "1.1.0", @@ -4488,25 +5284,38 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.3.tgz", "integrity": "sha512-+JAqyNgg+M8+gXIrq2EeUr4kZqRz47Ysco7X5QKRGScRE9HIHckyHD1asozSFGeqx2nmPCgA8T5tIGVO0ML7/w==", - "dev": true + "dev": true, + "requires": { + "global": "4.3.2", + "setimmediate": "1.0.5" + } }, "tmp": { "version": "0.0.31", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", "integrity": "sha1-jzirlDjhcxXl29izZX6L+yd65Kc=", - "dev": true + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } }, "to-absolute-glob": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", "dev": true, + "requires": { + "extend-shallow": "2.0.1" + }, "dependencies": { "extend-shallow": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } } } }, @@ -4526,7 +5335,10 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true + "dev": true, + "requires": { + "punycode": "1.4.1" + } }, "trim-newlines": { "version": "1.0.0", @@ -4535,22 +5347,36 @@ "dev": true }, "ts-loader": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-2.3.2.tgz", - "integrity": "sha512-KcQvWwla5nviCMX1511iKVsLfrx97Hbah6l5awE1HNL6eiyAzb3gSO8b5yasB6fK/qGukLpu9czWcd/AGGFy/g==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-3.2.0.tgz", + "integrity": "sha512-4g8BF3gKWBHeM1jAFmMPHofuJlwTUU4iHJ0i3mwXRHwy74RU6VBOgl9kDVMGpapvGcMlVqV5G6v9XmV66Qqd7w==", "dev": true, + "requires": { + "chalk": "2.3.0", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "semver": "5.4.1" + }, "dependencies": { "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true + "dev": true, + "requires": { + "color-convert": "1.9.1" + } }, "chalk": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz", - "integrity": "sha512-Mp+FXEI+FrwY/XYV45b2YD3E8i3HwnEAoFcM0qlZzq/RZ9RwWitt2Y/c7cqRAz70U7hfekqx6qNYthuKFO6K0g==", - "dev": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } }, "has-flag": { "version": "2.0.0", @@ -4562,7 +5388,12 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true + "dev": true, + "requires": { + "big.js": "3.1.3", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } }, "semver": { "version": "5.4.1", @@ -4571,17 +5402,20 @@ "dev": true }, "supports-color": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.2.1.tgz", - "integrity": "sha512-qxzYsob3yv6U+xMzPrv170y8AwGP7i74g+pbixCfD6rgso8BscLT2qXIuz6TpOaiJZ3mFgT5O9lyT9nMU4LfaA==", - "dev": true + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } } } }, "tslib": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", - "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.8.0.tgz", + "integrity": "sha512-ymKWWZJST0/CkgduC2qkzjMOWr4bouhuURNXCn/inEX0L57BnRG6FhX76o7FOnsjHazCjfU2LKeSrlS2sIKQJg==" }, "tty-browserify": { "version": "0.0.0", @@ -4603,16 +5437,20 @@ "optional": true }, "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", + "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", "dev": true }, "type-is": { "version": "1.6.15", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", - "dev": true + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.16" + } }, "typedarray": { "version": "0.0.6", @@ -4621,16 +5459,40 @@ "dev": true }, "typedoc": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.8.0.tgz", - "integrity": "sha1-1xcrxqKZZPRRt2CcAFvq2t7+I2E=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.9.0.tgz", + "integrity": "sha512-numP0CtcUK4I1Vssw6E1N/FjyJWpWqhLT4Zb7Gw3i7ca3ElnYh6z41Y/tcUhMsMYn6L8b67E/Fu4XYYKkNaLbA==", "dev": true, + "requires": { + "@types/fs-extra": "4.0.0", + "@types/handlebars": "4.0.31", + "@types/highlight.js": "9.1.8", + "@types/lodash": "4.14.74", + "@types/marked": "0.3.0", + "@types/minimatch": "2.0.29", + "@types/shelljs": "0.7.0", + "fs-extra": "4.0.2", + "handlebars": "4.0.11", + "highlight.js": "9.12.0", + "lodash": "4.17.4", + "marked": "0.3.6", + "minimatch": "3.0.4", + "progress": "2.0.0", + "shelljs": "0.7.8", + "typedoc-default-themes": "0.5.0", + "typescript": "2.4.1" + }, "dependencies": { "fs-extra": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", - "integrity": "sha1-f8DGyJV/mD9X8waiTlud3Y0N2IA=", - "dev": true + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } }, "graceful-fs": { "version": "4.1.11", @@ -4639,10 +5501,13 @@ "dev": true }, "jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } }, "lodash": { "version": "4.17.4", @@ -4671,16 +5536,20 @@ "dev": true }, "typescript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", - "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.6.2.tgz", + "integrity": "sha1-PFtv1/beCRQmkCfwPAlGdY92c6Q=", "dev": true }, "uglify-js": { "version": "3.0.27", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.27.tgz", "integrity": "sha512-HD8CmxPXUI62v5tweiulMcP/apAtx1DXGcNZkhKQZyC+MTrTsoCBb8yPAwVrbvpgw3EpRU76bRe6axjIiCYcQg==", - "dev": true + "dev": true, + "requires": { + "commander": "2.11.0", + "source-map": "0.5.6" + } }, "uglify-to-browserify": { "version": "1.0.2", @@ -4723,6 +5592,10 @@ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, "dependencies": { "punycode": { "version": "1.3.2", @@ -4743,6 +5616,10 @@ "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", "dev": true, + "requires": { + "lru-cache": "2.2.4", + "tmp": "0.0.31" + }, "dependencies": { "lru-cache": { "version": "2.2.4", @@ -4757,6 +5634,9 @@ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, + "requires": { + "inherits": "2.0.1" + }, "dependencies": { "inherits": { "version": "2.0.1", @@ -4788,7 +5668,10 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", - "dev": true + "dev": true, + "requires": { + "user-home": "1.1.1" + } }, "vali-date": { "version": "1.0.0", @@ -4800,25 +5683,47 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } }, "verror": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true + "dev": true, + "requires": { + "extsprintf": "1.0.2" + } }, "vinyl": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true + "dev": true, + "requires": { + "clone": "1.0.2", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } }, "vinyl-fs": { "version": "0.3.14", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, "dependencies": { "clone": { "version": "0.2.0", @@ -4830,19 +5735,33 @@ "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } }, "vinyl": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } } } }, @@ -4850,13 +5769,19 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true + "dev": true, + "requires": { + "source-map": "0.5.6" + } }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true + "dev": true, + "requires": { + "indexof": "0.0.1" + } }, "void-elements": { "version": "2.0.1", @@ -4869,6 +5794,11 @@ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-0.2.9.tgz", "integrity": "sha1-Yuqkq15bo1/fwBgnVibjwPXj+ws=", "dev": true, + "requires": { + "async": "0.9.2", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + }, "dependencies": { "graceful-fs": { "version": "4.1.11", @@ -4883,6 +5813,23 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-1.15.0.tgz", "integrity": "sha1-T/MfU9sDM55VFkqdRo7gMklo/pg=", "dev": true, + "requires": { + "acorn": "3.3.0", + "async": "1.5.2", + "clone": "1.0.2", + "enhanced-resolve": "0.9.1", + "interpret": "0.6.6", + "loader-utils": "0.2.17", + "memory-fs": "0.3.0", + "mkdirp": "0.5.1", + "node-libs-browser": "0.7.0", + "optimist": "0.6.1", + "supports-color": "3.2.3", + "tapable": "0.1.10", + "uglify-js": "2.7.5", + "watchpack": "0.2.9", + "webpack-core": "0.6.9" + }, "dependencies": { "async": { "version": "1.5.2", @@ -4895,6 +5842,11 @@ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz", "integrity": "sha1-TW5omzcl+GCQknzMhs2fFjW4ni4=", "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.2.0", + "tapable": "0.1.10" + }, "dependencies": { "memory-fs": { "version": "0.2.0", @@ -4926,25 +5878,44 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", "integrity": "sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA=", - "dev": true + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } }, "readable-stream": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } }, "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true + "dev": true, + "requires": { + "has-flag": "1.0.0" + } }, "tapable": { "version": "0.1.10", @@ -4957,6 +5928,12 @@ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.7.5.tgz", "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.5.6", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, "dependencies": { "async": { "version": "0.2.10", @@ -4973,12 +5950,19 @@ "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", "dev": true, + "requires": { + "source-list-map": "0.1.8", + "source-map": "0.4.4" + }, "dependencies": { "source-map": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true + "dev": true, + "requires": { + "amdefine": "1.0.1" + } } } }, @@ -4987,6 +5971,13 @@ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz", "integrity": "sha1-007++y7dp+HTtdvgcolRMhllFwk=", "dev": true, + "requires": { + "memory-fs": "0.4.1", + "mime": "1.3.6", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + }, "dependencies": { "time-stamp": { "version": "2.0.0", @@ -5000,7 +5991,10 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true + "dev": true, + "requires": { + "isexe": "2.0.0" + } }, "window-size": { "version": "0.1.0", @@ -5024,7 +6018,11 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", "integrity": "sha1-iiRPoFJAHgjJiGz0SoUYnh/UBn8=", - "dev": true + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } }, "wtf-8": { "version": "1.0.0", @@ -5055,6 +6053,12 @@ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + }, "dependencies": { "camelcase": { "version": "1.2.1", @@ -5068,7 +6072,10 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true + "dev": true, + "requires": { + "fd-slicer": "1.0.1" + } }, "yeast": { "version": "0.1.2", diff --git a/package.json b/package.json index 604618d..00f622c 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,14 @@ { "name": "treacherous", - "version": "0.16.2", + "version": "0.17.0", "license": "MIT", "dependencies": { "property-resolver": "^0.0.11", "event-js": "^0.1.3", - "tslib": "^1.7.1" + "tslib": "^1.8.0" }, "main": "dist/commonjs/index.js", + "module": "dist/es2015/index.js", "types": "dist/definitions/index.d.ts", "bugs": { "url": "https://github.com/grofit/treacherous/issues" @@ -22,24 +23,25 @@ "validate" ], "scripts": { - "test": "karma start --single-run --browsers PhantomJS ./karma.conf.js" + "test": "karma start --single-run --browsers PhantomJS ./karma.conf.js", + "test-debug": "karma start --single-run --browsers ChromeDebug ./karma.conf.js" }, "repository": { "type": "git", "url": "https://github.com/grofit/treacherous" }, "devDependencies": { - "bluebird": "^3.5.0", - "chai": "^4.1.0", + "bluebird": "^3.5.1", + "chai": "^4.1.2", "chai-spies": "^0.7.1", - "cross-env": "^5.0.1", - "del": "^2.2.2", + "cross-env": "^5.1.1", + "del": "^3.0.0", "gulp": "^3.9.1", - "gulp-bump": "^2.7.0", + "gulp-bump": "^2.8.0", "gulp-es6-exporter": "^0.0.5", "gulp-rename": "^1.2.2", - "gulp-typedoc": "^2.0.2", - "gulp-typescript": "^3.2.1", + "gulp-typedoc": "^2.1.1", + "gulp-typescript": "^3.2.3", "gulp-uglify": "^3.0.0", "karma": "^1.7.0", "karma-firefox-launcher": "^1.0.1", @@ -53,12 +55,12 @@ "phantomjs-prebuilt": "^2.1.14", "require-dir": "^0.3.2", "rimraf": "^2.6.1", - "ts-loader": "^2.3.2", - "typedoc": "^0.8.0", - "typescript": "^2.4.2", + "ts-loader": "^3.2.0", + "typedoc": "^0.9.0", + "typescript": "^2.6.2", "webpack": "^1.15.0", - "@types/bluebird": "^3.5.8", - "@types/chai": "^4.0.1", + "@types/bluebird": "^3.5.18", + "@types/chai": "^4.0.6", "@types/chai-spies": "^0.0.0", "@types/mocha": "^2.2.41" } diff --git a/readme.md b/readme.md index 66637ba..e99647e 100644 --- a/readme.md +++ b/readme.md @@ -20,7 +20,7 @@ Treacherous is an attempt to bring some consistency to validation in the javascr - Works in browser or server - Write once, use anywhere - Can be integrated with any view framework (i.e vue, knockout, aurelia etc) - +- Generic pipeline for localization customization ## Features @@ -194,14 +194,22 @@ The framework comes with built in validators for the following: ### Creating custom rules -So if you want to make your own rule you need to do 2 things, one is create the rule handler class -which should conform to the `IValidationRule` interface, once you have done the validator you then need to register it so the validation system is aware of it, -to do that you need to call `Treacherous.ruleRegistry.registerRule(new SomeCustomValidator());`. +Creating custom rules is pretty easy, you need to: + +- Implement `IValidationRule` with your custom logic (JS users just match the signatures of the interface) +- Add validation messages for supported locales +- Register your rule with the ruleRegistry -To find out more read the [Custom Rules](docs/custom-rules.md) docs. +There is a whole doc on the subject which can be found in the docs section. --- +### Localization + +There is a whole doc on the subject, but at a high level *BY DEFAULT* treacherous will pre-load the `en-us` locale for you which will be used by the library, but you can easily supplement that locale, or register and use new locales. You can also completely replace the default localization handler, but see the docs for more info on this. + +--- + ## Documentation Just look in the `docs` folder for more documentation on certain scenarios or subject matters. @@ -234,12 +242,6 @@ output files, we don't minify by default. You can also run `gulp run-tests` which will run the tests to make sure everythign works as expected. -### Translations - -This is a todo, if needed this will probably be implemented by having a class representing the -validation message for a given language linked via the `ruleName` for now all messages are in -english but feel free to raise this if you need this functionality sooner rather than later. - --- ## Credits diff --git a/src/builders/reactive-validation-group-builder.ts b/src/builders/reactive-validation-group-builder.ts index 6f553dc..fb94d9b 100644 --- a/src/builders/reactive-validation-group-builder.ts +++ b/src/builders/reactive-validation-group-builder.ts @@ -7,6 +7,7 @@ import {IModelResolverFactory} from "../factories/imodel-resolver-factory"; import {IModelWatcherFactory} from "../factories/imodel-watcher-factory"; import {ModelWatcherFactory} from "../factories/model-watcher-factory"; import {ModelResolverFactory} from "../factories/model-resolver-factory"; +import {ILocaleHandler} from "../localization/ilocale-handler"; export class ReactiveValidationGroupBuilder { @@ -16,7 +17,8 @@ export class ReactiveValidationGroupBuilder private modelResolverFactory: IModelResolverFactory; constructor(private fieldErrorProcessor: FieldErrorProcessor, - private ruleResolver: RuleResolver) {} + private ruleResolver: RuleResolver, + private localeHandler: ILocaleHandler) {} public create = (): ReactiveValidationGroupBuilder => { @@ -51,9 +53,9 @@ export class ReactiveValidationGroupBuilder public build = (model: any, ruleset: Ruleset): IReactiveValidationGroup => { - var validationGroup = new ReactiveValidationGroup(this.fieldErrorProcessor, + const validationGroup = new ReactiveValidationGroup(this.fieldErrorProcessor, this.ruleResolver, this.modelResolverFactory, this.modelWatcherFactory, - model, ruleset, this.refreshRate); + this.localeHandler, model, ruleset, this.refreshRate); if(this.validateOnStart) { validationGroup.validate(); } diff --git a/src/builders/ruleset-builder.ts b/src/builders/ruleset-builder.ts index 9efe2b6..470658d 100644 --- a/src/builders/ruleset-builder.ts +++ b/src/builders/ruleset-builder.ts @@ -16,8 +16,8 @@ export class RulesetBuilder constructor(private ruleRegistry?: RuleRegistry) {} protected extractPropertyName(predicate: (model: T) => any) : string { - let regex = /.*\.([\w]*);/; - let predicateString = predicate.toString(); + const regex = /.*\.([\w]*);/; + const predicateString = predicate.toString(); return regex.exec(predicateString)[1]; } @@ -75,8 +75,8 @@ export class RulesetBuilder return this; } - public addDynamicRule = (virtualPropertyName: string, validate: ICompositeValidationRule["validate"], getMessage: ((modelResolver: IModelResolver) => string) | string) => { - let compositeRule = new DynamicCompositeValidationRule(virtualPropertyName, validate, getMessage); + public addDynamicRule = (virtualPropertyName: string, validate: ICompositeValidationRule["validate"]) => { + const compositeRule = new DynamicCompositeValidationRule(virtualPropertyName, validate); this.internalRuleset.compositeRules[virtualPropertyName] = compositeRule; return this; } @@ -100,7 +100,7 @@ export class RulesetBuilder this.verifyRuleNameIsValid(rule); this.verifyExistingProperty(); - let ruleLink = new RuleLink(rule, ruleOptions); + const ruleLink = new RuleLink(rule, ruleOptions); this.currentRule = ruleLink; this.internalRuleset.addRule(this.currentProperty, new ForEachRule(ruleLink)); diff --git a/src/builders/validation-group-builder.ts b/src/builders/validation-group-builder.ts index e1cc219..1a859b6 100644 --- a/src/builders/validation-group-builder.ts +++ b/src/builders/validation-group-builder.ts @@ -6,6 +6,7 @@ import {IValidationGroup} from "../validation-groups/ivalidation-group"; import {ReactiveValidationGroupBuilder} from "./reactive-validation-group-builder"; import {IModelResolverFactory} from "../factories/imodel-resolver-factory"; import {ModelResolverFactory} from "../factories/model-resolver-factory"; +import {ILocaleHandler} from "../localization/ilocale-handler"; export class ValidationGroupBuilder { @@ -13,7 +14,8 @@ export class ValidationGroupBuilder private validateOnStart: boolean; constructor(private fieldErrorProcessor: FieldErrorProcessor, - private ruleResolver: RuleResolver) {} + private ruleResolver: RuleResolver, + private localeHandler: ILocaleHandler) {} public create = (): ValidationGroupBuilder => { @@ -24,7 +26,7 @@ export class ValidationGroupBuilder public asReactiveGroup = (): ReactiveValidationGroupBuilder => { - var reactiveBuilder = new ReactiveValidationGroupBuilder(this.fieldErrorProcessor, this.ruleResolver) + const reactiveBuilder = new ReactiveValidationGroupBuilder(this.fieldErrorProcessor, this.ruleResolver, this.localeHandler) .create() .withModelResolverFactory(this.modelResolverFactory); @@ -44,7 +46,8 @@ export class ValidationGroupBuilder public build = (model: any, ruleset: Ruleset): IValidationGroup => { - var validationGroup = new ValidationGroup(this.fieldErrorProcessor, this.ruleResolver, this.modelResolverFactory, model, ruleset); + const validationGroup = new ValidationGroup(this.fieldErrorProcessor, this.ruleResolver, + this.modelResolverFactory, this.localeHandler, model, ruleset); if(this.validateOnStart) { validationGroup.validate(); } diff --git a/src/exposer.ts b/src/exposer.ts index 167f16f..adb81d3 100644 --- a/src/exposer.ts +++ b/src/exposer.ts @@ -4,16 +4,30 @@ import {ValidationGroupBuilder} from "./builders/validation-group-builder"; import {ruleRegistry} from "./rule-registry-setup"; import {RulesetBuilder} from "./builders/ruleset-builder"; -var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); -var ruleResolver = new RuleResolver(); +import {ILocaleHandler} from "./localization/ilocale-handler"; +import {DefaultLocaleHandler} from "./localization/default-locale-handler"; +import {locale as defaultLocale} from "./locales/en-us"; + +const defaultLocaleCode = "en-us"; + +const defaultLocaleHandler = new DefaultLocaleHandler(); +defaultLocaleHandler.registerLocale(defaultLocaleCode, defaultLocale); +defaultLocaleHandler.useLocale(defaultLocaleCode); + +const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); +const ruleResolver = new RuleResolver(); export function createRuleset(withRuleVerification = false): RulesetBuilder { - var rulesetBuilder = withRuleVerification ? new RulesetBuilder(ruleRegistry) : new RulesetBuilder(); + const rulesetBuilder = withRuleVerification ? new RulesetBuilder(ruleRegistry) : new RulesetBuilder(); return rulesetBuilder.create(); } export function createGroup(): ValidationGroupBuilder -{ - return new ValidationGroupBuilder(fieldErrorProcessor, ruleResolver).create(); +{ return new ValidationGroupBuilder(fieldErrorProcessor, ruleResolver, defaultLocaleHandler).create(); } + +export const localeHandler: ILocaleHandler = defaultLocaleHandler; + +export function supplementLocale(localeCode: string, localeResource: any) { + defaultLocaleHandler.supplementLocaleFrom(localeCode, localeResource); } \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 791fac3..2f4083a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,28 +3,27 @@ export * from "./rule-registry-setup" export * from "./builders/reactive-validation-group-builder" export * from "./builders/ruleset-builder" export * from "./builders/validation-group-builder" +export * from "./events/model-state-changed-event" +export * from "./events/property-changed-event" +export * from "./events/property-state-changed-event" export * from "./factories/imodel-resolver-factory" export * from "./factories/imodel-watcher-factory" export * from "./factories/model-resolver-factory" export * from "./factories/model-watcher-factory" -export * from "./events/model-state-changed-event" -export * from "./events/property-changed-event" -export * from "./events/property-state-changed-event" export * from "./helpers/comparer-helper" export * from "./helpers/type-helper" +export * from "./locales/en-us" +export * from "./localization/default-locale-handler" +export * from "./localization/ilocale-handler" +export * from "./localization/locale-string" export * from "./processors/field-error-processor" export * from "./processors/field-has-error" export * from "./processors/ifield-error-processor" export * from "./processors/validation-error" +export * from "./promises/promise-counter" export * from "./resolvers/imodel-resolver" export * from "./resolvers/iproperty-resolver" export * from "./resolvers/model-resolver" -export * from "./promises/promise-counter" -export * from "./rulesets/for-each-rule" -export * from "./rulesets/irule-resolver" -export * from "./rulesets/rule-link" -export * from "./rulesets/rule-resolver" -export * from "./rulesets/ruleset" export * from "./rules/advanced-regex-rule" export * from "./rules/date-validation-rule" export * from "./rules/decimal-validation-rule" @@ -43,12 +42,17 @@ export * from "./rules/regex-validation-rule" export * from "./rules/required-validation-rule" export * from "./rules/rule-registry" export * from "./rules/step-validation-rule" -export * from "./watcher/imodel-watcher" -export * from "./watcher/model-watcher" -export * from "./watcher/property-watcher" +export * from "./rulesets/for-each-rule" +export * from "./rulesets/irule-resolver" +export * from "./rulesets/rule-link" +export * from "./rulesets/rule-resolver" +export * from "./rulesets/ruleset" export * from "./validation-groups/ireactive-validation-group" export * from "./validation-groups/ivalidation-group" export * from "./validation-groups/reactive-validation-group" export * from "./validation-groups/validation-group" +export * from "./watcher/imodel-watcher" +export * from "./watcher/model-watcher" +export * from "./watcher/property-watcher" export * from "./rules/composite/dynamic-composite-validation-rule" export * from "./rules/composite/icomposite-validation-rule" diff --git a/src/locales/en-us.ts b/src/locales/en-us.ts new file mode 100644 index 0000000..e3c9622 --- /dev/null +++ b/src/locales/en-us.ts @@ -0,0 +1,25 @@ +import {IModelResolver} from "../resolvers/imodel-resolver"; + +export const locale = +{ + "default": "This field is invalid", + "required": "This field is required", + "date": (value: any) => `This field contains "${value}" which is not a valid date`, + "decimal": (value: any) => `This field contains ${value} which is not a decimal value`, + "equal": (value: any, optionsOrValue: any) => `This field is ${value} but should be equal to ${optionsOrValue.value || optionsOrValue}`, + "notEqual": (value: any, optionsOrValue: any) => `This field is ${value} but should not be equal to ${optionsOrValue.value || optionsOrValue}`, + "isoDate": (value: any) => `This field contains "${value}" which is not a valid ISO date`, + "maxLength": (value: any, maxLength: number) => `This field has a length of ${value.length} but should contain no more than ${maxLength}`, + "minLength": (value: any, minLength: number) => `This field has a length of ${value.length} but should more than ${minLength}`, + "maxValue": (value: any, maxValue: number) => `This field has a value of ${value} but should be less than or equal to ${maxValue}`, + "minValue": (value: any, minValue: number) => `This field has a value of ${value} but should be greater than or equal to ${minValue}`, + "number": (value: any) => `This field contains ${value} which is not a numeric value`, + "regex": "This field does not match the expected format", + "step": (value: any, step: number) => `This field has a value of ${value} and should be an increment of ${step}`, + "matches": (modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any) => { + const value = modelResolver.resolve(propertyName); + const fieldToMatch = optionsOrProperty.property || optionsOrProperty; + const matchingFieldValue = modelResolver.resolve(fieldToMatch); + return `This field is ${value} but should match ${matchingFieldValue}`; + }, +}; \ No newline at end of file diff --git a/src/localization/default-locale-handler.ts b/src/localization/default-locale-handler.ts new file mode 100644 index 0000000..cca2c2f --- /dev/null +++ b/src/localization/default-locale-handler.ts @@ -0,0 +1,49 @@ +import {ILocaleHandler} from "./ilocale-handler"; +import {IModelResolver} from "../resolvers/imodel-resolver"; +import {RuleLink} from "../rulesets/rule-link"; +import {LocaleString, RawLocaleStringGetter, ProcessedLocaleStringGetter} from './locale-string'; + +export class DefaultLocaleHandler implements ILocaleHandler +{ + private localeCode: string; + private localeResources: any = {}; + + public getCurrentLocale = () => { return this.localeCode; }; + + public registerLocale = async(localeCode: string, localeResource: any) => + { + this.localeCode = localeCode; + this.localeResources[this.localeCode] = localeResource; + } + + public useLocale = async(localeCode: string) => + { + if(!this.localeResources[localeCode]) + { throw `Unable to find registered locale for [${localeCode}]`; } + + this.localeCode = localeCode; + } + + public supplementLocaleFrom = async (localeCode: string, localeModule: any) => { + if(!this.localeResources[localeCode]) + { this.localeResources[localeCode] = {}; } + + for(const propertyName in localeModule) { + this.localeResources[localeCode][propertyName] = localeModule[propertyName]; + } + } + + public getMessage = async (ruleName: string, ruleOptions: any, modelResolver: IModelResolver, propertyName: string) => { + const currentLocale = this.localeResources[this.localeCode]; + const ruleResource: LocaleString = currentLocale[ruleName] || currentLocale["default"] || `Cannot find rule for ${ruleName}`; + + if(typeof ruleResource === "string") + { return ruleResource; } + + if(ruleResource.length === 3 || propertyName == null) + { return (ruleResource)(modelResolver, propertyName, ruleOptions); } + + const propertyValue = modelResolver.resolve(propertyName); + return (ruleResource)(propertyValue, ruleOptions); + } +} \ No newline at end of file diff --git a/src/localization/ilocale-handler.ts b/src/localization/ilocale-handler.ts new file mode 100644 index 0000000..43f2a77 --- /dev/null +++ b/src/localization/ilocale-handler.ts @@ -0,0 +1,10 @@ +import {IModelResolver} from "../resolvers/imodel-resolver"; +import {RuleLink} from "../rulesets/rule-link"; + +export interface ILocaleHandler +{ + getCurrentLocale(): string; + registerLocale(localeCode: string, localeDataOrOptions: any): Promise; + useLocale(localeCode: string): Promise; + getMessage(ruleName: string, ruleOptions: any, modelResolver: IModelResolver, propertyName: string) : Promise; +} \ No newline at end of file diff --git a/src/localization/locale-string.ts b/src/localization/locale-string.ts new file mode 100644 index 0000000..6263c8c --- /dev/null +++ b/src/localization/locale-string.ts @@ -0,0 +1,5 @@ +import {IModelResolver} from "../resolvers/imodel-resolver"; + +export type RawLocaleStringGetter = (modelResolver: IModelResolver, propertyName: string, options?: any) => string; +export type ProcessedLocaleStringGetter = (propertyValue: any, options?: any) => string; +export type LocaleString = string | RawLocaleStringGetter | ProcessedLocaleStringGetter; \ No newline at end of file diff --git a/src/processors/field-error-processor.ts b/src/processors/field-error-processor.ts index 90a1f62..bd2e94d 100644 --- a/src/processors/field-error-processor.ts +++ b/src/processors/field-error-processor.ts @@ -1,3 +1,4 @@ +import {ILocaleHandler} from '../localization/ilocale-handler'; import {RuleRegistry} from "../rules/rule-registry"; import {RuleLink} from "../rulesets/rule-link"; import {FieldHasError} from "./field-has-error"; @@ -6,21 +7,20 @@ import {IModelResolver} from "../resolvers/imodel-resolver"; export class FieldErrorProcessor implements IFieldErrorProcessor { - constructor(public ruleRegistry: RuleRegistry){} + constructor(public ruleRegistry: RuleRegistry, public localeHandler: ILocaleHandler){} - // Validates a single property against a model public async processRuleLink(modelResolver: IModelResolver, propertyName: any, ruleLink: RuleLink): Promise{ - let shouldRuleApply = ruleLink.appliesIf === true + const shouldRuleApply = ruleLink.appliesIf === true || ((typeof(ruleLink.appliesIf) === "function") ? (<((model:any, value: any, ruleOptions?: any) => boolean)>(ruleLink.appliesIf))(modelResolver, propertyName, ruleLink.ruleOptions) : false); if (!shouldRuleApply) { return; } - let validator = this.ruleRegistry.getRuleNamed(ruleLink.ruleName); - let options = (typeof ruleLink.ruleOptions == "function") ? ruleLink.ruleOptions() : ruleLink.ruleOptions; - let isValid = await validator.validate(modelResolver, propertyName, options); + const validator = this.ruleRegistry.getRuleNamed(ruleLink.ruleName); + const options = (typeof ruleLink.ruleOptions == "function") ? ruleLink.ruleOptions() : ruleLink.ruleOptions; + const isValid = await validator.validate(modelResolver, propertyName, options); if(isValid){ return; } @@ -33,21 +33,19 @@ export class FieldErrorProcessor implements IFieldErrorProcessor { error = ruleLink.messageOverride; } } else - { error = validator.getMessage(modelResolver, propertyName, ruleLink.ruleOptions); } + { error = await this.localeHandler.getMessage(ruleLink.ruleName, ruleLink.ruleOptions, modelResolver, propertyName); } throw new FieldHasError(error); } - // Loops through each rule on a property, adds it to a chain, then calls Promise.all - // Probably not correct, as they won't fire sequentially? Promises need to be chained public async checkFieldForErrors(modelResolver: IModelResolver, propertyName: any, rules: any): Promise { - let ruleCheck = (ruleLinkOrSet: any): Promise => { + const ruleCheck = (ruleLinkOrSet: any): Promise => { return this.processRuleLink(modelResolver, propertyName, ruleLinkOrSet); }; - let checkEachRule = (rules: any) => { - let promises: Array = []; + const checkEachRule = (rules: any) => { + const promises: Array = []; rules.forEach((rule: any) => { promises.push(ruleCheck(rule)); }); diff --git a/src/promises/promise-counter.ts b/src/promises/promise-counter.ts index f539509..6c49e12 100644 --- a/src/promises/promise-counter.ts +++ b/src/promises/promise-counter.ts @@ -6,7 +6,7 @@ export class PromiseCounter public waitForCompletion = async() : Promise => { if(!this.validationCounter) { return; } - let resolver = (resolve: Function) => { + const resolver = (resolve: Function) => { this.promiseCallbacks.push(() => resolve()); }; return new Promise(resolver); @@ -14,10 +14,10 @@ export class PromiseCounter public countPromise = async(promise: Promise) => { if(!promise) { return; } - if(!promise.then) { throw new Error("Non-Promise pass in: " + promise) } + if(!promise.then) { throw new Error("Non-Promise pass in: " + promise); } this.incrementCounter(); - let result = await promise; + const result = await promise; this.decrementCounter(); return result; } @@ -30,5 +30,5 @@ export class PromiseCounter { this.promiseCallbacks.shift()(); } } - private incrementCounter = () => { this.validationCounter++; } + private incrementCounter = () => { this.validationCounter++; }; } \ No newline at end of file diff --git a/src/resolvers/model-resolver.ts b/src/resolvers/model-resolver.ts index 21e8a0d..dace8aa 100644 --- a/src/resolvers/model-resolver.ts +++ b/src/resolvers/model-resolver.ts @@ -5,7 +5,7 @@ export class ModelResolver implements IModelResolver { constructor(private propertyResolver: IPropertyResolver, public model: any){} - resolve(propertyName: any): any { + public resolve(propertyName: any): any { return this.propertyResolver.resolveProperty(this.model, propertyName); - }; + } } diff --git a/src/rule-registry-setup.ts b/src/rule-registry-setup.ts index 5922349..5b557ed 100644 --- a/src/rule-registry-setup.ts +++ b/src/rule-registry-setup.ts @@ -1,22 +1,22 @@ import {RuleRegistry} from "./rules/rule-registry"; -import {DateValidationRule} from "./rules/date-validation-rule" -import {DecimalValidationRule} from "./rules/decimal-validation-rule" -import {EmailValidationRule} from "./rules/email-validation-rule" -import {EqualValidationRule} from "./rules/equal-validation-rule" -import {ISODateValidationRule} from "./rules/iso-date-validation-rule" -import {MaxLengthValidationRule} from "./rules/max-length-validation-rule" -import {MaxValueValidationRule} from "./rules/max-value-validation-rule" -import {MinLengthValidationRule} from "./rules/min-length-validation-rule" -import {MinValueValidationRule} from "./rules/min-value-validation-rule" -import {NotEqualValidationRule} from "./rules/not-equal-validation-rule" -import {NumberValidationRule} from "./rules/number-validation-rule" -import {RegexValidationRule} from "./rules/regex-validation-rule" -import {RequiredValidationRule} from "./rules/required-validation-rule" -import {StepValidationRule} from "./rules/step-validation-rule" +import {DateValidationRule} from "./rules/date-validation-rule"; +import {DecimalValidationRule} from "./rules/decimal-validation-rule"; +import {EmailValidationRule} from "./rules/email-validation-rule"; +import {EqualValidationRule} from "./rules/equal-validation-rule"; +import {ISODateValidationRule} from "./rules/iso-date-validation-rule"; +import {MaxLengthValidationRule} from "./rules/max-length-validation-rule"; +import {MaxValueValidationRule} from "./rules/max-value-validation-rule"; +import {MinLengthValidationRule} from "./rules/min-length-validation-rule"; +import {MinValueValidationRule} from "./rules/min-value-validation-rule"; +import {NotEqualValidationRule} from "./rules/not-equal-validation-rule"; +import {NumberValidationRule} from "./rules/number-validation-rule"; +import {RegexValidationRule} from "./rules/regex-validation-rule"; +import {RequiredValidationRule} from "./rules/required-validation-rule"; +import {StepValidationRule} from "./rules/step-validation-rule"; import {MatchesValidationRule} from "./rules/matches-validation-rule"; -export var ruleRegistry: RuleRegistry; +export let ruleRegistry: RuleRegistry; if(!ruleRegistry) { ruleRegistry = new RuleRegistry(); diff --git a/src/rules/advanced-regex-rule.ts b/src/rules/advanced-regex-rule.ts index 902745b..70e9764 100644 --- a/src/rules/advanced-regex-rule.ts +++ b/src/rules/advanced-regex-rule.ts @@ -7,7 +7,7 @@ export class AdvancedRegexValidationRule implements IValidationRule public expression: string; public message: (value: any) => string; - constructor(ruleName: string, expression: string, message: string | ((value: any)=>string)) { + constructor(ruleName: string, expression: string) { if(!ruleName || ruleName.length == 0) { throw new Error("ruleName is required, an empty rule name is invalid"); } @@ -17,21 +17,15 @@ export class AdvancedRegexValidationRule implements IValidationRule this.ruleName = ruleName; this.expression = expression; - this.message = (typeof message === "function") ? message : (): string => { return message; }; } public async validate(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value.length == 0) { return true; } return value.toString().match(this.expression) !== null; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp) { - let value = modelResolver.resolve(propertyName); - return this.message(value); - } } \ No newline at end of file diff --git a/src/rules/composite/dynamic-composite-validation-rule.ts b/src/rules/composite/dynamic-composite-validation-rule.ts index 300d150..f8c34d0 100644 --- a/src/rules/composite/dynamic-composite-validation-rule.ts +++ b/src/rules/composite/dynamic-composite-validation-rule.ts @@ -3,13 +3,6 @@ import {IModelResolver} from "../../resolvers/imodel-resolver"; export class DynamicCompositeValidationRule implements ICompositeValidationRule { - getMessage(modelResolver: IModelResolver): string { - if(typeof(this.message) === "function") - { return this.message(modelResolver); } - else - { return this.message; } - } - - constructor(public virtualPropertyName: string, public validate: ICompositeValidationRule["validate"], private message: ICompositeValidationRule["getMessage"] | string){ + constructor(public virtualPropertyName: string, public validate: ICompositeValidationRule["validate"]){ } } \ No newline at end of file diff --git a/src/rules/composite/icomposite-validation-rule.ts b/src/rules/composite/icomposite-validation-rule.ts index 78bc148..04bfda1 100644 --- a/src/rules/composite/icomposite-validation-rule.ts +++ b/src/rules/composite/icomposite-validation-rule.ts @@ -4,5 +4,4 @@ export interface ICompositeValidationRule { virtualPropertyName: string; validate(modelResolver: IModelResolver): Promise; - getMessage(modelResolver: IModelResolver): string; } \ No newline at end of file diff --git a/src/rules/date-validation-rule.ts b/src/rules/date-validation-rule.ts index 2acec68..acd2b28 100644 --- a/src/rules/date-validation-rule.ts +++ b/src/rules/date-validation-rule.ts @@ -8,16 +8,11 @@ export class DateValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return true; } return !this.invalidObjectRegex.test(new Date(value)); } - - public getMessage(modelResolver: IModelResolver, propertyName: string) { - let value = modelResolver.resolve(propertyName); - return `This field contains "${value}" which is not a valid date`; - } } \ No newline at end of file diff --git a/src/rules/decimal-validation-rule.ts b/src/rules/decimal-validation-rule.ts index cf84f24..26d543f 100644 --- a/src/rules/decimal-validation-rule.ts +++ b/src/rules/decimal-validation-rule.ts @@ -8,15 +8,10 @@ export class DecimalValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return true; } return this.decimalRegex.test(value); } - - public getMessage(modelResolver: IModelResolver, propertyName: string) { - let value = modelResolver.resolve(propertyName); - return `This field contains ${value} which is not a decimal value`; - } } \ No newline at end of file diff --git a/src/rules/email-validation-rule.ts b/src/rules/email-validation-rule.ts index fe67c91..ee3e0ef 100644 --- a/src/rules/email-validation-rule.ts +++ b/src/rules/email-validation-rule.ts @@ -8,15 +8,10 @@ export class EmailValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value === "") { return true; } return this.emailRegex.test(value); } - - public getMessage(modelResolver: IModelResolver, propertyName: string) { - let value = modelResolver.resolve(propertyName); - return `This field contains "${value}" which is not a valid email address`; - } } \ No newline at end of file diff --git a/src/rules/equal-validation-rule.ts b/src/rules/equal-validation-rule.ts index 94a969f..07ddef6 100644 --- a/src/rules/equal-validation-rule.ts +++ b/src/rules/equal-validation-rule.ts @@ -9,13 +9,13 @@ export class EqualValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return true; } let comparison = optionsOrValue.value || optionsOrValue; - let weakEquality = optionsOrValue.weakEquality || false; + const weakEquality = optionsOrValue.weakEquality || false; if(TypeHelper.isFunctionType(comparison)) { comparison = comparison(); } @@ -25,9 +25,4 @@ export class EqualValidationRule implements IValidationRule else { return ComparerHelper.simpleTypeComparer(value, comparison, weakEquality); } } - - public getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any) { - var value = modelResolver.resolve(propertyName); - return `This field is ${value} but should be equal to ${optionsOrValue.value || optionsOrValue}`; - } } \ No newline at end of file diff --git a/src/rules/iso-date-validation-rule.ts b/src/rules/iso-date-validation-rule.ts index dadc5e0..c397f5a 100644 --- a/src/rules/iso-date-validation-rule.ts +++ b/src/rules/iso-date-validation-rule.ts @@ -8,16 +8,11 @@ export class ISODateValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return true; } return this.isoDateRegex.test(value); } - - public getMessage(modelResolver: IModelResolver, propertyName: string) { - let value = modelResolver.resolve(propertyName); - return `This field contains "${value}" which is not a valid ISO date`; - } } \ No newline at end of file diff --git a/src/rules/ivalidation-rule.ts b/src/rules/ivalidation-rule.ts index dbb8c46..d652800 100644 --- a/src/rules/ivalidation-rule.ts +++ b/src/rules/ivalidation-rule.ts @@ -3,5 +3,4 @@ export interface IValidationRule { ruleName: string; validate(modelResolver: IModelResolver, propertyName: string, options?: any): Promise; - getMessage(modelResolver: IModelResolver, propertyName: string, options?: any): string; } \ No newline at end of file diff --git a/src/rules/matches-validation-rule.ts b/src/rules/matches-validation-rule.ts index ea74323..f7a55d7 100644 --- a/src/rules/matches-validation-rule.ts +++ b/src/rules/matches-validation-rule.ts @@ -11,10 +11,10 @@ export class MatchesValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any): Promise { - let fieldToMatch = optionsOrProperty.property || optionsOrProperty; - let weakEquality = optionsOrProperty.weakEquality || false; - let value = modelResolver.resolve(propertyName); - let matchingFieldValue = modelResolver.resolve(fieldToMatch); + const fieldToMatch = optionsOrProperty.property || optionsOrProperty; + const weakEquality = optionsOrProperty.weakEquality || false; + const value = modelResolver.resolve(propertyName); + const matchingFieldValue = modelResolver.resolve(fieldToMatch); if (value === undefined || value === null) { return (matchingFieldValue === undefined || matchingFieldValue === null); } @@ -23,12 +23,4 @@ export class MatchesValidationRule implements IValidationRule else { return ComparerHelper.simpleTypeComparer(value, matchingFieldValue, weakEquality); } } - - public getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrProperty: any) { - let value = modelResolver.resolve(propertyName); - let fieldToMatch = optionsOrProperty.property || optionsOrProperty; - let matchingFieldValue = modelResolver.resolve(fieldToMatch); - - return `This field is ${value} but should match ${matchingFieldValue}`; - } } \ No newline at end of file diff --git a/src/rules/max-length-validation-rule.ts b/src/rules/max-length-validation-rule.ts index a547d85..43229bb 100644 --- a/src/rules/max-length-validation-rule.ts +++ b/src/rules/max-length-validation-rule.ts @@ -7,16 +7,11 @@ export class MaxLengthValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, maxLength: number): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value.length == 0) { return true; } return value.length <= maxLength; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, maxLength: number) { - let value = modelResolver.resolve(propertyName); - return `This field has a length of ${value.length} but should contain no more than ${maxLength}`; - } } \ No newline at end of file diff --git a/src/rules/max-value-validation-rule.ts b/src/rules/max-value-validation-rule.ts index 644c554..3b4a07a 100644 --- a/src/rules/max-value-validation-rule.ts +++ b/src/rules/max-value-validation-rule.ts @@ -7,15 +7,10 @@ export class MaxValueValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, maxValue: any): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value.length == 0) { return true; } return value <= maxValue; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, maxValue: any) { - let value = modelResolver.resolve(propertyName); - return `This field has a value of ${value} but should be less than or equal to ${maxValue}`; - } } \ No newline at end of file diff --git a/src/rules/min-length-validation-rule.ts b/src/rules/min-length-validation-rule.ts index d47c661..0834080 100644 --- a/src/rules/min-length-validation-rule.ts +++ b/src/rules/min-length-validation-rule.ts @@ -7,16 +7,11 @@ export class MinLengthValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, minLength:number): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value.length == 0) { return true; } return value.length >= minLength; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, minLength: number) { - let value = modelResolver.resolve(propertyName); - return `This field has a length of ${value.length} but should more than ${minLength}`; - } } \ No newline at end of file diff --git a/src/rules/min-value-validation-rule.ts b/src/rules/min-value-validation-rule.ts index 3fc5770..c0933c9 100644 --- a/src/rules/min-value-validation-rule.ts +++ b/src/rules/min-value-validation-rule.ts @@ -7,16 +7,11 @@ export class MinValueValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, minValue: any): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value.length == 0) { return true; } return value >= minValue; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, minValue: any) { - let value = modelResolver.resolve(propertyName); - return `This field has a value of ${value} but should be greater than or equal to ${minValue}`; - } } \ No newline at end of file diff --git a/src/rules/not-equal-validation-rule.ts b/src/rules/not-equal-validation-rule.ts index 931a3bc..4821426 100644 --- a/src/rules/not-equal-validation-rule.ts +++ b/src/rules/not-equal-validation-rule.ts @@ -9,13 +9,13 @@ export class NotEqualValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return true; } let comparison = optionsOrValue.value || optionsOrValue; - let weakEquality = optionsOrValue.weakEquality || false; + const weakEquality = optionsOrValue.weakEquality || false; if(TypeHelper.isFunctionType(comparison)) { comparison = comparison(); } @@ -25,9 +25,4 @@ export class NotEqualValidationRule implements IValidationRule else { return !ComparerHelper.simpleTypeComparer(value, comparison, weakEquality); } } - - public getMessage(modelResolver: IModelResolver, propertyName: string, optionsOrValue: any) { - let value = modelResolver.resolve(propertyName); - return `This field is ${value} but should not be equal to ${optionsOrValue.value || optionsOrValue}`; - } } \ No newline at end of file diff --git a/src/rules/number-validation-rule.ts b/src/rules/number-validation-rule.ts index 4330523..e69d80b 100644 --- a/src/rules/number-validation-rule.ts +++ b/src/rules/number-validation-rule.ts @@ -8,15 +8,10 @@ export class NumberValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return true; } return this.numberRegex.test(value); } - - public getMessage(modelResolver: IModelResolver, propertyName: string) { - let value = modelResolver.resolve(propertyName); - return `This field contains ${value} which is not a numeric value`; - } } \ No newline at end of file diff --git a/src/rules/regex-validation-rule.ts b/src/rules/regex-validation-rule.ts index 0026ad9..918e616 100644 --- a/src/rules/regex-validation-rule.ts +++ b/src/rules/regex-validation-rule.ts @@ -7,15 +7,11 @@ export class RegexValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null || value.length == 0) { return true; } return value.toString().match(regexPattern) !== null; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, regexPattern: RegExp) { - return `This field does not match the expected format`; - } } \ No newline at end of file diff --git a/src/rules/required-validation-rule.ts b/src/rules/required-validation-rule.ts index db92af6..846de6e 100644 --- a/src/rules/required-validation-rule.ts +++ b/src/rules/required-validation-rule.ts @@ -7,7 +7,7 @@ export class RequiredValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, isRequired: boolean = true): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return !isRequired; } @@ -26,8 +26,4 @@ export class RequiredValidationRule implements IValidationRule return (testValue + '').length > 0; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, isRequired: boolean) { - return "This field is required"; - } } \ No newline at end of file diff --git a/src/rules/step-validation-rule.ts b/src/rules/step-validation-rule.ts index 2da9bdf..ac4b933 100644 --- a/src/rules/step-validation-rule.ts +++ b/src/rules/step-validation-rule.ts @@ -7,16 +7,11 @@ export class StepValidationRule implements IValidationRule public async validate(modelResolver: IModelResolver, propertyName: string, step: number): Promise { - let value = modelResolver.resolve(propertyName); + const value = modelResolver.resolve(propertyName); if (value === undefined || value === null) { return Promise.resolve(true); } - let dif = (value * 100) % (step * 100); + const dif = (value * 100) % (step * 100); return Math.abs(dif) < 0.00001 || Math.abs(1 - dif) < 0.00001; } - - public getMessage(modelResolver: IModelResolver, propertyName: string, step: number) { - let value = modelResolver.resolve(propertyName); - return `This field has a value of ${value} and should be an increment of ${step}`; - } } \ No newline at end of file diff --git a/src/rulesets/rule-resolver.ts b/src/rulesets/rule-resolver.ts index 844fae7..bfff081 100644 --- a/src/rulesets/rule-resolver.ts +++ b/src/rulesets/rule-resolver.ts @@ -16,10 +16,10 @@ export class RuleResolver implements IRuleResolver } public resolvePropertyRules = (propertyRoute: string, ruleset: Ruleset) => { - let propertyRouteSections = this.propertyResolver.decomposePropertyRoute(propertyRoute); - let finalProperty = propertyRouteSections[propertyRouteSections.length-1]; + const propertyRouteSections = this.propertyResolver.decomposePropertyRoute(propertyRoute); + const finalProperty = propertyRouteSections[propertyRouteSections.length-1]; - let matchingRules = this.traverseRulesForRoutes(propertyRouteSections, ruleset); + const matchingRules = this.traverseRulesForRoutes(propertyRouteSections, ruleset); if(!matchingRules) { return null; } if(matchingRules.getRulesForProperty) @@ -42,7 +42,7 @@ export class RuleResolver implements IRuleResolver } private traverseRulesForRoutes = (propertyRouteSections: Array, ruleset: any): any => { - let currentProperty = propertyRouteSections.shift(); + const currentProperty = propertyRouteSections.shift(); let childRules = ruleset; if(ruleset.rules) @@ -54,14 +54,14 @@ export class RuleResolver implements IRuleResolver if(propertyRouteSections.length == 0) { return childRules; } - let nextProperty = propertyRouteSections[0]; + const nextProperty = propertyRouteSections[0]; if(!nextProperty) { return ruleset; } if (this.isIndexRoute(nextProperty)) { propertyRouteSections.shift(); - let applicableRules: Array = []; + const applicableRules: Array = []; childRules.forEach((internalRules: any) => { if(internalRules.isForEach) { applicableRules.push(internalRules.internalRule); @@ -70,10 +70,10 @@ export class RuleResolver implements IRuleResolver if(propertyRouteSections.length > 0) { - let totalRules: Array = []; + const totalRules: Array = []; applicableRules.forEach((applicableRule: any) => { - let currentRouteSection = propertyRouteSections.slice(); - let outputRules = this.traverseRulesForRoutes(currentRouteSection, applicableRule); + const currentRouteSection = propertyRouteSections.slice(); + const outputRules = this.traverseRulesForRoutes(currentRouteSection, applicableRule); outputRules.forEach((outputRule: any) => { totalRules.push(outputRule); }); @@ -86,7 +86,7 @@ export class RuleResolver implements IRuleResolver if(propertyRouteSections.length == 0) { return childRules; } - let nextChildRule = this.getMatchingRuleForProperty(nextProperty, childRules); + const nextChildRule = this.getMatchingRuleForProperty(nextProperty, childRules); if(propertyRouteSections.length > 0) { return this.traverseRulesForRoutes(propertyRouteSections, nextChildRule); } diff --git a/src/validation-groups/ivalidation-group.ts b/src/validation-groups/ivalidation-group.ts index 1b7d78b..52e5ab9 100644 --- a/src/validation-groups/ivalidation-group.ts +++ b/src/validation-groups/ivalidation-group.ts @@ -6,7 +6,7 @@ export interface IValidationGroup modelStateChangedEvent: EventHandler; validate(): Promise; - validateProperty(propertyname: string): Promise + validateProperty(propertyname: string): Promise; getModelErrors(revalidate?: boolean): Promise; getPropertyError(propertyRoute: string, revalidate?: boolean): Promise; diff --git a/src/validation-groups/reactive-validation-group.ts b/src/validation-groups/reactive-validation-group.ts index 460bc2b..fc07d15 100644 --- a/src/validation-groups/reactive-validation-group.ts +++ b/src/validation-groups/reactive-validation-group.ts @@ -8,6 +8,7 @@ import {IReactiveValidationGroup} from "./ireactive-validation-group"; import {ValidationGroup} from "./validation-group"; import {IModelResolverFactory} from "../factories/imodel-resolver-factory"; import {IModelWatcherFactory} from "../factories/imodel-watcher-factory"; +import {ILocaleHandler} from "../localization/ilocale-handler"; export class ReactiveValidationGroup extends ValidationGroup implements IReactiveValidationGroup { @@ -17,11 +18,12 @@ export class ReactiveValidationGroup extends ValidationGroup implements IReactiv ruleResolver: IRuleResolver = new RuleResolver(), modelResolverFactory: IModelResolverFactory, private modelWatcherFactory: IModelWatcherFactory, + protected localeHandler: ILocaleHandler, model: any, ruleset: Ruleset, private refreshRate = 500) { - super(fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset); + super(fieldErrorProcessor, ruleResolver, modelResolverFactory, localeHandler, model, ruleset); this.modelWatcher = this.modelWatcherFactory.createModelWatcher(); this.modelWatcher.setupWatcher(model, ruleset, refreshRate); @@ -30,7 +32,7 @@ export class ReactiveValidationGroup extends ValidationGroup implements IReactiv private onModelChanged = (eventArgs: PropertyChangedEvent) => { this.startValidateProperty(eventArgs.propertyPath); - }; + } public release = () => { if (this.modelWatcher) diff --git a/src/validation-groups/validation-group.ts b/src/validation-groups/validation-group.ts index 0be618d..f537133 100644 --- a/src/validation-groups/validation-group.ts +++ b/src/validation-groups/validation-group.ts @@ -12,8 +12,9 @@ import {PropertyStateChangedEvent} from "../events/property-state-changed-event" import {ModelStateChangedEvent} from "../events/model-state-changed-event"; import {EventHandler} from "event-js"; import {ICompositeValidationRule} from "../rules/composite/icomposite-validation-rule"; +import {ILocaleHandler} from "../localization/ilocale-handler"; -// TODO: This class could be simplified +// TODO: This class should be simplified further if possible export class ValidationGroup implements IValidationGroup { public propertyStateChangedEvent: EventHandler; @@ -26,6 +27,7 @@ export class ValidationGroup implements IValidationGroup constructor(protected fieldErrorProcessor: IFieldErrorProcessor, protected ruleResolver: IRuleResolver = new RuleResolver(), protected modelResolverFactory: IModelResolverFactory, + protected localeHandler: ILocaleHandler, model: any, protected ruleset: Ruleset) { @@ -47,19 +49,19 @@ export class ValidationGroup implements IValidationGroup protected validatePropertyWithRuleLinks = async (propertyName: string, propertyRules: Array) => { - let activePromise = this.fieldErrorProcessor.checkFieldForErrors(this.modelResolver, propertyName, propertyRules); - let possibleErrors = await this.promiseCounter.countPromise(activePromise); - let hadErrors = this.hasErrors(); + const activePromise = this.fieldErrorProcessor.checkFieldForErrors(this.modelResolver, propertyName, propertyRules); + const possibleErrors = await this.promiseCounter.countPromise(activePromise); + const hadErrors = this.hasErrors(); if (!possibleErrors) { if (this.propertyErrors[propertyName]) { delete this.propertyErrors[propertyName]; - let eventArgs = new PropertyStateChangedEvent(propertyName, true); + const eventArgs = new PropertyStateChangedEvent(propertyName, true); this.propertyStateChangedEvent.publish(eventArgs); - let stillHasErrors = hadErrors && this.hasErrors(); + const stillHasErrors = hadErrors && this.hasErrors(); if (!stillHasErrors) { this.modelStateChangedEvent.publish(new ModelStateChangedEvent(true)); } } @@ -67,12 +69,12 @@ export class ValidationGroup implements IValidationGroup return this.promiseCounter.waitForCompletion(); } - let previousError = this.propertyErrors[propertyName]; + const previousError = this.propertyErrors[propertyName]; this.propertyErrors[propertyName] = possibleErrors; if(possibleErrors != previousError) { - let eventArgs = new PropertyStateChangedEvent(propertyName, false, possibleErrors); + const eventArgs = new PropertyStateChangedEvent(propertyName, false, possibleErrors); this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) @@ -80,19 +82,19 @@ export class ValidationGroup implements IValidationGroup } return this.promiseCounter.waitForCompletion(); - }; + } protected validatePropertyWithRuleSet = (propertyRoute: string, ruleset: Ruleset): void => { let transformedPropertyName; - for(let childPropertyName in ruleset.rules){ + for(const childPropertyName in ruleset.rules){ transformedPropertyName = `${propertyRoute}.${childPropertyName}`; this.validatePropertyWithRules(transformedPropertyName, ruleset.getRulesForProperty(childPropertyName)); } } protected validatePropertyWithRules = (propertyRoute: string, rules: any) => { - let ruleLinks: Array = []; - let ruleSets: Array = []; + const ruleLinks: Array = []; + const ruleSets: Array = []; let currentValue: any; try @@ -105,14 +107,14 @@ export class ValidationGroup implements IValidationGroup throw(ex); } - let routeEachRule = (ruleLinkOrSet: any) => { + const routeEachRule = (ruleLinkOrSet: any) => { if(ValidationGroup.isForEach(ruleLinkOrSet)) { - let isCurrentlyAnArray = TypeHelper.isArrayType(currentValue); + const isCurrentlyAnArray = TypeHelper.isArrayType(currentValue); if(isCurrentlyAnArray) { currentValue.forEach((element: any, index: number) => { - let childPropertyName = `${propertyRoute}[${index}]`; + const childPropertyName = `${propertyRoute}[${index}]`; this.validatePropertyWithRules(childPropertyName, [ruleLinkOrSet.internalRule]); }); } @@ -140,44 +142,44 @@ export class ValidationGroup implements IValidationGroup } protected startValidateProperty = async (propertyRoute: string) => { - if(this.ruleset.compositeRules !== {}) + if(Object.keys(this.ruleset.compositeRules).length > 0) { await this.validateCompositeRules(); } if(this.ruleset.compositeRules[propertyRoute] !== undefined) { return; } - let rulesForProperty = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); + const rulesForProperty = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); if(!rulesForProperty) { return; } return this.validatePropertyWithRules(propertyRoute, rulesForProperty); - }; + } protected validateCompositeRule = async(compositeRule: ICompositeValidationRule) => { - let hadErrors = this.hasErrors(); - let isValid = await compositeRule.validate(this.modelResolver); + const hadErrors = this.hasErrors(); + const isValid = await compositeRule.validate(this.modelResolver); if(isValid) { if(this.propertyErrors[compositeRule.virtualPropertyName]) { delete this.propertyErrors[compositeRule.virtualPropertyName]; - let eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, true); + const eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, true); this.propertyStateChangedEvent.publish(eventArgs); } - let stillHasErrors = hadErrors && this.hasErrors(); + const stillHasErrors = hadErrors && this.hasErrors(); if (!stillHasErrors) { this.modelStateChangedEvent.publish(new ModelStateChangedEvent(true)); } return; } - let previousError = this.propertyErrors[compositeRule.virtualPropertyName]; - let currentError = compositeRule.getMessage(this.modelResolver); + const previousError = this.propertyErrors[compositeRule.virtualPropertyName]; + const currentError = await this.localeHandler.getMessage(compositeRule.virtualPropertyName, compositeRule, this.modelResolver, null); this.propertyErrors[compositeRule.virtualPropertyName] = currentError; if(currentError != previousError) { - let eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, false, currentError); + const eventArgs = new PropertyStateChangedEvent(compositeRule.virtualPropertyName, false, currentError); this.propertyStateChangedEvent.publish(eventArgs); if (!hadErrors) @@ -188,18 +190,18 @@ export class ValidationGroup implements IValidationGroup } protected validateCompositeRules = async () => { - for(let propertyName in this.ruleset.compositeRules) + for(const propertyName in this.ruleset.compositeRules) { - let compositeRule = this.ruleset.compositeRules[propertyName]; - this.validateCompositeRule(compositeRule); + const compositeRule = this.ruleset.compositeRules[propertyName]; + await this.validateCompositeRule(compositeRule); } } - protected startValidateModel = () => { - for(let parameterName in this.ruleset.rules) { - this.startValidateProperty(parameterName); + protected startValidateModel = async () => { + for(const parameterName in this.ruleset.rules) { + await this.startValidateProperty(parameterName); } - }; + } protected hasErrors(): boolean { return (Object.keys(this.propertyErrors).length > 0); @@ -235,7 +237,7 @@ export class ValidationGroup implements IValidationGroup public getPropertyError = async(propertyRoute: string, revalidate = false): Promise => { if(revalidate) - { this.startValidateProperty(propertyRoute); } + { await this.startValidateProperty(propertyRoute); } await this.promiseCounter.waitForCompletion(); return this.propertyErrors[propertyRoute]; @@ -246,9 +248,9 @@ export class ValidationGroup implements IValidationGroup } public isPropertyInGroup = (propertyRoute: string): boolean => { - let applicableRules = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); + const applicableRules = this.ruleResolver.resolvePropertyRules(propertyRoute, this.ruleset); return (applicableRules != null); } - public release = () => {} + public release = () => {}; } \ No newline at end of file diff --git a/src/watcher/model-watcher.ts b/src/watcher/model-watcher.ts index fb9cebf..34971b5 100644 --- a/src/watcher/model-watcher.ts +++ b/src/watcher/model-watcher.ts @@ -41,15 +41,15 @@ export class ModelWatcher implements IModelWatcher public startWatching = () => { this.stopWatching(); this.watcherInterval = setInterval(this.scanProperties, this.scanInterval); - }; + } public stopWatching = () => { if(this.watcherInterval) { clearInterval(this.watcherInterval); } - }; + } private updateAndNotifyDifferences = () => { - let previousKeyCache = this.watchCacheKeys; - let previousWatchCache = this.watchCache; + const previousKeyCache = this.watchCacheKeys; + const previousWatchCache = this.watchCache; this.watchCache = []; this.watchCacheKeys = []; @@ -60,16 +60,16 @@ export class ModelWatcher implements IModelWatcher if(previousKeyCache.indexOf(key) == -1) { previousValue = this.watchCache[index].previousValue; - let propertyChangedArgs = new PropertyChangedEvent(key, previousValue, null); + const propertyChangedArgs = new PropertyChangedEvent(key, previousValue, null); setTimeout(() => { this.onPropertyChanged.publish(propertyChangedArgs); }, 1); } else if(previousWatchCache[index].previousValue && previousWatchCache[index].previousValue.isArray) { if(previousWatchCache[index].previousValue.length != this.watchCache[index].previousValue.length) { - let newValue = this.watchCache[index].previousValue; + const newValue = this.watchCache[index].previousValue; previousValue = previousWatchCache[index].previousValue; - let propertyChangedArgs = new PropertyChangedEvent(key, newValue, previousValue); + const propertyChangedArgs = new PropertyChangedEvent(key, newValue, previousValue); setTimeout(() => { this.onPropertyChanged.publish(propertyChangedArgs); }, 1); } } @@ -80,7 +80,7 @@ export class ModelWatcher implements IModelWatcher if(this.watchCacheKeys.indexOf(watchRoute) == -1) { - let propertyWatcher = new PropertyWatcher(watchRoute, previousData); + const propertyWatcher = new PropertyWatcher(watchRoute, previousData); this.watchCache.push(propertyWatcher); this.watchCacheKeys.push(watchRoute); } @@ -91,7 +91,7 @@ export class ModelWatcher implements IModelWatcher let anyRulesAreForEach: any, anyRulesAreSets: any; let hasValue: any, currentValue: any; - for(let param in ruleset.rules) + for(const param in ruleset.rules) { paramRoute = propertyStack ? propertyStack + "." + param : param; parameterRules = ruleset.rules[param]; @@ -120,10 +120,10 @@ export class ModelWatcher implements IModelWatcher parameterRules.forEach((rule: any) => { - let isArray = TypeHelper.isArrayType(currentValue); + const isArray = TypeHelper.isArrayType(currentValue); if(isArray) { - let cachedArrayInfo = { length: currentValue.length, isArray: true }; + const cachedArrayInfo = { length: currentValue.length, isArray: true }; this.watchProperty(paramRoute, cachedArrayInfo); } @@ -162,7 +162,7 @@ export class ModelWatcher implements IModelWatcher } }); } - }; + } private scanProperties = () => { if(this.onPropertyChanged.getSubscriptionCount() == 0) { return; } @@ -184,12 +184,12 @@ export class ModelWatcher implements IModelWatcher if(propertyWatcher.previousValue && propertyWatcher.previousValue.isArray) { - let currentLength = currentValue.length || 0; + const currentLength = currentValue.length || 0; if(currentLength != propertyWatcher.previousValue.length) { hasChanged = true; } } else if (currentValue !== propertyWatcher.previousValue) { - let propertyChangedArgs = new PropertyChangedEvent(propertyWatcher.propertyPath, currentValue, propertyWatcher.previousValue); + const propertyChangedArgs = new PropertyChangedEvent(propertyWatcher.propertyPath, currentValue, propertyWatcher.previousValue); setTimeout(() => { this.onPropertyChanged.publish(propertyChangedArgs); }, 1); propertyWatcher.previousValue = currentValue; } @@ -200,5 +200,5 @@ export class ModelWatcher implements IModelWatcher if(refreshOnNextCycle) { setTimeout(this.updateAndNotifyDifferences, 1); } - }; + } } \ No newline at end of file diff --git a/tests/specs/default-locale-handler-tests.ts b/tests/specs/default-locale-handler-tests.ts new file mode 100644 index 0000000..281eb31 --- /dev/null +++ b/tests/specs/default-locale-handler-tests.ts @@ -0,0 +1,119 @@ +import {use, expect, spy} from "chai"; +import {RulesetBuilder} from "../../src/builders/ruleset-builder"; +import {ModelWatcher} from "../../src/watcher/model-watcher"; +import {DefaultLocaleHandler} from "../../src/localization/default-locale-handler"; + +import {locale as defaultLocale} from "../../src/locales/en-us"; +import { IModelResolver } from '../../dist/definitions/index'; + +describe('Default Locale Handler Tests', function () { + + it('should correctly load locale module', async function () { + const localeCode = "en-us"; + const moduleResourceLoader = new DefaultLocaleHandler(); + moduleResourceLoader.registerLocale(localeCode, defaultLocale); + moduleResourceLoader.useLocale(localeCode); + console.log("Loaded Resource", moduleResourceLoader["localeResources"]); + + expect(moduleResourceLoader.getCurrentLocale()).to.equal("en-us"); + expect(moduleResourceLoader["localeResources"]).to.have.property(localeCode); + expect(moduleResourceLoader["localeResources"][localeCode]).to.equal(defaultLocale); + }); + + it('should correctly supplement locale', async function () { + const localeCode = "en-us"; + const supplementLocale = { + "superAmaze": "This is a super amazing message" + }; + + const moduleResourceLoader = new DefaultLocaleHandler(); + moduleResourceLoader.registerLocale(localeCode, defaultLocale); + moduleResourceLoader.supplementLocaleFrom(localeCode, supplementLocale); + + moduleResourceLoader.useLocale(localeCode); + console.log("Loaded Resource", moduleResourceLoader["localeResources"]); + + expect(moduleResourceLoader.getCurrentLocale()).to.equal("en-us"); + expect(moduleResourceLoader["localeResources"]).to.have.property(localeCode); + + for(const propertyName in defaultLocale) { + expect(moduleResourceLoader["localeResources"][localeCode]).to.have.property(propertyName); + } + + expect(moduleResourceLoader["localeResources"][localeCode]).to.have.property("superAmaze"); + + const message = await moduleResourceLoader.getMessage("superAmaze", null, null, null); + expect(message).to.equal(supplementLocale.superAmaze); + }); + + it('should correctly get locale message', async function () { + const localeCode = "en-us"; + const moduleResourceLoader = new DefaultLocaleHandler(); + moduleResourceLoader.registerLocale(localeCode, defaultLocale); + moduleResourceLoader.useLocale(localeCode); + + const message = await moduleResourceLoader.getMessage("required", null, null, null); + expect(message).to.equal(defaultLocale.required); + }); + + it('should correctly flag error with non registered locale', function (done) { + const localeCode = "en-us"; + const moduleResourceLoader = new DefaultLocaleHandler(); + + moduleResourceLoader.useLocale(localeCode) + .catch((exception) => { + expect(exception).to.equal(`Unable to find registered locale for [${localeCode}]`); + done(); + }); + }); + + it('should correctly resolve string messages', async function () { + const localeCode = "en-us"; + const exampleLocale = { + "example": "this is a message" + }; + + const moduleResourceLoader = new DefaultLocaleHandler(); + moduleResourceLoader.supplementLocaleFrom(localeCode, exampleLocale); + moduleResourceLoader.useLocale(localeCode); + + const message = await moduleResourceLoader.getMessage("example", null, null, null); + console.log(`message is: ${message}`); + expect(message).to.equal(exampleLocale.example); + }); + + it('should correctly resolve value function messages', async function () { + const localeCode = "en-us"; + const exampleLocale = { + "example": (value: any) => `message has value ${value}` + }; + + const moduleResourceLoader = new DefaultLocaleHandler(); + moduleResourceLoader.supplementLocaleFrom(localeCode, exampleLocale); + moduleResourceLoader.useLocale(localeCode); + + const fakeResolver: IModelResolver = { model: null, resolve: (properyName: any): any => { return 10; }}; + const message = await moduleResourceLoader.getMessage("example", null, fakeResolver, "someProperty"); + console.log(`message is: ${message}`); + expect(message).to.equal(exampleLocale.example(10)); + }); + + it('should correctly resolve model resolver function messages', async function () { + const localeCode = "en-us"; + const exampleLocale = { + "example": (modelResolver: any, propertyName: string, option: any) => { + const resolvedValue = modelResolver.resolve(propertyName); + return `message has value been called with [${propertyName}]:[${option}] = [${resolvedValue}]`; + } + }; + + const moduleResourceLoader = new DefaultLocaleHandler(); + moduleResourceLoader.supplementLocaleFrom(localeCode, exampleLocale); + moduleResourceLoader.useLocale(localeCode); + + const fakeResolver: IModelResolver = { model: null, resolve: (properyName: any): string => { return "some-value"; }}; + const message = await moduleResourceLoader.getMessage("example", "options", fakeResolver, "name"); + console.log(`message is: ${message}`); + expect(message).to.equal(exampleLocale.example(fakeResolver, "name", "options")); + }); +}); \ No newline at end of file diff --git a/tests/specs/field-error-processor-tests.ts b/tests/specs/field-error-processor-tests.ts index 30e5806..1579c07 100644 --- a/tests/specs/field-error-processor-tests.ts +++ b/tests/specs/field-error-processor-tests.ts @@ -11,20 +11,27 @@ import {ModelResolver} from "../../src/resolvers/model-resolver"; import {PropertyResolver} from "property-resolver"; import {IModelResolver} from "../../src/resolvers/imodel-resolver"; +import {DefaultLocaleHandler} from "../../src/localization/default-locale-handler"; +import {locale as defaultLocale} from "../../src/locales/en-us"; + use(spies); describe('Field Error Processor', function () { it('should correctly return an error for the field', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new RequiredValidationRule()); ruleRegistry.registerRule(new MaxLengthValidationRule()); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); - var dummyModel = new ModelResolver(new PropertyResolver(),{ dummyField: "123"}); + const dummyModel = new ModelResolver(new PropertyResolver(), { dummyField: "123"}); console.log(dummyModel); - var dummyRules = [ + const dummyRules = [ new RuleLink("required", true), new RuleLink("maxLength", 2) ]; @@ -40,17 +47,21 @@ describe('Field Error Processor', function () { it('should correctly return a custom error message function for the field', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new RequiredValidationRule()); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); - var dummyModel = new ModelResolver(new PropertyResolver(), {}); - var expectedMessage = "you should have put in some text"; - var dummyField = ""; - var rule = new RuleLink("required", true); + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); + + const dummyModel = new ModelResolver(new PropertyResolver(), {}); + const expectedMessage = "you should have put in some text"; + const dummyField = ""; + const rule = new RuleLink("required", true); rule.messageOverride = function() { return expectedMessage; }; - var dummyRules = [rule]; + const dummyRules = [rule]; fieldErrorProcessor .checkFieldForErrors(dummyModel, dummyField, dummyRules) @@ -62,17 +73,21 @@ describe('Field Error Processor', function () { }); it('should correctly return a custom error message for the field', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new RequiredValidationRule()); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); - var dummyModel = new ModelResolver(new PropertyResolver(),{}); - var expectedMessage = "you should have put in some text"; - var dummyField = ""; - var rule = new RuleLink("required", true); + const dummyModel = new ModelResolver(new PropertyResolver(),{}); + const expectedMessage = "you should have put in some text"; + const dummyField = ""; + const rule = new RuleLink("required", true); rule.messageOverride = expectedMessage; - var dummyRules = [ + const dummyRules = [ rule ]; @@ -86,18 +101,22 @@ describe('Field Error Processor', function () { }); it('should correctly return a custom error message with model and value data', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new EqualValidationRule()); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); - var dummyModel = new ModelResolver(new PropertyResolver(),{ foo: "AA", bar:"BB" }); - var dummyField = "foo"; - var rule = new RuleLink("equal", "bar"); - var expectedMessage = "Should have had foo (AA) == bar (BB)"; + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); + + const dummyModel = new ModelResolver(new PropertyResolver(),{ foo: "AA", bar:"BB" }); + const dummyField = "foo"; + const rule = new RuleLink("equal", "bar"); + const expectedMessage = "Should have had foo (AA) == bar (BB)"; rule.messageOverride = (m,v,o) => `Should have had ${v} (${m.resolve(v)}) == ${o} (${m.resolve(o)})`; - var dummyRules = [ + const dummyRules = [ rule ]; @@ -112,14 +131,18 @@ describe('Field Error Processor', function () { }); it('should correctly return no error for the field', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new RequiredValidationRule()); ruleRegistry.registerRule(new MaxLengthValidationRule()); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); - var dummyModel = new ModelResolver(new PropertyResolver(),{ dummyField : "12" }); - var dummyRules = [ + const dummyModel = new ModelResolver(new PropertyResolver(),{ dummyField : "12" }); + const dummyRules = [ new RuleLink("required", true), new RuleLink("maxLength", 2) ]; @@ -133,18 +156,22 @@ describe('Field Error Processor', function () { }); it('should stop looking for errors on first fail', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(new RequiredValidationRule()); - var maxLengthTreacherous = new MaxLengthValidationRule(); - var spiedValidationMethod = spy.on(maxLengthTreacherous, 'validate'); + const maxLengthTreacherous = new MaxLengthValidationRule(); + const spiedValidationMethod = spy.on(maxLengthTreacherous, 'validate'); ruleRegistry.registerRule(maxLengthTreacherous); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); - var dummyModel = new ModelResolver(new PropertyResolver(),{}); - var dummyField = null; - var dummyRules = [ + const dummyModel = new ModelResolver(new PropertyResolver(),{}); + const dummyField: any = null; + const dummyRules = [ new RuleLink("required", true), new RuleLink("maxLength", 2) ]; @@ -159,18 +186,22 @@ describe('Field Error Processor', function () { }); it('should only run rule if appliesIf is undefined or returns truthy', function (done) { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); - var requiredValidationRule = new RequiredValidationRule(); - var spiedValidationMethod = spy.on(requiredValidationRule, 'validate'); + const requiredValidationRule = new RequiredValidationRule(); + const spiedValidationMethod = spy.on(requiredValidationRule, 'validate'); ruleRegistry.registerRule(requiredValidationRule); - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); - var dummyModel = new ModelResolver(new PropertyResolver(),{ shouldRun: false }); - var dummyField = null; + const dummyModel = new ModelResolver(new PropertyResolver(),{ shouldRun: false }); + const dummyField: any = null; - var requireRule = new RuleLink("required", true); + const requireRule = new RuleLink("required", true); requireRule.appliesIf = (modelResolver: IModelResolver) => { return modelResolver.resolve("shouldRun"); };; fieldErrorProcessor diff --git a/tests/specs/model-watcher-tests.ts b/tests/specs/model-watcher-tests.ts index bd2cd0b..79deb8d 100644 --- a/tests/specs/model-watcher-tests.ts +++ b/tests/specs/model-watcher-tests.ts @@ -7,7 +7,7 @@ use(spies); describe('Model Watcher', function () { it('should correctly watch model changes', function (done) { - var dummyModel = { + const dummyModel = { foo: 10, bar: [ 10, 20, 30, 40 ], woo: { @@ -15,8 +15,8 @@ describe('Model Watcher', function () { } }; - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("required", true) .forProperty("bar") @@ -24,9 +24,9 @@ describe('Model Watcher', function () { .addRuleForEach("maxValue", 20) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); - var spySubscription = spy(function(eventArgs){}); + const spySubscription = spy(function(eventArgs: any){}); modelWatcher.onPropertyChanged.subscribe(spySubscription); @@ -44,7 +44,7 @@ describe('Model Watcher', function () { it('should correctly watch model with nested rules', function (done) { - var dummyModel = { + const dummyModel = { bar: [ { val: 10 }, { val: 20 }, @@ -53,20 +53,20 @@ describe('Model Watcher', function () { ] }; - var rulesetBuilder = new RulesetBuilder(); - var nestedRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const nestedRuleset = rulesetBuilder.create() .forProperty("val") .addRule("maxValue", 30) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("bar") .addRulesetForEach(nestedRuleset) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); - var spySubscription = spy(function(eventArgs){}); + const spySubscription = spy(function(eventArgs: any){}); modelWatcher.onPropertyChanged.subscribe(spySubscription); @@ -80,13 +80,13 @@ describe('Model Watcher', function () { }); it('should correctly notice array size changes', function (done) { - var dummyModel = { + const dummyModel = { foo: 10, bar: [ 10, 20 ] }; - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("required", true) .forProperty("bar") @@ -94,9 +94,9 @@ describe('Model Watcher', function () { .addRuleForEach("maxValue", 20) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); - var spySubscription = spy(function(eventArgs){}); + const spySubscription = spy(function(eventArgs: any){}); modelWatcher.onPropertyChanged.subscribe(spySubscription); @@ -110,7 +110,7 @@ describe('Model Watcher', function () { }); it('should only watch properties with rules', function () { - var dummyModel = { + const dummyModel = { foo: 0, bar: [ { val: 10 }, @@ -121,26 +121,26 @@ describe('Model Watcher', function () { } }; - var rulesetBuilder = new RulesetBuilder(); - var woopRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const woopRuleset = rulesetBuilder.create() .forProperty("woop") .addRule("maxValue", 10) .build(); - var testRuleset = rulesetBuilder.create() + const testRuleset = rulesetBuilder.create() .forProperty("test") .addRuleset(woopRuleset) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("blah") .addRuleset(testRuleset) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); - var watchCache = modelWatcher["watchCache"]; + const watchCache = modelWatcher["watchCache"]; expect(watchCache.length).to.equal(1); expect(watchCache[0].propertyPath).to.equal("blah.test.woop"); expect(watchCache[0].previousValue).to.equal(20); @@ -149,15 +149,15 @@ describe('Model Watcher', function () { it('should correctly update when model is changed', function (done) { - var dummyModel = { foo: 0 }; + const dummyModel = { foo: 0 }; - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxValue", 10) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); modelWatcher.onPropertyChanged.subscribe(function(data){ @@ -167,16 +167,16 @@ describe('Model Watcher', function () { done(); }); - var newModel = { foo: 10 }; + const newModel = { foo: 10 }; modelWatcher.changeWatcherTarget(newModel); modelWatcher.stopWatching(); }); it('should correctly cope with null model setup and replacement', function (done) { - var dummyModel = null; + const dummyModel: any = null; - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxValue", 10) .forProperty("bar") @@ -184,15 +184,15 @@ describe('Model Watcher', function () { .addRuleForEach("maxValue", 10) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); - var newModel = { + const newModel = { foo: 11, bar: [11, 12] }; - var spySubscription = spy(function(eventArgs){console.log("event", eventArgs);}); + const spySubscription = spy(function(eventArgs: any){console.log("event", eventArgs);}); modelWatcher.onPropertyChanged.subscribe(spySubscription); modelWatcher.changeWatcherTarget(newModel); @@ -205,20 +205,20 @@ describe('Model Watcher', function () { }); it('should correctly cope with empty model which is updated', function (done) { - var dummyModel: any = {}; + const dummyModel: any = {}; - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxValue", 10) .forProperty("bar") .addRuleForEach("maxValue", 10) .build(); - var modelWatcher = new ModelWatcher(); + const modelWatcher = new ModelWatcher(); modelWatcher.setupWatcher(dummyModel, ruleset, 50); - var spySubscription = spy(function(eventArgs){ console.log("event", eventArgs); }); + const spySubscription = spy(function(eventArgs: any){ console.log("event", eventArgs); }); modelWatcher.onPropertyChanged.subscribe(spySubscription); dummyModel.foo = 11; diff --git a/tests/specs/reactive-validation-group-tests.ts b/tests/specs/reactive-validation-group-tests.ts index 5c66649..91d8cc0 100644 --- a/tests/specs/reactive-validation-group-tests.ts +++ b/tests/specs/reactive-validation-group-tests.ts @@ -8,30 +8,37 @@ import {IReactiveValidationGroup} from "../../src/validation-groups/ireactive-va import {ruleRegistry} from "../../src/rule-registry-setup"; import {ModelResolverFactory} from "../../src/factories/model-resolver-factory"; import {ModelWatcherFactory} from "../../src/factories/model-watcher-factory"; +import {DefaultLocaleHandler} from "../../src/localization/default-locale-handler"; +import {locale as defaultLocale} from "../../src/locales/en-us"; describe('Reactive Validation Group', function () { - var createValidationGroupFor = (model, ruleset) : IReactiveValidationGroup => { - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); - var ruleResolver = new RuleResolver(); - var modelResolverFactory = new ModelResolverFactory(); - var modelWatcherFactory = new ModelWatcherFactory(); - return new ReactiveValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, modelWatcherFactory, model, ruleset, 50); + const createValidationGroupFor = (model: any, ruleset: any) : IReactiveValidationGroup => { + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale("en-us", defaultLocale); + defaultLocaleHandler.useLocale("en-us"); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); + const ruleResolver = new RuleResolver(); + const modelResolverFactory = new ModelResolverFactory(); + const modelWatcherFactory = new ModelWatcherFactory(); + return new ReactiveValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, + modelWatcherFactory, defaultLocaleHandler, model, ruleset, 50); } it('should correctly notify on property validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 15) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.propertyStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; expect(args.error).contains("15"); @@ -53,24 +60,24 @@ describe('Reactive Validation Group', function () { it('should correctly notify on property in nested object validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var childRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const childRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleset(childRuleset) .build(); - var dummyModel = { + const dummyModel = { foo: { bar: "fine" } }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.propertyStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; expect(args.error).contains("27"); @@ -90,17 +97,17 @@ describe('Reactive Validation Group', function () { it('should correctly notify on array property validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleForEach("maxValue", 15) .build(); - var dummyModel = { + const dummyModel = { foo: [10, 15, 10] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.propertyStateChangedEvent.subscribe(function(args){ console.log("args", args); expect(args.isValid).to.be.false; @@ -124,17 +131,17 @@ describe('Reactive Validation Group', function () { it('should only notify array and not properties with validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .build(); - var dummyModel = { + const dummyModel = { foo: [10, 15] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.propertyStateChangedEvent.subscribe(function(args){ console.log("triggered", args); expect(args.isValid).to.be.false; @@ -150,17 +157,17 @@ describe('Reactive Validation Group', function () { it('should correctly notify on validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 15) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.modelStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; validationGroup.release(); diff --git a/tests/specs/rule-registry-tests.ts b/tests/specs/rule-registry-tests.ts index 1d05c23..3feb897 100644 --- a/tests/specs/rule-registry-tests.ts +++ b/tests/specs/rule-registry-tests.ts @@ -5,19 +5,19 @@ import {RequiredValidationRule} from "../../src/rules/required-validation-rule"; describe('Rule registry', function () { it('should correctly get rule for name', function () { - var requiredRule = new RequiredValidationRule(); + const requiredRule = new RequiredValidationRule(); - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); ruleRegistry.registerRule(requiredRule); - var returnedRule = ruleRegistry.getRuleNamed(requiredRule.ruleName); + const returnedRule = ruleRegistry.getRuleNamed(requiredRule.ruleName); expect(returnedRule).to.equal(requiredRule) }); it('should return null for missing rule', function () { - var ruleRegistry = new RuleRegistry(); + const ruleRegistry = new RuleRegistry(); - var returnedRule = ruleRegistry.getRuleNamed("doesn't-exist"); + const returnedRule = ruleRegistry.getRuleNamed("doesn't-exist"); expect(returnedRule).to.be.null; }); diff --git a/tests/specs/rule-resolver-tests.ts b/tests/specs/rule-resolver-tests.ts index 939eba3..14736f5 100644 --- a/tests/specs/rule-resolver-tests.ts +++ b/tests/specs/rule-resolver-tests.ts @@ -5,17 +5,17 @@ import {RuleResolver} from "../../src/rulesets/rule-resolver"; describe('Rule resolver', function () { it('should correctly resolve a property name to a rule', function () { - var rulesetBuilder = new RulesetBuilder(); + const rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("required", true) .build(); - var propertyRoute = "foo"; + const propertyRoute = "foo"; - var ruleResolver = new RuleResolver(); - var locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); + const ruleResolver = new RuleResolver(); + const locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); expect(locatedRules).not.to.be.null; expect(locatedRules.length).to.equal(1); @@ -24,23 +24,23 @@ describe('Rule resolver', function () { }); it('should correctly resolve a property route to a rule', function () { - var rulesetBuilder = new RulesetBuilder(); + const rulesetBuilder = new RulesetBuilder(); - var nestedRuleset = rulesetBuilder.create() + const nestedRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required", true) .addRule("maxLength", 10) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleset(nestedRuleset) .build(); - var propertyRoute = "foo.bar"; + const propertyRoute = "foo.bar"; - var ruleResolver = new RuleResolver(); - var locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); + const ruleResolver = new RuleResolver(); + const locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); expect(locatedRules).not.to.be.null; expect(locatedRules.length).to.equal(2); @@ -51,22 +51,22 @@ describe('Rule resolver', function () { }); it('should correctly resolve a property route ending in an array to a rule', function () { - var rulesetBuilder = new RulesetBuilder(); + const rulesetBuilder = new RulesetBuilder(); - var nestedRuleset = rulesetBuilder.create() + const nestedRuleset = rulesetBuilder.create() .forProperty("bar") .addRuleForEach("maxLength", 10) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleset(nestedRuleset) .build(); - var propertyRoute = "foo.bar[0]"; + const propertyRoute = "foo.bar[0]"; - var ruleResolver = new RuleResolver(); - var locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); + const ruleResolver = new RuleResolver(); + const locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); expect(locatedRules).not.to.be.null; expect(locatedRules.length).to.equal(1); @@ -75,18 +75,18 @@ describe('Rule resolver', function () { }); it('should only resolve array child property rules and not array container rules', function () { - var rulesetBuilder = new RulesetBuilder(); + const rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .addRuleForEach("maxValue", 10) .build(); - var propertyRoute = "foo[0]"; + const propertyRoute = "foo[0]"; - var ruleResolver = new RuleResolver(); - var locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); + const ruleResolver = new RuleResolver(); + const locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); expect(locatedRules).not.to.be.null; expect(locatedRules.length).to.equal(1); @@ -95,22 +95,22 @@ describe('Rule resolver', function () { }); it('should correctly resolve a property route with foreach ruleset', function () { - var rulesetBuilder = new RulesetBuilder(); - var elementRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const elementRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required") .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRulesetForEach(elementRuleset) .build(); - var propertyRoute = "foo[1].bar"; + const propertyRoute = "foo[1].bar"; - var ruleResolver = new RuleResolver(); - var locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); + const ruleResolver = new RuleResolver(); + const locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); expect(locatedRules).not.to.be.null; expect(locatedRules.length).to.equal(2); @@ -120,28 +120,28 @@ describe('Rule resolver', function () { }); it('should correctly resolve a property route with a foreach to a rule', function () { - var rulesetBuilder = new RulesetBuilder(); + const rulesetBuilder = new RulesetBuilder(); - var nestedRuleset = rulesetBuilder.create() + const nestedRuleset = rulesetBuilder.create() .forProperty("woo") .addRule("required", true) .addRule("maxLength", 10) .build(); - var forEachRuleset = rulesetBuilder.create() + const forEachRuleset = rulesetBuilder.create() .forProperty("bar") .addRulesetForEach(nestedRuleset) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleset(forEachRuleset) .build(); - var propertyRoute = "foo.bar[2].woo"; + const propertyRoute = "foo.bar[2].woo"; - var ruleResolver = new RuleResolver(); - var locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); + const ruleResolver = new RuleResolver(); + const locatedRules = ruleResolver.resolvePropertyRules(propertyRoute, ruleset); expect(locatedRules).not.to.be.null; expect(locatedRules.length).to.equal(2); diff --git a/tests/specs/rules/date-rule-tests.ts b/tests/specs/rules/date-rule-tests.ts index dbe5371..a5b7b40 100644 --- a/tests/specs/rules/date-rule-tests.ts +++ b/tests/specs/rules/date-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Date Rule', function () { it('should be valid when date is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDate = Date.now(); - var rule = new DateValidationRule(); + const rule = new DateValidationRule(); rule.validate(modelResolver,'validDate').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidDate = null; - var rule = new DateValidationRule(); + const rule = new DateValidationRule(); rule.validate(modelResolver,'invalidDate').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when non date is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidDate = "this isn't a date"; - var rule = new DateValidationRule(); + const rule = new DateValidationRule(); rule.validate(modelResolver,'invalidDate').then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/decimal-rule-tests.ts b/tests/specs/rules/decimal-rule-tests.ts index 82907c0..d687611 100644 --- a/tests/specs/rules/decimal-rule-tests.ts +++ b/tests/specs/rules/decimal-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Decimal Rule', function () { it('should be valid when number is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumber = 10; - var rule = new DecimalValidationRule(); + const rule = new DecimalValidationRule(); rule.validate(modelResolver,'validNumber').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when number string is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validStringNumber = "10"; - var rule = new DecimalValidationRule(); + const rule = new DecimalValidationRule(); rule.validate(modelResolver,'validStringNumber').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when a valid decimal is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDecimal = 10.25; - var rule = new DecimalValidationRule(); + const rule = new DecimalValidationRule(); rule.validate(modelResolver,'validDecimal').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be valid when a valid decimal string is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDecimalString = "10.25"; - var rule = new DecimalValidationRule(); + const rule = new DecimalValidationRule(); rule.validate(modelResolver,'validDecimalString').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.null = null; - var rule = new DecimalValidationRule(); + const rule = new DecimalValidationRule(); rule.validate(modelResolver,'null').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -62,10 +62,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when provided a non numeric value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidNumber = "not a number"; - var rule = new DecimalValidationRule(); + const rule = new DecimalValidationRule(); rule.validate(modelResolver,'invalidNumber').then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/email-rule-tests.ts b/tests/specs/rules/email-rule-tests.ts index 77d7886..c750ca2 100644 --- a/tests/specs/rules/email-rule-tests.ts +++ b/tests/specs/rules/email-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Email Rule', function () { it('should be valid when email is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validEmail = "test@test.com"; - var rule = new EmailValidationRule(); + const rule = new EmailValidationRule(); rule.validate(modelResolver,'validEmail').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.null = null; - var rule = new EmailValidationRule(); + const rule = new EmailValidationRule(); rule.validate(modelResolver,'null').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided an empty string', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.someString = ""; - var rule = new EmailValidationRule(); + const rule = new EmailValidationRule(); rule.validate(modelResolver, 'someString').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when pattern is not matched', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidEmail = "this isn't an email"; - var rule = new EmailValidationRule(); + const rule = new EmailValidationRule(); rule.validate(modelResolver,'invalidEmail').then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/equal-rule-tests.ts b/tests/specs/rules/equal-rule-tests.ts index 7265e0c..05520ae 100644 --- a/tests/specs/rules/equal-rule-tests.ts +++ b/tests/specs/rules/equal-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Equal Rule', function () { it('should be valid when the comparitor is a function which equals the value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", () => 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when numbers equal', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver,"a", 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when strings equal', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = "hello"; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", "hello").then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be valid when number weak equality string', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", { value: "10", weakEquality: true }).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be valid when dates equal', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = new Date(1995, 11, 17); - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", new Date(1995, 11, 17)).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -62,10 +62,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", {}).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -73,10 +73,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when number does not equal same number as string without weak equality', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", "10").then(function(isValid){ expect(isValid).to.be.false; done(); @@ -84,10 +84,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when number does not equal comparison', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new EqualValidationRule(); + const rule = new EqualValidationRule(); rule.validate(modelResolver, "a", 20).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/iso-date-rule-tests.ts b/tests/specs/rules/iso-date-rule-tests.ts index ea63a14..0c0d7e4 100644 --- a/tests/specs/rules/iso-date-rule-tests.ts +++ b/tests/specs/rules/iso-date-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('ISO Date Rule', function () { it('should be valid when iso format date is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDateString = new Date().toISOString(); - var rule = new ISODateValidationRule(); + const rule = new ISODateValidationRule(); rule.validate(modelResolver,'validDateString').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -19,10 +19,10 @@ describe("Validation Rules", function(){ it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.null = null; - var rule = new ISODateValidationRule(); + const rule = new ISODateValidationRule(); rule.validate(modelResolver,'null').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -30,10 +30,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when non date is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidDateString = "this isn't a date"; - var rule = new ISODateValidationRule(); + const rule = new ISODateValidationRule(); rule.validate(modelResolver,'invalidDateString').then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/matches-rule-tests.ts b/tests/specs/rules/matches-rule-tests.ts index 098cd44..6f9b4af 100644 --- a/tests/specs/rules/matches-rule-tests.ts +++ b/tests/specs/rules/matches-rule-tests.ts @@ -7,11 +7,11 @@ describe("Validation Rules", function(){ describe('Matches Rule', function () { it('should be valid when properties match without weak equality', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; modelResolver.model.b = 10; - var rule = new MatchesValidationRule(); + const rule = new MatchesValidationRule(); rule.validate(modelResolver,'a', 'b').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -19,11 +19,11 @@ describe("Validation Rules", function(){ }); it('should be valid when properties weakly match with weak equality', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = "10"; modelResolver.model.b = 10; - var rule = new MatchesValidationRule(); + const rule = new MatchesValidationRule(); rule.validate(modelResolver, "a", { property: "b", weakEquality: true }).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -31,11 +31,11 @@ describe("Validation Rules", function(){ }); it('should be invalid when properties weakly match with no weak equality', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; modelResolver.model.b = "10"; - var rule = new MatchesValidationRule(); + const rule = new MatchesValidationRule(); rule.validate(modelResolver, "a", "b").then(function(isValid){ expect(isValid).to.be.false; done(); @@ -43,11 +43,11 @@ describe("Validation Rules", function(){ }); it('should be valid when dates properties match', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = new Date(1995, 11, 17); modelResolver.model.b = new Date(1995, 11, 17); - var rule = new MatchesValidationRule(); + const rule = new MatchesValidationRule(); rule.validate(modelResolver, "a", "b").then(function(isValid){ expect(isValid).to.be.true; done(); @@ -55,11 +55,11 @@ describe("Validation Rules", function(){ }); it('should be valid when null values match', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; modelResolver.model.b = null; - var rule = new MatchesValidationRule(); + const rule = new MatchesValidationRule(); rule.validate(modelResolver, "a", "b").then(function(isValid){ expect(isValid).to.be.true; done(); @@ -67,11 +67,11 @@ describe("Validation Rules", function(){ }); it('should be invalid when property does not match', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; modelResolver.model.a = "different"; - var rule = new MatchesValidationRule(); + const rule = new MatchesValidationRule(); rule.validate(modelResolver, "a", "b").then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/max-length-rule-tests.ts b/tests/specs/rules/max-length-rule-tests.ts index 9fb5412..b891a5c 100644 --- a/tests/specs/rules/max-length-rule-tests.ts +++ b/tests/specs/rules/max-length-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Max Length Rule', function () { it('should be valid when string length is <= max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), { }); + const modelResolver = new ModelResolver(new PropertyResolver(), { }); modelResolver.model.validString = "0123456789"; - var rule = new MaxLengthValidationRule(); + const rule = new MaxLengthValidationRule(); rule.validate(modelResolver,'validString', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when array length is <= max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), { }); + const modelResolver = new ModelResolver(new PropertyResolver(), { }); modelResolver.model.validArray = [0,1,2,3,4,5,6,7,8,9]; - var rule = new MaxLengthValidationRule(); + const rule = new MaxLengthValidationRule(); rule.validate(modelResolver,'validArray', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), { }); + const modelResolver = new ModelResolver(new PropertyResolver(), { }); modelResolver.model.a = null; - var rule = new MaxLengthValidationRule(); + const rule = new MaxLengthValidationRule(); rule.validate(modelResolver,'a', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when string length is > max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), { }); + const modelResolver = new ModelResolver(new PropertyResolver(), { }); modelResolver.model.invalidString = "0123456789"; - var rule = new MaxLengthValidationRule(); + const rule = new MaxLengthValidationRule(); rule.validate(modelResolver,'invalidString', 9).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when array length is > max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), { }); + const modelResolver = new ModelResolver(new PropertyResolver(), { }); modelResolver.model.invalidArray = [0,1,2,3,4,5,6,7,8,9]; - var rule = new MaxLengthValidationRule(); + const rule = new MaxLengthValidationRule(); rule.validate(modelResolver,'invalidArray', 9).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/max-value-rule-tests.ts b/tests/specs/rules/max-value-rule-tests.ts index 1c36aec..545c66e 100644 --- a/tests/specs/rules/max-value-rule-tests.ts +++ b/tests/specs/rules/max-value-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Max Value Rule', function () { it('should be valid when number is <= max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumber = 10; - var rule = new MaxValueValidationRule(); + const rule = new MaxValueValidationRule(); rule.validate(modelResolver,'validNumber', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when string number is <= max value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumberString = "10"; - var rule = new MaxValueValidationRule(); + const rule = new MaxValueValidationRule(); rule.validate(modelResolver,'validNumberString', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,11 +29,11 @@ describe("Validation Rules", function(){ }); it('should be valid when date is <= max date', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDate = new Date(1990, 1, 1); - var rule = new MaxValueValidationRule(); - var maximumDate = new Date(2000, 1, 1); + const rule = new MaxValueValidationRule(); + const maximumDate = new Date(2000, 1, 1); rule.validate(modelResolver,'validDate', maximumDate).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -41,10 +41,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new MaxValueValidationRule(); + const rule = new MaxValueValidationRule(); rule.validate(modelResolver,'a', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -52,10 +52,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when number is > max value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidNumber = 11; - var rule = new MaxValueValidationRule(); + const rule = new MaxValueValidationRule(); rule.validate(modelResolver,'invalidNumber', 10).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -63,10 +63,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when string number is > max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidStringNumber = "11"; - var rule = new MaxValueValidationRule(); + const rule = new MaxValueValidationRule(); rule.validate(modelResolver,'invalidStringNumber', 10).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -74,11 +74,11 @@ describe("Validation Rules", function(){ }); it('should be invalid when date is > max date', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidDate = new Date(2001, 1, 1); - var rule = new MaxValueValidationRule(); - var maximumDate = new Date(2000, 1, 1); + const rule = new MaxValueValidationRule(); + const maximumDate = new Date(2000, 1, 1); rule.validate(modelResolver,'invalidDate', maximumDate).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/min-length-rule-tests.ts b/tests/specs/rules/min-length-rule-tests.ts index 34e4f6b..098327a 100644 --- a/tests/specs/rules/min-length-rule-tests.ts +++ b/tests/specs/rules/min-length-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Min Length Rule', function () { it('should be valid when string length is >= max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validString = "0123456789"; - var rule = new MinLengthValidationRule(); + const rule = new MinLengthValidationRule(); rule.validate(modelResolver,'validString', 1).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when array length is >= max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validArray = [0,1,2,3,4,5,6,7,8,9]; - var rule = new MinLengthValidationRule(); + const rule = new MinLengthValidationRule(); rule.validate(modelResolver,'validArray', 1).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new MinLengthValidationRule(); + const rule = new MinLengthValidationRule(); rule.validate(modelResolver,'a', 1).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when string length is < max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidString = "0123456789"; - var rule = new MinLengthValidationRule(); + const rule = new MinLengthValidationRule(); rule.validate(modelResolver,'invalidString', 11).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when array length is < max length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidArray = [0,1,2,3,4,5,6,7,8,9]; - var rule = new MinLengthValidationRule(); + const rule = new MinLengthValidationRule(); rule.validate(modelResolver,'invalidArray', 11).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/min-value-rule-tests.ts b/tests/specs/rules/min-value-rule-tests.ts index 00ec971..08f79f4 100644 --- a/tests/specs/rules/min-value-rule-tests.ts +++ b/tests/specs/rules/min-value-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Min Value Rule', function () { it('should be valid when number is >= min length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumber = 10; - var rule = new MinValueValidationRule(); + const rule = new MinValueValidationRule(); rule.validate(modelResolver,'validNumber', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when string number is >= min length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumberString = "10"; - var rule = new MinValueValidationRule(); + const rule = new MinValueValidationRule(); rule.validate(modelResolver,'validNumberString', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,11 +29,11 @@ describe("Validation Rules", function(){ }); it('should be valid when date is >= min date', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDate = new Date(2001, 1, 1); - var rule = new MinValueValidationRule(); - var minDate = new Date(2000, 1, 1); + const rule = new MinValueValidationRule(); + const minDate = new Date(2000, 1, 1); rule.validate(modelResolver,'validDate', minDate).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -41,10 +41,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new MinValueValidationRule(); + const rule = new MinValueValidationRule(); rule.validate(modelResolver, 'a', 10).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -52,10 +52,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when number is < min length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidNumber = 9; - var rule = new MinValueValidationRule(); + const rule = new MinValueValidationRule(); rule.validate(modelResolver,'invalidNumber', 10).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -63,10 +63,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when string number is < min length', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidStringNumber = "9"; - var rule = new MinValueValidationRule(); + const rule = new MinValueValidationRule(); rule.validate(modelResolver,'invalidStringNumber', 10).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -74,11 +74,11 @@ describe("Validation Rules", function(){ }); it('should be invalid when date is < min date', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidDate = new Date(1990, 1, 1); - var rule = new MinValueValidationRule(); - var minDate = new Date(2000, 1, 1); + const rule = new MinValueValidationRule(); + const minDate = new Date(2000, 1, 1); rule.validate(modelResolver,'invalidDate', minDate).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/not-equal-rule-tests.ts b/tests/specs/rules/not-equal-rule-tests.ts index 285fa98..59a6968 100644 --- a/tests/specs/rules/not-equal-rule-tests.ts +++ b/tests/specs/rules/not-equal-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Not Equal Rule', function () { it('should be valid when the comparitor is a function which does not equal the value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver, "a", () => 15).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when numbers dont equal', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver,'a', 12).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when strings dont equal', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a='hello'; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver, 'a', "hello again").then(function(isValid){ expect(isValid).to.be.true; @@ -41,10 +41,10 @@ describe("Validation Rules", function(){ }); it('should be valid when number does not weak equality string', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver, 'a', { value: "25", weakEquality: true }).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -52,10 +52,10 @@ describe("Validation Rules", function(){ }); it('should be valid when dates dont equal', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = new Date(1995, 11, 17); - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver, 'a', new Date(1995, 11, 27)).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -63,10 +63,10 @@ describe("Validation Rules", function(){ }); it('should be valid when number and string are same but not using weak equality', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver, 'a', "10").then(function(isValid){ expect(isValid).to.be.true; done(); @@ -74,10 +74,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver,'a', {}).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -85,10 +85,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when number equals same number', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver, 'a', 10).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -96,9 +96,9 @@ describe("Validation Rules", function(){ }); it('should be invalid when number equals string number with weak equality', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = 10; - var rule = new NotEqualValidationRule(); + const rule = new NotEqualValidationRule(); rule.validate(modelResolver,'a', { value: "10", weakEquality: true }).then(function(isValid){ expect(isValid).to.be.false; diff --git a/tests/specs/rules/number-rule-tests.ts b/tests/specs/rules/number-rule-tests.ts index c4bd146..c39a824 100644 --- a/tests/specs/rules/number-rule-tests.ts +++ b/tests/specs/rules/number-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Number Rule', function () { it('should be valid when number is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumber = 10; - var rule = new NumberValidationRule(); + const rule = new NumberValidationRule(); rule.validate(modelResolver,'validNumber').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when number string is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validStringNumber = "10"; - var rule = new NumberValidationRule(); + const rule = new NumberValidationRule(); rule.validate(modelResolver, 'validStringNumber').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new NumberValidationRule(); + const rule = new NumberValidationRule(); rule.validate(modelResolver,'a').then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when a valid decimal is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDecimal = 10.25; - var rule = new NumberValidationRule(); + const rule = new NumberValidationRule(); rule.validate(modelResolver,'validDecimal').then(function(isValid){ expect(isValid).to.be.false; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when a valid decimal string is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validDecimalString = "10.25"; - var rule = new NumberValidationRule(); + const rule = new NumberValidationRule(); rule.validate(modelResolver,'validDecimalString').then(function(isValid){ expect(isValid).to.be.false; done(); @@ -62,10 +62,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when a non numeric string is provided', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.nan = "not a number"; - var rule = new NumberValidationRule(); + const rule = new NumberValidationRule(); rule.validate(modelResolver,'nan').then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/regex-rule-tests.ts b/tests/specs/rules/regex-rule-tests.ts index 264d9dc..dc77821 100644 --- a/tests/specs/rules/regex-rule-tests.ts +++ b/tests/specs/rules/regex-rule-tests.ts @@ -7,11 +7,11 @@ describe("Validation Rules", function(){ describe('Regex Rule', function () { it('should be valid when pattern is matched', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validString = "matched-this"; - var rule = new RegexValidationRule(); - var validString = "matched-this"; + const rule = new RegexValidationRule(); + const validString = "matched-this"; rule.validate(modelResolver,'validString', /matched-this/).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -19,10 +19,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new RegexValidationRule(); + const rule = new RegexValidationRule(); rule.validate(modelResolver,'a', /matched-this/).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -30,11 +30,11 @@ describe("Validation Rules", function(){ }); it('should be invalid when pattern is not matched', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidString = "doesnt-match-this"; - var rule = new RegexValidationRule(); - var invalidString = "doesnt-match-this"; + const rule = new RegexValidationRule(); + const invalidString = "doesnt-match-this"; rule.validate(modelResolver,'invalidString', /matched-this/).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/rules/required-rule-tests.ts b/tests/specs/rules/required-rule-tests.ts index d743e81..05f9f93 100644 --- a/tests/specs/rules/required-rule-tests.ts +++ b/tests/specs/rules/required-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Required Rule', function () { it('should be valid when non empty string is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validString = "1"; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'validString', true).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when non empty array is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validArray = [0,1,2,3,4,5,6,7,8,9]; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'validArray', true).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when number is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumber = 1; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'validNumber', true).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when empty string is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidString = ""; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'invalidString', true).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when empty array is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidArray = []; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'invalidArray', true).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -62,10 +62,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when null is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver, 'a', true).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -73,9 +73,9 @@ describe("Validation Rules", function(){ }); it('should be invalid when undefined is required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver, 'a', true).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -83,10 +83,10 @@ describe("Validation Rules", function(){ }); it('should be valid when empty string is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validString = ""; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'validString', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -94,10 +94,10 @@ describe("Validation Rules", function(){ }); it('should be valid when array is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validArray = []; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'validArray', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -105,10 +105,10 @@ describe("Validation Rules", function(){ }); it('should be valid when array is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validArray = []; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'validArray', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -116,10 +116,10 @@ describe("Validation Rules", function(){ }); it('should be valid when null is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver, 'a', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -127,9 +127,9 @@ describe("Validation Rules", function(){ }); it('should be valid when undefined is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver, 'undefined', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -137,10 +137,10 @@ describe("Validation Rules", function(){ }); it('should be valid when string is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.someString = "hello"; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'someString', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -149,10 +149,10 @@ describe("Validation Rules", function(){ it('should be valid when string is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.someString = "hello"; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'someString', false).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -160,10 +160,10 @@ describe("Validation Rules", function(){ }); it('should be valid when array is not required', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.someArray = [1]; - var rule = new RequiredValidationRule(); + const rule = new RequiredValidationRule(); rule.validate(modelResolver,'someArray', false).then(function(isValid){ expect(isValid).to.be.true; done(); diff --git a/tests/specs/rules/step-rule-tests.ts b/tests/specs/rules/step-rule-tests.ts index 47e33fb..4a7dad0 100644 --- a/tests/specs/rules/step-rule-tests.ts +++ b/tests/specs/rules/step-rule-tests.ts @@ -7,10 +7,10 @@ describe("Validation Rules", function(){ describe('Step Rule', function () { it('should be valid when number is valid increment', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validIncrement = 10; - var rule = new StepValidationRule(); + const rule = new StepValidationRule(); rule.validate(modelResolver,'validIncrement', 5).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -18,10 +18,10 @@ describe("Validation Rules", function(){ }); it('should be valid when string number is valid increment', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.validNumberString = "10"; - var rule = new StepValidationRule(); + const rule = new StepValidationRule(); rule.validate(modelResolver,'validNumberString', 5).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -29,10 +29,10 @@ describe("Validation Rules", function(){ }); it('should be valid when provided a null value', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.a = null; - var rule = new StepValidationRule(); + const rule = new StepValidationRule(); rule.validate(modelResolver, 'a', 5).then(function(isValid){ expect(isValid).to.be.true; done(); @@ -40,10 +40,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when number is not valid increment', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidIncrement = 12; - var rule = new StepValidationRule(); + const rule = new StepValidationRule(); rule.validate(modelResolver,'invalidIncrement', 5).then(function(isValid){ expect(isValid).to.be.false; done(); @@ -51,10 +51,10 @@ describe("Validation Rules", function(){ }); it('should be invalid when string number is not valid increment', function (done) { - var modelResolver = new ModelResolver(new PropertyResolver(), {}); + const modelResolver = new ModelResolver(new PropertyResolver(), {}); modelResolver.model.invalidIncrement = "12"; - var rule = new StepValidationRule(); + const rule = new StepValidationRule(); rule.validate(modelResolver,'invalidIncrement', 5).then(function(isValid){ expect(isValid).to.be.false; done(); diff --git a/tests/specs/ruleset-builder-tests.ts b/tests/specs/ruleset-builder-tests.ts index e4783c8..5022e34 100644 --- a/tests/specs/ruleset-builder-tests.ts +++ b/tests/specs/ruleset-builder-tests.ts @@ -13,10 +13,10 @@ describe('Ruleset Builder', function () { public property2: number; } - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset: any = rulesetBuilder.create() + const ruleset: any = rulesetBuilder.create() .forProperty(x => x.property1) .addRule("required", true) .forProperty(x => x.property2) @@ -33,10 +33,10 @@ describe('Ruleset Builder', function () { }); it('should correctly add rules to the ruleset', function () { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset: any = rulesetBuilder.create() + const ruleset: any = rulesetBuilder.create() .forProperty("foo") .addRule("required", true) .addRule("maxLength", 20) @@ -50,10 +50,10 @@ describe('Ruleset Builder', function () { }); it('should support custom message strings on rules added to the ruleset', function () { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset: any = rulesetBuilder.create() + const ruleset: any = rulesetBuilder.create() .forProperty("foo") .addRule("required") .withMessage('Hi there!') @@ -66,10 +66,10 @@ describe('Ruleset Builder', function () { }); it('should support custom message functions on rules added to the ruleset', function () { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset: any = rulesetBuilder.create() + const ruleset: any = rulesetBuilder.create() .forProperty("foo") .addRule("required") .withMessage(function(v,o) { return 'Hi there,' + v + o }) @@ -82,13 +82,13 @@ describe('Ruleset Builder', function () { }); it('should correctly add rulesets to properties in the generated ruleset', function () { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var dummyRuleset: any = new Ruleset(); + const dummyRuleset: any = new Ruleset(); dummyRuleset.rules.bar = [ new RuleLink("required", true) ]; - var ruleset: any = rulesetBuilder.create() + const ruleset: any = rulesetBuilder.create() .forProperty("foo") .addRuleset(dummyRuleset) .build(); @@ -100,10 +100,10 @@ describe('Ruleset Builder', function () { }); it('should correctly add foreach rules to the ruleset', function () { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset: any = rulesetBuilder.create() + const ruleset: any = rulesetBuilder.create() .forProperty("foo") .addRuleForEach("required") .build(); @@ -115,9 +115,9 @@ describe('Ruleset Builder', function () { }); it('should not allow empty rule names with ruleRegistry', function () { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var hasFailed = false; + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + let hasFailed = false; try { @@ -134,8 +134,8 @@ describe('Ruleset Builder', function () { }); it('should not allow empty rule names without ruleRegistry', function () { - var rulesetBuilder = new RulesetBuilder(); - var hasFailed = false; + const rulesetBuilder = new RulesetBuilder(); + let hasFailed = false; try { @@ -152,9 +152,9 @@ describe('Ruleset Builder', function () { }); it('should not allow unregistered rule names with ruleRegistry', function () { - var ruleRegistry = new RuleRegistry(); - var rulesetBuilder = new RulesetBuilder(ruleRegistry); - var hasFailed = false; + const ruleRegistry = new RuleRegistry(); + const rulesetBuilder = new RulesetBuilder(ruleRegistry); + let hasFailed = false; try { @@ -171,8 +171,8 @@ describe('Ruleset Builder', function () { }); it('should not allow unregistered rule names with ruleRegistry', function () { - var rulesetBuilder = new RulesetBuilder(); - var hasFailed = false; + const rulesetBuilder = new RulesetBuilder(); + let hasFailed = false; try { diff --git a/tests/specs/treacherous-sanity-tests.ts b/tests/specs/treacherous-sanity-tests.ts index 9e8e714..536e3fd 100644 --- a/tests/specs/treacherous-sanity-tests.ts +++ b/tests/specs/treacherous-sanity-tests.ts @@ -2,22 +2,23 @@ import {expect} from "chai"; import {createRuleset, createGroup} from "../../src/exposer"; import {Ruleset} from "../../src/rulesets/ruleset"; import {ruleRegistry} from "../../src/rule-registry-setup"; +import {DefaultLocaleHandler} from "../../src/localization/default-locale-handler"; describe('Treacherous Sanity Checks', function () { it('should correctly expose methods', function () { - var ruleBuilder = createRuleset(); + const ruleBuilder = createRuleset(); expect(ruleBuilder).is.not.null; expect(ruleBuilder.create).to.be.a("function"); - var validationGroup = createGroup().build({}, new Ruleset()); + const validationGroup = createGroup().build({}, new Ruleset()); expect(validationGroup).is.not.null; expect(validationGroup.getModelErrors).to.be.a("function"); }); it('should correctly generate rules', function() { - var ruleset = createRuleset() + const ruleset = createRuleset() .forProperty("dummy") .addRule("required") .build(); @@ -27,22 +28,22 @@ describe('Treacherous Sanity Checks', function () { it('should correctly expose the rule registry', function() { - var requiredRule = ruleRegistry.getRuleNamed("required"); + const requiredRule = ruleRegistry.getRuleNamed("required"); expect(requiredRule).is.not.null; }); it('should correctly validate simple array values with foreach', function(done) { - var dummyModel = { + const dummyModel = { foo: [10, 20, 30] }; - var ruleset = createRuleset() + const ruleset = createRuleset() .forProperty("foo") .addRuleForEach("maxValue", 19) .build(); - var validationGroup = createGroup().build(dummyModel, ruleset); + const validationGroup = createGroup().build(dummyModel, ruleset); validationGroup.validate() .then(v => validationGroup.getModelErrors()) @@ -59,36 +60,36 @@ describe('Treacherous Sanity Checks', function () { it("should correctly validate dynamic nested arrays", function(done){ // product validation rules - var productRuleSet = createRuleset() + const productRuleSet = createRuleset() .forProperty("deliveryDate") .addRule("required") .build(); // order validation rules - var orderRuleSet = createRuleset() + const orderRuleSet = createRuleset() .forProperty("products") .addRulesetForEach(productRuleSet) .build(); // invoice validation rules - var invoiceRuleSet = createRuleset() + const invoiceRuleSet = createRuleset() .forProperty("orders") .addRulesetForEach(orderRuleSet) .build(); - var dummyProduct1 = { deliveryDate: null }; - var dummyProduct2 = { deliveryDate: null }; - var dummyProduct3 = { deliveryDate: null }; - var dummyProduct4 = { deliveryDate: null }; + const dummyProduct1: any = { deliveryDate: null }; + const dummyProduct2: any = { deliveryDate: null }; + const dummyProduct3: any = { deliveryDate: null }; + const dummyProduct4: any = { deliveryDate: null }; - var dummyOrder1 = { products: [ ] }; - var dummyOrder2 = { products: [ dummyProduct3, dummyProduct4 ] }; + const dummyOrder1: any = { products: [ ] }; + const dummyOrder2: any = { products: [ dummyProduct3, dummyProduct4 ] }; - var dummyInvoice = { + const dummyInvoice = { orders: [ dummyOrder1, dummyOrder2 ] }; - var invoiceValidationGroup = createGroup().build(dummyInvoice, invoiceRuleSet); + const invoiceValidationGroup = createGroup().build(dummyInvoice, invoiceRuleSet); dummyOrder1.products.push(dummyProduct1); dummyOrder1.products.push(dummyProduct2); @@ -105,21 +106,21 @@ describe('Treacherous Sanity Checks', function () { }); it("should correctly be invalid after changes when reactive and validate on startup", function(done){ - var ruleSet = createRuleset() + const ruleSet = createRuleset() .forProperty("stringValue1").addRule("required") .forProperty("stringValue2").addRule("required") .build(); - var model = { + const model = { stringValue1: "", stringValue2: "" }; - var isValid; - var valGroup = createGroup().asReactiveGroup().andValidateOnStart().build(model, ruleSet); + let isValid: boolean; + const valGroup = createGroup().asReactiveGroup().andValidateOnStart().build(model, ruleSet); valGroup.modelStateChangedEvent.subscribe(event => { console.log("changing state:", event); - isValid = event.isValid + isValid = event.isValid; }); valGroup.propertyStateChangedEvent.subscribe(event => { @@ -136,38 +137,45 @@ describe('Treacherous Sanity Checks', function () { }); it("should correctly allow composite rules and normal rules and work together", async function(){ - let ruleSet = createRuleset() + const message = "The total is not greater than 10"; + + const ruleSet = createRuleset() .forProperty("number1").addRule("minValue", 1) .addDynamicRule("totalNumber", x => { - let total = x.resolve("number1") + x.resolve("number2"); + const total = x.resolve("number1") + x.resolve("number2"); return Promise.resolve(total > 10); - }, - "The total is not greater than 10") + }) .build(); - let model = { + const model = { number1: 0, number2: 0 }; - let valGroup = createGroup().build(model, ruleSet); + const valGroup = createGroup().build(model, ruleSet); - let initialErrors = await valGroup.getModelErrors(true); + const localeHandler = valGroup["localeHandler"]; + + const compositeLocales: any = {}; + compositeLocales["totalNumber"] = message; + localeHandler.supplementLocaleFrom("en-us", compositeLocales); + + const initialErrors = await valGroup.getModelErrors(true); expect(initialErrors).to.include.keys("number1"); expect(initialErrors).to.include.keys("totalNumber"); console.log("initial", initialErrors); model.number1 = 8; - let nextErrors = await valGroup.getModelErrors(true); + const nextErrors = await valGroup.getModelErrors(true); expect(nextErrors).to.not.include.keys("number1"); expect(nextErrors).to.include.keys("totalNumber"); console.log("next", nextErrors); model.number2 = 5; - let noErrors = await valGroup.getModelErrors(true); + const noErrors = await valGroup.getModelErrors(true); expect(noErrors).to.not.include.keys("number1"); expect(noErrors).to.not.include.keys("totalNumber"); console.log("last", noErrors); diff --git a/tests/specs/validation-group-tests.ts b/tests/specs/validation-group-tests.ts index a4d4da9..8d27521 100644 --- a/tests/specs/validation-group-tests.ts +++ b/tests/specs/validation-group-tests.ts @@ -9,40 +9,50 @@ import {IValidationGroup} from "../../src/validation-groups/ivalidation-group"; import {ModelResolverFactory} from "../../src/factories/model-resolver-factory"; import {DynamicCompositeValidationRule} from "../../src/index"; import {PropertyStateChangedEvent} from "../../src/events/property-state-changed-event"; +import {DefaultLocaleHandler} from "../../src/localization/default-locale-handler"; +import {locale as defaultLocale} from "../../src/locales/en-us"; describe('Validation Group', function () { - var createValidationGroupFor = (model, ruleset) : IValidationGroup => { - var fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry); - var ruleResolver = new RuleResolver(); - var modelResolverFactory = new ModelResolverFactory(); - return new ValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, model, ruleset); - } - - var delayedRequiresValid = (retval:any = true, delay:number = 100) => { return { - ruleName: "delayed", - validate: function(modelResolver: IModelResolver, propertyName: string, options){ - return new Promise(function(resolve, reject){ - console.log("validating", modelResolver.resolve(propertyName)); - setTimeout(function() { resolve(modelResolver.resolve(propertyName) == "valid"); }, delay); - }); - }, - getMessage: function(value, options) { return "delayed rule: " + value; } - }}; + const defaultLocaleCode = "en-us"; + + const createValidationGroupFor = (model: any, ruleset: any) : IValidationGroup => { + const defaultLocaleHandler = new DefaultLocaleHandler(); + defaultLocaleHandler.registerLocale(defaultLocaleCode, defaultLocale); + defaultLocaleHandler.useLocale(defaultLocaleCode); + + const fieldErrorProcessor = new FieldErrorProcessor(ruleRegistry, defaultLocaleHandler); + const ruleResolver = new RuleResolver(); + const modelResolverFactory = new ModelResolverFactory(); + return new ValidationGroup(fieldErrorProcessor, ruleResolver, modelResolverFactory, + defaultLocaleHandler, model, ruleset); + }; + + const delayedRequiresValid = (retval:any = true, delay:number = 100) => { + return { + ruleName: "delayed", + validate: function(modelResolver: IModelResolver, propertyName: string, options: any){ + return new Promise(function(resolve, reject){ + console.log("validating", modelResolver.resolve(propertyName)); + setTimeout(function() { resolve(modelResolver.resolve(propertyName) == "valid"); }, delay); + }); + } + }; + }; it('should correctly get errors', function (done) { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset = rulesetBuilder.create() + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then(function(errors){ expect(errors).not.to.be.null; @@ -55,20 +65,20 @@ describe('Validation Group', function () { it('should apply appliesIf rules correctly for TRUE', function (done) { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset = rulesetBuilder.create() + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) - .appliesIf((v,o) => { return dummyModel.checkFoo }) + .appliesIf((v,o) => { return dummyModel.checkFoo; }) .build(); - var dummyModel = { + const dummyModel = { foo: "hello", checkFoo: true }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then(function(errors){ expect(errors).not.to.be.null; @@ -81,20 +91,20 @@ describe('Validation Group', function () { it('should apply appliesIf rules correctly for FALSE', function (done) { - var dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; - var rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); - var ruleset = rulesetBuilder.create() + const dummyRuleRegistry = { hasRuleNamed: function(){ return true; }}; + const rulesetBuilder = new RulesetBuilder(dummyRuleRegistry); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) - .appliesIf((v,o) => { return dummyModel.checkFoo }) + .appliesIf((v,o) => { return dummyModel.checkFoo; }) .build(); - var dummyModel = { + const dummyModel = { foo: "hello", checkFoo: false }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors() .then(function(errors){ expect(errors).not.to.be.null; @@ -107,23 +117,23 @@ describe('Validation Group', function () { it('should correctly get errors in nested objects', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var elementRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const elementRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required", true) .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleset(elementRuleset) .build(); - var dummyModel = { + const dummyModel = { foo: { bar: "not valid" } }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.validate() .then(() => { validationGroup.getModelErrors() @@ -141,19 +151,19 @@ describe('Validation Group', function () { it('should correctly get errors in complex arrays', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var elementRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const elementRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required") .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRulesetForEach(elementRuleset) .build(); - var dummyModel = { + const dummyModel = { foo: [ { bar: "hello" }, { bar: "" }, @@ -161,7 +171,7 @@ describe('Validation Group', function () { ] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then(function(errors){ console.log(dummyModel); @@ -180,17 +190,17 @@ describe('Validation Group', function () { it('should correctly get errors in simple arrays', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleForEach("maxValue", 25) .build(); - var dummyModel = { + const dummyModel = { foo: [ 10, 20, 30 ] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then(function(errors){ expect(errors).not.to.be.null; @@ -204,17 +214,17 @@ describe('Validation Group', function () { it('should correctly get property error', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.validate().then(v => { validationGroup.getPropertyError("foo") .then(function (error) { @@ -224,28 +234,28 @@ describe('Validation Group', function () { validationGroup.release(); done(); }).catch(done); - }) + }); }); it('should correctly get nested property error', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var elementRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const elementRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required", true) .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleset(elementRuleset) .build(); - var dummyModel = { + const dummyModel = { foo: { bar: "not valid" } }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.validate().then(v => { validationGroup.getPropertyError("foo.bar") .then(function(error){ @@ -254,24 +264,25 @@ describe('Validation Group', function () { expect(error).to.contain("5"); validationGroup.release(); done(); - }).catch(done) }); + }).catch(done); + }); }); it('should correctly get property error in complex arrays', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var elementRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const elementRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required") .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRulesetForEach(elementRuleset) .build(); - var dummyModel = { + const dummyModel = { foo: [ { bar: "hello" }, { bar: "" }, @@ -279,49 +290,51 @@ describe('Validation Group', function () { ] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); - var checkOne = validationGroup.validate().then(v => { + const validationGroup = createValidationGroupFor(dummyModel, ruleset); + const checkOne = validationGroup.validate() + .then(v => { validationGroup.getPropertyError("foo[1].bar") - .then(function(error){ - console.log(error); - expect(error).not.to.be.null; - expect(error).to.contain("required"); - }); + .then(function(error){ + console.log(error); + expect(error).not.to.be.null; + expect(error).to.contain("required"); + }); - var checkTwo = validationGroup.getPropertyError("foo[2].bar") - .then(function(error){ - console.log(error); - expect(error).not.to.be.null; - expect(error).to.contain("8"); - expect(error).to.contain("5"); - }); + const checkTwo = validationGroup.getPropertyError("foo[2].bar") + .then(function(error){ + console.log(error); + expect(error).not.to.be.null; + expect(error).to.contain("8"); + expect(error).to.contain("5"); + }); - Promise.all([checkOne, checkTwo]) - .then(function() { - validationGroup.release(); - done(); - }); - })}); + Promise.all([checkOne, checkTwo]) + .then(function() { + validationGroup.release(); + done(); + }); + }); + }); it('should correctly get property error in simple array', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRuleForEach("maxValue", 25) .build(); - var dummyModel = { + const dummyModel = { foo: [ 10, 20, 30 ] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.validate().then(v => { validationGroup.validateProperty("foo[2]") .then(v => { console.log(validationGroup["propertyErrors"]); - return validationGroup.getPropertyError("foo[2]") + return validationGroup.getPropertyError("foo[2]"); }) .then(function(error){ expect(error).not.to.be.null; @@ -329,22 +342,23 @@ describe('Validation Group', function () { expect(error).to.contain("30"); validationGroup.release(); done(); - }).catch(done); }) + }).catch(done); + }); }); it('should return undefined if no error exists for property', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.validateProperty("nothing") .then(() => validationGroup.getPropertyError("nothing")) .then(error => { @@ -356,18 +370,18 @@ describe('Validation Group', function () { it('should not apply array errors to child indexes', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .addRuleForEach("maxValue", 100) .build(); - var dummyModel = { + const dummyModel = { foo: [ 10, 20, 30 ] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then(function(errors){ console.log(errors); @@ -383,26 +397,26 @@ describe('Validation Group', function () { it('should correctly get errors when invalid elements added to arrays', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var elementRuleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const elementRuleset = rulesetBuilder.create() .forProperty("bar") .addRule("required") .addRule("maxLength", 5) .build(); - var ruleset = rulesetBuilder.create() + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRulesetForEach(elementRuleset) .build(); - var dummyModel = { + const dummyModel = { foo: [ { bar: "hello" }, { bar: "" } ] }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); dummyModel.foo.push({ bar: "too long" }); @@ -424,17 +438,17 @@ describe('Validation Group', function () { it('should correctly provide errors', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 15) .build(); - var dummyModel = { + const dummyModel = { foo: "this is not valid so should fail" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then((errors) => { expect(errors).not.to.be.null; @@ -448,17 +462,17 @@ describe('Validation Group', function () { it('should correctly return promise indicating validity', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 15) .build(); - var dummyModel = { + const dummyModel = { foo: "this is not valid so should fail" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors(true) .then(function(errors){ expect(errors).not.to.be.null; @@ -473,29 +487,28 @@ describe('Validation Group', function () { it('should only return errors when all validation events have finished', function (done) { // This basically delays validation so others stack - var delayedRequiresValid: any = { + const delayedRequiresValid: any = { ruleName: "delayed", - validate: function(modelResolver: IModelResolver, prop: string, options){ + validate: function(modelResolver: IModelResolver, prop: string, options: any){ return new Promise(function(resolve, reject){ setTimeout(function() { resolve(modelResolver.resolve(prop) == "valid"); }, 200); }); - }, - getMessage: function(value, options) { return "delayed rule: " + value; } + } }; ruleRegistry.registerRule(delayedRequiresValid); - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("delayed") .build(); - var dummyModel = { + const dummyModel = { foo: "invalid" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.getModelErrors() .then(function(errors){ expect(errors).to.be.empty; @@ -511,17 +524,17 @@ describe('Validation Group', function () { ruleRegistry.registerRule(delayedRequiresValid()); - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("delayed") .build(); - var dummyModel = { + const dummyModel = { foo: "invalid" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.validate() .then(function(isValid){ console.log("isValid", isValid); @@ -538,39 +551,38 @@ describe('Validation Group', function () { it('should correctly delay error requests until validation has finished', function (done) { - var delayedRequires10Rule: any = { + const delayedRequires10Rule: any = { ruleName: "delayed", - validate: function(mr, prop, options){ + validate: function(mr: any, prop: any, options: any){ return new Promise(function(resolve, reject){ setTimeout(function() { resolve(mr.resolve(prop) == 10); }, 100); }); - }, - getMessage: function(value, options) { return "delayed rule: " + value; } + } }; ruleRegistry.registerRule(delayedRequires10Rule); - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("delayed") .build(); - var dummyModel: any = { + const dummyModel: any = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); // This starts the initial validation chain so delays it - var promise1 = validationGroup.getModelErrors() + const promise1 = validationGroup.getModelErrors() .then(function(errors){ expect(errors).to.be.empty; }).catch(done); dummyModel.foo = 10; - var promise2 = validationGroup.getModelErrors() + const promise2 = validationGroup.getModelErrors() .then(function(errors){ expect(errors).to.be.empty; }).catch(done); @@ -583,18 +595,18 @@ describe('Validation Group', function () { .catch(function(error){ validationGroup.release(); done(error); - }) + }); }); it('should correctly update errors when model changed', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .build(); - var validationGroup = createValidationGroupFor({ foo: "invalid" }, ruleset); + const validationGroup = createValidationGroupFor({ foo: "invalid" }, ruleset); validationGroup.changeValidationTarget({ foo: "ok" }); validationGroup.getModelErrors() .then(function(errors){ @@ -606,15 +618,15 @@ describe('Validation Group', function () { it('should correctly allow empty model then update errors when model changed', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .forProperty("bar") .addRuleForEach("maxValue", 10) .build(); - var validationGroup = createValidationGroupFor(null, ruleset); + const validationGroup = createValidationGroupFor(null, ruleset); validationGroup.changeValidationTarget({ foo: "not ok", bar: [ 20, 10 ] }); validationGroup.getModelErrors(true) .then(function(errors){ @@ -632,16 +644,16 @@ describe('Validation Group', function () { it('should correctly report errors with empty models that later on get a schema', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 2) .forProperty("bar") .addRuleForEach("maxValue", 10) .build(); - var changingModel: any = {}; - var validationGroup = createValidationGroupFor(changingModel, ruleset); + const changingModel: any = {}; + const validationGroup = createValidationGroupFor(changingModel, ruleset); changingModel.foo = "not ok"; changingModel.bar = [ 20, 10 ]; @@ -665,17 +677,17 @@ describe('Validation Group', function () { }); it("should delay model errors until model watcher has updated", function(done){ - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("required") .build(); - var model = { + const model: any = { foo: null }; - var validationGroup = createValidationGroupFor(model, ruleset); + const validationGroup = createValidationGroupFor(model, ruleset); model.foo = "valid"; @@ -690,18 +702,19 @@ describe('Validation Group', function () { it('should correctly notify on property validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 15) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.propertyStateChangedEvent.subscribe(function(args){ + console.log("DATA", args); expect(args.isValid).to.be.false; expect(args.error).contains("15"); expect(args.property).to.equal("foo"); @@ -715,17 +728,17 @@ describe('Validation Group', function () { it('should correctly notify on model validation change', function (done) { - var rulesetBuilder = new RulesetBuilder(); - var ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("foo") .addRule("maxLength", 15) .build(); - var dummyModel = { + const dummyModel = { foo: "hello" }; - var validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); validationGroup.modelStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; validationGroup.release(); @@ -737,24 +750,28 @@ describe('Validation Group', function () { }); it('should correctly return errors for composite rules with getPropertyError', function (done) { - let validationName = "testCompositeRule"; - let expectedError = "validation triggered"; + const validationName = "testCompositeRule"; + const expectedError = "validation triggered by getPropertyError"; - let compositeRule = new DynamicCompositeValidationRule( - validationName, - () => { return Promise.resolve(false); }, - () => { return expectedError }); + const compositeRule = new DynamicCompositeValidationRule( + validationName, + () => { return Promise.resolve(false); }); - let rulesetBuilder = new RulesetBuilder(); - let ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .addCompositeRule(compositeRule) .build(); - let dummyModel = { + const dummyModel = { foo: "" }; - let validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); + const localeHandler = validationGroup["localeHandler"]; + + const compositeLocales: any = {}; + compositeLocales[validationName] = expectedError; + localeHandler.supplementLocaleFrom(defaultLocaleCode, compositeLocales); validationGroup.getPropertyError(validationName, true) .then((error) => { @@ -765,24 +782,29 @@ describe('Validation Group', function () { }); it('should correctly raise model validation changes for composite rule changes', function (done) { - let validationName = "testCompositeRule"; - let expectedError = "validation triggered"; + const validationName = "testCompositeRule"; + const expectedError = "validation triggered from rule change"; - let compositeRule = new DynamicCompositeValidationRule( + const compositeRule = new DynamicCompositeValidationRule( validationName, - () => { return Promise.resolve(false); }, - () => { return expectedError }); + () => { return Promise.resolve(false); }); - let rulesetBuilder = new RulesetBuilder(); - let ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .addCompositeRule(compositeRule) .build(); - let dummyModel = { + const dummyModel = { foo: "" }; - let validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); + const localeHandler = validationGroup["localeHandler"]; + + const compositeLocales: any = {}; + compositeLocales[validationName] = expectedError; + localeHandler.supplementLocaleFrom(defaultLocaleCode, compositeLocales); + validationGroup.modelStateChangedEvent.subscribe(function(args){ expect(args.isValid).to.be.false; validationGroup.release(); @@ -793,24 +815,29 @@ describe('Validation Group', function () { }); it('should correctly raise property validation changes for composite rule changes', function (done) { - let validationName = "testCompositeRule"; - let expectedError = "validation triggered"; + const validationName = "testCompositeRule"; + const expectedError = "validation triggered by composite"; - let compositeRule = new DynamicCompositeValidationRule( + const compositeRule = new DynamicCompositeValidationRule( validationName, - () => { return Promise.resolve(false); }, - () => { return expectedError }); + () => { return Promise.resolve(false); }); - let rulesetBuilder = new RulesetBuilder(); - let ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .addCompositeRule(compositeRule) .build(); - let dummyModel = { + const dummyModel = { foo: "" }; - let validationGroup = createValidationGroupFor(dummyModel, ruleset); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); + const localeHandler = validationGroup["localeHandler"]; + + const compositeLocales: any = {}; + compositeLocales[validationName] = expectedError; + localeHandler.supplementLocaleFrom(defaultLocaleCode, compositeLocales); + validationGroup.propertyStateChangedEvent.subscribe(function(args: PropertyStateChangedEvent){ expect(args.isValid).to.be.false; expect(args.property).to.equal(validationName); @@ -822,40 +849,40 @@ describe('Validation Group', function () { }); it('should correctly get property display name', function () { - let displayName = "User's name"; - let rulesetBuilder = new RulesetBuilder(); - let ruleset = rulesetBuilder.create() + const displayName = "User's name"; + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("username") .addRule("required") .withDisplayName(displayName) .build(); - let dummyModel = { + const dummyModel = { username: "" }; - let validationGroup = createValidationGroupFor(dummyModel, ruleset); - let actualDisplayName = validationGroup.getPropertyDisplayName("username"); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); + const actualDisplayName = validationGroup.getPropertyDisplayName("username"); expect(actualDisplayName).to.equal(displayName); }); it('should correctly check if property is within group', function () { - let rulesetBuilder = new RulesetBuilder(); - let ruleset = rulesetBuilder.create() + const rulesetBuilder = new RulesetBuilder(); + const ruleset = rulesetBuilder.create() .forProperty("propertyInGroup") .addRule("required") .build(); - let dummyModel = { + const dummyModel = { propertyInGroup: "", propertyNotInGroup: "" }; - let validationGroup = createValidationGroupFor(dummyModel, ruleset); - let shouldBeInGroup = validationGroup.isPropertyInGroup("propertyInGroup"); - let shouldNotBeInGroup = validationGroup.isPropertyInGroup("propertyNotInGroup"); - let shouldAlsoNotBeInGroup = validationGroup.isPropertyInGroup("notEvenARealProperty"); + const validationGroup = createValidationGroupFor(dummyModel, ruleset); + const shouldBeInGroup = validationGroup.isPropertyInGroup("propertyInGroup"); + const shouldNotBeInGroup = validationGroup.isPropertyInGroup("propertyNotInGroup"); + const shouldAlsoNotBeInGroup = validationGroup.isPropertyInGroup("notEvenARealProperty"); expect(shouldBeInGroup).to.be.true; expect(shouldNotBeInGroup).to.be.false; diff --git a/tsconfig.json b/tsconfig.json index 7a3e402..65a89e5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,8 @@ "moduleResolution": "node", "lib": ["es2016", "dom"], "importHelpers": true, - "noImplicitAny": true + "noImplicitAny": true, + "sourceMap": true }, "exclude": [ "node_modules" diff --git a/tslint.json b/tslint.json new file mode 100644 index 0000000..a0a116c --- /dev/null +++ b/tslint.json @@ -0,0 +1,9 @@ +{ + "rules": { + "member-access": true, + "no-reference": true, + "semicolon": true, + "variable-name": [true, "ban-keywords", "check-format", "allow-leading-underscore"] + }, + "defaultSeverity": "warning" +} \ No newline at end of file