@cratis/arc 22.28.0 → 22.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/commands/Command.ts +20 -14
  2. package/commands/for_Command/when_executing/with_rule_severities_and_declared_policy.ts +62 -0
  3. package/commands/for_Command/when_validating/with_rule_severities.ts +120 -0
  4. package/dist/cjs/commands/Command.d.ts.map +1 -1
  5. package/dist/cjs/commands/Command.js +27 -6
  6. package/dist/cjs/commands/Command.js.map +1 -1
  7. package/dist/cjs/validation/PropertyRule.d.ts +3 -0
  8. package/dist/cjs/validation/PropertyRule.d.ts.map +1 -1
  9. package/dist/cjs/validation/PropertyRule.js +13 -1
  10. package/dist/cjs/validation/PropertyRule.js.map +1 -1
  11. package/dist/cjs/validation/RuleBuilder.d.ts +2 -0
  12. package/dist/cjs/validation/RuleBuilder.d.ts.map +1 -1
  13. package/dist/cjs/validation/RuleBuilder.js +10 -0
  14. package/dist/cjs/validation/RuleBuilder.js.map +1 -1
  15. package/dist/esm/commands/Command.d.ts.map +1 -1
  16. package/dist/esm/commands/Command.js +27 -6
  17. package/dist/esm/commands/Command.js.map +1 -1
  18. package/dist/esm/commands/for_Command/when_executing/with_rule_severities_and_declared_policy.d.ts +2 -0
  19. package/dist/esm/commands/for_Command/when_executing/with_rule_severities_and_declared_policy.d.ts.map +1 -0
  20. package/dist/esm/commands/for_Command/when_executing/with_rule_severities_and_declared_policy.js +51 -0
  21. package/dist/esm/commands/for_Command/when_executing/with_rule_severities_and_declared_policy.js.map +1 -0
  22. package/dist/esm/commands/for_Command/when_validating/with_rule_severities.d.ts +2 -0
  23. package/dist/esm/commands/for_Command/when_validating/with_rule_severities.d.ts.map +1 -0
  24. package/dist/esm/commands/for_Command/when_validating/with_rule_severities.js +104 -0
  25. package/dist/esm/commands/for_Command/when_validating/with_rule_severities.js.map +1 -0
  26. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  27. package/dist/esm/validation/PropertyRule.d.ts +3 -0
  28. package/dist/esm/validation/PropertyRule.d.ts.map +1 -1
  29. package/dist/esm/validation/PropertyRule.js +13 -1
  30. package/dist/esm/validation/PropertyRule.js.map +1 -1
  31. package/dist/esm/validation/RuleBuilder.d.ts +2 -0
  32. package/dist/esm/validation/RuleBuilder.d.ts.map +1 -1
  33. package/dist/esm/validation/RuleBuilder.js +10 -0
  34. package/dist/esm/validation/RuleBuilder.js.map +1 -1
  35. package/package.json +1 -1
  36. package/validation/PropertyRule.ts +16 -1
  37. package/validation/RuleBuilder.ts +13 -0
@@ -70,12 +70,12 @@ import { ValidationResultSeverity } from '../validation/ValidationResultSeverity
70
70
  }
71
71
  /** @inheritdoc */ async validate() {
72
72
  const clientValidationErrors = this.validation?.validate(this) || [];
73
- const filteredClientErrors = this.blockOnValidationSeverity === undefined ? clientValidationErrors : this.filterValidationResultsBySeverity(clientValidationErrors);
73
+ const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);
74
74
  if (filteredClientErrors.length > 0) {
75
75
  return CommandResult.validationFailed(filteredClientErrors);
76
76
  }
77
77
  const validationErrors = this.validateRequiredProperties();
78
- const filteredRequiredErrors = this.blockOnValidationSeverity === undefined ? validationErrors : this.filterValidationResultsBySeverity(validationErrors);
78
+ const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);
79
79
  if (filteredRequiredErrors.length > 0) {
80
80
  return CommandResult.validationFailed(filteredRequiredErrors);
81
81
  }
@@ -86,20 +86,41 @@ import { ValidationResultSeverity } from '../validation/ValidationResultSeverity
86
86
  actualRoute = route;
87
87
  }
88
88
  actualRoute = `${actualRoute}/validate`;
89
- return this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');
89
+ const result = await this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');
90
+ if (result.isSuccess && clientValidationErrors.length > 0) {
91
+ return Object.assign(result, {
92
+ validationResults: [
93
+ ...result.validationResults,
94
+ ...clientValidationErrors
95
+ ]
96
+ });
97
+ }
98
+ return result;
90
99
  }
91
100
  /** @inheritdoc */ validateClientSide() {
92
101
  const clientValidationErrors = this.validation?.validate(this) || [];
93
- const filteredClientErrors = this.blockOnValidationSeverity === undefined ? clientValidationErrors : this.filterValidationResultsBySeverity(clientValidationErrors);
102
+ const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);
94
103
  if (filteredClientErrors.length > 0) {
95
104
  return CommandResult.validationFailed(filteredClientErrors);
96
105
  }
97
106
  const validationErrors = this.validateRequiredProperties();
98
- const filteredRequiredErrors = this.blockOnValidationSeverity === undefined ? validationErrors : this.filterValidationResultsBySeverity(validationErrors);
107
+ const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);
99
108
  if (filteredRequiredErrors.length > 0) {
100
109
  return CommandResult.validationFailed(filteredRequiredErrors);
101
110
  }
102
- return CommandResult.empty;
111
+ const advisoryResults = [
112
+ ...clientValidationErrors,
113
+ ...validationErrors
114
+ ];
115
+ if (advisoryResults.length === 0) {
116
+ return CommandResult.empty;
117
+ }
118
+ return new CommandResult({
119
+ ...CommandResult.empty,
120
+ correlationId: CommandResult.empty.correlationId.toString(),
121
+ validationResults: advisoryResults,
122
+ response: null
123
+ }, Object, false);
103
124
  }
104
125
  buildPayload() {
105
126
  const payload = {};
@@ -1 +1 @@
1
- {"version":3,"file":"Command.js","sources":["../../../commands/Command.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ICommand, PropertyChanged } from './ICommand.js';\nimport { CommandResult } from \"./CommandResult.js\";\nimport { CommandValidator } from './CommandValidator.js';\nimport { Constructor, JsonSerializer } from '@cratis/fundamentals';\nimport { Globals } from '../Globals.js';\nimport { joinPaths } from '../joinPaths.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport { PropertyDescriptor } from '../reflection/PropertyDescriptor.js';\nimport { ValidationResult } from '../validation/ValidationResult.js';\nimport { ValidationResultSeverity } from '../validation/ValidationResultSeverity.js';\n\ntype Callback = {\n callback: WeakRef<PropertyChanged>;\n thisArg: WeakRef<object>;\n}\n\n/**\n * Represents an implementation of {@link ICommand} that works with HTTP fetch.\n */\nexport abstract class Command<TCommandContent = object, TCommandResponse = object> implements ICommand<TCommandContent, TCommandResponse> {\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _httpHeadersCallback: GetHttpHeaders;\n abstract readonly route: string;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n readonly validation?: CommandValidator<any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n readonly roles: string[] = [];\n /** Inclusive minimum blocking severity declared by a model-bound command proxy. */\n readonly blockOnValidationSeverity?: ValidationResultSeverity;\n abstract readonly propertyDescriptors: PropertyDescriptor[];\n abstract get requestParameters(): string[];\n\n private _initialValues: object = {};\n private _hasChanges = false;\n private _callbacks: Callback[] = [];\n\n /**\n * Initializes a new instance of the {@link Command<,>} class.\n * @param _responseType Type of response.\n * @param _isResponseTypeEnumerable Whether or not the response type is enumerable.\n */\n constructor(readonly _responseType: Constructor = Object, readonly _isResponseTypeEnumerable: boolean) {\n this._microservice = Globals.microservice ?? '';\n this._apiBasePath = Globals.apiBasePath ?? '';\n this._origin = Globals.origin ?? '';\n this._httpHeadersCallback = () => ({});\n }\n\n /** @inheritdoc */\n setMicroservice(microservice: string) {\n this._microservice = microservice;\n }\n\n /** @inheritdoc */\n setApiBasePath(apiBasePath: string): void {\n this._apiBasePath = apiBasePath;\n }\n\n /** @inheritdoc */\n setOrigin(origin: string): void {\n this._origin = origin;\n }\n\n /** @inheritdoc */\n setHttpHeadersCallback(callback: GetHttpHeaders): void {\n this._httpHeadersCallback = callback;\n }\n\n /** @inheritdoc */\n async execute(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors, allowedSeverity, ignoreWarnings);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors, allowedSeverity, ignoreWarnings);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n let actualRoute = this.route;\n\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);\n actualRoute = route;\n }\n\n const result = await this.performRequest(actualRoute, 'Command not found at route', 'Error during server call', allowedSeverity, ignoreWarnings);\n this.setInitialValuesFromCurrentValues();\n return result;\n }\n\n /** @inheritdoc */\n async validate(): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.blockOnValidationSeverity === undefined\n ? clientValidationErrors\n : this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.blockOnValidationSeverity === undefined\n ? validationErrors\n : this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n let actualRoute = this.route;\n\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);\n actualRoute = route;\n }\n\n actualRoute = `${actualRoute}/validate`;\n return this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');\n }\n\n /** @inheritdoc */\n validateClientSide(): CommandResult<TCommandResponse> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.blockOnValidationSeverity === undefined\n ? clientValidationErrors\n : this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.blockOnValidationSeverity === undefined\n ? validationErrors\n : this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n return CommandResult.empty as unknown as CommandResult<TCommandResponse>;\n }\n\n private buildPayload(): object {\n const payload = {};\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n payload[property] = this[property];\n });\n return payload;\n }\n\n private validateRequiredProperties(): ValidationResult[] {\n const validationErrors: ValidationResult[] = [];\n this.propertyDescriptors.forEach(propertyDescriptor => {\n if (!propertyDescriptor.isOptional && !this.requestParameters.includes(propertyDescriptor.name)) {\n const value = this[propertyDescriptor.name];\n if (value === undefined || value === null) {\n validationErrors.push(new ValidationResult(\n ValidationResultSeverity.Error,\n `${propertyDescriptor.name} is required`,\n [propertyDescriptor.name],\n null\n ));\n }\n }\n });\n return validationErrors;\n }\n\n private filterValidationResultsBySeverity(validationResults: ValidationResult[], allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): ValidationResult[] {\n if (this.blockOnValidationSeverity !== undefined) {\n const effectiveAllowed = Math.min(allowedSeverity ?? ValidationResultSeverity.Error, this.blockOnValidationSeverity - 1);\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Unknown || result.severity > effectiveAllowed);\n }\n if (ignoreWarnings === true) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n if (allowedSeverity === undefined) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n return validationResults.filter(result => result.severity > allowedSeverity);\n }\n\n private buildHeaders(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): HeadersInit {\n const customHeaders = this._httpHeadersCallback?.() ?? {};\n const headers = {\n ...customHeaders,\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n };\n\n if (this._microservice?.length > 0) {\n headers[Globals.microserviceHttpHeader] = this._microservice;\n }\n\n if (allowedSeverity !== undefined) {\n headers['X-Allowed-Severity'] = allowedSeverity.toString();\n }\n\n if (ignoreWarnings === true) {\n headers['X-Ignore-Warnings'] = 'true';\n }\n\n return headers;\n }\n\n private async performRequest(\n route: string,\n notFoundMessage: string,\n errorMessage: string,\n allowedSeverity?: ValidationResultSeverity,\n ignoreWarnings?: boolean\n ): Promise<CommandResult<TCommandResponse>> {\n const payload = this.buildPayload();\n const headers = this.buildHeaders(allowedSeverity, ignoreWarnings);\n const actualRoute = joinPaths(this._apiBasePath, route);\n const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JsonSerializer.serialize(payload)\n });\n\n if (response.status === 404) {\n return CommandResult.failed([`${notFoundMessage} '${actualRoute}'`]) as CommandResult<TCommandResponse>;\n }\n\n const result = await response.json();\n return new CommandResult(result, this._responseType, this._isResponseTypeEnumerable);\n } catch (ex) {\n return CommandResult.failed([`${errorMessage}: ${ex}`]) as CommandResult<TCommandResponse>;\n }\n }\n\n /** @inheritdoc */\n clear(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = undefined;\n });\n this._initialValues = {};\n this._hasChanges = false;\n }\n\n /** @inheritdoc */\n setInitialValues(values: TCommandContent) {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (Object.prototype.hasOwnProperty.call(values, property)) {\n this._initialValues[property] = values[property];\n this[property] = values[property];\n }\n });\n this.updateHasChanges();\n }\n\n /** @inheritdoc */\n setInitialValuesFromCurrentValues() {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (this[property]) {\n this._initialValues[property] = this[property];\n }\n });\n this.updateHasChanges();\n }\n\n /** @inheritdoc */\n revertChanges(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = this._initialValues[property];\n });\n }\n\n /** @inheritdoc */\n get hasChanges() {\n return this._hasChanges;\n }\n\n /** @inheritdoc */\n propertyChanged(property: string) {\n this.updateHasChanges();\n\n this._callbacks.forEach(callbackContainer => {\n const callback = callbackContainer.callback.deref();\n const thisArg = callbackContainer.thisArg.deref();\n if (callback && thisArg) {\n callback.call(thisArg, property);\n } else {\n this._callbacks = this._callbacks.filter(_ => _.callback !== callbackContainer.callback);\n }\n });\n }\n\n /** @inheritdoc */\n onPropertyChanged(callback: PropertyChanged, thisArg: object) {\n this._callbacks.push({\n callback: new WeakRef(callback),\n thisArg: new WeakRef(thisArg)\n });\n }\n\n private updateHasChanges() {\n this._hasChanges = this.propertyDescriptors.some(propertyDescriptor => {\n const property = propertyDescriptor.name;\n return this[property] !== this._initialValues[property];\n });\n }\n}\n"],"names":["Command","_microservice","_apiBasePath","_origin","_httpHeadersCallback","validation","roles","blockOnValidationSeverity","_initialValues","_hasChanges","_callbacks","_responseType","Object","_isResponseTypeEnumerable","Globals","microservice","apiBasePath","origin","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","execute","allowedSeverity","ignoreWarnings","clientValidationErrors","validate","filteredClientErrors","filterValidationResultsBySeverity","length","CommandResult","validationFailed","validationErrors","validateRequiredProperties","filteredRequiredErrors","actualRoute","route","requestParameters","payload","buildPayload","UrlHelpers","replaceRouteParameters","result","performRequest","setInitialValuesFromCurrentValues","undefined","validateClientSide","empty","propertyDescriptors","forEach","propertyDescriptor","property","name","isOptional","includes","value","push","ValidationResult","ValidationResultSeverity","Error","validationResults","effectiveAllowed","Math","min","filter","severity","Unknown","buildHeaders","customHeaders","headers","microserviceHttpHeader","toString","notFoundMessage","errorMessage","joinPaths","url","createUrlFrom","response","fetch","method","body","JsonSerializer","serialize","status","failed","json","ex","clear","setInitialValues","values","prototype","hasOwnProperty","call","updateHasChanges","revertChanges","hasChanges","propertyChanged","callbackContainer","deref","thisArg","_","onPropertyChanged","WeakRef","some"],"mappings":"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"}
1
+ {"version":3,"file":"Command.js","sources":["../../../commands/Command.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ICommand, PropertyChanged } from './ICommand.js';\nimport { CommandResult } from \"./CommandResult.js\";\nimport { CommandValidator } from './CommandValidator.js';\nimport { Constructor, JsonSerializer } from '@cratis/fundamentals';\nimport { Globals } from '../Globals.js';\nimport { joinPaths } from '../joinPaths.js';\nimport { UrlHelpers } from '../UrlHelpers.js';\nimport { GetHttpHeaders } from '../GetHttpHeaders.js';\nimport { PropertyDescriptor } from '../reflection/PropertyDescriptor.js';\nimport { ValidationResult } from '../validation/ValidationResult.js';\nimport { ValidationResultSeverity } from '../validation/ValidationResultSeverity.js';\n\ntype Callback = {\n callback: WeakRef<PropertyChanged>;\n thisArg: WeakRef<object>;\n}\n\n/**\n * Represents an implementation of {@link ICommand} that works with HTTP fetch.\n */\nexport abstract class Command<TCommandContent = object, TCommandResponse = object> implements ICommand<TCommandContent, TCommandResponse> {\n private _microservice: string;\n private _apiBasePath: string;\n private _origin: string;\n private _httpHeadersCallback: GetHttpHeaders;\n abstract readonly route: string;\n /* eslint-disable @typescript-eslint/no-explicit-any */\n readonly validation?: CommandValidator<any>;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n readonly roles: string[] = [];\n /** Inclusive minimum blocking severity declared by a model-bound command proxy. */\n readonly blockOnValidationSeverity?: ValidationResultSeverity;\n abstract readonly propertyDescriptors: PropertyDescriptor[];\n abstract get requestParameters(): string[];\n\n private _initialValues: object = {};\n private _hasChanges = false;\n private _callbacks: Callback[] = [];\n\n /**\n * Initializes a new instance of the {@link Command<,>} class.\n * @param _responseType Type of response.\n * @param _isResponseTypeEnumerable Whether or not the response type is enumerable.\n */\n constructor(readonly _responseType: Constructor = Object, readonly _isResponseTypeEnumerable: boolean) {\n this._microservice = Globals.microservice ?? '';\n this._apiBasePath = Globals.apiBasePath ?? '';\n this._origin = Globals.origin ?? '';\n this._httpHeadersCallback = () => ({});\n }\n\n /** @inheritdoc */\n setMicroservice(microservice: string) {\n this._microservice = microservice;\n }\n\n /** @inheritdoc */\n setApiBasePath(apiBasePath: string): void {\n this._apiBasePath = apiBasePath;\n }\n\n /** @inheritdoc */\n setOrigin(origin: string): void {\n this._origin = origin;\n }\n\n /** @inheritdoc */\n setHttpHeadersCallback(callback: GetHttpHeaders): void {\n this._httpHeadersCallback = callback;\n }\n\n /** @inheritdoc */\n async execute(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors, allowedSeverity, ignoreWarnings);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors, allowedSeverity, ignoreWarnings);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n let actualRoute = this.route;\n\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);\n actualRoute = route;\n }\n\n const result = await this.performRequest(actualRoute, 'Command not found at route', 'Error during server call', allowedSeverity, ignoreWarnings);\n this.setInitialValuesFromCurrentValues();\n return result;\n }\n\n /** @inheritdoc */\n async validate(): Promise<CommandResult<TCommandResponse>> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n let actualRoute = this.route;\n\n if (this.requestParameters && this.requestParameters.length > 0) {\n const payload = this.buildPayload();\n const { route } = UrlHelpers.replaceRouteParameters(this.route, payload);\n actualRoute = route;\n }\n\n actualRoute = `${actualRoute}/validate`;\n const result = await this.performRequest(actualRoute, 'Command validation endpoint not found at route', 'Error during validation call');\n if (result.isSuccess && clientValidationErrors.length > 0) {\n return Object.assign(result, { validationResults: [...result.validationResults, ...clientValidationErrors] });\n }\n return result;\n }\n\n /** @inheritdoc */\n validateClientSide(): CommandResult<TCommandResponse> {\n const clientValidationErrors = this.validation?.validate(this) || [];\n const filteredClientErrors = this.filterValidationResultsBySeverity(clientValidationErrors);\n if (filteredClientErrors.length > 0) {\n return CommandResult.validationFailed(filteredClientErrors) as CommandResult<TCommandResponse>;\n }\n\n const validationErrors = this.validateRequiredProperties();\n const filteredRequiredErrors = this.filterValidationResultsBySeverity(validationErrors);\n if (filteredRequiredErrors.length > 0) {\n return CommandResult.validationFailed(filteredRequiredErrors) as CommandResult<TCommandResponse>;\n }\n\n const advisoryResults = [...clientValidationErrors, ...validationErrors];\n if (advisoryResults.length === 0) {\n return CommandResult.empty as CommandResult<TCommandResponse>;\n }\n\n return new CommandResult({\n ...CommandResult.empty,\n correlationId: CommandResult.empty.correlationId.toString(),\n validationResults: advisoryResults,\n response: null\n }, Object, false) as CommandResult<TCommandResponse>;\n }\n\n private buildPayload(): object {\n const payload = {};\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n payload[property] = this[property];\n });\n return payload;\n }\n\n private validateRequiredProperties(): ValidationResult[] {\n const validationErrors: ValidationResult[] = [];\n this.propertyDescriptors.forEach(propertyDescriptor => {\n if (!propertyDescriptor.isOptional && !this.requestParameters.includes(propertyDescriptor.name)) {\n const value = this[propertyDescriptor.name];\n if (value === undefined || value === null) {\n validationErrors.push(new ValidationResult(\n ValidationResultSeverity.Error,\n `${propertyDescriptor.name} is required`,\n [propertyDescriptor.name],\n null\n ));\n }\n }\n });\n return validationErrors;\n }\n\n private filterValidationResultsBySeverity(validationResults: ValidationResult[], allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): ValidationResult[] {\n if (this.blockOnValidationSeverity !== undefined) {\n const effectiveAllowed = Math.min(allowedSeverity ?? ValidationResultSeverity.Error, this.blockOnValidationSeverity - 1);\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Unknown || result.severity > effectiveAllowed);\n }\n if (ignoreWarnings === true) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n if (allowedSeverity === undefined) {\n return validationResults.filter(result => result.severity === ValidationResultSeverity.Error);\n }\n return validationResults.filter(result => result.severity > allowedSeverity);\n }\n\n private buildHeaders(allowedSeverity?: ValidationResultSeverity, ignoreWarnings?: boolean): HeadersInit {\n const customHeaders = this._httpHeadersCallback?.() ?? {};\n const headers = {\n ...customHeaders,\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n };\n\n if (this._microservice?.length > 0) {\n headers[Globals.microserviceHttpHeader] = this._microservice;\n }\n\n if (allowedSeverity !== undefined) {\n headers['X-Allowed-Severity'] = allowedSeverity.toString();\n }\n\n if (ignoreWarnings === true) {\n headers['X-Ignore-Warnings'] = 'true';\n }\n\n return headers;\n }\n\n private async performRequest(\n route: string,\n notFoundMessage: string,\n errorMessage: string,\n allowedSeverity?: ValidationResultSeverity,\n ignoreWarnings?: boolean\n ): Promise<CommandResult<TCommandResponse>> {\n const payload = this.buildPayload();\n const headers = this.buildHeaders(allowedSeverity, ignoreWarnings);\n const actualRoute = joinPaths(this._apiBasePath, route);\n const url = UrlHelpers.createUrlFrom(this._origin, this._apiBasePath, actualRoute);\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JsonSerializer.serialize(payload)\n });\n\n if (response.status === 404) {\n return CommandResult.failed([`${notFoundMessage} '${actualRoute}'`]) as CommandResult<TCommandResponse>;\n }\n\n const result = await response.json();\n return new CommandResult(result, this._responseType, this._isResponseTypeEnumerable);\n } catch (ex) {\n return CommandResult.failed([`${errorMessage}: ${ex}`]) as CommandResult<TCommandResponse>;\n }\n }\n\n /** @inheritdoc */\n clear(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = undefined;\n });\n this._initialValues = {};\n this._hasChanges = false;\n }\n\n /** @inheritdoc */\n setInitialValues(values: TCommandContent) {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (Object.prototype.hasOwnProperty.call(values, property)) {\n this._initialValues[property] = values[property];\n this[property] = values[property];\n }\n });\n this.updateHasChanges();\n }\n\n /** @inheritdoc */\n setInitialValuesFromCurrentValues() {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n if (this[property]) {\n this._initialValues[property] = this[property];\n }\n });\n this.updateHasChanges();\n }\n\n /** @inheritdoc */\n revertChanges(): void {\n this.propertyDescriptors.forEach(propertyDescriptor => {\n const property = propertyDescriptor.name;\n this[property] = this._initialValues[property];\n });\n }\n\n /** @inheritdoc */\n get hasChanges() {\n return this._hasChanges;\n }\n\n /** @inheritdoc */\n propertyChanged(property: string) {\n this.updateHasChanges();\n\n this._callbacks.forEach(callbackContainer => {\n const callback = callbackContainer.callback.deref();\n const thisArg = callbackContainer.thisArg.deref();\n if (callback && thisArg) {\n callback.call(thisArg, property);\n } else {\n this._callbacks = this._callbacks.filter(_ => _.callback !== callbackContainer.callback);\n }\n });\n }\n\n /** @inheritdoc */\n onPropertyChanged(callback: PropertyChanged, thisArg: object) {\n this._callbacks.push({\n callback: new WeakRef(callback),\n thisArg: new WeakRef(thisArg)\n });\n }\n\n private updateHasChanges() {\n this._hasChanges = this.propertyDescriptors.some(propertyDescriptor => {\n const property = propertyDescriptor.name;\n return this[property] !== this._initialValues[property];\n });\n }\n}\n"],"names":["Command","_microservice","_apiBasePath","_origin","_httpHeadersCallback","validation","roles","blockOnValidationSeverity","_initialValues","_hasChanges","_callbacks","_responseType","Object","_isResponseTypeEnumerable","Globals","microservice","apiBasePath","origin","setMicroservice","setApiBasePath","setOrigin","setHttpHeadersCallback","callback","execute","allowedSeverity","ignoreWarnings","clientValidationErrors","validate","filteredClientErrors","filterValidationResultsBySeverity","length","CommandResult","validationFailed","validationErrors","validateRequiredProperties","filteredRequiredErrors","actualRoute","route","requestParameters","payload","buildPayload","UrlHelpers","replaceRouteParameters","result","performRequest","setInitialValuesFromCurrentValues","isSuccess","assign","validationResults","validateClientSide","advisoryResults","empty","correlationId","toString","response","propertyDescriptors","forEach","propertyDescriptor","property","name","isOptional","includes","value","undefined","push","ValidationResult","ValidationResultSeverity","Error","effectiveAllowed","Math","min","filter","severity","Unknown","buildHeaders","customHeaders","headers","microserviceHttpHeader","notFoundMessage","errorMessage","joinPaths","url","createUrlFrom","fetch","method","body","JsonSerializer","serialize","status","failed","json","ex","clear","setInitialValues","values","prototype","hasOwnProperty","call","updateHasChanges","revertChanges","hasChanges","propertyChanged","callbackContainer","deref","thisArg","_","onPropertyChanged","WeakRef","some"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '../../../validation/RuleBuilderExtensions.js';
2
+ //# sourceMappingURL=with_rule_severities_and_declared_policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_rule_severities_and_declared_policy.d.ts","sourceRoot":"","sources":["../../../../../commands/for_Command/when_executing/with_rule_severities_and_declared_policy.ts"],"names":[],"mappings":"AAQA,OAAO,8CAA8C,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { Command } from '../../Command.js';
2
+ import { CommandResult } from '../../CommandResult.js';
3
+ import { CommandValidator } from '../../CommandValidator.js';
4
+ import { ValidationResultSeverity } from '../../../validation/ValidationResultSeverity.js';
5
+ import '../../../validation/RuleBuilderExtensions.js';
6
+ import { createFetchHelper } from '../../../helpers/fetchHelper.js';
7
+ class PolicyValidator extends CommandValidator {
8
+ constructor() {
9
+ super();
10
+ this.ruleFor(c => c.information).notEmpty().withSeverity(ValidationResultSeverity.Information);
11
+ this.ruleFor(c => c.error).notEmpty().withSeverity(ValidationResultSeverity.Error);
12
+ this.ruleFor(c => c.dynamic).notEmpty().withSeverity(null);
13
+ }
14
+ }
15
+ class PolicyCommand extends Command {
16
+ route = '/test';
17
+ validation = new PolicyValidator();
18
+ blockOnValidationSeverity = ValidationResultSeverity.Warning;
19
+ propertyDescriptors = [];
20
+ information = '';
21
+ error = 'valid';
22
+ dynamic = '';
23
+ get requestParameters() { return []; }
24
+ }
25
+ describe('when executing with rule severities and a declared warning policy', () => {
26
+ let command;
27
+ let fetchStub;
28
+ let fetchHelper;
29
+ beforeEach(() => {
30
+ command = new PolicyCommand(Object, false);
31
+ command.setOrigin('http://localhost');
32
+ fetchHelper = createFetchHelper();
33
+ fetchStub = fetchHelper.stubFetch();
34
+ fetchStub.resolves({ json: async () => ({ ...CommandResult.empty, correlationId: CommandResult.empty.correlationId.toString() }) });
35
+ });
36
+ afterEach(() => fetchHelper.restore());
37
+ it('lets information and runtime-dependent severity reach the server', async () => {
38
+ const result = await command.execute();
39
+ result.isSuccess.should.be.true;
40
+ fetchStub.should.have.been.calledOnce;
41
+ });
42
+ it('blocks errors locally even with a permissive caller threshold', async () => {
43
+ command.error = '';
44
+ const result = await command.execute(ValidationResultSeverity.Error);
45
+ result.isSuccess.should.be.false;
46
+ result.validationResults.should.have.length(1);
47
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Error);
48
+ fetchStub.should.not.have.been.called;
49
+ });
50
+ });
51
+ //# sourceMappingURL=with_rule_severities_and_declared_policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_rule_severities_and_declared_policy.js","sourceRoot":"","sources":["../../../../../commands/for_Command/when_executing/with_rule_severities_and_declared_policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import '../../../validation/RuleBuilderExtensions.js';
2
+ //# sourceMappingURL=with_rule_severities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_rule_severities.d.ts","sourceRoot":"","sources":["../../../../../commands/for_Command/when_validating/with_rule_severities.ts"],"names":[],"mappings":"AAQA,OAAO,8CAA8C,CAAC"}
@@ -0,0 +1,104 @@
1
+ import { Command } from '../../Command.js';
2
+ import { CommandResult } from '../../CommandResult.js';
3
+ import { CommandValidator } from '../../CommandValidator.js';
4
+ import { ValidationResultSeverity } from '../../../validation/ValidationResultSeverity.js';
5
+ import '../../../validation/RuleBuilderExtensions.js';
6
+ import { createFetchHelper } from '../../../helpers/fetchHelper.js';
7
+ class SeverityValidator extends CommandValidator {
8
+ constructor() {
9
+ super();
10
+ this.ruleFor(c => c.warning).notEmpty().withSeverity(ValidationResultSeverity.Warning);
11
+ this.ruleFor(c => c.error).notEmpty();
12
+ this.ruleFor(c => c.information).notEmpty().withSeverity(ValidationResultSeverity.Information);
13
+ }
14
+ }
15
+ class SeverityCommand extends Command {
16
+ route = '/test';
17
+ validation = new SeverityValidator();
18
+ propertyDescriptors = [];
19
+ warning = '';
20
+ error = 'valid';
21
+ information = 'valid';
22
+ get requestParameters() { return []; }
23
+ }
24
+ class PolicyCommand extends SeverityCommand {
25
+ blockOnValidationSeverity = ValidationResultSeverity.Warning;
26
+ }
27
+ describe('when validating command rule severities', () => {
28
+ let command;
29
+ let fetchStub;
30
+ let fetchHelper;
31
+ beforeEach(() => {
32
+ command = new SeverityCommand(Object, false);
33
+ command.setOrigin('http://localhost');
34
+ fetchHelper = createFetchHelper();
35
+ fetchStub = fetchHelper.stubFetch();
36
+ fetchStub.resolves({ json: async () => ({ ...CommandResult.empty, correlationId: CommandResult.empty.correlationId.toString() }) });
37
+ });
38
+ afterEach(() => fetchHelper.restore());
39
+ it('returns warning-only local results as valid advisories without a policy', () => {
40
+ const result = command.validateClientSide();
41
+ result.isSuccess.should.be.true;
42
+ result.isValid.should.be.true;
43
+ result.validationResults.should.have.length(1);
44
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Warning);
45
+ fetchStub.should.not.have.been.called;
46
+ });
47
+ it('calls server validation with a warning-only local result and returns its advisory', async () => {
48
+ const result = await command.validate();
49
+ result.isSuccess.should.be.true;
50
+ result.isValid.should.be.true;
51
+ result.validationResults.should.have.length(1);
52
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Warning);
53
+ fetchStub.should.have.been.calledOnce;
54
+ fetchStub.firstCall.args[0].toString().should.contain('/test/validate');
55
+ });
56
+ it('rejects an error locally in both methods without a policy', async () => {
57
+ command.error = '';
58
+ const localResult = command.validateClientSide();
59
+ const preflightResult = await command.validate();
60
+ for (const result of [localResult, preflightResult]) {
61
+ result.isValid.should.be.false;
62
+ result.validationResults.should.have.length(1);
63
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Error);
64
+ }
65
+ fetchStub.should.not.have.been.called;
66
+ });
67
+ it('rejects a warning locally in both methods when a warning policy is declared', async () => {
68
+ command = new PolicyCommand(Object, false);
69
+ const localResult = command.validateClientSide();
70
+ const preflightResult = await command.validate();
71
+ for (const result of [localResult, preflightResult]) {
72
+ result.isValid.should.be.false;
73
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Warning);
74
+ }
75
+ fetchStub.should.not.have.been.called;
76
+ });
77
+ it('returns information advisories under a declared warning policy and still calls the server', async () => {
78
+ command = new PolicyCommand(Object, false);
79
+ command.setOrigin('http://localhost');
80
+ command.warning = 'valid';
81
+ command.information = '';
82
+ const localResult = command.validateClientSide();
83
+ const preflightResult = await command.validate();
84
+ for (const result of [localResult, preflightResult]) {
85
+ result.isValid.should.be.true;
86
+ result.validationResults.should.have.length(1);
87
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Information);
88
+ }
89
+ fetchStub.should.have.been.calledOnce;
90
+ });
91
+ it('rejects an error locally in both methods when a warning policy is declared', async () => {
92
+ command = new PolicyCommand(Object, false);
93
+ command.warning = 'valid';
94
+ command.error = '';
95
+ const localResult = command.validateClientSide();
96
+ const preflightResult = await command.validate();
97
+ for (const result of [localResult, preflightResult]) {
98
+ result.isValid.should.be.false;
99
+ result.validationResults[0].severity.should.equal(ValidationResultSeverity.Error);
100
+ }
101
+ fetchStub.should.not.have.been.called;
102
+ });
103
+ });
104
+ //# sourceMappingURL=with_rule_severities.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_rule_severities.js","sourceRoot":"","sources":["../../../../../commands/for_Command/when_validating/with_rule_severities.ts"],"names":[],"mappings":"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"}