@cdklabs/cdk-ecs-codedeploy 0.0.433 → 0.0.434

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 (83) hide show
  1. package/.jsii +3 -3
  2. package/.jsii.tabl.json +1 -1
  3. package/lib/api-canary/index.js +1 -1
  4. package/lib/ecs-appspec/index.js +1 -1
  5. package/lib/ecs-deployment/index.js +1 -1
  6. package/lib/ecs-patterns/application-load-balanced-codedeployed-fargate-service.js +1 -1
  7. package/node_modules/@aws-sdk/client-codedeploy/package.json +15 -15
  8. package/node_modules/@aws-sdk/core/package.json +4 -4
  9. package/node_modules/@aws-sdk/credential-provider-env/package.json +2 -2
  10. package/node_modules/@aws-sdk/credential-provider-http/package.json +5 -5
  11. package/node_modules/@aws-sdk/credential-provider-ini/package.json +9 -9
  12. package/node_modules/@aws-sdk/credential-provider-login/package.json +3 -3
  13. package/node_modules/@aws-sdk/credential-provider-node/package.json +7 -7
  14. package/node_modules/@aws-sdk/credential-provider-process/package.json +2 -2
  15. package/node_modules/@aws-sdk/credential-provider-sso/package.json +4 -4
  16. package/node_modules/@aws-sdk/credential-provider-web-identity/package.json +3 -3
  17. package/node_modules/@aws-sdk/middleware-user-agent/package.json +3 -3
  18. package/node_modules/@aws-sdk/nested-clients/package.json +14 -14
  19. package/node_modules/@aws-sdk/region-config-resolver/package.json +2 -2
  20. package/node_modules/@aws-sdk/token-providers/package.json +3 -3
  21. package/node_modules/@aws-sdk/util-user-agent-node/package.json +2 -2
  22. package/node_modules/@aws-sdk/xml-builder/dist-cjs/index.js +21 -11
  23. package/node_modules/@aws-sdk/xml-builder/dist-cjs/xml-parser.js +5 -1
  24. package/node_modules/@aws-sdk/xml-builder/dist-es/escape-attribute.js +8 -1
  25. package/node_modules/@aws-sdk/xml-builder/dist-es/escape-element.js +13 -10
  26. package/node_modules/@aws-sdk/xml-builder/dist-es/xml-parser.js +5 -1
  27. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/CHANGELOG.md +40 -4
  28. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/README.md +8 -7
  29. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxbuilder.min.js +1 -1
  30. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxbuilder.min.js.map +1 -1
  31. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.cjs +1 -1
  32. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.d.cts +82 -20
  33. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.min.js +1 -1
  34. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxp.min.js.map +1 -1
  35. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxparser.min.js +1 -1
  36. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxparser.min.js.map +1 -1
  37. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/fxvalidator.min.js.map +1 -1
  38. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/lib/pem.d.cts +148 -0
  39. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/package.json +4 -3
  40. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/fxp.d.ts +75 -19
  41. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/pem.d.ts +135 -0
  42. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/util.js +18 -0
  43. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/DocTypeReader.js +37 -18
  44. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/OptionsBuilder.js +76 -5
  45. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/OrderedObjParser.js +298 -116
  46. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/XMLParser.js +2 -2
  47. package/node_modules/@aws-sdk/xml-builder/node_modules/fast-xml-parser/src/xmlparser/node2json.js +65 -15
  48. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/CHANGELOG.md +9 -2
  49. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/package.json +1 -1
  50. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/strnum.js +12 -6
  51. package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/tests/strnum_test.js +3 -0
  52. package/node_modules/@aws-sdk/xml-builder/node_modules/strnum/tests/temp.js +8 -0
  53. package/node_modules/@aws-sdk/xml-builder/package.json +2 -2
  54. package/node_modules/@smithy/config-resolver/dist-cjs/index.js +12 -0
  55. package/node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseDualstackEndpointConfigOptions.js +5 -0
  56. package/node_modules/@smithy/config-resolver/dist-es/endpointsConfig/NodeUseFipsEndpointConfigOptions.js +5 -0
  57. package/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts +6 -0
  58. package/node_modules/@smithy/config-resolver/dist-types/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts +6 -0
  59. package/node_modules/@smithy/config-resolver/dist-types/ts3.4/endpointsConfig/NodeUseDualstackEndpointConfigOptions.d.ts +6 -0
  60. package/node_modules/@smithy/config-resolver/dist-types/ts3.4/endpointsConfig/NodeUseFipsEndpointConfigOptions.d.ts +6 -0
  61. package/node_modules/@smithy/config-resolver/package.json +1 -1
  62. package/node_modules/@smithy/middleware-endpoint/dist-types/resolveEndpointConfig.d.ts +2 -2
  63. package/node_modules/@smithy/middleware-endpoint/dist-types/ts3.4/resolveEndpointConfig.d.ts +2 -2
  64. package/node_modules/@smithy/middleware-endpoint/package.json +1 -1
  65. package/node_modules/@smithy/middleware-retry/package.json +2 -2
  66. package/node_modules/@smithy/smithy-client/package.json +2 -2
  67. package/node_modules/@smithy/util-defaults-mode-browser/package.json +2 -2
  68. package/node_modules/@smithy/util-defaults-mode-node/package.json +3 -3
  69. package/node_modules/path-expression-matcher/README.md +98 -13
  70. package/node_modules/path-expression-matcher/lib/pem.cjs +1 -1
  71. package/node_modules/path-expression-matcher/lib/pem.d.cts +188 -0
  72. package/node_modules/path-expression-matcher/lib/pem.min.js +1 -1
  73. package/node_modules/path-expression-matcher/lib/pem.min.js.map +1 -1
  74. package/node_modules/path-expression-matcher/package.json +2 -2
  75. package/node_modules/path-expression-matcher/src/Matcher.js +84 -0
  76. package/node_modules/path-expression-matcher/src/index.d.ts +152 -0
  77. package/package.json +4 -4
  78. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/.github/SECURITY.md +0 -0
  79. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/.vscode/launch.json +0 -0
  80. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/LICENSE +0 -0
  81. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/README.md +0 -0
  82. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/algo.stflow +0 -0
  83. /package/node_modules/{strnum → @aws-sdk/xml-builder/node_modules/strnum}/tests/infinity_test.js +0 -0
@@ -35,7 +35,7 @@ export default class XMLParser {
35
35
  orderedObjParser.addExternalEntities(this.externalEntities);
36
36
  const orderedResult = orderedObjParser.parseXml(xmlData);
37
37
  if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;
38
- else return prettify(orderedResult, this.options);
38
+ else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);
39
39
  }
40
40
 
41
41
  /**
@@ -68,4 +68,4 @@ export default class XMLParser {
68
68
  static getMetaDataSymbol() {
69
69
  return XmlNode.getMetaDataSymbol();
70
70
  }
71
- }
71
+ }
@@ -1,35 +1,65 @@
1
1
  'use strict';
2
2
 
3
3
  import XmlNode from './xmlNode.js';
4
+ import { Matcher } from 'path-expression-matcher';
4
5
 
5
6
  const METADATA_SYMBOL = XmlNode.getMetaDataSymbol();
6
7
 
8
+ /**
9
+ * Helper function to strip attribute prefix from attribute map
10
+ * @param {object} attrs - Attributes with prefix (e.g., {"@_class": "code"})
11
+ * @param {string} prefix - Attribute prefix to remove (e.g., "@_")
12
+ * @returns {object} Attributes without prefix (e.g., {"class": "code"})
13
+ */
14
+ function stripAttributePrefix(attrs, prefix) {
15
+ if (!attrs || typeof attrs !== 'object') return {};
16
+ if (!prefix) return attrs;
17
+
18
+ const rawAttrs = {};
19
+ for (const key in attrs) {
20
+ if (key.startsWith(prefix)) {
21
+ const rawName = key.substring(prefix.length);
22
+ rawAttrs[rawName] = attrs[key];
23
+ } else {
24
+ // Attribute without prefix (shouldn't normally happen, but be safe)
25
+ rawAttrs[key] = attrs[key];
26
+ }
27
+ }
28
+ return rawAttrs;
29
+ }
30
+
7
31
  /**
8
32
  *
9
33
  * @param {array} node
10
34
  * @param {any} options
35
+ * @param {Matcher} matcher - Path matcher instance
11
36
  * @returns
12
37
  */
13
- export default function prettify(node, options) {
14
- return compress(node, options);
38
+ export default function prettify(node, options, matcher, readonlyMatcher) {
39
+ return compress(node, options, matcher, readonlyMatcher);
15
40
  }
16
41
 
17
42
  /**
18
- *
19
43
  * @param {array} arr
20
44
  * @param {object} options
21
- * @param {string} jPath
45
+ * @param {Matcher} matcher - Path matcher instance
22
46
  * @returns object
23
47
  */
24
- function compress(arr, options, jPath) {
48
+ function compress(arr, options, matcher, readonlyMatcher) {
25
49
  let text;
26
50
  const compressedObj = {}; //This is intended to be a plain object
27
51
  for (let i = 0; i < arr.length; i++) {
28
52
  const tagObj = arr[i];
29
53
  const property = propName(tagObj);
30
- let newJpath = "";
31
- if (jPath === undefined) newJpath = property;
32
- else newJpath = jPath + "." + property;
54
+
55
+ // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)
56
+ if (property !== undefined && property !== options.textNodeName) {
57
+ const rawAttrs = stripAttributePrefix(
58
+ tagObj[":@"] || {},
59
+ options.attributeNamePrefix
60
+ );
61
+ matcher.push(property, rawAttrs);
62
+ }
33
63
 
34
64
  if (property === options.textNodeName) {
35
65
  if (text === undefined) text = tagObj[property];
@@ -38,11 +68,11 @@ function compress(arr, options, jPath) {
38
68
  continue;
39
69
  } else if (tagObj[property]) {
40
70
 
41
- let val = compress(tagObj[property], options, newJpath);
71
+ let val = compress(tagObj[property], options, matcher, readonlyMatcher);
42
72
  const isLeaf = isLeafTag(val, options);
43
73
 
44
74
  if (tagObj[":@"]) {
45
- assignAttributes(val, tagObj[":@"], newJpath, options);
75
+ assignAttributes(val, tagObj[":@"], readonlyMatcher, options);
46
76
  } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {
47
77
  val = val[options.textNodeName];
48
78
  } else if (Object.keys(val).length === 0) {
@@ -63,12 +93,20 @@ function compress(arr, options, jPath) {
63
93
  } else {
64
94
  //TODO: if a node is not an array, then check if it should be an array
65
95
  //also determine if it is a leaf node
66
- if (options.isArray(property, newJpath, isLeaf)) {
96
+
97
+ // Pass jPath string or readonlyMatcher based on options.jPath setting
98
+ const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;
99
+ if (options.isArray(property, jPathOrMatcher, isLeaf)) {
67
100
  compressedObj[property] = [val];
68
101
  } else {
69
102
  compressedObj[property] = val;
70
103
  }
71
104
  }
105
+
106
+ // Pop property from matcher after processing
107
+ if (property !== undefined && property !== options.textNodeName) {
108
+ matcher.pop();
109
+ }
72
110
  }
73
111
 
74
112
  }
@@ -89,13 +127,25 @@ function propName(obj) {
89
127
  }
90
128
  }
91
129
 
92
- function assignAttributes(obj, attrMap, jpath, options) {
130
+ function assignAttributes(obj, attrMap, readonlyMatcher, options) {
93
131
  if (attrMap) {
94
132
  const keys = Object.keys(attrMap);
95
133
  const len = keys.length; //don't make it inline
96
134
  for (let i = 0; i < len; i++) {
97
- const atrrName = keys[i];
98
- if (options.isArray(atrrName, jpath + "." + atrrName, true, true)) {
135
+ const atrrName = keys[i]; // This is the PREFIXED name (e.g., "@_class")
136
+
137
+ // Strip prefix for matcher path (for isArray callback)
138
+ const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)
139
+ ? atrrName.substring(options.attributeNamePrefix.length)
140
+ : atrrName;
141
+
142
+ // For attributes, we need to create a temporary path
143
+ // Pass jPath string or matcher based on options.jPath setting
144
+ const jPathOrMatcher = options.jPath
145
+ ? readonlyMatcher.toString() + "." + rawAttrName
146
+ : readonlyMatcher;
147
+
148
+ if (options.isArray(atrrName, jPathOrMatcher, true, true)) {
99
149
  obj[atrrName] = [attrMap[atrrName]];
100
150
  } else {
101
151
  obj[atrrName] = attrMap[atrrName];
@@ -120,4 +170,4 @@ function isLeafTag(obj, options) {
120
170
  }
121
171
 
122
172
  return false;
123
- }
173
+ }
@@ -1,6 +1,13 @@
1
1
 
2
- **2.1.1 / 2025-05-15**
3
- - remove unnecessary check to remove lint error
2
+ **2.2.2 / 2026-03-23**
3
+ - fix for space string
4
+
5
+
6
+ **2.2.1 / 2026-03-19**
7
+ - fix false positive for eNotation when no leading zeros
8
+
9
+ **2.2.0 / 2026-02-28**
10
+ - support infinity
4
11
 
5
12
  **2.1.0 / 2025-05-01**
6
13
  - fix e-notation
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "strnum",
3
- "version": "2.2.0",
3
+ "version": "2.2.2",
4
4
  "description": "Parse String to Number based on configuration",
5
5
  "type": "module",
6
6
  "main": "strnum.js",
@@ -20,8 +20,9 @@ export default function toNumber(str, options = {}) {
20
20
 
21
21
  let trimmedStr = str.trim();
22
22
 
23
- if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;
24
- else if (str === "0") return 0;
23
+ if (trimmedStr.length === 0) return str;
24
+ else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;
25
+ else if (trimmedStr === "0") return 0;
25
26
  else if (options.hex && hexRegex.test(trimmedStr)) {
26
27
  return parse_int(trimmedStr, 16);
27
28
  // }else if (options.oct && octRegex.test(str)) {
@@ -97,11 +98,16 @@ function resolveEnotation(str, trimmedStr, options) {
97
98
  else if (leadingZeros.length === 1
98
99
  && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {
99
100
  return Number(trimmedStr);
100
- } else if (options.leadingZeros && !eAdjacentToLeadingZeros) { //accept with leading zeros
101
- //remove leading 0s
102
- trimmedStr = (notation[1] || "") + notation[3];
101
+ } else if (leadingZeros.length > 0) {
102
+ // Has leading zeros — only accept if leadingZeros option allows it
103
+ if (options.leadingZeros && !eAdjacentToLeadingZeros) {
104
+ trimmedStr = (notation[1] || "") + notation[3];
105
+ return Number(trimmedStr);
106
+ } else return str;
107
+ } else {
108
+ // No leading zeros — always valid e-notation, parse it
103
109
  return Number(trimmedStr);
104
- } else return str;
110
+ }
105
111
  } else {
106
112
  return str;
107
113
  }
@@ -5,6 +5,7 @@ describe("Should convert all the valid numeric strings to number", () => {
5
5
  expect(toNumber(undefined)).not.toBeDefined();
6
6
  expect(toNumber(null)).toEqual(null);
7
7
  expect(toNumber("")).toEqual("");
8
+ expect(toNumber(" ")).toEqual(" ");
8
9
  expect(toNumber("string")).toEqual("string");
9
10
  expect(toNumber("e89794659669cb7bb967db73a7ea6889c3891727")).toEqual("e89794659669cb7bb967db73a7ea6889c3891727");
10
11
  });
@@ -126,6 +127,8 @@ describe("Should convert all the valid numeric strings to number", () => {
126
127
  expect(toNumber("1e-2")).toEqual(0.01);
127
128
  expect(toNumber("1e+2")).toEqual(100);
128
129
  expect(toNumber("1.e+2")).toEqual(100);
130
+
131
+ expect(toNumber("1.5e3", { leadingZeros: false })).toEqual(1500);
129
132
  });
130
133
 
131
134
  it("scientific notation with upper E", () => {
@@ -0,0 +1,8 @@
1
+ import toNumber from "../strnum.js";
2
+
3
+ console.log(toNumber("1.5e3", {leadingZeros: false}))
4
+ // describe("temp", () = {
5
+
6
+ // it("scientific notation", () => {
7
+ // });
8
+ // })
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@aws-sdk/xml-builder",
3
- "version": "3.972.11",
3
+ "version": "3.972.15",
4
4
  "description": "XML utilities for the AWS SDK",
5
5
  "dependencies": {
6
6
  "@smithy/types": "^4.13.1",
7
- "fast-xml-parser": "5.4.1",
7
+ "fast-xml-parser": "5.5.8",
8
8
  "tslib": "^2.6.2"
9
9
  },
10
10
  "scripts": {
@@ -12,6 +12,11 @@ const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = {
12
12
  configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),
13
13
  default: false,
14
14
  };
15
+ const nodeDualstackConfigSelectors = {
16
+ environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.ENV),
17
+ configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),
18
+ default: undefined,
19
+ };
15
20
 
16
21
  const ENV_USE_FIPS_ENDPOINT = "AWS_USE_FIPS_ENDPOINT";
17
22
  const CONFIG_USE_FIPS_ENDPOINT = "use_fips_endpoint";
@@ -21,6 +26,11 @@ const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = {
21
26
  configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),
22
27
  default: false,
23
28
  };
29
+ const nodeFipsConfigSelectors = {
30
+ environmentVariableSelector: (env) => utilConfigProvider.booleanSelector(env, ENV_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.ENV),
31
+ configFileSelector: (profile) => utilConfigProvider.booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, utilConfigProvider.SelectorType.CONFIG),
32
+ default: undefined,
33
+ };
24
34
 
25
35
  const resolveCustomEndpointsConfig = (input) => {
26
36
  const { tls, endpoint, urlParser, useDualstackEndpoint } = input;
@@ -181,6 +191,8 @@ exports.NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = NODE_USE_FIPS_ENDPOINT_CONFIG_OP
181
191
  exports.REGION_ENV_NAME = REGION_ENV_NAME;
182
192
  exports.REGION_INI_NAME = REGION_INI_NAME;
183
193
  exports.getRegionInfo = getRegionInfo;
194
+ exports.nodeDualstackConfigSelectors = nodeDualstackConfigSelectors;
195
+ exports.nodeFipsConfigSelectors = nodeFipsConfigSelectors;
184
196
  exports.resolveCustomEndpointsConfig = resolveCustomEndpointsConfig;
185
197
  exports.resolveEndpointsConfig = resolveEndpointsConfig;
186
198
  exports.resolveRegionConfig = resolveRegionConfig;
@@ -7,3 +7,8 @@ export const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS = {
7
7
  configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, SelectorType.CONFIG),
8
8
  default: false,
9
9
  };
10
+ export const nodeDualstackConfigSelectors = {
11
+ environmentVariableSelector: (env) => booleanSelector(env, ENV_USE_DUALSTACK_ENDPOINT, SelectorType.ENV),
12
+ configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_DUALSTACK_ENDPOINT, SelectorType.CONFIG),
13
+ default: undefined,
14
+ };
@@ -7,3 +7,8 @@ export const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS = {
7
7
  configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, SelectorType.CONFIG),
8
8
  default: false,
9
9
  };
10
+ export const nodeFipsConfigSelectors = {
11
+ environmentVariableSelector: (env) => booleanSelector(env, ENV_USE_FIPS_ENDPOINT, SelectorType.ENV),
12
+ configFileSelector: (profile) => booleanSelector(profile, CONFIG_USE_FIPS_ENDPOINT, SelectorType.CONFIG),
13
+ default: undefined,
14
+ };
@@ -12,6 +12,12 @@ export declare const CONFIG_USE_DUALSTACK_ENDPOINT = "use_dualstack_endpoint";
12
12
  */
13
13
  export declare const DEFAULT_USE_DUALSTACK_ENDPOINT = false;
14
14
  /**
15
+ * Don't delete this, used by older clients.
16
+ * @deprecated replaced by nodeDualstackConfigSelectors in newer clients.
15
17
  * @internal
16
18
  */
17
19
  export declare const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors<boolean>;
20
+ /**
21
+ * @internal
22
+ */
23
+ export declare const nodeDualstackConfigSelectors: LoadedConfigSelectors<boolean | undefined>;
@@ -12,6 +12,12 @@ export declare const CONFIG_USE_FIPS_ENDPOINT = "use_fips_endpoint";
12
12
  */
13
13
  export declare const DEFAULT_USE_FIPS_ENDPOINT = false;
14
14
  /**
15
+ * Don't delete this, used by older clients.
16
+ * @deprecated replaced by nodeFipsConfigSelectors in newer clients.
15
17
  * @internal
16
18
  */
17
19
  export declare const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors<boolean>;
20
+ /**
21
+ * @internal
22
+ */
23
+ export declare const nodeFipsConfigSelectors: LoadedConfigSelectors<boolean | undefined>;
@@ -12,6 +12,12 @@ export declare const CONFIG_USE_DUALSTACK_ENDPOINT = "use_dualstack_endpoint";
12
12
  */
13
13
  export declare const DEFAULT_USE_DUALSTACK_ENDPOINT = false;
14
14
  /**
15
+ * Don't delete this, used by older clients.
16
+ * @deprecated replaced by nodeDualstackConfigSelectors in newer clients.
15
17
  * @internal
16
18
  */
17
19
  export declare const NODE_USE_DUALSTACK_ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors<boolean>;
20
+ /**
21
+ * @internal
22
+ */
23
+ export declare const nodeDualstackConfigSelectors: LoadedConfigSelectors<boolean | undefined>;
@@ -12,6 +12,12 @@ export declare const CONFIG_USE_FIPS_ENDPOINT = "use_fips_endpoint";
12
12
  */
13
13
  export declare const DEFAULT_USE_FIPS_ENDPOINT = false;
14
14
  /**
15
+ * Don't delete this, used by older clients.
16
+ * @deprecated replaced by nodeFipsConfigSelectors in newer clients.
15
17
  * @internal
16
18
  */
17
19
  export declare const NODE_USE_FIPS_ENDPOINT_CONFIG_OPTIONS: LoadedConfigSelectors<boolean>;
20
+ /**
21
+ * @internal
22
+ */
23
+ export declare const nodeFipsConfigSelectors: LoadedConfigSelectors<boolean | undefined>;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/config-resolver",
3
- "version": "4.4.11",
3
+ "version": "4.4.13",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
6
  "build:cjs": "node ../../scripts/inline config-resolver",
@@ -31,11 +31,11 @@ export interface EndpointInputConfig<T extends EndpointParameters = EndpointPara
31
31
  /**
32
32
  * Enables IPv6/IPv4 dualstack endpoint.
33
33
  */
34
- useDualstackEndpoint?: boolean | Provider<boolean>;
34
+ useDualstackEndpoint?: boolean | Provider<boolean | undefined>;
35
35
  /**
36
36
  * Enables FIPS compatible endpoints.
37
37
  */
38
- useFipsEndpoint?: boolean | Provider<boolean>;
38
+ useFipsEndpoint?: boolean | Provider<boolean | undefined>;
39
39
  /**
40
40
  * @internal
41
41
  * This field is used internally so you should not fill any value to this field.
@@ -31,11 +31,11 @@ export interface EndpointInputConfig<T extends EndpointParameters = EndpointPara
31
31
  /**
32
32
  * Enables IPv6/IPv4 dualstack endpoint.
33
33
  */
34
- useDualstackEndpoint?: boolean | Provider<boolean>;
34
+ useDualstackEndpoint?: boolean | Provider<boolean | undefined>;
35
35
  /**
36
36
  * Enables FIPS compatible endpoints.
37
37
  */
38
- useFipsEndpoint?: boolean | Provider<boolean>;
38
+ useFipsEndpoint?: boolean | Provider<boolean | undefined>;
39
39
  /**
40
40
  * @internal
41
41
  * This field is used internally so you should not fill any value to this field.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/middleware-endpoint",
3
- "version": "4.4.26",
3
+ "version": "4.4.27",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
6
  "build:cjs": "node ../../scripts/inline middleware-endpoint",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/middleware-retry",
3
- "version": "4.4.43",
3
+ "version": "4.4.44",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
6
  "build:cjs": "node ../../scripts/inline middleware-retry",
@@ -37,7 +37,7 @@
37
37
  "@smithy/node-config-provider": "^4.3.12",
38
38
  "@smithy/protocol-http": "^5.3.12",
39
39
  "@smithy/service-error-classification": "^4.2.12",
40
- "@smithy/smithy-client": "^4.12.6",
40
+ "@smithy/smithy-client": "^4.12.7",
41
41
  "@smithy/types": "^4.13.1",
42
42
  "@smithy/util-middleware": "^4.2.12",
43
43
  "@smithy/util-retry": "^4.2.12",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/smithy-client",
3
- "version": "4.12.6",
3
+ "version": "4.12.7",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
6
  "build:cjs": "node ../../scripts/inline smithy-client",
@@ -28,7 +28,7 @@
28
28
  "sideEffects": false,
29
29
  "dependencies": {
30
30
  "@smithy/core": "^3.23.12",
31
- "@smithy/middleware-endpoint": "^4.4.26",
31
+ "@smithy/middleware-endpoint": "^4.4.27",
32
32
  "@smithy/middleware-stack": "^4.2.12",
33
33
  "@smithy/protocol-http": "^5.3.12",
34
34
  "@smithy/types": "^4.13.1",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/util-defaults-mode-browser",
3
- "version": "4.3.42",
3
+ "version": "4.3.43",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
6
  "build:cjs": "node ../../scripts/inline util-defaults-mode-browser",
@@ -25,7 +25,7 @@
25
25
  "sideEffects": false,
26
26
  "dependencies": {
27
27
  "@smithy/property-provider": "^4.2.12",
28
- "@smithy/smithy-client": "^4.12.6",
28
+ "@smithy/smithy-client": "^4.12.7",
29
29
  "@smithy/types": "^4.13.1",
30
30
  "tslib": "^2.6.2"
31
31
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smithy/util-defaults-mode-node",
3
- "version": "4.2.45",
3
+ "version": "4.2.47",
4
4
  "scripts": {
5
5
  "build": "concurrently 'yarn:build:cjs' 'yarn:build:es' 'yarn:build:types && yarn build:types:downlevel'",
6
6
  "build:cjs": "node ../../scripts/inline util-defaults-mode-node",
@@ -24,11 +24,11 @@
24
24
  "license": "Apache-2.0",
25
25
  "sideEffects": false,
26
26
  "dependencies": {
27
- "@smithy/config-resolver": "^4.4.11",
27
+ "@smithy/config-resolver": "^4.4.13",
28
28
  "@smithy/credential-provider-imds": "^4.2.12",
29
29
  "@smithy/node-config-provider": "^4.3.12",
30
30
  "@smithy/property-provider": "^4.2.12",
31
- "@smithy/smithy-client": "^4.12.6",
31
+ "@smithy/smithy-client": "^4.12.7",
32
32
  "@smithy/types": "^4.13.1",
33
33
  "tslib": "^2.6.2"
34
34
  },
@@ -346,6 +346,57 @@ Restore from a snapshot.
346
346
  matcher.restore(snapshot);
347
347
  ```
348
348
 
349
+ #### Read-Only Access
350
+
351
+ ##### `readOnly()`
352
+
353
+ Returns a **live, read-only proxy** of the matcher. All query and inspection methods work normally, but any attempt to call a state-mutating method (`push`, `pop`, `reset`, `updateCurrent`, `restore`) or to write/delete a property throws a `TypeError`.
354
+
355
+ This is the recommended way to share the matcher with external consumers — plugins, callbacks, event handlers — that only need to inspect the current path without being able to corrupt parser state.
356
+
357
+ ```javascript
358
+ const ro = matcher.readOnly();
359
+ ```
360
+
361
+ **What works on the read-only view:**
362
+
363
+ ```javascript
364
+ ro.matches(expr) // ✓ pattern matching
365
+ ro.getCurrentTag() // ✓ current tag name
366
+ ro.getCurrentNamespace() // ✓ current namespace
367
+ ro.getAttrValue("id") // ✓ attribute value
368
+ ro.hasAttr("id") // ✓ attribute presence check
369
+ ro.getPosition() // ✓ sibling position
370
+ ro.getCounter() // ✓ occurrence counter
371
+ ro.getDepth() // ✓ path depth
372
+ ro.toString() // ✓ path as string
373
+ ro.toArray() // ✓ path as array
374
+ ro.snapshot() // ✓ snapshot (can be used to restore the real matcher)
375
+ ```
376
+
377
+ **What throws a `TypeError`:**
378
+
379
+ ```javascript
380
+ ro.push("child", {}) // ✗ TypeError: Cannot call 'push' on a read-only Matcher
381
+ ro.pop() // ✗ TypeError: Cannot call 'pop' on a read-only Matcher
382
+ ro.reset() // ✗ TypeError: Cannot call 'reset' on a read-only Matcher
383
+ ro.updateCurrent({}) // ✗ TypeError: Cannot call 'updateCurrent' on a read-only Matcher
384
+ ro.restore(snapshot) // ✗ TypeError: Cannot call 'restore' on a read-only Matcher
385
+ ro.separator = '/' // ✗ TypeError: Cannot set property on a read-only Matcher
386
+ ```
387
+
388
+ **Important:** The read-only view is **live** — it always reflects the current state of the underlying matcher. If you need a frozen-in-time copy instead, use `snapshot()`.
389
+
390
+ ```javascript
391
+ const matcher = new Matcher();
392
+ const ro = matcher.readOnly();
393
+
394
+ matcher.push("root");
395
+ ro.getDepth(); // 1 — immediately reflects the push
396
+ matcher.push("users");
397
+ ro.getDepth(); // 2 — still live
398
+ ```
399
+
349
400
  ## 💡 Usage Examples
350
401
 
351
402
  ### Example 1: XML Parser with stopNodes
@@ -481,7 +532,53 @@ const expr = new Expression("root.item:first");
481
532
  console.log(matcher.matches(expr)); // false (counter=1, not 0)
482
533
  ```
483
534
 
484
- ### Example 7: Namespace Support (XML/SOAP)
535
+ ### Example 8: Passing a Read-Only Matcher to External Consumers
536
+
537
+ When passing the matcher into callbacks, plugins, or other code you don't control, use `readOnly()` to prevent accidental state corruption.
538
+
539
+ ```javascript
540
+ import { Expression, Matcher } from 'path-expression-matcher';
541
+
542
+ const matcher = new Matcher();
543
+
544
+ const adminExpr = new Expression("..user[type=admin]");
545
+
546
+ function parseTag(tagName, attrs, onTag) {
547
+ matcher.push(tagName, attrs);
548
+
549
+ // Pass a read-only view — consumer can inspect but not mutate
550
+ onTag(matcher.readOnly());
551
+
552
+ matcher.pop();
553
+ }
554
+
555
+ // Safe consumer — can only read
556
+ function myPlugin(ro) {
557
+ if (ro.matches(adminExpr)) {
558
+ console.log("Admin at path:", ro.toString());
559
+ console.log("Depth:", ro.getDepth());
560
+ console.log("ID:", ro.getAttrValue("id"));
561
+ }
562
+ }
563
+
564
+ // ro.push(...) or ro.reset() here would throw TypeError,
565
+ // so the parser's state is always safe.
566
+ parseTag("user", { id: "1", type: "admin" }, myPlugin);
567
+ ```
568
+
569
+ **Combining with `snapshot()`:** A snapshot taken via the read-only view can still be used to restore the real matcher.
570
+
571
+ ```javascript
572
+ const matcher = new Matcher();
573
+ matcher.push("root");
574
+ matcher.push("users");
575
+
576
+ const ro = matcher.readOnly();
577
+ const snap = ro.snapshot(); // ✓ snapshot works on read-only view
578
+
579
+ matcher.push("user"); // continue parsing...
580
+ matcher.restore(snap); // restore to "root.users" using the snapshot
581
+ ```
485
582
 
486
583
  ```javascript
487
584
  const matcher = new Matcher();
@@ -614,18 +711,6 @@ const parser = new XMLParser({
614
711
  });
615
712
  ```
616
713
 
617
- ## 🧪 Testing
618
-
619
- ```bash
620
- npm test
621
- ```
622
-
623
- All 77 tests covering:
624
- - Pattern parsing (exact, wildcards, attributes, position)
625
- - Path tracking (push, pop, update)
626
- - Pattern matching (all combinations)
627
- - Edge cases and error conditions
628
-
629
714
  ## 📄 License
630
715
 
631
716
  MIT