@cratis/arc 22.139.0 → 22.140.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 (66) hide show
  1. package/UrlHelpers.ts +20 -1
  2. package/commands/Command.ts +7 -1
  3. package/commands/for_Command/when_validating/with_null_required_property.ts +4 -1
  4. package/commands/for_Command/when_validating/with_required_property_missing.ts +7 -1
  5. package/dist/cjs/UrlHelpers.d.ts +1 -0
  6. package/dist/cjs/UrlHelpers.d.ts.map +1 -1
  7. package/dist/cjs/UrlHelpers.js +17 -1
  8. package/dist/cjs/UrlHelpers.js.map +1 -1
  9. package/dist/cjs/commands/Command.d.ts.map +1 -1
  10. package/dist/cjs/commands/Command.js +5 -1
  11. package/dist/cjs/commands/Command.js.map +1 -1
  12. package/dist/cjs/queries/ObservableQueryMultiplexer.d.ts.map +1 -1
  13. package/dist/cjs/queries/ObservableQueryMultiplexer.js +2 -1
  14. package/dist/cjs/queries/ObservableQueryMultiplexer.js.map +1 -1
  15. package/dist/cjs/validation/ValidationResult.d.ts.map +1 -1
  16. package/dist/cjs/validation/ValidationResult.js +4 -1
  17. package/dist/cjs/validation/ValidationResult.js.map +1 -1
  18. package/dist/cjs/validation/ValidationResultReasonDetail.d.ts +4 -0
  19. package/dist/cjs/validation/ValidationResultReasonDetail.d.ts.map +1 -0
  20. package/dist/cjs/validation/ValidationResultReasonDetail.js +15 -0
  21. package/dist/cjs/validation/ValidationResultReasonDetail.js.map +1 -0
  22. package/dist/cjs/validation/index.d.ts +1 -0
  23. package/dist/cjs/validation/index.d.ts.map +1 -1
  24. package/dist/cjs/validation/index.js +2 -0
  25. package/dist/cjs/validation/index.js.map +1 -1
  26. package/dist/esm/UrlHelpers.d.ts +1 -0
  27. package/dist/esm/UrlHelpers.d.ts.map +1 -1
  28. package/dist/esm/UrlHelpers.js +17 -2
  29. package/dist/esm/UrlHelpers.js.map +1 -1
  30. package/dist/esm/commands/Command.d.ts.map +1 -1
  31. package/dist/esm/commands/Command.js +5 -1
  32. package/dist/esm/commands/Command.js.map +1 -1
  33. package/dist/esm/commands/for_Command/when_validating/with_null_required_property.js +4 -1
  34. package/dist/esm/commands/for_Command/when_validating/with_null_required_property.js.map +1 -1
  35. package/dist/esm/commands/for_Command/when_validating/with_required_property_missing.js +7 -1
  36. package/dist/esm/commands/for_Command/when_validating/with_required_property_missing.js.map +1 -1
  37. package/dist/esm/for_UrlHelpers/when_building_query_params/with_object_values.d.ts +2 -0
  38. package/dist/esm/for_UrlHelpers/when_building_query_params/with_object_values.d.ts.map +1 -0
  39. package/dist/esm/for_UrlHelpers/when_building_query_params/with_object_values.js +23 -0
  40. package/dist/esm/for_UrlHelpers/when_building_query_params/with_object_values.js.map +1 -0
  41. package/dist/esm/queries/ObservableQueryMultiplexer.d.ts.map +1 -1
  42. package/dist/esm/queries/ObservableQueryMultiplexer.js +2 -1
  43. package/dist/esm/queries/ObservableQueryMultiplexer.js.map +1 -1
  44. package/dist/esm/queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.d.ts +2 -0
  45. package/dist/esm/queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.d.ts.map +1 -0
  46. package/dist/esm/queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.js +22 -0
  47. package/dist/esm/queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.js.map +1 -0
  48. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  49. package/dist/esm/validation/ValidationResult.d.ts.map +1 -1
  50. package/dist/esm/validation/ValidationResult.js +4 -1
  51. package/dist/esm/validation/ValidationResult.js.map +1 -1
  52. package/dist/esm/validation/ValidationResultReasonDetail.d.ts +4 -0
  53. package/dist/esm/validation/ValidationResultReasonDetail.d.ts.map +1 -0
  54. package/dist/esm/validation/ValidationResultReasonDetail.js +13 -0
  55. package/dist/esm/validation/ValidationResultReasonDetail.js.map +1 -0
  56. package/dist/esm/validation/index.d.ts +1 -0
  57. package/dist/esm/validation/index.d.ts.map +1 -1
  58. package/dist/esm/validation/index.js +1 -0
  59. package/dist/esm/validation/index.js.map +1 -1
  60. package/for_UrlHelpers/when_building_query_params/with_object_values.ts +30 -0
  61. package/package.json +1 -1
  62. package/queries/ObservableQueryMultiplexer.ts +2 -1
  63. package/queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.ts +27 -0
  64. package/validation/ValidationResult.ts +4 -1
  65. package/validation/ValidationResultReasonDetail.ts +13 -0
  66. package/validation/index.ts +1 -0
@@ -10,6 +10,21 @@
10
10
  }
11
11
  return String(value);
12
12
  }
13
+ function formatHttpQueryValue(value) {
14
+ return value instanceof Date ? formatQueryValue(value) : formatObjectQueryValue(value);
15
+ }
16
+ function isPlainObject(value) {
17
+ if (value === null || typeof value !== 'object') return false;
18
+ const prototype = Object.getPrototypeOf(value);
19
+ return prototype === Object.prototype || prototype === null;
20
+ }
21
+ /**
22
+ * Serialize plain query argument objects as JSON while retaining JS coercion for other values.
23
+ * @param {unknown} value The argument value.
24
+ * @returns {string} The serialized value.
25
+ */ function formatObjectQueryValue(value) {
26
+ return isPlainObject(value) ? JSON.stringify(value) : String(value);
27
+ }
13
28
  class UrlHelpers {
14
29
  /**
15
30
  * Creates a URL from the given origin, API base path, and route.
@@ -74,7 +89,7 @@ class UrlHelpers {
74
89
  queryParams.append(key, formatQueryValue(item));
75
90
  }
76
91
  } else {
77
- queryParams.set(key, formatQueryValue(value));
92
+ queryParams.set(key, formatHttpQueryValue(value));
78
93
  }
79
94
  }
80
95
  }
@@ -87,5 +102,5 @@ class UrlHelpers {
87
102
  }
88
103
  }
89
104
 
90
- export { UrlHelpers };
105
+ export { UrlHelpers, formatObjectQueryValue };
91
106
  //# sourceMappingURL=UrlHelpers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UrlHelpers.js","sources":["../../UrlHelpers.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\n/**\n * Format a single query / route parameter value into a string the .NET TypeConverter\n * infrastructure can round-trip. Date values are emitted as ISO 8601 so DateTimeOffset\n * binding succeeds; everything else falls back to the JS String coercion.\n */\nfunction formatQueryValue(value: unknown): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\n\nexport class UrlHelpers {\n /**\n * Creates a URL from the given origin, API base path, and route.\n * @param origin The origin of the request. If not provided, it defaults to the current document's origin.\n * @param apiBasePath The base path for the API.\n * @param route The specific route for the request.\n * @returns The constructed URL.\n */\n static createUrlFrom(origin: string, apiBasePath: string, route: string): URL {\n if ((!origin || origin.length === 0) && typeof document !== 'undefined') {\n origin = document.location?.origin ?? '';\n }\n\n return new URL(route, `${origin}${apiBasePath}`);\n }\n\n /**\n * Replaces route parameters in the route template with values from the parameters object.\n * Returns both the updated route and the parameters that were not used in the route.\n * @param route The route template with placeholders like {paramName}.\n * @param parameters The parameters to replace in the route.\n * @returns An object containing the updated route and unused parameters.\n */\n static replaceRouteParameters<T extends object>(route: string, parameters?: T): { route: string; unusedParameters: Partial<T> } {\n if (!parameters) {\n return { route, unusedParameters: {} };\n }\n\n let result = route;\n const unusedParameters: Partial<T> = { ...parameters };\n\n for (const [key, value] of Object.entries(parameters)) {\n // Array values cannot be encoded as a single route segment — leave them as unused so\n // they are serialized as repeated query string parameters (e.g. ?ids=1&ids=2&ids=3).\n if (Array.isArray(value)) {\n continue;\n }\n\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\{${escapedKey}\\\\}`, 'gi');\n const newRoute = result.replace(pattern, encodeURIComponent(formatQueryValue(value)));\n\n if (newRoute !== result) {\n delete unusedParameters[key as keyof T];\n result = newRoute;\n }\n }\n\n return { route: result, unusedParameters };\n }\n\n /**\n * Builds URLSearchParams from the given parameters and additional query parameters.\n * Array values are serialized as repeated key=value pairs (e.g. ?ids=1&ids=2&ids=3).\n * @param unusedParameters Parameters that were not used in route replacement.\n * @param additionalParams Additional query parameters to include.\n * @returns URLSearchParams containing all parameters.\n */\n static buildQueryParams(unusedParameters: object, additionalParams?: Record<string, string | number>): URLSearchParams {\n const queryParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(unusedParameters)) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n for (const item of value) {\n queryParams.append(key, formatQueryValue(item));\n }\n } else {\n queryParams.set(key, formatQueryValue(value));\n }\n }\n }\n\n if (additionalParams) {\n for (const [key, value] of Object.entries(additionalParams)) {\n queryParams.set(key, formatQueryValue(value));\n }\n }\n\n return queryParams;\n }\n}\n"],"names":["formatQueryValue","value","Date","toISOString","String","UrlHelpers","createUrlFrom","origin","apiBasePath","route","length","document","location","URL","replaceRouteParameters","parameters","unusedParameters","result","key","Object","entries","Array","isArray","escapedKey","replace","pattern","RegExp","newRoute","encodeURIComponent","buildQueryParams","additionalParams","queryParams","URLSearchParams","undefined","item","append","set"],"mappings":"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"}
1
+ {"version":3,"file":"UrlHelpers.js","sources":["../../UrlHelpers.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\n/**\n * Format a single query / route parameter value into a string the .NET TypeConverter\n * infrastructure can round-trip. Date values are emitted as ISO 8601 so DateTimeOffset\n * binding succeeds; everything else falls back to the JS String coercion.\n */\nfunction formatQueryValue(value: unknown): string {\n if (value instanceof Date) {\n return value.toISOString();\n }\n return String(value);\n}\n\nfunction formatHttpQueryValue(value: unknown): string {\n return value instanceof Date ? formatQueryValue(value) : formatObjectQueryValue(value);\n}\n\nfunction isPlainObject(value: unknown): boolean {\n if (value === null || typeof value !== 'object') return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Serialize plain query argument objects as JSON while retaining JS coercion for other values.\n * @param {unknown} value The argument value.\n * @returns {string} The serialized value.\n */\nexport function formatObjectQueryValue(value: unknown): string {\n return isPlainObject(value) ? JSON.stringify(value) : String(value);\n}\n\nexport class UrlHelpers {\n /**\n * Creates a URL from the given origin, API base path, and route.\n * @param origin The origin of the request. If not provided, it defaults to the current document's origin.\n * @param apiBasePath The base path for the API.\n * @param route The specific route for the request.\n * @returns The constructed URL.\n */\n static createUrlFrom(origin: string, apiBasePath: string, route: string): URL {\n if ((!origin || origin.length === 0) && typeof document !== 'undefined') {\n origin = document.location?.origin ?? '';\n }\n\n return new URL(route, `${origin}${apiBasePath}`);\n }\n\n /**\n * Replaces route parameters in the route template with values from the parameters object.\n * Returns both the updated route and the parameters that were not used in the route.\n * @param route The route template with placeholders like {paramName}.\n * @param parameters The parameters to replace in the route.\n * @returns An object containing the updated route and unused parameters.\n */\n static replaceRouteParameters<T extends object>(route: string, parameters?: T): { route: string; unusedParameters: Partial<T> } {\n if (!parameters) {\n return { route, unusedParameters: {} };\n }\n\n let result = route;\n const unusedParameters: Partial<T> = { ...parameters };\n\n for (const [key, value] of Object.entries(parameters)) {\n // Array values cannot be encoded as a single route segment — leave them as unused so\n // they are serialized as repeated query string parameters (e.g. ?ids=1&ids=2&ids=3).\n if (Array.isArray(value)) {\n continue;\n }\n\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\{${escapedKey}\\\\}`, 'gi');\n const newRoute = result.replace(pattern, encodeURIComponent(formatQueryValue(value)));\n\n if (newRoute !== result) {\n delete unusedParameters[key as keyof T];\n result = newRoute;\n }\n }\n\n return { route: result, unusedParameters };\n }\n\n /**\n * Builds URLSearchParams from the given parameters and additional query parameters.\n * Array values are serialized as repeated key=value pairs (e.g. ?ids=1&ids=2&ids=3).\n * @param unusedParameters Parameters that were not used in route replacement.\n * @param additionalParams Additional query parameters to include.\n * @returns URLSearchParams containing all parameters.\n */\n static buildQueryParams(unusedParameters: object, additionalParams?: Record<string, string | number>): URLSearchParams {\n const queryParams = new URLSearchParams();\n\n for (const [key, value] of Object.entries(unusedParameters)) {\n if (value !== undefined && value !== null) {\n if (Array.isArray(value)) {\n for (const item of value) {\n queryParams.append(key, formatQueryValue(item));\n }\n } else {\n queryParams.set(key, formatHttpQueryValue(value));\n }\n }\n }\n\n if (additionalParams) {\n for (const [key, value] of Object.entries(additionalParams)) {\n queryParams.set(key, formatQueryValue(value));\n }\n }\n\n return queryParams;\n }\n}\n"],"names":["formatQueryValue","value","Date","toISOString","String","formatHttpQueryValue","formatObjectQueryValue","isPlainObject","prototype","Object","getPrototypeOf","JSON","stringify","UrlHelpers","createUrlFrom","origin","apiBasePath","route","length","document","location","URL","replaceRouteParameters","parameters","unusedParameters","result","key","entries","Array","isArray","escapedKey","replace","pattern","RegExp","newRoute","encodeURIComponent","buildQueryParams","additionalParams","queryParams","URLSearchParams","undefined","item","append","set"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Command.d.ts","sourceRoot":"","sources":["../../../commands/Command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAUrF,8BAAsB,OAAO,CAAC,eAAe,GAAG,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAE,YAAW,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAwBzH,QAAQ,CAAC,aAAa,EAAE,WAAW;IAAW,QAAQ,CAAC,yBAAyB,EAAE,OAAO;IAvBrG,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAE5C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAE9B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,wBAAwB,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC5D,QAAQ,KAAK,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAE3C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAkB;IAOpC,YAAqB,aAAa,EAAE,WAAW,YAAS,EAAW,yBAAyB,EAAE,OAAO,EAKpG;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAGK,OAAO,CAAC,eAAe,CAAC,EAAE,wBAAwB,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAwB5H;IAGK,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CA2BzD;IAGD,kBAAkB,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAwBpD;IAED,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,0BAA0B;IAkBlC,OAAO,CAAC,iCAAiC;IAczC,OAAO,CAAC,YAAY;YAuBN,cAAc;IA+B5B,KAAK,IAAI,IAAI,CAOZ;IAGD,gBAAgB,CAAC,MAAM,EAAE,eAAe,QASvC;IAGD,iCAAiC,SAQhC;IAGD,aAAa,IAAI,IAAI,CAKpB;IAGD,IAAI,UAAU,YAEb;IAGD,eAAe,CAAC,QAAQ,EAAE,MAAM,QAY/B;IAGD,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,QAK3D;IAED,OAAO,CAAC,gBAAgB;CAM3B"}
1
+ {"version":3,"file":"Command.d.ts","sourceRoot":"","sources":["../../../commands/Command.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAInE,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AAEzE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2CAA2C,CAAC;AAcrF,8BAAsB,OAAO,CAAC,eAAe,GAAG,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAE,YAAW,QAAQ,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAwBzH,QAAQ,CAAC,aAAa,EAAE,WAAW;IAAW,QAAQ,CAAC,yBAAyB,EAAE,OAAO;IAvBrG,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,oBAAoB,CAAiB;IAC7C,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IAE5C,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAAM;IAE9B,QAAQ,CAAC,yBAAyB,CAAC,EAAE,wBAAwB,CAAC;IAC9D,QAAQ,CAAC,QAAQ,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC5D,QAAQ,KAAK,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAE3C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAkB;IAOpC,YAAqB,aAAa,EAAE,WAAW,YAAS,EAAW,yBAAyB,EAAE,OAAO,EAKpG;IAGD,eAAe,CAAC,YAAY,EAAE,MAAM,QAEnC;IAGD,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAGD,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9B;IAGD,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAErD;IAGK,OAAO,CAAC,eAAe,CAAC,EAAE,wBAAwB,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAwB5H;IAGK,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CA2BzD;IAGD,kBAAkB,IAAI,aAAa,CAAC,gBAAgB,CAAC,CAwBpD;IAED,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,0BAA0B;IAoBlC,OAAO,CAAC,iCAAiC;IAczC,OAAO,CAAC,YAAY;YAuBN,cAAc;IA+B5B,KAAK,IAAI,IAAI,CAOZ;IAGD,gBAAgB,CAAC,MAAM,EAAE,eAAe,QASvC;IAGD,iCAAiC,SAQhC;IAGD,aAAa,IAAI,IAAI,CAKpB;IAGD,IAAI,UAAU,YAEb;IAGD,eAAe,CAAC,QAAQ,EAAE,MAAM,QAY/B;IAGD,iBAAiB,CAAC,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,QAK3D;IAED,OAAO,CAAC,gBAAgB;CAM3B"}
@@ -5,11 +5,15 @@ import { joinPaths } from '../joinPaths.js';
5
5
  import { UrlHelpers } from '../UrlHelpers.js';
6
6
  import { ValidationResult } from '../validation/ValidationResult.js';
7
7
  import { ValidationResultSeverity } from '../validation/ValidationResultSeverity.js';
8
+ import { ValidationResultReason } from '../validation/ValidationResultReason.js';
9
+ import { ValidationResultReasonDetail } from '../validation/ValidationResultReasonDetail.js';
8
10
 
9
11
  // Copyright (c) Cratis. All rights reserved.
10
12
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
11
13
  /**
12
14
  * Represents an implementation of {@link ICommand} that works with HTTP fetch.
15
+ * Missing required properties produce a {@link ValidationResultReason.Rule} result with
16
+ * {@link ValidationResultReasonDetail.Required}, without contacting the server.
13
17
  */ class Command {
14
18
  _responseType;
15
19
  _isResponseTypeEnumerable;
@@ -138,7 +142,7 @@ import { ValidationResultSeverity } from '../validation/ValidationResultSeverity
138
142
  if (value === undefined || value === null) {
139
143
  validationErrors.push(new ValidationResult(ValidationResultSeverity.Error, `${propertyDescriptor.name} is required`, [
140
144
  propertyDescriptor.name
141
- ], null));
145
+ ], null, ValidationResultReason.Rule, ValidationResultReasonDetail.Required));
142
146
  }
143
147
  }
144
148
  });
@@ -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.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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"}
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';\nimport { ValidationResultReason } from '../validation/ValidationResultReason.js';\nimport { ValidationResultReasonDetail } from '../validation/ValidationResultReasonDetail.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 * Missing required properties produce a {@link ValidationResultReason.Rule} result with\n * {@link ValidationResultReasonDetail.Required}, without contacting the server.\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 ValidationResultReason.Rule,\n ValidationResultReasonDetail.Required\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","ValidationResultReason","Rule","ValidationResultReasonDetail","Required","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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"}
@@ -1,4 +1,5 @@
1
1
  import { given } from '../../../given.js';
2
+ import { ValidationResultReason, ValidationResultReasonDetail } from '../../../validation/index.js';
2
3
  import { a_command } from '../given/a_command.js';
3
4
  describe("when validating with null required property", given(class extends a_command {
4
5
  constructor() {
@@ -17,6 +18,8 @@ describe("when validating with null required property", given(class extends a_co
17
18
  it("should return invalid result", () => result.isValid.should.be.false);
18
19
  it("should have validation error", () => result.validationResults.length.should.equal(1));
19
20
  it("should have validation message for property", () => result.validationResults[0].message.should.equal('someProperty is required'));
20
- it("should have validation member for property", () => result.validationResults[0].members[0].should.equal('someProperty'));
21
+ it("should have validation member for property", () => result.validationResults[0].members.should.deep.equal(['someProperty']));
22
+ it("should identify a rule rejection", () => result.validationResults[0].reason.should.equal(ValidationResultReason.Rule));
23
+ it("should identify a required property rejection", () => result.validationResults[0].reasonDetail.should.equal(ValidationResultReasonDetail.Required));
21
24
  }));
22
25
  //# sourceMappingURL=with_null_required_property.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"with_null_required_property.js","sourceRoot":"","sources":["../../../../../commands/for_Command/when_validating/with_null_required_property.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,QAAQ,CAAC,6CAA6C,EAAE,KAAK,CAAC,KAAM,SAAQ,SAAS;IACjF;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,IAAyB,CAAC;IAC1D,CAAC;CACJ,EAAE,OAAO,CAAC,EAAE;IACT,IAAI,MAA6B,CAAC;IAElC,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7E,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACzE,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACtI,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAChI,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"with_null_required_property.js","sourceRoot":"","sources":["../../../../../commands/for_Command/when_validating/with_null_required_property.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,8BAA8B,CAAC;AAEpG,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,QAAQ,CAAC,6CAA6C,EAAE,KAAK,CAAC,KAAM,SAAQ,SAAS;IACjF;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,IAAyB,CAAC;IAC1D,CAAC;CACJ,EAAE,OAAO,CAAC,EAAE;IACT,IAAI,MAA6B,CAAC;IAElC,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7E,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACzE,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACtI,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAChI,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3H,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7J,CAAC,CAAC,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { given } from '../../../given.js';
2
+ import { ValidationResultReason, ValidationResultReasonDetail, ValidationResultSeverity } from '../../../validation/index.js';
2
3
  import { a_command } from '../given/a_command.js';
3
4
  describe("when validating with required property missing", given(class extends a_command {
4
5
  constructor() {
@@ -16,6 +17,11 @@ describe("when validating with required property missing", given(class extends a
16
17
  it("should not call server", () => context.fetchStub.called.should.be.false);
17
18
  it("should return invalid result", () => result.isValid.should.be.false);
18
19
  it("should have validation error", () => result.validationResults.length.should.equal(1));
19
- it("should have error for missing property", () => result.validationResults[0].members[0].should.equal('someProperty'));
20
+ it("should have error for missing property", () => result.validationResults[0].members.should.deep.equal(['someProperty']));
21
+ it("should identify a rule rejection", () => result.validationResults[0].reason.should.equal(ValidationResultReason.Rule));
22
+ it("should identify a required property rejection", () => result.validationResults[0].reasonDetail.should.equal(ValidationResultReasonDetail.Required));
23
+ it("should preserve the message", () => result.validationResults[0].message.should.equal('someProperty is required'));
24
+ it("should preserve the severity", () => result.validationResults[0].severity.should.equal(ValidationResultSeverity.Error));
25
+ it("should preserve the state", () => (result.validationResults[0].state === null).should.be.true);
20
26
  }));
21
27
  //# sourceMappingURL=with_required_property_missing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"with_required_property_missing.js","sourceRoot":"","sources":["../../../../../commands/for_Command/when_validating/with_required_property_missing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,QAAQ,CAAC,gDAAgD,EAAE,KAAK,CAAC,KAAM,SAAQ,SAAS;IACpF;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,SAA8B,CAAC;IAC/D,CAAC;CACJ,EAAE,OAAO,CAAC,EAAE;IACT,IAAI,MAA6B,CAAC;IAElC,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7E,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACzE,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC;AAC5H,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"with_required_property_missing.js","sourceRoot":"","sources":["../../../../../commands/for_Command/when_validating/with_required_property_missing.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAE9H,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,QAAQ,CAAC,gDAAgD,EAAE,KAAK,CAAC,KAAM,SAAQ,SAAS;IACpF;QACI,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,CAAC,YAAY,GAAG,SAA8B,CAAC;IAC/D,CAAC;CACJ,EAAE,OAAO,CAAC,EAAE;IACT,IAAI,MAA6B,CAAC;IAElC,UAAU,CAAC,KAAK,IAAI,EAAE;QAClB,MAAM,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC7E,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IACzE,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAC5H,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3H,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,YAAa,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC,CAAC;IACzJ,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACtH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5H,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;AACvG,CAAC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_object_values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_object_values.d.ts","sourceRoot":"","sources":["../../../../for_UrlHelpers/when_building_query_params/with_object_values.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import { describe, it } from 'vitest';
2
+ import { UrlHelpers } from '../../UrlHelpers.js';
3
+ const parts = { quoted: '"abc"', number: '42', comma: 'a,b' };
4
+ describe('when building query params with dictionary values', () => {
5
+ it('should encode one JSON object value', () => {
6
+ const result = UrlHelpers.buildQueryParams({ parts });
7
+ result.getAll('parts').should.deep.equal([JSON.stringify(parts)]);
8
+ });
9
+ it('should serialize an empty dictionary', () => {
10
+ UrlHelpers.buildQueryParams({ parts: {} }).get('parts').should.equal('{}');
11
+ });
12
+ it('should preserve existing route parameter serialization', () => {
13
+ const result = UrlHelpers.replaceRouteParameters('/parts/{parts}', { parts });
14
+ result.route.should.equal('/parts/%5Bobject%20Object%5D');
15
+ });
16
+ it('should preserve existing scalar and array serialization', () => {
17
+ const result = UrlHelpers.buildQueryParams({ count: 42, enabled: true, names: ['a', 'b'] });
18
+ result.get('count').should.equal('42');
19
+ result.get('enabled').should.equal('true');
20
+ result.getAll('names').should.deep.equal(['a', 'b']);
21
+ });
22
+ });
23
+ //# sourceMappingURL=with_object_values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_object_values.js","sourceRoot":"","sources":["../../../../for_UrlHelpers/when_building_query_params/with_object_values.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAE9D,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC/D,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,UAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,MAAM,MAAM,GAAG,UAAU,CAAC,sBAAsB,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableQueryMultiplexer.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryMultiplexer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAG9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAOrF,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAUlD,qBAAa,0BAA0B;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAO/B,YAAY,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,EAG/E;IAKD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,IAAI,eAAe,IAAI,MAAM,CAK5B;IAKD,IAAI,cAAc,IAAI,MAAM,CAI3B;IAUD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAUxG;IAKD,OAAO,IAAI,IAAI,CAId;IAED,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,wBAAwB;IAsChC,sBAAsB,IAAI,0BAA0B,EAAE,CAMrD;CACJ;AAOD,qBAAa,oCAAoC,CAAC,SAAS,CAAE,YAAW,0BAA0B,CAAC,SAAS,CAAC;IASrG,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAT/B,OAAO,CAAC,QAAQ,CAAC,CAAa;IAO9B,YACqB,KAAK,EAAE,0BAA0B,EACjC,UAAU,EAAE,MAAM,EAEtC;IAGD,IAAI,eAAe,IAAI,MAAM,CAE5B;IAGD,IAAI,cAAc,IAAI,MAAM,CAE3B;IAGD,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAM5E;IAGD,UAAU,IAAI,IAAI,CAGjB;CACJ;AAeD,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,6BAA6B,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAqC,GAAG,0BAA0B,CASxL;AAMD,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAKD,wBAAgB,oBAAoB,IAAI,0BAA0B,GAAG,SAAS,CAE7E"}
1
+ {"version":3,"file":"ObservableQueryMultiplexer.d.ts","sourceRoot":"","sources":["../../../queries/ObservableQueryMultiplexer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAG9D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yCAAyC,CAAC;AAQrF,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAUlD,qBAAa,0BAA0B;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAO/B,YAAY,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,EAG/E;IAKD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAKD,IAAI,eAAe,IAAI,MAAM,CAK5B;IAKD,IAAI,cAAc,IAAI,MAAM,CAI3B;IAUD,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,CAUxG;IAKD,OAAO,IAAI,IAAI,CAId;IAED,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,wBAAwB;IAsChC,sBAAsB,IAAI,0BAA0B,EAAE,CAMrD;CACJ;AAOD,qBAAa,oCAAoC,CAAC,SAAS,CAAE,YAAW,0BAA0B,CAAC,SAAS,CAAC;IASrG,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAT/B,OAAO,CAAC,QAAQ,CAAC,CAAa;IAO9B,YACqB,KAAK,EAAE,0BAA0B,EACjC,UAAU,EAAE,MAAM,EAEtC;IAGD,IAAI,eAAe,IAAI,MAAM,CAE5B;IAGD,IAAI,cAAc,IAAI,MAAM,CAE3B;IAGD,OAAO,CAAC,YAAY,EAAE,YAAY,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAM5E;IAGD,UAAU,IAAI,IAAI,CAGjB;CACJ;AAeD,wBAAgB,sBAAsB,CAAC,iBAAiB,EAAE,MAAM,6BAA6B,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAqC,GAAG,0BAA0B,CASxL;AAMD,wBAAgB,sBAAsB,IAAI,IAAI,CAI7C;AAKD,wBAAgB,oBAAoB,IAAI,0BAA0B,GAAG,SAAS,CAE7E"}
@@ -1,4 +1,5 @@
1
1
  import { Globals } from '../Globals.js';
2
+ import { formatObjectQueryValue } from '../UrlHelpers.js';
2
3
 
3
4
  // Copyright (c) Cratis. All rights reserved.
4
5
  // Licensed under the MIT license. See LICENSE file in the project root for full license information.
@@ -99,7 +100,7 @@ import { Globals } from '../Globals.js';
99
100
  for (const [key, value] of Object.entries(a)){
100
101
  if (pagingAndSortingKeys.has(key)) continue;
101
102
  if (value === undefined || value === null) continue;
102
- remaining[key] = String(value);
103
+ remaining[key] = formatObjectQueryValue(value);
103
104
  hasRemaining = true;
104
105
  }
105
106
  if (hasRemaining) {
@@ -1 +1 @@
1
- {"version":3,"file":"ObservableQueryMultiplexer.js","sources":["../../../queries/ObservableQueryMultiplexer.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 { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { IObservableQueryHubConnection } from './IObservableQueryHubConnection.js';\nimport { DataReceived } from './ObservableQueryConnection.js';\nimport { SubscriptionRequest } from './WebSocketHubConnection.js';\nimport { Globals } from '../Globals.js';\nimport { MultiplexerConnectionState } from './ObservableQueryDiagnosticsSnapshot.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * The WebSocket demultiplexer route used when connecting through the multiplexed observable query endpoint.\n */\nexport const WS_HUB_ROUTE = '/.cratis/queries/ws';\n\n/**\n * Multiplexes multiple observable query subscriptions across a bounded pool of physical\n * connections (WebSocket or SSE) to the backend demultiplexer.\n *\n * Each pool slot is a single multiplexed connection. When a new subscription is requested,\n * the slot with the fewest active queries is chosen. This balances load across N physical\n * connections while keeping the total connection count bounded.\n */\nexport class ObservableQueryMultiplexer {\n private readonly _connections: IObservableQueryHubConnection[];\n private readonly _size: number;\n\n /**\n * Initializes a new {@link ObservableQueryMultiplexer}.\n * @param {number} size Number of physical connections (pool slots).\n * @param {() => IObservableQueryHubConnection} connectionFactory Factory function to create each connection.\n */\n constructor(size: number, connectionFactory: () => IObservableQueryHubConnection) {\n this._size = Math.max(1, size);\n this._connections = Array.from({ length: this._size }, () => connectionFactory());\n }\n\n /**\n * Gets the pool size.\n */\n get size(): number {\n return this._size;\n }\n\n /**\n * Gets the best available ping latency across all connections.\n */\n get lastPingLatency(): number {\n return this._connections.reduce((min, c) =>\n c.lastPingLatency > 0 && c.lastPingLatency < min ? c.lastPingLatency : min,\n Number.MAX_SAFE_INTEGER\n );\n }\n\n /**\n * Gets the average latency across all connections.\n */\n get averageLatency(): number {\n const active = this._connections.filter(c => c.averageLatency > 0);\n if (active.length === 0) return 0;\n return active.reduce((sum, c) => sum + c.averageLatency, 0) / active.length;\n }\n\n /**\n * Subscribe to a query through the multiplexer. Picks the least-loaded connection\n * and sends a Subscribe message on it.\n * @param {string} queryName Fully qualified backend query name.\n * @param {object} queryArguments Flat query arguments (incl. page, pageSize, sortBy, sortDirection).\n * @param {DataReceived<any>} callback Callback invoked for each result.\n * @returns A cleanup function that unsubscribes from the query.\n */\n subscribe(queryName: string, queryArguments: object | undefined, callback: DataReceived<any>): () => void {\n const request = this.buildSubscriptionRequest(queryName, queryArguments);\n const conn = this.leastLoaded();\n const queryId = this.generateQueryId();\n\n conn.subscribe(queryId, request, callback);\n\n return () => {\n conn.unsubscribe(queryId);\n };\n }\n\n /**\n * Dispose all connections in the multiplexer.\n */\n dispose(): void {\n for (const conn of this._connections) {\n conn.dispose();\n }\n }\n\n private leastLoaded(): IObservableQueryHubConnection {\n return this._connections.reduce((min, c) =>\n c.queryCount < min.queryCount ? c : min, this._connections[0]);\n }\n\n private generateQueryId(): string {\n // Use crypto.randomUUID when available, fall back to timestamp + random\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n private buildSubscriptionRequest(queryName: string, args?: object): SubscriptionRequest {\n const request: SubscriptionRequest = { queryName };\n\n // Always include the transfer mode so the server knows which emission strategy to use.\n request.transferMode = Globals.observableQueryTransferMode;\n\n if (!args) return request;\n\n const a = args as Record<string, any>;\n const pagingAndSortingKeys = new Set(['page', 'pageSize', 'sortBy', 'sortDirection']);\n\n if (a.page !== undefined && a.page !== null) request.page = Number(a.page);\n if (a.pageSize !== undefined && a.pageSize !== null) request.pageSize = Number(a.pageSize);\n if (a.sortBy !== undefined && a.sortBy !== null) request.sortBy = String(a.sortBy);\n if (a.sortDirection !== undefined && a.sortDirection !== null) request.sortDirection = String(a.sortDirection);\n\n // Everything else goes into arguments as string key-value pairs\n const remaining: Record<string, string | null> = {};\n let hasRemaining = false;\n\n for (const [key, value] of Object.entries(a)) {\n if (pagingAndSortingKeys.has(key)) continue;\n if (value === undefined || value === null) continue;\n remaining[key] = String(value);\n hasRemaining = true;\n }\n\n if (hasRemaining) {\n request.arguments = remaining;\n }\n\n return request;\n }\n\n /**\n * Returns a snapshot of the per-connection state for diagnostics.\n * @returns An array describing each slot in the connection pool.\n */\n getConnectionsSnapshot(): MultiplexerConnectionState[] {\n return this._connections.map((conn, index) => ({\n index,\n isConnected: conn.isConnected,\n queryCount: conn.queryCount,\n }));\n }\n}\n\n/**\n * Wraps an {@link ObservableQueryMultiplexer} subscription as an {@link IObservableQueryConnection},\n * allowing the multiplexed transport to plug into the existing query subscription pipeline\n * without changes to callers.\n */\nexport class MultiplexedObservableQueryConnection<TDataType> implements IObservableQueryConnection<TDataType> {\n private _cleanup?: () => void;\n\n /**\n * Initializes a new {@link MultiplexedObservableQueryConnection}.\n * @param {ObservableQueryMultiplexer} multiplexer The shared multiplexer.\n * @param {string} queryName The fully qualified backend query name.\n */\n constructor(\n private readonly _pool: ObservableQueryMultiplexer,\n private readonly _queryName: string,\n ) {\n }\n\n /** @inheritdoc */\n get lastPingLatency(): number {\n return this._pool.lastPingLatency;\n }\n\n /** @inheritdoc */\n get averageLatency(): number {\n return this._pool.averageLatency;\n }\n\n /** @inheritdoc */\n connect(dataReceived: DataReceived<TDataType>, queryArguments?: object): void {\n this._cleanup = this._pool.subscribe(\n this._queryName,\n queryArguments,\n dataReceived as DataReceived<any>,\n );\n }\n\n /** @inheritdoc */\n disconnect(): void {\n this._cleanup?.();\n this._cleanup = undefined;\n }\n}\n\n// ----- Shared pool singleton management -----\n\nlet _sharedMultiplexer: ObservableQueryMultiplexer | undefined;\nlet _sharedMultiplexerKey = '';\n\n/**\n * Returns the shared {@link ObservableQueryMultiplexer}, creating or re-creating it when the\n * configuration (connection count, origin, base path, microservice, transport) changes.\n * @param {() => IObservableQueryHubConnection} connectionFactory Factory to create individual connections.\n * @param {string} cacheKey A string that identifies the current configuration for invalidation.\n * @param {number} size Number of physical connections to create. Defaults to {@link Globals.queryConnectionCount}.\n * @returns The shared multiplexer instance.\n */\nexport function getOrCreateMultiplexer(connectionFactory: () => IObservableQueryHubConnection, cacheKey: string, size: number = Globals.queryConnectionCount): ObservableQueryMultiplexer {\n if (_sharedMultiplexer && _sharedMultiplexerKey === cacheKey) {\n return _sharedMultiplexer;\n }\n\n _sharedMultiplexer?.dispose();\n _sharedMultiplexer = new ObservableQueryMultiplexer(size, connectionFactory);\n _sharedMultiplexerKey = cacheKey;\n return _sharedMultiplexer;\n}\n\n/**\n * Disposes and clears the shared multiplexer singleton.\n * Intended for use in test teardown to prevent state leakage across tests.\n */\nexport function resetSharedMultiplexer(): void {\n _sharedMultiplexer?.dispose();\n _sharedMultiplexer = undefined;\n _sharedMultiplexerKey = '';\n}\n\n/**\n * Returns the current shared multiplexer instance, or {@code undefined} if none has been created yet.\n */\nexport function getSharedMultiplexer(): ObservableQueryMultiplexer | undefined {\n return _sharedMultiplexer;\n}\n"],"names":["WS_HUB_ROUTE","ObservableQueryMultiplexer","_connections","_size","size","connectionFactory","Math","max","Array","from","length","lastPingLatency","reduce","min","c","Number","MAX_SAFE_INTEGER","averageLatency","active","filter","sum","subscribe","queryName","queryArguments","callback","request","buildSubscriptionRequest","conn","leastLoaded","queryId","generateQueryId","unsubscribe","dispose","queryCount","crypto","randomUUID","Date","now","random","toString","substring","args","transferMode","Globals","observableQueryTransferMode","a","pagingAndSortingKeys","Set","page","undefined","pageSize","sortBy","String","sortDirection","remaining","hasRemaining","key","value","Object","entries","has","arguments","getConnectionsSnapshot","map","index","isConnected","MultiplexedObservableQueryConnection","_cleanup","_queryName","_pool","connect","dataReceived","disconnect","_sharedMultiplexer","_sharedMultiplexerKey","getOrCreateMultiplexer","cacheKey","queryConnectionCount","resetSharedMultiplexer","getSharedMultiplexer"],"mappings":"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"}
1
+ {"version":3,"file":"ObservableQueryMultiplexer.js","sources":["../../../queries/ObservableQueryMultiplexer.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 { IObservableQueryConnection } from './IObservableQueryConnection.js';\nimport { IObservableQueryHubConnection } from './IObservableQueryHubConnection.js';\nimport { DataReceived } from './ObservableQueryConnection.js';\nimport { SubscriptionRequest } from './WebSocketHubConnection.js';\nimport { Globals } from '../Globals.js';\nimport { MultiplexerConnectionState } from './ObservableQueryDiagnosticsSnapshot.js';\nimport { formatObjectQueryValue } from '../UrlHelpers.js';\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * The WebSocket demultiplexer route used when connecting through the multiplexed observable query endpoint.\n */\nexport const WS_HUB_ROUTE = '/.cratis/queries/ws';\n\n/**\n * Multiplexes multiple observable query subscriptions across a bounded pool of physical\n * connections (WebSocket or SSE) to the backend demultiplexer.\n *\n * Each pool slot is a single multiplexed connection. When a new subscription is requested,\n * the slot with the fewest active queries is chosen. This balances load across N physical\n * connections while keeping the total connection count bounded.\n */\nexport class ObservableQueryMultiplexer {\n private readonly _connections: IObservableQueryHubConnection[];\n private readonly _size: number;\n\n /**\n * Initializes a new {@link ObservableQueryMultiplexer}.\n * @param {number} size Number of physical connections (pool slots).\n * @param {() => IObservableQueryHubConnection} connectionFactory Factory function to create each connection.\n */\n constructor(size: number, connectionFactory: () => IObservableQueryHubConnection) {\n this._size = Math.max(1, size);\n this._connections = Array.from({ length: this._size }, () => connectionFactory());\n }\n\n /**\n * Gets the pool size.\n */\n get size(): number {\n return this._size;\n }\n\n /**\n * Gets the best available ping latency across all connections.\n */\n get lastPingLatency(): number {\n return this._connections.reduce((min, c) =>\n c.lastPingLatency > 0 && c.lastPingLatency < min ? c.lastPingLatency : min,\n Number.MAX_SAFE_INTEGER\n );\n }\n\n /**\n * Gets the average latency across all connections.\n */\n get averageLatency(): number {\n const active = this._connections.filter(c => c.averageLatency > 0);\n if (active.length === 0) return 0;\n return active.reduce((sum, c) => sum + c.averageLatency, 0) / active.length;\n }\n\n /**\n * Subscribe to a query through the multiplexer. Picks the least-loaded connection\n * and sends a Subscribe message on it.\n * @param {string} queryName Fully qualified backend query name.\n * @param {object} queryArguments Flat query arguments (incl. page, pageSize, sortBy, sortDirection).\n * @param {DataReceived<any>} callback Callback invoked for each result.\n * @returns A cleanup function that unsubscribes from the query.\n */\n subscribe(queryName: string, queryArguments: object | undefined, callback: DataReceived<any>): () => void {\n const request = this.buildSubscriptionRequest(queryName, queryArguments);\n const conn = this.leastLoaded();\n const queryId = this.generateQueryId();\n\n conn.subscribe(queryId, request, callback);\n\n return () => {\n conn.unsubscribe(queryId);\n };\n }\n\n /**\n * Dispose all connections in the multiplexer.\n */\n dispose(): void {\n for (const conn of this._connections) {\n conn.dispose();\n }\n }\n\n private leastLoaded(): IObservableQueryHubConnection {\n return this._connections.reduce((min, c) =>\n c.queryCount < min.queryCount ? c : min, this._connections[0]);\n }\n\n private generateQueryId(): string {\n // Use crypto.randomUUID when available, fall back to timestamp + random\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n }\n\n private buildSubscriptionRequest(queryName: string, args?: object): SubscriptionRequest {\n const request: SubscriptionRequest = { queryName };\n\n // Always include the transfer mode so the server knows which emission strategy to use.\n request.transferMode = Globals.observableQueryTransferMode;\n\n if (!args) return request;\n\n const a = args as Record<string, any>;\n const pagingAndSortingKeys = new Set(['page', 'pageSize', 'sortBy', 'sortDirection']);\n\n if (a.page !== undefined && a.page !== null) request.page = Number(a.page);\n if (a.pageSize !== undefined && a.pageSize !== null) request.pageSize = Number(a.pageSize);\n if (a.sortBy !== undefined && a.sortBy !== null) request.sortBy = String(a.sortBy);\n if (a.sortDirection !== undefined && a.sortDirection !== null) request.sortDirection = String(a.sortDirection);\n\n // Everything else goes into arguments as string key-value pairs\n const remaining: Record<string, string | null> = {};\n let hasRemaining = false;\n\n for (const [key, value] of Object.entries(a)) {\n if (pagingAndSortingKeys.has(key)) continue;\n if (value === undefined || value === null) continue;\n remaining[key] = formatObjectQueryValue(value);\n hasRemaining = true;\n }\n\n if (hasRemaining) {\n request.arguments = remaining;\n }\n\n return request;\n }\n\n /**\n * Returns a snapshot of the per-connection state for diagnostics.\n * @returns An array describing each slot in the connection pool.\n */\n getConnectionsSnapshot(): MultiplexerConnectionState[] {\n return this._connections.map((conn, index) => ({\n index,\n isConnected: conn.isConnected,\n queryCount: conn.queryCount,\n }));\n }\n}\n\n/**\n * Wraps an {@link ObservableQueryMultiplexer} subscription as an {@link IObservableQueryConnection},\n * allowing the multiplexed transport to plug into the existing query subscription pipeline\n * without changes to callers.\n */\nexport class MultiplexedObservableQueryConnection<TDataType> implements IObservableQueryConnection<TDataType> {\n private _cleanup?: () => void;\n\n /**\n * Initializes a new {@link MultiplexedObservableQueryConnection}.\n * @param {ObservableQueryMultiplexer} multiplexer The shared multiplexer.\n * @param {string} queryName The fully qualified backend query name.\n */\n constructor(\n private readonly _pool: ObservableQueryMultiplexer,\n private readonly _queryName: string,\n ) {\n }\n\n /** @inheritdoc */\n get lastPingLatency(): number {\n return this._pool.lastPingLatency;\n }\n\n /** @inheritdoc */\n get averageLatency(): number {\n return this._pool.averageLatency;\n }\n\n /** @inheritdoc */\n connect(dataReceived: DataReceived<TDataType>, queryArguments?: object): void {\n this._cleanup = this._pool.subscribe(\n this._queryName,\n queryArguments,\n dataReceived as DataReceived<any>,\n );\n }\n\n /** @inheritdoc */\n disconnect(): void {\n this._cleanup?.();\n this._cleanup = undefined;\n }\n}\n\n// ----- Shared pool singleton management -----\n\nlet _sharedMultiplexer: ObservableQueryMultiplexer | undefined;\nlet _sharedMultiplexerKey = '';\n\n/**\n * Returns the shared {@link ObservableQueryMultiplexer}, creating or re-creating it when the\n * configuration (connection count, origin, base path, microservice, transport) changes.\n * @param {() => IObservableQueryHubConnection} connectionFactory Factory to create individual connections.\n * @param {string} cacheKey A string that identifies the current configuration for invalidation.\n * @param {number} size Number of physical connections to create. Defaults to {@link Globals.queryConnectionCount}.\n * @returns The shared multiplexer instance.\n */\nexport function getOrCreateMultiplexer(connectionFactory: () => IObservableQueryHubConnection, cacheKey: string, size: number = Globals.queryConnectionCount): ObservableQueryMultiplexer {\n if (_sharedMultiplexer && _sharedMultiplexerKey === cacheKey) {\n return _sharedMultiplexer;\n }\n\n _sharedMultiplexer?.dispose();\n _sharedMultiplexer = new ObservableQueryMultiplexer(size, connectionFactory);\n _sharedMultiplexerKey = cacheKey;\n return _sharedMultiplexer;\n}\n\n/**\n * Disposes and clears the shared multiplexer singleton.\n * Intended for use in test teardown to prevent state leakage across tests.\n */\nexport function resetSharedMultiplexer(): void {\n _sharedMultiplexer?.dispose();\n _sharedMultiplexer = undefined;\n _sharedMultiplexerKey = '';\n}\n\n/**\n * Returns the current shared multiplexer instance, or {@code undefined} if none has been created yet.\n */\nexport function getSharedMultiplexer(): ObservableQueryMultiplexer | undefined {\n return _sharedMultiplexer;\n}\n"],"names":["WS_HUB_ROUTE","ObservableQueryMultiplexer","_connections","_size","size","connectionFactory","Math","max","Array","from","length","lastPingLatency","reduce","min","c","Number","MAX_SAFE_INTEGER","averageLatency","active","filter","sum","subscribe","queryName","queryArguments","callback","request","buildSubscriptionRequest","conn","leastLoaded","queryId","generateQueryId","unsubscribe","dispose","queryCount","crypto","randomUUID","Date","now","random","toString","substring","args","transferMode","Globals","observableQueryTransferMode","a","pagingAndSortingKeys","Set","page","undefined","pageSize","sortBy","String","sortDirection","remaining","hasRemaining","key","value","Object","entries","has","formatObjectQueryValue","arguments","getConnectionsSnapshot","map","index","isConnected","MultiplexedObservableQueryConnection","_cleanup","_queryName","_pool","connect","dataReceived","disconnect","_sharedMultiplexer","_sharedMultiplexerKey","getOrCreateMultiplexer","cacheKey","queryConnectionCount","resetSharedMultiplexer","getSharedMultiplexer"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_dictionary_values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_dictionary_values.d.ts","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { describe, it } from 'vitest';
2
+ import { ObservableQueryMultiplexer } from '../../ObservableQueryMultiplexer.js';
3
+ const parts = { quoted: '"abc"', number: '42', comma: 'a,b' };
4
+ describe('when building a subscription request with dictionary values', () => {
5
+ it('should send the dictionary as one JSON string argument', () => {
6
+ let received;
7
+ const multiplexer = new ObservableQueryMultiplexer(1, () => ({
8
+ queryCount: 0, lastPingLatency: 0, averageLatency: 0, isConnected: false,
9
+ subscribe: (_id, request) => { received = request; },
10
+ unsubscribe: () => { }, dispose: () => { }
11
+ }));
12
+ const date = new Date('2026-10-24T10:00:00Z');
13
+ const unsubscribe = multiplexer.subscribe('Parts.Get', { parts, count: 42, names: ['a', 'b'], date }, () => { });
14
+ received.arguments.parts.should.equal(JSON.stringify(parts));
15
+ received.arguments.count.should.equal('42');
16
+ received.arguments.names.should.equal('a,b');
17
+ received.arguments.date.should.equal(String(date));
18
+ unsubscribe();
19
+ multiplexer.dispose();
20
+ });
21
+ });
22
+ //# sourceMappingURL=with_dictionary_values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_dictionary_values.js","sourceRoot":"","sources":["../../../../../queries/for_ObservableQueryMultiplexer/when_building_a_subscription_request/with_dictionary_values.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,qCAAqC,CAAC;AAGjF,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAE9D,QAAQ,CAAC,6DAA6D,EAAE,GAAG,EAAE;IACzE,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAC9D,IAAI,QAAyC,CAAC;QAC9C,MAAM,WAAW,GAAG,IAAI,0BAA0B,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACzD,UAAU,EAAE,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK;YACxE,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC;YACpD,WAAW,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;SAC3C,CAAC,CAAC,CAAC;QACJ,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAChH,QAAS,CAAC,SAAU,CAAC,KAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,QAAS,CAAC,SAAU,CAAC,KAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,QAAS,CAAC,SAAU,CAAC,KAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAChD,QAAS,CAAC,SAAU,CAAC,IAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACtD,WAAW,EAAE,CAAC;QACd,WAAW,CAAC,OAAO,EAAE,CAAC;IAC1B,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}