@cratis/arc 22.50.4 → 22.50.6

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 (19) hide show
  1. package/UrlHelpers.ts +2 -1
  2. package/dist/cjs/UrlHelpers.d.ts.map +1 -1
  3. package/dist/cjs/UrlHelpers.js +2 -1
  4. package/dist/cjs/UrlHelpers.js.map +1 -1
  5. package/dist/esm/UrlHelpers.d.ts.map +1 -1
  6. package/dist/esm/UrlHelpers.js +2 -1
  7. package/dist/esm/UrlHelpers.js.map +1 -1
  8. package/dist/esm/for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.d.ts +2 -0
  9. package/dist/esm/for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.d.ts.map +1 -0
  10. package/dist/esm/for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.js +25 -0
  11. package/dist/esm/for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.js.map +1 -0
  12. package/dist/esm/queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.d.ts +2 -0
  13. package/dist/esm/queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.d.ts.map +1 -0
  14. package/dist/esm/queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.js +59 -0
  15. package/dist/esm/queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.js.map +1 -0
  16. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  17. package/for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.ts +31 -0
  18. package/package.json +3 -3
  19. package/queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.ts +67 -0
package/UrlHelpers.ts CHANGED
@@ -51,7 +51,8 @@ export class UrlHelpers {
51
51
  continue;
52
52
  }
53
53
 
54
- const pattern = new RegExp(`\\{${key}\\}`, 'gi');
54
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
55
+ const pattern = new RegExp(`\\{${escapedKey}\\}`, 'gi');
55
56
  const newRoute = result.replace(pattern, encodeURIComponent(formatQueryValue(value)));
56
57
 
57
58
  if (newRoute !== result) {
@@ -1 +1 @@
1
- {"version":3,"file":"UrlHelpers.d.ts","sourceRoot":"","sources":["../../UrlHelpers.ts"],"names":[],"mappings":"AAeA,qBAAa,UAAU;IAQnB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAM5E;IASD,MAAM,CAAC,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CAyB9H;IASD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,eAAe,CAsBrH;CACJ"}
1
+ {"version":3,"file":"UrlHelpers.d.ts","sourceRoot":"","sources":["../../UrlHelpers.ts"],"names":[],"mappings":"AAeA,qBAAa,UAAU;IAQnB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAM5E;IASD,MAAM,CAAC,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CA0B9H;IASD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,eAAe,CAsBrH;CACJ"}
@@ -48,7 +48,8 @@ class UrlHelpers {
48
48
  if (Array.isArray(value)) {
49
49
  continue;
50
50
  }
51
- const pattern = new RegExp(`\\{${key}\\}`, 'gi');
51
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
52
+ const pattern = new RegExp(`\\{${escapedKey}\\}`, 'gi');
52
53
  const newRoute = result.replace(pattern, encodeURIComponent(formatQueryValue(value)));
53
54
  if (newRoute !== result) {
54
55
  delete unusedParameters[key];
@@ -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 pattern = new RegExp(`\\\\{${key}\\\\}`, '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","pattern","RegExp","newRoute","replace","encodeURIComponent","buildQueryParams","additionalParams","queryParams","URLSearchParams","undefined","item","append","set"],"mappings":";;AAAA;AACA;AAEA;;;;IAKA,SAASA,iBAAiBC,KAAc,EAAA;AACpC,IAAA,IAAIA,iBAAiBC,IAAAA,EAAM;AACvB,QAAA,OAAOD,MAAME,WAAW,EAAA;AAC5B,IAAA;AACA,IAAA,OAAOC,MAAAA,CAAOH,KAAAA,CAAAA;AAClB;AAEO,MAAMI,UAAAA,CAAAA;AACT;;;;;;AAMA,OACA,OAAOC,aAAAA,CAAcC,MAAc,EAAEC,WAAmB,EAAEC,KAAa,EAAO;QAC1E,IAAK,CAAA,CAACF,MAAAA,IAAUA,MAAAA,CAAOG,MAAM,KAAK,CAAA,KAAM,OAAOC,QAAAA,KAAa,WAAA,EAAa;YACrEJ,MAAAA,GAASI,QAAAA,CAASC,QAAQ,EAAEL,MAAAA,IAAU,EAAA;AAC1C,QAAA;AAEA,QAAA,OAAO,IAAIM,GAAAA,CAAIJ,KAAAA,EAAO,CAAA,EAAGF,SAASC,WAAAA,CAAAA,CAAa,CAAA;AACnD,IAAA;AAEA;;;;;;AAMC,QACD,OAAOM,sBAAAA,CAAyCL,KAAa,EAAEM,UAAc,EAAmD;AAC5H,QAAA,IAAI,CAACA,UAAAA,EAAY;YACb,OAAO;AAAEN,gBAAAA,KAAAA;AAAOO,gBAAAA,gBAAAA,EAAkB;AAAG,aAAA;AACzC,QAAA;AAEA,QAAA,IAAIC,MAAAA,GAASR,KAAAA;AACb,QAAA,MAAMO,gBAAAA,GAA+B;AAAE,YAAA,GAAGD;AAAW,SAAA;QAErD,KAAK,MAAM,CAACG,GAAAA,EAAKjB,KAAAA,CAAM,IAAIkB,MAAAA,CAAOC,OAAO,CAACL,UAAAA,CAAAA,CAAa;;;YAGnD,IAAIM,KAAAA,CAAMC,OAAO,CAACrB,KAAAA,CAAAA,EAAQ;AACtB,gBAAA;AACJ,YAAA;YAEA,MAAMsB,OAAAA,GAAU,IAAIC,MAAAA,CAAO,CAAC,GAAG,EAAEN,GAAAA,CAAI,GAAG,CAAC,EAAE,IAAA,CAAA;AAC3C,YAAA,MAAMO,WAAWR,MAAAA,CAAOS,OAAO,CAACH,OAAAA,EAASI,mBAAmB3B,gBAAAA,CAAiBC,KAAAA,CAAAA,CAAAA,CAAAA;AAE7E,YAAA,IAAIwB,aAAaR,MAAAA,EAAQ;gBACrB,OAAOD,gBAAgB,CAACE,GAAAA,CAAe;gBACvCD,MAAAA,GAASQ,QAAAA;AACb,YAAA;AACJ,QAAA;QAEA,OAAO;YAAEhB,KAAAA,EAAOQ,MAAAA;AAAQD,YAAAA;AAAiB,SAAA;AAC7C,IAAA;AAEA;;;;;;AAMC,QACD,OAAOY,gBAAAA,CAAiBZ,gBAAwB,EAAEa,gBAAkD,EAAmB;AACnH,QAAA,MAAMC,cAAc,IAAIC,eAAAA,EAAAA;QAExB,KAAK,MAAM,CAACb,GAAAA,EAAKjB,KAAAA,CAAM,IAAIkB,MAAAA,CAAOC,OAAO,CAACJ,gBAAAA,CAAAA,CAAmB;YACzD,IAAIf,KAAAA,KAAU+B,SAAAA,IAAa/B,KAAAA,KAAU,IAAA,EAAM;gBACvC,IAAIoB,KAAAA,CAAMC,OAAO,CAACrB,KAAAA,CAAAA,EAAQ;oBACtB,KAAK,MAAMgC,QAAQhC,KAAAA,CAAO;wBACtB6B,WAAAA,CAAYI,MAAM,CAAChB,GAAAA,EAAKlB,gBAAAA,CAAiBiC,IAAAA,CAAAA,CAAAA;AAC7C,oBAAA;gBACJ,CAAA,MAAO;oBACHH,WAAAA,CAAYK,GAAG,CAACjB,GAAAA,EAAKlB,gBAAAA,CAAiBC,KAAAA,CAAAA,CAAAA;AAC1C,gBAAA;AACJ,YAAA;AACJ,QAAA;AAEA,QAAA,IAAI4B,gBAAAA,EAAkB;YAClB,KAAK,MAAM,CAACX,GAAAA,EAAKjB,KAAAA,CAAM,IAAIkB,MAAAA,CAAOC,OAAO,CAACS,gBAAAA,CAAAA,CAAmB;gBACzDC,WAAAA,CAAYK,GAAG,CAACjB,GAAAA,EAAKlB,gBAAAA,CAAiBC,KAAAA,CAAAA,CAAAA;AAC1C,YAAA;AACJ,QAAA;QAEA,OAAO6B,WAAAA;AACX,IAAA;AACJ;;"}
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 +1 @@
1
- {"version":3,"file":"UrlHelpers.d.ts","sourceRoot":"","sources":["../../UrlHelpers.ts"],"names":[],"mappings":"AAeA,qBAAa,UAAU;IAQnB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAM5E;IASD,MAAM,CAAC,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CAyB9H;IASD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,eAAe,CAsBrH;CACJ"}
1
+ {"version":3,"file":"UrlHelpers.d.ts","sourceRoot":"","sources":["../../UrlHelpers.ts"],"names":[],"mappings":"AAeA,qBAAa,UAAU;IAQnB,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,CAM5E;IASD,MAAM,CAAC,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;KAAE,CA0B9H;IASD,MAAM,CAAC,gBAAgB,CAAC,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,eAAe,CAsBrH;CACJ"}
@@ -46,7 +46,8 @@ class UrlHelpers {
46
46
  if (Array.isArray(value)) {
47
47
  continue;
48
48
  }
49
- const pattern = new RegExp(`\\{${key}\\}`, 'gi');
49
+ const escapedKey = key.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
50
+ const pattern = new RegExp(`\\{${escapedKey}\\}`, 'gi');
50
51
  const newRoute = result.replace(pattern, encodeURIComponent(formatQueryValue(value)));
51
52
  if (newRoute !== result) {
52
53
  delete unusedParameters[key];
@@ -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 pattern = new RegExp(`\\\\{${key}\\\\}`, '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","pattern","RegExp","newRoute","replace","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\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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_regular_expression_metacharacters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_regular_expression_metacharacters.d.ts","sourceRoot":"","sources":["../../../../for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { UrlHelpers } from '../../UrlHelpers.js';
3
+ describe('when replacing route parameters with regular expression metacharacters', () => {
4
+ for (const key of ['a[', 'a.b', 'a+b', 'a*b', 'a?b', 'a^b', 'a$b', 'a{b}', 'a(b)', 'a|b', 'a\\b', 'a]b']) {
5
+ it(`should replace the literal placeholder for ${key}`, () => {
6
+ const result = UrlHelpers.replaceRouteParameters(`/items/{${key}}/{${key}}`, { [key]: 'value /' });
7
+ expect(result.route).to.equal('/items/value%20%2F/value%20%2F');
8
+ expect(result.unusedParameters).to.deep.equal({});
9
+ });
10
+ it(`should leave ${key} unused on a literal route`, () => {
11
+ const result = UrlHelpers.replaceRouteParameters('/items/snapshot', { [key]: 'value' });
12
+ expect(result.route).to.equal('/items/snapshot');
13
+ expect(result.unusedParameters).to.deep.equal({ [key]: 'value' });
14
+ });
15
+ }
16
+ it('should not match a different placeholder through a wildcard', () => {
17
+ const result = UrlHelpers.replaceRouteParameters('/items/{axb}/{a.b}', { 'a.b': 'value' });
18
+ expect(result.route).to.equal('/items/{axb}/value');
19
+ });
20
+ it('should retain case insensitive matching', () => {
21
+ const result = UrlHelpers.replaceRouteParameters('/items/{A.B}', { 'a.b': 'value' });
22
+ expect(result.route).to.equal('/items/value');
23
+ });
24
+ });
25
+ //# sourceMappingURL=with_regular_expression_metacharacters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_regular_expression_metacharacters.js","sourceRoot":"","sources":["../../../../for_UrlHelpers/when_replacing_route_parameters/with_regular_expression_metacharacters.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,QAAQ,CAAC,wEAAwE,EAAE,GAAG,EAAE;IACpF,KAAK,MAAM,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC;QACvG,EAAE,CAAC,8CAA8C,GAAG,EAAE,EAAE,GAAG,EAAE;YACzD,MAAM,MAAM,GAAG,UAAU,CAAC,sBAAsB,CAAC,WAAW,GAAG,MAAM,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;YACnG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChE,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gBAAgB,GAAG,4BAA4B,EAAE,GAAG,EAAE;YACrD,MAAM,MAAM,GAAG,UAAU,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;YACxF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACjD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;IACP,CAAC;IAED,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,UAAU,CAAC,sBAAsB,CAAC,oBAAoB,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,UAAU,CAAC,sBAAsB,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=with_regular_expression_metacharacters_in_parameter_keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_regular_expression_metacharacters_in_parameter_keys.d.ts","sourceRoot":"","sources":["../../../../../queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import { describe, it, beforeEach, afterEach, expect } from 'vitest';
2
+ import * as sinon from 'sinon';
3
+ import { QueryFor } from '../../QueryFor.js';
4
+ import { QueryHttpMethod } from '../../QueryHttpMethod.js';
5
+ import { createFetchHelper } from '../../../helpers/fetchHelper.js';
6
+ class QueryWithLiteralParameterKeys extends QueryFor {
7
+ route;
8
+ defaultValue = '';
9
+ parameterDescriptors = [];
10
+ requiredRequestParameters = [];
11
+ constructor(route) {
12
+ super(String, false);
13
+ this.route = route;
14
+ }
15
+ }
16
+ for (const method of [QueryHttpMethod.Get, QueryHttpMethod.Query]) {
17
+ describe(`when performing ${method} with metacharacters in parameter keys`, () => {
18
+ let fetchHelper;
19
+ let fetchStub;
20
+ beforeEach(() => {
21
+ fetchHelper = createFetchHelper();
22
+ fetchStub = fetchHelper.stubFetch();
23
+ fetchStub.resolves({
24
+ ok: true,
25
+ status: 200,
26
+ json: sinon.stub().resolves({
27
+ data: 'result', isSuccess: true, isAuthorized: true, isValid: true,
28
+ hasExceptions: false, validationResults: [], exceptionMessages: [],
29
+ exceptionStackTrace: '', paging: { totalItems: 0, totalPages: 0, page: 0, size: 0 }
30
+ })
31
+ });
32
+ });
33
+ afterEach(() => fetchHelper.restore());
34
+ for (const route of ['/items/snapshot', '/items/{a[}/{a.b}']) {
35
+ it(`should fetch ${route} with literal keys`, async () => {
36
+ const query = new QueryWithLiteralParameterKeys(route);
37
+ query.setOrigin('https://api.example.com');
38
+ query.setHttpMethod(method);
39
+ const parameters = { 'a[': 'first', 'a.b': 'second' };
40
+ const result = await query.perform(parameters);
41
+ expect(result.isSuccess).to.be.true;
42
+ expect(fetchStub.calledOnce).to.be.true;
43
+ const [url, options] = fetchStub.firstCall.args;
44
+ expect(options.method).to.equal(method.toUpperCase());
45
+ expect(url.pathname).to.equal(route.includes('{') ? '/items/first/second' : '/items/snapshot');
46
+ if (!route.includes('{')) {
47
+ if (method === QueryHttpMethod.Get) {
48
+ expect(url.searchParams.get('a[')).to.equal('first');
49
+ expect(url.searchParams.get('a.b')).to.equal('second');
50
+ }
51
+ else {
52
+ expect(JSON.parse(options.body).arguments).to.deep.equal(parameters);
53
+ }
54
+ }
55
+ });
56
+ }
57
+ });
58
+ }
59
+ //# sourceMappingURL=with_regular_expression_metacharacters_in_parameter_keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with_regular_expression_metacharacters_in_parameter_keys.js","sourceRoot":"","sources":["../../../../../queries/for_QueryFor/when_performing/with_regular_expression_metacharacters_in_parameter_keys.ts"],"names":[],"mappings":"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"}